diff --git a/assets/swagger.json b/assets/swagger.json index 517b2a6f97164..139ae925b513d 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -4508,6 +4508,65 @@ } } }, + "repositoryParameterAnnouncement": { + "type": "object", + "properties": { + "array": { + "description": "array is the default value of the parameter if the parameter is an array.", + "type": "array", + "items": { + "type": "string" + } + }, + "collectionType": { + "description": "collectionType is the type of value this parameter holds - either a single value (a string) or a collection\n(array or map). If collectionType is set, only the field with that type will be used. If collectionType is not\nset, `string` is the default. If collectionType is set to an invalid value, a validation error is thrown.", + "type": "string" + }, + "itemType": { + "description": "itemType determines the primitive data type represented by the parameter. Parameters are always encoded as\nstrings, but this field lets them be interpreted as other primitive types.", + "type": "string" + }, + "map": { + "description": "map is the default value of the parameter if the parameter is a map.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "name": { + "description": "name is the name identifying a parameter.", + "type": "string" + }, + "required": { + "description": "required defines if this given parameter is mandatory.", + "type": "boolean" + }, + "string": { + "description": "string is the default value of the parameter if the parameter is a string.", + "type": "string" + }, + "title": { + "description": "title is a human-readable text of the parameter name.", + "type": "string" + }, + "tooltip": { + "description": "tooltip is a human-readable description of the parameter.", + "type": "string" + } + } + }, + "repositoryPluginAppSpec": { + "type": "object", + "title": "PluginAppSpec contains details about a plugin-type Application", + "properties": { + "parametersAnnouncement": { + "type": "array", + "items": { + "$ref": "#/definitions/repositoryParameterAnnouncement" + } + } + } + }, "repositoryRefs": { "type": "object", "title": "A subset of the repository's named refs", @@ -4554,6 +4613,9 @@ "kustomize": { "$ref": "#/definitions/repositoryKustomizeAppSpec" }, + "plugin": { + "$ref": "#/definitions/repositoryPluginAppSpec" + }, "type": { "type": "string" } @@ -5775,6 +5837,39 @@ }, "name": { "type": "string" + }, + "parameters": { + "type": "array", + "items": { + "$ref": "#/definitions/v1alpha1ApplicationSourcePluginParameter" + } + } + } + }, + "v1alpha1ApplicationSourcePluginParameter": { + "type": "object", + "properties": { + "array": { + "description": "Array is the value of an array type parameter.", + "type": "array", + "items": { + "type": "string" + } + }, + "map": { + "description": "Map is the value of a map type parameter.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "name": { + "description": "Name is the name identifying a parameter.", + "type": "string" + }, + "string": { + "description": "String_ is the value of a string type parameter.", + "type": "string" } } }, diff --git a/cmpserver/apiclient/plugin.pb.go b/cmpserver/apiclient/plugin.pb.go index ecc28da7c4b71..4c08ac2511edc 100644 --- a/cmpserver/apiclient/plugin.pb.go +++ b/cmpserver/apiclient/plugin.pb.go @@ -6,6 +6,7 @@ package apiclient import ( context "context" fmt "fmt" + apiclient "github.com/argoproj/argo-cd/v2/reposerver/apiclient" proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -362,6 +363,55 @@ func (m *RepositoryResponse) GetIsSupported() bool { return false } +// ParametersAnnouncementResponse contains a list of announcements. This list represents all the parameters which a CMP +// is able to accept. +type ParametersAnnouncementResponse struct { + ParameterAnnouncements []*apiclient.ParameterAnnouncement `protobuf:"bytes,1,rep,name=parameterAnnouncements,proto3" json:"parameterAnnouncements,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ParametersAnnouncementResponse) Reset() { *m = ParametersAnnouncementResponse{} } +func (m *ParametersAnnouncementResponse) String() string { return proto.CompactTextString(m) } +func (*ParametersAnnouncementResponse) ProtoMessage() {} +func (*ParametersAnnouncementResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_b21875a7079a06ed, []int{5} +} +func (m *ParametersAnnouncementResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ParametersAnnouncementResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ParametersAnnouncementResponse.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 *ParametersAnnouncementResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ParametersAnnouncementResponse.Merge(m, src) +} +func (m *ParametersAnnouncementResponse) XXX_Size() int { + return m.Size() +} +func (m *ParametersAnnouncementResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ParametersAnnouncementResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ParametersAnnouncementResponse proto.InternalMessageInfo + +func (m *ParametersAnnouncementResponse) GetParameterAnnouncements() []*apiclient.ParameterAnnouncement { + if m != nil { + return m.ParameterAnnouncements + } + return nil +} + type File struct { Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -373,7 +423,7 @@ func (m *File) Reset() { *m = File{} } func (m *File) String() string { return proto.CompactTextString(m) } func (*File) ProtoMessage() {} func (*File) Descriptor() ([]byte, []int) { - return fileDescriptor_b21875a7079a06ed, []int{5} + return fileDescriptor_b21875a7079a06ed, []int{6} } func (m *File) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -415,44 +465,49 @@ func init() { proto.RegisterType((*EnvEntry)(nil), "plugin.EnvEntry") proto.RegisterType((*ManifestResponse)(nil), "plugin.ManifestResponse") proto.RegisterType((*RepositoryResponse)(nil), "plugin.RepositoryResponse") + proto.RegisterType((*ParametersAnnouncementResponse)(nil), "plugin.ParametersAnnouncementResponse") proto.RegisterType((*File)(nil), "plugin.File") } func init() { proto.RegisterFile("cmpserver/plugin/plugin.proto", fileDescriptor_b21875a7079a06ed) } var fileDescriptor_b21875a7079a06ed = []byte{ - // 483 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x53, 0xd1, 0x8e, 0x12, 0x3d, - 0x14, 0xa6, 0x3f, 0xec, 0x2e, 0x1c, 0x36, 0xf9, 0x49, 0x63, 0xe2, 0x84, 0xec, 0x22, 0x99, 0x2b, - 0x6e, 0x84, 0x04, 0x8d, 0x77, 0x26, 0xba, 0x66, 0x75, 0xa3, 0xc1, 0x90, 0xe2, 0x95, 0x77, 0xdd, - 0x72, 0x80, 0xba, 0x33, 0x6d, 0x6d, 0x3b, 0x93, 0xe0, 0x95, 0x6f, 0xe3, 0x2b, 0xf8, 0x08, 0x5e, - 0xfa, 0x08, 0x86, 0x27, 0x31, 0x53, 0x66, 0x18, 0xe2, 0x46, 0xaf, 0x38, 0xdf, 0x77, 0xce, 0xf9, - 0xf8, 0xbe, 0x4e, 0x0b, 0x97, 0x22, 0x35, 0x0e, 0x6d, 0x8e, 0x76, 0x62, 0x92, 0x6c, 0x2d, 0x55, - 0xf9, 0x33, 0x36, 0x56, 0x7b, 0x4d, 0x4f, 0xf7, 0x28, 0xfe, 0x4a, 0xa0, 0xf7, 0xd2, 0x98, 0x85, - 0xb7, 0xc8, 0x53, 0x86, 0x9f, 0x33, 0x74, 0x9e, 0x3e, 0x87, 0x76, 0x8a, 0x9e, 0x2f, 0xb9, 0xe7, - 0x11, 0x19, 0x92, 0x51, 0x77, 0xfa, 0x68, 0x5c, 0x6e, 0xcf, 0xb8, 0x92, 0x2b, 0x74, 0xbe, 0x1c, - 0x9d, 0x95, 0x63, 0x37, 0x0d, 0x76, 0x58, 0xa1, 0x31, 0xb4, 0x56, 0x32, 0xc1, 0xe8, 0xbf, 0xb0, - 0x7a, 0x5e, 0xad, 0xbe, 0x96, 0x09, 0xde, 0x34, 0x58, 0xe8, 0x5d, 0x75, 0xe0, 0xcc, 0xee, 0x25, - 0xe2, 0x6f, 0x04, 0x1e, 0xfe, 0x45, 0x96, 0x46, 0x70, 0xc6, 0x8d, 0x79, 0xcf, 0x53, 0x0c, 0x46, - 0x3a, 0xac, 0x82, 0x74, 0x00, 0xc0, 0x8d, 0x61, 0x98, 0xcc, 0xb9, 0xdf, 0x84, 0xbf, 0xea, 0xb0, - 0x23, 0x86, 0xf6, 0xa1, 0x2d, 0x36, 0x28, 0xee, 0x5c, 0x96, 0x46, 0xcd, 0xd0, 0x3d, 0x60, 0x4a, - 0xa1, 0xe5, 0xe4, 0x17, 0x8c, 0x5a, 0x43, 0x32, 0x6a, 0xb2, 0x50, 0xd3, 0x18, 0x9a, 0xa8, 0xf2, - 0xe8, 0x64, 0xd8, 0x1c, 0x75, 0xa7, 0xbd, 0xca, 0xf3, 0xb5, 0xca, 0xaf, 0x95, 0xb7, 0x5b, 0x56, - 0x34, 0xe3, 0xa7, 0xd0, 0xae, 0x88, 0x42, 0x43, 0xd5, 0xb6, 0x42, 0x4d, 0x1f, 0xc0, 0x49, 0xce, - 0x93, 0x0c, 0x4b, 0x3b, 0x7b, 0x10, 0xcf, 0xa1, 0x57, 0xc7, 0x73, 0x46, 0x2b, 0x87, 0xf4, 0x02, - 0x3a, 0x69, 0xc9, 0xb9, 0x88, 0x0c, 0x9b, 0xa3, 0x0e, 0xab, 0x89, 0x22, 0x9b, 0xd3, 0x99, 0x15, - 0xf8, 0x61, 0x6b, 0x2a, 0xb1, 0x23, 0x26, 0x7e, 0x06, 0x94, 0xa1, 0xd1, 0x4e, 0x7a, 0x6d, 0xb7, - 0x07, 0xcd, 0x21, 0x74, 0xa5, 0x5b, 0x64, 0xc6, 0x68, 0xeb, 0x71, 0x19, 0x8c, 0xb5, 0xd9, 0x31, - 0x15, 0x5f, 0x40, 0xab, 0xf8, 0x08, 0x85, 0x4f, 0xb1, 0xc9, 0xd4, 0x5d, 0x98, 0x39, 0x67, 0x7b, - 0x30, 0xfd, 0x4e, 0xe0, 0xf2, 0x95, 0x56, 0x2b, 0xb9, 0x9e, 0x71, 0xc5, 0xd7, 0x98, 0xa2, 0xf2, - 0xf3, 0x70, 0x0c, 0x0b, 0xb4, 0xb9, 0x14, 0x48, 0xdf, 0x42, 0xef, 0x0d, 0x2a, 0xb4, 0xdc, 0x63, - 0x95, 0x88, 0x46, 0xd5, 0x51, 0xfd, 0x79, 0x8b, 0xfa, 0xd1, 0xfd, 0x3b, 0xb3, 0x77, 0x1a, 0x37, - 0x46, 0x84, 0xbe, 0x83, 0xff, 0x67, 0xdc, 0x8b, 0x4d, 0x1d, 0xe4, 0x1f, 0x52, 0xfd, 0xaa, 0x73, - 0x3f, 0x76, 0x21, 0x76, 0xf5, 0xe2, 0xc7, 0x6e, 0x40, 0x7e, 0xee, 0x06, 0xe4, 0xd7, 0x6e, 0x40, - 0x3e, 0x4e, 0xd7, 0xd2, 0x6f, 0xb2, 0xdb, 0xb1, 0xd0, 0xe9, 0x84, 0xdb, 0xb5, 0x36, 0x56, 0x7f, - 0x0a, 0xc5, 0x63, 0xb1, 0x9c, 0xe4, 0xd3, 0x49, 0xfd, 0x32, 0xb8, 0x91, 0x22, 0x91, 0xa8, 0xfc, - 0xed, 0x69, 0x78, 0x16, 0x4f, 0x7e, 0x07, 0x00, 0x00, 0xff, 0xff, 0x83, 0x01, 0x5e, 0x48, 0x37, - 0x03, 0x00, 0x00, + // 558 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x54, 0xc1, 0x6e, 0xd3, 0x4c, + 0x10, 0xae, 0x9b, 0xb4, 0x4d, 0x26, 0x95, 0xfe, 0x68, 0xf5, 0x0b, 0x4c, 0xd4, 0x86, 0xe0, 0x03, + 0xca, 0x85, 0x44, 0x32, 0x88, 0x1b, 0x12, 0x2d, 0x2a, 0xad, 0x40, 0x41, 0xd1, 0x96, 0x0b, 0xdc, + 0xb6, 0xce, 0x24, 0x59, 0x6a, 0xef, 0x2e, 0xeb, 0xb5, 0xa5, 0xc0, 0x85, 0xf7, 0xe0, 0x01, 0x78, + 0x15, 0x8e, 0x3c, 0x02, 0xca, 0x93, 0x20, 0xaf, 0xed, 0xd8, 0xa2, 0x6d, 0x38, 0x79, 0xe6, 0x9b, + 0x99, 0x6f, 0xbf, 0x9d, 0x99, 0x35, 0x1c, 0x07, 0x91, 0x8a, 0x51, 0xa7, 0xa8, 0xc7, 0x2a, 0x4c, + 0x16, 0x5c, 0x14, 0x9f, 0x91, 0xd2, 0xd2, 0x48, 0xb2, 0x9f, 0x7b, 0xbd, 0xb3, 0x05, 0x37, 0xcb, + 0xe4, 0x6a, 0x14, 0xc8, 0x68, 0xcc, 0xf4, 0x42, 0x2a, 0x2d, 0x3f, 0x59, 0xe3, 0x49, 0x30, 0x1b, + 0xa7, 0xfe, 0x58, 0xa3, 0x92, 0x05, 0x8d, 0x35, 0xb9, 0x91, 0x7a, 0x55, 0x33, 0x73, 0x3a, 0xef, + 0x9b, 0x03, 0xdd, 0x13, 0xa5, 0x2e, 0x8d, 0x46, 0x16, 0x51, 0xfc, 0x9c, 0x60, 0x6c, 0xc8, 0x0b, + 0x68, 0x45, 0x68, 0xd8, 0x8c, 0x19, 0xe6, 0x3a, 0x03, 0x67, 0xd8, 0xf1, 0x1f, 0x8e, 0x0a, 0x11, + 0x13, 0x26, 0xf8, 0x1c, 0x63, 0x53, 0xa4, 0x4e, 0x8a, 0xb4, 0x8b, 0x1d, 0xba, 0x29, 0x21, 0x1e, + 0x34, 0xe7, 0x3c, 0x44, 0x77, 0xd7, 0x96, 0x1e, 0x96, 0xa5, 0xaf, 0x79, 0x88, 0x17, 0x3b, 0xd4, + 0xc6, 0x4e, 0xdb, 0x70, 0xa0, 0x73, 0x0a, 0xef, 0x87, 0x03, 0xf7, 0xef, 0xa0, 0x25, 0x2e, 0x1c, + 0x30, 0xa5, 0xde, 0xb1, 0x08, 0xad, 0x90, 0x36, 0x2d, 0x5d, 0xd2, 0x07, 0x60, 0x4a, 0x51, 0x0c, + 0xa7, 0xcc, 0x2c, 0xed, 0x51, 0x6d, 0x5a, 0x43, 0x48, 0x0f, 0x5a, 0xc1, 0x12, 0x83, 0xeb, 0x38, + 0x89, 0xdc, 0x86, 0x8d, 0x6e, 0x7c, 0x42, 0xa0, 0x19, 0xf3, 0x2f, 0xe8, 0x36, 0x07, 0xce, 0xb0, + 0x41, 0xad, 0x4d, 0x3c, 0x68, 0xa0, 0x48, 0xdd, 0xbd, 0x41, 0x63, 0xd8, 0xf1, 0xbb, 0xa5, 0xe6, + 0x33, 0x91, 0x9e, 0x09, 0xa3, 0x57, 0x34, 0x0b, 0x7a, 0xcf, 0xa0, 0x55, 0x02, 0x19, 0x87, 0xa8, + 0x64, 0x59, 0x9b, 0xfc, 0x0f, 0x7b, 0x29, 0x0b, 0x13, 0x2c, 0xe4, 0xe4, 0x8e, 0x37, 0x85, 0x6e, + 0x75, 0xbd, 0x58, 0x49, 0x11, 0x23, 0x39, 0x82, 0x76, 0x54, 0x60, 0xb1, 0xeb, 0x0c, 0x1a, 0xc3, + 0x36, 0xad, 0x80, 0xec, 0x6e, 0xb1, 0x4c, 0x74, 0x80, 0xef, 0x57, 0xaa, 0x24, 0xab, 0x21, 0xde, + 0x73, 0x20, 0x74, 0x33, 0xc8, 0x0d, 0xe7, 0x00, 0x3a, 0x3c, 0xbe, 0x4c, 0x94, 0x92, 0xda, 0xe0, + 0xcc, 0x0a, 0x6b, 0xd1, 0x3a, 0xe4, 0x7d, 0x85, 0xfe, 0x94, 0x69, 0x16, 0xa1, 0x41, 0x1d, 0x9f, + 0x08, 0x21, 0x13, 0x11, 0x60, 0x84, 0xa2, 0xd2, 0xf5, 0x01, 0xee, 0xa9, 0x32, 0xa3, 0x9e, 0x90, + 0x8b, 0xec, 0xf8, 0x8f, 0x46, 0xb5, 0x0d, 0x9a, 0xde, 0x96, 0x49, 0xef, 0x20, 0xf0, 0x8e, 0xa0, + 0x99, 0x6d, 0x40, 0xd6, 0xa4, 0x60, 0x99, 0x88, 0x6b, 0x2b, 0xf0, 0x90, 0xe6, 0x8e, 0xff, 0x7d, + 0x17, 0x8e, 0x5f, 0x49, 0x31, 0xe7, 0x8b, 0x09, 0x13, 0x6c, 0x61, 0x6b, 0xa6, 0x76, 0x06, 0x97, + 0xa8, 0x53, 0x1e, 0x20, 0x79, 0x03, 0xdd, 0x73, 0x14, 0xa8, 0x99, 0xc1, 0xb2, 0x9d, 0xc4, 0x2d, + 0xe7, 0xf4, 0xf7, 0x0a, 0xf7, 0xdc, 0x9b, 0x0b, 0x9b, 0x5f, 0xd1, 0xdb, 0x19, 0x3a, 0xe4, 0x2d, + 0xfc, 0x37, 0x61, 0x26, 0x58, 0x56, 0x5d, 0xdc, 0x42, 0xd5, 0x2b, 0x23, 0x37, 0x7b, 0x6e, 0xc9, + 0x18, 0x3c, 0x38, 0x47, 0x73, 0x7b, 0x63, 0xb7, 0xd0, 0x3e, 0x2e, 0x23, 0xdb, 0x47, 0x92, 0x1d, + 0x71, 0xfa, 0xf2, 0xe7, 0xba, 0xef, 0xfc, 0x5a, 0xf7, 0x9d, 0xdf, 0xeb, 0xbe, 0xf3, 0xd1, 0xff, + 0xc7, 0xd3, 0xaf, 0x7e, 0x20, 0x4c, 0xf1, 0x20, 0xe4, 0x28, 0xcc, 0xd5, 0xbe, 0x7d, 0xee, 0x4f, + 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x33, 0x34, 0xb3, 0x95, 0x5e, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -472,6 +527,8 @@ type ConfigManagementPluginServiceClient interface { GenerateManifest(ctx context.Context, opts ...grpc.CallOption) (ConfigManagementPluginService_GenerateManifestClient, error) // MatchRepository returns whether or not the given application is supported by the plugin MatchRepository(ctx context.Context, opts ...grpc.CallOption) (ConfigManagementPluginService_MatchRepositoryClient, error) + // GetParametersAnnouncement gets a list of parameter announcements for the given app + GetParametersAnnouncement(ctx context.Context, opts ...grpc.CallOption) (ConfigManagementPluginService_GetParametersAnnouncementClient, error) } type configManagementPluginServiceClient struct { @@ -550,6 +607,40 @@ func (x *configManagementPluginServiceMatchRepositoryClient) CloseAndRecv() (*Re return m, nil } +func (c *configManagementPluginServiceClient) GetParametersAnnouncement(ctx context.Context, opts ...grpc.CallOption) (ConfigManagementPluginService_GetParametersAnnouncementClient, error) { + stream, err := c.cc.NewStream(ctx, &_ConfigManagementPluginService_serviceDesc.Streams[2], "/plugin.ConfigManagementPluginService/GetParametersAnnouncement", opts...) + if err != nil { + return nil, err + } + x := &configManagementPluginServiceGetParametersAnnouncementClient{stream} + return x, nil +} + +type ConfigManagementPluginService_GetParametersAnnouncementClient interface { + Send(*AppStreamRequest) error + CloseAndRecv() (*ParametersAnnouncementResponse, error) + grpc.ClientStream +} + +type configManagementPluginServiceGetParametersAnnouncementClient struct { + grpc.ClientStream +} + +func (x *configManagementPluginServiceGetParametersAnnouncementClient) Send(m *AppStreamRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *configManagementPluginServiceGetParametersAnnouncementClient) CloseAndRecv() (*ParametersAnnouncementResponse, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(ParametersAnnouncementResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + // ConfigManagementPluginServiceServer is the server API for ConfigManagementPluginService service. type ConfigManagementPluginServiceServer interface { // GenerateManifests receive a stream containing a tgz archive with all required files necessary @@ -557,6 +648,8 @@ type ConfigManagementPluginServiceServer interface { GenerateManifest(ConfigManagementPluginService_GenerateManifestServer) error // MatchRepository returns whether or not the given application is supported by the plugin MatchRepository(ConfigManagementPluginService_MatchRepositoryServer) error + // GetParametersAnnouncement gets a list of parameter announcements for the given app + GetParametersAnnouncement(ConfigManagementPluginService_GetParametersAnnouncementServer) error } // UnimplementedConfigManagementPluginServiceServer can be embedded to have forward compatible implementations. @@ -569,6 +662,9 @@ func (*UnimplementedConfigManagementPluginServiceServer) GenerateManifest(srv Co func (*UnimplementedConfigManagementPluginServiceServer) MatchRepository(srv ConfigManagementPluginService_MatchRepositoryServer) error { return status.Errorf(codes.Unimplemented, "method MatchRepository not implemented") } +func (*UnimplementedConfigManagementPluginServiceServer) GetParametersAnnouncement(srv ConfigManagementPluginService_GetParametersAnnouncementServer) error { + return status.Errorf(codes.Unimplemented, "method GetParametersAnnouncement not implemented") +} func RegisterConfigManagementPluginServiceServer(s *grpc.Server, srv ConfigManagementPluginServiceServer) { s.RegisterService(&_ConfigManagementPluginService_serviceDesc, srv) @@ -626,6 +722,32 @@ func (x *configManagementPluginServiceMatchRepositoryServer) Recv() (*AppStreamR return m, nil } +func _ConfigManagementPluginService_GetParametersAnnouncement_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(ConfigManagementPluginServiceServer).GetParametersAnnouncement(&configManagementPluginServiceGetParametersAnnouncementServer{stream}) +} + +type ConfigManagementPluginService_GetParametersAnnouncementServer interface { + SendAndClose(*ParametersAnnouncementResponse) error + Recv() (*AppStreamRequest, error) + grpc.ServerStream +} + +type configManagementPluginServiceGetParametersAnnouncementServer struct { + grpc.ServerStream +} + +func (x *configManagementPluginServiceGetParametersAnnouncementServer) SendAndClose(m *ParametersAnnouncementResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *configManagementPluginServiceGetParametersAnnouncementServer) Recv() (*AppStreamRequest, error) { + m := new(AppStreamRequest) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + var _ConfigManagementPluginService_serviceDesc = grpc.ServiceDesc{ ServiceName: "plugin.ConfigManagementPluginService", HandlerType: (*ConfigManagementPluginServiceServer)(nil), @@ -641,6 +763,11 @@ var _ConfigManagementPluginService_serviceDesc = grpc.ServiceDesc{ Handler: _ConfigManagementPluginService_MatchRepository_Handler, ClientStreams: true, }, + { + StreamName: "GetParametersAnnouncement", + Handler: _ConfigManagementPluginService_GetParametersAnnouncement_Handler, + ClientStreams: true, + }, }, Metadata: "cmpserver/plugin/plugin.proto", } @@ -911,6 +1038,47 @@ func (m *RepositoryResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ParametersAnnouncementResponse) 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 *ParametersAnnouncementResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ParametersAnnouncementResponse) 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.ParameterAnnouncements) > 0 { + for iNdEx := len(m.ParameterAnnouncements) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ParameterAnnouncements[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPlugin(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *File) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1085,6 +1253,24 @@ func (m *RepositoryResponse) Size() (n int) { return n } +func (m *ParametersAnnouncementResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ParameterAnnouncements) > 0 { + for _, e := range m.ParameterAnnouncements { + l = e.Size() + n += 1 + l + sovPlugin(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *File) Size() (n int) { if m == nil { return 0 @@ -1729,6 +1915,91 @@ func (m *RepositoryResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *ParametersAnnouncementResponse) 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 ErrIntOverflowPlugin + } + 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: ParametersAnnouncementResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ParametersAnnouncementResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ParameterAnnouncements", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlugin + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPlugin + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPlugin + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ParameterAnnouncements = append(m.ParameterAnnouncements, &apiclient.ParameterAnnouncement{}) + if err := m.ParameterAnnouncements[len(m.ParameterAnnouncements)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPlugin(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPlugin + } + 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 *File) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/cmpserver/plugin/config.go b/cmpserver/plugin/config.go index 0c6a68f5151ca..9f05043240c83 100644 --- a/cmpserver/plugin/config.go +++ b/cmpserver/plugin/config.go @@ -7,6 +7,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/argoproj/argo-cd/v2/common" + "github.com/argoproj/argo-cd/v2/reposerver/apiclient" configUtil "github.com/argoproj/argo-cd/v2/util/config" ) @@ -21,10 +22,11 @@ type PluginConfig struct { } type PluginConfigSpec struct { - Version string `json:"version"` - Init Command `json:"init,omitempty"` - Generate Command `json:"generate"` - Discover Discover `json:"discover"` + Version string `json:"version"` + Init Command `json:"init,omitempty"` + Generate Command `json:"generate"` + Discover Discover `json:"discover"` + Parameters Parameters `yaml:"parameters"` } //Discover holds find and fileName @@ -45,6 +47,17 @@ type Find struct { Glob string `json:"glob"` } +// Parameters holds static and dynamic configurations +type Parameters struct { + Static []*apiclient.ParameterAnnouncement `yaml:"static"` + Dynamic Command `yaml:"dynamic"` +} + +// Dynamic hold the dynamic announcements for CMP's +type Dynamic struct { + Command +} + func ReadPluginConfig(filePath string) (*PluginConfig, error) { path := fmt.Sprintf("%s/%s", strings.TrimRight(filePath, "/"), common.PluginConfigFileName) diff --git a/cmpserver/plugin/plugin.go b/cmpserver/plugin/plugin.go index 7ade241b9f069..5ac87d4ed5274 100644 --- a/cmpserver/plugin/plugin.go +++ b/cmpserver/plugin/plugin.go @@ -3,6 +3,7 @@ package plugin import ( "bytes" "context" + "encoding/json" "errors" "fmt" "os" @@ -13,7 +14,9 @@ import ( "github.com/argoproj/pkg/rand" + "github.com/argoproj/argo-cd/v2/cmpserver/apiclient" "github.com/argoproj/argo-cd/v2/common" + repoclient "github.com/argoproj/argo-cd/v2/reposerver/apiclient" "github.com/argoproj/argo-cd/v2/util/buffered_context" "github.com/argoproj/argo-cd/v2/util/cmp" "github.com/argoproj/argo-cd/v2/util/io/files" @@ -21,8 +24,6 @@ import ( "github.com/argoproj/gitops-engine/pkg/utils/kube" "github.com/mattn/go-zglob" log "github.com/sirupsen/logrus" - - "github.com/argoproj/argo-cd/v2/cmpserver/apiclient" ) // cmpTimeoutBuffer is the amount of time before the request deadline to timeout server-side work. It makes sure there's @@ -45,15 +46,14 @@ func NewService(initConstants CMPServerInitConstants) *Service { } } -func (s *Service) Init() error { - workDir := common.GetCMPWorkDir() +func (s *Service) Init(workDir string) error { err := os.RemoveAll(workDir) if err != nil { - return fmt.Errorf("error removing workdir %q: %s", workDir, err) + return fmt.Errorf("error removing workdir %q: %w", workDir, err) } err = os.MkdirAll(workDir, 0700) if err != nil { - return fmt.Errorf("error creating workdir %q: %s", workDir, err) + return fmt.Errorf("error creating workdir %q: %w", workDir, err) } return nil } @@ -143,24 +143,50 @@ func environ(envVars []*apiclient.EnvEntry) []string { return environ } +// getTempDirMustCleanup creates a temporary directory and returns a cleanup function. +func getTempDirMustCleanup(baseDir string) (workDir string, cleanup func(), err error) { + workDir, err = files.CreateTempDir(baseDir) + if err != nil { + return "", nil, fmt.Errorf("error creating temp dir: %w", err) + } + cleanup = func() { + if err := os.RemoveAll(workDir); err != nil { + log.WithFields(map[string]interface{}{ + common.SecurityField: common.SecurityHigh, + common.SecurityCWEField: 459, + }).Errorf("Failed to clean up temp directory: %s", err) + } + } + return workDir, cleanup, nil +} + +type Stream interface { + Recv() (*apiclient.AppStreamRequest, error) + Context() context.Context +} + +type GenerateManifestStream interface { + Stream + SendAndClose(response *apiclient.ManifestResponse) error +} + // GenerateManifest runs generate command from plugin config file and returns generated manifest files func (s *Service) GenerateManifest(stream apiclient.ConfigManagementPluginService_GenerateManifestServer) error { + return s.generateManifestGeneric(stream) +} + +func (s *Service) generateManifestGeneric(stream GenerateManifestStream) error { ctx, cancel := buffered_context.WithEarlierDeadline(stream.Context(), cmpTimeoutBuffer) defer cancel() - workDir, err := files.CreateTempDir(common.GetCMPWorkDir()) + workDir, cleanup, err := getTempDirMustCleanup(common.GetCMPWorkDir()) if err != nil { - return fmt.Errorf("error creating temp dir: %s", err) + return fmt.Errorf("error creating workdir for manifest generation: %w", err) } - defer func() { - if err := os.RemoveAll(workDir); err != nil { - // we panic here as the workDir may contain sensitive information - panic(fmt.Sprintf("error removing generate manifest workdir: %s", err)) - } - }() + defer cleanup() metadata, err := cmp.ReceiveRepoStream(ctx, stream, workDir) if err != nil { - return fmt.Errorf("generate manifest error receiving stream: %s", err) + return fmt.Errorf("generate manifest error receiving stream: %w", err) } appPath := filepath.Clean(filepath.Join(workDir, metadata.AppRelPath)) @@ -169,11 +195,11 @@ func (s *Service) GenerateManifest(stream apiclient.ConfigManagementPluginServic } response, err := s.generateManifest(ctx, appPath, metadata.GetEnv()) if err != nil { - return fmt.Errorf("error generating manifests: %s", err) + return fmt.Errorf("error generating manifests: %w", err) } err = stream.SendAndClose(response) if err != nil { - return fmt.Errorf("error sending manifest response: %s", err) + return fmt.Errorf("error sending manifest response: %w", err) } return nil } @@ -216,42 +242,46 @@ func (s *Service) generateManifest(ctx context.Context, appDir string, envEntrie }, err } +type MatchRepositoryStream interface { + Stream + SendAndClose(response *apiclient.RepositoryResponse) error +} + // MatchRepository receives the application stream and checks whether // its repository type is supported by the config management plugin // server. -//The checks are implemented in the following order: -// 1. If spec.Discover.FileName is provided it finds for a name match in Applications files -// 2. If spec.Discover.Find.Glob is provided if finds for a glob match in Applications files -// 3. Otherwise it runs the spec.Discover.Find.Command +// The checks are implemented in the following order: +// 1. If spec.Discover.FileName is provided it finds for a name match in Applications files +// 2. If spec.Discover.Find.Glob is provided if finds for a glob match in Applications files +// 3. Otherwise it runs the spec.Discover.Find.Command func (s *Service) MatchRepository(stream apiclient.ConfigManagementPluginService_MatchRepositoryServer) error { + return s.matchRepositoryGeneric(stream) +} + +func (s *Service) matchRepositoryGeneric(stream MatchRepositoryStream) error { bufferedCtx, cancel := buffered_context.WithEarlierDeadline(stream.Context(), cmpTimeoutBuffer) defer cancel() - workDir, err := files.CreateTempDir(common.GetCMPWorkDir()) + workDir, cleanup, err := getTempDirMustCleanup(common.GetCMPWorkDir()) if err != nil { - return fmt.Errorf("error creating match repository workdir: %s", err) + return fmt.Errorf("error creating workdir for repository matching: %w", err) } - defer func() { - if err := os.RemoveAll(workDir); err != nil { - // we panic here as the workDir may contain sensitive information - panic(fmt.Sprintf("error removing match repository workdir: %s", err)) - } - }() + defer cleanup() metadata, err := cmp.ReceiveRepoStream(bufferedCtx, stream, workDir) if err != nil { - return fmt.Errorf("match repository error receiving stream: %s", err) + return fmt.Errorf("match repository error receiving stream: %w", err) } isSupported, err := s.matchRepository(bufferedCtx, workDir, metadata.GetEnv()) if err != nil { - return fmt.Errorf("match repository error: %s", err) + return fmt.Errorf("match repository error: %w", err) } repoResponse := &apiclient.RepositoryResponse{IsSupported: isSupported} err = stream.SendAndClose(repoResponse) if err != nil { - return fmt.Errorf("error sending match repository response: %s", err) + return fmt.Errorf("error sending match repository response: %w", err) } return nil } @@ -263,7 +293,7 @@ func (s *Service) matchRepository(ctx context.Context, workdir string, envEntrie pattern := filepath.Join(workdir, config.Spec.Discover.FileName) matches, err := filepath.Glob(pattern) if err != nil { - e := fmt.Errorf("error finding filename match for pattern %q: %s", pattern, err) + e := fmt.Errorf("error finding filename match for pattern %q: %w", pattern, err) log.Debug(e) return false, e } @@ -277,7 +307,7 @@ func (s *Service) matchRepository(ctx context.Context, workdir string, envEntrie // https://github.com/golang/go/issues/11862 matches, err := zglob.Glob(pattern) if err != nil { - e := fmt.Errorf("error finding glob match for pattern %q: %s", pattern, err) + e := fmt.Errorf("error finding glob match for pattern %q: %w", pattern, err) log.Debug(e) return false, e } @@ -293,7 +323,7 @@ func (s *Service) matchRepository(ctx context.Context, workdir string, envEntrie find, err := runCommand(ctx, config.Spec.Discover.Find.Command, workdir, env) if err != nil { - return false, fmt.Errorf("error running find command: %s", err) + return false, fmt.Errorf("error running find command: %w", err) } if find != "" { @@ -301,3 +331,66 @@ func (s *Service) matchRepository(ctx context.Context, workdir string, envEntrie } return false, nil } + +// ParametersAnnouncementStream defines an interface able to send/receive a stream of parameter announcements. +type ParametersAnnouncementStream interface { + Stream + SendAndClose(response *apiclient.ParametersAnnouncementResponse) error +} + +// GetParametersAnnouncement gets parameter announcements for a given Application and repo contents. +func (s *Service) GetParametersAnnouncement(stream apiclient.ConfigManagementPluginService_GetParametersAnnouncementServer) error { + bufferedCtx, cancel := buffered_context.WithEarlierDeadline(stream.Context(), cmpTimeoutBuffer) + defer cancel() + + workDir, cleanup, err := getTempDirMustCleanup(common.GetCMPWorkDir()) + if err != nil { + return fmt.Errorf("error creating workdir for generating parameter announcements: %w", err) + } + defer cleanup() + + metadata, err := cmp.ReceiveRepoStream(bufferedCtx, stream, workDir) + if err != nil { + return fmt.Errorf("parameters announcement error receiving stream: %w", err) + } + appPath := filepath.Clean(filepath.Join(workDir, metadata.AppRelPath)) + if !strings.HasPrefix(appPath, workDir) { + return fmt.Errorf("illegal appPath: out of workDir bound") + } + + repoResponse, err := getParametersAnnouncement(bufferedCtx, appPath, s.initConstants.PluginConfig.Spec.Parameters.Static, s.initConstants.PluginConfig.Spec.Parameters.Dynamic) + if err != nil { + return fmt.Errorf("get parameters announcement error: %w", err) + } + + err = stream.SendAndClose(repoResponse) + if err != nil { + return fmt.Errorf("error sending parameters announcement response: %w", err) + } + return nil +} + +func getParametersAnnouncement(ctx context.Context, appDir string, announcements []*repoclient.ParameterAnnouncement, command Command) (*apiclient.ParametersAnnouncementResponse, error) { + augmentedAnnouncements := announcements + + if len(command.Command) > 0 { + stdout, err := runCommand(ctx, command, appDir, os.Environ()) + if err != nil { + return nil, fmt.Errorf("error executing dynamic parameter output command: %w", err) + } + + var dynamicParamAnnouncements []*repoclient.ParameterAnnouncement + err = json.Unmarshal([]byte(stdout), &dynamicParamAnnouncements) + if err != nil { + return nil, fmt.Errorf("error unmarshaling dynamic parameter output into ParametersAnnouncementResponse: %w", err) + } + + // dynamic goes first, because static should take precedence by being later. + augmentedAnnouncements = append(dynamicParamAnnouncements, announcements...) + } + + repoResponse := &apiclient.ParametersAnnouncementResponse{ + ParameterAnnouncements: augmentedAnnouncements, + } + return repoResponse, nil +} diff --git a/cmpserver/plugin/plugin.proto b/cmpserver/plugin/plugin.proto index ce4452d638eed..b6dc23232e8a1 100644 --- a/cmpserver/plugin/plugin.proto +++ b/cmpserver/plugin/plugin.proto @@ -3,6 +3,8 @@ option go_package = "github.com/argoproj/argo-cd/v2/cmpserver/apiclient"; package plugin; +import "github.com/argoproj/argo-cd/v2/reposerver/repository/repository.proto"; + // AppStreamRequest is the request object used to send the application's // files over a stream. message AppStreamRequest { @@ -44,6 +46,12 @@ message RepositoryResponse { bool isSupported = 1; } +// ParametersAnnouncementResponse contains a list of announcements. This list represents all the parameters which a CMP +// is able to accept. +message ParametersAnnouncementResponse { + repeated repository.ParameterAnnouncement parameterAnnouncements = 1; +} + message File { bytes chunk = 1; } @@ -58,4 +66,8 @@ service ConfigManagementPluginService { // MatchRepository returns whether or not the given application is supported by the plugin rpc MatchRepository(stream AppStreamRequest) returns (RepositoryResponse) { } + + // GetParametersAnnouncement gets a list of parameter announcements for the given app + rpc GetParametersAnnouncement(stream AppStreamRequest) returns (ParametersAnnouncementResponse) { + } } diff --git a/cmpserver/plugin/plugin_test.go b/cmpserver/plugin/plugin_test.go index 66744c1c717f5..c14de4ccf6328 100644 --- a/cmpserver/plugin/plugin_test.go +++ b/cmpserver/plugin/plugin_test.go @@ -1,17 +1,27 @@ package plugin import ( + "bytes" "context" + "fmt" + "io" + "os" + "path" "path/filepath" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "google.golang.org/grpc/metadata" + "gopkg.in/yaml.v2" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/argoproj/argo-cd/v2/cmpserver/apiclient" + repoclient "github.com/argoproj/argo-cd/v2/reposerver/apiclient" "github.com/argoproj/argo-cd/v2/test" + "github.com/argoproj/argo-cd/v2/util/cmp" + "github.com/argoproj/argo-cd/v2/util/tgzstream" ) func newService(configFilePath string) (*Service, error) { @@ -30,6 +40,11 @@ func newService(configFilePath string) (*Service, error) { return service, nil } +func (s *Service) WithGenerateCommand(command Command) *Service { + s.initConstants.PluginConfig.Spec.Generate = command + return s +} + type pluginOpt func(*CMPServerInitConstants) func withDiscover(d Discover) pluginOpt { @@ -104,6 +119,19 @@ func TestMatchRepository(t *testing.T) { assert.NoError(t, err) assert.False(t, match) }) + t.Run("will not match a pattern with a syntax error", func(t *testing.T) { + // given + d := Discover{ + FileName: "[", + } + f := setup(t, withDiscover(d)) + + // when + _, err := f.service.matchRepository(context.Background(), f.path, f.env) + + // then + assert.ErrorContains(t, err, "syntax error") + }) t.Run("will match plugin by glob", func(t *testing.T) { // given d := Discover{ @@ -136,6 +164,21 @@ func TestMatchRepository(t *testing.T) { assert.NoError(t, err) assert.False(t, match) }) + t.Run("will throw an error for a bad pattern", func(t *testing.T) { + // given + d := Discover{ + Find: Find{ + Glob: "does-not-exist", + }, + } + f := setup(t, withDiscover(d)) + + // when + _, err := f.service.matchRepository(context.Background(), f.path, f.env) + + // then + assert.ErrorContains(t, err, "error finding glob match for pattern") + }) t.Run("will match plugin by command when returns any output", func(t *testing.T) { // given d := Discover{ @@ -238,17 +281,49 @@ func Test_Negative_ConfigFile_DoesnotExist(t *testing.T) { func TestGenerateManifest(t *testing.T) { configFilePath := "./testdata/kustomize/config" - service, err := newService(configFilePath) - require.NoError(t, err) - res1, err := service.generateManifest(context.Background(), "", nil) + t.Run("successful generate", func(t *testing.T) { + service, err := newService(configFilePath) + require.NoError(t, err) + + res1, err := service.generateManifest(context.Background(), "testdata/kustomize", nil) + require.NoError(t, err) + require.NotNil(t, res1) + + expectedOutput := "{\"apiVersion\":\"v1\",\"data\":{\"foo\":\"bar\"},\"kind\":\"ConfigMap\",\"metadata\":{\"name\":\"my-map\"}}" + if res1 != nil { + require.Equal(t, expectedOutput, res1.Manifests[0]) + } + }) + t.Run("bad generate command", func(t *testing.T) { + service, err := newService(configFilePath) + require.NoError(t, err) + service.WithGenerateCommand(Command{Command: []string{"bad-command"}}) + + res, err := service.generateManifest(context.Background(), "testdata/kustomize", nil) + assert.ErrorContains(t, err, "executable file not found") + assert.Nil(t, res.Manifests) + }) + t.Run("bad yaml output", func(t *testing.T) { + service, err := newService(configFilePath) + require.NoError(t, err) + service.WithGenerateCommand(Command{Command: []string{"echo", "invalid yaml: }"}}) + + res, err := service.generateManifest(context.Background(), "testdata/kustomize", nil) + assert.ErrorContains(t, err, "failed to unmarshal manifest") + assert.Nil(t, res.Manifests) + }) +} + +func TestGenerateManifest_deadline_exceeded(t *testing.T) { + configFilePath := "./testdata/kustomize/config" + service, err := newService(configFilePath) require.NoError(t, err) - require.NotNil(t, res1) - expectedOutput := "{\"apiVersion\":\"v1\",\"data\":{\"foo\":\"bar\"},\"kind\":\"ConfigMap\",\"metadata\":{\"name\":\"my-map\"}}" - if res1 != nil { - require.Equal(t, expectedOutput, res1.Manifests[0]) - } + expiredCtx, cancel := context.WithTimeout(context.Background(), time.Second*0) + defer cancel() + _, err = service.generateManifest(expiredCtx, "", nil) + assert.ErrorContains(t, err, "context deadline exceeded") } // TestRunCommandContextTimeout makes sure the command dies at timeout rather than sleeping past the timeout. @@ -266,3 +341,388 @@ func TestRunCommandContextTimeout(t *testing.T) { assert.Error(t, err) // The command should time out, causing an error. assert.Less(t, after.Sub(before), 1*time.Second) } + +func TestRunCommandEmptyCommand(t *testing.T) { + _, err := runCommand(context.Background(), Command{}, "", nil) + assert.ErrorContains(t, err, "Command is empty") +} + +func Test_getParametersAnnouncement_empty_command(t *testing.T) { + staticYAML := ` +- name: static-a +- name: static-b +` + static := &[]*repoclient.ParameterAnnouncement{} + err := yaml.Unmarshal([]byte(staticYAML), static) + require.NoError(t, err) + command := Command{ + Command: []string{"echo"}, + Args: []string{`[]`}, + } + res, err := getParametersAnnouncement(context.Background(), "", *static, command) + require.NoError(t, err) + assert.Equal(t, []*repoclient.ParameterAnnouncement{{Name: "static-a"}, {Name: "static-b"}}, res.ParameterAnnouncements) +} + +func Test_getParametersAnnouncement_no_command(t *testing.T) { + staticYAML := ` +- name: static-a +- name: static-b +` + static := &[]*repoclient.ParameterAnnouncement{} + err := yaml.Unmarshal([]byte(staticYAML), static) + require.NoError(t, err) + command := Command{} + res, err := getParametersAnnouncement(context.Background(), "", *static, command) + require.NoError(t, err) + assert.Equal(t, []*repoclient.ParameterAnnouncement{{Name: "static-a"}, {Name: "static-b"}}, res.ParameterAnnouncements) +} + +func Test_getParametersAnnouncement_static_and_dynamic(t *testing.T) { + staticYAML := ` +- name: static-a +- name: static-b +` + static := &[]*repoclient.ParameterAnnouncement{} + err := yaml.Unmarshal([]byte(staticYAML), static) + require.NoError(t, err) + command := Command{ + Command: []string{"echo"}, + Args: []string{`[{"name": "dynamic-a"}, {"name": "dynamic-b"}]`}, + } + res, err := getParametersAnnouncement(context.Background(), "", *static, command) + require.NoError(t, err) + expected := []*repoclient.ParameterAnnouncement{ + {Name: "dynamic-a"}, + {Name: "dynamic-b"}, + {Name: "static-a"}, + {Name: "static-b"}, + } + assert.Equal(t, expected, res.ParameterAnnouncements) +} + +func Test_getParametersAnnouncement_invalid_json(t *testing.T) { + command := Command{ + Command: []string{"echo"}, + Args: []string{`[`}, + } + _, err := getParametersAnnouncement(context.Background(), "", []*repoclient.ParameterAnnouncement{}, command) + assert.Error(t, err) + assert.Contains(t, err.Error(), "unexpected end of JSON input") +} + +func Test_getParametersAnnouncement_bad_command(t *testing.T) { + command := Command{ + Command: []string{"exit"}, + Args: []string{"1"}, + } + _, err := getParametersAnnouncement(context.Background(), "", []*repoclient.ParameterAnnouncement{}, command) + assert.Error(t, err) + assert.Contains(t, err.Error(), "error executing dynamic parameter output command") +} + +func Test_getTempDirMustCleanup(t *testing.T) { + tempDir := t.TempDir() + + // Induce a directory create error to verify error handling. + err := os.Chmod(tempDir, 0000) + require.NoError(t, err) + _, _, err = getTempDirMustCleanup(path.Join(tempDir, "test")) + assert.ErrorContains(t, err, "error creating temp dir") + + err = os.Chmod(tempDir, 0700) + require.NoError(t, err) + workDir, cleanup, err := getTempDirMustCleanup(tempDir) + require.NoError(t, err) + require.DirExists(t, workDir) + cleanup() + assert.NoDirExists(t, workDir) +} + +func TestService_Init(t *testing.T) { + // Set up a base directory containing a test directory and a test file. + tempDir := t.TempDir() + workDir := path.Join(tempDir, "workDir") + err := os.MkdirAll(workDir, 0700) + require.NoError(t, err) + testfile := path.Join(workDir, "testfile") + file, err := os.Create(testfile) + require.NoError(t, err) + err = file.Close() + require.NoError(t, err) + + // Make the base directory read-only so Init's cleanup fails. + err = os.Chmod(tempDir, 0000) + require.NoError(t, err) + s := NewService(CMPServerInitConstants{PluginConfig: PluginConfig{}}) + err = s.Init(workDir) + assert.ErrorContains(t, err, "error removing workdir", "Init must throw an error if it can't remove the work directory") + + // Make the base directory writable so Init's cleanup succeeds. + err = os.Chmod(tempDir, 0700) + require.NoError(t, err) + err = s.Init(workDir) + assert.NoError(t, err) + assert.DirExists(t, workDir) + assert.NoFileExists(t, testfile) +} + +func TestEnviron(t *testing.T) { + t.Run("empty environ", func(t *testing.T) { + env := environ([]*apiclient.EnvEntry{}) + assert.Nil(t, env) + }) + t.Run("env vars with empty names or values", func(t *testing.T) { + env := environ([]*apiclient.EnvEntry{ + {Value: "test"}, + {Name: "test"}, + }) + assert.Nil(t, env) + }) + t.Run("proper env vars", func(t *testing.T) { + env := environ([]*apiclient.EnvEntry{ + {Name: "name1", Value: "value1"}, + {Name: "name2", Value: "value2"}, + }) + assert.Equal(t, []string{"name1=value1", "name2=value2"}, env) + }) +} + +type MockGenerateManifestStream struct { + metadataSent bool + fileSent bool + metadataRequest *apiclient.AppStreamRequest + fileRequest *apiclient.AppStreamRequest + response *apiclient.ManifestResponse +} + +func NewMockGenerateManifestStream(repoPath, appPath string, env []string) (*MockGenerateManifestStream, error) { + tgz, mr, err := cmp.GetCompressedRepoAndMetadata(repoPath, appPath, env, nil, nil) + if err != nil { + return nil, err + } + defer tgzstream.CloseAndDelete(tgz) + + tgzBuffer := bytes.NewBuffer(nil) + _, err = io.Copy(tgzBuffer, tgz) + if err != nil { + return nil, fmt.Errorf("failed to copy manifest targz to a byte buffer: %w", err) + } + + return &MockGenerateManifestStream{ + metadataRequest: mr, + fileRequest: cmp.AppFileRequest(tgzBuffer.Bytes()), + }, nil +} + +func (m *MockGenerateManifestStream) SendAndClose(response *apiclient.ManifestResponse) error { + m.response = response + return nil +} + +func (m *MockGenerateManifestStream) Recv() (*apiclient.AppStreamRequest, error) { + if !m.metadataSent { + m.metadataSent = true + return m.metadataRequest, nil + } + + if !m.fileSent { + m.fileSent = true + return m.fileRequest, nil + } + return nil, io.EOF +} + +func (m *MockGenerateManifestStream) Context() context.Context { + return context.Background() +} + +func TestService_GenerateManifest(t *testing.T) { + configFilePath := "./testdata/kustomize/config" + service, err := newService(configFilePath) + require.NoError(t, err) + + t.Run("successful generate", func(t *testing.T) { + s, err := NewMockGenerateManifestStream("./testdata/kustomize", "./testdata/kustomize", nil) + require.NoError(t, err) + err = service.generateManifestGeneric(s) + require.NoError(t, err) + require.NotNil(t, s.response) + assert.Equal(t, []string{"{\"apiVersion\":\"v1\",\"data\":{\"foo\":\"bar\"},\"kind\":\"ConfigMap\",\"metadata\":{\"name\":\"my-map\"}}"}, s.response.Manifests) + }) + + t.Run("out-of-bounds app path", func(t *testing.T) { + s, err := NewMockGenerateManifestStream("./testdata/kustomize", "./testdata/kustomize", nil) + require.NoError(t, err) + // set a malicious app path on the metadata + s.metadataRequest.Request.(*apiclient.AppStreamRequest_Metadata).Metadata.AppRelPath = "../out-of-bounds" + err = service.generateManifestGeneric(s) + require.ErrorContains(t, err, "illegal appPath") + assert.Nil(t, s.response) + }) +} + +type MockMatchRepositoryStream struct { + metadataSent bool + fileSent bool + metadataRequest *apiclient.AppStreamRequest + fileRequest *apiclient.AppStreamRequest + response *apiclient.RepositoryResponse +} + +func NewMockMatchRepositoryStream(repoPath, appPath string, env []string) (*MockMatchRepositoryStream, error) { + tgz, mr, err := cmp.GetCompressedRepoAndMetadata(repoPath, appPath, env, nil, nil) + if err != nil { + return nil, err + } + defer tgzstream.CloseAndDelete(tgz) + + tgzBuffer := bytes.NewBuffer(nil) + _, err = io.Copy(tgzBuffer, tgz) + if err != nil { + return nil, fmt.Errorf("failed to copy manifest targz to a byte buffer: %w", err) + } + + return &MockMatchRepositoryStream{ + metadataRequest: mr, + fileRequest: cmp.AppFileRequest(tgzBuffer.Bytes()), + }, nil +} + +func (m *MockMatchRepositoryStream) SendAndClose(response *apiclient.RepositoryResponse) error { + m.response = response + return nil +} + +func (m *MockMatchRepositoryStream) Recv() (*apiclient.AppStreamRequest, error) { + if !m.metadataSent { + m.metadataSent = true + return m.metadataRequest, nil + } + + if !m.fileSent { + m.fileSent = true + return m.fileRequest, nil + } + return nil, io.EOF +} + +func (m *MockMatchRepositoryStream) Context() context.Context { + return context.Background() +} + +func TestService_MatchRepository(t *testing.T) { + configFilePath := "./testdata/kustomize/config" + service, err := newService(configFilePath) + require.NoError(t, err) + + t.Run("supported app", func(t *testing.T) { + s, err := NewMockMatchRepositoryStream("./testdata/kustomize", "./testdata/kustomize", nil) + require.NoError(t, err) + err = service.matchRepositoryGeneric(s) + require.NoError(t, err) + require.NotNil(t, s.response) + assert.True(t, s.response.IsSupported) + }) + + t.Run("unsupported app", func(t *testing.T) { + s, err := NewMockMatchRepositoryStream("./testdata/ksonnet", "./testdata/ksonnet", nil) + require.NoError(t, err) + err = service.matchRepositoryGeneric(s) + require.NoError(t, err) + require.NotNil(t, s.response) + assert.False(t, s.response.IsSupported) + }) +} + +type MockParametersAnnouncementStream struct { + metadataSent bool + fileSent bool + metadataRequest *apiclient.AppStreamRequest + fileRequest *apiclient.AppStreamRequest + response *apiclient.ParametersAnnouncementResponse +} + +func NewMockParametersAnnouncementStream(repoPath, appPath string, env []string) (*MockParametersAnnouncementStream, error) { + tgz, mr, err := cmp.GetCompressedRepoAndMetadata(repoPath, appPath, env, nil, nil) + if err != nil { + return nil, err + } + defer tgzstream.CloseAndDelete(tgz) + + tgzBuffer := bytes.NewBuffer(nil) + _, err = io.Copy(tgzBuffer, tgz) + if err != nil { + return nil, fmt.Errorf("failed to copy manifest targz to a byte buffer: %w", err) + } + + return &MockParametersAnnouncementStream{ + metadataRequest: mr, + fileRequest: cmp.AppFileRequest(tgzBuffer.Bytes()), + }, nil +} + +func (m *MockParametersAnnouncementStream) SendAndClose(response *apiclient.ParametersAnnouncementResponse) error { + m.response = response + return nil +} + +func (m *MockParametersAnnouncementStream) Recv() (*apiclient.AppStreamRequest, error) { + if !m.metadataSent { + m.metadataSent = true + return m.metadataRequest, nil + } + + if !m.fileSent { + m.fileSent = true + return m.fileRequest, nil + } + return nil, io.EOF +} + +func (m *MockParametersAnnouncementStream) SetHeader(metadata.MD) error { + return nil +} + +func (m *MockParametersAnnouncementStream) SendHeader(metadata.MD) error { + return nil +} + +func (m *MockParametersAnnouncementStream) SetTrailer(metadata.MD) {} + +func (m *MockParametersAnnouncementStream) Context() context.Context { + return context.Background() +} + +func (m *MockParametersAnnouncementStream) SendMsg(interface{}) error { + return nil +} + +func (m *MockParametersAnnouncementStream) RecvMsg(interface{}) error { + return nil +} + +func TestService_GetParametersAnnouncement(t *testing.T) { + configFilePath := "./testdata/kustomize/config" + service, err := newService(configFilePath) + require.NoError(t, err) + + t.Run("successful response", func(t *testing.T) { + s, err := NewMockParametersAnnouncementStream("./testdata/kustomize", "./testdata/kustomize", nil) + require.NoError(t, err) + err = service.GetParametersAnnouncement(s) + require.NoError(t, err) + require.NotNil(t, s.response) + require.Len(t, s.response.ParameterAnnouncements, 1) + assert.Equal(t, repoclient.ParameterAnnouncement{Name: "test-param", String_: "test-value"}, *s.response.ParameterAnnouncements[0]) + }) + t.Run("out of bounds app", func(t *testing.T) { + s, err := NewMockParametersAnnouncementStream("./testdata/kustomize", "./testdata/kustomize", nil) + require.NoError(t, err) + // set a malicious app path on the metadata + s.metadataRequest.Request.(*apiclient.AppStreamRequest_Metadata).Metadata.AppRelPath = "../out-of-bounds" + err = service.GetParametersAnnouncement(s) + require.ErrorContains(t, err, "illegal appPath") + require.Nil(t, s.response) + }) +} diff --git a/cmpserver/plugin/testdata/kustomize/config/plugin.yaml b/cmpserver/plugin/testdata/kustomize/config/plugin.yaml index b6b7a154a7aee..addc30c7b4c21 100644 --- a/cmpserver/plugin/testdata/kustomize/config/plugin.yaml +++ b/cmpserver/plugin/testdata/kustomize/config/plugin.yaml @@ -7,8 +7,12 @@ spec: init: command: [kustomize, version] generate: - command: [sh, -c, "cd testdata/kustomize && kustomize build"] + command: [sh, -c, "kustomize build"] discover: find: command: [sh, -c, find . -name kustomization.yaml] - glob: "**/*/kustomization.yaml" + glob: "**/kustomization.yaml" + parameters: + static: + - name: test-param + string: test-value diff --git a/cmpserver/server.go b/cmpserver/server.go index f66da10605695..bbb493f6b1d66 100644 --- a/cmpserver/server.go +++ b/cmpserver/server.go @@ -108,7 +108,7 @@ func (a *ArgoCDCMPServer) CreateGRPC() (*grpc.Server, error) { return true, nil })) pluginService := plugin.NewService(a.initConstants) - err := pluginService.Init() + err := pluginService.Init(common.GetCMPWorkDir()) if err != nil { return nil, fmt.Errorf("error initializing plugin service: %s", err) } diff --git a/docs/operator-manual/application.yaml b/docs/operator-manual/application.yaml index 366d237716ea1..3aabda236df9c 100644 --- a/docs/operator-manual/application.yaml +++ b/docs/operator-manual/application.yaml @@ -108,6 +108,7 @@ spec: # plugin specific config plugin: + # NOTE: this field is deprecated in v2.5 and must be removed to use sidecar-based plugins. # Only set the plugin name if the plugin is defined in argocd-cm. # If the plugin is defined as a sidecar, omit the name. The plugin will be automatically matched with the # Application according to the plugin's discovery rules. @@ -116,6 +117,15 @@ spec: env: - name: FOO value: bar + # Plugin parameters are new in v2.5. + parameters: + - name: string-param + string: example-string + - name: array-param + array: [item1, item2] + - name: map-param + map: + param-name: param-value # Destination cluster and namespace to deploy the application destination: diff --git a/docs/user-guide/config-management-plugins.md b/docs/user-guide/config-management-plugins.md index 13157e302dc67..b36e2094028b4 100644 --- a/docs/user-guide/config-management-plugins.md +++ b/docs/user-guide/config-management-plugins.md @@ -1,22 +1,34 @@ -# Plugins +# Config Management Plugins -Argo CD allows integrating more config management tools using config management plugins. +Argo CD's "native" config management tools are Helm, Jsonnet, and Kustomize. If you want to use a different config +management tools, or if Argo CD's native tool support does not include a feature you need, you might need to turn to +a Config Management Plugin (CMP). + +The Argo CD "repo server" component is in charge of building Kubernetes manifests based on some source files from a +Helm, OCI, or git repository. When a config management plugin is correctly configured, the repo server may delegate the +task of building manifests to the plugin. + +The following sections will describe how to create, install, and use plugins. Check out the +[example plugins](https://github.com/argoproj/argo-cd/tree/master/examples/plugins) for additional guidance. !!! warning - Plugins are granted a level of trust in the Argo CD system, so it is important to implement plugins securely. Argo - CD administrators should only install plugins from trusted sources, and they should audit plugins to weigh their + Plugins are granted a level of trust in the Argo CD system, so it is important to implement plugins securely. Argo + CD administrators should only install plugins from trusted sources, and they should audit plugins to weigh their particular risks and benefits. -## Installing a CMP +## Installing a config management plugin -There are two ways to install a Config Management Plugin (CMP): +There are two ways to install a Config Management Plugin: -1. Add the plugin config to the Argo CD ConfigMap. The repo-server container will run your plugin's commands. - This is a good option for a simple plugin that requires only a few lines of code that fit nicely in the Argo CD ConfigMap. +1. Add the plugin config to the Argo CD ConfigMap (**this method is deprecated and will be removed in a future + version**). The repo-server container will run your plugin's commands. This is a good option for a simple plugin that + requires only a few lines of code that fit nicely in the Argo CD ConfigMap. 2. Add the plugin as a sidecar to the repo-server Pod. - This is a good option for a more complex plugin that would clutter the Argo CD ConfigMap. A copy of the repository is sent to the sidecar container as a tarball and processed individually per application, which makes it a good option for [concurrent processing of monorepos](../operator-manual/high_availability.md#enable-concurrent-processing). + This is a good option for a more complex plugin that would clutter the Argo CD ConfigMap. A copy of the repository is + sent to the sidecar container as a tarball and processed individually per application, which makes it a good option + for [concurrent processing of monorepos](../operator-manual/high_availability.md#enable-concurrent-processing). -### Option 1: Configure plugins via Argo CD configmap +### Option 1: Configure plugins via Argo CD configmap (deprecated) The following changes are required to configure a new plugin: @@ -60,17 +72,80 @@ Plugins will be configured via a ConfigManagementPlugin manifest located inside apiVersion: argoproj.io/v1alpha1 kind: ConfigManagementPlugin metadata: - name: cmp-plugin + # The name of the plugin must be unique within a given Argo CD instance. + name: my-plugin spec: version: v1.0 + # The init command runs in the Application source directory at the beginning of each manifest generation. The init + # command can output anything. A non-zero status code will fail manifest generation. init: # Init always happens immediately before generate, but its output is not treated as manifests. # This is a good place to, for example, download chart dependencies. - command: [sh, -c, 'echo "Initializing..."'] + command: [sh] + args: [-c, 'echo "Initializing..."'] + # The generate command runs in the Application source directory each time manifests are generated. Standard output + # must be ONLY valid YAML manifests. A non-zero exit code will fail manifest generation. + # Error output will be sent to the UI, so avoid printing sensitive information (such as secrets). generate: - command: [sh, -c, 'echo "{\"kind\": \"ConfigMap\", \"apiVersion\": \"v1\", \"metadata\": { \"name\": \"$ARGOCD_APP_NAME\", \"namespace\": \"$ARGOCD_APP_NAMESPACE\", \"annotations\": {\"Foo\": \"$FOO\", \"KubeVersion\": \"$KUBE_VERSION\", \"KubeApiVersion\": \"$KUBE_API_VERSIONS\",\"Bar\": \"baz\"}}}"'] + command: [sh, -c] + args: + - | + echo "{\"kind\": \"ConfigMap\", \"apiVersion\": \"v1\", \"metadata\": { \"name\": \"$ARGOCD_APP_NAME\", \"namespace\": \"$ARGOCD_APP_NAMESPACE\", \"annotations\": {\"Foo\": \"$FOO\", \"KubeVersion\": \"$KUBE_VERSION\", \"KubeApiVersion\": \"$KUBE_API_VERSIONS\",\"Bar\": \"baz\"}}}" + # The discovery config is applied to a repository. If every configured discovery tool matches, then the plugin may be + # used to generate manifests for Applications using the repository. + # Only one of fileName, find.glob, or find.command should be specified. If multiple are specified then only the + # first (in that order) is evaluated. discover: + # fileName is a glob pattern (https://pkg.go.dev/path/filepath#Glob) that is applied to the repository's root + # directory (not the Application source directory). If there is a match, this plugin may be used for the repository. fileName: "./subdir/s*.yaml" + find: + # This does the same thing as fileName, but it supports double-start (nested directory) glob patterns. + glob: "**/Chart.yaml" + # The find command runs in the repository's root directory. To match, it must exit with status code 0 _and_ + # produce non-empty output to standard out. + command: [sh, -c, find . -name env.yaml] + # The parameters config describes what parameters the UI should display for an Application. It is up to the user to + # actually set parameters in the Application manifest (in spec.source.plugin.parameters). The announcements _only_ + # inform the "Parameters" tab in the App Details page of the UI. + parameters: + # Static parameter announcements are sent to the UI for _all_ Applications handled by this plugin. + # Think of the `string`, `array`, and `map` values set here as "defaults". It is up to the plugin author to make + # sure that these default values actually reflect the plugin's behavior if the user doesn't explicitly set different + # values for those parameters. + static: + - name: string-param + title: Description of the string param + tooltip: Tooltip shown when the user hovers the + # If this field is set, the UI will indicate to the user that they must set the value. + required: false + # itemType tells the UI how to present the parameter's value (or, for arrays and maps, values). Default is + # "string". Examples of other types which may be supported in the future are "boolean" or "number". + # Even if the itemType is not "string", the parameter value from the Application spec will be sent to the plugin + # as a string. It's up to the plugin to do the appropriate conversion. + itemType: "" + # collectionType describes what type of value this parameter accepts (string, array, or map) and allows the UI + # to present a form to match that type. Default is "string". This field must be present for non-string types. + # It will not be inferred from the presence of an `array` or `map` field. + collectionType: "" + # This field communicates the parameter's default value to the UI. Setting this field is optional. + string: default-string-value + # All the fields above besides "string" apply to both the array and map type parameter announcements. + - name: array-param + # This field communicates the parameter's default value to the UI. Setting this field is optional. + array: [default, items] + collectionType: array + - name: map-param + # This field communicates the parameter's default value to the UI. Setting this field is optional. + map: + some: value + collectionType: map + # Dynamic parameter announcements are announcements specific to an Application handled by this plugin. For example, + # the values for a Helm chart's values.yaml file could be sent as parameter announcements. + dynamic: + # The command is run in an Application's source directory. Standard output must be JSON matching the schema of the + # static parameter announcements list. + command: [echo, '[{"name": "example-param", "string": "default-string-value"}]'] ``` !!! note @@ -104,19 +179,19 @@ COPY plugin.yaml ./ ``` If you use a stock image for the sidecar or would rather maintain the plugin configuration in a ConfigMap, just nest the -plugin config file in a ConfigMap under the `plugin.yaml` key. +plugin config file in a ConfigMap under the `plugin.yaml` key and mount the ConfigMap in the sidecar (see next section). ```yaml apiVersion: v1 kind: ConfigMap metadata: - name: cmp-plugin + name: my-plugin-config data: plugin.yaml: | apiVersion: argoproj.io/v1alpha1 kind: ConfigManagementPlugin metadata: - name: cmp-plugin + name: my-plugin spec: version: v1.0 init: @@ -129,12 +204,12 @@ data: #### 3. Register the plugin sidecar -To install a plugin, patch argocd-repo-server to run the CMP container as a sidecar, with argocd-cmp-server as its +To install a plugin, patch argocd-repo-server to run the plugin container as a sidecar, with argocd-cmp-server as its entrypoint. You can use either off-the-shelf or custom-built plugin image as sidecar image. For example: ```yaml containers: -- name: cmp +- name: my-plugin command: [/var/run/argocd/argocd-cmp-server] # Entrypoint should be Argo CD lightweight CMP server i.e. argocd-cmp-server image: busybox # This can be off-the-shelf or custom-built image securityContext: @@ -148,17 +223,17 @@ containers: # Remove this volumeMount if you've chosen to bake the config file into the sidecar image. - mountPath: /home/argocd/cmp-server/config/plugin.yaml subPath: plugin.yaml - name: cmp-plugin + name: my-plugin-config # Starting with v2.4, do NOT mount the same tmp volume as the repo-server container. The filesystem separation helps # mitigate path traversal attacks. - mountPath: /tmp name: cmp-tmp volumes: - - configMap: - name: cmp-plugin - name: cmp-plugin - - emptyDir: {} - name: cmp-tmp +- configMap: + name: my-plugin-config + name: my-plugin-config +- emptyDir: {} + name: cmp-tmp ``` !!! important "Double-check these items" @@ -166,15 +241,17 @@ volumes: 2. Make sure that sidecar container is running as user 999. 3. Make sure that plugin configuration file is present at `/home/argocd/cmp-server/config/plugin.yaml`. It can either be volume mapped via configmap or baked into image. -### Environment +### Using environment variables in your plugin -CMP commands have access to +Plugin commands have access to 1. The system environment variables (of the repo-server container for argocd-cm plugins or of the sidecar for sidecar plugins) -2. [Standard build environment](build-environment.md) -3. Variables in the application spec (References to system and build variables will get interpolated in the variables' values): +2. [Standard build environment variables](build-environment.md) +3. Variables in the Application spec (References to system and build variables will get interpolated in the variables' values): ```yaml +apiVersion: argoproj.io/v1alpha1 +kind: Application spec: source: plugin: @@ -186,7 +263,7 @@ spec: ``` !!! note - The `discover.command` command only has access to the above environment starting with v2.4. +The `discover.command` command only has access to the above environment starting with v2.4. Before reaching the `init.command`, `generate.command`, and `discover.command` commands, Argo CD prefixes all user-supplied environment variables (#3 above) with `ARGOCD_ENV_`. This prevents users from directly setting @@ -196,7 +273,59 @@ If your plugin was written before 2.4 and depends on user-supplied environment v your plugin's behavior to work with 2.4. If you use a third-party plugin, make sure they explicitly advertise support for 2.4. -## Using a CMP +4. (Starting in v2.4) Parameters in the Application spec: + + ```yaml + apiVersion: argoproj.io/v1alpha1 + kind: Application + spec: + source: + plugin: + parameters: + - name: values-files + array: [values-dev.yaml] + - name: helm-parameters + map: + image.tag: v1.2.3 + ``` + + The parameters are available as JSON in the `ARGOCD_APP_PARAMETERS` environment variable. The example above would + produce this JSON: + + ```json + [{"name": "values-files", "array": ["values-dev.yaml"]}, {"name": "helm-parameters", "map": {"image.tag": "v1.2.3"}}] + ``` + + !!! note + Parameter announcements, even if they specify defaults, are _not_ sent to the plugin in `ARGOCD_APP_PARAMETERS`. + Only parameters explicitly set in the Application spec are sent to the plugin. It is up to the plugin to apply + the same defaults as the ones announced to the UI. + + The same parameters are also available as individual environment variables. The names of the environment variables + follows this convention: + + ```yaml + - name: some-string-param + string: some-string-value + # PARAM_SOME_STRING_PARAM=some-string-value + + - name: some-array-param + value: [item1, item2] + # PARAM_SOME_ARRAY_PARAM_0=item1 + # PARAM_SOME_ARRAY_PARAM_1=item2 + + - name: some-map-param + map: + image.tag: v1.2.3 + # PARAM_SOME_MAP_PARAM_IMAGE_TAG=v1.2.3 + ``` + +!!! warning Sanitize/escape user input +As part of Argo CD's manifest generation system, config management plugins are treated with a level of trust. Be +sure to escape user input in your plugin to prevent malicious input from causing unwanted behavior. + + +## Using a config management plugin with an Application If your CMP is defined in the `argocd-cm` ConfigMap, you can create a new Application using the CLI. Replace `` with the name configured in `argocd-cm`. @@ -205,7 +334,7 @@ If your CMP is defined in the `argocd-cm` ConfigMap, you can create a new Applic argocd app create --config-management-plugin ``` -If your CMP is defined as a sidecar, you must manually define the Application manifest. Do not configure a `name` field +If your plugin is defined as a sidecar, you must manually define the Application manifest. Do not configure a `name` field in the `plugin` section. The plugin will be automatically matched with the Application based on its discovery rules. ```yaml @@ -272,4 +401,86 @@ You can set it one of three ways: 3. Directly setting `ARGOCD_REPO_SERVER_PLUGIN_TAR_EXCLUSIONS` environment variable on the repo server. For option 1, the flag can be repeated multiple times. For option 2 and 3, you can specify multiple globs by separating -them with semicolons. \ No newline at end of file +them with semicolons. + +## Migrating from argocd-cm plugins + +Installing plugins by modifying the argocd-cm ConfigMap is deprecated as of v2.4. Support will be completely removed in +a future release. + +The following will show how to convert an argocd-cm plugin to a sidecar plugin. + +### 1. Convert the ConfigMap entry into a config file + +First, copy the plugin's configuration into its own YAML file. Take for example the following ConfigMap entry: + +```yaml +data: + configManagementPlugins: | + - name: pluginName + init: # Optional command to initialize application source directory + command: ["sample command"] + args: ["sample args"] + generate: # Command to generate manifests YAML + command: ["sample command"] + args: ["sample args"] + lockRepo: true # Defaults to false. See below. +``` + +The `pluginName` item would be converted to a config file like this: + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: ConfigManagementPlugin +metadata: + name: pluginName +spec: + init: # Optional command to initialize application source directory + command: ["sample command"] + args: ["sample args"] + generate: # Command to generate manifests YAML + command: ["sample command"] + args: ["sample args"] +``` + +!!!note +The `lockRepo` key is not relevant for sidecar plugins, because sidecar plugins do not share a single source repo +directory when generating manifests. + +### 2. Write discovery rules for your plugin + +Sidecar plugins use discovery rules instead of a plugin name to match Applications to plugins. + +Write rules applicable to your plugin [using the instructions above](#1-write-the-plugin-configuration-file) and add +them to your configuration file. + +!!!important +After installing your sidecar plugin, you'll need to remove the `name` field from the plugin config in your +Application specs. For example: + + ```yaml + apiVersion: argoproj.io/v1alpha1 + kind: Application + metadata: + name: guestbook + spec: + source: + plugin: + name: pluginName # Delete this (and set `plugin: {}` if `name` was the only value). + ``` + +### 3. Make sure the plugin has access to the tools it needs + +Plugins configured with argocd-cm ran on the Argo CD image. This gave it access to all the tools installed on that +image by default (see the [Dockerfile](https://github.com/argoproj/argo-cd/blob/master/Dockerfile) for base image and +installed tools). + +You can either use a stock image (like busybox) or design your own base image with the tools your plugin needs. For +security, avoid using image with more binaries installed than what your plugin actually needs. + +### 4. Test the plugin + +After installing the plugin as a sidecar [according to the directions above](#installing-a-config-management-plugin), +test it out on a few Applications before migrating all of them to the sidecar plugin. + +Once tests have checked out, remove the plugin entry from your argocd-cm ConfigMap. diff --git a/examples/plugins/helm/README.md b/examples/plugins/helm/README.md new file mode 100644 index 0000000000000..107d0da6808d7 --- /dev/null +++ b/examples/plugins/helm/README.md @@ -0,0 +1,10 @@ +# Simple Helm plugin + +The directory path to the shell scripts will need to be updated based on how you mount them +into the sidecar. + +## Installation + +```shell +kustomize build examples/plugins/helm/ | kubectl apply -n argocd -f - +``` diff --git a/examples/plugins/helm/argocd-repo-server-deployment-patch.yaml b/examples/plugins/helm/argocd-repo-server-deployment-patch.yaml new file mode 100644 index 0000000000000..aa50ec2181a9f --- /dev/null +++ b/examples/plugins/helm/argocd-repo-server-deployment-patch.yaml @@ -0,0 +1,54 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: argocd-repo-server +spec: + template: + spec: + initContainers: + - name: helm-plugin-setup + image: busybox + command: + - sh + - -c + - | + wget https://get.helm.sh/helm-v3.8.2-linux-amd64.tar.gz -O - | tar xz && mv linux-amd64/helm /tools/helm && chmod +x /tools/helm + wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 -O /tools/jq && chmod +x /tools/jq + wget https://github.com/mikefarah/yq/releases/download/v4.24.5/yq_linux_amd64 -O /tools/yq && chmod +x /tools/yq + volumeMounts: + - mountPath: /tools + name: helm-plugin-tools + containers: + - name: helm-plugin + command: [/var/run/argocd/argocd-cmp-server] + args: [--loglevel, debug] + image: busybox + securityContext: + runAsNonRoot: true + runAsUser: 999 + volumeMounts: + - mountPath: /var/run/argocd + name: var-files + - mountPath: /home/argocd/cmp-server/plugins + name: plugins + - mountPath: /helm-working-dir + name: helm-plugin-tmp + - mountPath: /home/argocd/cmp-server/config/plugin.yaml + subPath: plugin.yaml + name: helm-plugin-config + - mountPath: /var/run/argocd/helm-plugin/generate.sh + subPath: generate.sh + name: helm-plugin-config + - mountPath: /var/run/argocd/helm-plugin/get-parameters.sh + subPath: generate.sh + name: helm-plugin-config + - mountPath: /usr/local/bin + name: helm-plugin-tools + volumes: + - configMap: + name: helm-plugin-config + name: helm-plugin-config + - emptyDir: {} + name: helm-plugin-tmp + - emptyDir: {} + name: helm-plugin-tools diff --git a/examples/plugins/helm/generate.sh b/examples/plugins/helm/generate.sh new file mode 100755 index 0000000000000..c382b78b1c6ad --- /dev/null +++ b/examples/plugins/helm/generate.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +ARGUMENTS=$(echo "$ARGOCD_APP_PARAMETERS" | jq -r '.[] | select(.name == "values-files").array | .[] | "--values=" + .') +PARAMETERS=$(echo "$ARGOCD_APP_PARAMETERS" | jq -r '.[] | select(.name == "helm-parameters").map | to_entries | map("\(.key)=\(.value)") | .[] | "--set=" + .') + +echo ". $ARGUMENTS $PARAMETERS" | xargs helm template diff --git a/examples/plugins/helm/get-parameters.sh b/examples/plugins/helm/get-parameters.sh new file mode 100755 index 0000000000000..d89c29c46656e --- /dev/null +++ b/examples/plugins/helm/get-parameters.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +yq e -o=json values.yaml | jq '{ + name: "helm-parameters", + title: "Helm Parameters", + collectionType: "map", + map: [leaf_paths as $path | {"key": $path | join("."), "value": getpath($path)|tostring}] | from_entries +}' diff --git a/examples/plugins/helm/kustomization.yaml b/examples/plugins/helm/kustomization.yaml new file mode 100644 index 0000000000000..8b6e41b71c294 --- /dev/null +++ b/examples/plugins/helm/kustomization.yaml @@ -0,0 +1,15 @@ +bases: + - ../../../manifests/base + +configMapGenerator: + - name: helm-plugin-config + files: + - plugin.yaml + - generate.sh + - get-parameters.sh + +generatorOptions: + disableNameSuffixHash: true + +patchesStrategicMerge: + - argocd-repo-server-deployment-patch.yaml diff --git a/examples/plugins/helm/plugin.yaml b/examples/plugins/helm/plugin.yaml new file mode 100644 index 0000000000000..a45d2d0d4dd9b --- /dev/null +++ b/examples/plugins/helm/plugin.yaml @@ -0,0 +1,17 @@ +apiVersion: argoproj.io/v1alpha1 +kind: ConfigManagementPlugin +metadata: + name: simple-helm-cmp +spec: + version: v1.0 + generate: + command: [sh, /var/run/argocd/helm-plugin/generate.sh] + discover: + fileName: "./values.yaml" + parameters: + static: + - name: values-files + title: VALUES FILES + collectionType: array + dynamic: + command: [sh, /var/run/argocd/helm-plugin/get-parameters.sh] diff --git a/hack/generate-proto.sh b/hack/generate-proto.sh index 3627a297fd879..cdd3cf2837214 100755 --- a/hack/generate-proto.sh +++ b/hack/generate-proto.sh @@ -125,7 +125,7 @@ clean_swagger() { } echo "If additional types are added, the number of expected collisions may need to be increased" -EXPECTED_COLLISION_COUNT=91 +EXPECTED_COLLISION_COUNT=93 collect_swagger server ${EXPECTED_COLLISION_COUNT} clean_swagger server clean_swagger reposerver diff --git a/manifests/core-install.yaml b/manifests/core-install.yaml index d5f9183dcdbd1..15c66bb3a0e55 100644 --- a/manifests/core-install.yaml +++ b/manifests/core-install.yaml @@ -359,6 +359,29 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type + parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string type + parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git or @@ -704,6 +727,27 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git or Helm) @@ -1073,6 +1117,29 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type + parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git or @@ -1446,6 +1513,31 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying + a parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository @@ -1790,6 +1882,31 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying a + parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git @@ -2131,6 +2248,31 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying a + parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git @@ -2441,6 +2583,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -2739,6 +2898,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -3039,6 +3215,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -3315,6 +3508,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -3621,6 +3831,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -3919,6 +4146,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -4219,6 +4463,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -4495,6 +4756,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -4889,6 +5167,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -5330,6 +5625,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -5622,6 +5934,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -5928,6 +6257,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -6226,6 +6572,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -6526,6 +6889,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -6802,6 +7182,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -7196,6 +7593,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -7637,6 +8051,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -7933,6 +8364,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -8324,6 +8772,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -8765,6 +9230,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -9064,6 +9546,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string diff --git a/manifests/crds/application-crd.yaml b/manifests/crds/application-crd.yaml index 175ec3ea82998..16744f696500e 100644 --- a/manifests/crds/application-crd.yaml +++ b/manifests/crds/application-crd.yaml @@ -358,6 +358,29 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type + parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string type + parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git or @@ -703,6 +726,27 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git or Helm) @@ -1072,6 +1116,29 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type + parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git or @@ -1445,6 +1512,31 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying + a parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository @@ -1789,6 +1881,31 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying a + parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git @@ -2130,6 +2247,31 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying a + parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git diff --git a/manifests/crds/applicationset-crd.yaml b/manifests/crds/applicationset-crd.yaml index 726bafc2afda5..a17c19c262032 100644 --- a/manifests/crds/applicationset-crd.yaml +++ b/manifests/crds/applicationset-crd.yaml @@ -270,6 +270,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -568,6 +585,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -868,6 +902,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -1144,6 +1195,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -1450,6 +1518,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -1748,6 +1833,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -2048,6 +2150,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -2324,6 +2443,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -2718,6 +2854,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -3159,6 +3312,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -3451,6 +3621,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -3757,6 +3944,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -4055,6 +4259,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -4355,6 +4576,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -4631,6 +4869,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -5025,6 +5280,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -5466,6 +5738,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -5762,6 +6051,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -6153,6 +6459,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -6594,6 +6917,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -6893,6 +7233,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index 441bd240b9bbb..f99f2ea32abd9 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -359,6 +359,29 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type + parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string type + parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git or @@ -704,6 +727,27 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git or Helm) @@ -1073,6 +1117,29 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type + parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git or @@ -1446,6 +1513,31 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying + a parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository @@ -1790,6 +1882,31 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying a + parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git @@ -2131,6 +2248,31 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying a + parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git @@ -2441,6 +2583,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -2739,6 +2898,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -3039,6 +3215,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -3315,6 +3508,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -3621,6 +3831,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -3919,6 +4146,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -4219,6 +4463,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -4495,6 +4756,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -4889,6 +5167,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -5330,6 +5625,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -5622,6 +5934,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -5928,6 +6257,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -6226,6 +6572,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -6526,6 +6889,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -6802,6 +7182,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -7196,6 +7593,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -7637,6 +8051,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -7933,6 +8364,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -8324,6 +8772,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -8765,6 +9230,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -9064,6 +9546,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string diff --git a/manifests/install.yaml b/manifests/install.yaml index ad5db1a9dc18b..e373fc4ba007b 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -359,6 +359,29 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type + parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string type + parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git or @@ -704,6 +727,27 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git or Helm) @@ -1073,6 +1117,29 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type + parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git or @@ -1446,6 +1513,31 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying + a parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository @@ -1790,6 +1882,31 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying a + parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git @@ -2131,6 +2248,31 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying a + parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array type: object repoURL: description: RepoURL is the URL to the repository (Git @@ -2441,6 +2583,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -2739,6 +2898,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -3039,6 +3215,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -3315,6 +3508,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -3621,6 +3831,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -3919,6 +4146,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -4219,6 +4463,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -4495,6 +4756,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -4889,6 +5167,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -5330,6 +5625,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -5622,6 +5934,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -5928,6 +6257,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -6226,6 +6572,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -6526,6 +6889,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -6802,6 +7182,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -7196,6 +7593,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -7637,6 +8051,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -7933,6 +8364,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -8324,6 +8772,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -8765,6 +9230,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string @@ -9064,6 +9546,23 @@ spec: type: array name: type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array type: object repoURL: type: string diff --git a/pkg/apis/api-rules/violation_exceptions.list b/pkg/apis/api-rules/violation_exceptions.list index 1f625c07e730b..9cef442f99fa3 100644 --- a/pkg/apis/api-rules/violation_exceptions.list +++ b/pkg/apis/api-rules/violation_exceptions.list @@ -16,6 +16,7 @@ API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/ap API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSourceJsonnet,ExtVars API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSourceJsonnet,Libs API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSourceJsonnet,TLAs +API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSourcePluginParameter,Array API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSpec,IgnoreDifferences API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSpec,Info API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationStatus,Conditions @@ -78,6 +79,7 @@ API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/ap API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,TLSClientConfig,KeyData API rule violation: list_type_missing,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,rawResourceOverride,KnownTypeFields API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSourceJsonnet,TLAs +API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ApplicationSourcePluginParameter,String_ API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ClusterCacheInfo,APIsCount API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,ConnectionState,ModifiedAt API rule violation: names_match,github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1,HelmOptions,ValuesFileSchemes diff --git a/pkg/apis/application/v1alpha1/generated.pb.go b/pkg/apis/application/v1alpha1/generated.pb.go index 85b3ed8504857..dbe5fb8ea741f 100644 --- a/pkg/apis/application/v1alpha1/generated.pb.go +++ b/pkg/apis/application/v1alpha1/generated.pb.go @@ -765,10 +765,38 @@ func (m *ApplicationSourcePlugin) XXX_DiscardUnknown() { var xxx_messageInfo_ApplicationSourcePlugin proto.InternalMessageInfo +func (m *ApplicationSourcePluginParameter) Reset() { *m = ApplicationSourcePluginParameter{} } +func (*ApplicationSourcePluginParameter) ProtoMessage() {} +func (*ApplicationSourcePluginParameter) Descriptor() ([]byte, []int) { + return fileDescriptor_030104ce3b95bcac, []int{26} +} +func (m *ApplicationSourcePluginParameter) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplicationSourcePluginParameter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ApplicationSourcePluginParameter) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplicationSourcePluginParameter.Merge(m, src) +} +func (m *ApplicationSourcePluginParameter) XXX_Size() int { + return m.Size() +} +func (m *ApplicationSourcePluginParameter) XXX_DiscardUnknown() { + xxx_messageInfo_ApplicationSourcePluginParameter.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplicationSourcePluginParameter proto.InternalMessageInfo + func (m *ApplicationSpec) Reset() { *m = ApplicationSpec{} } func (*ApplicationSpec) ProtoMessage() {} func (*ApplicationSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{26} + return fileDescriptor_030104ce3b95bcac, []int{27} } func (m *ApplicationSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -796,7 +824,7 @@ var xxx_messageInfo_ApplicationSpec proto.InternalMessageInfo func (m *ApplicationStatus) Reset() { *m = ApplicationStatus{} } func (*ApplicationStatus) ProtoMessage() {} func (*ApplicationStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{27} + return fileDescriptor_030104ce3b95bcac, []int{28} } func (m *ApplicationStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -824,7 +852,7 @@ var xxx_messageInfo_ApplicationStatus proto.InternalMessageInfo func (m *ApplicationSummary) Reset() { *m = ApplicationSummary{} } func (*ApplicationSummary) ProtoMessage() {} func (*ApplicationSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{28} + return fileDescriptor_030104ce3b95bcac, []int{29} } func (m *ApplicationSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -852,7 +880,7 @@ var xxx_messageInfo_ApplicationSummary proto.InternalMessageInfo func (m *ApplicationTree) Reset() { *m = ApplicationTree{} } func (*ApplicationTree) ProtoMessage() {} func (*ApplicationTree) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{29} + return fileDescriptor_030104ce3b95bcac, []int{30} } func (m *ApplicationTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -880,7 +908,7 @@ var xxx_messageInfo_ApplicationTree proto.InternalMessageInfo func (m *ApplicationWatchEvent) Reset() { *m = ApplicationWatchEvent{} } func (*ApplicationWatchEvent) ProtoMessage() {} func (*ApplicationWatchEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{30} + return fileDescriptor_030104ce3b95bcac, []int{31} } func (m *ApplicationWatchEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -908,7 +936,7 @@ var xxx_messageInfo_ApplicationWatchEvent proto.InternalMessageInfo func (m *Backoff) Reset() { *m = Backoff{} } func (*Backoff) ProtoMessage() {} func (*Backoff) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{31} + return fileDescriptor_030104ce3b95bcac, []int{32} } func (m *Backoff) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -936,7 +964,7 @@ var xxx_messageInfo_Backoff proto.InternalMessageInfo func (m *BasicAuthBitbucketServer) Reset() { *m = BasicAuthBitbucketServer{} } func (*BasicAuthBitbucketServer) ProtoMessage() {} func (*BasicAuthBitbucketServer) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{32} + return fileDescriptor_030104ce3b95bcac, []int{33} } func (m *BasicAuthBitbucketServer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -964,7 +992,7 @@ var xxx_messageInfo_BasicAuthBitbucketServer proto.InternalMessageInfo func (m *Cluster) Reset() { *m = Cluster{} } func (*Cluster) ProtoMessage() {} func (*Cluster) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{33} + return fileDescriptor_030104ce3b95bcac, []int{34} } func (m *Cluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -992,7 +1020,7 @@ var xxx_messageInfo_Cluster proto.InternalMessageInfo func (m *ClusterCacheInfo) Reset() { *m = ClusterCacheInfo{} } func (*ClusterCacheInfo) ProtoMessage() {} func (*ClusterCacheInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{34} + return fileDescriptor_030104ce3b95bcac, []int{35} } func (m *ClusterCacheInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1020,7 +1048,7 @@ var xxx_messageInfo_ClusterCacheInfo proto.InternalMessageInfo func (m *ClusterConfig) Reset() { *m = ClusterConfig{} } func (*ClusterConfig) ProtoMessage() {} func (*ClusterConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{35} + return fileDescriptor_030104ce3b95bcac, []int{36} } func (m *ClusterConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1048,7 +1076,7 @@ var xxx_messageInfo_ClusterConfig proto.InternalMessageInfo func (m *ClusterGenerator) Reset() { *m = ClusterGenerator{} } func (*ClusterGenerator) ProtoMessage() {} func (*ClusterGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{36} + return fileDescriptor_030104ce3b95bcac, []int{37} } func (m *ClusterGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1076,7 +1104,7 @@ var xxx_messageInfo_ClusterGenerator proto.InternalMessageInfo func (m *ClusterInfo) Reset() { *m = ClusterInfo{} } func (*ClusterInfo) ProtoMessage() {} func (*ClusterInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{37} + return fileDescriptor_030104ce3b95bcac, []int{38} } func (m *ClusterInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1104,7 +1132,7 @@ var xxx_messageInfo_ClusterInfo proto.InternalMessageInfo func (m *ClusterList) Reset() { *m = ClusterList{} } func (*ClusterList) ProtoMessage() {} func (*ClusterList) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{38} + return fileDescriptor_030104ce3b95bcac, []int{39} } func (m *ClusterList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1132,7 +1160,7 @@ var xxx_messageInfo_ClusterList proto.InternalMessageInfo func (m *Command) Reset() { *m = Command{} } func (*Command) ProtoMessage() {} func (*Command) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{39} + return fileDescriptor_030104ce3b95bcac, []int{40} } func (m *Command) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1160,7 +1188,7 @@ var xxx_messageInfo_Command proto.InternalMessageInfo func (m *ComparedTo) Reset() { *m = ComparedTo{} } func (*ComparedTo) ProtoMessage() {} func (*ComparedTo) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{40} + return fileDescriptor_030104ce3b95bcac, []int{41} } func (m *ComparedTo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1188,7 +1216,7 @@ var xxx_messageInfo_ComparedTo proto.InternalMessageInfo func (m *ComponentParameter) Reset() { *m = ComponentParameter{} } func (*ComponentParameter) ProtoMessage() {} func (*ComponentParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{41} + return fileDescriptor_030104ce3b95bcac, []int{42} } func (m *ComponentParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1216,7 +1244,7 @@ var xxx_messageInfo_ComponentParameter proto.InternalMessageInfo func (m *ConfigManagementPlugin) Reset() { *m = ConfigManagementPlugin{} } func (*ConfigManagementPlugin) ProtoMessage() {} func (*ConfigManagementPlugin) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{42} + return fileDescriptor_030104ce3b95bcac, []int{43} } func (m *ConfigManagementPlugin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1244,7 +1272,7 @@ var xxx_messageInfo_ConfigManagementPlugin proto.InternalMessageInfo func (m *ConnectionState) Reset() { *m = ConnectionState{} } func (*ConnectionState) ProtoMessage() {} func (*ConnectionState) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{43} + return fileDescriptor_030104ce3b95bcac, []int{44} } func (m *ConnectionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1272,7 +1300,7 @@ var xxx_messageInfo_ConnectionState proto.InternalMessageInfo func (m *DuckTypeGenerator) Reset() { *m = DuckTypeGenerator{} } func (*DuckTypeGenerator) ProtoMessage() {} func (*DuckTypeGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{44} + return fileDescriptor_030104ce3b95bcac, []int{45} } func (m *DuckTypeGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1300,7 +1328,7 @@ var xxx_messageInfo_DuckTypeGenerator proto.InternalMessageInfo func (m *EnvEntry) Reset() { *m = EnvEntry{} } func (*EnvEntry) ProtoMessage() {} func (*EnvEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{45} + return fileDescriptor_030104ce3b95bcac, []int{46} } func (m *EnvEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1328,7 +1356,7 @@ var xxx_messageInfo_EnvEntry proto.InternalMessageInfo func (m *ExecProviderConfig) Reset() { *m = ExecProviderConfig{} } func (*ExecProviderConfig) ProtoMessage() {} func (*ExecProviderConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{46} + return fileDescriptor_030104ce3b95bcac, []int{47} } func (m *ExecProviderConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1356,7 +1384,7 @@ var xxx_messageInfo_ExecProviderConfig proto.InternalMessageInfo func (m *GitDirectoryGeneratorItem) Reset() { *m = GitDirectoryGeneratorItem{} } func (*GitDirectoryGeneratorItem) ProtoMessage() {} func (*GitDirectoryGeneratorItem) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{47} + return fileDescriptor_030104ce3b95bcac, []int{48} } func (m *GitDirectoryGeneratorItem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1384,7 +1412,7 @@ var xxx_messageInfo_GitDirectoryGeneratorItem proto.InternalMessageInfo func (m *GitFileGeneratorItem) Reset() { *m = GitFileGeneratorItem{} } func (*GitFileGeneratorItem) ProtoMessage() {} func (*GitFileGeneratorItem) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{48} + return fileDescriptor_030104ce3b95bcac, []int{49} } func (m *GitFileGeneratorItem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1412,7 +1440,7 @@ var xxx_messageInfo_GitFileGeneratorItem proto.InternalMessageInfo func (m *GitGenerator) Reset() { *m = GitGenerator{} } func (*GitGenerator) ProtoMessage() {} func (*GitGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{49} + return fileDescriptor_030104ce3b95bcac, []int{50} } func (m *GitGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1440,7 +1468,7 @@ var xxx_messageInfo_GitGenerator proto.InternalMessageInfo func (m *GnuPGPublicKey) Reset() { *m = GnuPGPublicKey{} } func (*GnuPGPublicKey) ProtoMessage() {} func (*GnuPGPublicKey) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{50} + return fileDescriptor_030104ce3b95bcac, []int{51} } func (m *GnuPGPublicKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1468,7 +1496,7 @@ var xxx_messageInfo_GnuPGPublicKey proto.InternalMessageInfo func (m *GnuPGPublicKeyList) Reset() { *m = GnuPGPublicKeyList{} } func (*GnuPGPublicKeyList) ProtoMessage() {} func (*GnuPGPublicKeyList) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{51} + return fileDescriptor_030104ce3b95bcac, []int{52} } func (m *GnuPGPublicKeyList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1496,7 +1524,7 @@ var xxx_messageInfo_GnuPGPublicKeyList proto.InternalMessageInfo func (m *HealthStatus) Reset() { *m = HealthStatus{} } func (*HealthStatus) ProtoMessage() {} func (*HealthStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{52} + return fileDescriptor_030104ce3b95bcac, []int{53} } func (m *HealthStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1524,7 +1552,7 @@ var xxx_messageInfo_HealthStatus proto.InternalMessageInfo func (m *HelmFileParameter) Reset() { *m = HelmFileParameter{} } func (*HelmFileParameter) ProtoMessage() {} func (*HelmFileParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{53} + return fileDescriptor_030104ce3b95bcac, []int{54} } func (m *HelmFileParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1552,7 +1580,7 @@ var xxx_messageInfo_HelmFileParameter proto.InternalMessageInfo func (m *HelmOptions) Reset() { *m = HelmOptions{} } func (*HelmOptions) ProtoMessage() {} func (*HelmOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{54} + return fileDescriptor_030104ce3b95bcac, []int{55} } func (m *HelmOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1580,7 +1608,7 @@ var xxx_messageInfo_HelmOptions proto.InternalMessageInfo func (m *HelmParameter) Reset() { *m = HelmParameter{} } func (*HelmParameter) ProtoMessage() {} func (*HelmParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{55} + return fileDescriptor_030104ce3b95bcac, []int{56} } func (m *HelmParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1608,7 +1636,7 @@ var xxx_messageInfo_HelmParameter proto.InternalMessageInfo func (m *HostInfo) Reset() { *m = HostInfo{} } func (*HostInfo) ProtoMessage() {} func (*HostInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{56} + return fileDescriptor_030104ce3b95bcac, []int{57} } func (m *HostInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1636,7 +1664,7 @@ var xxx_messageInfo_HostInfo proto.InternalMessageInfo func (m *HostResourceInfo) Reset() { *m = HostResourceInfo{} } func (*HostResourceInfo) ProtoMessage() {} func (*HostResourceInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{57} + return fileDescriptor_030104ce3b95bcac, []int{58} } func (m *HostResourceInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1664,7 +1692,7 @@ var xxx_messageInfo_HostResourceInfo proto.InternalMessageInfo func (m *Info) Reset() { *m = Info{} } func (*Info) ProtoMessage() {} func (*Info) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{58} + return fileDescriptor_030104ce3b95bcac, []int{59} } func (m *Info) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1692,7 +1720,7 @@ var xxx_messageInfo_Info proto.InternalMessageInfo func (m *InfoItem) Reset() { *m = InfoItem{} } func (*InfoItem) ProtoMessage() {} func (*InfoItem) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{59} + return fileDescriptor_030104ce3b95bcac, []int{60} } func (m *InfoItem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1720,7 +1748,7 @@ var xxx_messageInfo_InfoItem proto.InternalMessageInfo func (m *JWTToken) Reset() { *m = JWTToken{} } func (*JWTToken) ProtoMessage() {} func (*JWTToken) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{60} + return fileDescriptor_030104ce3b95bcac, []int{61} } func (m *JWTToken) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1748,7 +1776,7 @@ var xxx_messageInfo_JWTToken proto.InternalMessageInfo func (m *JWTTokens) Reset() { *m = JWTTokens{} } func (*JWTTokens) ProtoMessage() {} func (*JWTTokens) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{61} + return fileDescriptor_030104ce3b95bcac, []int{62} } func (m *JWTTokens) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1776,7 +1804,7 @@ var xxx_messageInfo_JWTTokens proto.InternalMessageInfo func (m *JsonnetVar) Reset() { *m = JsonnetVar{} } func (*JsonnetVar) ProtoMessage() {} func (*JsonnetVar) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{62} + return fileDescriptor_030104ce3b95bcac, []int{63} } func (m *JsonnetVar) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1804,7 +1832,7 @@ var xxx_messageInfo_JsonnetVar proto.InternalMessageInfo func (m *KnownTypeField) Reset() { *m = KnownTypeField{} } func (*KnownTypeField) ProtoMessage() {} func (*KnownTypeField) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{63} + return fileDescriptor_030104ce3b95bcac, []int{64} } func (m *KnownTypeField) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1832,7 +1860,7 @@ var xxx_messageInfo_KnownTypeField proto.InternalMessageInfo func (m *KustomizeOptions) Reset() { *m = KustomizeOptions{} } func (*KustomizeOptions) ProtoMessage() {} func (*KustomizeOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{64} + return fileDescriptor_030104ce3b95bcac, []int{65} } func (m *KustomizeOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1860,7 +1888,7 @@ var xxx_messageInfo_KustomizeOptions proto.InternalMessageInfo func (m *ListGenerator) Reset() { *m = ListGenerator{} } func (*ListGenerator) ProtoMessage() {} func (*ListGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{65} + return fileDescriptor_030104ce3b95bcac, []int{66} } func (m *ListGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1888,7 +1916,7 @@ var xxx_messageInfo_ListGenerator proto.InternalMessageInfo func (m *ManagedNamespaceMetadata) Reset() { *m = ManagedNamespaceMetadata{} } func (*ManagedNamespaceMetadata) ProtoMessage() {} func (*ManagedNamespaceMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{66} + return fileDescriptor_030104ce3b95bcac, []int{67} } func (m *ManagedNamespaceMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1916,7 +1944,7 @@ var xxx_messageInfo_ManagedNamespaceMetadata proto.InternalMessageInfo func (m *MatrixGenerator) Reset() { *m = MatrixGenerator{} } func (*MatrixGenerator) ProtoMessage() {} func (*MatrixGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{67} + return fileDescriptor_030104ce3b95bcac, []int{68} } func (m *MatrixGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1944,7 +1972,7 @@ var xxx_messageInfo_MatrixGenerator proto.InternalMessageInfo func (m *MergeGenerator) Reset() { *m = MergeGenerator{} } func (*MergeGenerator) ProtoMessage() {} func (*MergeGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{68} + return fileDescriptor_030104ce3b95bcac, []int{69} } func (m *MergeGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1972,7 +2000,7 @@ var xxx_messageInfo_MergeGenerator proto.InternalMessageInfo func (m *NestedMatrixGenerator) Reset() { *m = NestedMatrixGenerator{} } func (*NestedMatrixGenerator) ProtoMessage() {} func (*NestedMatrixGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{69} + return fileDescriptor_030104ce3b95bcac, []int{70} } func (m *NestedMatrixGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2000,7 +2028,7 @@ var xxx_messageInfo_NestedMatrixGenerator proto.InternalMessageInfo func (m *NestedMergeGenerator) Reset() { *m = NestedMergeGenerator{} } func (*NestedMergeGenerator) ProtoMessage() {} func (*NestedMergeGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{70} + return fileDescriptor_030104ce3b95bcac, []int{71} } func (m *NestedMergeGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2028,7 +2056,7 @@ var xxx_messageInfo_NestedMergeGenerator proto.InternalMessageInfo func (m *Operation) Reset() { *m = Operation{} } func (*Operation) ProtoMessage() {} func (*Operation) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{71} + return fileDescriptor_030104ce3b95bcac, []int{72} } func (m *Operation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2056,7 +2084,7 @@ var xxx_messageInfo_Operation proto.InternalMessageInfo func (m *OperationInitiator) Reset() { *m = OperationInitiator{} } func (*OperationInitiator) ProtoMessage() {} func (*OperationInitiator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{72} + return fileDescriptor_030104ce3b95bcac, []int{73} } func (m *OperationInitiator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2084,7 +2112,7 @@ var xxx_messageInfo_OperationInitiator proto.InternalMessageInfo func (m *OperationState) Reset() { *m = OperationState{} } func (*OperationState) ProtoMessage() {} func (*OperationState) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{73} + return fileDescriptor_030104ce3b95bcac, []int{74} } func (m *OperationState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2112,7 +2140,7 @@ var xxx_messageInfo_OperationState proto.InternalMessageInfo func (m *OrphanedResourceKey) Reset() { *m = OrphanedResourceKey{} } func (*OrphanedResourceKey) ProtoMessage() {} func (*OrphanedResourceKey) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{74} + return fileDescriptor_030104ce3b95bcac, []int{75} } func (m *OrphanedResourceKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2140,7 +2168,7 @@ var xxx_messageInfo_OrphanedResourceKey proto.InternalMessageInfo func (m *OrphanedResourcesMonitorSettings) Reset() { *m = OrphanedResourcesMonitorSettings{} } func (*OrphanedResourcesMonitorSettings) ProtoMessage() {} func (*OrphanedResourcesMonitorSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{75} + return fileDescriptor_030104ce3b95bcac, []int{76} } func (m *OrphanedResourcesMonitorSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2168,7 +2196,7 @@ var xxx_messageInfo_OrphanedResourcesMonitorSettings proto.InternalMessageInfo func (m *OverrideIgnoreDiff) Reset() { *m = OverrideIgnoreDiff{} } func (*OverrideIgnoreDiff) ProtoMessage() {} func (*OverrideIgnoreDiff) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{76} + return fileDescriptor_030104ce3b95bcac, []int{77} } func (m *OverrideIgnoreDiff) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2196,7 +2224,7 @@ var xxx_messageInfo_OverrideIgnoreDiff proto.InternalMessageInfo func (m *ProjectRole) Reset() { *m = ProjectRole{} } func (*ProjectRole) ProtoMessage() {} func (*ProjectRole) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{77} + return fileDescriptor_030104ce3b95bcac, []int{78} } func (m *ProjectRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2224,7 +2252,7 @@ var xxx_messageInfo_ProjectRole proto.InternalMessageInfo func (m *PullRequestGenerator) Reset() { *m = PullRequestGenerator{} } func (*PullRequestGenerator) ProtoMessage() {} func (*PullRequestGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{78} + return fileDescriptor_030104ce3b95bcac, []int{79} } func (m *PullRequestGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2252,7 +2280,7 @@ var xxx_messageInfo_PullRequestGenerator proto.InternalMessageInfo func (m *PullRequestGeneratorBitbucketServer) Reset() { *m = PullRequestGeneratorBitbucketServer{} } func (*PullRequestGeneratorBitbucketServer) ProtoMessage() {} func (*PullRequestGeneratorBitbucketServer) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{79} + return fileDescriptor_030104ce3b95bcac, []int{80} } func (m *PullRequestGeneratorBitbucketServer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2280,7 +2308,7 @@ var xxx_messageInfo_PullRequestGeneratorBitbucketServer proto.InternalMessageInf func (m *PullRequestGeneratorFilter) Reset() { *m = PullRequestGeneratorFilter{} } func (*PullRequestGeneratorFilter) ProtoMessage() {} func (*PullRequestGeneratorFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{80} + return fileDescriptor_030104ce3b95bcac, []int{81} } func (m *PullRequestGeneratorFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2308,7 +2336,7 @@ var xxx_messageInfo_PullRequestGeneratorFilter proto.InternalMessageInfo func (m *PullRequestGeneratorGitLab) Reset() { *m = PullRequestGeneratorGitLab{} } func (*PullRequestGeneratorGitLab) ProtoMessage() {} func (*PullRequestGeneratorGitLab) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{81} + return fileDescriptor_030104ce3b95bcac, []int{82} } func (m *PullRequestGeneratorGitLab) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2336,7 +2364,7 @@ var xxx_messageInfo_PullRequestGeneratorGitLab proto.InternalMessageInfo func (m *PullRequestGeneratorGitea) Reset() { *m = PullRequestGeneratorGitea{} } func (*PullRequestGeneratorGitea) ProtoMessage() {} func (*PullRequestGeneratorGitea) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{82} + return fileDescriptor_030104ce3b95bcac, []int{83} } func (m *PullRequestGeneratorGitea) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2364,7 +2392,7 @@ var xxx_messageInfo_PullRequestGeneratorGitea proto.InternalMessageInfo func (m *PullRequestGeneratorGithub) Reset() { *m = PullRequestGeneratorGithub{} } func (*PullRequestGeneratorGithub) ProtoMessage() {} func (*PullRequestGeneratorGithub) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{83} + return fileDescriptor_030104ce3b95bcac, []int{84} } func (m *PullRequestGeneratorGithub) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2392,7 +2420,7 @@ var xxx_messageInfo_PullRequestGeneratorGithub proto.InternalMessageInfo func (m *RepoCreds) Reset() { *m = RepoCreds{} } func (*RepoCreds) ProtoMessage() {} func (*RepoCreds) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{84} + return fileDescriptor_030104ce3b95bcac, []int{85} } func (m *RepoCreds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2420,7 +2448,7 @@ var xxx_messageInfo_RepoCreds proto.InternalMessageInfo func (m *RepoCredsList) Reset() { *m = RepoCredsList{} } func (*RepoCredsList) ProtoMessage() {} func (*RepoCredsList) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{85} + return fileDescriptor_030104ce3b95bcac, []int{86} } func (m *RepoCredsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2448,7 +2476,7 @@ var xxx_messageInfo_RepoCredsList proto.InternalMessageInfo func (m *Repository) Reset() { *m = Repository{} } func (*Repository) ProtoMessage() {} func (*Repository) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{86} + return fileDescriptor_030104ce3b95bcac, []int{87} } func (m *Repository) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2476,7 +2504,7 @@ var xxx_messageInfo_Repository proto.InternalMessageInfo func (m *RepositoryCertificate) Reset() { *m = RepositoryCertificate{} } func (*RepositoryCertificate) ProtoMessage() {} func (*RepositoryCertificate) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{87} + return fileDescriptor_030104ce3b95bcac, []int{88} } func (m *RepositoryCertificate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2504,7 +2532,7 @@ var xxx_messageInfo_RepositoryCertificate proto.InternalMessageInfo func (m *RepositoryCertificateList) Reset() { *m = RepositoryCertificateList{} } func (*RepositoryCertificateList) ProtoMessage() {} func (*RepositoryCertificateList) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{88} + return fileDescriptor_030104ce3b95bcac, []int{89} } func (m *RepositoryCertificateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2532,7 +2560,7 @@ var xxx_messageInfo_RepositoryCertificateList proto.InternalMessageInfo func (m *RepositoryList) Reset() { *m = RepositoryList{} } func (*RepositoryList) ProtoMessage() {} func (*RepositoryList) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{89} + return fileDescriptor_030104ce3b95bcac, []int{90} } func (m *RepositoryList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2560,7 +2588,7 @@ var xxx_messageInfo_RepositoryList proto.InternalMessageInfo func (m *ResourceAction) Reset() { *m = ResourceAction{} } func (*ResourceAction) ProtoMessage() {} func (*ResourceAction) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{90} + return fileDescriptor_030104ce3b95bcac, []int{91} } func (m *ResourceAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2588,7 +2616,7 @@ var xxx_messageInfo_ResourceAction proto.InternalMessageInfo func (m *ResourceActionDefinition) Reset() { *m = ResourceActionDefinition{} } func (*ResourceActionDefinition) ProtoMessage() {} func (*ResourceActionDefinition) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{91} + return fileDescriptor_030104ce3b95bcac, []int{92} } func (m *ResourceActionDefinition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2616,7 +2644,7 @@ var xxx_messageInfo_ResourceActionDefinition proto.InternalMessageInfo func (m *ResourceActionParam) Reset() { *m = ResourceActionParam{} } func (*ResourceActionParam) ProtoMessage() {} func (*ResourceActionParam) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{92} + return fileDescriptor_030104ce3b95bcac, []int{93} } func (m *ResourceActionParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2644,7 +2672,7 @@ var xxx_messageInfo_ResourceActionParam proto.InternalMessageInfo func (m *ResourceActions) Reset() { *m = ResourceActions{} } func (*ResourceActions) ProtoMessage() {} func (*ResourceActions) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{93} + return fileDescriptor_030104ce3b95bcac, []int{94} } func (m *ResourceActions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2672,7 +2700,7 @@ var xxx_messageInfo_ResourceActions proto.InternalMessageInfo func (m *ResourceDiff) Reset() { *m = ResourceDiff{} } func (*ResourceDiff) ProtoMessage() {} func (*ResourceDiff) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{94} + return fileDescriptor_030104ce3b95bcac, []int{95} } func (m *ResourceDiff) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2700,7 +2728,7 @@ var xxx_messageInfo_ResourceDiff proto.InternalMessageInfo func (m *ResourceIgnoreDifferences) Reset() { *m = ResourceIgnoreDifferences{} } func (*ResourceIgnoreDifferences) ProtoMessage() {} func (*ResourceIgnoreDifferences) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{95} + return fileDescriptor_030104ce3b95bcac, []int{96} } func (m *ResourceIgnoreDifferences) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2728,7 +2756,7 @@ var xxx_messageInfo_ResourceIgnoreDifferences proto.InternalMessageInfo func (m *ResourceNetworkingInfo) Reset() { *m = ResourceNetworkingInfo{} } func (*ResourceNetworkingInfo) ProtoMessage() {} func (*ResourceNetworkingInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{96} + return fileDescriptor_030104ce3b95bcac, []int{97} } func (m *ResourceNetworkingInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2756,7 +2784,7 @@ var xxx_messageInfo_ResourceNetworkingInfo proto.InternalMessageInfo func (m *ResourceNode) Reset() { *m = ResourceNode{} } func (*ResourceNode) ProtoMessage() {} func (*ResourceNode) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{97} + return fileDescriptor_030104ce3b95bcac, []int{98} } func (m *ResourceNode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2784,7 +2812,7 @@ var xxx_messageInfo_ResourceNode proto.InternalMessageInfo func (m *ResourceOverride) Reset() { *m = ResourceOverride{} } func (*ResourceOverride) ProtoMessage() {} func (*ResourceOverride) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{98} + return fileDescriptor_030104ce3b95bcac, []int{99} } func (m *ResourceOverride) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2812,7 +2840,7 @@ var xxx_messageInfo_ResourceOverride proto.InternalMessageInfo func (m *ResourceRef) Reset() { *m = ResourceRef{} } func (*ResourceRef) ProtoMessage() {} func (*ResourceRef) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{99} + return fileDescriptor_030104ce3b95bcac, []int{100} } func (m *ResourceRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2840,7 +2868,7 @@ var xxx_messageInfo_ResourceRef proto.InternalMessageInfo func (m *ResourceResult) Reset() { *m = ResourceResult{} } func (*ResourceResult) ProtoMessage() {} func (*ResourceResult) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{100} + return fileDescriptor_030104ce3b95bcac, []int{101} } func (m *ResourceResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2868,7 +2896,7 @@ var xxx_messageInfo_ResourceResult proto.InternalMessageInfo func (m *ResourceStatus) Reset() { *m = ResourceStatus{} } func (*ResourceStatus) ProtoMessage() {} func (*ResourceStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{101} + return fileDescriptor_030104ce3b95bcac, []int{102} } func (m *ResourceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2896,7 +2924,7 @@ var xxx_messageInfo_ResourceStatus proto.InternalMessageInfo func (m *RetryStrategy) Reset() { *m = RetryStrategy{} } func (*RetryStrategy) ProtoMessage() {} func (*RetryStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{102} + return fileDescriptor_030104ce3b95bcac, []int{103} } func (m *RetryStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2924,7 +2952,7 @@ var xxx_messageInfo_RetryStrategy proto.InternalMessageInfo func (m *RevisionHistory) Reset() { *m = RevisionHistory{} } func (*RevisionHistory) ProtoMessage() {} func (*RevisionHistory) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{103} + return fileDescriptor_030104ce3b95bcac, []int{104} } func (m *RevisionHistory) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2952,7 +2980,7 @@ var xxx_messageInfo_RevisionHistory proto.InternalMessageInfo func (m *RevisionMetadata) Reset() { *m = RevisionMetadata{} } func (*RevisionMetadata) ProtoMessage() {} func (*RevisionMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{104} + return fileDescriptor_030104ce3b95bcac, []int{105} } func (m *RevisionMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2980,7 +3008,7 @@ var xxx_messageInfo_RevisionMetadata proto.InternalMessageInfo func (m *SCMProviderGenerator) Reset() { *m = SCMProviderGenerator{} } func (*SCMProviderGenerator) ProtoMessage() {} func (*SCMProviderGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{105} + return fileDescriptor_030104ce3b95bcac, []int{106} } func (m *SCMProviderGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3008,7 +3036,7 @@ var xxx_messageInfo_SCMProviderGenerator proto.InternalMessageInfo func (m *SCMProviderGeneratorAzureDevOps) Reset() { *m = SCMProviderGeneratorAzureDevOps{} } func (*SCMProviderGeneratorAzureDevOps) ProtoMessage() {} func (*SCMProviderGeneratorAzureDevOps) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{106} + return fileDescriptor_030104ce3b95bcac, []int{107} } func (m *SCMProviderGeneratorAzureDevOps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3036,7 +3064,7 @@ var xxx_messageInfo_SCMProviderGeneratorAzureDevOps proto.InternalMessageInfo func (m *SCMProviderGeneratorBitbucket) Reset() { *m = SCMProviderGeneratorBitbucket{} } func (*SCMProviderGeneratorBitbucket) ProtoMessage() {} func (*SCMProviderGeneratorBitbucket) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{107} + return fileDescriptor_030104ce3b95bcac, []int{108} } func (m *SCMProviderGeneratorBitbucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3064,7 +3092,7 @@ var xxx_messageInfo_SCMProviderGeneratorBitbucket proto.InternalMessageInfo func (m *SCMProviderGeneratorBitbucketServer) Reset() { *m = SCMProviderGeneratorBitbucketServer{} } func (*SCMProviderGeneratorBitbucketServer) ProtoMessage() {} func (*SCMProviderGeneratorBitbucketServer) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{108} + return fileDescriptor_030104ce3b95bcac, []int{109} } func (m *SCMProviderGeneratorBitbucketServer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3092,7 +3120,7 @@ var xxx_messageInfo_SCMProviderGeneratorBitbucketServer proto.InternalMessageInf func (m *SCMProviderGeneratorFilter) Reset() { *m = SCMProviderGeneratorFilter{} } func (*SCMProviderGeneratorFilter) ProtoMessage() {} func (*SCMProviderGeneratorFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{109} + return fileDescriptor_030104ce3b95bcac, []int{110} } func (m *SCMProviderGeneratorFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3120,7 +3148,7 @@ var xxx_messageInfo_SCMProviderGeneratorFilter proto.InternalMessageInfo func (m *SCMProviderGeneratorGitea) Reset() { *m = SCMProviderGeneratorGitea{} } func (*SCMProviderGeneratorGitea) ProtoMessage() {} func (*SCMProviderGeneratorGitea) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{110} + return fileDescriptor_030104ce3b95bcac, []int{111} } func (m *SCMProviderGeneratorGitea) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3148,7 +3176,7 @@ var xxx_messageInfo_SCMProviderGeneratorGitea proto.InternalMessageInfo func (m *SCMProviderGeneratorGithub) Reset() { *m = SCMProviderGeneratorGithub{} } func (*SCMProviderGeneratorGithub) ProtoMessage() {} func (*SCMProviderGeneratorGithub) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{111} + return fileDescriptor_030104ce3b95bcac, []int{112} } func (m *SCMProviderGeneratorGithub) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3176,7 +3204,7 @@ var xxx_messageInfo_SCMProviderGeneratorGithub proto.InternalMessageInfo func (m *SCMProviderGeneratorGitlab) Reset() { *m = SCMProviderGeneratorGitlab{} } func (*SCMProviderGeneratorGitlab) ProtoMessage() {} func (*SCMProviderGeneratorGitlab) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{112} + return fileDescriptor_030104ce3b95bcac, []int{113} } func (m *SCMProviderGeneratorGitlab) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3204,7 +3232,7 @@ var xxx_messageInfo_SCMProviderGeneratorGitlab proto.InternalMessageInfo func (m *SecretRef) Reset() { *m = SecretRef{} } func (*SecretRef) ProtoMessage() {} func (*SecretRef) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{113} + return fileDescriptor_030104ce3b95bcac, []int{114} } func (m *SecretRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3232,7 +3260,7 @@ var xxx_messageInfo_SecretRef proto.InternalMessageInfo func (m *SignatureKey) Reset() { *m = SignatureKey{} } func (*SignatureKey) ProtoMessage() {} func (*SignatureKey) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{114} + return fileDescriptor_030104ce3b95bcac, []int{115} } func (m *SignatureKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3260,7 +3288,7 @@ var xxx_messageInfo_SignatureKey proto.InternalMessageInfo func (m *SyncOperation) Reset() { *m = SyncOperation{} } func (*SyncOperation) ProtoMessage() {} func (*SyncOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{115} + return fileDescriptor_030104ce3b95bcac, []int{116} } func (m *SyncOperation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3288,7 +3316,7 @@ var xxx_messageInfo_SyncOperation proto.InternalMessageInfo func (m *SyncOperationResource) Reset() { *m = SyncOperationResource{} } func (*SyncOperationResource) ProtoMessage() {} func (*SyncOperationResource) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{116} + return fileDescriptor_030104ce3b95bcac, []int{117} } func (m *SyncOperationResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3316,7 +3344,7 @@ var xxx_messageInfo_SyncOperationResource proto.InternalMessageInfo func (m *SyncOperationResult) Reset() { *m = SyncOperationResult{} } func (*SyncOperationResult) ProtoMessage() {} func (*SyncOperationResult) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{117} + return fileDescriptor_030104ce3b95bcac, []int{118} } func (m *SyncOperationResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3344,7 +3372,7 @@ var xxx_messageInfo_SyncOperationResult proto.InternalMessageInfo func (m *SyncPolicy) Reset() { *m = SyncPolicy{} } func (*SyncPolicy) ProtoMessage() {} func (*SyncPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{118} + return fileDescriptor_030104ce3b95bcac, []int{119} } func (m *SyncPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3372,7 +3400,7 @@ var xxx_messageInfo_SyncPolicy proto.InternalMessageInfo func (m *SyncPolicyAutomated) Reset() { *m = SyncPolicyAutomated{} } func (*SyncPolicyAutomated) ProtoMessage() {} func (*SyncPolicyAutomated) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{119} + return fileDescriptor_030104ce3b95bcac, []int{120} } func (m *SyncPolicyAutomated) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3400,7 +3428,7 @@ var xxx_messageInfo_SyncPolicyAutomated proto.InternalMessageInfo func (m *SyncStatus) Reset() { *m = SyncStatus{} } func (*SyncStatus) ProtoMessage() {} func (*SyncStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{120} + return fileDescriptor_030104ce3b95bcac, []int{121} } func (m *SyncStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3428,7 +3456,7 @@ var xxx_messageInfo_SyncStatus proto.InternalMessageInfo func (m *SyncStrategy) Reset() { *m = SyncStrategy{} } func (*SyncStrategy) ProtoMessage() {} func (*SyncStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{121} + return fileDescriptor_030104ce3b95bcac, []int{122} } func (m *SyncStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3456,7 +3484,7 @@ var xxx_messageInfo_SyncStrategy proto.InternalMessageInfo func (m *SyncStrategyApply) Reset() { *m = SyncStrategyApply{} } func (*SyncStrategyApply) ProtoMessage() {} func (*SyncStrategyApply) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{122} + return fileDescriptor_030104ce3b95bcac, []int{123} } func (m *SyncStrategyApply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3484,7 +3512,7 @@ var xxx_messageInfo_SyncStrategyApply proto.InternalMessageInfo func (m *SyncStrategyHook) Reset() { *m = SyncStrategyHook{} } func (*SyncStrategyHook) ProtoMessage() {} func (*SyncStrategyHook) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{123} + return fileDescriptor_030104ce3b95bcac, []int{124} } func (m *SyncStrategyHook) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3512,7 +3540,7 @@ var xxx_messageInfo_SyncStrategyHook proto.InternalMessageInfo func (m *SyncWindow) Reset() { *m = SyncWindow{} } func (*SyncWindow) ProtoMessage() {} func (*SyncWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{124} + return fileDescriptor_030104ce3b95bcac, []int{125} } func (m *SyncWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3540,7 +3568,7 @@ var xxx_messageInfo_SyncWindow proto.InternalMessageInfo func (m *TLSClientConfig) Reset() { *m = TLSClientConfig{} } func (*TLSClientConfig) ProtoMessage() {} func (*TLSClientConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{125} + return fileDescriptor_030104ce3b95bcac, []int{126} } func (m *TLSClientConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3597,6 +3625,8 @@ func init() { proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSourceKustomize.CommonAnnotationsEntry") proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSourceKustomize.CommonLabelsEntry") proto.RegisterType((*ApplicationSourcePlugin)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSourcePlugin") + proto.RegisterType((*ApplicationSourcePluginParameter)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSourcePluginParameter") + proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSourcePluginParameter.MapEntry") proto.RegisterType((*ApplicationSpec)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSpec") proto.RegisterType((*ApplicationStatus)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationStatus") proto.RegisterType((*ApplicationSummary)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSummary") @@ -3713,572 +3743,578 @@ func init() { } var fileDescriptor_030104ce3b95bcac = []byte{ - // 9025 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xc9, - 0x75, 0x98, 0x7a, 0x86, 0x43, 0xce, 0x3c, 0x7e, 0xec, 0xb2, 0x76, 0xf7, 0x8e, 0xb7, 0x77, 0xb7, - 0x5c, 0xf4, 0xc1, 0xd2, 0x39, 0xba, 0x23, 0x73, 0xeb, 0x93, 0x72, 0xf1, 0xd9, 0x27, 0x73, 0xc8, - 0x5d, 0x2e, 0x77, 0xf9, 0x75, 0x45, 0xee, 0xae, 0x75, 0xb2, 0x3e, 0x9a, 0x3d, 0x35, 0xc3, 0x5e, - 0xf6, 0x74, 0xcf, 0x75, 0xf7, 0x70, 0x39, 0xe7, 0x2f, 0x49, 0xb6, 0x63, 0x25, 0xfa, 0x8c, 0x14, - 0x20, 0x32, 0x10, 0x38, 0x8a, 0x6c, 0x18, 0x31, 0x12, 0x21, 0xce, 0xaf, 0x7c, 0x21, 0x3f, 0x6c, - 0xe5, 0x87, 0x82, 0x04, 0x88, 0x80, 0x18, 0x96, 0x13, 0x27, 0xf4, 0x89, 0x41, 0xe0, 0xc4, 0x40, - 0x1c, 0xc4, 0xf1, 0x9f, 0x2c, 0xf2, 0xc3, 0xa8, 0xef, 0xea, 0x9e, 0x99, 0xe5, 0xcc, 0xb2, 0xb9, - 0xbb, 0x12, 0xee, 0xdf, 0xcc, 0x7b, 0xaf, 0xdf, 0x7b, 0x5d, 0x5d, 0xf5, 0xea, 0x55, 0xd5, 0x7b, - 0xaf, 0x60, 0xb5, 0xe1, 0x25, 0xbb, 0xed, 0x9d, 0x39, 0x37, 0x6c, 0xce, 0x3b, 0x51, 0x23, 0x6c, - 0x45, 0xe1, 0x5d, 0xf6, 0xe3, 0x65, 0xb7, 0x36, 0xbf, 0x7f, 0x65, 0xbe, 0xb5, 0xd7, 0x98, 0x77, - 0x5a, 0x5e, 0x3c, 0xef, 0xb4, 0x5a, 0xbe, 0xe7, 0x3a, 0x89, 0x17, 0x06, 0xf3, 0xfb, 0xaf, 0x38, - 0x7e, 0x6b, 0xd7, 0x79, 0x65, 0xbe, 0x41, 0x02, 0x12, 0x39, 0x09, 0xa9, 0xcd, 0xb5, 0xa2, 0x30, - 0x09, 0xd1, 0x4f, 0x68, 0x6e, 0x73, 0x92, 0x1b, 0xfb, 0xf1, 0x49, 0xb7, 0x36, 0xb7, 0x7f, 0x65, - 0xae, 0xb5, 0xd7, 0x98, 0xa3, 0xdc, 0xe6, 0x0c, 0x6e, 0x73, 0x92, 0xdb, 0xc5, 0x97, 0x0d, 0x5d, - 0x1a, 0x61, 0x23, 0x9c, 0x67, 0x4c, 0x77, 0xda, 0x75, 0xf6, 0x8f, 0xfd, 0x61, 0xbf, 0xb8, 0xb0, - 0x8b, 0xf6, 0xde, 0x6b, 0xf1, 0x9c, 0x17, 0x52, 0xf5, 0xe6, 0xdd, 0x30, 0x22, 0xf3, 0xfb, 0x5d, - 0x0a, 0x5d, 0xbc, 0xae, 0x69, 0xc8, 0x41, 0x42, 0x82, 0xd8, 0x0b, 0x83, 0xf8, 0x65, 0xaa, 0x02, - 0x89, 0xf6, 0x49, 0x64, 0xbe, 0x9e, 0x41, 0xd0, 0x8b, 0xd3, 0xab, 0x9a, 0x53, 0xd3, 0x71, 0x77, - 0xbd, 0x80, 0x44, 0x1d, 0xfd, 0x78, 0x93, 0x24, 0x4e, 0xaf, 0xa7, 0xe6, 0xfb, 0x3d, 0x15, 0xb5, - 0x83, 0xc4, 0x6b, 0x92, 0xae, 0x07, 0x3e, 0x7c, 0xdc, 0x03, 0xb1, 0xbb, 0x4b, 0x9a, 0x4e, 0xf6, - 0x39, 0xfb, 0x6d, 0x98, 0x5c, 0xb8, 0xb3, 0xb5, 0xd0, 0x4e, 0x76, 0x17, 0xc3, 0xa0, 0xee, 0x35, - 0xd0, 0x87, 0x60, 0xdc, 0xf5, 0xdb, 0x71, 0x42, 0xa2, 0x75, 0xa7, 0x49, 0x66, 0xac, 0xcb, 0xd6, - 0x8b, 0x95, 0xea, 0xb9, 0xef, 0x1c, 0xce, 0xbe, 0xef, 0xe8, 0x70, 0x76, 0x7c, 0x51, 0xa3, 0xb0, - 0x49, 0x87, 0x7e, 0x14, 0xc6, 0xa2, 0xd0, 0x27, 0x0b, 0x78, 0x7d, 0xa6, 0xc0, 0x1e, 0x39, 0x23, - 0x1e, 0x19, 0xc3, 0x1c, 0x8c, 0x25, 0xde, 0xfe, 0x83, 0x02, 0xc0, 0x42, 0xab, 0xb5, 0x19, 0x85, - 0x77, 0x89, 0x9b, 0xa0, 0x4f, 0x41, 0x99, 0xb6, 0x42, 0xcd, 0x49, 0x1c, 0x26, 0x6d, 0xfc, 0xca, - 0x5f, 0x9d, 0xe3, 0x2f, 0x33, 0x67, 0xbe, 0x8c, 0xee, 0x03, 0x94, 0x7a, 0x6e, 0xff, 0x95, 0xb9, - 0x8d, 0x1d, 0xfa, 0xfc, 0x1a, 0x49, 0x9c, 0x2a, 0x12, 0xc2, 0x40, 0xc3, 0xb0, 0xe2, 0x8a, 0x02, - 0x18, 0x89, 0x5b, 0xc4, 0x65, 0x8a, 0x8d, 0x5f, 0x59, 0x9d, 0x3b, 0x49, 0x67, 0x9b, 0xd3, 0x9a, - 0x6f, 0xb5, 0x88, 0x5b, 0x9d, 0x10, 0x92, 0x47, 0xe8, 0x3f, 0xcc, 0xe4, 0xa0, 0x7d, 0x18, 0x8d, - 0x13, 0x27, 0x69, 0xc7, 0x33, 0x45, 0x26, 0x71, 0x3d, 0x37, 0x89, 0x8c, 0x6b, 0x75, 0x4a, 0xc8, - 0x1c, 0xe5, 0xff, 0xb1, 0x90, 0x66, 0xff, 0x57, 0x0b, 0xa6, 0x34, 0xf1, 0xaa, 0x17, 0x27, 0xe8, - 0x67, 0xba, 0x1a, 0x77, 0x6e, 0xb0, 0xc6, 0xa5, 0x4f, 0xb3, 0xa6, 0x3d, 0x2b, 0x84, 0x95, 0x25, - 0xc4, 0x68, 0xd8, 0x26, 0x94, 0xbc, 0x84, 0x34, 0xe3, 0x99, 0xc2, 0xe5, 0xe2, 0x8b, 0xe3, 0x57, - 0xae, 0xe7, 0xf5, 0x9e, 0xd5, 0x49, 0x21, 0xb4, 0xb4, 0x42, 0xd9, 0x63, 0x2e, 0xc5, 0xfe, 0xed, - 0x09, 0xf3, 0xfd, 0x68, 0x83, 0xa3, 0x57, 0x60, 0x3c, 0x0e, 0xdb, 0x91, 0x4b, 0x30, 0x69, 0x85, - 0xf1, 0x8c, 0x75, 0xb9, 0x48, 0xbb, 0x1e, 0xed, 0xa9, 0x5b, 0x1a, 0x8c, 0x4d, 0x1a, 0xf4, 0x25, - 0x0b, 0x26, 0x6a, 0x24, 0x4e, 0xbc, 0x80, 0xc9, 0x97, 0xca, 0x6f, 0x9f, 0x58, 0x79, 0x09, 0x5c, - 0xd2, 0xcc, 0xab, 0xe7, 0xc5, 0x8b, 0x4c, 0x18, 0xc0, 0x18, 0xa7, 0xe4, 0xd3, 0x11, 0x57, 0x23, - 0xb1, 0x1b, 0x79, 0x2d, 0xfa, 0x9f, 0xf5, 0x19, 0x63, 0xc4, 0x2d, 0x69, 0x14, 0x36, 0xe9, 0x50, - 0x00, 0x25, 0x3a, 0xa2, 0xe2, 0x99, 0x11, 0xa6, 0xff, 0xca, 0xc9, 0xf4, 0x17, 0x8d, 0x4a, 0x07, - 0xab, 0x6e, 0x7d, 0xfa, 0x2f, 0xc6, 0x5c, 0x0c, 0xfa, 0xa2, 0x05, 0x33, 0x62, 0xc4, 0x63, 0xc2, - 0x1b, 0xf4, 0xce, 0xae, 0x97, 0x10, 0xdf, 0x8b, 0x93, 0x99, 0x12, 0xd3, 0x61, 0x7e, 0xb0, 0xbe, - 0xb5, 0x1c, 0x85, 0xed, 0xd6, 0x4d, 0x2f, 0xa8, 0x55, 0x2f, 0x0b, 0x49, 0x33, 0x8b, 0x7d, 0x18, - 0xe3, 0xbe, 0x22, 0xd1, 0xd7, 0x2c, 0xb8, 0x18, 0x38, 0x4d, 0x12, 0xb7, 0x1c, 0xfa, 0x69, 0x39, - 0xba, 0xea, 0x3b, 0xee, 0x1e, 0xd3, 0x68, 0xf4, 0xe1, 0x34, 0xb2, 0x85, 0x46, 0x17, 0xd7, 0xfb, - 0xb2, 0xc6, 0x0f, 0x10, 0x8b, 0x7e, 0xc3, 0x82, 0xe9, 0x30, 0x6a, 0xed, 0x3a, 0x01, 0xa9, 0x49, - 0x6c, 0x3c, 0x33, 0xc6, 0x86, 0xde, 0x27, 0x4e, 0xf6, 0x89, 0x36, 0xb2, 0x6c, 0xd7, 0xc2, 0xc0, - 0x4b, 0xc2, 0x68, 0x8b, 0x24, 0x89, 0x17, 0x34, 0xe2, 0xea, 0x85, 0xa3, 0xc3, 0xd9, 0xe9, 0x2e, - 0x2a, 0xdc, 0xad, 0x0f, 0xfa, 0x59, 0x18, 0x8f, 0x3b, 0x81, 0x7b, 0xc7, 0x0b, 0x6a, 0xe1, 0xbd, - 0x78, 0xa6, 0x9c, 0xc7, 0xf0, 0xdd, 0x52, 0x0c, 0xc5, 0x00, 0xd4, 0x02, 0xb0, 0x29, 0xad, 0xf7, - 0x87, 0xd3, 0x5d, 0xa9, 0x92, 0xf7, 0x87, 0xd3, 0x9d, 0xe9, 0x01, 0x62, 0xd1, 0xaf, 0x5a, 0x30, - 0x19, 0x7b, 0x8d, 0xc0, 0x49, 0xda, 0x11, 0xb9, 0x49, 0x3a, 0xf1, 0x0c, 0x30, 0x45, 0x6e, 0x9c, - 0xb0, 0x55, 0x0c, 0x96, 0xd5, 0x0b, 0x42, 0xc7, 0x49, 0x13, 0x1a, 0xe3, 0xb4, 0xdc, 0x5e, 0x03, - 0x4d, 0x77, 0xeb, 0xf1, 0x7c, 0x07, 0x9a, 0xee, 0xd4, 0x7d, 0x45, 0xa2, 0x9f, 0x82, 0xb3, 0x1c, - 0xa4, 0x5a, 0x36, 0x9e, 0x99, 0x60, 0x86, 0xf6, 0xfc, 0xd1, 0xe1, 0xec, 0xd9, 0xad, 0x0c, 0x0e, - 0x77, 0x51, 0xa3, 0xb7, 0x61, 0xb6, 0x45, 0xa2, 0xa6, 0x97, 0x6c, 0x04, 0x7e, 0x47, 0x9a, 0x6f, - 0x37, 0x6c, 0x91, 0x9a, 0x50, 0x27, 0x9e, 0x99, 0xbc, 0x6c, 0xbd, 0x58, 0xae, 0x7e, 0x40, 0xa8, - 0x39, 0xbb, 0xf9, 0x60, 0x72, 0x7c, 0x1c, 0x3f, 0xfb, 0xdf, 0x16, 0xe0, 0x6c, 0x76, 0xe2, 0x44, - 0xbf, 0x65, 0xc1, 0x99, 0xbb, 0xf7, 0x92, 0xed, 0x70, 0x8f, 0x04, 0x71, 0xb5, 0x43, 0xcd, 0x1b, - 0x9b, 0x32, 0xc6, 0xaf, 0xb8, 0xf9, 0x4e, 0xd1, 0x73, 0x37, 0xd2, 0x52, 0xae, 0x06, 0x49, 0xd4, - 0xa9, 0x3e, 0x2d, 0xde, 0xee, 0xcc, 0x8d, 0x3b, 0xdb, 0x26, 0x16, 0x67, 0x95, 0xba, 0xf8, 0x79, - 0x0b, 0xce, 0xf7, 0x62, 0x81, 0xce, 0x42, 0x71, 0x8f, 0x74, 0xb8, 0x57, 0x86, 0xe9, 0x4f, 0xf4, - 0x71, 0x28, 0xed, 0x3b, 0x7e, 0x9b, 0x08, 0xef, 0x66, 0xf9, 0x64, 0x2f, 0xa2, 0x34, 0xc3, 0x9c, - 0xeb, 0x8f, 0x17, 0x5e, 0xb3, 0xec, 0xff, 0x50, 0x84, 0x71, 0x63, 0x7e, 0x7b, 0x04, 0x1e, 0x5b, - 0x98, 0xf2, 0xd8, 0xd6, 0x72, 0x9b, 0x9a, 0xfb, 0xba, 0x6c, 0xf7, 0x32, 0x2e, 0xdb, 0x46, 0x7e, - 0x22, 0x1f, 0xe8, 0xb3, 0xa1, 0x04, 0x2a, 0x61, 0x8b, 0x7a, 0xe4, 0x74, 0xea, 0x1f, 0xc9, 0xe3, - 0x13, 0x6e, 0x48, 0x76, 0xd5, 0xc9, 0xa3, 0xc3, 0xd9, 0x8a, 0xfa, 0x8b, 0xb5, 0x20, 0xfb, 0x7b, - 0x16, 0x9c, 0x37, 0x74, 0x5c, 0x0c, 0x83, 0x9a, 0xc7, 0x3e, 0xed, 0x65, 0x18, 0x49, 0x3a, 0x2d, - 0xe9, 0xf6, 0xab, 0x96, 0xda, 0xee, 0xb4, 0x08, 0x66, 0x18, 0xea, 0xe8, 0x37, 0x49, 0x1c, 0x3b, - 0x0d, 0x92, 0x75, 0xf4, 0xd7, 0x38, 0x18, 0x4b, 0x3c, 0x8a, 0x00, 0xf9, 0x4e, 0x9c, 0x6c, 0x47, - 0x4e, 0x10, 0x33, 0xf6, 0xdb, 0x5e, 0x93, 0x88, 0x06, 0xfe, 0x2b, 0x83, 0xf5, 0x18, 0xfa, 0x44, - 0xf5, 0xa9, 0xa3, 0xc3, 0x59, 0xb4, 0xda, 0xc5, 0x09, 0xf7, 0xe0, 0x6e, 0x7f, 0xcd, 0x82, 0xa7, - 0x7a, 0xfb, 0x62, 0xe8, 0xfd, 0x30, 0xca, 0x57, 0x6f, 0xe2, 0xed, 0xf4, 0x27, 0x61, 0x50, 0x2c, - 0xb0, 0x68, 0x1e, 0x2a, 0x6a, 0x9e, 0x10, 0xef, 0x38, 0x2d, 0x48, 0x2b, 0x7a, 0x72, 0xd1, 0x34, - 0xb4, 0xd1, 0xe8, 0x1f, 0xe1, 0xb9, 0xa9, 0x46, 0x63, 0x8b, 0x24, 0x86, 0xb1, 0xff, 0xd8, 0x82, - 0x33, 0x86, 0x56, 0x8f, 0xc0, 0x35, 0x0f, 0xd2, 0xae, 0xf9, 0x4a, 0x6e, 0xfd, 0xb9, 0x8f, 0x6f, - 0x7e, 0x54, 0x60, 0xbe, 0xb9, 0xea, 0xf5, 0xe4, 0x51, 0x2c, 0xec, 0xa2, 0x94, 0x99, 0xd8, 0xcc, - 0x6f, 0xcc, 0x92, 0xfe, 0x8b, 0xbb, 0x77, 0x32, 0x96, 0x02, 0xe7, 0x2a, 0xf5, 0xc1, 0x0b, 0xbc, - 0x3f, 0x2d, 0xc0, 0xd3, 0xe9, 0x07, 0xf4, 0xc8, 0xfd, 0x48, 0x6a, 0xe4, 0x7e, 0xd0, 0x1c, 0xb9, - 0xf7, 0x0f, 0x67, 0x9f, 0xed, 0xf3, 0xd8, 0x0f, 0xcc, 0xc0, 0x46, 0xcb, 0xaa, 0xdd, 0x47, 0x98, - 0x76, 0xf3, 0xe9, 0x36, 0xba, 0x7f, 0x38, 0xfb, 0x7c, 0x9f, 0x77, 0xcc, 0x58, 0xdc, 0xf7, 0xc3, - 0x68, 0x44, 0x9c, 0x38, 0x0c, 0x66, 0x4a, 0x69, 0x33, 0x80, 0x19, 0x14, 0x0b, 0xac, 0xfd, 0xc7, - 0xe5, 0x6c, 0x63, 0x2f, 0xf3, 0xbd, 0x93, 0x30, 0x42, 0x1e, 0x8c, 0x30, 0x6f, 0x8c, 0x77, 0xeb, - 0x9b, 0x27, 0xeb, 0x02, 0x74, 0xf4, 0x2a, 0xd6, 0xd5, 0x32, 0xfd, 0x6a, 0x14, 0x84, 0x99, 0x08, - 0x74, 0x00, 0x65, 0x57, 0x3a, 0x49, 0x85, 0x3c, 0xb6, 0x13, 0x84, 0x8b, 0xa4, 0x25, 0x4e, 0x50, - 0x13, 0xa2, 0x3c, 0x2b, 0x25, 0x0d, 0x11, 0x28, 0x36, 0xbc, 0x44, 0x7c, 0xd6, 0x13, 0xba, 0xc1, - 0xcb, 0x9e, 0xf1, 0x8a, 0x63, 0x47, 0x87, 0xb3, 0xc5, 0x65, 0x2f, 0xc1, 0x94, 0x3f, 0xfa, 0x15, - 0x0b, 0xc6, 0x63, 0xb7, 0xb9, 0x19, 0x85, 0xfb, 0x5e, 0x8d, 0x44, 0x62, 0x12, 0x3c, 0xe1, 0xb0, - 0xda, 0x5a, 0x5c, 0x93, 0x0c, 0xb5, 0x5c, 0xbe, 0x2c, 0xd1, 0x18, 0x6c, 0xca, 0xa5, 0xce, 0xe1, - 0xd3, 0xe2, 0xdd, 0x97, 0x88, 0xeb, 0xc5, 0x74, 0xca, 0x14, 0xbe, 0x30, 0xeb, 0x29, 0x27, 0x76, - 0x0a, 0x96, 0xda, 0xee, 0x1e, 0x1d, 0x6f, 0x5a, 0xa1, 0x67, 0x8f, 0x0e, 0x67, 0x9f, 0x5e, 0xec, - 0x2d, 0x13, 0xf7, 0x53, 0x86, 0x35, 0x58, 0xab, 0xed, 0xfb, 0x98, 0xbc, 0xdd, 0x26, 0x6c, 0xa5, - 0x9b, 0x43, 0x83, 0x6d, 0x6a, 0x86, 0x99, 0x06, 0x33, 0x30, 0xd8, 0x94, 0x8b, 0xde, 0x86, 0xd1, - 0xa6, 0x93, 0x44, 0xde, 0x81, 0x58, 0xde, 0x9e, 0xd0, 0x4d, 0x5b, 0x63, 0xbc, 0xb4, 0x70, 0xa0, - 0x63, 0x92, 0x03, 0xb1, 0x10, 0x84, 0x9a, 0x50, 0x6a, 0x92, 0xa8, 0x41, 0x66, 0xca, 0x79, 0x6c, - 0xe5, 0xad, 0x51, 0x56, 0x5a, 0x60, 0x85, 0x4e, 0x6a, 0x0c, 0x86, 0xb9, 0x14, 0xf4, 0x71, 0x28, - 0xc7, 0xc4, 0x27, 0x6e, 0x12, 0x46, 0x33, 0x15, 0x26, 0xf1, 0xc7, 0x06, 0x9c, 0xa2, 0x9d, 0x1d, - 0xe2, 0x6f, 0x89, 0x47, 0xf9, 0x00, 0x93, 0xff, 0xb0, 0x62, 0x69, 0xff, 0x77, 0x0b, 0x50, 0xda, - 0xc2, 0x3c, 0x02, 0xc7, 0xe0, 0xed, 0xb4, 0x63, 0xb0, 0x9a, 0xe7, 0xf4, 0xd5, 0xc7, 0x37, 0xf8, - 0x4e, 0x19, 0x32, 0xb6, 0x79, 0x9d, 0xc4, 0x09, 0xa9, 0xbd, 0x67, 0x4f, 0xdf, 0xb3, 0xa7, 0xef, - 0xd9, 0x53, 0x65, 0x4f, 0x77, 0x32, 0xf6, 0xf4, 0x0d, 0x63, 0xd4, 0xeb, 0x33, 0xa6, 0x4f, 0xaa, - 0x43, 0x28, 0x53, 0x03, 0x83, 0x80, 0x5a, 0x82, 0x1b, 0x5b, 0x1b, 0xeb, 0x3d, 0x0d, 0xe8, 0x27, - 0xd3, 0x06, 0xf4, 0xa4, 0x22, 0x1e, 0xb9, 0xc9, 0x3c, 0x2a, 0x66, 0x4d, 0x26, 0x3b, 0x06, 0xb8, - 0x02, 0xd0, 0x08, 0xb7, 0x49, 0xb3, 0xe5, 0x3b, 0x09, 0x77, 0x81, 0xcb, 0x7a, 0xe9, 0xb0, 0xac, - 0x30, 0xd8, 0xa0, 0x42, 0x7f, 0xd3, 0x02, 0x68, 0xc8, 0x4f, 0x23, 0xcd, 0xe1, 0xad, 0x3c, 0xcd, - 0xa1, 0xfe, 0xf0, 0x5a, 0x17, 0x25, 0x10, 0x1b, 0xc2, 0xd1, 0x67, 0x2d, 0x28, 0x27, 0x52, 0x7d, - 0x6e, 0x20, 0xb6, 0xf3, 0xd4, 0x44, 0xbe, 0xb4, 0x9e, 0x19, 0x54, 0x93, 0x28, 0xb9, 0xe8, 0x6f, - 0x58, 0x00, 0x71, 0x27, 0x70, 0x37, 0x43, 0xdf, 0x73, 0x3b, 0xc2, 0x6e, 0xdc, 0xce, 0x75, 0x79, - 0xa3, 0xb8, 0x57, 0xa7, 0x68, 0x6b, 0xe8, 0xff, 0xd8, 0x90, 0x6c, 0x7f, 0x33, 0xbd, 0x3b, 0xa1, - 0xd6, 0x45, 0xec, 0x93, 0xb9, 0xd2, 0xad, 0x8f, 0xc5, 0xd6, 0x5d, 0xae, 0x9f, 0x4c, 0x2d, 0x1a, - 0xf4, 0x27, 0x53, 0xa0, 0x18, 0x1b, 0xc2, 0xed, 0xcf, 0x58, 0x30, 0xd3, 0xef, 0xed, 0x10, 0x81, - 0x67, 0x5b, 0x11, 0x61, 0x63, 0x48, 0x6d, 0xba, 0x6f, 0x04, 0x4b, 0xc4, 0x27, 0x6c, 0x9f, 0x87, - 0x77, 0xd0, 0x17, 0x84, 0x84, 0x67, 0x37, 0xfb, 0x93, 0xe2, 0x07, 0xf1, 0xb1, 0x7f, 0xb3, 0x90, - 0xda, 0xec, 0x30, 0x3e, 0x34, 0xfa, 0xba, 0xd5, 0xe5, 0x45, 0xfc, 0xf4, 0x69, 0xf4, 0x28, 0xe6, - 0x6f, 0xa8, 0xbd, 0xf7, 0xfe, 0x34, 0x8f, 0x71, 0x73, 0xcf, 0xfe, 0xf7, 0x23, 0xf0, 0x00, 0xcd, - 0xd4, 0xf6, 0x8d, 0xd5, 0x6f, 0xfb, 0x66, 0xf8, 0x1d, 0xa1, 0x2f, 0x58, 0x30, 0xea, 0x53, 0x83, - 0x16, 0xcf, 0x14, 0x59, 0x27, 0xad, 0x9d, 0x56, 0xdb, 0x73, 0xbb, 0x19, 0xf3, 0x0d, 0x66, 0xb5, - 0x94, 0xe5, 0x40, 0x2c, 0x74, 0x40, 0xdf, 0xb0, 0x60, 0xdc, 0x09, 0x82, 0x30, 0x11, 0x27, 0x9e, - 0xfc, 0xc4, 0xd0, 0x3b, 0x35, 0x9d, 0x16, 0xb4, 0x2c, 0xae, 0x98, 0x3a, 0xcd, 0x34, 0x30, 0xd8, - 0x54, 0x09, 0xcd, 0x01, 0xd4, 0xbd, 0xc0, 0xf1, 0xbd, 0x77, 0xa8, 0x63, 0x56, 0x62, 0xc7, 0x0b, - 0xcc, 0x46, 0x5c, 0x53, 0x50, 0x6c, 0x50, 0x5c, 0xfc, 0xeb, 0x30, 0x6e, 0xbc, 0x79, 0x8f, 0x7d, - 0xf1, 0xf3, 0xe6, 0xbe, 0x78, 0xc5, 0xd8, 0xce, 0xbe, 0xf8, 0x06, 0x9c, 0xcd, 0x2a, 0x38, 0xcc, - 0xf3, 0xf6, 0x6f, 0x8d, 0xc2, 0x6c, 0xf6, 0xe5, 0xa3, 0x26, 0x55, 0xed, 0x3d, 0x87, 0xf6, 0x3d, - 0x87, 0xf6, 0x3d, 0x87, 0x56, 0xfe, 0xb1, 0xbf, 0x5d, 0x82, 0x69, 0x73, 0xa0, 0x70, 0xed, 0x7e, - 0x14, 0xc6, 0x22, 0xd2, 0x0a, 0x6f, 0xe1, 0x55, 0x61, 0x71, 0x75, 0xa4, 0x10, 0x07, 0x63, 0x89, - 0xa7, 0x96, 0xb9, 0xe5, 0x24, 0xbb, 0xc2, 0xe4, 0x2a, 0xcb, 0xbc, 0xe9, 0x24, 0xbb, 0x98, 0x61, - 0xd0, 0x1b, 0x30, 0x95, 0x38, 0x51, 0x83, 0x24, 0x98, 0xec, 0xb3, 0x46, 0x10, 0xbb, 0x83, 0x4f, - 0x09, 0xda, 0xa9, 0xed, 0x14, 0x16, 0x67, 0xa8, 0xd1, 0xdb, 0x30, 0xb2, 0x4b, 0xfc, 0xa6, 0xf0, - 0xb8, 0xb7, 0xf2, 0xb3, 0x88, 0xec, 0x5d, 0xaf, 0x13, 0xbf, 0xc9, 0xc7, 0x2b, 0xfd, 0x85, 0x99, - 0x28, 0xfa, 0x75, 0x2a, 0x7b, 0xed, 0x38, 0x09, 0x9b, 0xde, 0x3b, 0xd2, 0x0f, 0xff, 0xe9, 0x9c, - 0x05, 0xdf, 0x94, 0xfc, 0xf9, 0x19, 0x90, 0xfa, 0x8b, 0xb5, 0x64, 0xa6, 0x47, 0xcd, 0x8b, 0x98, - 0x5f, 0xdd, 0x99, 0x81, 0x53, 0xd1, 0x63, 0x49, 0xf2, 0xe7, 0x7a, 0xa8, 0xbf, 0x58, 0x4b, 0x46, - 0x1d, 0x18, 0x6d, 0xf9, 0xed, 0x86, 0x17, 0xcc, 0x8c, 0x33, 0x1d, 0x6e, 0xe5, 0xac, 0xc3, 0x26, - 0x63, 0xce, 0x57, 0x43, 0xfc, 0x37, 0x16, 0x02, 0xd1, 0x0b, 0x50, 0x72, 0x77, 0x9d, 0x28, 0x99, - 0x99, 0x60, 0x9d, 0x46, 0xed, 0x5e, 0x2c, 0x52, 0x20, 0xe6, 0x38, 0xfb, 0x1f, 0x14, 0xd2, 0xde, - 0x43, 0xfa, 0xc5, 0x78, 0x77, 0x76, 0xdb, 0x51, 0x2c, 0xd7, 0x1d, 0x46, 0x77, 0x66, 0x60, 0x2c, - 0xf1, 0xe8, 0x33, 0x16, 0x8c, 0xdd, 0x8d, 0xc3, 0x20, 0x20, 0x89, 0xb0, 0xd4, 0xb7, 0x73, 0x7e, - 0xd7, 0x1b, 0x9c, 0xbb, 0xd6, 0x41, 0x00, 0xb0, 0x94, 0x4b, 0xd5, 0x25, 0x07, 0xae, 0xdf, 0xae, - 0xc9, 0xe3, 0x2a, 0x45, 0x7a, 0x95, 0x83, 0xb1, 0xc4, 0x53, 0x52, 0x2f, 0xe0, 0xa4, 0x23, 0x69, - 0xd2, 0x95, 0x40, 0x90, 0x0a, 0xbc, 0xfd, 0x3b, 0x25, 0xb8, 0xd0, 0xb3, 0xf7, 0xd3, 0x79, 0x9d, - 0xcd, 0x9c, 0xd7, 0x3c, 0x9f, 0xc8, 0xf8, 0x2c, 0x36, 0xaf, 0xdf, 0x56, 0x50, 0x6c, 0x50, 0xa0, - 0x5f, 0x04, 0x68, 0x39, 0x91, 0xd3, 0x24, 0x62, 0x3e, 0x2b, 0x9e, 0x7c, 0xfa, 0xa4, 0x7a, 0x6c, - 0x4a, 0x9e, 0xda, 0xaf, 0x57, 0xa0, 0x18, 0x1b, 0x22, 0xd1, 0x87, 0x60, 0x3c, 0x22, 0x3e, 0x71, - 0x62, 0x16, 0xc0, 0x90, 0x8d, 0xc6, 0xc2, 0x1a, 0x85, 0x4d, 0x3a, 0xf4, 0x7e, 0x18, 0x65, 0x6f, - 0x21, 0x8f, 0x27, 0x94, 0x2b, 0xc6, 0xde, 0x33, 0xc6, 0x02, 0x8b, 0xbe, 0x6c, 0xc1, 0x54, 0xdd, - 0xf3, 0x89, 0x96, 0x2e, 0x62, 0xa7, 0x36, 0x4e, 0xfe, 0x92, 0xd7, 0x4c, 0xbe, 0xda, 0x04, 0xa6, - 0xc0, 0x31, 0xce, 0x88, 0xa7, 0x9f, 0x79, 0x9f, 0x44, 0xcc, 0x76, 0x8e, 0xa6, 0x3f, 0xf3, 0x6d, - 0x0e, 0xc6, 0x12, 0x8f, 0x16, 0xe0, 0x4c, 0xcb, 0x89, 0xe3, 0xc5, 0x88, 0xd4, 0x48, 0x90, 0x78, - 0x8e, 0xcf, 0x23, 0x9b, 0xca, 0x3a, 0xb2, 0x61, 0x33, 0x8d, 0xc6, 0x59, 0x7a, 0xf4, 0x51, 0x78, - 0xda, 0x6b, 0x04, 0x61, 0x44, 0xd6, 0xbc, 0x38, 0xf6, 0x82, 0x86, 0xee, 0x06, 0xcc, 0x14, 0x96, - 0xab, 0xb3, 0x82, 0xd5, 0xd3, 0x2b, 0xbd, 0xc9, 0x70, 0xbf, 0xe7, 0xd1, 0x4b, 0x50, 0x8e, 0xf7, - 0xbc, 0xd6, 0x62, 0x54, 0x8b, 0xd9, 0xd6, 0x43, 0x59, 0xaf, 0x76, 0xb7, 0x04, 0x1c, 0x2b, 0x0a, - 0xfb, 0xd7, 0x0a, 0xe9, 0xf5, 0x9b, 0x39, 0x7e, 0x50, 0x4c, 0x47, 0x49, 0x72, 0xdb, 0x89, 0xe4, - 0x22, 0xf3, 0x84, 0xb1, 0x51, 0x82, 0xef, 0x6d, 0x27, 0x32, 0xc7, 0x1b, 0x13, 0x80, 0xa5, 0x24, - 0x74, 0x17, 0x46, 0x12, 0xdf, 0xc9, 0x29, 0x98, 0xd2, 0x90, 0xa8, 0x4f, 0xf1, 0x57, 0x17, 0x62, - 0xcc, 0x64, 0xa0, 0xe7, 0xa8, 0x7f, 0xba, 0xc3, 0x57, 0x27, 0x15, 0xe9, 0x52, 0xee, 0xc4, 0x98, - 0x41, 0xed, 0xff, 0x3d, 0xda, 0xc3, 0xe4, 0xa9, 0x49, 0x04, 0x5d, 0x01, 0xa0, 0x4b, 0x9d, 0xcd, - 0x88, 0xd4, 0xbd, 0x03, 0x31, 0x89, 0xab, 0x61, 0xb5, 0xae, 0x30, 0xd8, 0xa0, 0x92, 0xcf, 0x6c, - 0xb5, 0xeb, 0xf4, 0x99, 0x42, 0xf7, 0x33, 0x1c, 0x83, 0x0d, 0x2a, 0xf4, 0x2a, 0x8c, 0x7a, 0x4d, - 0xa7, 0x41, 0xa4, 0x9a, 0xcf, 0xd1, 0xf1, 0xb4, 0xc2, 0x20, 0xf7, 0x0f, 0x67, 0xa7, 0x94, 0x42, - 0x0c, 0x84, 0x05, 0x2d, 0xfa, 0x4d, 0x0b, 0x26, 0xdc, 0xb0, 0xd9, 0x0c, 0x03, 0xbe, 0x40, 0x10, - 0xab, 0x9d, 0xbb, 0xa7, 0x35, 0xc5, 0xce, 0x2d, 0x1a, 0xc2, 0xf8, 0x72, 0x47, 0x45, 0x7d, 0x9a, - 0x28, 0x9c, 0xd2, 0xca, 0x1c, 0x76, 0xa5, 0x63, 0x86, 0xdd, 0x3f, 0xb7, 0x60, 0x9a, 0x3f, 0x6b, - 0xac, 0x5b, 0x44, 0x80, 0x63, 0x78, 0xca, 0xaf, 0xd5, 0xb5, 0x94, 0x7b, 0x46, 0xa8, 0x39, 0xdd, - 0x85, 0xc7, 0xdd, 0x4a, 0xa2, 0x65, 0x98, 0xae, 0x87, 0x91, 0x4b, 0xcc, 0x86, 0x10, 0x36, 0x43, - 0x31, 0xba, 0x96, 0x25, 0xc0, 0xdd, 0xcf, 0xa0, 0xdb, 0xf0, 0x94, 0x01, 0x34, 0xdb, 0x81, 0x9b, - 0x8d, 0x4b, 0x82, 0xdb, 0x53, 0xd7, 0x7a, 0x52, 0xe1, 0x3e, 0x4f, 0x5f, 0xfc, 0x08, 0x4c, 0x77, - 0x7d, 0xbf, 0xa1, 0x56, 0x93, 0x4b, 0xf0, 0x54, 0xef, 0x96, 0x1a, 0x6a, 0x4d, 0xf9, 0xeb, 0x56, - 0xfa, 0xb0, 0xd9, 0xf0, 0x5c, 0x06, 0xd8, 0x9f, 0x70, 0xa0, 0x48, 0x82, 0x7d, 0x61, 0x38, 0xae, - 0x9d, 0xac, 0x47, 0x5c, 0x0d, 0xf6, 0xf9, 0x87, 0x66, 0x8b, 0xb0, 0xab, 0xc1, 0x3e, 0xa6, 0xbc, - 0xed, 0xbf, 0x33, 0x9a, 0x8a, 0x60, 0xd9, 0x92, 0x41, 0x53, 0x7c, 0xf9, 0x63, 0xe5, 0x1d, 0x34, - 0xc5, 0x43, 0x10, 0x75, 0x1c, 0x04, 0x5f, 0xf1, 0x08, 0x71, 0xe8, 0xf3, 0x16, 0x0b, 0x99, 0x96, - 0x91, 0x3d, 0xc2, 0x99, 0x3a, 0x9d, 0x08, 0x6e, 0x33, 0x10, 0x5b, 0x02, 0xb1, 0x29, 0x9d, 0x8e, - 0xe4, 0x16, 0x0f, 0xfe, 0xcb, 0xba, 0x54, 0x32, 0xa8, 0x5a, 0xe2, 0xd1, 0x41, 0x8f, 0x1d, 0xd6, - 0x1c, 0xc2, 0x6e, 0x8f, 0xdf, 0x53, 0x45, 0xdf, 0xb0, 0x60, 0x9a, 0x4f, 0x9c, 0x4b, 0x5e, 0xbd, - 0x4e, 0x22, 0x12, 0xb8, 0x44, 0xba, 0x1e, 0x77, 0x4e, 0xa6, 0x81, 0x5c, 0x77, 0xae, 0x64, 0xd9, - 0xeb, 0x21, 0xde, 0x85, 0xc2, 0xdd, 0xca, 0xa0, 0x1a, 0x8c, 0x78, 0x41, 0x3d, 0x14, 0x86, 0xad, - 0x7a, 0x32, 0xa5, 0x56, 0x82, 0x7a, 0xa8, 0xc7, 0x0a, 0xfd, 0x87, 0x19, 0x77, 0xb4, 0x0a, 0xe7, - 0x23, 0xb1, 0xfa, 0xbb, 0xee, 0xc5, 0xd4, 0x85, 0x5f, 0xf5, 0x9a, 0x5e, 0xc2, 0x8c, 0x52, 0xb1, - 0x3a, 0x73, 0x74, 0x38, 0x7b, 0x1e, 0xf7, 0xc0, 0xe3, 0x9e, 0x4f, 0xd9, 0x7f, 0x51, 0x49, 0x2f, - 0x71, 0xf9, 0x3e, 0xf5, 0xcf, 0x43, 0x25, 0x52, 0xb1, 0xdf, 0x56, 0x1e, 0xe7, 0xac, 0xb2, 0x8d, - 0x45, 0x80, 0x90, 0xda, 0x7d, 0xd4, 0x51, 0xde, 0x5a, 0x22, 0x75, 0x24, 0xe8, 0x97, 0x17, 0xc3, - 0x22, 0x87, 0xfe, 0x25, 0xa4, 0xea, 0xbd, 0xd5, 0x4e, 0xe0, 0x62, 0x26, 0x03, 0x45, 0x30, 0xba, - 0x4b, 0x1c, 0x3f, 0xd9, 0xcd, 0x67, 0x1b, 0xe8, 0x3a, 0xe3, 0x95, 0x0d, 0x83, 0xe2, 0x50, 0x2c, - 0x24, 0xa1, 0x03, 0x18, 0xdb, 0xe5, 0x1f, 0x41, 0xcc, 0xed, 0x6b, 0x27, 0x6d, 0xdc, 0xd4, 0x97, - 0xd5, 0xe3, 0x57, 0x00, 0xb0, 0x14, 0xc7, 0x8e, 0x48, 0x8c, 0x03, 0x08, 0x3e, 0x7c, 0xf2, 0x8b, - 0x00, 0x1b, 0xf8, 0xf4, 0x01, 0x7d, 0x0a, 0x26, 0x22, 0xe2, 0x86, 0x81, 0xeb, 0xf9, 0xa4, 0xb6, - 0x20, 0xb7, 0x78, 0x86, 0x89, 0xbd, 0x3a, 0x4b, 0xfd, 0x13, 0x6c, 0xf0, 0xc0, 0x29, 0x8e, 0xe8, - 0x73, 0x16, 0x4c, 0xa9, 0x80, 0x51, 0xfa, 0x41, 0x88, 0xd8, 0x24, 0x59, 0xcd, 0x29, 0x3c, 0x95, - 0xf1, 0xac, 0x22, 0xba, 0x42, 0x49, 0xc3, 0x70, 0x46, 0x2e, 0x7a, 0x0b, 0x20, 0xdc, 0x61, 0x87, - 0x20, 0xf4, 0x55, 0xcb, 0x43, 0xbf, 0xea, 0x14, 0x0f, 0x20, 0x94, 0x1c, 0xb0, 0xc1, 0x0d, 0xdd, - 0x04, 0xe0, 0xc3, 0x66, 0xbb, 0xd3, 0x22, 0x6c, 0xd9, 0xa0, 0x83, 0xe7, 0x60, 0x4b, 0x61, 0xee, - 0x1f, 0xce, 0x76, 0x2f, 0x70, 0x59, 0xf0, 0x9c, 0xf1, 0x38, 0xfa, 0x59, 0x18, 0x8b, 0xdb, 0xcd, - 0xa6, 0xa3, 0xf6, 0x53, 0x72, 0x0c, 0x49, 0xe4, 0x7c, 0x75, 0xdf, 0x14, 0x00, 0x2c, 0x25, 0xa2, - 0xbb, 0xd4, 0xb0, 0xc5, 0x62, 0xe5, 0xcd, 0x46, 0x11, 0x9f, 0x9b, 0xc7, 0xd9, 0x3b, 0x7d, 0x58, - 0x3c, 0x77, 0x1e, 0xf7, 0xa0, 0xb9, 0x7f, 0x38, 0xfb, 0x54, 0x1a, 0xbe, 0x1a, 0x72, 0xb1, 0xb8, - 0x27, 0x4f, 0x3b, 0x48, 0x9f, 0xc2, 0x0a, 0x0d, 0x5e, 0x85, 0x09, 0x72, 0x90, 0x90, 0x28, 0x70, - 0xfc, 0x5b, 0x78, 0x55, 0xae, 0xf6, 0x59, 0x47, 0xbb, 0x6a, 0xc0, 0x71, 0x8a, 0x0a, 0xd9, 0xca, - 0xcb, 0x2f, 0x30, 0x7a, 0xd0, 0x5e, 0xbe, 0xf4, 0xe9, 0xed, 0xff, 0x57, 0x48, 0x79, 0x1f, 0xdb, - 0x11, 0x21, 0x28, 0x84, 0x52, 0x10, 0xd6, 0x94, 0x81, 0xbd, 0x91, 0x8f, 0x81, 0x5d, 0x0f, 0x6b, - 0x46, 0x02, 0x14, 0xfd, 0x17, 0x63, 0x2e, 0x87, 0x65, 0x88, 0xc8, 0x54, 0x1a, 0x86, 0x10, 0x0e, - 0x57, 0x9e, 0x92, 0x55, 0x86, 0xc8, 0x86, 0x29, 0x08, 0xa7, 0xe5, 0xa2, 0x3d, 0x28, 0xed, 0x86, - 0x71, 0x22, 0x0f, 0x97, 0x4e, 0xe8, 0xf1, 0x5d, 0x0f, 0xe3, 0x84, 0x4d, 0x97, 0xea, 0xb5, 0x29, - 0x24, 0xc6, 0x5c, 0x86, 0xfd, 0x27, 0x56, 0x6a, 0x6f, 0xe7, 0x8e, 0x93, 0xb8, 0xbb, 0x57, 0xf7, - 0x49, 0x40, 0xc7, 0x8e, 0x19, 0x72, 0xfa, 0xd7, 0x32, 0x21, 0xa7, 0x1f, 0xe8, 0x97, 0x91, 0x7a, - 0x8f, 0x72, 0x98, 0x63, 0x2c, 0x8c, 0xf0, 0xd3, 0x4f, 0x5b, 0x30, 0x6e, 0xa8, 0x27, 0x26, 0xaf, - 0x1c, 0xe3, 0x96, 0xf5, 0x19, 0x94, 0x06, 0x62, 0x53, 0xa4, 0xfd, 0x55, 0x0b, 0xc6, 0xaa, 0x8e, - 0xbb, 0x17, 0xd6, 0xeb, 0xe8, 0x25, 0x28, 0xd7, 0xda, 0x22, 0x2c, 0x9f, 0xbf, 0x9f, 0xda, 0x4c, - 0x58, 0x12, 0x70, 0xac, 0x28, 0x68, 0x1f, 0xae, 0x3b, 0x2c, 0xe6, 0xa1, 0xc0, 0xdc, 0x08, 0xd6, - 0x87, 0xaf, 0x31, 0x08, 0x16, 0x18, 0xf4, 0x21, 0x18, 0x6f, 0x3a, 0x07, 0xf2, 0xe1, 0xec, 0xc6, - 0xd2, 0x9a, 0x46, 0x61, 0x93, 0xce, 0xfe, 0x37, 0x16, 0xcc, 0x54, 0x9d, 0xd8, 0x73, 0x17, 0xda, - 0xc9, 0x6e, 0xd5, 0x4b, 0x76, 0xda, 0xee, 0x1e, 0x49, 0x78, 0xc8, 0x3a, 0xd5, 0xb2, 0x1d, 0xd3, - 0xa1, 0xa4, 0x96, 0x07, 0x4a, 0xcb, 0x5b, 0x02, 0x8e, 0x15, 0x05, 0x7a, 0x07, 0xc6, 0x5b, 0x4e, - 0x1c, 0xdf, 0x0b, 0xa3, 0x1a, 0x26, 0xf5, 0x7c, 0x12, 0x46, 0xb6, 0x88, 0x1b, 0x91, 0x04, 0x93, - 0xba, 0x38, 0x0b, 0xd0, 0xfc, 0xb1, 0x29, 0xcc, 0xfe, 0xdd, 0x0a, 0x8c, 0x89, 0x83, 0x8c, 0x81, - 0x03, 0xf1, 0xe5, 0xc2, 0xa7, 0xd0, 0x77, 0xe1, 0x13, 0xc3, 0xa8, 0xcb, 0xd2, 0x96, 0x85, 0xf7, - 0x71, 0x33, 0x97, 0x93, 0x2f, 0x9e, 0x09, 0xad, 0xd5, 0xe2, 0xff, 0xb1, 0x10, 0x85, 0xbe, 0x62, - 0xc1, 0x19, 0x37, 0x0c, 0x02, 0xe2, 0xea, 0xa9, 0x71, 0x24, 0x8f, 0xb3, 0xec, 0xc5, 0x34, 0x53, - 0xbd, 0xab, 0x96, 0x41, 0xe0, 0xac, 0x78, 0xf4, 0x3a, 0x4c, 0xf2, 0x36, 0xbb, 0x9d, 0xda, 0x52, - 0xd0, 0xf9, 0x66, 0x26, 0x12, 0xa7, 0x69, 0xd1, 0x1c, 0xdf, 0x9a, 0x11, 0x99, 0x5d, 0xa3, 0x7a, - 0x8b, 0xd6, 0xc8, 0xe9, 0x32, 0x28, 0x50, 0x04, 0x28, 0x22, 0xf5, 0x88, 0xc4, 0xbb, 0xe2, 0xa0, - 0x87, 0x4d, 0xcb, 0x63, 0x0f, 0x17, 0xfd, 0x8d, 0xbb, 0x38, 0xe1, 0x1e, 0xdc, 0xd1, 0x9e, 0x58, - 0x1b, 0x94, 0xf3, 0xb0, 0x0a, 0xe2, 0x33, 0xf7, 0x5d, 0x22, 0xcc, 0x42, 0x29, 0xde, 0x75, 0xa2, - 0x1a, 0x73, 0x07, 0x8a, 0x3c, 0xc8, 0x69, 0x8b, 0x02, 0x30, 0x87, 0xa3, 0x25, 0x38, 0x9b, 0xc9, - 0x96, 0x8b, 0xd9, 0x84, 0x5f, 0xae, 0xce, 0x08, 0x76, 0x67, 0x33, 0x79, 0x76, 0x31, 0xee, 0x7a, - 0xc2, 0x5c, 0x37, 0x8e, 0x1f, 0xb3, 0x6e, 0xec, 0xa8, 0x70, 0x82, 0x09, 0x66, 0xf1, 0xdf, 0xcc, - 0xa5, 0x01, 0x06, 0x8a, 0x1d, 0xf8, 0x62, 0x26, 0x76, 0x60, 0x92, 0x29, 0x70, 0x3b, 0x1f, 0x05, - 0x86, 0x0f, 0x14, 0x78, 0x9c, 0x07, 0xff, 0x7f, 0x61, 0x81, 0xfc, 0xae, 0x8b, 0x8e, 0xbb, 0x4b, - 0x68, 0x97, 0x41, 0x6f, 0xc0, 0x94, 0x5a, 0x79, 0x2d, 0x86, 0xed, 0x80, 0x9f, 0xf9, 0x17, 0xf5, - 0xf6, 0x3b, 0x4e, 0x61, 0x71, 0x86, 0x1a, 0xcd, 0x43, 0x85, 0xb6, 0x13, 0x7f, 0x94, 0xcf, 0x1e, - 0x6a, 0x75, 0xb7, 0xb0, 0xb9, 0x22, 0x9e, 0xd2, 0x34, 0x28, 0x84, 0x69, 0xdf, 0x89, 0x13, 0xa6, - 0x01, 0x5d, 0x88, 0x3d, 0x64, 0xee, 0x05, 0x4b, 0x16, 0x5e, 0xcd, 0x32, 0xc2, 0xdd, 0xbc, 0xed, - 0xef, 0x8d, 0xc0, 0x64, 0xca, 0x32, 0x0e, 0x39, 0xed, 0xbc, 0x04, 0x65, 0x39, 0x13, 0x08, 0x53, - 0xae, 0xa8, 0xd5, 0x74, 0xa1, 0x28, 0xe8, 0x34, 0xb9, 0x43, 0x9c, 0x88, 0x44, 0x2c, 0x0f, 0x31, - 0x3b, 0x4d, 0x56, 0x35, 0x0a, 0x9b, 0x74, 0xcc, 0x28, 0x27, 0x7e, 0xbc, 0xe8, 0x7b, 0x24, 0x48, - 0xb8, 0x9a, 0xf9, 0x18, 0xe5, 0xed, 0xd5, 0x2d, 0x93, 0xa9, 0x36, 0xca, 0x19, 0x04, 0xce, 0x8a, - 0x47, 0xbf, 0x6c, 0xc1, 0xa4, 0x73, 0x2f, 0xd6, 0xb5, 0x35, 0x44, 0x94, 0xc0, 0x09, 0x27, 0xa9, - 0x54, 0xb9, 0x8e, 0xea, 0x34, 0x35, 0xef, 0x29, 0x10, 0x4e, 0x0b, 0x45, 0x5f, 0xb7, 0x00, 0x91, - 0x03, 0xe2, 0xca, 0x38, 0x06, 0xa1, 0xcb, 0x68, 0x1e, 0x0b, 0x94, 0xab, 0x5d, 0x7c, 0xb9, 0x55, - 0xef, 0x86, 0xe3, 0x1e, 0x3a, 0xd8, 0xff, 0xb2, 0xa8, 0x06, 0x94, 0x0e, 0x9d, 0x71, 0x8c, 0x08, - 0x52, 0xeb, 0xe1, 0x23, 0x48, 0xf5, 0xd9, 0x4f, 0x57, 0x14, 0x69, 0x3a, 0xdc, 0xb2, 0xf0, 0x98, - 0xc2, 0x2d, 0x3f, 0x6b, 0xa9, 0x23, 0x43, 0xee, 0xc6, 0xbf, 0x95, 0x6f, 0xd8, 0xce, 0x1c, 0x3f, - 0x79, 0xcc, 0x58, 0xf7, 0xf4, 0x71, 0x24, 0xb5, 0xa6, 0x06, 0xd9, 0x50, 0xd6, 0xf0, 0x3f, 0x17, - 0x61, 0xdc, 0x98, 0x49, 0x7b, 0xba, 0x45, 0xd6, 0x13, 0xe6, 0x16, 0x15, 0x86, 0x70, 0x8b, 0x7e, - 0x11, 0x2a, 0xae, 0xb4, 0xf2, 0xf9, 0x14, 0x72, 0xc9, 0xce, 0x1d, 0xda, 0xd0, 0x2b, 0x10, 0xd6, - 0x32, 0xd1, 0x32, 0x4c, 0x1b, 0x6c, 0xc4, 0x0c, 0x31, 0xc2, 0x66, 0x08, 0xb5, 0xb1, 0xba, 0x90, - 0x25, 0xc0, 0xdd, 0xcf, 0xa0, 0x57, 0xe8, 0xca, 0xca, 0x13, 0xef, 0x25, 0x83, 0xeb, 0x98, 0xbb, - 0xbe, 0xb0, 0xb9, 0x22, 0xc1, 0xd8, 0xa4, 0xb1, 0xbf, 0x67, 0xa9, 0x8f, 0xfb, 0x08, 0x72, 0x52, - 0xee, 0xa6, 0x73, 0x52, 0xae, 0xe6, 0xd2, 0xcc, 0x7d, 0x92, 0x51, 0xd6, 0x61, 0x6c, 0x31, 0x6c, - 0x36, 0x9d, 0xa0, 0x86, 0x7e, 0x04, 0xc6, 0x5c, 0xfe, 0x53, 0x6c, 0x55, 0x8c, 0x53, 0xe7, 0x4b, - 0x60, 0xb1, 0xc4, 0xa1, 0xe7, 0x60, 0xc4, 0x89, 0x1a, 0x72, 0x7b, 0x82, 0x9d, 0x95, 0x2e, 0x44, - 0x8d, 0x18, 0x33, 0xa8, 0xfd, 0xb5, 0x02, 0xc0, 0x62, 0xd8, 0x6c, 0x39, 0x11, 0xa9, 0x6d, 0x87, - 0xef, 0x9d, 0x89, 0xf0, 0x55, 0xeb, 0x17, 0x2c, 0x40, 0xb4, 0x55, 0xc2, 0x80, 0x04, 0x89, 0x0a, - 0x36, 0xa0, 0xce, 0x8e, 0x2b, 0xa1, 0xc2, 0x73, 0xd0, 0x63, 0x40, 0x22, 0xb0, 0xa6, 0x19, 0x60, - 0x09, 0xf8, 0x82, 0x34, 0x50, 0xc5, 0x74, 0x0c, 0x0f, 0x33, 0x6b, 0xc2, 0x5e, 0xd9, 0xbf, 0x57, - 0x80, 0xa7, 0xf8, 0x9c, 0xb3, 0xe6, 0x04, 0x4e, 0x83, 0x34, 0xa9, 0x56, 0x83, 0x9e, 0xae, 0xb9, - 0x74, 0xed, 0xe1, 0xc9, 0x90, 0x9d, 0x93, 0x76, 0x4e, 0xde, 0xa9, 0x78, 0x37, 0x5a, 0x09, 0xbc, - 0x04, 0x33, 0xe6, 0x28, 0x86, 0xb2, 0x2c, 0xcd, 0x25, 0x8c, 0x4d, 0x4e, 0x82, 0xd4, 0xb8, 0x13, - 0x13, 0x03, 0xc1, 0x4a, 0x10, 0xf5, 0xcc, 0xfc, 0xd0, 0xdd, 0xc3, 0xa4, 0x15, 0x32, 0xc3, 0x62, - 0x44, 0x4c, 0xac, 0x0a, 0x38, 0x56, 0x14, 0xf6, 0xef, 0x59, 0x90, 0x35, 0xb9, 0x6c, 0x29, 0xcf, - 0xb3, 0x72, 0xb3, 0x4b, 0xf9, 0x74, 0xd2, 0xed, 0x10, 0xc9, 0xc5, 0x3f, 0x03, 0xe3, 0x4e, 0x42, - 0x67, 0x49, 0xbe, 0xae, 0x2c, 0x3e, 0xdc, 0x76, 0xef, 0x5a, 0x58, 0xf3, 0xea, 0x1e, 0x5b, 0x4f, - 0x9a, 0xec, 0xec, 0x3f, 0x1f, 0x81, 0xe9, 0xae, 0x38, 0x4b, 0xf4, 0x1a, 0x4c, 0xb8, 0xa2, 0x7b, - 0xb4, 0x30, 0xa9, 0x8b, 0x97, 0x31, 0x8e, 0xf1, 0x35, 0x0e, 0xa7, 0x28, 0x07, 0xe8, 0xa0, 0x2b, - 0x70, 0x2e, 0xa2, 0x2b, 0xd9, 0x36, 0x59, 0xa8, 0x27, 0x24, 0xda, 0x22, 0x6e, 0x18, 0xd4, 0x78, - 0xf6, 0x78, 0xb1, 0xfa, 0xf4, 0xd1, 0xe1, 0xec, 0x39, 0xdc, 0x8d, 0xc6, 0xbd, 0x9e, 0x41, 0x2d, - 0x98, 0xf4, 0x4d, 0x27, 0x47, 0x78, 0xb8, 0x0f, 0xe5, 0x1f, 0xa9, 0x49, 0x30, 0x05, 0xc6, 0x69, - 0x01, 0x69, 0x4f, 0xa9, 0xf4, 0x98, 0x3c, 0xa5, 0x5f, 0xd2, 0x9e, 0x12, 0x3f, 0x1b, 0xfc, 0x58, - 0xce, 0x71, 0xb6, 0xa7, 0xed, 0x2a, 0xbd, 0x09, 0x65, 0x79, 0xac, 0x3e, 0x80, 0xbd, 0x79, 0x21, - 0xc5, 0xa7, 0x8f, 0x45, 0xbb, 0x5f, 0x80, 0x1e, 0x5e, 0x36, 0x1d, 0x67, 0x7a, 0x4a, 0x4b, 0x8d, - 0xb3, 0xe1, 0xa6, 0x35, 0x74, 0xc0, 0x43, 0x0a, 0xb8, 0x67, 0xfa, 0xd1, 0xbc, 0x57, 0x09, 0x3a, - 0xca, 0x60, 0x5c, 0xe8, 0xa7, 0x22, 0x0d, 0xd0, 0x15, 0x00, 0xed, 0x89, 0x88, 0x68, 0x3a, 0x75, - 0x1c, 0xa6, 0x1d, 0x16, 0x6c, 0x50, 0xd1, 0x45, 0xa3, 0x17, 0xc4, 0x89, 0xe3, 0xfb, 0xd7, 0xbd, - 0x20, 0x11, 0xbb, 0x5f, 0x6a, 0x96, 0x5a, 0xd1, 0x28, 0x6c, 0xd2, 0x5d, 0xfc, 0xb0, 0xf1, 0x5d, - 0x86, 0xf9, 0x9e, 0xbb, 0xf0, 0xcc, 0xb2, 0x97, 0xa8, 0x18, 0x50, 0xd5, 0x8f, 0xa8, 0xa3, 0xa1, - 0x82, 0x96, 0xad, 0xbe, 0x41, 0xcb, 0x46, 0x0c, 0x66, 0x21, 0x1d, 0x32, 0x9a, 0x8d, 0xc1, 0xb4, - 0x5f, 0x83, 0xf3, 0xcb, 0x5e, 0x72, 0xcd, 0xf3, 0xc9, 0x90, 0x42, 0xec, 0xdf, 0x1d, 0x81, 0x09, - 0x33, 0xa8, 0x7e, 0x98, 0xb8, 0xeb, 0x2f, 0x51, 0x5f, 0x42, 0xbc, 0x9d, 0xa7, 0xce, 0x39, 0xee, - 0x9c, 0x38, 0xc2, 0xbf, 0x77, 0x8b, 0x19, 0xee, 0x84, 0x96, 0x89, 0x4d, 0x05, 0xd0, 0x3d, 0x28, - 0xd5, 0x59, 0x8c, 0x60, 0x31, 0x8f, 0x13, 0xd7, 0x5e, 0x2d, 0xaa, 0x87, 0x19, 0x8f, 0x32, 0xe4, - 0xf2, 0xe8, 0x0c, 0x19, 0xa5, 0x23, 0xcb, 0x95, 0xa1, 0x52, 0x31, 0xe5, 0x8a, 0xa2, 0x9f, 0xa9, - 0x2f, 0x3d, 0x84, 0xa9, 0x4f, 0x19, 0xde, 0xd1, 0xc7, 0x63, 0x78, 0xed, 0x2f, 0x14, 0x60, 0x6a, - 0x39, 0x68, 0x6f, 0x2e, 0x6f, 0xb6, 0x77, 0x7c, 0xcf, 0xbd, 0x49, 0x3a, 0xd4, 0x38, 0xed, 0x91, - 0xce, 0xca, 0x92, 0xe8, 0x43, 0xaa, 0xd5, 0x6e, 0x52, 0x20, 0xe6, 0x38, 0x3a, 0x1c, 0xeb, 0x5e, - 0xd0, 0x20, 0x51, 0x2b, 0xf2, 0xc4, 0xae, 0x96, 0x31, 0x1c, 0xaf, 0x69, 0x14, 0x36, 0xe9, 0x28, - 0xef, 0xf0, 0x5e, 0x40, 0xa2, 0xac, 0x2b, 0xb7, 0x41, 0x81, 0x98, 0xe3, 0x28, 0x51, 0x12, 0xb5, - 0xe3, 0x44, 0x7c, 0x0e, 0x45, 0xb4, 0x4d, 0x81, 0x98, 0xe3, 0x68, 0x5f, 0x8f, 0xdb, 0x3b, 0xec, - 0x48, 0x37, 0x13, 0x5c, 0xb7, 0xc5, 0xc1, 0x58, 0xe2, 0x29, 0xe9, 0x1e, 0xe9, 0x2c, 0xd1, 0x85, - 0x4d, 0x26, 0xfc, 0xf5, 0x26, 0x07, 0x63, 0x89, 0x67, 0xf9, 0xfa, 0xe9, 0xe6, 0xf8, 0x81, 0xcb, - 0xd7, 0x4f, 0xab, 0xdf, 0x67, 0x89, 0xf4, 0x4d, 0x0b, 0x26, 0xcc, 0x40, 0x0c, 0xd4, 0xc8, 0x78, - 0x79, 0x1b, 0x5d, 0xb5, 0x57, 0x7e, 0xb2, 0x57, 0x39, 0xe0, 0x86, 0x97, 0x84, 0xad, 0xf8, 0x65, - 0x12, 0x34, 0xbc, 0x80, 0xb0, 0xa3, 0x3f, 0x1e, 0xc0, 0x91, 0x8a, 0xf2, 0x58, 0x0c, 0x6b, 0xe4, - 0x21, 0xdc, 0x44, 0xfb, 0x0e, 0x4c, 0x77, 0xc5, 0x3c, 0x0f, 0x30, 0xb9, 0x1e, 0x9b, 0x52, 0x62, - 0x63, 0x18, 0xa7, 0x8c, 0x37, 0x5a, 0x3c, 0xd2, 0x62, 0x11, 0xa6, 0xb9, 0x03, 0x40, 0x25, 0x6d, - 0xb9, 0xbb, 0xa4, 0xa9, 0xe2, 0xd8, 0xd9, 0x16, 0xea, 0xed, 0x2c, 0x12, 0x77, 0xd3, 0xdb, 0x5f, - 0xb4, 0x60, 0x32, 0x15, 0x86, 0x9e, 0x93, 0x1b, 0xc0, 0x46, 0x5a, 0xc8, 0xe2, 0x82, 0x22, 0x2f, - 0xe0, 0xa7, 0x60, 0x65, 0x63, 0xa4, 0x69, 0x14, 0x36, 0xe9, 0xec, 0xaf, 0x16, 0xa0, 0x2c, 0x8f, - 0x7d, 0x07, 0x50, 0xe5, 0xf3, 0x16, 0x4c, 0xaa, 0x6d, 0x6b, 0xb6, 0x1f, 0xc2, 0x3b, 0xe3, 0xfa, - 0xc9, 0x0f, 0x9e, 0x55, 0xf0, 0x58, 0x50, 0x0f, 0xb5, 0x4f, 0x8a, 0x4d, 0x61, 0x38, 0x2d, 0x1b, - 0xdd, 0x06, 0x88, 0x3b, 0x71, 0x42, 0x9a, 0xc6, 0xce, 0x8c, 0x6d, 0x8c, 0xb8, 0x39, 0x37, 0x8c, - 0x08, 0x1d, 0x5f, 0xeb, 0x61, 0x8d, 0x6c, 0x29, 0x4a, 0xed, 0x44, 0x68, 0x18, 0x36, 0x38, 0xd9, - 0xff, 0xa4, 0x00, 0x67, 0xb3, 0x2a, 0xa1, 0x8f, 0xc1, 0x84, 0x94, 0x6e, 0xd4, 0x43, 0x96, 0x67, - 0xdd, 0x13, 0xd8, 0xc0, 0xdd, 0x3f, 0x9c, 0x9d, 0xed, 0x2e, 0x2d, 0x3d, 0x67, 0x92, 0xe0, 0x14, - 0x33, 0x7e, 0x76, 0x20, 0x0e, 0xb9, 0xaa, 0x9d, 0x85, 0x56, 0x4b, 0x1c, 0x00, 0x18, 0x67, 0x07, - 0x26, 0x16, 0x67, 0xa8, 0xd1, 0x26, 0x9c, 0x37, 0x20, 0xeb, 0xc4, 0x6b, 0xec, 0xee, 0x84, 0x91, - 0x5c, 0x5b, 0x3c, 0xa7, 0x43, 0x3e, 0xba, 0x69, 0x70, 0xcf, 0x27, 0xe9, 0x7c, 0xe7, 0x3a, 0x2d, - 0xc7, 0xf5, 0x92, 0x8e, 0xd8, 0x6a, 0x52, 0xb6, 0x69, 0x51, 0xc0, 0xb1, 0xa2, 0xb0, 0xd7, 0x60, - 0x64, 0xc0, 0x1e, 0x34, 0x90, 0x4f, 0xfb, 0x26, 0x94, 0x29, 0x3b, 0xe9, 0xe0, 0xe4, 0xc1, 0x32, - 0x84, 0xb2, 0x2c, 0x69, 0x88, 0x6c, 0x28, 0x7a, 0x8e, 0x3c, 0x9e, 0x51, 0xaf, 0xb5, 0x12, 0xc7, - 0x6d, 0xb6, 0x4c, 0xa4, 0x48, 0xf4, 0x02, 0x14, 0xc9, 0x41, 0x2b, 0x7b, 0x0e, 0x73, 0xf5, 0xa0, - 0xe5, 0x45, 0x24, 0xa6, 0x44, 0xe4, 0xa0, 0x85, 0x2e, 0x42, 0xc1, 0xab, 0x89, 0x49, 0x0a, 0x04, - 0x4d, 0x61, 0x65, 0x09, 0x17, 0xbc, 0x9a, 0x7d, 0x00, 0x15, 0x55, 0x43, 0x11, 0xed, 0x49, 0xdb, - 0x6d, 0xe5, 0x11, 0xa7, 0x21, 0xf9, 0xf6, 0xb1, 0xda, 0x6d, 0x00, 0x1d, 0xf4, 0x9f, 0x97, 0x7d, - 0xb9, 0x0c, 0x23, 0x6e, 0x28, 0x72, 0x85, 0xca, 0x9a, 0x0d, 0x33, 0xda, 0x0c, 0x63, 0xdf, 0x81, - 0xa9, 0x9b, 0x41, 0x78, 0x8f, 0x55, 0x12, 0xbb, 0xe6, 0x11, 0xbf, 0x46, 0x19, 0xd7, 0xe9, 0x8f, - 0xac, 0x8b, 0xc0, 0xb0, 0x98, 0xe3, 0x54, 0xa1, 0xc1, 0x42, 0xbf, 0x42, 0x83, 0xf6, 0xa7, 0x2d, - 0x38, 0xab, 0xa2, 0xd1, 0xa5, 0x35, 0x7e, 0x0d, 0x26, 0x76, 0xda, 0x9e, 0x5f, 0x13, 0xff, 0xb3, - 0x0b, 0xf5, 0xaa, 0x81, 0xc3, 0x29, 0x4a, 0xba, 0xac, 0xd8, 0xf1, 0x02, 0x27, 0xea, 0x6c, 0x6a, - 0xf3, 0xaf, 0x2c, 0x42, 0x55, 0x61, 0xb0, 0x41, 0x65, 0x7f, 0xb6, 0x00, 0x93, 0xa9, 0xe4, 0x5b, - 0xe4, 0x43, 0x99, 0xf8, 0x6c, 0xfb, 0x48, 0x7e, 0xd4, 0x93, 0x96, 0xd0, 0x50, 0x1d, 0xf1, 0xaa, - 0xe0, 0x8b, 0x95, 0x84, 0x27, 0xe2, 0x9c, 0xc2, 0xfe, 0x76, 0x11, 0x66, 0xf8, 0xae, 0x59, 0x4d, - 0x05, 0x04, 0xac, 0x49, 0xef, 0xe4, 0x6f, 0xe9, 0x44, 0x77, 0xde, 0x1c, 0x3b, 0x27, 0x2d, 0x02, - 0xd5, 0x5b, 0xd0, 0x40, 0x47, 0xd5, 0xbf, 0x9e, 0x39, 0xaa, 0xe6, 0x93, 0x54, 0xe3, 0x94, 0x34, - 0xfa, 0xc1, 0x3a, 0xbb, 0xfe, 0x87, 0x05, 0x38, 0x93, 0xa9, 0xb0, 0x85, 0xbe, 0x9c, 0xae, 0x80, - 0x62, 0xe5, 0xb1, 0xb7, 0xf2, 0xc0, 0x3a, 0x4f, 0xc3, 0xd5, 0x41, 0x79, 0x5c, 0x1d, 0xfe, 0xf7, - 0x0b, 0x30, 0x95, 0x2e, 0x0d, 0xf6, 0x04, 0xb6, 0xd4, 0x07, 0xa1, 0xc2, 0x0a, 0xee, 0xb0, 0x4a, - 0xd5, 0x7c, 0x0b, 0x87, 0xa5, 0xd8, 0xae, 0x49, 0x20, 0xd6, 0xf8, 0x27, 0xa2, 0xbc, 0x8c, 0xfd, - 0x8f, 0x2c, 0xb8, 0xc0, 0xdf, 0x32, 0xdb, 0x0f, 0xff, 0x76, 0xaf, 0xd6, 0xfd, 0x78, 0xbe, 0x0a, - 0x66, 0x0a, 0x34, 0x1c, 0xd7, 0xbe, 0xac, 0x42, 0xae, 0xd0, 0x36, 0xdd, 0x15, 0x9e, 0x40, 0x65, - 0x87, 0xea, 0x0c, 0xf6, 0xef, 0x17, 0x41, 0x17, 0x05, 0x46, 0x9e, 0xc8, 0x15, 0xc8, 0xa5, 0x50, - 0xc5, 0x56, 0x27, 0x70, 0x75, 0xf9, 0xe1, 0x72, 0x26, 0x55, 0xe0, 0x57, 0x2d, 0x18, 0xf7, 0x02, - 0x2f, 0xf1, 0x1c, 0xe6, 0x74, 0xe6, 0x53, 0xb5, 0x55, 0x89, 0x5b, 0xe1, 0x9c, 0xc3, 0xc8, 0xdc, - 0xf7, 0x53, 0xc2, 0xb0, 0x29, 0x19, 0x7d, 0x4a, 0x44, 0x93, 0x15, 0x73, 0xcb, 0x34, 0x29, 0x67, - 0x42, 0xc8, 0x5a, 0x50, 0x8a, 0x48, 0x12, 0xc9, 0x1c, 0x9f, 0x9b, 0x27, 0x0d, 0x11, 0x4e, 0xa2, - 0xce, 0x56, 0x12, 0x39, 0x09, 0x69, 0x18, 0x8b, 0x76, 0x06, 0xc6, 0x5c, 0x90, 0x1d, 0x03, 0xea, - 0x6e, 0x8b, 0x21, 0x23, 0x75, 0xe6, 0xa1, 0xe2, 0xb4, 0x93, 0xb0, 0x49, 0x9b, 0x49, 0x6c, 0x4d, - 0xea, 0x58, 0x24, 0x89, 0xc0, 0x9a, 0xc6, 0xfe, 0x72, 0x09, 0x32, 0xc1, 0xfb, 0xe8, 0xc0, 0x2c, - 0x68, 0x6d, 0xe5, 0x5b, 0xd0, 0x5a, 0x29, 0xd3, 0xab, 0xa8, 0x35, 0x6a, 0x40, 0xa9, 0xb5, 0xeb, - 0xc4, 0xd2, 0xa7, 0x7c, 0x53, 0x36, 0xd3, 0x26, 0x05, 0xde, 0x3f, 0x9c, 0xfd, 0xa9, 0xc1, 0xf6, - 0x28, 0x68, 0x5f, 0x9d, 0xe7, 0x99, 0x8c, 0x5a, 0x34, 0xe3, 0x81, 0x39, 0x7f, 0x73, 0x97, 0xa2, - 0x78, 0xcc, 0x61, 0xd6, 0x67, 0x44, 0x4d, 0x2d, 0x4c, 0xe2, 0xb6, 0x9f, 0x88, 0xde, 0xf0, 0x66, - 0x8e, 0xa3, 0x8c, 0x33, 0xd6, 0xa9, 0x5f, 0xfc, 0x3f, 0x36, 0x84, 0xa2, 0x8f, 0x41, 0x25, 0x4e, - 0x9c, 0x28, 0x79, 0xc8, 0x44, 0x11, 0xd5, 0xe8, 0x5b, 0x92, 0x09, 0xd6, 0xfc, 0xd0, 0x5b, 0xac, - 0x6e, 0x8f, 0x17, 0xef, 0x3e, 0x64, 0x10, 0xa8, 0xac, 0xf1, 0x23, 0x38, 0x60, 0x83, 0x1b, 0x75, - 0xd9, 0x59, 0xdf, 0xe6, 0x91, 0x0f, 0x65, 0xb6, 0x26, 0x53, 0xa6, 0x10, 0x2b, 0x0c, 0x36, 0xa8, - 0xec, 0x5f, 0x80, 0x73, 0xd9, 0x1b, 0x30, 0xc4, 0xb6, 0x65, 0x23, 0x0a, 0xdb, 0xad, 0xec, 0x9a, - 0x84, 0xdd, 0x90, 0x80, 0x39, 0x8e, 0xae, 0x49, 0xf6, 0xbc, 0xa0, 0x96, 0x5d, 0x93, 0xdc, 0xf4, - 0x82, 0x1a, 0x66, 0x98, 0x01, 0x2a, 0x7d, 0xff, 0x2b, 0x0b, 0x2e, 0x1f, 0x77, 0x51, 0x07, 0x7a, - 0x0e, 0x46, 0xee, 0x39, 0x91, 0xac, 0x03, 0xc6, 0x6c, 0xc7, 0x1d, 0x27, 0x0a, 0x30, 0x83, 0xa2, - 0x0e, 0x8c, 0xf2, 0xe4, 0x38, 0xe1, 0xc0, 0xbe, 0x99, 0xef, 0xb5, 0x21, 0x37, 0x89, 0xe1, 0x41, - 0xf3, 0xc4, 0x3c, 0x2c, 0x04, 0xda, 0xef, 0x5a, 0x80, 0x36, 0xf6, 0x49, 0x14, 0x79, 0x35, 0x23, - 0x9d, 0x0f, 0xbd, 0x0a, 0x13, 0x77, 0xb7, 0x36, 0xd6, 0x37, 0x43, 0x2f, 0x60, 0x15, 0x0b, 0x8c, - 0xc4, 0x8e, 0x1b, 0x06, 0x1c, 0xa7, 0xa8, 0xd0, 0x22, 0x4c, 0xdf, 0x7d, 0x9b, 0xae, 0xa3, 0xae, - 0x1e, 0xb4, 0x22, 0x12, 0xc7, 0xca, 0x27, 0x17, 0x3b, 0x67, 0x37, 0xde, 0xcc, 0x20, 0x71, 0x37, - 0x3d, 0xda, 0x80, 0x0b, 0x4d, 0xee, 0x81, 0xb3, 0xe5, 0x63, 0xcc, 0xdd, 0xf1, 0x48, 0xa6, 0x84, - 0x3f, 0x73, 0x74, 0x38, 0x7b, 0x61, 0xad, 0x17, 0x01, 0xee, 0xfd, 0x9c, 0xfd, 0xad, 0x02, 0x8c, - 0x1b, 0x97, 0xdd, 0x0c, 0xb0, 0x50, 0xce, 0xdc, 0xcf, 0x53, 0x18, 0xf0, 0x7e, 0x9e, 0x17, 0xa1, - 0xdc, 0x0a, 0x7d, 0xcf, 0xf5, 0x54, 0xfe, 0x3a, 0xab, 0xa3, 0xb4, 0x29, 0x60, 0x58, 0x61, 0xd1, - 0x3d, 0xa8, 0xa8, 0x0b, 0x20, 0x44, 0x46, 0x5b, 0x5e, 0x5b, 0x05, 0x6a, 0xf0, 0xea, 0x8b, 0x1d, - 0xb4, 0x2c, 0x64, 0xc3, 0x28, 0xeb, 0xf9, 0x32, 0x26, 0x88, 0xa5, 0x2d, 0xb0, 0x21, 0x11, 0x63, - 0x81, 0xb1, 0x7f, 0x65, 0x0c, 0xce, 0xf7, 0xaa, 0xfd, 0x83, 0x7e, 0x0e, 0x46, 0xb9, 0x8e, 0xf9, - 0x94, 0x97, 0xeb, 0x25, 0x63, 0x99, 0x31, 0x14, 0x6a, 0xb1, 0xdf, 0x58, 0xc8, 0x14, 0xd2, 0x7d, - 0x67, 0x47, 0xb8, 0x11, 0xa7, 0x23, 0x7d, 0xd5, 0xd1, 0xd2, 0x57, 0x1d, 0x2e, 0xdd, 0x77, 0x76, - 0xd0, 0x01, 0x94, 0x1a, 0x5e, 0x42, 0x1c, 0xe1, 0x4c, 0xdf, 0x39, 0x15, 0xe1, 0xc4, 0xe1, 0xa1, - 0xe7, 0xec, 0x27, 0xe6, 0x02, 0xd1, 0x37, 0x2c, 0x38, 0xb3, 0x93, 0xce, 0x02, 0x11, 0xb3, 0x8a, - 0x73, 0x0a, 0xf5, 0x9d, 0xd2, 0x82, 0xaa, 0xe7, 0x8e, 0x0e, 0x67, 0xcf, 0x64, 0x80, 0x38, 0xab, - 0x0e, 0xfa, 0x25, 0x0b, 0xc6, 0xea, 0x9e, 0x6f, 0xd4, 0x36, 0x39, 0x85, 0x8f, 0x73, 0x8d, 0x09, - 0xd0, 0x33, 0x2f, 0xff, 0x1f, 0x63, 0x29, 0xb9, 0xdf, 0x59, 0xdc, 0xe8, 0x49, 0xcf, 0xe2, 0xc6, - 0x1e, 0xd3, 0xf2, 0xe9, 0xef, 0x16, 0xe0, 0x85, 0x01, 0xbe, 0x91, 0x99, 0x55, 0x60, 0x1d, 0x93, - 0x55, 0x70, 0x19, 0x46, 0x22, 0xd2, 0x0a, 0xb3, 0xf3, 0x1d, 0x0b, 0xfb, 0x61, 0x18, 0xf4, 0x3c, - 0x14, 0x9d, 0x96, 0x27, 0xa6, 0x3b, 0x75, 0x54, 0xbf, 0xb0, 0xb9, 0x82, 0x29, 0x9c, 0x7e, 0xe9, - 0xca, 0x8e, 0xcc, 0x4d, 0xca, 0xa7, 0x60, 0x68, 0xbf, 0x54, 0x27, 0xbe, 0xa0, 0x51, 0x58, 0xac, - 0xe5, 0xda, 0x1b, 0x70, 0xb1, 0x7f, 0x0f, 0x41, 0xaf, 0xc0, 0xf8, 0x4e, 0xe4, 0x04, 0xee, 0xee, - 0x9a, 0x93, 0xb8, 0xf2, 0xc0, 0x9c, 0x05, 0x3f, 0x56, 0x35, 0x18, 0x9b, 0x34, 0xf6, 0xb7, 0x0b, - 0xbd, 0x39, 0x72, 0x23, 0x30, 0x4c, 0x0b, 0x8b, 0xf6, 0x2b, 0xf4, 0x69, 0xbf, 0xb7, 0xa1, 0x9c, - 0xb0, 0x50, 0x76, 0x52, 0x17, 0x96, 0x24, 0xb7, 0x6c, 0x2c, 0x36, 0xd7, 0x6c, 0x0b, 0xe6, 0x58, - 0x89, 0xa1, 0x26, 0xdf, 0xd7, 0x65, 0x51, 0x84, 0xc9, 0xcf, 0xec, 0xa3, 0x2d, 0xc1, 0x59, 0xa3, - 0x8c, 0x1b, 0x8f, 0xe4, 0xe5, 0xc7, 0xa8, 0x2a, 0xbd, 0x65, 0x33, 0x83, 0xc7, 0x5d, 0x4f, 0xd8, - 0xdf, 0x2c, 0xc0, 0x33, 0x7d, 0x2d, 0x9b, 0x3e, 0xeb, 0xb5, 0x1e, 0x70, 0xd6, 0x7b, 0xe2, 0x0e, - 0x6a, 0x36, 0xf0, 0xc8, 0xa3, 0x69, 0xe0, 0x97, 0xa0, 0xec, 0x05, 0x31, 0x71, 0xdb, 0x11, 0x6f, - 0x34, 0x23, 0xa6, 0x6e, 0x45, 0xc0, 0xb1, 0xa2, 0xb0, 0xff, 0xa0, 0x7f, 0x57, 0xa3, 0xb3, 0xdc, - 0x0f, 0x6d, 0x2b, 0xbd, 0x0e, 0x93, 0x4e, 0xab, 0xc5, 0xe9, 0xd8, 0xb9, 0x5a, 0x26, 0x61, 0x6d, - 0xc1, 0x44, 0xe2, 0x34, 0xad, 0xd1, 0x87, 0x47, 0xfb, 0xf5, 0x61, 0xfb, 0x4f, 0x4b, 0x50, 0xa1, - 0x2d, 0xb0, 0x18, 0x91, 0x5a, 0x4c, 0x1b, 0xa0, 0x1d, 0xf9, 0xa2, 0x15, 0x55, 0x03, 0xdc, 0xc2, - 0xab, 0x98, 0xc2, 0x53, 0xab, 0xe4, 0xc2, 0x50, 0xf9, 0x2c, 0xc5, 0x63, 0xf3, 0x59, 0x5e, 0x87, - 0xc9, 0x38, 0xde, 0xdd, 0x8c, 0xbc, 0x7d, 0x27, 0xa1, 0xbe, 0xb7, 0x88, 0x5b, 0xd0, 0x31, 0xe8, - 0x5b, 0xd7, 0x35, 0x12, 0xa7, 0x69, 0xd1, 0x32, 0x4c, 0xeb, 0xac, 0x12, 0x12, 0x25, 0x2c, 0x4c, - 0x81, 0x37, 0x95, 0x0a, 0x01, 0xd7, 0x79, 0x28, 0x82, 0x00, 0x77, 0x3f, 0x43, 0x87, 0x74, 0x0a, - 0x48, 0x15, 0x19, 0x4d, 0x0f, 0xe9, 0x14, 0x1f, 0xaa, 0x4b, 0xd7, 0x13, 0x68, 0x0d, 0xce, 0xf1, - 0x7e, 0xc1, 0xee, 0x3b, 0x53, 0x6f, 0x34, 0xc6, 0x18, 0x3d, 0x2b, 0x18, 0x9d, 0x5b, 0xee, 0x26, - 0xc1, 0xbd, 0x9e, 0xa3, 0x8e, 0xb5, 0x02, 0xaf, 0x2c, 0x89, 0x05, 0x9e, 0x72, 0xac, 0x15, 0x9b, - 0x95, 0x1a, 0x36, 0xe9, 0xd0, 0x47, 0xe1, 0x69, 0xfd, 0x97, 0x47, 0x73, 0xf1, 0x5d, 0x8f, 0x25, - 0x91, 0xb0, 0xa7, 0x4a, 0x88, 0x2d, 0xf7, 0x24, 0xab, 0xe1, 0x7e, 0xcf, 0xa3, 0x1d, 0xb8, 0xa8, - 0x50, 0x57, 0xe9, 0x2a, 0xa6, 0x15, 0x79, 0x31, 0xa9, 0x3a, 0x31, 0xb9, 0x15, 0xf9, 0x2c, 0xc5, - 0xaf, 0xa2, 0x8b, 0x1d, 0x2f, 0x7b, 0xc9, 0xf5, 0x5e, 0x94, 0x78, 0x15, 0x3f, 0x80, 0x0b, 0x9a, - 0x87, 0x0a, 0x09, 0x9c, 0x1d, 0x9f, 0x6c, 0x2c, 0xae, 0xb0, 0xc4, 0x3f, 0x63, 0x93, 0xe5, 0xaa, - 0x44, 0x60, 0x4d, 0xa3, 0x8e, 0xca, 0x26, 0xfa, 0x1e, 0x95, 0xfd, 0x91, 0x05, 0x93, 0xaa, 0xb3, - 0x3f, 0x82, 0x98, 0x14, 0x3f, 0x1d, 0x93, 0xb2, 0x7c, 0xd2, 0xdd, 0x2d, 0xa1, 0x79, 0x9f, 0x83, - 0xcd, 0x3f, 0xa9, 0x00, 0xb0, 0xab, 0x5b, 0x3d, 0x56, 0x83, 0x43, 0x9a, 0x3b, 0xab, 0xaf, 0xb9, - 0x7b, 0x62, 0x87, 0x73, 0xaf, 0x14, 0x99, 0xd2, 0xe3, 0x4d, 0x91, 0xd9, 0x82, 0x0b, 0x72, 0x32, - 0xe2, 0x0b, 0xfe, 0xeb, 0x61, 0xac, 0xac, 0x43, 0xb9, 0xfa, 0xbc, 0x60, 0x74, 0x61, 0xa5, 0x17, - 0x11, 0xee, 0xfd, 0x6c, 0x6a, 0x0e, 0x1c, 0x3b, 0x6e, 0x0e, 0xd4, 0x03, 0x62, 0xb5, 0x2e, 0xab, - 0x79, 0x65, 0x06, 0xc4, 0xea, 0xb5, 0x2d, 0xac, 0x69, 0x7a, 0x5b, 0xc5, 0x4a, 0x4e, 0x56, 0x11, - 0x86, 0xb6, 0x8a, 0x72, 0x7c, 0x8e, 0xf7, 0xbd, 0x33, 0x4f, 0xee, 0x31, 0x4c, 0xf4, 0xdd, 0x63, - 0x78, 0x03, 0xa6, 0xbc, 0x60, 0x97, 0x44, 0x5e, 0x42, 0x6a, 0x6c, 0x2c, 0x88, 0x0b, 0x31, 0x55, - 0x24, 0xc8, 0x4a, 0x0a, 0x8b, 0x33, 0xd4, 0x69, 0xa3, 0x32, 0x35, 0x80, 0x51, 0xe9, 0x63, 0xca, - 0xcf, 0xe4, 0x63, 0xca, 0xcf, 0x9e, 0xdc, 0x94, 0x4f, 0x9f, 0xaa, 0x29, 0x47, 0xb9, 0x98, 0xf2, - 0x17, 0xa0, 0xd4, 0x8a, 0xc2, 0x83, 0xce, 0xcc, 0xb9, 0xb4, 0x7b, 0xb6, 0x49, 0x81, 0x98, 0xe3, - 0xcc, 0xe5, 0xc2, 0xf9, 0x07, 0x2f, 0x17, 0xec, 0xcf, 0x15, 0xe0, 0x82, 0xb6, 0x74, 0xb4, 0x7f, - 0x79, 0x75, 0x3a, 0xd6, 0x59, 0xc9, 0x45, 0x1e, 0x4e, 0x60, 0x04, 0x21, 0xe9, 0x78, 0x26, 0x85, + // 9124 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x1c, 0xc9, + 0x75, 0xd8, 0xcd, 0x2e, 0x16, 0xd8, 0x7d, 0xf8, 0x20, 0xd1, 0x24, 0xef, 0x70, 0xbc, 0x3b, 0x82, + 0x35, 0x57, 0x96, 0xce, 0xd1, 0x1d, 0x90, 0xa3, 0x4f, 0xca, 0xc5, 0x67, 0x9f, 0x8c, 0x05, 0x48, + 0x10, 0x24, 0x40, 0xe0, 0x1a, 0x20, 0x69, 0x9d, 0xac, 0x8f, 0xc1, 0x6c, 0xef, 0x62, 0x88, 0xdd, + 0x99, 0xe1, 0xcc, 0x2c, 0x88, 0x3d, 0x7f, 0x49, 0xf2, 0x97, 0x12, 0x7d, 0x46, 0x4a, 0x55, 0xe4, + 0xaa, 0x54, 0xa2, 0xc8, 0x2e, 0x57, 0x5c, 0x89, 0x2a, 0x4e, 0xe5, 0x47, 0xbe, 0x2a, 0x3f, 0x6c, + 0xe5, 0x87, 0x52, 0x4e, 0x55, 0x54, 0x15, 0x97, 0xe5, 0xc4, 0x09, 0x7c, 0x42, 0x2a, 0xe5, 0xc4, + 0x55, 0x71, 0x2a, 0x8e, 0xfe, 0x84, 0x95, 0x1f, 0xae, 0xfe, 0xee, 0x99, 0xdd, 0x25, 0x76, 0x89, + 0x01, 0x49, 0xa9, 0xee, 0xdf, 0xee, 0x7b, 0x6f, 0xde, 0x7b, 0xd3, 0xd3, 0xfd, 0xfa, 0x75, 0xf7, + 0x7b, 0xaf, 0x61, 0xb5, 0xe1, 0x25, 0x3b, 0xed, 0xed, 0x39, 0x37, 0x68, 0xcd, 0x3b, 0x51, 0x23, + 0x08, 0xa3, 0xe0, 0x0e, 0xfb, 0xf1, 0x8a, 0x5b, 0x9b, 0xdf, 0xbb, 0x34, 0x1f, 0xee, 0x36, 0xe6, + 0x9d, 0xd0, 0x8b, 0xe7, 0x9d, 0x30, 0x6c, 0x7a, 0xae, 0x93, 0x78, 0x81, 0x3f, 0xbf, 0xf7, 0xaa, + 0xd3, 0x0c, 0x77, 0x9c, 0x57, 0xe7, 0x1b, 0xc4, 0x27, 0x91, 0x93, 0x90, 0xda, 0x5c, 0x18, 0x05, + 0x49, 0x80, 0x7e, 0x42, 0x73, 0x9b, 0x93, 0xdc, 0xd8, 0x8f, 0x4f, 0xb8, 0xb5, 0xb9, 0xbd, 0x4b, + 0x73, 0xe1, 0x6e, 0x63, 0x8e, 0x72, 0x9b, 0x33, 0xb8, 0xcd, 0x49, 0x6e, 0xe7, 0x5f, 0x31, 0x74, + 0x69, 0x04, 0x8d, 0x60, 0x9e, 0x31, 0xdd, 0x6e, 0xd7, 0xd9, 0x3f, 0xf6, 0x87, 0xfd, 0xe2, 0xc2, + 0xce, 0xdb, 0xbb, 0xaf, 0xc7, 0x73, 0x5e, 0x40, 0xd5, 0x9b, 0x77, 0x83, 0x88, 0xcc, 0xef, 0x75, + 0x29, 0x74, 0xfe, 0xaa, 0xa6, 0x21, 0xfb, 0x09, 0xf1, 0x63, 0x2f, 0xf0, 0xe3, 0x57, 0xa8, 0x0a, + 0x24, 0xda, 0x23, 0x91, 0xf9, 0x7a, 0x06, 0x41, 0x2f, 0x4e, 0xaf, 0x69, 0x4e, 0x2d, 0xc7, 0xdd, + 0xf1, 0x7c, 0x12, 0x75, 0xf4, 0xe3, 0x2d, 0x92, 0x38, 0xbd, 0x9e, 0x9a, 0xef, 0xf7, 0x54, 0xd4, + 0xf6, 0x13, 0xaf, 0x45, 0xba, 0x1e, 0xf8, 0xd0, 0x51, 0x0f, 0xc4, 0xee, 0x0e, 0x69, 0x39, 0xd9, + 0xe7, 0xec, 0xbb, 0x30, 0xb9, 0x70, 0x7b, 0x73, 0xa1, 0x9d, 0xec, 0x2c, 0x06, 0x7e, 0xdd, 0x6b, + 0xa0, 0x0f, 0xc2, 0xb8, 0xdb, 0x6c, 0xc7, 0x09, 0x89, 0x6e, 0x38, 0x2d, 0x32, 0x63, 0x5d, 0xb4, + 0x5e, 0xaa, 0x54, 0xcf, 0x7c, 0xfb, 0x60, 0xf6, 0xa9, 0xc3, 0x83, 0xd9, 0xf1, 0x45, 0x8d, 0xc2, + 0x26, 0x1d, 0xfa, 0x51, 0x18, 0x8b, 0x82, 0x26, 0x59, 0xc0, 0x37, 0x66, 0x0a, 0xec, 0x91, 0x53, + 0xe2, 0x91, 0x31, 0xcc, 0xc1, 0x58, 0xe2, 0xed, 0x3f, 0x2c, 0x00, 0x2c, 0x84, 0xe1, 0x46, 0x14, + 0xdc, 0x21, 0x6e, 0x82, 0x3e, 0x09, 0x65, 0xda, 0x0a, 0x35, 0x27, 0x71, 0x98, 0xb4, 0xf1, 0x4b, + 0x7f, 0x75, 0x8e, 0xbf, 0xcc, 0x9c, 0xf9, 0x32, 0xba, 0x0f, 0x50, 0xea, 0xb9, 0xbd, 0x57, 0xe7, + 0xd6, 0xb7, 0xe9, 0xf3, 0x6b, 0x24, 0x71, 0xaa, 0x48, 0x08, 0x03, 0x0d, 0xc3, 0x8a, 0x2b, 0xf2, + 0x61, 0x24, 0x0e, 0x89, 0xcb, 0x14, 0x1b, 0xbf, 0xb4, 0x3a, 0x77, 0x9c, 0xce, 0x36, 0xa7, 0x35, + 0xdf, 0x0c, 0x89, 0x5b, 0x9d, 0x10, 0x92, 0x47, 0xe8, 0x3f, 0xcc, 0xe4, 0xa0, 0x3d, 0x18, 0x8d, + 0x13, 0x27, 0x69, 0xc7, 0x33, 0x45, 0x26, 0xf1, 0x46, 0x6e, 0x12, 0x19, 0xd7, 0xea, 0x94, 0x90, + 0x39, 0xca, 0xff, 0x63, 0x21, 0xcd, 0xfe, 0xaf, 0x16, 0x4c, 0x69, 0xe2, 0x55, 0x2f, 0x4e, 0xd0, + 0xcf, 0x74, 0x35, 0xee, 0xdc, 0x60, 0x8d, 0x4b, 0x9f, 0x66, 0x4d, 0x7b, 0x5a, 0x08, 0x2b, 0x4b, + 0x88, 0xd1, 0xb0, 0x2d, 0x28, 0x79, 0x09, 0x69, 0xc5, 0x33, 0x85, 0x8b, 0xc5, 0x97, 0xc6, 0x2f, + 0x5d, 0xcd, 0xeb, 0x3d, 0xab, 0x93, 0x42, 0x68, 0x69, 0x85, 0xb2, 0xc7, 0x5c, 0x8a, 0xfd, 0xdb, + 0x13, 0xe6, 0xfb, 0xd1, 0x06, 0x47, 0xaf, 0xc2, 0x78, 0x1c, 0xb4, 0x23, 0x97, 0x60, 0x12, 0x06, + 0xf1, 0x8c, 0x75, 0xb1, 0x48, 0xbb, 0x1e, 0xed, 0xa9, 0x9b, 0x1a, 0x8c, 0x4d, 0x1a, 0xf4, 0x45, + 0x0b, 0x26, 0x6a, 0x24, 0x4e, 0x3c, 0x9f, 0xc9, 0x97, 0xca, 0x6f, 0x1d, 0x5b, 0x79, 0x09, 0x5c, + 0xd2, 0xcc, 0xab, 0x67, 0xc5, 0x8b, 0x4c, 0x18, 0xc0, 0x18, 0xa7, 0xe4, 0xd3, 0x11, 0x57, 0x23, + 0xb1, 0x1b, 0x79, 0x21, 0xfd, 0xcf, 0xfa, 0x8c, 0x31, 0xe2, 0x96, 0x34, 0x0a, 0x9b, 0x74, 0xc8, + 0x87, 0x12, 0x1d, 0x51, 0xf1, 0xcc, 0x08, 0xd3, 0x7f, 0xe5, 0x78, 0xfa, 0x8b, 0x46, 0xa5, 0x83, + 0x55, 0xb7, 0x3e, 0xfd, 0x17, 0x63, 0x2e, 0x06, 0x7d, 0xc1, 0x82, 0x19, 0x31, 0xe2, 0x31, 0xe1, + 0x0d, 0x7a, 0x7b, 0xc7, 0x4b, 0x48, 0xd3, 0x8b, 0x93, 0x99, 0x12, 0xd3, 0x61, 0x7e, 0xb0, 0xbe, + 0xb5, 0x1c, 0x05, 0xed, 0xf0, 0xba, 0xe7, 0xd7, 0xaa, 0x17, 0x85, 0xa4, 0x99, 0xc5, 0x3e, 0x8c, + 0x71, 0x5f, 0x91, 0xe8, 0xab, 0x16, 0x9c, 0xf7, 0x9d, 0x16, 0x89, 0x43, 0x87, 0x7e, 0x5a, 0x8e, + 0xae, 0x36, 0x1d, 0x77, 0x97, 0x69, 0x34, 0xfa, 0x70, 0x1a, 0xd9, 0x42, 0xa3, 0xf3, 0x37, 0xfa, + 0xb2, 0xc6, 0x0f, 0x10, 0x8b, 0x7e, 0xc3, 0x82, 0xe9, 0x20, 0x0a, 0x77, 0x1c, 0x9f, 0xd4, 0x24, + 0x36, 0x9e, 0x19, 0x63, 0x43, 0xef, 0xe3, 0xc7, 0xfb, 0x44, 0xeb, 0x59, 0xb6, 0x6b, 0x81, 0xef, + 0x25, 0x41, 0xb4, 0x49, 0x92, 0xc4, 0xf3, 0x1b, 0x71, 0xf5, 0xdc, 0xe1, 0xc1, 0xec, 0x74, 0x17, + 0x15, 0xee, 0xd6, 0x07, 0xfd, 0x2c, 0x8c, 0xc7, 0x1d, 0xdf, 0xbd, 0xed, 0xf9, 0xb5, 0xe0, 0x5e, + 0x3c, 0x53, 0xce, 0x63, 0xf8, 0x6e, 0x2a, 0x86, 0x62, 0x00, 0x6a, 0x01, 0xd8, 0x94, 0xd6, 0xfb, + 0xc3, 0xe9, 0xae, 0x54, 0xc9, 0xfb, 0xc3, 0xe9, 0xce, 0xf4, 0x00, 0xb1, 0xe8, 0xd7, 0x2c, 0x98, + 0x8c, 0xbd, 0x86, 0xef, 0x24, 0xed, 0x88, 0x5c, 0x27, 0x9d, 0x78, 0x06, 0x98, 0x22, 0xd7, 0x8e, + 0xd9, 0x2a, 0x06, 0xcb, 0xea, 0x39, 0xa1, 0xe3, 0xa4, 0x09, 0x8d, 0x71, 0x5a, 0x6e, 0xaf, 0x81, + 0xa6, 0xbb, 0xf5, 0x78, 0xbe, 0x03, 0x4d, 0x77, 0xea, 0xbe, 0x22, 0xd1, 0x4f, 0xc1, 0x69, 0x0e, + 0x52, 0x2d, 0x1b, 0xcf, 0x4c, 0x30, 0x43, 0x7b, 0xf6, 0xf0, 0x60, 0xf6, 0xf4, 0x66, 0x06, 0x87, + 0xbb, 0xa8, 0xd1, 0x5d, 0x98, 0x0d, 0x49, 0xd4, 0xf2, 0x92, 0x75, 0xbf, 0xd9, 0x91, 0xe6, 0xdb, + 0x0d, 0x42, 0x52, 0x13, 0xea, 0xc4, 0x33, 0x93, 0x17, 0xad, 0x97, 0xca, 0xd5, 0xf7, 0x0b, 0x35, + 0x67, 0x37, 0x1e, 0x4c, 0x8e, 0x8f, 0xe2, 0x67, 0xff, 0xbb, 0x02, 0x9c, 0xce, 0x4e, 0x9c, 0xe8, + 0xb7, 0x2c, 0x38, 0x75, 0xe7, 0x5e, 0xb2, 0x15, 0xec, 0x12, 0x3f, 0xae, 0x76, 0xa8, 0x79, 0x63, + 0x53, 0xc6, 0xf8, 0x25, 0x37, 0xdf, 0x29, 0x7a, 0xee, 0x5a, 0x5a, 0xca, 0x65, 0x3f, 0x89, 0x3a, + 0xd5, 0x67, 0xc4, 0xdb, 0x9d, 0xba, 0x76, 0x7b, 0xcb, 0xc4, 0xe2, 0xac, 0x52, 0xe7, 0x3f, 0x67, + 0xc1, 0xd9, 0x5e, 0x2c, 0xd0, 0x69, 0x28, 0xee, 0x92, 0x0e, 0xf7, 0xca, 0x30, 0xfd, 0x89, 0x3e, + 0x06, 0xa5, 0x3d, 0xa7, 0xd9, 0x26, 0xc2, 0xbb, 0x59, 0x3e, 0xde, 0x8b, 0x28, 0xcd, 0x30, 0xe7, + 0xfa, 0xe3, 0x85, 0xd7, 0x2d, 0xfb, 0x3f, 0x14, 0x61, 0xdc, 0x98, 0xdf, 0x1e, 0x81, 0xc7, 0x16, + 0xa4, 0x3c, 0xb6, 0xb5, 0xdc, 0xa6, 0xe6, 0xbe, 0x2e, 0xdb, 0xbd, 0x8c, 0xcb, 0xb6, 0x9e, 0x9f, + 0xc8, 0x07, 0xfa, 0x6c, 0x28, 0x81, 0x4a, 0x10, 0x52, 0x8f, 0x9c, 0x4e, 0xfd, 0x23, 0x79, 0x7c, + 0xc2, 0x75, 0xc9, 0xae, 0x3a, 0x79, 0x78, 0x30, 0x5b, 0x51, 0x7f, 0xb1, 0x16, 0x64, 0x7f, 0xd7, + 0x82, 0xb3, 0x86, 0x8e, 0x8b, 0x81, 0x5f, 0xf3, 0xd8, 0xa7, 0xbd, 0x08, 0x23, 0x49, 0x27, 0x94, + 0x6e, 0xbf, 0x6a, 0xa9, 0xad, 0x4e, 0x48, 0x30, 0xc3, 0x50, 0x47, 0xbf, 0x45, 0xe2, 0xd8, 0x69, + 0x90, 0xac, 0xa3, 0xbf, 0xc6, 0xc1, 0x58, 0xe2, 0x51, 0x04, 0xa8, 0xe9, 0xc4, 0xc9, 0x56, 0xe4, + 0xf8, 0x31, 0x63, 0xbf, 0xe5, 0xb5, 0x88, 0x68, 0xe0, 0xbf, 0x32, 0x58, 0x8f, 0xa1, 0x4f, 0x54, + 0x9f, 0x3e, 0x3c, 0x98, 0x45, 0xab, 0x5d, 0x9c, 0x70, 0x0f, 0xee, 0xf6, 0x57, 0x2d, 0x78, 0xba, + 0xb7, 0x2f, 0x86, 0xde, 0x07, 0xa3, 0x7c, 0xf5, 0x26, 0xde, 0x4e, 0x7f, 0x12, 0x06, 0xc5, 0x02, + 0x8b, 0xe6, 0xa1, 0xa2, 0xe6, 0x09, 0xf1, 0x8e, 0xd3, 0x82, 0xb4, 0xa2, 0x27, 0x17, 0x4d, 0x43, + 0x1b, 0x8d, 0xfe, 0x11, 0x9e, 0x9b, 0x6a, 0x34, 0xb6, 0x48, 0x62, 0x18, 0xfb, 0x4f, 0x2c, 0x38, + 0x65, 0x68, 0xf5, 0x08, 0x5c, 0x73, 0x3f, 0xed, 0x9a, 0xaf, 0xe4, 0xd6, 0x9f, 0xfb, 0xf8, 0xe6, + 0x87, 0x05, 0xe6, 0x9b, 0xab, 0x5e, 0x4f, 0x1e, 0xc5, 0xc2, 0x2e, 0x4a, 0x99, 0x89, 0x8d, 0xfc, + 0xc6, 0x2c, 0xe9, 0xbf, 0xb8, 0x7b, 0x27, 0x63, 0x29, 0x70, 0xae, 0x52, 0x1f, 0xbc, 0xc0, 0xfb, + 0xb3, 0x02, 0x3c, 0x93, 0x7e, 0x40, 0x8f, 0xdc, 0x0f, 0xa7, 0x46, 0xee, 0x07, 0xcc, 0x91, 0x7b, + 0xff, 0x60, 0xf6, 0xb9, 0x3e, 0x8f, 0xfd, 0xc0, 0x0c, 0x6c, 0xb4, 0xac, 0xda, 0x7d, 0x84, 0x69, + 0x37, 0x9f, 0x6e, 0xa3, 0xfb, 0x07, 0xb3, 0x2f, 0xf4, 0x79, 0xc7, 0x8c, 0xc5, 0x7d, 0x1f, 0x8c, + 0x46, 0xc4, 0x89, 0x03, 0x7f, 0xa6, 0x94, 0x36, 0x03, 0x98, 0x41, 0xb1, 0xc0, 0xda, 0x7f, 0x52, + 0xce, 0x36, 0xf6, 0x32, 0xdf, 0x3b, 0x09, 0x22, 0xe4, 0xc1, 0x08, 0xf3, 0xc6, 0x78, 0xb7, 0xbe, + 0x7e, 0xbc, 0x2e, 0x40, 0x47, 0xaf, 0x62, 0x5d, 0x2d, 0xd3, 0xaf, 0x46, 0x41, 0x98, 0x89, 0x40, + 0xfb, 0x50, 0x76, 0xa5, 0x93, 0x54, 0xc8, 0x63, 0x3b, 0x41, 0xb8, 0x48, 0x5a, 0xe2, 0x04, 0x35, + 0x21, 0xca, 0xb3, 0x52, 0xd2, 0x10, 0x81, 0x62, 0xc3, 0x4b, 0xc4, 0x67, 0x3d, 0xa6, 0x1b, 0xbc, + 0xec, 0x19, 0xaf, 0x38, 0x76, 0x78, 0x30, 0x5b, 0x5c, 0xf6, 0x12, 0x4c, 0xf9, 0xa3, 0x5f, 0xb1, + 0x60, 0x3c, 0x76, 0x5b, 0x1b, 0x51, 0xb0, 0xe7, 0xd5, 0x48, 0x24, 0x26, 0xc1, 0x63, 0x0e, 0xab, + 0xcd, 0xc5, 0x35, 0xc9, 0x50, 0xcb, 0xe5, 0xcb, 0x12, 0x8d, 0xc1, 0xa6, 0x5c, 0xea, 0x1c, 0x3e, + 0x23, 0xde, 0x7d, 0x89, 0xb8, 0x5e, 0x4c, 0xa7, 0x4c, 0xe1, 0x0b, 0xb3, 0x9e, 0x72, 0x6c, 0xa7, + 0x60, 0xa9, 0xed, 0xee, 0xd2, 0xf1, 0xa6, 0x15, 0x7a, 0xee, 0xf0, 0x60, 0xf6, 0x99, 0xc5, 0xde, + 0x32, 0x71, 0x3f, 0x65, 0x58, 0x83, 0x85, 0xed, 0x66, 0x13, 0x93, 0xbb, 0x6d, 0xc2, 0x56, 0xba, + 0x39, 0x34, 0xd8, 0x86, 0x66, 0x98, 0x69, 0x30, 0x03, 0x83, 0x4d, 0xb9, 0xe8, 0x2e, 0x8c, 0xb6, + 0x9c, 0x24, 0xf2, 0xf6, 0xc5, 0xf2, 0xf6, 0x98, 0x6e, 0xda, 0x1a, 0xe3, 0xa5, 0x85, 0x03, 0x1d, + 0x93, 0x1c, 0x88, 0x85, 0x20, 0xd4, 0x82, 0x52, 0x8b, 0x44, 0x0d, 0x32, 0x53, 0xce, 0x63, 0x2b, + 0x6f, 0x8d, 0xb2, 0xd2, 0x02, 0x2b, 0x74, 0x52, 0x63, 0x30, 0xcc, 0xa5, 0xa0, 0x8f, 0x41, 0x39, + 0x26, 0x4d, 0xe2, 0x26, 0x41, 0x34, 0x53, 0x61, 0x12, 0x7f, 0x6c, 0xc0, 0x29, 0xda, 0xd9, 0x26, + 0xcd, 0x4d, 0xf1, 0x28, 0x1f, 0x60, 0xf2, 0x1f, 0x56, 0x2c, 0xed, 0xff, 0x6e, 0x01, 0x4a, 0x5b, + 0x98, 0x47, 0xe0, 0x18, 0xdc, 0x4d, 0x3b, 0x06, 0xab, 0x79, 0x4e, 0x5f, 0x7d, 0x7c, 0x83, 0x6f, + 0x97, 0x21, 0x63, 0x9b, 0x6f, 0x90, 0x38, 0x21, 0xb5, 0xf7, 0xec, 0xe9, 0x7b, 0xf6, 0xf4, 0x3d, + 0x7b, 0xaa, 0xec, 0xe9, 0x76, 0xc6, 0x9e, 0xbe, 0x69, 0x8c, 0x7a, 0x7d, 0xc6, 0xf4, 0x09, 0x75, + 0x08, 0x65, 0x6a, 0x60, 0x10, 0x50, 0x4b, 0x70, 0x6d, 0x73, 0xfd, 0x46, 0x4f, 0x03, 0xfa, 0x89, + 0xb4, 0x01, 0x3d, 0xae, 0x88, 0x47, 0x6e, 0x32, 0x0f, 0x8b, 0x59, 0x93, 0xc9, 0x8e, 0x01, 0x2e, + 0x01, 0x34, 0x82, 0x2d, 0xd2, 0x0a, 0x9b, 0x4e, 0xc2, 0x5d, 0xe0, 0xb2, 0x5e, 0x3a, 0x2c, 0x2b, + 0x0c, 0x36, 0xa8, 0xd0, 0xdf, 0xb0, 0x00, 0x1a, 0xf2, 0xd3, 0x48, 0x73, 0x78, 0x33, 0x4f, 0x73, + 0xa8, 0x3f, 0xbc, 0xd6, 0x45, 0x09, 0xc4, 0x86, 0x70, 0xf4, 0x19, 0x0b, 0xca, 0x89, 0x54, 0x9f, + 0x1b, 0x88, 0xad, 0x3c, 0x35, 0x91, 0x2f, 0xad, 0x67, 0x06, 0xd5, 0x24, 0x4a, 0x2e, 0xfa, 0x55, + 0x0b, 0x20, 0xee, 0xf8, 0xee, 0x46, 0xd0, 0xf4, 0xdc, 0x8e, 0xb0, 0x1b, 0xb7, 0x72, 0x5d, 0xde, + 0x28, 0xee, 0xd5, 0x29, 0xda, 0x1a, 0xfa, 0x3f, 0x36, 0x24, 0xdb, 0xdf, 0x48, 0xef, 0x4e, 0xa8, + 0x75, 0x11, 0xfb, 0x64, 0xae, 0x74, 0xeb, 0x63, 0xb1, 0x75, 0x97, 0xeb, 0x27, 0x53, 0x8b, 0x06, + 0xfd, 0xc9, 0x14, 0x28, 0xc6, 0x86, 0x70, 0xfb, 0xd3, 0x16, 0xcc, 0xf4, 0x7b, 0x3b, 0x44, 0xe0, + 0xb9, 0x30, 0x22, 0x6c, 0x0c, 0xa9, 0x4d, 0xf7, 0x75, 0x7f, 0x89, 0x34, 0x09, 0xdb, 0xe7, 0xe1, + 0x1d, 0xf4, 0x45, 0x21, 0xe1, 0xb9, 0x8d, 0xfe, 0xa4, 0xf8, 0x41, 0x7c, 0xec, 0xdf, 0x2c, 0xa4, + 0x36, 0x3b, 0x8c, 0x0f, 0x8d, 0xbe, 0x66, 0x75, 0x79, 0x11, 0x3f, 0x7d, 0x12, 0x3d, 0x8a, 0xf9, + 0x1b, 0x6a, 0xef, 0xbd, 0x3f, 0xcd, 0x63, 0xdc, 0xdc, 0xb3, 0xff, 0xfd, 0x08, 0x3c, 0x40, 0x33, + 0xb5, 0x7d, 0x63, 0xf5, 0xdb, 0xbe, 0x19, 0x7e, 0x47, 0xe8, 0xf3, 0x16, 0x8c, 0x36, 0xa9, 0x41, + 0x8b, 0x67, 0x8a, 0xac, 0x93, 0xd6, 0x4e, 0xaa, 0xed, 0xb9, 0xdd, 0x8c, 0xf9, 0x06, 0xb3, 0x5a, + 0xca, 0x72, 0x20, 0x16, 0x3a, 0xa0, 0xaf, 0x5b, 0x30, 0xee, 0xf8, 0x7e, 0x90, 0x88, 0x13, 0x4f, + 0x7e, 0x62, 0xe8, 0x9d, 0x98, 0x4e, 0x0b, 0x5a, 0x16, 0x57, 0x4c, 0x9d, 0x66, 0x1a, 0x18, 0x6c, + 0xaa, 0x84, 0xe6, 0x00, 0xea, 0x9e, 0xef, 0x34, 0xbd, 0x77, 0xa8, 0x63, 0x56, 0x62, 0xc7, 0x0b, + 0xcc, 0x46, 0x5c, 0x51, 0x50, 0x6c, 0x50, 0x9c, 0xff, 0xeb, 0x30, 0x6e, 0xbc, 0x79, 0x8f, 0x7d, + 0xf1, 0xb3, 0xe6, 0xbe, 0x78, 0xc5, 0xd8, 0xce, 0x3e, 0xff, 0x26, 0x9c, 0xce, 0x2a, 0x38, 0xcc, + 0xf3, 0xf6, 0x6f, 0x8d, 0xc2, 0x6c, 0xf6, 0xe5, 0xa3, 0x16, 0x55, 0xed, 0x3d, 0x87, 0xf6, 0x3d, + 0x87, 0xf6, 0x3d, 0x87, 0x56, 0xfe, 0xb1, 0xbf, 0x55, 0x82, 0x69, 0x73, 0xa0, 0x70, 0xed, 0x7e, + 0x14, 0xc6, 0x22, 0x12, 0x06, 0x37, 0xf1, 0xaa, 0xb0, 0xb8, 0x3a, 0x52, 0x88, 0x83, 0xb1, 0xc4, + 0x53, 0xcb, 0x1c, 0x3a, 0xc9, 0x8e, 0x30, 0xb9, 0xca, 0x32, 0x6f, 0x38, 0xc9, 0x0e, 0x66, 0x18, + 0xf4, 0x26, 0x4c, 0x25, 0x4e, 0xd4, 0x20, 0x09, 0x26, 0x7b, 0xac, 0x11, 0xc4, 0xee, 0xe0, 0xd3, + 0x82, 0x76, 0x6a, 0x2b, 0x85, 0xc5, 0x19, 0x6a, 0x74, 0x17, 0x46, 0x76, 0x48, 0xb3, 0x25, 0x3c, + 0xee, 0xcd, 0xfc, 0x2c, 0x22, 0x7b, 0xd7, 0xab, 0xa4, 0xd9, 0xe2, 0xe3, 0x95, 0xfe, 0xc2, 0x4c, + 0x14, 0xfd, 0x3a, 0x95, 0xdd, 0x76, 0x9c, 0x04, 0x2d, 0xef, 0x1d, 0xe9, 0x87, 0xff, 0x74, 0xce, + 0x82, 0xaf, 0x4b, 0xfe, 0xfc, 0x0c, 0x48, 0xfd, 0xc5, 0x5a, 0x32, 0xd3, 0xa3, 0xe6, 0x45, 0xcc, + 0xaf, 0xee, 0xcc, 0xc0, 0x89, 0xe8, 0xb1, 0x24, 0xf9, 0x73, 0x3d, 0xd4, 0x5f, 0xac, 0x25, 0xa3, + 0x0e, 0x8c, 0x86, 0xcd, 0x76, 0xc3, 0xf3, 0x67, 0xc6, 0x99, 0x0e, 0x37, 0x73, 0xd6, 0x61, 0x83, + 0x31, 0xe7, 0xab, 0x21, 0xfe, 0x1b, 0x0b, 0x81, 0xe8, 0x45, 0x28, 0xb9, 0x3b, 0x4e, 0x94, 0xcc, + 0x4c, 0xb0, 0x4e, 0xa3, 0x76, 0x2f, 0x16, 0x29, 0x10, 0x73, 0x9c, 0xfd, 0x0f, 0x0a, 0x69, 0xef, + 0x21, 0xfd, 0x62, 0xbc, 0x3b, 0xbb, 0xed, 0x28, 0x96, 0xeb, 0x0e, 0xa3, 0x3b, 0x33, 0x30, 0x96, + 0x78, 0xf4, 0x69, 0x0b, 0xc6, 0xee, 0xc4, 0x81, 0xef, 0x93, 0x44, 0x58, 0xea, 0x5b, 0x39, 0xbf, + 0xeb, 0x35, 0xce, 0x5d, 0xeb, 0x20, 0x00, 0x58, 0xca, 0xa5, 0xea, 0x92, 0x7d, 0xb7, 0xd9, 0xae, + 0xc9, 0xe3, 0x2a, 0x45, 0x7a, 0x99, 0x83, 0xb1, 0xc4, 0x53, 0x52, 0xcf, 0xe7, 0xa4, 0x23, 0x69, + 0xd2, 0x15, 0x5f, 0x90, 0x0a, 0xbc, 0xfd, 0x3b, 0x25, 0x38, 0xd7, 0xb3, 0xf7, 0xd3, 0x79, 0x9d, + 0xcd, 0x9c, 0x57, 0xbc, 0x26, 0x91, 0xf1, 0x59, 0x6c, 0x5e, 0xbf, 0xa5, 0xa0, 0xd8, 0xa0, 0x40, + 0xbf, 0x08, 0x10, 0x3a, 0x91, 0xd3, 0x22, 0x62, 0x3e, 0x2b, 0x1e, 0x7f, 0xfa, 0xa4, 0x7a, 0x6c, + 0x48, 0x9e, 0xda, 0xaf, 0x57, 0xa0, 0x18, 0x1b, 0x22, 0xd1, 0x07, 0x61, 0x3c, 0x22, 0x4d, 0xe2, + 0xc4, 0x2c, 0x80, 0x21, 0x1b, 0x8d, 0x85, 0x35, 0x0a, 0x9b, 0x74, 0xe8, 0x7d, 0x30, 0xca, 0xde, + 0x42, 0x1e, 0x4f, 0x28, 0x57, 0x8c, 0xbd, 0x67, 0x8c, 0x05, 0x16, 0x7d, 0xc9, 0x82, 0xa9, 0xba, + 0xd7, 0x24, 0x5a, 0xba, 0x88, 0x9d, 0x5a, 0x3f, 0xfe, 0x4b, 0x5e, 0x31, 0xf9, 0x6a, 0x13, 0x98, + 0x02, 0xc7, 0x38, 0x23, 0x9e, 0x7e, 0xe6, 0x3d, 0x12, 0x31, 0xdb, 0x39, 0x9a, 0xfe, 0xcc, 0xb7, + 0x38, 0x18, 0x4b, 0x3c, 0x5a, 0x80, 0x53, 0xa1, 0x13, 0xc7, 0x8b, 0x11, 0xa9, 0x11, 0x3f, 0xf1, + 0x9c, 0x26, 0x8f, 0x6c, 0x2a, 0xeb, 0xc8, 0x86, 0x8d, 0x34, 0x1a, 0x67, 0xe9, 0xd1, 0x47, 0xe0, + 0x19, 0xaf, 0xe1, 0x07, 0x11, 0x59, 0xf3, 0xe2, 0xd8, 0xf3, 0x1b, 0xba, 0x1b, 0x30, 0x53, 0x58, + 0xae, 0xce, 0x0a, 0x56, 0xcf, 0xac, 0xf4, 0x26, 0xc3, 0xfd, 0x9e, 0x47, 0x2f, 0x43, 0x39, 0xde, + 0xf5, 0xc2, 0xc5, 0xa8, 0x16, 0xb3, 0xad, 0x87, 0xb2, 0x5e, 0xed, 0x6e, 0x0a, 0x38, 0x56, 0x14, + 0xf6, 0xaf, 0x17, 0xd2, 0xeb, 0x37, 0x73, 0xfc, 0xa0, 0x98, 0x8e, 0x92, 0xe4, 0x96, 0x13, 0xc9, + 0x45, 0xe6, 0x31, 0x63, 0xa3, 0x04, 0xdf, 0x5b, 0x4e, 0x64, 0x8e, 0x37, 0x26, 0x00, 0x4b, 0x49, + 0xe8, 0x0e, 0x8c, 0x24, 0x4d, 0x27, 0xa7, 0x60, 0x4a, 0x43, 0xa2, 0x3e, 0xc5, 0x5f, 0x5d, 0x88, + 0x31, 0x93, 0x81, 0x9e, 0xa7, 0xfe, 0xe9, 0x36, 0x5f, 0x9d, 0x54, 0xa4, 0x4b, 0xb9, 0x1d, 0x63, + 0x06, 0xb5, 0xff, 0xf7, 0x68, 0x0f, 0x93, 0xa7, 0x26, 0x11, 0x74, 0x09, 0x80, 0x2e, 0x75, 0x36, + 0x22, 0x52, 0xf7, 0xf6, 0xc5, 0x24, 0xae, 0x86, 0xd5, 0x0d, 0x85, 0xc1, 0x06, 0x95, 0x7c, 0x66, + 0xb3, 0x5d, 0xa7, 0xcf, 0x14, 0xba, 0x9f, 0xe1, 0x18, 0x6c, 0x50, 0xa1, 0xd7, 0x60, 0xd4, 0x6b, + 0x39, 0x0d, 0x22, 0xd5, 0x7c, 0x9e, 0x8e, 0xa7, 0x15, 0x06, 0xb9, 0x7f, 0x30, 0x3b, 0xa5, 0x14, + 0x62, 0x20, 0x2c, 0x68, 0xd1, 0x6f, 0x5a, 0x30, 0xe1, 0x06, 0xad, 0x56, 0xe0, 0xf3, 0x05, 0x82, + 0x58, 0xed, 0xdc, 0x39, 0xa9, 0x29, 0x76, 0x6e, 0xd1, 0x10, 0xc6, 0x97, 0x3b, 0x2a, 0xea, 0xd3, + 0x44, 0xe1, 0x94, 0x56, 0xe6, 0xb0, 0x2b, 0x1d, 0x31, 0xec, 0xfe, 0x85, 0x05, 0xd3, 0xfc, 0x59, + 0x63, 0xdd, 0x22, 0x02, 0x1c, 0x83, 0x13, 0x7e, 0xad, 0xae, 0xa5, 0xdc, 0xb3, 0x42, 0xcd, 0xe9, + 0x2e, 0x3c, 0xee, 0x56, 0x12, 0x2d, 0xc3, 0x74, 0x3d, 0x88, 0x5c, 0x62, 0x36, 0x84, 0xb0, 0x19, + 0x8a, 0xd1, 0x95, 0x2c, 0x01, 0xee, 0x7e, 0x06, 0xdd, 0x82, 0xa7, 0x0d, 0xa0, 0xd9, 0x0e, 0xdc, + 0x6c, 0x5c, 0x10, 0xdc, 0x9e, 0xbe, 0xd2, 0x93, 0x0a, 0xf7, 0x79, 0xfa, 0xfc, 0x87, 0x61, 0xba, + 0xeb, 0xfb, 0x0d, 0xb5, 0x9a, 0x5c, 0x82, 0xa7, 0x7b, 0xb7, 0xd4, 0x50, 0x6b, 0xca, 0x7f, 0x96, + 0x39, 0xd9, 0x37, 0x3c, 0x97, 0x01, 0xf6, 0x27, 0x1c, 0x28, 0x12, 0x7f, 0x4f, 0x18, 0x8e, 0x2b, + 0xc7, 0xeb, 0x11, 0x97, 0xfd, 0x3d, 0xfe, 0xa1, 0xd9, 0x22, 0xec, 0xb2, 0xbf, 0x87, 0x29, 0x6f, + 0xf4, 0x15, 0x2b, 0x35, 0x31, 0xf3, 0x5d, 0x8d, 0x8f, 0x9f, 0x88, 0xab, 0x36, 0xf0, 0x5c, 0x6d, + 0xff, 0x7e, 0x01, 0x2e, 0x1e, 0xc5, 0x64, 0x80, 0xe6, 0x7b, 0x11, 0x46, 0xe3, 0x24, 0xf2, 0xfc, + 0x86, 0x18, 0x89, 0xe3, 0x74, 0x14, 0x6e, 0x32, 0xc8, 0x27, 0xb0, 0x40, 0xa1, 0x5f, 0xb5, 0xa0, + 0xd8, 0x72, 0x42, 0xf1, 0xe6, 0x8d, 0x93, 0x7d, 0xf3, 0xb9, 0x35, 0x27, 0xe4, 0x5f, 0x61, 0x5c, + 0xe8, 0x5b, 0x5c, 0x73, 0x42, 0x4c, 0x15, 0x40, 0xb3, 0x50, 0x72, 0xa2, 0xc8, 0xe9, 0x30, 0xbb, + 0x56, 0xe1, 0x5b, 0xf0, 0x0b, 0x14, 0x80, 0x39, 0xfc, 0xfc, 0x87, 0xa0, 0x2c, 0x1f, 0x1f, 0xaa, + 0x0f, 0xfe, 0xed, 0xd1, 0x54, 0x90, 0xd2, 0xa6, 0x8c, 0x8b, 0xe3, 0x2b, 0x5c, 0x2b, 0xef, 0xb8, + 0x38, 0x1e, 0x65, 0xaa, 0x43, 0x5d, 0xf8, 0xa2, 0x56, 0x88, 0x43, 0x9f, 0xb3, 0x58, 0x54, 0xbc, + 0x0c, 0xde, 0x12, 0xfe, 0xf2, 0xc9, 0x04, 0xe9, 0x9b, 0xb1, 0xf6, 0x12, 0x88, 0x4d, 0xe9, 0xd4, + 0x58, 0x87, 0x3c, 0xbe, 0x33, 0xeb, 0x35, 0xcb, 0xb8, 0x79, 0x89, 0x47, 0xfb, 0x3d, 0x36, 0xd1, + 0x73, 0x88, 0xac, 0x3e, 0x7a, 0xdb, 0x1c, 0x7d, 0xdd, 0x82, 0x69, 0xee, 0x1b, 0x2d, 0x79, 0xf5, + 0x3a, 0x89, 0x88, 0xef, 0x12, 0xe9, 0x5d, 0xde, 0x3e, 0x9e, 0x06, 0x72, 0x6b, 0x61, 0x25, 0xcb, + 0x5e, 0x5b, 0xf1, 0x2e, 0x14, 0xee, 0x56, 0x06, 0xd5, 0x60, 0xc4, 0xf3, 0xeb, 0x81, 0x98, 0xbb, + 0xaa, 0xc7, 0x53, 0x6a, 0xc5, 0xaf, 0x07, 0x7a, 0x3c, 0xd3, 0x7f, 0x98, 0x71, 0x47, 0xab, 0x70, + 0x36, 0x12, 0x0b, 0xfc, 0xab, 0x5e, 0x4c, 0x57, 0x69, 0xab, 0x5e, 0xcb, 0x4b, 0xd8, 0xbc, 0x53, + 0xac, 0xce, 0x1c, 0x1e, 0xcc, 0x9e, 0xc5, 0x3d, 0xf0, 0xb8, 0xe7, 0x53, 0xf6, 0xf7, 0x2b, 0xe9, + 0x5d, 0x0c, 0x7e, 0x14, 0xf1, 0xf3, 0x50, 0x89, 0x54, 0x78, 0xbf, 0x95, 0xc7, 0x51, 0xba, 0x6c, + 0x63, 0x11, 0x03, 0xa6, 0x36, 0x98, 0x75, 0x20, 0xbf, 0x96, 0x48, 0x7d, 0x45, 0xfa, 0xe5, 0xc5, + 0xb0, 0xc8, 0xa1, 0x7f, 0x09, 0xa9, 0x7a, 0xfb, 0xbc, 0xe3, 0xbb, 0x98, 0xc9, 0x40, 0x11, 0x8c, + 0xee, 0x10, 0xa7, 0x99, 0xec, 0xe4, 0xb3, 0xd3, 0x77, 0x95, 0xf1, 0xca, 0x46, 0xba, 0x71, 0x28, + 0x16, 0x92, 0xd0, 0x3e, 0x8c, 0xed, 0xf0, 0x8f, 0x20, 0xdc, 0xb7, 0xb5, 0xe3, 0x36, 0x6e, 0xea, + 0xcb, 0xea, 0xf1, 0x2b, 0x00, 0x58, 0x8a, 0x63, 0xa7, 0x60, 0xc6, 0x19, 0x13, 0x1f, 0x3e, 0xf9, + 0x05, 0xf9, 0x0d, 0x7c, 0xc0, 0x84, 0x3e, 0x09, 0x13, 0x11, 0x71, 0x03, 0xdf, 0xf5, 0x9a, 0xa4, + 0xb6, 0x20, 0x77, 0xf1, 0x86, 0x09, 0xaf, 0x3b, 0x4d, 0x5d, 0x50, 0x6c, 0xf0, 0xc0, 0x29, 0x8e, + 0xe8, 0xb3, 0x16, 0x4c, 0xa9, 0x98, 0x60, 0xfa, 0x41, 0x88, 0xd8, 0x07, 0x5b, 0xcd, 0x29, 0x02, + 0x99, 0xf1, 0xac, 0x22, 0xba, 0x08, 0x4d, 0xc3, 0x70, 0x46, 0x2e, 0x7a, 0x1b, 0x20, 0xd8, 0x66, + 0xe7, 0x5c, 0xf4, 0x55, 0xcb, 0x43, 0xbf, 0xea, 0x14, 0x8f, 0x11, 0x95, 0x1c, 0xb0, 0xc1, 0x0d, + 0x5d, 0x07, 0xe0, 0xc3, 0x66, 0xab, 0x13, 0x12, 0xb6, 0x32, 0xd4, 0xf1, 0x91, 0xb0, 0xa9, 0x30, + 0xf7, 0x0f, 0x66, 0xbb, 0xf7, 0x30, 0x58, 0x7c, 0xa4, 0xf1, 0x38, 0xfa, 0x59, 0x18, 0x8b, 0xdb, + 0xad, 0x96, 0xa3, 0xb6, 0xcc, 0x72, 0x8c, 0x3a, 0xe5, 0x7c, 0x75, 0xdf, 0x14, 0x00, 0x2c, 0x25, + 0xa2, 0x3b, 0xd4, 0xb0, 0xc5, 0x62, 0x73, 0x85, 0x8d, 0x22, 0x3e, 0x37, 0x8f, 0xb3, 0x77, 0xfa, + 0x90, 0x78, 0xee, 0x2c, 0xee, 0x41, 0x73, 0xff, 0x60, 0xf6, 0xe9, 0x34, 0x7c, 0x35, 0xe0, 0x62, + 0x71, 0x4f, 0x9e, 0xb6, 0x9f, 0x3e, 0x68, 0x17, 0x1a, 0xbc, 0x06, 0x13, 0x64, 0x3f, 0x21, 0x91, + 0xef, 0x34, 0x6f, 0xe2, 0x55, 0xb9, 0xa1, 0xc3, 0x3a, 0xda, 0x65, 0x03, 0x8e, 0x53, 0x54, 0xc8, + 0x56, 0x0b, 0xb9, 0x02, 0xa3, 0x07, 0xbd, 0x90, 0x93, 0xcb, 0x36, 0xfb, 0xff, 0x15, 0x52, 0xde, + 0xc7, 0x56, 0x44, 0x08, 0x0a, 0xa0, 0xe4, 0x07, 0x35, 0x65, 0x60, 0xaf, 0xe5, 0x63, 0x60, 0x6f, + 0x04, 0x35, 0x23, 0xc7, 0x8d, 0xfe, 0x8b, 0x31, 0x97, 0xc3, 0x92, 0x80, 0x64, 0xb6, 0x14, 0x43, + 0x08, 0x9f, 0x3a, 0x4f, 0xc9, 0x2a, 0x09, 0x68, 0xdd, 0x14, 0x84, 0xd3, 0x72, 0xd1, 0x2e, 0x94, + 0x76, 0x82, 0x38, 0x91, 0x9e, 0xf6, 0x31, 0x9d, 0xfa, 0xab, 0x41, 0x9c, 0xb0, 0xe9, 0x52, 0xbd, + 0x36, 0x85, 0xc4, 0x98, 0xcb, 0xb0, 0xff, 0xd4, 0x4a, 0x6d, 0xdf, 0xdd, 0x76, 0x12, 0x77, 0xe7, + 0xf2, 0x1e, 0xf1, 0xe9, 0xd8, 0x31, 0xa3, 0x8a, 0xff, 0x5a, 0x26, 0xaa, 0xf8, 0xfd, 0xfd, 0x92, + 0x8e, 0xef, 0x51, 0x0e, 0x73, 0x8c, 0x85, 0x11, 0x61, 0xfc, 0x29, 0x0b, 0xc6, 0x0d, 0xf5, 0xc4, + 0xe4, 0x95, 0x63, 0x68, 0xba, 0x3e, 0x66, 0xd4, 0x40, 0x6c, 0x8a, 0xb4, 0xbf, 0x62, 0xc1, 0x58, + 0xd5, 0x71, 0x77, 0x83, 0x7a, 0x1d, 0xbd, 0x0c, 0xe5, 0x5a, 0x5b, 0x64, 0x5e, 0xf0, 0xf7, 0x53, + 0xfb, 0x45, 0x4b, 0x02, 0x8e, 0x15, 0x05, 0xed, 0xc3, 0x75, 0x87, 0x85, 0xb5, 0x14, 0x98, 0x1b, + 0xc1, 0xfa, 0xf0, 0x15, 0x06, 0xc1, 0x02, 0x83, 0x3e, 0x08, 0xe3, 0x2d, 0x67, 0x5f, 0x3e, 0x9c, + 0xdd, 0x3b, 0x5c, 0xd3, 0x28, 0x6c, 0xd2, 0xd9, 0xff, 0xd6, 0x82, 0x99, 0xaa, 0x13, 0x7b, 0xee, + 0x42, 0x3b, 0xd9, 0xa9, 0x7a, 0xc9, 0x76, 0xdb, 0xdd, 0x25, 0x09, 0xcf, 0x4a, 0xa0, 0x5a, 0xb6, + 0x63, 0x3a, 0x94, 0xd4, 0x12, 0x46, 0x69, 0x79, 0x53, 0xc0, 0xb1, 0xa2, 0x40, 0xef, 0xc0, 0x78, + 0xe8, 0xc4, 0xf1, 0xbd, 0x20, 0xaa, 0x61, 0x52, 0xcf, 0x27, 0x27, 0x68, 0x93, 0xb8, 0x11, 0x49, + 0x30, 0xa9, 0x8b, 0xe3, 0x1e, 0xcd, 0x1f, 0x9b, 0xc2, 0xec, 0xdf, 0xad, 0xc0, 0x98, 0x38, 0xab, + 0x1a, 0x38, 0xd7, 0x42, 0x2e, 0xce, 0x0a, 0x7d, 0x17, 0x67, 0x31, 0x8c, 0xba, 0x2c, 0x33, 0x5d, + 0x78, 0x1f, 0xd7, 0x73, 0x39, 0xdc, 0xe4, 0xc9, 0xee, 0x5a, 0x2d, 0xfe, 0x1f, 0x0b, 0x51, 0xe8, + 0xcb, 0x16, 0x9c, 0x72, 0x03, 0xdf, 0x27, 0xae, 0x9e, 0x1a, 0x47, 0xf2, 0x08, 0x57, 0x58, 0x4c, + 0x33, 0xd5, 0x1b, 0xa7, 0x19, 0x04, 0xce, 0x8a, 0x47, 0x6f, 0xc0, 0x24, 0x6f, 0xb3, 0x5b, 0xa9, + 0x5d, 0x23, 0x9d, 0x52, 0x68, 0x22, 0x71, 0x9a, 0x16, 0xcd, 0xf1, 0xdd, 0x37, 0x91, 0xbc, 0x37, + 0xaa, 0x77, 0xe1, 0x8d, 0xb4, 0x3d, 0x83, 0x02, 0x45, 0x80, 0x22, 0x52, 0x8f, 0x48, 0xbc, 0x23, + 0xce, 0xf2, 0xd8, 0xb4, 0x3c, 0xf6, 0x70, 0x01, 0xfe, 0xb8, 0x8b, 0x13, 0xee, 0xc1, 0x1d, 0xed, + 0x8a, 0xb5, 0x41, 0x39, 0x0f, 0xab, 0x20, 0x3e, 0x73, 0xdf, 0x25, 0xc2, 0x2c, 0x94, 0xe2, 0x1d, + 0x27, 0xaa, 0x31, 0x77, 0xa0, 0xc8, 0x17, 0xd1, 0x9b, 0x14, 0x80, 0x39, 0x1c, 0x2d, 0xc1, 0xe9, + 0x4c, 0x42, 0x64, 0xcc, 0x26, 0xfc, 0x72, 0x75, 0x46, 0xb0, 0x3b, 0x9d, 0x49, 0xa5, 0x8c, 0x71, + 0xd7, 0x13, 0xe6, 0xba, 0x71, 0xfc, 0x88, 0x75, 0x63, 0x47, 0x45, 0x8c, 0x4c, 0x30, 0x8b, 0xff, + 0x56, 0x2e, 0x0d, 0x30, 0x50, 0x78, 0xc8, 0x17, 0x32, 0xe1, 0x21, 0x93, 0x4c, 0x81, 0x5b, 0xf9, + 0x28, 0x30, 0x7c, 0x2c, 0xc8, 0xe3, 0x8c, 0xed, 0xf8, 0xbe, 0x05, 0xf2, 0xbb, 0x2e, 0x3a, 0xee, + 0x0e, 0xa1, 0x5d, 0x06, 0xbd, 0x09, 0x53, 0x6a, 0xe5, 0xb5, 0x18, 0xb4, 0x7d, 0x1e, 0xd6, 0x51, + 0xd4, 0x27, 0x2c, 0x38, 0x85, 0xc5, 0x19, 0x6a, 0x34, 0x0f, 0x15, 0xda, 0x4e, 0xfc, 0x51, 0x3e, + 0x7b, 0xa8, 0xd5, 0xdd, 0xc2, 0xc6, 0x8a, 0x78, 0x4a, 0xd3, 0xa0, 0x00, 0xa6, 0x9b, 0x4e, 0x9c, + 0x30, 0x0d, 0xe8, 0x42, 0xec, 0x21, 0xd3, 0x6b, 0x58, 0x3e, 0xf8, 0x6a, 0x96, 0x11, 0xee, 0xe6, + 0x6d, 0x7f, 0x77, 0x04, 0x26, 0x53, 0x96, 0x71, 0xc8, 0x69, 0xe7, 0x65, 0x28, 0xcb, 0x99, 0x40, + 0x98, 0x72, 0x45, 0xad, 0xa6, 0x0b, 0x45, 0x41, 0xa7, 0xc9, 0x6d, 0xe2, 0x44, 0x24, 0x62, 0xa9, + 0xa6, 0xd9, 0x69, 0xb2, 0xaa, 0x51, 0xd8, 0xa4, 0x63, 0x46, 0x39, 0x69, 0xc6, 0x8b, 0x4d, 0x8f, + 0xf8, 0x09, 0x57, 0x33, 0x1f, 0xa3, 0xbc, 0xb5, 0xba, 0x69, 0x32, 0xd5, 0x46, 0x39, 0x83, 0xc0, + 0x59, 0xf1, 0xe8, 0x97, 0x2d, 0x98, 0x74, 0xee, 0xc5, 0xba, 0x7c, 0x8a, 0x08, 0x04, 0x39, 0xe6, + 0x24, 0x95, 0xaa, 0xc8, 0x52, 0x9d, 0xa6, 0xe6, 0x3d, 0x05, 0xc2, 0x69, 0xa1, 0xe8, 0x6b, 0x16, + 0x20, 0xb2, 0x4f, 0x5c, 0x19, 0xaa, 0x22, 0x74, 0x19, 0xcd, 0x63, 0x81, 0x72, 0xb9, 0x8b, 0x2f, + 0xb7, 0xea, 0xdd, 0x70, 0xdc, 0x43, 0x07, 0xfb, 0x5f, 0x15, 0xd5, 0x80, 0xd2, 0xd1, 0x51, 0x8e, + 0x11, 0x24, 0x6c, 0x3d, 0x7c, 0x90, 0xb0, 0x3e, 0xde, 0xeb, 0x0a, 0x14, 0x4e, 0x47, 0xd4, 0x16, + 0x1e, 0x53, 0x44, 0xed, 0x67, 0x2c, 0x75, 0x2a, 0xcc, 0xdd, 0xf8, 0xb7, 0xf3, 0x8d, 0xcc, 0x9a, + 0xe3, 0x87, 0xcb, 0x19, 0xeb, 0x9e, 0x3e, 0x71, 0xa6, 0xd6, 0xd4, 0x20, 0x1b, 0xca, 0x1a, 0xfe, + 0xe7, 0x22, 0x8c, 0x1b, 0x33, 0x69, 0x4f, 0xb7, 0xc8, 0x7a, 0xc2, 0xdc, 0xa2, 0xc2, 0x10, 0x6e, + 0xd1, 0x2f, 0x42, 0xc5, 0x95, 0x56, 0x3e, 0x9f, 0x5a, 0x3d, 0xd9, 0xb9, 0x43, 0x1b, 0x7a, 0x05, + 0xc2, 0x5a, 0x26, 0x5a, 0x86, 0x69, 0x83, 0x8d, 0x98, 0x21, 0x46, 0xd8, 0x0c, 0xa1, 0x36, 0x56, + 0x17, 0xb2, 0x04, 0xb8, 0xfb, 0x19, 0xf4, 0x2a, 0x5d, 0x59, 0x79, 0xe2, 0xbd, 0x64, 0xfc, 0x24, + 0x73, 0xd7, 0x17, 0x36, 0x56, 0x24, 0x18, 0x9b, 0x34, 0xf6, 0x77, 0x2d, 0xf5, 0x71, 0x1f, 0x41, + 0xda, 0xd1, 0x9d, 0x74, 0xda, 0xd1, 0xe5, 0x5c, 0x9a, 0xb9, 0x4f, 0xbe, 0xd1, 0x0d, 0x18, 0x5b, + 0x0c, 0x5a, 0x2d, 0xc7, 0xaf, 0xa1, 0x1f, 0x81, 0x31, 0x97, 0xff, 0x14, 0x5b, 0x15, 0xec, 0x6c, + 0x47, 0x60, 0xb1, 0xc4, 0xa1, 0xe7, 0x61, 0xc4, 0x89, 0x1a, 0x72, 0x7b, 0x82, 0x1d, 0x87, 0x2f, + 0x44, 0x8d, 0x18, 0x33, 0xa8, 0xfd, 0xd5, 0x02, 0xc0, 0x62, 0xd0, 0x0a, 0x9d, 0x88, 0xd4, 0xb6, + 0x82, 0xf7, 0xce, 0x44, 0xf8, 0xaa, 0xf5, 0xf3, 0x16, 0x20, 0xda, 0x2a, 0x81, 0x4f, 0xfc, 0x44, + 0x1f, 0xb7, 0xcd, 0x43, 0xc5, 0x95, 0x50, 0xe1, 0x39, 0xe8, 0x31, 0x20, 0x11, 0x58, 0xd3, 0x0c, + 0xb0, 0x04, 0x7c, 0x51, 0x1a, 0xa8, 0x62, 0x3a, 0x4c, 0x8b, 0x99, 0x35, 0x61, 0xaf, 0xec, 0xdf, + 0x2b, 0xc0, 0xd3, 0x7c, 0xce, 0x59, 0x73, 0x7c, 0xa7, 0x41, 0x5a, 0x54, 0xab, 0x41, 0x0f, 0x50, + 0x5d, 0xba, 0xf6, 0xf0, 0x64, 0x54, 0xd6, 0x71, 0x3b, 0x27, 0xef, 0x54, 0xbc, 0x1b, 0xad, 0xf8, + 0x5e, 0x82, 0x19, 0x73, 0x14, 0x43, 0x59, 0x56, 0x5f, 0x13, 0xc6, 0x26, 0x27, 0x41, 0x6a, 0xdc, + 0x89, 0x89, 0x81, 0x60, 0x25, 0x88, 0x7a, 0x66, 0xcd, 0xc0, 0xdd, 0xc5, 0x24, 0x0c, 0x98, 0x61, + 0x31, 0x82, 0x62, 0x56, 0x05, 0x1c, 0x2b, 0x0a, 0xfb, 0xf7, 0x2c, 0xc8, 0x9a, 0x5c, 0xb6, 0x94, + 0xe7, 0x89, 0xd7, 0xd9, 0xa5, 0x7c, 0x3a, 0xaf, 0x7a, 0x88, 0xfc, 0xf1, 0x9f, 0x81, 0x71, 0x27, + 0xa1, 0xb3, 0x24, 0x5f, 0x57, 0x16, 0x1f, 0x6e, 0xbb, 0x77, 0x2d, 0xa8, 0x79, 0x75, 0x8f, 0xad, + 0x27, 0x4d, 0x76, 0xf6, 0x5f, 0x8c, 0xc0, 0x74, 0x57, 0x28, 0x2d, 0x7a, 0x1d, 0x26, 0x5c, 0xd1, + 0x3d, 0x42, 0x4c, 0xea, 0xe2, 0x65, 0x8c, 0x48, 0x0d, 0x8d, 0xc3, 0x29, 0xca, 0x01, 0x3a, 0xe8, + 0x0a, 0x9c, 0x89, 0xe8, 0x4a, 0xb6, 0x4d, 0x16, 0xea, 0x09, 0x89, 0x36, 0x89, 0x1b, 0xf8, 0x35, + 0x5e, 0x20, 0xa0, 0x58, 0x7d, 0xe6, 0xf0, 0x60, 0xf6, 0x0c, 0xee, 0x46, 0xe3, 0x5e, 0xcf, 0xa0, + 0x10, 0x26, 0x9b, 0xa6, 0x93, 0x23, 0x3c, 0xdc, 0x87, 0xf2, 0x8f, 0xd4, 0x24, 0x98, 0x02, 0xe3, + 0xb4, 0x80, 0xb4, 0xa7, 0x54, 0x7a, 0x4c, 0x9e, 0xd2, 0x2f, 0x69, 0x4f, 0x89, 0x9f, 0x0d, 0x7e, + 0x34, 0xe7, 0x50, 0xea, 0x93, 0x76, 0x95, 0xde, 0x82, 0xb2, 0x8c, 0x9c, 0x18, 0x28, 0xe2, 0xc0, + 0xe4, 0xd3, 0xc7, 0xa2, 0xdd, 0x2f, 0x40, 0x0f, 0x2f, 0x9b, 0x8e, 0x33, 0x3d, 0xa5, 0xa5, 0xc6, + 0xd9, 0x70, 0xd3, 0x1a, 0xda, 0xe7, 0x51, 0x23, 0xdc, 0x33, 0xfd, 0x48, 0xde, 0xab, 0x04, 0x1d, + 0x48, 0xa2, 0x42, 0x18, 0x54, 0x30, 0xc9, 0x25, 0x00, 0xed, 0x89, 0x88, 0x80, 0x49, 0x75, 0x1c, + 0xa6, 0x1d, 0x16, 0x6c, 0x50, 0xd1, 0x45, 0xa3, 0xe7, 0xc7, 0x89, 0xd3, 0x6c, 0x5e, 0xf5, 0xfc, + 0x44, 0xec, 0x7e, 0xa9, 0x59, 0x6a, 0x45, 0xa3, 0xb0, 0x49, 0x77, 0xfe, 0x43, 0xc6, 0x77, 0x19, + 0xe6, 0x7b, 0xee, 0xc0, 0xb3, 0xcb, 0x5e, 0xa2, 0xc2, 0x7c, 0x55, 0x3f, 0xa2, 0x8e, 0x86, 0x8a, + 0x4b, 0xb7, 0xfa, 0xc6, 0xa5, 0x1b, 0x61, 0xb6, 0x85, 0x74, 0x54, 0x70, 0x36, 0xcc, 0xd6, 0x7e, + 0x1d, 0xce, 0x2e, 0x7b, 0xc9, 0x15, 0xaf, 0x49, 0x86, 0x14, 0x62, 0xff, 0xee, 0x08, 0x4c, 0x98, + 0x79, 0x13, 0xc3, 0x84, 0xd6, 0x7f, 0x91, 0xfa, 0x12, 0xe2, 0xed, 0x3c, 0x75, 0xce, 0x71, 0xfb, + 0xd8, 0x49, 0x1c, 0xbd, 0x5b, 0xcc, 0x70, 0x27, 0xb4, 0x4c, 0x6c, 0x2a, 0x80, 0xee, 0x41, 0xa9, + 0xce, 0xc2, 0x40, 0x8b, 0x79, 0x9c, 0xb8, 0xf6, 0x6a, 0x51, 0x3d, 0xcc, 0x78, 0x20, 0x29, 0x97, + 0x47, 0x67, 0xc8, 0x28, 0x9d, 0x3c, 0xa0, 0x0c, 0x95, 0x4a, 0x1b, 0x50, 0x14, 0xfd, 0x4c, 0x7d, + 0xe9, 0x21, 0x4c, 0x7d, 0xca, 0xf0, 0x8e, 0x3e, 0x1e, 0xc3, 0x6b, 0x7f, 0xbe, 0x00, 0x53, 0xcb, + 0x7e, 0x7b, 0x63, 0x79, 0xa3, 0xbd, 0xdd, 0xf4, 0xdc, 0xeb, 0xa4, 0x43, 0x8d, 0xd3, 0x2e, 0xe9, + 0xac, 0x2c, 0x89, 0x3e, 0xa4, 0x5a, 0xed, 0x3a, 0x05, 0x62, 0x8e, 0xa3, 0xc3, 0xb1, 0xee, 0xf9, + 0x0d, 0x12, 0x85, 0x91, 0x27, 0x76, 0xb5, 0x8c, 0xe1, 0x78, 0x45, 0xa3, 0xb0, 0x49, 0x47, 0x79, + 0x07, 0xf7, 0x7c, 0x12, 0x65, 0x5d, 0xb9, 0x75, 0x0a, 0xc4, 0x1c, 0x47, 0x89, 0x92, 0xa8, 0x1d, + 0x27, 0xe2, 0x73, 0x28, 0xa2, 0x2d, 0x0a, 0xc4, 0x1c, 0x47, 0xfb, 0x7a, 0xdc, 0xde, 0x66, 0x47, + 0xba, 0x99, 0xf8, 0xc9, 0x4d, 0x0e, 0xc6, 0x12, 0x4f, 0x49, 0x77, 0x49, 0x67, 0x89, 0x2e, 0x6c, + 0x32, 0x11, 0xce, 0xd7, 0x39, 0x18, 0x4b, 0x3c, 0x2b, 0xc9, 0x90, 0x6e, 0x8e, 0x1f, 0xb8, 0x92, + 0x0c, 0x69, 0xf5, 0xfb, 0x2c, 0x91, 0xbe, 0x61, 0xc1, 0x84, 0x19, 0x88, 0x81, 0x1a, 0x19, 0x2f, + 0x6f, 0xbd, 0xab, 0xbc, 0xce, 0x4f, 0xf6, 0xaa, 0xf8, 0xdc, 0xf0, 0x92, 0x20, 0x8c, 0x5f, 0x21, + 0x7e, 0xc3, 0xf3, 0x09, 0x3b, 0xfa, 0xe3, 0x01, 0x1c, 0xa9, 0x28, 0x8f, 0xc5, 0xa0, 0x46, 0x1e, + 0xc2, 0x4d, 0xb4, 0x6f, 0xc3, 0x74, 0x57, 0x58, 0xfb, 0x00, 0x93, 0xeb, 0x91, 0x59, 0x43, 0x36, + 0x86, 0x71, 0xca, 0x78, 0x3d, 0xe4, 0x91, 0x16, 0x8b, 0x30, 0xcd, 0x1d, 0x00, 0x2a, 0x69, 0xd3, + 0xdd, 0x21, 0x2d, 0x95, 0xaa, 0xc0, 0xb6, 0x50, 0x6f, 0x65, 0x91, 0xb8, 0x9b, 0xde, 0xfe, 0x82, + 0x05, 0x93, 0xa9, 0x4c, 0x83, 0x9c, 0xdc, 0x00, 0x36, 0xd2, 0x02, 0x16, 0x17, 0xc4, 0x42, 0x14, + 0x8b, 0x6c, 0x3a, 0xd1, 0x23, 0x4d, 0xa3, 0xb0, 0x49, 0x67, 0x7f, 0xa5, 0x00, 0x65, 0x79, 0xec, + 0x3b, 0x80, 0x2a, 0x9f, 0xb3, 0x60, 0x52, 0x6d, 0x5b, 0xb3, 0xfd, 0x10, 0xde, 0x19, 0x6f, 0x1c, + 0xff, 0xe0, 0x59, 0x05, 0x8f, 0xf9, 0xf5, 0x40, 0xfb, 0xa4, 0xd8, 0x14, 0x86, 0xd3, 0xb2, 0xd1, + 0x2d, 0x80, 0xb8, 0x13, 0x27, 0xa4, 0x65, 0xec, 0xcc, 0xd8, 0xc6, 0x88, 0x9b, 0x73, 0x83, 0x88, + 0xd0, 0xf1, 0x75, 0x23, 0xa8, 0x91, 0x4d, 0x45, 0xa9, 0x9d, 0x08, 0x0d, 0xc3, 0x06, 0x27, 0xfb, + 0x9f, 0x14, 0xe0, 0x74, 0x56, 0x25, 0xf4, 0x51, 0x98, 0x90, 0xd2, 0x8d, 0x92, 0xd7, 0xf2, 0xac, + 0x7b, 0x02, 0x1b, 0xb8, 0xfb, 0x07, 0xb3, 0xb3, 0xdd, 0xd5, 0xc3, 0xe7, 0x4c, 0x12, 0x9c, 0x62, + 0xc6, 0xcf, 0x0e, 0xc4, 0x21, 0x57, 0xb5, 0xb3, 0x10, 0x86, 0xe2, 0x00, 0xc0, 0x38, 0x3b, 0x30, + 0xb1, 0x38, 0x43, 0x8d, 0x36, 0xe0, 0xac, 0x01, 0xb9, 0x41, 0xbc, 0xc6, 0xce, 0x76, 0x10, 0xc9, + 0xb5, 0xc5, 0xf3, 0x3a, 0xe4, 0xa3, 0x9b, 0x06, 0xf7, 0x7c, 0x92, 0xce, 0x77, 0xae, 0x13, 0x3a, + 0xae, 0x97, 0x74, 0xc4, 0x56, 0x93, 0xb2, 0x4d, 0x8b, 0x02, 0x8e, 0x15, 0x85, 0xbd, 0x06, 0x23, + 0x03, 0xf6, 0xa0, 0x81, 0x7c, 0xda, 0xb7, 0xa0, 0x4c, 0xd9, 0x49, 0x07, 0x27, 0x0f, 0x96, 0x01, + 0x94, 0x65, 0xd5, 0x4a, 0x64, 0x43, 0xd1, 0x73, 0xe4, 0xf1, 0x8c, 0x7a, 0xad, 0x95, 0x38, 0x6e, + 0xb3, 0x65, 0x22, 0x45, 0xa2, 0x17, 0xa1, 0x48, 0xf6, 0xc3, 0xec, 0x39, 0xcc, 0xe5, 0xfd, 0xd0, + 0x8b, 0x48, 0x4c, 0x89, 0xc8, 0x7e, 0x88, 0xce, 0x43, 0xc1, 0xab, 0x89, 0x49, 0x0a, 0x04, 0x4d, + 0x61, 0x65, 0x09, 0x17, 0xbc, 0x9a, 0xbd, 0x0f, 0x15, 0x55, 0x26, 0x13, 0xed, 0x4a, 0xdb, 0x6d, + 0xe5, 0x11, 0xa7, 0x21, 0xf9, 0xf6, 0xb1, 0xda, 0x6d, 0x00, 0x9d, 0xd7, 0x91, 0x97, 0x7d, 0xb9, + 0x08, 0x23, 0x6e, 0x20, 0xd2, 0xc1, 0xca, 0x9a, 0x0d, 0x33, 0xda, 0x0c, 0x63, 0xdf, 0x86, 0xa9, + 0xeb, 0x7e, 0x70, 0x8f, 0x15, 0x8b, 0xbb, 0xe2, 0x91, 0x66, 0x8d, 0x32, 0xae, 0xd3, 0x1f, 0x59, + 0x17, 0x81, 0x61, 0x31, 0xc7, 0xa9, 0x5a, 0x92, 0x85, 0x7e, 0xb5, 0x24, 0xed, 0x4f, 0x59, 0x70, + 0x5a, 0x25, 0x1c, 0x48, 0x6b, 0xfc, 0x3a, 0x4c, 0x6c, 0xb7, 0xbd, 0x66, 0x4d, 0xfc, 0xcf, 0x2e, + 0xd4, 0xab, 0x06, 0x0e, 0xa7, 0x28, 0xe9, 0xb2, 0x62, 0xdb, 0xf3, 0x9d, 0xa8, 0xb3, 0xa1, 0xcd, + 0xbf, 0xb2, 0x08, 0x55, 0x85, 0xc1, 0x06, 0x95, 0xfd, 0x99, 0x02, 0x4c, 0xa6, 0xf2, 0xab, 0x51, + 0x13, 0xca, 0xa4, 0xc9, 0xb6, 0x8f, 0xe4, 0x47, 0x3d, 0x6e, 0x95, 0x14, 0xd5, 0x11, 0x2f, 0x0b, + 0xbe, 0x58, 0x49, 0x78, 0x22, 0xce, 0x29, 0xec, 0x6f, 0x15, 0x61, 0x86, 0xef, 0x9a, 0xd5, 0x54, + 0x40, 0xc0, 0x9a, 0xf4, 0x4e, 0xfe, 0xa6, 0xae, 0x65, 0xc0, 0x9b, 0x63, 0xfb, 0xb8, 0x75, 0xbe, + 0x7a, 0x0b, 0x1a, 0xe8, 0xa8, 0xfa, 0xef, 0x65, 0x8e, 0xaa, 0x0b, 0x79, 0x44, 0xe3, 0xf7, 0xd5, + 0xe8, 0x07, 0xeb, 0xec, 0xfa, 0x1f, 0x16, 0xe0, 0x54, 0xa6, 0x88, 0x1a, 0xfa, 0x52, 0xba, 0xc8, + 0x8d, 0x95, 0xc7, 0xde, 0xca, 0x03, 0x4b, 0x79, 0x0d, 0x57, 0xea, 0xe6, 0x71, 0x75, 0xf8, 0x3f, + 0x28, 0xc0, 0x54, 0xba, 0xfa, 0xdb, 0x13, 0xd8, 0x52, 0x1f, 0x80, 0x0a, 0xab, 0xa9, 0xc4, 0x8a, + 0x91, 0xf3, 0x2d, 0x1c, 0x96, 0x45, 0xbd, 0x26, 0x81, 0x58, 0xe3, 0x9f, 0x88, 0x0a, 0x42, 0xf6, + 0x3f, 0xb2, 0xe0, 0x1c, 0x7f, 0xcb, 0x6c, 0x3f, 0xfc, 0x5b, 0xbd, 0x5a, 0xf7, 0x63, 0xf9, 0x2a, + 0x98, 0xa9, 0xc1, 0x71, 0x54, 0xfb, 0xb2, 0x22, 0xc8, 0x42, 0xdb, 0x74, 0x57, 0x78, 0x02, 0x95, + 0x1d, 0xaa, 0x33, 0xd8, 0x7f, 0x50, 0x04, 0x5d, 0xf7, 0x19, 0x79, 0x22, 0x57, 0x20, 0x97, 0x5a, + 0x24, 0x9b, 0x1d, 0xdf, 0xd5, 0x15, 0xa6, 0xcb, 0x99, 0x54, 0x81, 0x5f, 0xb3, 0x60, 0xdc, 0xf3, + 0xbd, 0xc4, 0x73, 0x98, 0xd3, 0x99, 0x4f, 0x61, 0x5e, 0x25, 0x6e, 0x85, 0x73, 0x0e, 0x22, 0x73, + 0xdf, 0x4f, 0x09, 0xc3, 0xa6, 0x64, 0xf4, 0x49, 0x11, 0x4d, 0x56, 0xcc, 0x2d, 0xd3, 0xa4, 0x9c, + 0x09, 0x21, 0x0b, 0xa1, 0x14, 0x91, 0x24, 0x92, 0x39, 0x3e, 0xd7, 0x8f, 0x1b, 0x22, 0x9c, 0x44, + 0x9d, 0xcd, 0x24, 0x72, 0x12, 0xd2, 0x30, 0x16, 0xed, 0x0c, 0x8c, 0xb9, 0x20, 0x3b, 0x06, 0xd4, + 0xdd, 0x16, 0x43, 0x46, 0xea, 0xcc, 0x43, 0xc5, 0x69, 0x27, 0x41, 0x8b, 0x36, 0x93, 0xd8, 0x9a, + 0xd4, 0xb1, 0x48, 0x12, 0x81, 0x35, 0x8d, 0xfd, 0xa5, 0x12, 0x64, 0x82, 0xf7, 0xd1, 0xbe, 0x59, + 0xb3, 0xdc, 0xca, 0xb7, 0x66, 0xb9, 0x52, 0xa6, 0x57, 0xdd, 0x72, 0xd4, 0x80, 0x52, 0xb8, 0xe3, + 0xc4, 0xd2, 0xa7, 0x7c, 0x4b, 0x36, 0xd3, 0x06, 0x05, 0xde, 0x3f, 0x98, 0xfd, 0xa9, 0xc1, 0xf6, + 0x28, 0x68, 0x5f, 0x9d, 0xe7, 0xc9, 0xaa, 0x5a, 0x34, 0xe3, 0x81, 0x39, 0x7f, 0x73, 0x97, 0xa2, + 0x78, 0xc4, 0x61, 0xd6, 0xa7, 0x45, 0xd9, 0x34, 0x4c, 0xe2, 0x76, 0x33, 0x11, 0xbd, 0xe1, 0xad, + 0x1c, 0x47, 0x19, 0x67, 0xac, 0x53, 0xbf, 0xf8, 0x7f, 0x6c, 0x08, 0x45, 0x1f, 0x85, 0x4a, 0x9c, + 0x38, 0x51, 0xf2, 0x90, 0x89, 0x22, 0xaa, 0xd1, 0x37, 0x25, 0x13, 0xac, 0xf9, 0xa1, 0xb7, 0x59, + 0x69, 0x26, 0x2f, 0xde, 0x79, 0xc8, 0x20, 0x50, 0x59, 0xc6, 0x49, 0x70, 0xc0, 0x06, 0x37, 0xea, + 0xb2, 0xb3, 0xbe, 0xcd, 0x23, 0x1f, 0xca, 0x6c, 0x4d, 0xa6, 0x4c, 0x21, 0x56, 0x18, 0x6c, 0x50, + 0xd9, 0xbf, 0x00, 0x67, 0xb2, 0x97, 0x9c, 0x88, 0x6d, 0xcb, 0x46, 0x14, 0xb4, 0xc3, 0xec, 0x9a, + 0x84, 0x5d, 0x82, 0x81, 0x39, 0x8e, 0xae, 0x49, 0x76, 0x3d, 0xbf, 0x96, 0x5d, 0x93, 0x5c, 0xf7, + 0xfc, 0x1a, 0x66, 0x98, 0x01, 0x8a, 0xb9, 0xff, 0x6b, 0x0b, 0x2e, 0x1e, 0x75, 0x17, 0x0b, 0x7a, + 0x1e, 0x46, 0xee, 0x39, 0x91, 0x2c, 0xf5, 0xc6, 0x6c, 0xc7, 0x6d, 0x27, 0xf2, 0x31, 0x83, 0xa2, + 0x0e, 0x8c, 0xf2, 0xe4, 0x38, 0xe1, 0xc0, 0xbe, 0x95, 0xef, 0xcd, 0x30, 0xd7, 0x89, 0xe1, 0x41, + 0xf3, 0xc4, 0x3c, 0x2c, 0x04, 0xda, 0xef, 0x5a, 0x80, 0xd6, 0xf7, 0x48, 0x14, 0x79, 0x35, 0x23, + 0x9d, 0x0f, 0xbd, 0x06, 0x13, 0x77, 0x36, 0xd7, 0x6f, 0x6c, 0x04, 0x9e, 0xcf, 0x12, 0x7c, 0x8d, + 0xc4, 0x8e, 0x6b, 0x06, 0x1c, 0xa7, 0xa8, 0xd0, 0x22, 0x4c, 0xdf, 0xb9, 0x4b, 0xd7, 0x51, 0x97, + 0xf7, 0xc3, 0x88, 0xc4, 0xb1, 0xf2, 0xc9, 0xc5, 0xce, 0xd9, 0xb5, 0xb7, 0x32, 0x48, 0xdc, 0x4d, + 0x8f, 0xd6, 0xe1, 0x5c, 0x8b, 0x7b, 0xe0, 0x6c, 0xf9, 0x18, 0x73, 0x77, 0x3c, 0x92, 0x59, 0xff, + 0xcf, 0x1e, 0x1e, 0xcc, 0x9e, 0x5b, 0xeb, 0x45, 0x80, 0x7b, 0x3f, 0x67, 0x7f, 0xb3, 0x00, 0xe3, + 0xc6, 0x7d, 0x46, 0x03, 0x2c, 0x94, 0x33, 0x57, 0x30, 0x15, 0x06, 0xbc, 0x82, 0xe9, 0x25, 0x28, + 0x87, 0x41, 0xd3, 0x73, 0x3d, 0x55, 0xa2, 0x80, 0x95, 0xca, 0xda, 0x10, 0x30, 0xac, 0xb0, 0xe8, + 0x1e, 0x54, 0xd4, 0x1d, 0x1f, 0x22, 0xa3, 0x2d, 0xaf, 0xad, 0x02, 0x35, 0x78, 0xf5, 0xdd, 0x1d, + 0x5a, 0x16, 0xb2, 0x61, 0x94, 0xf5, 0x7c, 0x19, 0x13, 0xc4, 0xd2, 0x16, 0xd8, 0x90, 0x88, 0xb1, + 0xc0, 0xd8, 0xbf, 0x32, 0x06, 0x67, 0x7b, 0x95, 0x77, 0x42, 0x3f, 0x07, 0xa3, 0x5c, 0xc7, 0x7c, + 0x2a, 0x08, 0xf6, 0x92, 0xb1, 0xcc, 0x18, 0x0a, 0xb5, 0xd8, 0x6f, 0x2c, 0x64, 0x0a, 0xe9, 0x4d, + 0x67, 0x5b, 0xb8, 0x11, 0x27, 0x23, 0x7d, 0xd5, 0xd1, 0xd2, 0x57, 0x1d, 0x2e, 0xbd, 0xe9, 0x6c, + 0xa3, 0x7d, 0x28, 0x35, 0xbc, 0x84, 0x38, 0xc2, 0x99, 0xbe, 0x7d, 0x22, 0xc2, 0x89, 0xc3, 0x43, + 0xcf, 0xd9, 0x4f, 0xcc, 0x05, 0xa2, 0xaf, 0x5b, 0x70, 0x6a, 0x3b, 0x9d, 0x05, 0x22, 0x66, 0x15, + 0xe7, 0x04, 0x4a, 0x78, 0xa5, 0x05, 0x55, 0xcf, 0x1c, 0x1e, 0xcc, 0x9e, 0xca, 0x00, 0x71, 0x56, + 0x1d, 0xf4, 0x4b, 0x16, 0x8c, 0xd5, 0xbd, 0xa6, 0x51, 0xbe, 0xe6, 0x04, 0x3e, 0xce, 0x15, 0x26, + 0x40, 0xcf, 0xbc, 0xfc, 0x7f, 0x8c, 0xa5, 0xe4, 0x7e, 0x67, 0x71, 0xa3, 0xc7, 0x3d, 0x8b, 0x1b, + 0x7b, 0x4c, 0xcb, 0xa7, 0xbf, 0x53, 0x80, 0x17, 0x07, 0xf8, 0x46, 0x66, 0x56, 0x81, 0x75, 0x44, + 0x56, 0xc1, 0x45, 0x18, 0x89, 0x48, 0x18, 0x64, 0xe7, 0x3b, 0x16, 0xf6, 0xc3, 0x30, 0xe8, 0x05, + 0x28, 0x3a, 0xa1, 0x27, 0xa6, 0x3b, 0x75, 0x54, 0xbf, 0xb0, 0xb1, 0x82, 0x29, 0x9c, 0x7e, 0xe9, + 0xca, 0xb6, 0xcc, 0x4d, 0xca, 0xa7, 0x26, 0x6c, 0xbf, 0x54, 0x27, 0xbe, 0xa0, 0x51, 0x58, 0xac, + 0xe5, 0xda, 0xeb, 0x70, 0xbe, 0x7f, 0x0f, 0x41, 0xaf, 0xc2, 0xf8, 0x76, 0xe4, 0xf8, 0xee, 0xce, + 0x9a, 0x93, 0xb8, 0xf2, 0xc0, 0x9c, 0x05, 0x3f, 0x56, 0x35, 0x18, 0x9b, 0x34, 0xf6, 0xb7, 0x0a, + 0xbd, 0x39, 0x72, 0x23, 0x30, 0x4c, 0x0b, 0x8b, 0xf6, 0x2b, 0xf4, 0x69, 0xbf, 0xbb, 0x50, 0x4e, + 0x58, 0x28, 0x3b, 0xa9, 0x0b, 0x4b, 0x92, 0x5b, 0x36, 0x16, 0x9b, 0x6b, 0xb6, 0x04, 0x73, 0xac, + 0xc4, 0x50, 0x93, 0xdf, 0xd4, 0x95, 0x6f, 0x84, 0xc9, 0xcf, 0xec, 0xa3, 0x2d, 0xc1, 0x69, 0xa3, + 0x52, 0x1f, 0x8f, 0xe4, 0xe5, 0xc7, 0xa8, 0x2a, 0xbd, 0x65, 0x23, 0x83, 0xc7, 0x5d, 0x4f, 0xd8, + 0xdf, 0x28, 0xc0, 0xb3, 0x7d, 0x2d, 0x9b, 0x3e, 0xeb, 0xb5, 0x1e, 0x70, 0xd6, 0x7b, 0xec, 0x0e, + 0x6a, 0x36, 0xf0, 0xc8, 0xa3, 0x69, 0xe0, 0x97, 0xa1, 0xec, 0xf9, 0x31, 0x71, 0xdb, 0x11, 0x6f, + 0x34, 0x23, 0xa6, 0x6e, 0x45, 0xc0, 0xb1, 0xa2, 0xb0, 0xff, 0xb0, 0x7f, 0x57, 0xa3, 0xb3, 0xdc, + 0x0f, 0x6d, 0x2b, 0xbd, 0x01, 0x93, 0x4e, 0x18, 0x72, 0x3a, 0x76, 0xae, 0x96, 0x49, 0x58, 0x5b, + 0x30, 0x91, 0x38, 0x4d, 0x6b, 0xf4, 0xe1, 0xd1, 0x7e, 0x7d, 0xd8, 0xfe, 0xb3, 0x12, 0x54, 0x68, + 0x0b, 0x2c, 0x46, 0xa4, 0x16, 0xd3, 0x06, 0x68, 0x47, 0x4d, 0xd1, 0x8a, 0xaa, 0x01, 0x6e, 0xe2, + 0x55, 0x4c, 0xe1, 0xa9, 0x55, 0x72, 0x61, 0xa8, 0x7c, 0x96, 0xe2, 0x91, 0xf9, 0x2c, 0x6f, 0xc0, + 0x64, 0x1c, 0xef, 0x6c, 0x44, 0xde, 0x9e, 0x93, 0x50, 0xdf, 0x5b, 0xc4, 0x2d, 0xe8, 0x18, 0xf4, + 0xcd, 0xab, 0x1a, 0x89, 0xd3, 0xb4, 0x68, 0x19, 0xa6, 0x75, 0x56, 0x09, 0x89, 0x12, 0x16, 0xa6, + 0xc0, 0x9b, 0x4a, 0x85, 0x80, 0xeb, 0x3c, 0x14, 0x41, 0x80, 0xbb, 0x9f, 0xa1, 0x43, 0x3a, 0x05, + 0xa4, 0x8a, 0x8c, 0xa6, 0x87, 0x74, 0x8a, 0x0f, 0xd5, 0xa5, 0xeb, 0x09, 0xb4, 0x06, 0x67, 0x78, + 0xbf, 0x60, 0x57, 0xda, 0xa9, 0x37, 0x1a, 0x63, 0x8c, 0x9e, 0x13, 0x8c, 0xce, 0x2c, 0x77, 0x93, + 0xe0, 0x5e, 0xcf, 0x51, 0xc7, 0x5a, 0x81, 0x57, 0x96, 0xc4, 0x02, 0x4f, 0x39, 0xd6, 0x8a, 0xcd, + 0x4a, 0x0d, 0x9b, 0x74, 0xe8, 0x23, 0xf0, 0x8c, 0xfe, 0xcb, 0xa3, 0xb9, 0xf8, 0xae, 0xc7, 0x92, + 0x48, 0xd8, 0x53, 0x55, 0xe2, 0x96, 0x7b, 0x92, 0xd5, 0x70, 0xbf, 0xe7, 0xd1, 0x36, 0x9c, 0x57, + 0xa8, 0xcb, 0x74, 0x15, 0x13, 0x46, 0x5e, 0x4c, 0xaa, 0x4e, 0x4c, 0x6e, 0x46, 0x4d, 0x96, 0xe2, + 0x57, 0xd1, 0xf5, 0xac, 0x97, 0xbd, 0xe4, 0x6a, 0x2f, 0x4a, 0xbc, 0x8a, 0x1f, 0xc0, 0x05, 0xcd, + 0x43, 0x85, 0xf8, 0xce, 0x76, 0x93, 0xac, 0x2f, 0xae, 0xb0, 0xc4, 0x3f, 0x63, 0x93, 0xe5, 0xb2, + 0x44, 0x60, 0x4d, 0xa3, 0x8e, 0xca, 0x26, 0xfa, 0x1e, 0x95, 0xfd, 0xb1, 0x05, 0x93, 0xaa, 0xb3, + 0x3f, 0x82, 0x98, 0x94, 0x66, 0x3a, 0x26, 0x65, 0xf9, 0xb8, 0xbb, 0x5b, 0x42, 0xf3, 0x3e, 0x07, + 0x9b, 0x7f, 0x5a, 0x01, 0x60, 0xb7, 0xf3, 0x7a, 0xac, 0x06, 0x87, 0x34, 0x77, 0x56, 0x5f, 0x73, + 0xf7, 0xc4, 0x0e, 0xe7, 0x5e, 0x29, 0x32, 0xa5, 0xc7, 0x9b, 0x22, 0xb3, 0x09, 0xe7, 0xe4, 0x64, + 0xc4, 0x17, 0xfc, 0x57, 0x83, 0x58, 0x59, 0x87, 0x72, 0xf5, 0x05, 0xc1, 0xe8, 0xdc, 0x4a, 0x2f, + 0x22, 0xdc, 0xfb, 0xd9, 0xd4, 0x1c, 0x38, 0x76, 0xd4, 0x1c, 0xa8, 0x07, 0xc4, 0x6a, 0x5d, 0x16, + 0x6c, 0xcb, 0x0c, 0x88, 0xd5, 0x2b, 0x9b, 0x58, 0xd3, 0xf4, 0xb6, 0x8a, 0x95, 0x9c, 0xac, 0x22, + 0x0c, 0x6d, 0x15, 0xe5, 0xf8, 0x1c, 0xef, 0x7b, 0x2d, 0xa2, 0xdc, 0x63, 0x98, 0xe8, 0xbb, 0xc7, + 0xf0, 0x26, 0x4c, 0x79, 0xfe, 0x0e, 0x89, 0xbc, 0x84, 0xd4, 0xd8, 0x58, 0x10, 0x77, 0x9e, 0xaa, + 0x48, 0x90, 0x95, 0x14, 0x16, 0x67, 0xa8, 0xd3, 0x46, 0x65, 0x6a, 0x00, 0xa3, 0xd2, 0xc7, 0x94, + 0x9f, 0xca, 0xc7, 0x94, 0x9f, 0x3e, 0xbe, 0x29, 0x9f, 0x3e, 0x51, 0x53, 0x8e, 0x72, 0x31, 0xe5, + 0x2f, 0x42, 0x29, 0x8c, 0x82, 0xfd, 0xce, 0xcc, 0x99, 0xb4, 0x7b, 0xb6, 0x41, 0x81, 0x98, 0xe3, + 0xcc, 0xe5, 0xc2, 0xd9, 0x07, 0x2f, 0x17, 0xec, 0xcf, 0x16, 0xe0, 0x9c, 0xb6, 0x74, 0xb4, 0x7f, + 0x79, 0x75, 0x3a, 0xd6, 0x59, 0x55, 0x4d, 0x1e, 0x4e, 0x60, 0x04, 0x21, 0xe9, 0x78, 0x26, 0x85, 0xc1, 0x06, 0x15, 0x8b, 0xe5, 0x21, 0x11, 0xab, 0xb1, 0x91, 0x35, 0x83, 0x8b, 0x02, 0x8e, 0x15, - 0x05, 0xbb, 0xf7, 0x9d, 0x44, 0x89, 0x88, 0x8f, 0xcc, 0xe6, 0xdd, 0x2e, 0x6a, 0x14, 0x36, 0xe9, - 0xd0, 0x8b, 0x5c, 0x08, 0x1b, 0x82, 0xd4, 0x14, 0x4e, 0x88, 0x6a, 0xe1, 0x72, 0xd4, 0x29, 0xac, + 0x05, 0xbb, 0xda, 0x9f, 0x44, 0x89, 0x88, 0x8f, 0xcc, 0xe6, 0xdd, 0x2e, 0x6a, 0x14, 0x36, 0xe9, + 0xd0, 0x4b, 0x5c, 0x08, 0x1b, 0x82, 0xd4, 0x14, 0x4e, 0x88, 0x82, 0xf0, 0x72, 0xd4, 0x29, 0xac, 0x54, 0x87, 0x05, 0x6d, 0x95, 0xba, 0xd5, 0x61, 0x87, 0x27, 0x8a, 0xc2, 0xfe, 0xbf, 0x16, 0x3c, - 0xd3, 0xb3, 0x29, 0x1e, 0xc1, 0xf4, 0x76, 0x90, 0x9e, 0xde, 0xb6, 0x4e, 0x3e, 0xbd, 0x75, 0xbd, - 0x45, 0x9f, 0xa9, 0xee, 0x3f, 0x59, 0x30, 0xa5, 0xe9, 0x1f, 0xc1, 0xab, 0x7a, 0xb9, 0xde, 0xe0, - 0xae, 0x55, 0xe7, 0x3b, 0x57, 0xa9, 0x77, 0xfb, 0x23, 0xf6, 0x6e, 0x7c, 0x0f, 0x7a, 0xc1, 0x95, - 0xb7, 0x8d, 0x1e, 0xb3, 0xf7, 0xda, 0x81, 0x51, 0x56, 0x9b, 0x37, 0xce, 0x67, 0x2f, 0x3c, 0x2d, + 0xdb, 0xb3, 0x29, 0x1e, 0xc1, 0xf4, 0xb6, 0x9f, 0x9e, 0xde, 0x36, 0x8f, 0x3f, 0xbd, 0x75, 0xbd, + 0x45, 0x9f, 0xa9, 0xee, 0x3f, 0x59, 0x30, 0xa5, 0xe9, 0x1f, 0xc1, 0xab, 0x7a, 0xb9, 0x5e, 0xd2, + 0xaf, 0x55, 0xe7, 0x3b, 0x57, 0xa9, 0x77, 0xfb, 0x63, 0xf6, 0x6e, 0x7c, 0x0f, 0x7a, 0xc1, 0x95, + 0x17, 0xca, 0x1e, 0xb1, 0xf7, 0xda, 0x81, 0x51, 0x56, 0xd2, 0x31, 0xce, 0x67, 0x2f, 0x3c, 0x2d, 0x9f, 0x45, 0x63, 0xea, 0xbd, 0x70, 0xf6, 0x37, 0xc6, 0x42, 0x20, 0xab, 0x00, 0xe3, 0xc5, 0xd4, - 0x5e, 0xd6, 0x44, 0xf8, 0x93, 0xae, 0x00, 0x23, 0xe0, 0x58, 0x51, 0xd8, 0x4d, 0x98, 0x49, 0x33, + 0x5e, 0xd6, 0x44, 0xf8, 0x93, 0xae, 0x00, 0x23, 0xe0, 0x58, 0x51, 0xd8, 0x2d, 0x98, 0x49, 0x33, 0x5f, 0x22, 0x75, 0x76, 0xe4, 0x38, 0xd0, 0x6b, 0xce, 0x43, 0xc5, 0x61, 0x4f, 0xad, 0xb6, 0x9d, - 0xec, 0x05, 0x13, 0x0b, 0x12, 0x81, 0x35, 0x8d, 0xfd, 0xdb, 0x16, 0x9c, 0xeb, 0xf1, 0x32, 0x39, - 0x86, 0x7d, 0x25, 0xda, 0x0a, 0xf4, 0xb9, 0x06, 0xb6, 0x46, 0xea, 0x8e, 0x3c, 0xd4, 0x32, 0xac, - 0xda, 0x12, 0x07, 0x63, 0x89, 0xb7, 0xff, 0x97, 0x05, 0x67, 0xd2, 0xba, 0xc6, 0xe8, 0x06, 0x20, - 0xfe, 0x32, 0x4b, 0x5e, 0xec, 0x86, 0xfb, 0x24, 0xea, 0xd0, 0x37, 0xe7, 0x5a, 0x5f, 0x14, 0x9c, - 0xd0, 0x42, 0x17, 0x05, 0xee, 0xf1, 0x14, 0xab, 0x50, 0x51, 0x53, 0xad, 0x2d, 0x7b, 0xca, 0xed, + 0xec, 0x1d, 0x22, 0x0b, 0x12, 0x81, 0x35, 0x8d, 0xfd, 0xdb, 0x16, 0x9c, 0xe9, 0xf1, 0x32, 0x39, + 0x86, 0x7d, 0x25, 0xda, 0x0a, 0xf4, 0xb9, 0xe9, 0xb7, 0x46, 0xea, 0x8e, 0x3c, 0xd4, 0x32, 0xac, + 0xda, 0x12, 0x07, 0x63, 0x89, 0xb7, 0xff, 0x97, 0x05, 0xa7, 0xd2, 0xba, 0xc6, 0xe8, 0x1a, 0x20, + 0xfe, 0x32, 0x4b, 0x5e, 0xec, 0x06, 0x7b, 0x24, 0xea, 0xd0, 0x37, 0xe7, 0x5a, 0x9f, 0x17, 0x9c, + 0xd0, 0x42, 0x17, 0x05, 0xee, 0xf1, 0x14, 0xab, 0x50, 0x51, 0x53, 0xad, 0x2d, 0x7b, 0xca, 0xad, 0x3c, 0x7b, 0x8a, 0xfe, 0x98, 0xe6, 0xc6, 0xbf, 0x12, 0x89, 0x4d, 0xf9, 0xf6, 0xbb, 0x23, 0xa0, - 0xe2, 0x42, 0xd9, 0xf1, 0x49, 0x4e, 0x87, 0x4f, 0xa9, 0x5b, 0x48, 0x8a, 0x43, 0xdc, 0x4b, 0x3b, - 0xf2, 0xa0, 0xa3, 0x0d, 0x5e, 0x10, 0xdf, 0xdc, 0xe4, 0x51, 0x6f, 0xb8, 0xad, 0x51, 0xd8, 0xa4, - 0xa3, 0x9a, 0xf8, 0xde, 0x3e, 0xe1, 0x0f, 0x8d, 0xa6, 0x35, 0x59, 0x95, 0x08, 0xac, 0x69, 0xa8, - 0x26, 0x35, 0xaf, 0x5e, 0x17, 0x2b, 0x45, 0xa5, 0x09, 0x6d, 0x1d, 0xcc, 0x30, 0x94, 0x62, 0x37, - 0x0c, 0xf7, 0x84, 0xff, 0xa7, 0x28, 0xae, 0x87, 0xe1, 0x1e, 0x66, 0x18, 0xea, 0xb1, 0x04, 0x61, - 0xd4, 0x64, 0x17, 0x80, 0xd4, 0x94, 0x14, 0xe1, 0xf7, 0x29, 0x8f, 0x65, 0xbd, 0x9b, 0x04, 0xf7, - 0x7a, 0x8e, 0xf6, 0xc0, 0x56, 0x44, 0x6a, 0x9e, 0x9b, 0x98, 0xdc, 0x20, 0xdd, 0x03, 0x37, 0xbb, - 0x28, 0x70, 0x8f, 0xa7, 0xd0, 0x02, 0x9c, 0x91, 0x71, 0xbd, 0x32, 0x6f, 0x89, 0x3b, 0x83, 0xca, - 0x0f, 0xc7, 0x69, 0x34, 0xce, 0xd2, 0x53, 0x6b, 0xd3, 0x14, 0x29, 0x8b, 0xcc, 0x4d, 0x34, 0xac, - 0x8d, 0x4c, 0x65, 0xc4, 0x8a, 0xc2, 0xfe, 0x4c, 0x91, 0xce, 0x8e, 0x7d, 0xca, 0x6e, 0x3e, 0xb2, - 0xc3, 0xce, 0x74, 0x8f, 0x1c, 0x19, 0xa0, 0x47, 0xbe, 0x0a, 0x13, 0x77, 0xe3, 0x30, 0x50, 0x07, - 0x89, 0xa5, 0xbe, 0x07, 0x89, 0x06, 0x55, 0xef, 0x83, 0xc4, 0xd1, 0xbc, 0x0e, 0x12, 0xc7, 0x1e, - 0xf2, 0x20, 0xf1, 0xdf, 0x95, 0x40, 0x15, 0xcd, 0x5b, 0x27, 0xc9, 0xbd, 0x30, 0xda, 0xf3, 0x82, - 0x06, 0x8b, 0x87, 0xfe, 0x86, 0x05, 0x13, 0x7c, 0xbc, 0xac, 0x9a, 0xb1, 0x91, 0xf5, 0x9c, 0x0a, - 0xc5, 0xa5, 0x84, 0xcd, 0x6d, 0x1b, 0x82, 0x32, 0xe5, 0xa7, 0x4d, 0x14, 0x4e, 0x69, 0x84, 0x7e, - 0x1e, 0x40, 0x5e, 0x85, 0x51, 0xcf, 0xe9, 0x92, 0x68, 0x75, 0x31, 0x09, 0xa9, 0x6b, 0xdf, 0x74, - 0x5b, 0x09, 0xc1, 0x86, 0x40, 0xf4, 0xb9, 0xec, 0x05, 0x49, 0x9f, 0x3a, 0x95, 0xb6, 0x19, 0x24, - 0x6a, 0x14, 0xc3, 0x98, 0x17, 0x34, 0x68, 0x3f, 0x11, 0x67, 0xaf, 0x1f, 0xe8, 0x95, 0x4b, 0xb0, - 0x1a, 0x3a, 0xb5, 0xaa, 0xe3, 0x3b, 0x81, 0x4b, 0xa2, 0x15, 0x4e, 0x6e, 0xde, 0x87, 0xc0, 0x00, - 0x58, 0x32, 0xea, 0xaa, 0x84, 0x58, 0x1a, 0xa4, 0x12, 0xe2, 0xc5, 0x8f, 0xc0, 0x74, 0xd7, 0xc7, - 0x1c, 0x2a, 0x48, 0xf4, 0xe1, 0xe3, 0x4b, 0xed, 0x7f, 0x3d, 0xaa, 0x27, 0xad, 0xf5, 0xb0, 0xc6, - 0xeb, 0xf1, 0x45, 0xfa, 0x8b, 0x0a, 0xdf, 0x33, 0xc7, 0x2e, 0x62, 0xdc, 0xa9, 0xa0, 0x80, 0xd8, - 0x14, 0x49, 0xfb, 0x68, 0xcb, 0x89, 0x48, 0x70, 0xda, 0x7d, 0x74, 0x53, 0x09, 0xc1, 0x86, 0x40, - 0xb4, 0x9b, 0x8a, 0x12, 0xbb, 0x76, 0xf2, 0x28, 0x31, 0x96, 0x67, 0xd8, 0xab, 0xe0, 0xd8, 0x57, - 0x2c, 0x98, 0x0a, 0x52, 0x3d, 0x57, 0xec, 0xc3, 0x6f, 0x9f, 0xc6, 0xa8, 0xe0, 0x35, 0x57, 0xd3, - 0x30, 0x9c, 0x91, 0xdf, 0x6b, 0x4a, 0x2b, 0x0d, 0x39, 0xa5, 0xe9, 0xc2, 0x9e, 0xa3, 0xfd, 0x0a, - 0x7b, 0xa2, 0x40, 0x95, 0x0f, 0x1e, 0xcb, 0xbd, 0x7c, 0x30, 0xf4, 0x28, 0x1d, 0x7c, 0x07, 0x2a, - 0x6e, 0x44, 0x9c, 0xe4, 0x21, 0x2b, 0xc9, 0xb2, 0x43, 0xc8, 0x45, 0xc9, 0x00, 0x6b, 0x5e, 0xf6, - 0x7f, 0x2c, 0xc2, 0x59, 0xd9, 0x22, 0x32, 0x82, 0x86, 0xce, 0x8f, 0x5c, 0xae, 0x76, 0x6e, 0xd5, - 0xfc, 0x78, 0x5d, 0x22, 0xb0, 0xa6, 0xa1, 0xfe, 0x58, 0x3b, 0x26, 0x1b, 0x2d, 0x12, 0xac, 0x7a, - 0x3b, 0xb1, 0x38, 0x3f, 0x52, 0x03, 0xe5, 0x96, 0x46, 0x61, 0x93, 0x8e, 0x3a, 0xe3, 0xdc, 0x2f, - 0x8e, 0xb3, 0x01, 0x69, 0xc2, 0xdf, 0xc6, 0x12, 0x8f, 0x7e, 0xad, 0x67, 0x1d, 0xf0, 0x7c, 0x42, - 0x31, 0xbb, 0x02, 0x87, 0x86, 0x2c, 0x00, 0xfe, 0x65, 0x0b, 0xce, 0xec, 0xa5, 0x72, 0x49, 0xa4, - 0x49, 0x3e, 0x61, 0xd6, 0x63, 0x3a, 0x41, 0x45, 0x77, 0xe1, 0x34, 0x3c, 0xc6, 0x59, 0xe9, 0xf6, - 0xff, 0xb1, 0xc0, 0x34, 0x4f, 0x83, 0x79, 0x56, 0xc6, 0xcd, 0x0e, 0x85, 0x63, 0x6e, 0x76, 0x90, - 0x4e, 0x58, 0x71, 0x30, 0xa7, 0x7f, 0x64, 0x08, 0xa7, 0xbf, 0xd4, 0xd7, 0x6b, 0x7b, 0x1e, 0x8a, - 0x6d, 0xaf, 0x26, 0xfc, 0x76, 0x7d, 0x18, 0xb6, 0xb2, 0x84, 0x29, 0xdc, 0xfe, 0x17, 0x25, 0xbd, - 0x4e, 0x17, 0x11, 0x84, 0x3f, 0x14, 0xaf, 0x5d, 0x57, 0x49, 0xac, 0xfc, 0xcd, 0xd7, 0xbb, 0x92, - 0x58, 0x7f, 0x62, 0xf8, 0x00, 0x51, 0xde, 0x40, 0xfd, 0x72, 0x58, 0xc7, 0x8e, 0x89, 0x0e, 0xbd, - 0x0b, 0x65, 0xba, 0xb4, 0x61, 0x1b, 0x6e, 0xe5, 0x94, 0x52, 0xe5, 0xeb, 0x02, 0x7e, 0xff, 0x70, - 0xf6, 0xc7, 0x87, 0x57, 0x4b, 0x3e, 0x8d, 0x15, 0x7f, 0x14, 0x43, 0x85, 0xfe, 0x66, 0x81, 0xac, - 0x62, 0xd1, 0x74, 0x4b, 0xd9, 0x22, 0x89, 0xc8, 0x25, 0x4a, 0x56, 0xcb, 0x41, 0x01, 0x54, 0xd8, - 0x1d, 0x04, 0x4c, 0x28, 0x5f, 0x5b, 0x6d, 0xaa, 0x70, 0x52, 0x89, 0xb8, 0x7f, 0x38, 0xfb, 0xfa, - 0xf0, 0x42, 0xd5, 0xe3, 0x58, 0x8b, 0xb0, 0xbf, 0x3a, 0xa2, 0xfb, 0xae, 0xc8, 0x5d, 0xfe, 0xa1, - 0xe8, 0xbb, 0xaf, 0x65, 0xfa, 0xee, 0xe5, 0xae, 0xbe, 0x3b, 0xa5, 0xeb, 0xf4, 0xa7, 0x7a, 0xe3, - 0xa3, 0x9e, 0x60, 0x8f, 0x5f, 0xc7, 0x33, 0xcf, 0xe2, 0xed, 0xb6, 0x17, 0x91, 0x78, 0x33, 0x6a, - 0x07, 0x5e, 0xd0, 0x10, 0xb7, 0x35, 0x19, 0x9e, 0x45, 0x0a, 0x8d, 0xb3, 0xf4, 0xec, 0xa6, 0xa7, - 0x4e, 0xe0, 0xde, 0x71, 0xf6, 0x79, 0xaf, 0x32, 0xd2, 0x39, 0xb7, 0x04, 0x1c, 0x2b, 0x0a, 0xfb, - 0x5b, 0xec, 0x74, 0xd4, 0x88, 0xa0, 0xa7, 0x7d, 0xc2, 0x67, 0x97, 0x3e, 0xf0, 0x5c, 0x50, 0xd5, - 0x27, 0xf8, 0x4d, 0x0f, 0x1c, 0x87, 0xee, 0xc1, 0xd8, 0x0e, 0x2f, 0x06, 0x9d, 0x4f, 0xe5, 0x27, - 0x51, 0x59, 0x9a, 0x15, 0x48, 0x94, 0x65, 0xa6, 0xef, 0xeb, 0x9f, 0x58, 0x4a, 0xb3, 0xff, 0x7e, - 0x11, 0xce, 0x64, 0xae, 0x24, 0x48, 0xd5, 0xa1, 0x28, 0x1c, 0x5b, 0x87, 0xe2, 0x13, 0x00, 0x35, - 0xd2, 0xf2, 0xc3, 0x0e, 0x73, 0x73, 0x46, 0x86, 0x76, 0x73, 0x94, 0x67, 0xbc, 0xa4, 0xb8, 0x60, - 0x83, 0xa3, 0x48, 0x80, 0xe5, 0x65, 0x2d, 0x32, 0x09, 0xb0, 0x46, 0x01, 0xb4, 0xd1, 0x47, 0x5b, - 0x00, 0xcd, 0x83, 0x33, 0x5c, 0x45, 0x15, 0xa7, 0xfe, 0x10, 0xe1, 0xe8, 0x2c, 0xc2, 0x71, 0x29, - 0xcd, 0x06, 0x67, 0xf9, 0xda, 0x5f, 0x2a, 0x50, 0x67, 0x8f, 0x37, 0xb6, 0x4a, 0x85, 0x7c, 0x3f, - 0x8c, 0x3a, 0xed, 0x64, 0x37, 0xec, 0xaa, 0x6a, 0xbd, 0xc0, 0xa0, 0x58, 0x60, 0xd1, 0x2a, 0x8c, - 0xd4, 0x74, 0x7a, 0xdb, 0x30, 0xca, 0xe9, 0x7d, 0x33, 0x27, 0x21, 0x98, 0x71, 0x41, 0xcf, 0xc1, - 0x48, 0xe2, 0x34, 0x52, 0x17, 0x79, 0x6d, 0x3b, 0x8d, 0x18, 0x33, 0xa8, 0x39, 0x17, 0x8d, 0x1c, - 0x33, 0x17, 0xbd, 0x0e, 0x93, 0xb1, 0xd7, 0x08, 0x9c, 0xa4, 0x1d, 0x11, 0xe3, 0x8c, 0x46, 0x1f, - 0x6c, 0x9b, 0x48, 0x9c, 0xa6, 0xb5, 0xdf, 0xad, 0xc0, 0xf9, 0x5e, 0x37, 0xaa, 0xe6, 0x1d, 0x24, - 0xdc, 0x4b, 0xc6, 0xa3, 0x0b, 0x12, 0xee, 0x23, 0xdd, 0x37, 0x82, 0x84, 0x7d, 0x23, 0x48, 0xf8, - 0x73, 0x16, 0x54, 0x54, 0x6c, 0xac, 0x88, 0xef, 0xfb, 0xd8, 0x29, 0xdc, 0x5a, 0x2b, 0x45, 0x88, - 0x10, 0x49, 0xf9, 0x17, 0x6b, 0xe1, 0xa7, 0x17, 0x35, 0xfc, 0x40, 0x85, 0x86, 0x8a, 0x1a, 0x56, - 0x21, 0xd5, 0xa5, 0x3c, 0x42, 0xaa, 0xfb, 0x7c, 0xaa, 0x9e, 0x21, 0xd5, 0x5f, 0xb1, 0x60, 0xdc, - 0x79, 0xa7, 0x1d, 0x91, 0x25, 0xb2, 0xbf, 0xd1, 0x8a, 0x85, 0xdd, 0xfa, 0x78, 0xfe, 0x0a, 0x2c, - 0x68, 0x21, 0xa2, 0xfc, 0xa6, 0x06, 0x60, 0x53, 0x85, 0x54, 0x08, 0xf5, 0x58, 0x1e, 0x21, 0xd4, - 0xbd, 0xd4, 0x39, 0x36, 0x84, 0xfa, 0x75, 0x98, 0x74, 0xfd, 0x30, 0x20, 0x9b, 0x51, 0x98, 0x84, - 0x6e, 0xe8, 0x0b, 0x1f, 0x55, 0x99, 0x84, 0x45, 0x13, 0x89, 0xd3, 0xb4, 0xfd, 0xe2, 0xaf, 0x2b, - 0x27, 0x8d, 0xbf, 0x86, 0xc7, 0x14, 0x7f, 0xfd, 0x67, 0x05, 0x98, 0x3d, 0xe6, 0xa3, 0xa2, 0xd7, - 0x60, 0x22, 0x8c, 0x1a, 0x4e, 0xe0, 0xbd, 0xc3, 0xd3, 0xdf, 0x4a, 0xe9, 0xea, 0x04, 0x1b, 0x06, - 0x0e, 0xa7, 0x28, 0x65, 0x84, 0xe6, 0x68, 0x9f, 0x08, 0xcd, 0x0f, 0xc1, 0x78, 0x42, 0x9c, 0xa6, - 0x08, 0x18, 0x10, 0xeb, 0x0a, 0x7d, 0x4e, 0xa3, 0x51, 0xd8, 0xa4, 0xa3, 0xdd, 0x68, 0xca, 0x71, - 0x5d, 0x12, 0xc7, 0x32, 0x04, 0x53, 0xec, 0x79, 0xe4, 0x16, 0xdf, 0xc9, 0xb6, 0x92, 0x16, 0x52, - 0x22, 0x70, 0x46, 0x24, 0x55, 0xde, 0xf1, 0x7d, 0x1e, 0x6d, 0x4d, 0xe4, 0xd5, 0x9c, 0x3a, 0x59, - 0x5e, 0xa3, 0xb0, 0x49, 0x67, 0xff, 0x46, 0x01, 0x9e, 0x7f, 0xa0, 0x79, 0x19, 0x38, 0x3a, 0xb6, - 0x1d, 0x93, 0x28, 0x7b, 0xce, 0x71, 0x2b, 0x26, 0x11, 0x66, 0x18, 0xde, 0x4a, 0xad, 0x96, 0x71, - 0x75, 0x45, 0xde, 0xc1, 0xd8, 0xbc, 0x95, 0x52, 0x22, 0x70, 0x46, 0x64, 0xb6, 0x95, 0x46, 0x06, - 0x6c, 0xa5, 0x7f, 0x5c, 0x80, 0x17, 0x06, 0x30, 0xc2, 0x39, 0x06, 0xad, 0xa7, 0x83, 0xfe, 0x8b, - 0x8f, 0x27, 0xe8, 0xff, 0x61, 0x9b, 0xeb, 0x5b, 0x05, 0xb8, 0xd8, 0xdf, 0x16, 0xa2, 0x9f, 0xa4, - 0x6b, 0x13, 0x19, 0xc3, 0x60, 0x26, 0x0c, 0x9c, 0xe3, 0xeb, 0x92, 0x14, 0x0a, 0x67, 0x69, 0xd1, - 0x1c, 0x40, 0xcb, 0x49, 0x76, 0xe3, 0xab, 0x07, 0x5e, 0x9c, 0x88, 0x54, 0xb7, 0x29, 0xbe, 0xc3, - 0x2c, 0xa1, 0xd8, 0xa0, 0xa0, 0xe2, 0xd8, 0xbf, 0xa5, 0x70, 0x3d, 0x4c, 0xf8, 0x43, 0xdc, 0x8f, - 0x3b, 0xc7, 0xef, 0xd2, 0x4d, 0xa1, 0x70, 0x96, 0x96, 0x8a, 0x63, 0x67, 0x18, 0x5c, 0x51, 0x71, - 0xef, 0x30, 0x15, 0xb7, 0xaa, 0xa0, 0xd8, 0xa0, 0xc8, 0xa6, 0x42, 0x94, 0x06, 0x48, 0x85, 0xf8, - 0x67, 0x05, 0x78, 0xa6, 0xef, 0x5c, 0x3a, 0xd8, 0x00, 0x7c, 0xf2, 0x72, 0x20, 0x1e, 0xae, 0xef, - 0x0c, 0x19, 0xd9, 0xff, 0x5f, 0xfa, 0xf4, 0x34, 0x11, 0xd9, 0x9f, 0x9d, 0x2a, 0xac, 0x61, 0xa7, - 0x8a, 0x27, 0xa8, 0x3d, 0xbb, 0x82, 0xf9, 0x47, 0x86, 0x08, 0xe6, 0xcf, 0x7c, 0x8c, 0xd2, 0x80, - 0x03, 0xf9, 0xbb, 0xfd, 0x9b, 0x97, 0xfa, 0xde, 0x03, 0xed, 0xfa, 0x2c, 0xc1, 0x59, 0x71, 0x81, - 0xf9, 0x56, 0x7b, 0x47, 0x24, 0x42, 0x16, 0xd2, 0xd7, 0xb8, 0xac, 0x64, 0xf0, 0xb8, 0xeb, 0x89, - 0x27, 0x30, 0xb9, 0xe2, 0x21, 0x9b, 0xf4, 0x13, 0x50, 0x51, 0xbc, 0x79, 0xc0, 0xa1, 0xfa, 0xa0, - 0x5d, 0x01, 0x87, 0xea, 0x6b, 0x1a, 0x54, 0xb4, 0x25, 0xf6, 0x48, 0x27, 0xdb, 0x33, 0x6f, 0x92, - 0x0e, 0x3b, 0x7c, 0xb4, 0x7f, 0x0c, 0x26, 0xd4, 0x22, 0x72, 0xd0, 0x52, 0x92, 0xf6, 0xff, 0x1c, - 0x81, 0xc9, 0x54, 0xc2, 0x7b, 0x6a, 0x2b, 0xc4, 0x3a, 0x76, 0x2b, 0x84, 0x85, 0x68, 0xb6, 0x03, - 0x59, 0x69, 0xd5, 0x08, 0xd1, 0x6c, 0x07, 0x04, 0x73, 0x1c, 0x5d, 0xba, 0xd7, 0xa2, 0x0e, 0x6e, - 0x07, 0x22, 0xd0, 0x4b, 0x2d, 0xdd, 0x97, 0x18, 0x14, 0x0b, 0x2c, 0xfa, 0xb4, 0x05, 0x13, 0x31, - 0xdb, 0x67, 0xe3, 0x1b, 0x49, 0xe2, 0x83, 0xde, 0xc8, 0xe3, 0x86, 0x4d, 0x51, 0xdc, 0x81, 0x9d, - 0x11, 0x9b, 0x10, 0x9c, 0x92, 0x88, 0x7e, 0xd9, 0x32, 0xef, 0x16, 0x1d, 0xcd, 0x23, 0x40, 0x31, - 0x5b, 0x4f, 0x80, 0x6f, 0xb3, 0x3c, 0xf8, 0x8a, 0xd1, 0x58, 0xed, 0xf2, 0x8c, 0x9d, 0xce, 0x2e, - 0x0f, 0xf4, 0xd8, 0xe1, 0xf9, 0x20, 0x54, 0x9a, 0x4e, 0xe0, 0xd5, 0x49, 0x9c, 0xc4, 0x33, 0x65, - 0xa3, 0xcc, 0x89, 0x04, 0x62, 0x8d, 0xa7, 0x93, 0x5d, 0xcc, 0x5e, 0x8c, 0x9f, 0x8b, 0x55, 0xf4, - 0xa5, 0x07, 0x5b, 0x1a, 0x8c, 0x4d, 0x1a, 0xfb, 0x9f, 0x5a, 0x70, 0xa1, 0x67, 0x63, 0x3c, 0xb9, - 0x11, 0x35, 0x74, 0x82, 0x3e, 0xd7, 0xa3, 0x20, 0x04, 0xea, 0x9c, 0xda, 0x15, 0xb4, 0xa2, 0xe2, - 0xc4, 0x64, 0xdf, 0xbe, 0x31, 0xdc, 0x5e, 0xa5, 0xde, 0x2f, 0x2c, 0x3e, 0xd2, 0xfd, 0x42, 0xfb, - 0xdd, 0x22, 0x18, 0x97, 0x25, 0xa3, 0x5f, 0x30, 0x6b, 0x9f, 0x58, 0x79, 0xd5, 0xe9, 0xe0, 0xcc, - 0x55, 0xed, 0x14, 0xde, 0x6a, 0xbd, 0x4a, 0xa9, 0x64, 0xfb, 0x6b, 0xe1, 0xf8, 0xfe, 0x8a, 0x7c, - 0x59, 0x64, 0xa6, 0x98, 0x7f, 0x91, 0x99, 0x4a, 0xb6, 0xc0, 0x0c, 0xfa, 0x1d, 0x0b, 0x66, 0x9a, - 0x7d, 0x8a, 0xa1, 0xe5, 0x93, 0xfb, 0xdb, 0xaf, 0xd4, 0x1a, 0xbb, 0xf8, 0xbf, 0x6f, 0x0d, 0x3a, - 0xdc, 0x57, 0x2b, 0xfb, 0xef, 0x59, 0x7c, 0x70, 0x64, 0xbe, 0x82, 0x9e, 0x14, 0xac, 0x07, 0x4c, - 0x0a, 0x2f, 0xb1, 0x7b, 0x88, 0xea, 0xd7, 0x89, 0xe3, 0x8b, 0xc9, 0xc3, 0xbc, 0x52, 0x88, 0xc1, - 0xb1, 0xa2, 0x60, 0x55, 0xcb, 0x7d, 0x3f, 0xbc, 0x77, 0xb5, 0xd9, 0x4a, 0x3a, 0x62, 0x1a, 0xd1, - 0x55, 0xcb, 0x15, 0x06, 0x1b, 0x54, 0xf6, 0x9f, 0x5b, 0xbc, 0x07, 0x8a, 0x93, 0xaa, 0xd7, 0x32, - 0x55, 0x76, 0x07, 0x3f, 0xe4, 0xf9, 0x39, 0x00, 0x57, 0x5d, 0x41, 0x92, 0xcf, 0xb5, 0xcf, 0xfa, - 0x4a, 0x13, 0xf3, 0x2e, 0x62, 0x09, 0xc3, 0x86, 0xbc, 0xd4, 0x78, 0x2f, 0x1e, 0x37, 0xde, 0xed, - 0x3f, 0xb3, 0x20, 0x35, 0xbf, 0xa1, 0x16, 0x94, 0xa8, 0x06, 0x9d, 0x7c, 0x2e, 0x4c, 0x31, 0x59, - 0x53, 0x5b, 0x20, 0x7a, 0x32, 0xfb, 0x89, 0xb9, 0x20, 0xe4, 0x8b, 0x33, 0xaa, 0x42, 0x1e, 0x97, - 0xfa, 0x98, 0x02, 0xaf, 0x87, 0xe1, 0x1e, 0xdf, 0x83, 0xd7, 0xe7, 0x5d, 0xf6, 0x6b, 0x30, 0xdd, - 0xa5, 0x14, 0xab, 0x91, 0x19, 0xca, 0x5b, 0x62, 0x8c, 0x1e, 0xc8, 0x2a, 0xf6, 0x62, 0x8e, 0xb3, - 0xbf, 0x65, 0xc1, 0xd9, 0x2c, 0x7b, 0xf4, 0x75, 0x0b, 0xa6, 0xe3, 0x2c, 0xbf, 0xd3, 0x6a, 0x3b, - 0x15, 0xbf, 0xd1, 0x85, 0xc2, 0xdd, 0x4a, 0xd8, 0xff, 0xbf, 0xc0, 0xfb, 0xf3, 0x1d, 0x2f, 0xa8, - 0x85, 0xf7, 0xd4, 0x7c, 0x68, 0xf5, 0x9d, 0x0f, 0xe9, 0x10, 0x73, 0x77, 0x49, 0xad, 0xed, 0x77, - 0x65, 0xa8, 0x6c, 0x09, 0x38, 0x56, 0x14, 0xa9, 0x2b, 0x59, 0x8b, 0xc7, 0x5e, 0xc9, 0xfa, 0x2a, - 0x4c, 0x98, 0x37, 0x21, 0x89, 0x74, 0x77, 0xe6, 0x5e, 0x99, 0x97, 0x26, 0xe1, 0x14, 0x55, 0xe6, - 0x2e, 0xcc, 0xd2, 0xb1, 0x77, 0x61, 0xbe, 0x08, 0x65, 0x71, 0xaf, 0xa3, 0x8c, 0x72, 0xe2, 0xe9, - 0x2f, 0x02, 0x86, 0x15, 0x96, 0x1a, 0x88, 0xa6, 0x13, 0xb4, 0x1d, 0x9f, 0xb6, 0x90, 0xc8, 0x8a, - 0x53, 0x23, 0x6b, 0x4d, 0x61, 0xb0, 0x41, 0x45, 0xdf, 0x38, 0xf1, 0x9a, 0xe4, 0xad, 0x30, 0x90, - 0xf1, 0x01, 0x7a, 0x87, 0x52, 0xc0, 0xb1, 0xa2, 0xb0, 0xff, 0x87, 0x05, 0xd9, 0x4b, 0xe9, 0x52, - 0x6b, 0x56, 0xeb, 0xd8, 0x4c, 0xbc, 0x74, 0x96, 0x51, 0x61, 0xa0, 0x2c, 0x23, 0x33, 0x01, 0xa8, - 0xf8, 0xc0, 0x04, 0xa0, 0x1f, 0xd1, 0x95, 0xd6, 0x79, 0xa6, 0xd0, 0x78, 0xaf, 0x2a, 0xeb, 0xc8, - 0x86, 0x51, 0xd7, 0x51, 0x89, 0xce, 0x13, 0xdc, 0x13, 0x5c, 0x5c, 0x60, 0x44, 0x02, 0x53, 0xdd, - 0xf9, 0xce, 0xf7, 0x2f, 0xbd, 0xef, 0xbb, 0xdf, 0xbf, 0xf4, 0xbe, 0x3f, 0xfc, 0xfe, 0xa5, 0xf7, - 0x7d, 0xfa, 0xe8, 0x92, 0xf5, 0x9d, 0xa3, 0x4b, 0xd6, 0x77, 0x8f, 0x2e, 0x59, 0x7f, 0x78, 0x74, - 0xc9, 0x7a, 0xf7, 0xe8, 0x92, 0xf5, 0x95, 0xff, 0x76, 0xe9, 0x7d, 0x6f, 0xf5, 0x8c, 0xe7, 0xa0, - 0x3f, 0x5e, 0x76, 0x6b, 0xf3, 0xfb, 0x57, 0x58, 0x48, 0x01, 0x1d, 0x0d, 0xf3, 0x46, 0x17, 0x98, - 0x97, 0xa3, 0xe1, 0x2f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x82, 0xa3, 0x6a, 0x27, 0xe2, 0xb4, 0x00, - 0x00, + 0xe2, 0x42, 0xd9, 0xf1, 0x49, 0x4e, 0x87, 0x4f, 0xa9, 0x8b, 0x66, 0x8a, 0x43, 0x5c, 0x3d, 0x3c, + 0xf2, 0xa0, 0xa3, 0x0d, 0x7e, 0xe7, 0x81, 0xb9, 0xc9, 0xa3, 0xde, 0x70, 0x4b, 0xa3, 0xb0, 0x49, + 0x47, 0x35, 0x69, 0x7a, 0x7b, 0x84, 0x3f, 0x34, 0x9a, 0xd6, 0x64, 0x55, 0x22, 0xb0, 0xa6, 0xa1, + 0x9a, 0xd4, 0xbc, 0x7a, 0x5d, 0xac, 0x14, 0x95, 0x26, 0xb4, 0x75, 0x30, 0xc3, 0x50, 0x8a, 0x9d, + 0x20, 0xd8, 0x15, 0xfe, 0x9f, 0xa2, 0xb8, 0x1a, 0x04, 0xbb, 0x98, 0x61, 0xa8, 0xc7, 0xe2, 0x07, + 0x51, 0x8b, 0xdd, 0xf1, 0x52, 0x53, 0x52, 0x84, 0xdf, 0xa7, 0x3c, 0x96, 0x1b, 0xdd, 0x24, 0xb8, + 0xd7, 0x73, 0xb4, 0x07, 0x86, 0x11, 0xa9, 0x79, 0x6e, 0x62, 0x72, 0x83, 0x74, 0x0f, 0xdc, 0xe8, + 0xa2, 0xc0, 0x3d, 0x9e, 0x42, 0x0b, 0x70, 0x4a, 0xc6, 0xf5, 0xca, 0xbc, 0x25, 0xee, 0x0c, 0x2a, + 0x3f, 0x1c, 0xa7, 0xd1, 0x38, 0x4b, 0x4f, 0xad, 0x4d, 0x4b, 0xa4, 0x2c, 0x32, 0x37, 0xd1, 0xb0, + 0x36, 0x32, 0x95, 0x11, 0x2b, 0x0a, 0xfb, 0xd3, 0x45, 0x3a, 0x3b, 0xf6, 0x29, 0xbb, 0xf9, 0xc8, + 0x0e, 0x3b, 0xd3, 0x3d, 0x72, 0x64, 0x80, 0x1e, 0xf9, 0x1a, 0x4c, 0xdc, 0x89, 0x03, 0x5f, 0x1d, + 0x24, 0x96, 0xfa, 0x1e, 0x24, 0x1a, 0x54, 0xbd, 0x0f, 0x12, 0x47, 0xf3, 0x3a, 0x48, 0x1c, 0x7b, + 0xc8, 0x83, 0xc4, 0xdf, 0x2f, 0x81, 0x2a, 0x9a, 0x77, 0x83, 0x24, 0xf7, 0x82, 0x68, 0xd7, 0xf3, + 0x1b, 0x2c, 0x1e, 0xfa, 0xeb, 0x16, 0x4c, 0xf0, 0xf1, 0xb2, 0x6a, 0xc6, 0x46, 0xd6, 0x73, 0x2a, + 0x14, 0x97, 0x12, 0x36, 0xb7, 0x65, 0x08, 0xca, 0x54, 0x18, 0x37, 0x51, 0x38, 0xa5, 0x11, 0xfa, + 0x79, 0x00, 0x79, 0xdb, 0x49, 0x3d, 0xa7, 0x7b, 0xc0, 0xd5, 0xdd, 0x33, 0xa4, 0xae, 0x7d, 0xd3, + 0x2d, 0x25, 0x04, 0x1b, 0x02, 0xd1, 0x67, 0xb3, 0x77, 0x60, 0x7d, 0xf2, 0x44, 0xda, 0x66, 0x90, + 0xa8, 0x51, 0x0c, 0x63, 0x9e, 0xdf, 0xa0, 0xfd, 0x44, 0x9c, 0xbd, 0xbe, 0xbf, 0x57, 0x2e, 0xc1, + 0x6a, 0xe0, 0xd4, 0xaa, 0x4e, 0xd3, 0xf1, 0x5d, 0x12, 0xad, 0x70, 0x72, 0xf3, 0xca, 0x0b, 0x06, + 0xc0, 0x92, 0x51, 0x57, 0x25, 0xc4, 0xd2, 0x20, 0x95, 0x10, 0xcf, 0x7f, 0x18, 0xa6, 0xbb, 0x3e, + 0xe6, 0x50, 0x41, 0xa2, 0x0f, 0x1f, 0x5f, 0x6a, 0xff, 0x9b, 0x51, 0x3d, 0x69, 0xdd, 0x08, 0x6a, + 0xbc, 0x1e, 0x5f, 0xa4, 0xbf, 0xa8, 0xf0, 0x3d, 0x73, 0xec, 0x22, 0xc6, 0xb5, 0x19, 0x0a, 0x88, + 0x4d, 0x91, 0xb4, 0x8f, 0x86, 0x4e, 0x44, 0xfc, 0x93, 0xee, 0xa3, 0x1b, 0x4a, 0x08, 0x36, 0x04, + 0xa2, 0x9d, 0x54, 0x94, 0xd8, 0x95, 0xe3, 0x47, 0x89, 0xb1, 0x3c, 0xc3, 0x5e, 0x05, 0xc7, 0xbe, + 0x6c, 0xc1, 0x94, 0x9f, 0xea, 0xb9, 0x62, 0x1f, 0x7e, 0xeb, 0x24, 0x46, 0x05, 0xaf, 0xb9, 0x9a, + 0x86, 0xe1, 0x8c, 0xfc, 0x5e, 0x53, 0x5a, 0x69, 0xc8, 0x29, 0x4d, 0x17, 0xf6, 0x1c, 0xed, 0x57, + 0xd8, 0x13, 0xf9, 0xaa, 0x7c, 0xf0, 0x58, 0xee, 0xe5, 0x83, 0xa1, 0x47, 0xe9, 0xe0, 0xdb, 0x50, + 0x71, 0x23, 0xe2, 0x24, 0x0f, 0x59, 0x49, 0x96, 0x1d, 0x42, 0x2e, 0x4a, 0x06, 0x58, 0xf3, 0xb2, + 0xff, 0x63, 0x11, 0x4e, 0xcb, 0x16, 0x91, 0x11, 0x34, 0x74, 0x7e, 0xe4, 0x72, 0xb5, 0x73, 0xab, + 0xe6, 0xc7, 0xab, 0x12, 0x81, 0x35, 0x0d, 0xf5, 0xc7, 0xda, 0x31, 0x59, 0x0f, 0x89, 0xbf, 0xea, + 0x6d, 0xc7, 0xe2, 0xfc, 0x48, 0x0d, 0x94, 0x9b, 0x1a, 0x85, 0x4d, 0x3a, 0xea, 0x8c, 0x73, 0xbf, + 0x38, 0xce, 0x06, 0xa4, 0x09, 0x7f, 0x1b, 0x4b, 0x3c, 0xfa, 0xf5, 0x9e, 0x75, 0xc0, 0xf3, 0x09, + 0xc5, 0xec, 0x0a, 0x1c, 0x1a, 0xb2, 0x00, 0xf8, 0x97, 0x2c, 0x38, 0xb5, 0x9b, 0xca, 0x25, 0x91, + 0x26, 0xf9, 0x98, 0x59, 0x8f, 0xe9, 0x04, 0x15, 0xdd, 0x85, 0xd3, 0xf0, 0x18, 0x67, 0xa5, 0xdb, + 0xff, 0xc7, 0x02, 0xd3, 0x3c, 0x0d, 0xe6, 0x59, 0x19, 0x97, 0x77, 0x14, 0x8e, 0xb8, 0xbc, 0x43, + 0x3a, 0x61, 0xc5, 0xc1, 0x9c, 0xfe, 0x91, 0x21, 0x9c, 0xfe, 0x52, 0x5f, 0xaf, 0xed, 0x05, 0x28, + 0xb6, 0xbd, 0x9a, 0xf0, 0xdb, 0xf5, 0x61, 0xd8, 0xca, 0x12, 0xa6, 0x70, 0xfb, 0x5f, 0x96, 0xf4, + 0x3a, 0x5d, 0x44, 0x10, 0xfe, 0x50, 0xbc, 0x76, 0x5d, 0x25, 0xb1, 0xf2, 0x37, 0xbf, 0xd1, 0x95, + 0xc4, 0xfa, 0x13, 0xc3, 0x07, 0x88, 0xf2, 0x06, 0xea, 0x97, 0xc3, 0x3a, 0x76, 0x44, 0x74, 0xe8, + 0x1d, 0x28, 0xd3, 0xa5, 0x0d, 0xdb, 0x70, 0x2b, 0xa7, 0x94, 0x2a, 0x5f, 0x15, 0xf0, 0xfb, 0x07, + 0xb3, 0x3f, 0x3e, 0xbc, 0x5a, 0xf2, 0x69, 0xac, 0xf8, 0xa3, 0x18, 0x2a, 0xf4, 0x37, 0x0b, 0x64, + 0x15, 0x8b, 0xa6, 0x9b, 0xca, 0x16, 0x49, 0x44, 0x2e, 0x51, 0xb2, 0x5a, 0x0e, 0xf2, 0xa1, 0xc2, + 0xee, 0x20, 0x60, 0x42, 0xf9, 0xda, 0x6a, 0x43, 0x85, 0x93, 0x4a, 0xc4, 0xfd, 0x83, 0xd9, 0x37, + 0x86, 0x17, 0xaa, 0x1e, 0xc7, 0x5a, 0x84, 0xfd, 0x95, 0x11, 0xdd, 0x77, 0x45, 0xee, 0xf2, 0x0f, + 0x45, 0xdf, 0x7d, 0x3d, 0xd3, 0x77, 0x2f, 0x76, 0xf5, 0xdd, 0x29, 0x5d, 0xa7, 0x3f, 0xd5, 0x1b, + 0x1f, 0xf5, 0x04, 0x7b, 0xf4, 0x3a, 0x9e, 0x79, 0x16, 0x77, 0xdb, 0x5e, 0x44, 0xe2, 0x8d, 0xa8, + 0xed, 0x7b, 0x7e, 0x43, 0x5c, 0xc8, 0x65, 0x78, 0x16, 0x29, 0x34, 0xce, 0xd2, 0xb3, 0xcb, 0xbc, + 0x3a, 0xbe, 0x7b, 0xdb, 0xd9, 0xe3, 0xbd, 0xca, 0x48, 0xe7, 0xdc, 0x14, 0x70, 0xac, 0x28, 0xec, + 0x6f, 0xb2, 0xd3, 0x51, 0x23, 0x82, 0x9e, 0xf6, 0x89, 0x26, 0xbb, 0xf4, 0x81, 0xe7, 0x82, 0xaa, + 0x3e, 0xc1, 0x6f, 0x7a, 0xe0, 0x38, 0x74, 0x0f, 0xc6, 0xb6, 0x79, 0x31, 0xe8, 0x7c, 0x2a, 0x3f, + 0x89, 0xca, 0xd2, 0xac, 0x40, 0xa2, 0x2c, 0x33, 0x7d, 0x5f, 0xff, 0xc4, 0x52, 0x9a, 0xfd, 0xf7, + 0x8b, 0x70, 0x2a, 0x73, 0x25, 0x41, 0xaa, 0x0e, 0x45, 0xe1, 0xc8, 0x3a, 0x14, 0x1f, 0x07, 0xa8, + 0x91, 0xb0, 0x19, 0x74, 0x98, 0x9b, 0x33, 0x32, 0xb4, 0x9b, 0xa3, 0x3c, 0xe3, 0x25, 0xc5, 0x05, + 0x1b, 0x1c, 0x45, 0x02, 0x2c, 0x2f, 0x6b, 0x91, 0x49, 0x80, 0x35, 0x0a, 0xa0, 0x8d, 0x3e, 0xda, + 0x02, 0x68, 0x1e, 0x9c, 0xe2, 0x2a, 0xaa, 0x38, 0xf5, 0x87, 0x08, 0x47, 0x67, 0x11, 0x8e, 0x4b, + 0x69, 0x36, 0x38, 0xcb, 0xd7, 0xfe, 0x62, 0x81, 0x3a, 0x7b, 0xbc, 0xb1, 0x55, 0x2a, 0xe4, 0xfb, + 0x60, 0xd4, 0x69, 0x27, 0x3b, 0x41, 0x57, 0x55, 0xeb, 0x05, 0x06, 0xc5, 0x02, 0x8b, 0x56, 0x61, + 0xa4, 0xa6, 0xd3, 0xdb, 0x86, 0x51, 0x4e, 0xef, 0x9b, 0x39, 0x09, 0xc1, 0x8c, 0x0b, 0x7a, 0x1e, + 0x46, 0x12, 0xa7, 0x91, 0xba, 0xab, 0x6d, 0xcb, 0x69, 0xc4, 0x98, 0x41, 0xcd, 0xb9, 0x68, 0xe4, + 0x88, 0xb9, 0xe8, 0x0d, 0x98, 0x8c, 0xbd, 0x86, 0xef, 0x24, 0xed, 0x88, 0x18, 0x67, 0x34, 0xfa, + 0x60, 0xdb, 0x44, 0xe2, 0x34, 0xad, 0xfd, 0x6e, 0x05, 0xce, 0xf6, 0xba, 0x34, 0x37, 0xef, 0x20, + 0xe1, 0x5e, 0x32, 0x1e, 0x5d, 0x90, 0x70, 0x1f, 0xe9, 0x4d, 0x23, 0x48, 0xb8, 0x69, 0x04, 0x09, + 0x7f, 0xd6, 0x82, 0x8a, 0x8a, 0x8d, 0x15, 0xf1, 0x7d, 0x1f, 0x3d, 0x81, 0x8b, 0x89, 0xa5, 0x08, + 0x11, 0x22, 0x29, 0xff, 0x62, 0x2d, 0xfc, 0xe4, 0xa2, 0x86, 0x1f, 0xa8, 0xd0, 0x50, 0x51, 0xc3, + 0x2a, 0xa4, 0xba, 0x94, 0x47, 0x48, 0x75, 0x9f, 0x4f, 0xd5, 0x33, 0xa4, 0xfa, 0xcb, 0x16, 0x8c, + 0x3b, 0xef, 0xb4, 0x23, 0xb2, 0x44, 0xf6, 0xd6, 0xc3, 0x58, 0xd8, 0xad, 0x8f, 0xe5, 0xaf, 0xc0, + 0x82, 0x16, 0x22, 0xca, 0x6f, 0x6a, 0x00, 0x36, 0x55, 0x48, 0x85, 0x50, 0x8f, 0xe5, 0x11, 0x42, + 0xdd, 0x4b, 0x9d, 0x23, 0x43, 0xa8, 0xdf, 0x80, 0x49, 0xb7, 0x19, 0xf8, 0x64, 0x23, 0x0a, 0x92, + 0xc0, 0x0d, 0x9a, 0xc2, 0x47, 0x55, 0x26, 0x61, 0xd1, 0x44, 0xe2, 0x34, 0x6d, 0xbf, 0xf8, 0xeb, + 0xca, 0x71, 0xe3, 0xaf, 0xe1, 0x31, 0xc5, 0x5f, 0xff, 0x79, 0x01, 0x66, 0x8f, 0xf8, 0xa8, 0xe8, + 0x75, 0x98, 0x08, 0xa2, 0x86, 0xe3, 0x7b, 0xef, 0xf0, 0xf4, 0xb7, 0x52, 0xba, 0x3a, 0xc1, 0xba, + 0x81, 0xc3, 0x29, 0x4a, 0x19, 0xa1, 0x39, 0xda, 0x27, 0x42, 0xf3, 0x83, 0x30, 0x9e, 0x10, 0xa7, + 0x25, 0x02, 0x06, 0xc4, 0xba, 0x42, 0x9f, 0xd3, 0x68, 0x14, 0x36, 0xe9, 0x68, 0x37, 0x9a, 0x72, + 0x5c, 0x97, 0xc4, 0xb1, 0x0c, 0xc1, 0x14, 0x7b, 0x1e, 0xb9, 0xc5, 0x77, 0xb2, 0xad, 0xa4, 0x85, + 0x94, 0x08, 0x9c, 0x11, 0x49, 0x95, 0x77, 0x9a, 0x4d, 0x1e, 0x6d, 0x4d, 0xe4, 0xed, 0xab, 0x3a, + 0x59, 0x5e, 0xa3, 0xb0, 0x49, 0x67, 0xff, 0x46, 0x01, 0x5e, 0x78, 0xa0, 0x79, 0x19, 0x38, 0x3a, + 0xb6, 0x1d, 0x93, 0x28, 0x7b, 0xce, 0x71, 0x33, 0x26, 0x11, 0x66, 0x18, 0xde, 0x4a, 0x61, 0x68, + 0x5c, 0x5d, 0x91, 0x77, 0x30, 0x36, 0x6f, 0xa5, 0x94, 0x08, 0x9c, 0x11, 0x99, 0x6d, 0xa5, 0x91, + 0x01, 0x5b, 0xe9, 0x1f, 0x17, 0xe0, 0xc5, 0x01, 0x8c, 0x70, 0x8e, 0x41, 0xeb, 0xe9, 0xa0, 0xff, + 0xe2, 0xe3, 0x09, 0xfa, 0x7f, 0xd8, 0xe6, 0xfa, 0x66, 0x01, 0xce, 0xf7, 0xb7, 0x85, 0xe8, 0x27, + 0xe9, 0xda, 0x44, 0xc6, 0x30, 0x98, 0x09, 0x03, 0x67, 0xf8, 0xba, 0x24, 0x85, 0xc2, 0x59, 0x5a, + 0x34, 0x07, 0x10, 0x3a, 0xc9, 0x4e, 0x7c, 0x79, 0xdf, 0x8b, 0x13, 0x91, 0xea, 0x36, 0xc5, 0x77, + 0x98, 0x25, 0x14, 0x1b, 0x14, 0x54, 0x1c, 0xfb, 0xb7, 0x14, 0xdc, 0x08, 0x12, 0xfe, 0x10, 0xf7, + 0xe3, 0xce, 0xf0, 0xeb, 0x92, 0x53, 0x28, 0x9c, 0xa5, 0xa5, 0xe2, 0xd8, 0x19, 0x06, 0x57, 0x54, + 0x5c, 0x2d, 0x4d, 0xc5, 0xad, 0x2a, 0x28, 0x36, 0x28, 0xb2, 0xa9, 0x10, 0xa5, 0x01, 0x52, 0x21, + 0xfe, 0x79, 0x01, 0x9e, 0xed, 0x3b, 0x97, 0x0e, 0x36, 0x00, 0x9f, 0xbc, 0x1c, 0x88, 0x87, 0xeb, + 0x3b, 0x43, 0x46, 0xf6, 0xff, 0x97, 0x3e, 0x3d, 0x4d, 0x44, 0xf6, 0x67, 0xa7, 0x0a, 0x6b, 0xd8, + 0xa9, 0xe2, 0x09, 0x6a, 0xcf, 0xae, 0x60, 0xfe, 0x91, 0x21, 0x82, 0xf9, 0x33, 0x1f, 0xa3, 0x34, + 0xe0, 0x40, 0xfe, 0x4e, 0xff, 0xe6, 0xa5, 0xbe, 0xf7, 0x40, 0xbb, 0x3e, 0x4b, 0x70, 0x5a, 0xdc, + 0x51, 0xbf, 0xd9, 0xde, 0x16, 0x89, 0x90, 0x85, 0xf4, 0x35, 0x2e, 0x2b, 0x19, 0x3c, 0xee, 0x7a, + 0xe2, 0x09, 0x4c, 0xae, 0x78, 0xc8, 0x26, 0xfd, 0x38, 0x54, 0x14, 0x6f, 0x1e, 0x70, 0xa8, 0x3e, + 0x68, 0x57, 0xc0, 0xa1, 0xfa, 0x9a, 0x06, 0x15, 0x6d, 0x89, 0x5d, 0xd2, 0xc9, 0xf6, 0xcc, 0xeb, + 0xa4, 0xc3, 0x0e, 0x1f, 0xed, 0x1f, 0x83, 0x09, 0xb5, 0x88, 0x1c, 0xb4, 0x94, 0xa4, 0xfd, 0x3f, + 0x47, 0x60, 0x32, 0x95, 0xf0, 0x9e, 0xda, 0x0a, 0xb1, 0x8e, 0xdc, 0x0a, 0x61, 0x21, 0x9a, 0x6d, + 0x5f, 0x56, 0x5a, 0x35, 0x42, 0x34, 0xdb, 0x3e, 0xc1, 0x1c, 0x47, 0x97, 0xee, 0xb5, 0xa8, 0x83, + 0xdb, 0xbe, 0x08, 0xf4, 0x52, 0x4b, 0xf7, 0x25, 0x06, 0xc5, 0x02, 0x8b, 0x3e, 0x65, 0xc1, 0x44, + 0xcc, 0xf6, 0xd9, 0xf8, 0x46, 0x92, 0xf8, 0xa0, 0xd7, 0xf2, 0xb8, 0x61, 0x53, 0x14, 0x77, 0x60, + 0x67, 0xc4, 0x26, 0x04, 0xa7, 0x24, 0xa2, 0x5f, 0xb6, 0xcc, 0xbb, 0x45, 0x47, 0xf3, 0x08, 0x50, + 0xcc, 0xd6, 0x13, 0xe0, 0xdb, 0x2c, 0x0f, 0xbe, 0x62, 0x34, 0x56, 0xbb, 0x3c, 0x63, 0x27, 0xb3, + 0xcb, 0x03, 0x3d, 0x76, 0x78, 0x3e, 0x00, 0x95, 0x96, 0xe3, 0x7b, 0x75, 0x12, 0x27, 0xf1, 0x4c, + 0xd9, 0x28, 0x73, 0x22, 0x81, 0x58, 0xe3, 0xe9, 0x64, 0x17, 0xb3, 0x17, 0xe3, 0xe7, 0x62, 0x15, + 0x7d, 0xe9, 0xc1, 0xa6, 0x06, 0x63, 0x93, 0xc6, 0xfe, 0xa7, 0x16, 0x9c, 0xeb, 0xd9, 0x18, 0x4f, + 0x6e, 0x44, 0x0d, 0x9d, 0xa0, 0xcf, 0xf4, 0x28, 0x08, 0x81, 0x3a, 0x27, 0x76, 0x05, 0xad, 0xa8, + 0x38, 0x31, 0xd9, 0xb7, 0x6f, 0x0c, 0xb7, 0x57, 0xa9, 0xf7, 0x0b, 0x8b, 0x8f, 0x74, 0xbf, 0xd0, + 0x7e, 0xb7, 0x08, 0xc6, 0x65, 0xc9, 0xe8, 0x17, 0xcc, 0xda, 0x27, 0x56, 0x5e, 0x75, 0x3a, 0x38, + 0x73, 0x55, 0x3b, 0x85, 0xb7, 0x5a, 0xaf, 0x52, 0x2a, 0xd9, 0xfe, 0x5a, 0x38, 0xba, 0xbf, 0xa2, + 0xa6, 0x2c, 0x32, 0x53, 0xcc, 0xbf, 0xc8, 0x4c, 0x25, 0x5b, 0x60, 0x06, 0xfd, 0x8e, 0x05, 0x33, + 0xad, 0x3e, 0xc5, 0xd0, 0xf2, 0xc9, 0xfd, 0xed, 0x57, 0x6a, 0xad, 0xfa, 0xfc, 0xe1, 0xc1, 0x6c, + 0xdf, 0x1a, 0x74, 0xb8, 0xaf, 0x56, 0xf6, 0xdf, 0xb5, 0xf8, 0xe0, 0xc8, 0x7c, 0x05, 0x3d, 0x29, + 0x58, 0x0f, 0x98, 0x14, 0x5e, 0x66, 0xf7, 0x10, 0xd5, 0xaf, 0x12, 0xa7, 0x29, 0x26, 0x0f, 0xf3, + 0x4a, 0x21, 0x06, 0xc7, 0x8a, 0x82, 0x55, 0x2d, 0x6f, 0x36, 0x83, 0x7b, 0x97, 0x5b, 0x61, 0xd2, + 0x11, 0xd3, 0x88, 0xae, 0x5a, 0xae, 0x30, 0xd8, 0xa0, 0xb2, 0xff, 0xc2, 0xe2, 0x3d, 0x50, 0x9c, + 0x54, 0xbd, 0x9e, 0xa9, 0xb2, 0x3b, 0xf8, 0x21, 0xcf, 0xcf, 0x01, 0xb8, 0xea, 0x0a, 0x92, 0x7c, + 0xae, 0x7d, 0xd6, 0x57, 0x9a, 0x98, 0x77, 0x11, 0x4b, 0x18, 0x36, 0xe4, 0xa5, 0xc6, 0x7b, 0xf1, + 0xa8, 0xf1, 0x6e, 0xff, 0xb9, 0x05, 0xa9, 0xf9, 0x0d, 0x85, 0x50, 0xa2, 0x1a, 0x74, 0xf2, 0xb9, + 0x30, 0xc5, 0x64, 0x4d, 0x6d, 0x81, 0xe8, 0xc9, 0xec, 0x27, 0xe6, 0x82, 0x50, 0x53, 0x9c, 0x51, + 0x15, 0xf2, 0xb8, 0xd4, 0xc7, 0x14, 0x78, 0x35, 0x08, 0x76, 0xf9, 0x1e, 0xbc, 0x3e, 0xef, 0xb2, + 0x5f, 0x87, 0xe9, 0x2e, 0xa5, 0x58, 0x8d, 0xcc, 0x40, 0xde, 0x12, 0x63, 0xf4, 0x40, 0x56, 0xb1, + 0x17, 0x73, 0x9c, 0xfd, 0x4d, 0x0b, 0x4e, 0x67, 0xd9, 0xa3, 0xaf, 0x59, 0x30, 0x1d, 0x67, 0xf9, + 0x9d, 0x54, 0xdb, 0xa9, 0xf8, 0x8d, 0x2e, 0x14, 0xee, 0x56, 0xc2, 0xfe, 0xff, 0x05, 0xde, 0x9f, + 0x6f, 0x7b, 0x7e, 0x2d, 0xb8, 0xa7, 0xe6, 0x43, 0xab, 0xef, 0x7c, 0x48, 0x87, 0x98, 0xbb, 0x43, + 0x6a, 0xed, 0x66, 0x57, 0x86, 0xca, 0xa6, 0x80, 0x63, 0x45, 0x91, 0xba, 0x92, 0xb5, 0x78, 0xe4, + 0x95, 0xac, 0xaf, 0xc1, 0x84, 0x79, 0x13, 0x92, 0x48, 0x77, 0x67, 0xee, 0x95, 0x79, 0x69, 0x12, + 0x4e, 0x51, 0x65, 0xee, 0xc2, 0x2c, 0x1d, 0x79, 0x17, 0xe6, 0x4b, 0x50, 0x16, 0xf7, 0x3a, 0xca, + 0x28, 0x27, 0x9e, 0xfe, 0x22, 0x60, 0x58, 0x61, 0xa9, 0x81, 0x68, 0x39, 0x7e, 0xdb, 0x69, 0xd2, + 0x16, 0x12, 0x59, 0x71, 0x6a, 0x64, 0xad, 0x29, 0x0c, 0x36, 0xa8, 0xe8, 0x1b, 0x27, 0x5e, 0x8b, + 0xbc, 0x1d, 0xf8, 0x32, 0x3e, 0x40, 0xef, 0x50, 0x0a, 0x38, 0x56, 0x14, 0xf6, 0xff, 0xb0, 0x20, + 0x7b, 0x29, 0x5d, 0x6a, 0xcd, 0x6a, 0x1d, 0x99, 0x89, 0x97, 0xce, 0x32, 0x2a, 0x0c, 0x94, 0x65, + 0x64, 0x26, 0x00, 0x15, 0x1f, 0x98, 0x00, 0xf4, 0x23, 0xba, 0xd2, 0x3a, 0xcf, 0x14, 0x1a, 0xef, + 0x55, 0x65, 0x1d, 0xd9, 0x30, 0xea, 0x3a, 0x2a, 0xd1, 0x79, 0x82, 0x7b, 0x82, 0x8b, 0x0b, 0x8c, + 0x48, 0x60, 0xaa, 0xdb, 0xdf, 0xfe, 0xde, 0x85, 0xa7, 0xbe, 0xf3, 0xbd, 0x0b, 0x4f, 0xfd, 0xd1, + 0xf7, 0x2e, 0x3c, 0xf5, 0xa9, 0xc3, 0x0b, 0xd6, 0xb7, 0x0f, 0x2f, 0x58, 0xdf, 0x39, 0xbc, 0x60, + 0xfd, 0xd1, 0xe1, 0x05, 0xeb, 0xdd, 0xc3, 0x0b, 0xd6, 0x97, 0xff, 0xdb, 0x85, 0xa7, 0xde, 0xee, + 0x19, 0xcf, 0x41, 0x7f, 0xbc, 0xe2, 0xd6, 0xe6, 0xf7, 0x2e, 0xb1, 0x90, 0x02, 0x3a, 0x1a, 0xe6, + 0x8d, 0x2e, 0x30, 0x2f, 0x47, 0xc3, 0x5f, 0x06, 0x00, 0x00, 0xff, 0xff, 0x50, 0xe9, 0xc7, 0x1e, + 0xc5, 0xb6, 0x00, 0x00, } func (m *AWSAuthConfig) Marshal() (dAtA []byte, err error) { @@ -6051,6 +6087,20 @@ func (m *ApplicationSourcePlugin) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l + if len(m.Parameters) > 0 { + for iNdEx := len(m.Parameters) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Parameters[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } if len(m.Env) > 0 { for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { { @@ -6073,7 +6123,7 @@ func (m *ApplicationSourcePlugin) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *ApplicationSpec) Marshal() (dAtA []byte, err error) { +func (m *ApplicationSourcePluginParameter) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6083,42 +6133,110 @@ func (m *ApplicationSpec) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ApplicationSpec) MarshalTo(dAtA []byte) (int, error) { +func (m *ApplicationSourcePluginParameter) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ApplicationSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ApplicationSourcePluginParameter) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.RevisionHistoryLimit != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.RevisionHistoryLimit)) + if m.String_ != nil { + i -= len(*m.String_) + copy(dAtA[i:], *m.String_) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.String_))) i-- - dAtA[i] = 0x38 + dAtA[i] = 0x2a } - if len(m.Info) > 0 { - for iNdEx := len(m.Info) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Info[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } + if len(m.Array) > 0 { + for iNdEx := len(m.Array) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Array[iNdEx]) + copy(dAtA[i:], m.Array[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Array[iNdEx]))) i-- - dAtA[i] = 0x32 + dAtA[i] = 0x22 } } - if len(m.IgnoreDifferences) > 0 { - for iNdEx := len(m.IgnoreDifferences) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.IgnoreDifferences[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } + if len(m.Map) > 0 { + keysForMap := make([]string, 0, len(m.Map)) + for k := range m.Map { + keysForMap = append(keysForMap, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForMap) + for iNdEx := len(keysForMap) - 1; iNdEx >= 0; iNdEx-- { + v := m.Map[string(keysForMap[iNdEx])] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintGenerated(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(keysForMap[iNdEx]) + copy(dAtA[i:], keysForMap[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForMap[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x1a + } + } + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ApplicationSpec) 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 *ApplicationSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplicationSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.RevisionHistoryLimit != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.RevisionHistoryLimit)) + i-- + dAtA[i] = 0x38 + } + if len(m.Info) > 0 { + for iNdEx := len(m.Info) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Info[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if len(m.IgnoreDifferences) > 0 { + for iNdEx := len(m.IgnoreDifferences) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.IgnoreDifferences[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } i -= size i = encodeVarintGenerated(dAtA, i, uint64(size)) } @@ -12394,6 +12512,41 @@ func (m *ApplicationSourcePlugin) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if len(m.Parameters) > 0 { + for _, e := range m.Parameters { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ApplicationSourcePluginParameter) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Map) > 0 { + for k, v := range m.Map { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + if len(m.Array) > 0 { + for _, s := range m.Array { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.String_ != nil { + l = len(*m.String_) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -15011,9 +15164,38 @@ func (this *ApplicationSourcePlugin) String() string { repeatedStringForEnv += strings.Replace(f.String(), "EnvEntry", "EnvEntry", 1) + "," } repeatedStringForEnv += "}" + repeatedStringForParameters := "[]ApplicationSourcePluginParameter{" + for _, f := range this.Parameters { + repeatedStringForParameters += strings.Replace(strings.Replace(f.String(), "ApplicationSourcePluginParameter", "ApplicationSourcePluginParameter", 1), `&`, ``, 1) + "," + } + repeatedStringForParameters += "}" s := strings.Join([]string{`&ApplicationSourcePlugin{`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, `Env:` + repeatedStringForEnv + `,`, + `Parameters:` + repeatedStringForParameters + `,`, + `}`, + }, "") + return s +} +func (this *ApplicationSourcePluginParameter) String() string { + if this == nil { + return "nil" + } + keysForMap := make([]string, 0, len(this.Map)) + for k := range this.Map { + keysForMap = append(keysForMap, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForMap) + mapStringForMap := "map[string]string{" + for _, k := range keysForMap { + mapStringForMap += fmt.Sprintf("%v: %v,", k, this.Map[k]) + } + mapStringForMap += "}" + s := strings.Join([]string{`&ApplicationSourcePluginParameter{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Map:` + mapStringForMap + `,`, + `Array:` + fmt.Sprintf("%v", this.Array) + `,`, + `String_:` + valueToStringGenerated(this.String_) + `,`, `}`, }, "") return s @@ -22095,6 +22277,314 @@ func (m *ApplicationSourcePlugin) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Parameters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Parameters = append(m.Parameters, ApplicationSourcePluginParameter{}) + if err := m.Parameters[len(m.Parameters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ApplicationSourcePluginParameter) 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 ErrIntOverflowGenerated + } + 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: ApplicationSourcePluginParameter: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplicationSourcePluginParameter: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + 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 ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Map", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Map == nil { + m.Map = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Map[mapkey] = mapvalue + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Array", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + 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 ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Array = append(m.Array, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field String_", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + 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 ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.String_ = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/application/v1alpha1/generated.proto b/pkg/apis/application/v1alpha1/generated.proto index 20b1b9866ed12..2f33ced1df808 100644 --- a/pkg/apis/application/v1alpha1/generated.proto +++ b/pkg/apis/application/v1alpha1/generated.proto @@ -418,6 +418,22 @@ message ApplicationSourcePlugin { optional string name = 1; repeated EnvEntry env = 2; + + repeated ApplicationSourcePluginParameter parameters = 3; +} + +message ApplicationSourcePluginParameter { + // Name is the name identifying a parameter. + optional string name = 1; + + // String_ is the value of a string type parameter. + optional string string = 5; + + // Map is the value of a map type parameter. + map map = 3; + + // Array is the value of an array type parameter. + repeated string array = 4; } // ApplicationSpec represents desired application state. Contains link to repository with application definition and additional parameters link definition revision. diff --git a/pkg/apis/application/v1alpha1/openapi_generated.go b/pkg/apis/application/v1alpha1/openapi_generated.go index fdd836709feae..e132e393c0721 100644 --- a/pkg/apis/application/v1alpha1/openapi_generated.go +++ b/pkg/apis/application/v1alpha1/openapi_generated.go @@ -40,6 +40,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSourceJsonnet": schema_pkg_apis_application_v1alpha1_ApplicationSourceJsonnet(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSourceKustomize": schema_pkg_apis_application_v1alpha1_ApplicationSourceKustomize(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSourcePlugin": schema_pkg_apis_application_v1alpha1_ApplicationSourcePlugin(ref), + "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSourcePluginParameter": schema_pkg_apis_application_v1alpha1_ApplicationSourcePluginParameter(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSpec": schema_pkg_apis_application_v1alpha1_ApplicationSpec(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationStatus": schema_pkg_apis_application_v1alpha1_ApplicationStatus(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSummary": schema_pkg_apis_application_v1alpha1_ApplicationSummary(ref), @@ -1551,11 +1552,81 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSourcePlugin(ref common.Ref }, }, }, + "parameters": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSourcePluginParameter"), + }, + }, + }, + }, + }, }, }, }, Dependencies: []string{ - "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.EnvEntry"}, + "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSourcePluginParameter", "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.EnvEntry"}, + } +} + +func schema_pkg_apis_application_v1alpha1_ApplicationSourcePluginParameter(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name is the name identifying a parameter.", + Type: []string{"string"}, + Format: "", + }, + }, + "string": { + SchemaProps: spec.SchemaProps{ + Description: "String_ is the value of a string type parameter.", + Type: []string{"string"}, + Format: "", + }, + }, + "map": { + SchemaProps: spec.SchemaProps{ + Description: "Map is the value of a map type parameter.", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "array": { + SchemaProps: spec.SchemaProps{ + Description: "Array is the value of an array type parameter.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + }, + }, + }, } } diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go index d2b45e4110eb3..b36bcc727bf2e 100644 --- a/pkg/apis/application/v1alpha1/types.go +++ b/pkg/apis/application/v1alpha1/types.go @@ -462,10 +462,63 @@ func (d *ApplicationSourceDirectory) IsZero() bool { return d == nil || !d.Recurse && d.Jsonnet.IsZero() } +type ApplicationSourcePluginParameter struct { + // Name is the name identifying a parameter. + Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` + // String_ is the value of a string type parameter. + String_ *string `json:"string,omitempty" protobuf:"bytes,5,opt,name=string"` + // Map is the value of a map type parameter. + Map map[string]string `json:"map,omitempty" protobuf:"bytes,3,rep,name=map"` + // Array is the value of an array type parameter. + Array []string `json:"array,omitempty" protobuf:"bytes,4,rep,name=array"` +} + +type ApplicationSourcePluginParameters []ApplicationSourcePluginParameter + +// Environ builds a list of environment variables to represent parameters sent to a plugin from the Application +// manifest. Parameters are represented as one large stringified JSON array (under `ARGOCD_APP_PARAMETERS`). They're +// also represented as individual environment variables, each variable's key being an escaped version of the parameter's +// name. +func (p ApplicationSourcePluginParameters) Environ() ([]string, error) { + out, err := json.Marshal(p) + if err != nil { + return nil, fmt.Errorf("failed to marshal plugin parameters: %w", err) + } + jsonParam := fmt.Sprintf("ARGOCD_APP_PARAMETERS=%s", string(out)) + + env := []string{jsonParam} + + for _, param := range p { + envBaseName := fmt.Sprintf("PARAM_%s", escaped(param.Name)) + if param.String_ != nil { + env = append(env, fmt.Sprintf("%s=%s", envBaseName, *param.String_)) + } + if param.Map != nil { + for key, value := range param.Map { + env = append(env, fmt.Sprintf("%s_%s=%s", envBaseName, escaped(key), value)) + } + } + if param.Array != nil { + for i, value := range param.Array { + env = append(env, fmt.Sprintf("%s_%d=%s", envBaseName, i, value)) + } + } + } + + return env, nil +} + +func escaped(paramName string) string { + newParamName := strings.ToUpper(paramName) + invalidParamCharRegex := regexp.MustCompile("[^A-Z0-9_]") + return invalidParamCharRegex.ReplaceAllString(newParamName, "_") +} + // ApplicationSourcePlugin holds options specific to config management plugins type ApplicationSourcePlugin struct { - Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` - Env `json:"env,omitempty" protobuf:"bytes,2,opt,name=env"` + Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` + Env `json:"env,omitempty" protobuf:"bytes,2,opt,name=env"` + Parameters ApplicationSourcePluginParameters `json:"parameters,omitempty" protobuf:"bytes,3,opt,name=parameters"` } // IsZero returns true if the ApplicationSourcePlugin is considered empty diff --git a/pkg/apis/application/v1alpha1/types_test.go b/pkg/apis/application/v1alpha1/types_test.go index 4326aa0d841bc..ca7703687c9ed 100644 --- a/pkg/apis/application/v1alpha1/types_test.go +++ b/pkg/apis/application/v1alpha1/types_test.go @@ -1,6 +1,7 @@ package v1alpha1 import ( + "encoding/json" "errors" fmt "fmt" "os" @@ -11,6 +12,7 @@ import ( "time" argocdcommon "github.com/argoproj/argo-cd/v2/common" + "github.com/stretchr/testify/require" "k8s.io/utils/pointer" "github.com/argoproj/gitops-engine/pkg/sync/common" @@ -3158,3 +3160,84 @@ func Test_RBACName(t *testing.T) { assert.Equal(t, "default/test-app", a.RBACName("argocd")) }) } + +func TestApplicationSourcePluginParameters_Environ_string(t *testing.T) { + params := ApplicationSourcePluginParameters{ + { + Name: "version", + String_: pointer.String("1.2.3"), + }, + } + environ, err := params.Environ() + require.NoError(t, err) + assert.Len(t, environ, 2) + assert.Contains(t, environ, "PARAM_VERSION=1.2.3") + paramsJson, err := json.Marshal(params) + require.NoError(t, err) + assert.Contains(t, environ, fmt.Sprintf("ARGOCD_APP_PARAMETERS=%s", paramsJson)) +} + +func TestApplicationSourcePluginParameters_Environ_array(t *testing.T) { + params := ApplicationSourcePluginParameters{ + { + Name: "dependencies", + Array: []string{"redis", "minio"}, + }, + } + environ, err := params.Environ() + require.NoError(t, err) + assert.Len(t, environ, 3) + assert.Contains(t, environ, "PARAM_DEPENDENCIES_0=redis") + assert.Contains(t, environ, "PARAM_DEPENDENCIES_1=minio") + paramsJson, err := json.Marshal(params) + require.NoError(t, err) + assert.Contains(t, environ, fmt.Sprintf("ARGOCD_APP_PARAMETERS=%s", paramsJson)) +} + +func TestApplicationSourcePluginParameters_Environ_map(t *testing.T) { + params := ApplicationSourcePluginParameters{ + { + Name: "helm-parameters", + Map: map[string]string{ + "image.repo": "quay.io/argoproj/argo-cd", + "image.tag": "v2.4.0", + }, + }, + } + environ, err := params.Environ() + require.NoError(t, err) + assert.Len(t, environ, 3) + assert.Contains(t, environ, "PARAM_HELM_PARAMETERS_IMAGE_REPO=quay.io/argoproj/argo-cd") + assert.Contains(t, environ, "PARAM_HELM_PARAMETERS_IMAGE_TAG=v2.4.0") + paramsJson, err := json.Marshal(params) + require.NoError(t, err) + assert.Contains(t, environ, fmt.Sprintf("ARGOCD_APP_PARAMETERS=%s", paramsJson)) +} + +func TestApplicationSourcePluginParameters_Environ_all(t *testing.T) { + // Technically there's no rule against specifying multiple types as values. It's up to the CMP how to handle them. + // Name collisions can happen for the convenience env vars. When in doubt, CMP authors should use the JSON env var. + params := ApplicationSourcePluginParameters{ + { + Name: "some-name", + String_: pointer.String("1.2.3"), + Array: []string{"redis", "minio"}, + Map: map[string]string{ + "image.repo": "quay.io/argoproj/argo-cd", + "image.tag": "v2.4.0", + }, + }, + } + environ, err := params.Environ() + require.NoError(t, err) + assert.Len(t, environ, 6) + assert.Contains(t, environ, "PARAM_SOME_NAME=1.2.3") + assert.Contains(t, environ, "PARAM_SOME_NAME_0=redis") + assert.Contains(t, environ, "PARAM_SOME_NAME_1=minio") + assert.Contains(t, environ, "PARAM_SOME_NAME_IMAGE_REPO=quay.io/argoproj/argo-cd") + assert.Contains(t, environ, "PARAM_SOME_NAME_IMAGE_TAG=v2.4.0") + paramsJson, err := json.Marshal(params) + require.NoError(t, err) + assert.Contains(t, environ, fmt.Sprintf("ARGOCD_APP_PARAMETERS=%s", paramsJson)) +} + diff --git a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go index 379167df25754..e531a4715b0f2 100644 --- a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go @@ -871,6 +871,13 @@ func (in *ApplicationSourcePlugin) DeepCopyInto(out *ApplicationSourcePlugin) { } } } + if in.Parameters != nil { + in, out := &in.Parameters, &out.Parameters + *out = make(ApplicationSourcePluginParameters, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -884,6 +891,61 @@ func (in *ApplicationSourcePlugin) DeepCopy() *ApplicationSourcePlugin { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ApplicationSourcePluginParameter) DeepCopyInto(out *ApplicationSourcePluginParameter) { + *out = *in + if in.String_ != nil { + in, out := &in.String_, &out.String_ + *out = new(string) + **out = **in + } + if in.Map != nil { + in, out := &in.Map, &out.Map + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Array != nil { + in, out := &in.Array, &out.Array + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationSourcePluginParameter. +func (in *ApplicationSourcePluginParameter) DeepCopy() *ApplicationSourcePluginParameter { + if in == nil { + return nil + } + out := new(ApplicationSourcePluginParameter) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in ApplicationSourcePluginParameters) DeepCopyInto(out *ApplicationSourcePluginParameters) { + { + in := &in + *out = make(ApplicationSourcePluginParameters, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + return + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationSourcePluginParameters. +func (in ApplicationSourcePluginParameters) DeepCopy() ApplicationSourcePluginParameters { + if in == nil { + return nil + } + out := new(ApplicationSourcePluginParameters) + in.DeepCopyInto(out) + return *out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ApplicationSpec) DeepCopyInto(out *ApplicationSpec) { *out = *in diff --git a/reposerver/apiclient/repository.pb.go b/reposerver/apiclient/repository.pb.go index 395053e10cd0f..4c866ac54793f 100644 --- a/reposerver/apiclient/repository.pb.go +++ b/reposerver/apiclient/repository.pb.go @@ -1067,6 +1067,7 @@ type RepoAppDetailsResponse struct { Helm *HelmAppSpec `protobuf:"bytes,3,opt,name=helm,proto3" json:"helm,omitempty"` Kustomize *KustomizeAppSpec `protobuf:"bytes,4,opt,name=kustomize,proto3" json:"kustomize,omitempty"` Directory *DirectoryAppSpec `protobuf:"bytes,5,opt,name=directory,proto3" json:"directory,omitempty"` + Plugin *PluginAppSpec `protobuf:"bytes,6,opt,name=plugin,proto3" json:"plugin,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1133,6 +1134,13 @@ func (m *RepoAppDetailsResponse) GetDirectory() *DirectoryAppSpec { return nil } +func (m *RepoAppDetailsResponse) GetPlugin() *PluginAppSpec { + if m != nil { + return m.Plugin + } + return nil +} + type RepoServerRevisionMetadataRequest struct { // the repo Repo *v1alpha1.Repository `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` @@ -1371,6 +1379,177 @@ func (m *DirectoryAppSpec) XXX_DiscardUnknown() { var xxx_messageInfo_DirectoryAppSpec proto.InternalMessageInfo +type ParameterAnnouncement struct { + // name is the name identifying a parameter. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // title is a human-readable text of the parameter name. + Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + // tooltip is a human-readable description of the parameter. + Tooltip string `protobuf:"bytes,3,opt,name=tooltip,proto3" json:"tooltip,omitempty"` + // required defines if this given parameter is mandatory. + Required bool `protobuf:"varint,4,opt,name=required,proto3" json:"required,omitempty"` + // itemType determines the primitive data type represented by the parameter. Parameters are always encoded as + // strings, but this field lets them be interpreted as other primitive types. + ItemType string `protobuf:"bytes,5,opt,name=itemType,proto3" json:"itemType,omitempty"` + // collectionType is the type of value this parameter holds - either a single value (a string) or a collection + // (array or map). If collectionType is set, only the field with that type will be used. If collectionType is not + // set, `string` is the default. If collectionType is set to an invalid value, a validation error is thrown. + CollectionType string `protobuf:"bytes,6,opt,name=collectionType,proto3" json:"collectionType,omitempty"` + // string is the default value of the parameter if the parameter is a string. + String_ string `protobuf:"bytes,7,opt,name=string,proto3" json:"string,omitempty"` + // array is the default value of the parameter if the parameter is an array. + Array []string `protobuf:"bytes,8,rep,name=array,proto3" json:"array,omitempty"` + // map is the default value of the parameter if the parameter is a map. + Map map[string]string `protobuf:"bytes,9,rep,name=map,proto3" json:"map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ParameterAnnouncement) Reset() { *m = ParameterAnnouncement{} } +func (m *ParameterAnnouncement) String() string { return proto.CompactTextString(m) } +func (*ParameterAnnouncement) ProtoMessage() {} +func (*ParameterAnnouncement) Descriptor() ([]byte, []int) { + return fileDescriptor_dd8723cfcc820480, []int{19} +} +func (m *ParameterAnnouncement) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ParameterAnnouncement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ParameterAnnouncement.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 *ParameterAnnouncement) XXX_Merge(src proto.Message) { + xxx_messageInfo_ParameterAnnouncement.Merge(m, src) +} +func (m *ParameterAnnouncement) XXX_Size() int { + return m.Size() +} +func (m *ParameterAnnouncement) XXX_DiscardUnknown() { + xxx_messageInfo_ParameterAnnouncement.DiscardUnknown(m) +} + +var xxx_messageInfo_ParameterAnnouncement proto.InternalMessageInfo + +func (m *ParameterAnnouncement) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *ParameterAnnouncement) GetTitle() string { + if m != nil { + return m.Title + } + return "" +} + +func (m *ParameterAnnouncement) GetTooltip() string { + if m != nil { + return m.Tooltip + } + return "" +} + +func (m *ParameterAnnouncement) GetRequired() bool { + if m != nil { + return m.Required + } + return false +} + +func (m *ParameterAnnouncement) GetItemType() string { + if m != nil { + return m.ItemType + } + return "" +} + +func (m *ParameterAnnouncement) GetCollectionType() string { + if m != nil { + return m.CollectionType + } + return "" +} + +func (m *ParameterAnnouncement) GetString_() string { + if m != nil { + return m.String_ + } + return "" +} + +func (m *ParameterAnnouncement) GetArray() []string { + if m != nil { + return m.Array + } + return nil +} + +func (m *ParameterAnnouncement) GetMap() map[string]string { + if m != nil { + return m.Map + } + return nil +} + +// PluginAppSpec contains details about a plugin-type Application +type PluginAppSpec struct { + ParametersAnnouncement []*ParameterAnnouncement `protobuf:"bytes,1,rep,name=parametersAnnouncement,proto3" json:"parametersAnnouncement,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PluginAppSpec) Reset() { *m = PluginAppSpec{} } +func (m *PluginAppSpec) String() string { return proto.CompactTextString(m) } +func (*PluginAppSpec) ProtoMessage() {} +func (*PluginAppSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_dd8723cfcc820480, []int{20} +} +func (m *PluginAppSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PluginAppSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PluginAppSpec.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 *PluginAppSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_PluginAppSpec.Merge(m, src) +} +func (m *PluginAppSpec) XXX_Size() int { + return m.Size() +} +func (m *PluginAppSpec) XXX_DiscardUnknown() { + xxx_messageInfo_PluginAppSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_PluginAppSpec proto.InternalMessageInfo + +func (m *PluginAppSpec) GetParametersAnnouncement() []*ParameterAnnouncement { + if m != nil { + return m.ParametersAnnouncement + } + return nil +} + type HelmChartsRequest struct { Repo *v1alpha1.Repository `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -1382,7 +1561,7 @@ func (m *HelmChartsRequest) Reset() { *m = HelmChartsRequest{} } func (m *HelmChartsRequest) String() string { return proto.CompactTextString(m) } func (*HelmChartsRequest) ProtoMessage() {} func (*HelmChartsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{19} + return fileDescriptor_dd8723cfcc820480, []int{21} } func (m *HelmChartsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1430,7 +1609,7 @@ func (m *HelmChart) Reset() { *m = HelmChart{} } func (m *HelmChart) String() string { return proto.CompactTextString(m) } func (*HelmChart) ProtoMessage() {} func (*HelmChart) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{20} + return fileDescriptor_dd8723cfcc820480, []int{22} } func (m *HelmChart) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1484,7 +1663,7 @@ func (m *HelmChartsResponse) Reset() { *m = HelmChartsResponse{} } func (m *HelmChartsResponse) String() string { return proto.CompactTextString(m) } func (*HelmChartsResponse) ProtoMessage() {} func (*HelmChartsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_dd8723cfcc820480, []int{21} + return fileDescriptor_dd8723cfcc820480, []int{23} } func (m *HelmChartsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1544,6 +1723,9 @@ func init() { proto.RegisterType((*HelmAppSpec)(nil), "repository.HelmAppSpec") proto.RegisterType((*KustomizeAppSpec)(nil), "repository.KustomizeAppSpec") proto.RegisterType((*DirectoryAppSpec)(nil), "repository.DirectoryAppSpec") + proto.RegisterType((*ParameterAnnouncement)(nil), "repository.ParameterAnnouncement") + proto.RegisterMapType((map[string]string)(nil), "repository.ParameterAnnouncement.MapEntry") + proto.RegisterType((*PluginAppSpec)(nil), "repository.PluginAppSpec") proto.RegisterType((*HelmChartsRequest)(nil), "repository.HelmChartsRequest") proto.RegisterType((*HelmChart)(nil), "repository.HelmChart") proto.RegisterType((*HelmChartsResponse)(nil), "repository.HelmChartsResponse") @@ -1554,104 +1736,115 @@ func init() { } var fileDescriptor_dd8723cfcc820480 = []byte{ - // 1551 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0xdf, 0x6e, 0x1b, 0x45, - 0x17, 0xcf, 0xda, 0x8e, 0x63, 0x9f, 0xb4, 0x89, 0x33, 0xfd, 0xb7, 0xf5, 0x97, 0x46, 0xe9, 0x7e, - 0xdf, 0x57, 0x05, 0x4a, 0x6d, 0x35, 0x15, 0x14, 0xb5, 0x02, 0x29, 0x4d, 0xdb, 0xa4, 0x6a, 0xd3, - 0x84, 0x49, 0x05, 0x02, 0x2a, 0xd0, 0x64, 0x3d, 0x59, 0x0f, 0xf6, 0xee, 0x4e, 0x77, 0x76, 0x8d, - 0x5c, 0x89, 0x0b, 0x5e, 0x81, 0x0b, 0x5e, 0x85, 0x4b, 0xae, 0x40, 0xbd, 0x04, 0x9e, 0x00, 0xf5, - 0x86, 0xd7, 0x40, 0x33, 0xfb, 0xd7, 0xeb, 0x75, 0x5a, 0xe4, 0x34, 0x15, 0x37, 0xf6, 0xcc, 0x99, - 0x33, 0xe7, 0x77, 0xe6, 0xcc, 0xf9, 0x37, 0x0b, 0x57, 0x3c, 0xca, 0x5d, 0x41, 0xbd, 0x01, 0xf5, - 0xda, 0x6a, 0xc8, 0x7c, 0xd7, 0x1b, 0x66, 0x86, 0x2d, 0xee, 0xb9, 0xbe, 0x8b, 0x20, 0xa5, 0x34, - 0x1f, 0x59, 0xcc, 0xef, 0x06, 0x07, 0x2d, 0xd3, 0xb5, 0xdb, 0xc4, 0xb3, 0x5c, 0xee, 0xb9, 0xdf, - 0xa8, 0xc1, 0x35, 0xb3, 0xd3, 0x1e, 0xac, 0xb7, 0x79, 0xcf, 0x6a, 0x13, 0xce, 0x44, 0x9b, 0x70, - 0xde, 0x67, 0x26, 0xf1, 0x99, 0xeb, 0xb4, 0x07, 0xd7, 0x49, 0x9f, 0x77, 0xc9, 0xf5, 0xb6, 0x45, - 0x1d, 0xea, 0x11, 0x9f, 0x76, 0x42, 0xc9, 0xc6, 0x0f, 0x00, 0x8b, 0x3b, 0xc4, 0x61, 0x87, 0x54, - 0xf8, 0x98, 0x3e, 0x0b, 0xa8, 0xf0, 0xd1, 0x53, 0xa8, 0x48, 0x3c, 0x5d, 0x5b, 0xd5, 0xd6, 0xe6, - 0xd7, 0xb7, 0x5b, 0x29, 0x60, 0x2b, 0x06, 0x54, 0x83, 0xaf, 0xcd, 0x4e, 0x6b, 0xb0, 0xde, 0xe2, - 0x3d, 0xab, 0x25, 0x01, 0x5b, 0x19, 0xc0, 0x56, 0x0c, 0xd8, 0xc2, 0x89, 0xe6, 0x58, 0x49, 0x45, - 0x4d, 0xa8, 0x79, 0x74, 0xc0, 0x04, 0x73, 0x1d, 0xbd, 0xb4, 0xaa, 0xad, 0xd5, 0x71, 0x32, 0x47, - 0x3a, 0xcc, 0x39, 0xee, 0x26, 0x31, 0xbb, 0x54, 0x2f, 0xaf, 0x6a, 0x6b, 0x35, 0x1c, 0x4f, 0xd1, - 0x2a, 0xcc, 0x13, 0xce, 0x1f, 0x91, 0x03, 0xda, 0x7f, 0x48, 0x87, 0x7a, 0x45, 0x6d, 0xcc, 0x92, - 0xe4, 0x5e, 0xc2, 0xf9, 0x63, 0x62, 0x53, 0x7d, 0x56, 0xad, 0xc6, 0x53, 0xb4, 0x0c, 0x75, 0x87, - 0xd8, 0x54, 0x70, 0x62, 0x52, 0xbd, 0xa6, 0xd6, 0x52, 0x02, 0xfa, 0x0e, 0x96, 0x32, 0x8a, 0xef, - 0xbb, 0x81, 0x67, 0x52, 0x1d, 0xd4, 0xd1, 0x77, 0xa7, 0x3b, 0xfa, 0x46, 0x5e, 0x2c, 0x1e, 0x47, - 0x42, 0x5f, 0xc1, 0xac, 0xba, 0x5c, 0x7d, 0x7e, 0xb5, 0x7c, 0xac, 0xd6, 0x0e, 0xc5, 0x22, 0x07, - 0xe6, 0x78, 0x3f, 0xb0, 0x98, 0x23, 0xf4, 0x53, 0x0a, 0xe1, 0xc9, 0x74, 0x08, 0x9b, 0xae, 0x73, - 0xc8, 0xac, 0x1d, 0xe2, 0x10, 0x8b, 0xda, 0xd4, 0xf1, 0xf7, 0x94, 0x70, 0x1c, 0x83, 0xa0, 0xe7, - 0xd0, 0xe8, 0x05, 0xc2, 0x77, 0x6d, 0xf6, 0x9c, 0xee, 0x72, 0xb9, 0x57, 0xe8, 0xa7, 0x95, 0x35, - 0x1f, 0x4f, 0x07, 0xfc, 0x30, 0x27, 0x15, 0x8f, 0xe1, 0x48, 0x27, 0xe9, 0x05, 0x07, 0xf4, 0x53, - 0xea, 0x29, 0xef, 0x5a, 0x08, 0x9d, 0x24, 0x43, 0x0a, 0xdd, 0x88, 0x45, 0x33, 0xa1, 0x2f, 0xae, - 0x96, 0x43, 0x37, 0x4a, 0x48, 0x68, 0x0d, 0x16, 0x07, 0xd4, 0x63, 0x87, 0xc3, 0x7d, 0x66, 0x39, - 0xc4, 0x0f, 0x3c, 0xaa, 0x37, 0x94, 0x2b, 0xe6, 0xc9, 0xc8, 0x86, 0xd3, 0x5d, 0xda, 0xb7, 0xa5, - 0xc9, 0x37, 0x3d, 0xda, 0x11, 0xfa, 0x92, 0xb2, 0xef, 0xd6, 0xf4, 0x37, 0xa8, 0xc4, 0xe1, 0x51, - 0xe9, 0x52, 0x31, 0xc7, 0xc5, 0x51, 0xa4, 0x84, 0x31, 0x82, 0x42, 0xc5, 0x72, 0x64, 0x74, 0x05, - 0x16, 0x7c, 0x8f, 0x98, 0x3d, 0xe6, 0x58, 0x3b, 0xd4, 0xef, 0xba, 0x1d, 0xfd, 0x8c, 0xb2, 0x44, - 0x8e, 0x8a, 0x4c, 0x40, 0xd4, 0x21, 0x07, 0x7d, 0xda, 0x09, 0x7d, 0xf1, 0xc9, 0x90, 0x53, 0xa1, - 0x9f, 0x55, 0xa7, 0xb8, 0xd1, 0xca, 0x24, 0xa1, 0x5c, 0x82, 0x68, 0xdd, 0x1b, 0xdb, 0x75, 0xcf, - 0xf1, 0xbd, 0x21, 0x2e, 0x10, 0x87, 0x7a, 0x30, 0x2f, 0xcf, 0x11, 0xbb, 0xc2, 0x39, 0xe5, 0x0a, - 0x0f, 0xa6, 0xb3, 0xd1, 0x76, 0x2a, 0x10, 0x67, 0xa5, 0x37, 0xef, 0xc1, 0x85, 0x09, 0xba, 0xa1, - 0x06, 0x94, 0x7b, 0x74, 0xa8, 0x72, 0x5a, 0x1d, 0xcb, 0x21, 0x3a, 0x0b, 0xb3, 0x03, 0xd2, 0x0f, - 0xa8, 0xca, 0x42, 0x35, 0x1c, 0x4e, 0x6e, 0x95, 0x3e, 0xd4, 0x8c, 0x3f, 0x34, 0xd0, 0x73, 0x67, - 0xfe, 0x8c, 0xf9, 0xdd, 0xfb, 0xac, 0x4f, 0x05, 0xba, 0x09, 0x73, 0x5e, 0x48, 0x8b, 0x12, 0xe4, - 0x7f, 0x8e, 0x30, 0xd5, 0xf6, 0x0c, 0x8e, 0xb9, 0xd1, 0xc7, 0x50, 0xb3, 0xa9, 0x4f, 0x3a, 0xc4, - 0x27, 0x0a, 0x72, 0x7e, 0x7d, 0xb5, 0x68, 0xa7, 0x44, 0xd9, 0x89, 0xf8, 0xb6, 0x67, 0x70, 0xb2, - 0x07, 0xbd, 0x0f, 0xb3, 0x66, 0x37, 0x70, 0x7a, 0x2a, 0x35, 0xce, 0xaf, 0x5f, 0x9a, 0xb4, 0x79, - 0x53, 0x32, 0x6d, 0xcf, 0xe0, 0x90, 0xfb, 0x4e, 0x15, 0x2a, 0x9c, 0x78, 0xbe, 0x71, 0x1f, 0xce, - 0x16, 0x41, 0xc8, 0x7c, 0x6c, 0x76, 0xa9, 0xd9, 0x13, 0x81, 0x1d, 0x59, 0x27, 0x99, 0x23, 0x04, - 0x15, 0xc1, 0x9e, 0x87, 0x16, 0x2a, 0x63, 0x35, 0x36, 0xde, 0x81, 0xa5, 0x31, 0x34, 0x69, 0xcb, - 0x50, 0x37, 0x29, 0xe1, 0x54, 0x04, 0x6d, 0x04, 0x70, 0xee, 0x89, 0xb2, 0x45, 0x92, 0x94, 0x4e, - 0xa2, 0xc2, 0x18, 0xdb, 0x70, 0x3e, 0x0f, 0x2b, 0xb8, 0xeb, 0x08, 0x8a, 0x5a, 0x80, 0x54, 0x14, - 0x33, 0xda, 0x49, 0x57, 0x95, 0x16, 0x35, 0x5c, 0xb0, 0x62, 0x7c, 0x5f, 0x82, 0xf3, 0x98, 0x0a, - 0xb7, 0x3f, 0xa0, 0x71, 0x88, 0x9d, 0x4c, 0x91, 0xfc, 0x12, 0xca, 0x84, 0xf3, 0xc8, 0x4d, 0x1e, - 0x1c, 0x5b, 0x19, 0xc2, 0x52, 0x2a, 0x7a, 0x0f, 0x96, 0x88, 0x7d, 0xc0, 0xac, 0xc0, 0x0d, 0x44, - 0x7c, 0x2c, 0xe5, 0x54, 0x75, 0x3c, 0xbe, 0x60, 0x98, 0x70, 0x61, 0xcc, 0x04, 0x91, 0x39, 0xb3, - 0xa5, 0x5c, 0xcb, 0x95, 0xf2, 0x42, 0x90, 0xd2, 0x24, 0x90, 0x5f, 0x35, 0x68, 0xa4, 0xa1, 0x13, - 0x89, 0x5f, 0x86, 0xba, 0x1d, 0xd1, 0x84, 0xae, 0xa9, 0x54, 0x9d, 0x12, 0x46, 0xab, 0x7a, 0x29, - 0x5f, 0xd5, 0xcf, 0x43, 0x35, 0xec, 0xab, 0xa2, 0x83, 0x45, 0xb3, 0x11, 0x95, 0x2b, 0x39, 0x95, - 0x57, 0x00, 0x44, 0x92, 0x36, 0xf4, 0xaa, 0x5a, 0xcd, 0x50, 0x90, 0x01, 0xa7, 0xc2, 0x1a, 0x80, - 0xa9, 0x08, 0xfa, 0xbe, 0x3e, 0xa7, 0x38, 0x46, 0x68, 0x86, 0x0b, 0x8b, 0x8f, 0x98, 0x3c, 0xc3, - 0xa1, 0x38, 0x19, 0x67, 0xff, 0x00, 0x2a, 0x12, 0x4c, 0x1e, 0xec, 0xc0, 0x23, 0x8e, 0xd9, 0xa5, - 0xb1, 0xad, 0x92, 0xb9, 0x0c, 0x63, 0x9f, 0x58, 0x42, 0x2f, 0x29, 0xba, 0x1a, 0x1b, 0x3f, 0x95, - 0x42, 0x4d, 0x37, 0x38, 0x17, 0x6f, 0xbf, 0xf1, 0x2b, 0x2e, 0x45, 0xe5, 0xf1, 0x52, 0x94, 0x53, - 0xf9, 0x9f, 0x94, 0xa2, 0xe3, 0xaa, 0x0e, 0x01, 0xcc, 0x6d, 0x70, 0x2e, 0x15, 0x41, 0xd7, 0xa1, - 0x42, 0x38, 0x0f, 0x0d, 0x9e, 0xcb, 0xc8, 0x11, 0x8b, 0xfc, 0x8f, 0x54, 0x52, 0xac, 0xcd, 0x9b, - 0x50, 0x4f, 0x48, 0xaf, 0x82, 0xad, 0x67, 0x61, 0xff, 0xaa, 0xc2, 0x45, 0x69, 0xd3, 0x7d, 0xe5, - 0xc8, 0x1b, 0x9c, 0xdf, 0xa5, 0x3e, 0x61, 0x7d, 0xf1, 0x49, 0x40, 0xbd, 0xe1, 0x1b, 0xbe, 0x3a, - 0x0b, 0xaa, 0x61, 0x1c, 0x44, 0x19, 0xe9, 0xd8, 0x1b, 0xe3, 0x48, 0x7c, 0xda, 0x0d, 0x97, 0xdf, - 0x4c, 0x37, 0x5c, 0xd4, 0x9d, 0x56, 0x4e, 0xa8, 0x3b, 0x9d, 0xfc, 0x40, 0xc9, 0x3c, 0x7b, 0xaa, - 0xa3, 0xcf, 0x9e, 0x82, 0xa6, 0x6f, 0xee, 0x75, 0x9b, 0xbe, 0x5a, 0x61, 0xd3, 0x67, 0x17, 0x46, - 0x5a, 0x5d, 0x99, 0xfb, 0xa3, 0xac, 0x03, 0x4f, 0xf4, 0xb5, 0x69, 0xda, 0x3f, 0xf8, 0x37, 0xb4, - 0x7f, 0xbf, 0x6b, 0xb2, 0xea, 0x73, 0x37, 0x3d, 0x77, 0x52, 0x92, 0x64, 0x26, 0x95, 0xc5, 0x21, - 0x94, 0xa3, 0xc6, 0xe8, 0x2a, 0x54, 0xa4, 0x12, 0x51, 0x5b, 0x76, 0x21, 0x6b, 0x43, 0xa9, 0xe9, - 0x06, 0xe7, 0xfb, 0x9c, 0x9a, 0x58, 0x31, 0xa1, 0x5b, 0x50, 0x4f, 0x1c, 0x23, 0xf2, 0xbc, 0xe5, - 0xec, 0x8e, 0xc4, 0x8f, 0xe2, 0x6d, 0x29, 0xbb, 0xdc, 0xdb, 0x61, 0x1e, 0x35, 0x55, 0xd3, 0x32, - 0x3b, 0xbe, 0xf7, 0x6e, 0xbc, 0x98, 0xec, 0x4d, 0xd8, 0x8d, 0x5f, 0x34, 0xb8, 0x9c, 0xde, 0x68, - 0xec, 0x3a, 0x71, 0x13, 0xf8, 0xf6, 0x0b, 0xc0, 0x15, 0x58, 0x50, 0x5d, 0x67, 0xfa, 0xea, 0x0a, - 0x3f, 0x00, 0xe4, 0xa8, 0xc6, 0xcf, 0x25, 0x98, 0xcf, 0x58, 0x55, 0x5e, 0x88, 0x2c, 0xfa, 0xf1, - 0x85, 0xc8, 0xb1, 0xac, 0xe3, 0xea, 0x32, 0x55, 0xbf, 0xae, 0x32, 0x49, 0x1d, 0x67, 0x28, 0xa8, - 0x07, 0xc0, 0x89, 0x47, 0x6c, 0xea, 0x53, 0x4f, 0x86, 0xbf, 0x74, 0xfd, 0x87, 0xd3, 0xbb, 0xe4, - 0x5e, 0x2c, 0x13, 0x67, 0xc4, 0xcb, 0x46, 0x44, 0x41, 0x8b, 0x28, 0xe8, 0xa3, 0x19, 0xfa, 0x16, - 0x16, 0x0e, 0x59, 0x9f, 0xee, 0xa5, 0x8a, 0x54, 0x95, 0x22, 0xbb, 0xd3, 0x2b, 0x72, 0x3f, 0x2b, - 0x17, 0xe7, 0x60, 0x8c, 0x77, 0xa1, 0x91, 0x77, 0x32, 0xa9, 0x24, 0xb3, 0x89, 0x95, 0x58, 0x2b, - 0x9a, 0x19, 0x08, 0x1a, 0x79, 0xa7, 0x32, 0x9e, 0xc1, 0x92, 0x04, 0xd9, 0xec, 0x12, 0xcf, 0x3f, - 0xa1, 0x1e, 0xe7, 0x36, 0xd4, 0x13, 0xc8, 0xc2, 0x1b, 0x6f, 0x42, 0x6d, 0x10, 0xbf, 0xe9, 0xc3, - 0x26, 0x27, 0x99, 0x1b, 0x1b, 0x80, 0xb2, 0xfa, 0x46, 0x81, 0x7c, 0x15, 0x66, 0x99, 0x4f, 0xed, - 0xb8, 0x74, 0x9f, 0xcb, 0x47, 0xad, 0x62, 0xc7, 0x21, 0xcf, 0xfa, 0x8b, 0x2a, 0x2c, 0xa5, 0xc1, - 0x23, 0x7f, 0x99, 0x49, 0xd1, 0x2e, 0x34, 0xb6, 0xa2, 0xaf, 0x69, 0x71, 0xeb, 0x8a, 0x8e, 0x7a, - 0x0b, 0x36, 0x97, 0x8b, 0x17, 0x43, 0x8d, 0x8c, 0x19, 0x64, 0xc2, 0xc5, 0xbc, 0xc0, 0xf4, 0xd9, - 0xf9, 0xbf, 0x23, 0x24, 0x27, 0x5c, 0xaf, 0x82, 0x58, 0xd3, 0xd0, 0xe7, 0xb0, 0x30, 0xfa, 0x38, - 0x42, 0x97, 0xb3, 0x7b, 0x0a, 0xdf, 0x6b, 0x4d, 0xe3, 0x28, 0x96, 0x44, 0xff, 0xa7, 0xb0, 0x98, - 0x7b, 0x29, 0x20, 0x63, 0xb4, 0xa2, 0x14, 0xbd, 0xa4, 0x9a, 0xff, 0x3d, 0x92, 0x27, 0x91, 0x7e, - 0x1b, 0x6a, 0x71, 0x67, 0x3d, 0x6a, 0xe6, 0x5c, 0xbf, 0xdd, 0x6c, 0x8c, 0xca, 0x3b, 0x14, 0xc6, - 0x8c, 0x7c, 0x7b, 0xc7, 0x9d, 0xe3, 0xf8, 0xe6, 0x4c, 0x3f, 0xd9, 0x3c, 0x53, 0xd0, 0xc3, 0xa9, - 0xa3, 0x9d, 0xde, 0xa2, 0x7e, 0x5a, 0x10, 0xd0, 0xff, 0x5f, 0xab, 0x54, 0x36, 0x8d, 0x3c, 0xdb, - 0x78, 0x4d, 0x31, 0x66, 0xd0, 0x8f, 0x1a, 0x9c, 0xd9, 0xa2, 0x7e, 0x3e, 0x2b, 0xa3, 0x6b, 0xc5, - 0x20, 0x13, 0xb2, 0x77, 0xf3, 0xf1, 0xb4, 0x61, 0x37, 0x2a, 0xd6, 0x98, 0x41, 0x7b, 0xea, 0xd8, - 0x69, 0xf8, 0xa0, 0x4b, 0x85, 0x71, 0x92, 0x58, 0x6f, 0x65, 0xd2, 0x72, 0x7c, 0xd4, 0x3b, 0x1b, - 0x2f, 0x5e, 0xae, 0x68, 0xbf, 0xbd, 0x5c, 0xd1, 0xfe, 0x7c, 0xb9, 0xa2, 0x7d, 0x71, 0xe3, 0x15, - 0xdf, 0xb2, 0x33, 0x9f, 0xc7, 0x09, 0x67, 0x66, 0x9f, 0x51, 0xc7, 0x3f, 0xa8, 0xaa, 0x2f, 0xd7, - 0x37, 0xfe, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x48, 0x1c, 0x9b, 0xea, 0x3d, 0x17, 0x00, 0x00, + // 1721 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x59, 0x5f, 0x6f, 0x13, 0x57, + 0x16, 0x8f, 0xff, 0xc4, 0xb1, 0x8f, 0x49, 0xe2, 0x5c, 0x92, 0x30, 0x78, 0x43, 0x14, 0x66, 0x77, + 0x51, 0x16, 0x16, 0x5b, 0x09, 0x5a, 0x58, 0xc1, 0x2e, 0x92, 0x09, 0x90, 0x20, 0x08, 0xc9, 0x4e, + 0xd0, 0x56, 0xb4, 0xa8, 0xd5, 0xcd, 0xf8, 0xc6, 0xbe, 0x78, 0xfe, 0x5c, 0x66, 0xee, 0xb8, 0x32, + 0x52, 0x1f, 0x2a, 0xf5, 0x13, 0xf4, 0xa1, 0x5f, 0xa5, 0x8f, 0x7d, 0x6a, 0xc5, 0x63, 0xd5, 0x2f, + 0xd0, 0x8a, 0x97, 0x7e, 0x8d, 0xea, 0xde, 0xf9, 0xeb, 0xf1, 0x38, 0x01, 0x39, 0x04, 0xf5, 0x25, + 0x99, 0x73, 0xee, 0xf9, 0x77, 0xcf, 0x9c, 0x7b, 0xce, 0xef, 0x8e, 0xe1, 0x8a, 0x43, 0x98, 0xed, + 0x12, 0xa7, 0x4f, 0x9c, 0xa6, 0x7c, 0xa4, 0xdc, 0x76, 0x06, 0x89, 0xc7, 0x06, 0x73, 0x6c, 0x6e, + 0x23, 0x88, 0x39, 0xf5, 0x27, 0x1d, 0xca, 0xbb, 0xde, 0x61, 0x43, 0xb7, 0xcd, 0x26, 0x76, 0x3a, + 0x36, 0x73, 0xec, 0x97, 0xf2, 0xe1, 0xba, 0xde, 0x6e, 0xf6, 0x37, 0x9b, 0xac, 0xd7, 0x69, 0x62, + 0x46, 0xdd, 0x26, 0x66, 0xcc, 0xa0, 0x3a, 0xe6, 0xd4, 0xb6, 0x9a, 0xfd, 0x0d, 0x6c, 0xb0, 0x2e, + 0xde, 0x68, 0x76, 0x88, 0x45, 0x1c, 0xcc, 0x49, 0xdb, 0xb7, 0xac, 0x7e, 0x0b, 0x30, 0xbf, 0x8b, + 0x2d, 0x7a, 0x44, 0x5c, 0xae, 0x91, 0x57, 0x1e, 0x71, 0x39, 0x7a, 0x01, 0x45, 0xe1, 0x4f, 0xc9, + 0xad, 0xe5, 0xd6, 0xab, 0x9b, 0x3b, 0x8d, 0xd8, 0x61, 0x23, 0x74, 0x28, 0x1f, 0xbe, 0xd0, 0xdb, + 0x8d, 0xfe, 0x66, 0x83, 0xf5, 0x3a, 0x0d, 0xe1, 0xb0, 0x91, 0x70, 0xd8, 0x08, 0x1d, 0x36, 0xb4, + 0x28, 0x72, 0x4d, 0x5a, 0x45, 0x75, 0x28, 0x3b, 0xa4, 0x4f, 0x5d, 0x6a, 0x5b, 0x4a, 0x7e, 0x2d, + 0xb7, 0x5e, 0xd1, 0x22, 0x1a, 0x29, 0x30, 0x63, 0xd9, 0x5b, 0x58, 0xef, 0x12, 0xa5, 0xb0, 0x96, + 0x5b, 0x2f, 0x6b, 0x21, 0x89, 0xd6, 0xa0, 0x8a, 0x19, 0x7b, 0x82, 0x0f, 0x89, 0xf1, 0x98, 0x0c, + 0x94, 0xa2, 0x54, 0x4c, 0xb2, 0x84, 0x2e, 0x66, 0xec, 0x29, 0x36, 0x89, 0x32, 0x2d, 0x57, 0x43, + 0x12, 0xad, 0x40, 0xc5, 0xc2, 0x26, 0x71, 0x19, 0xd6, 0x89, 0x52, 0x96, 0x6b, 0x31, 0x03, 0x7d, + 0x05, 0x0b, 0x89, 0xc0, 0x0f, 0x6c, 0xcf, 0xd1, 0x89, 0x02, 0x72, 0xeb, 0x7b, 0x93, 0x6d, 0xbd, + 0x95, 0x36, 0xab, 0x8d, 0x7a, 0x42, 0x9f, 0xc3, 0xb4, 0x7c, 0xb9, 0x4a, 0x75, 0xad, 0x70, 0xaa, + 0xd9, 0xf6, 0xcd, 0x22, 0x0b, 0x66, 0x98, 0xe1, 0x75, 0xa8, 0xe5, 0x2a, 0xe7, 0xa4, 0x87, 0x67, + 0x93, 0x79, 0xd8, 0xb2, 0xad, 0x23, 0xda, 0xd9, 0xc5, 0x16, 0xee, 0x10, 0x93, 0x58, 0x7c, 0x5f, + 0x1a, 0xd7, 0x42, 0x27, 0xe8, 0x35, 0xd4, 0x7a, 0x9e, 0xcb, 0x6d, 0x93, 0xbe, 0x26, 0x7b, 0x4c, + 0xe8, 0xba, 0xca, 0xac, 0xcc, 0xe6, 0xd3, 0xc9, 0x1c, 0x3f, 0x4e, 0x59, 0xd5, 0x46, 0xfc, 0x88, + 0x22, 0xe9, 0x79, 0x87, 0xe4, 0xff, 0xc4, 0x91, 0xd5, 0x35, 0xe7, 0x17, 0x49, 0x82, 0xe5, 0x97, + 0x11, 0x0d, 0x28, 0x57, 0x99, 0x5f, 0x2b, 0xf8, 0x65, 0x14, 0xb1, 0xd0, 0x3a, 0xcc, 0xf7, 0x89, + 0x43, 0x8f, 0x06, 0x07, 0xb4, 0x63, 0x61, 0xee, 0x39, 0x44, 0xa9, 0xc9, 0x52, 0x4c, 0xb3, 0x91, + 0x09, 0xb3, 0x5d, 0x62, 0x98, 0x22, 0xe5, 0x5b, 0x0e, 0x69, 0xbb, 0xca, 0x82, 0xcc, 0xef, 0xf6, + 0xe4, 0x6f, 0x50, 0x9a, 0xd3, 0x86, 0xad, 0x8b, 0xc0, 0x2c, 0x5b, 0x0b, 0x4e, 0x8a, 0x7f, 0x46, + 0x90, 0x1f, 0x58, 0x8a, 0x8d, 0xae, 0xc0, 0x1c, 0x77, 0xb0, 0xde, 0xa3, 0x56, 0x67, 0x97, 0xf0, + 0xae, 0xdd, 0x56, 0xce, 0xcb, 0x4c, 0xa4, 0xb8, 0x48, 0x07, 0x44, 0x2c, 0x7c, 0x68, 0x90, 0xb6, + 0x5f, 0x8b, 0xcf, 0x06, 0x8c, 0xb8, 0xca, 0xa2, 0xdc, 0xc5, 0x8d, 0x46, 0xa2, 0x09, 0xa5, 0x1a, + 0x44, 0xe3, 0xc1, 0x88, 0xd6, 0x03, 0x8b, 0x3b, 0x03, 0x2d, 0xc3, 0x1c, 0xea, 0x41, 0x55, 0xec, + 0x23, 0x2c, 0x85, 0x25, 0x59, 0x0a, 0x8f, 0x26, 0xcb, 0xd1, 0x4e, 0x6c, 0x50, 0x4b, 0x5a, 0xaf, + 0x3f, 0x80, 0x0b, 0x63, 0x62, 0x43, 0x35, 0x28, 0xf4, 0xc8, 0x40, 0xf6, 0xb4, 0x8a, 0x26, 0x1e, + 0xd1, 0x22, 0x4c, 0xf7, 0xb1, 0xe1, 0x11, 0xd9, 0x85, 0xca, 0x9a, 0x4f, 0xdc, 0xce, 0xff, 0x3b, + 0xa7, 0xfe, 0x92, 0x03, 0x25, 0xb5, 0xe7, 0x4f, 0x28, 0xef, 0x3e, 0xa4, 0x06, 0x71, 0xd1, 0x2d, + 0x98, 0x71, 0x7c, 0x5e, 0xd0, 0x20, 0xff, 0x72, 0x4c, 0xaa, 0x76, 0xa6, 0xb4, 0x50, 0x1a, 0xdd, + 0x85, 0xb2, 0x49, 0x38, 0x6e, 0x63, 0x8e, 0xa5, 0xcb, 0xea, 0xe6, 0x5a, 0x96, 0xa6, 0xf0, 0xb2, + 0x1b, 0xc8, 0xed, 0x4c, 0x69, 0x91, 0x0e, 0xfa, 0x17, 0x4c, 0xeb, 0x5d, 0xcf, 0xea, 0xc9, 0xd6, + 0x58, 0xdd, 0xbc, 0x34, 0x4e, 0x79, 0x4b, 0x08, 0xed, 0x4c, 0x69, 0xbe, 0xf4, 0xbd, 0x12, 0x14, + 0x19, 0x76, 0xb8, 0xfa, 0x10, 0x16, 0xb3, 0x5c, 0x88, 0x7e, 0xac, 0x77, 0x89, 0xde, 0x73, 0x3d, + 0x33, 0xc8, 0x4e, 0x44, 0x23, 0x04, 0x45, 0x97, 0xbe, 0xf6, 0x33, 0x54, 0xd0, 0xe4, 0xb3, 0xfa, + 0x0f, 0x58, 0x18, 0xf1, 0x26, 0x72, 0xe9, 0xc7, 0x26, 0x2c, 0x9c, 0x0b, 0x5c, 0xab, 0x1e, 0x2c, + 0x3d, 0x93, 0xb9, 0x88, 0x9a, 0xd2, 0x59, 0x4c, 0x18, 0x75, 0x07, 0x96, 0xd3, 0x6e, 0x5d, 0x66, + 0x5b, 0x2e, 0x41, 0x0d, 0x40, 0xf2, 0x14, 0x53, 0xd2, 0x8e, 0x57, 0x65, 0x14, 0x65, 0x2d, 0x63, + 0x45, 0xfd, 0x3a, 0x0f, 0xcb, 0x1a, 0x71, 0x6d, 0xa3, 0x4f, 0xc2, 0x23, 0x76, 0x36, 0x43, 0xf2, + 0x33, 0x28, 0x60, 0xc6, 0x82, 0x32, 0x79, 0x74, 0x6a, 0x63, 0x48, 0x13, 0x56, 0xd1, 0x3f, 0x61, + 0x01, 0x9b, 0x87, 0xb4, 0xe3, 0xd9, 0x9e, 0x1b, 0x6e, 0x4b, 0x16, 0x55, 0x45, 0x1b, 0x5d, 0x50, + 0x75, 0xb8, 0x30, 0x92, 0x82, 0x20, 0x9d, 0xc9, 0x51, 0x9e, 0x4b, 0x8d, 0xf2, 0x4c, 0x27, 0xf9, + 0x71, 0x4e, 0x7e, 0xca, 0x41, 0x2d, 0x3e, 0x3a, 0x81, 0xf9, 0x15, 0xa8, 0x98, 0x01, 0xcf, 0x55, + 0x72, 0xb2, 0x55, 0xc7, 0x8c, 0xe1, 0xa9, 0x9e, 0x4f, 0x4f, 0xf5, 0x65, 0x28, 0xf9, 0xb8, 0x2a, + 0xd8, 0x58, 0x40, 0x0d, 0x85, 0x5c, 0x4c, 0x85, 0xbc, 0x0a, 0xe0, 0x46, 0x6d, 0x43, 0x29, 0xc9, + 0xd5, 0x04, 0x07, 0xa9, 0x70, 0xce, 0x9f, 0x01, 0x1a, 0x71, 0x3d, 0x83, 0x2b, 0x33, 0x52, 0x62, + 0x88, 0xa7, 0xda, 0x30, 0xff, 0x84, 0x8a, 0x3d, 0x1c, 0xb9, 0x67, 0x53, 0xec, 0x37, 0xa1, 0x28, + 0x9c, 0x89, 0x8d, 0x1d, 0x3a, 0xd8, 0xd2, 0xbb, 0x24, 0xcc, 0x55, 0x44, 0x8b, 0x63, 0xcc, 0x71, + 0xc7, 0x55, 0xf2, 0x92, 0x2f, 0x9f, 0xd5, 0xef, 0xf3, 0x7e, 0xa4, 0x2d, 0xc6, 0xdc, 0x8f, 0x0f, + 0xfc, 0xb2, 0x47, 0x51, 0x61, 0x74, 0x14, 0xa5, 0x42, 0x7e, 0x9f, 0x51, 0x74, 0x5a, 0xd3, 0xc1, + 0x83, 0x99, 0x16, 0x63, 0x22, 0x10, 0xb4, 0x01, 0x45, 0xcc, 0x98, 0x9f, 0xf0, 0x54, 0x47, 0x0e, + 0x44, 0xc4, 0xff, 0x20, 0x24, 0x29, 0x5a, 0xbf, 0x05, 0x95, 0x88, 0x75, 0x92, 0xdb, 0x4a, 0xd2, + 0xed, 0xef, 0x25, 0xb8, 0x28, 0x72, 0x7a, 0x20, 0x0b, 0xb9, 0xc5, 0xd8, 0x7d, 0xc2, 0x31, 0x35, + 0xdc, 0xff, 0x79, 0xc4, 0x19, 0x7c, 0xe0, 0x57, 0xd7, 0x81, 0x92, 0x7f, 0x0e, 0x82, 0x8e, 0x74, + 0xea, 0xc0, 0x38, 0x30, 0x1f, 0xa3, 0xe1, 0xc2, 0x87, 0x41, 0xc3, 0x59, 0xe8, 0xb4, 0x78, 0x46, + 0xe8, 0x74, 0xfc, 0x05, 0x25, 0x71, 0xed, 0x29, 0x0d, 0x5f, 0x7b, 0x32, 0x40, 0xdf, 0xcc, 0xbb, + 0x82, 0xbe, 0x72, 0x26, 0xe8, 0x33, 0x33, 0x4f, 0x5a, 0x45, 0xa6, 0xfb, 0xbf, 0xc9, 0x02, 0x1e, + 0x5b, 0x6b, 0x93, 0xc0, 0x3f, 0xf8, 0x33, 0xc0, 0xbf, 0x6f, 0xe4, 0xd4, 0x67, 0x76, 0xbc, 0xef, + 0x68, 0x24, 0x89, 0x4e, 0x2a, 0x86, 0x83, 0x6f, 0x47, 0x3e, 0xa3, 0x6b, 0x50, 0x14, 0x41, 0x04, + 0xb0, 0xec, 0x42, 0x32, 0x87, 0x22, 0xd2, 0x16, 0x63, 0x07, 0x8c, 0xe8, 0x9a, 0x14, 0x42, 0xb7, + 0xa1, 0x12, 0x15, 0x46, 0x50, 0x79, 0x2b, 0x49, 0x8d, 0xa8, 0x8e, 0x42, 0xb5, 0x58, 0x5c, 0xe8, + 0xb6, 0xa9, 0x43, 0x74, 0x09, 0x5a, 0xa6, 0x47, 0x75, 0xef, 0x87, 0x8b, 0x91, 0x6e, 0x24, 0x8e, + 0x36, 0xa0, 0xe4, 0xdf, 0xd0, 0x64, 0x85, 0x55, 0x37, 0x2f, 0x26, 0x15, 0xfd, 0x3b, 0x5c, 0xa8, + 0x15, 0x08, 0xaa, 0x3f, 0xe6, 0xe0, 0x72, 0x5c, 0x04, 0x61, 0xb5, 0x85, 0xb8, 0xf1, 0xe3, 0xcf, + 0x8c, 0x2b, 0x30, 0x27, 0x81, 0x6a, 0x7c, 0x51, 0xf3, 0xbf, 0x19, 0xa4, 0xb8, 0xea, 0x0f, 0x79, + 0xa8, 0x26, 0x5e, 0x84, 0x78, 0x87, 0x02, 0x27, 0x84, 0xef, 0x50, 0x3c, 0x8b, 0xd1, 0x2f, 0xdf, + 0xbf, 0x84, 0xf8, 0xb2, 0xf9, 0x54, 0xb4, 0x04, 0x07, 0xf5, 0x00, 0x18, 0x76, 0xb0, 0x49, 0x38, + 0x71, 0x44, 0xc7, 0x10, 0xa7, 0xe5, 0xf1, 0xe4, 0x55, 0xbc, 0x1f, 0xda, 0xd4, 0x12, 0xe6, 0x05, + 0x76, 0x91, 0xae, 0xdd, 0xa0, 0x4f, 0x04, 0x14, 0xfa, 0x12, 0xe6, 0x8e, 0xa8, 0x41, 0xf6, 0xe3, + 0x40, 0x4a, 0x32, 0x90, 0xbd, 0xc9, 0x03, 0x79, 0x98, 0xb4, 0xab, 0xa5, 0xdc, 0xa8, 0x57, 0xa1, + 0x96, 0xae, 0x4b, 0x11, 0x24, 0x35, 0x71, 0x27, 0xca, 0x56, 0x40, 0xa9, 0x08, 0x6a, 0xe9, 0x3a, + 0x54, 0x7f, 0xcd, 0xc3, 0x52, 0x64, 0xae, 0x65, 0x59, 0xb6, 0x67, 0xe9, 0xf2, 0xe3, 0x41, 0xe6, + 0xbb, 0x58, 0x84, 0x69, 0x4e, 0xb9, 0x11, 0x8d, 0x40, 0x49, 0x88, 0x1e, 0xc9, 0x6d, 0xdb, 0xe0, + 0x94, 0x05, 0x88, 0x2e, 0x24, 0xfd, 0x1a, 0x79, 0xe5, 0x51, 0x87, 0xb4, 0xe5, 0x89, 0x2a, 0x6b, + 0x11, 0x2d, 0xd6, 0x28, 0x27, 0xa6, 0x04, 0x74, 0x7e, 0x32, 0x23, 0x5a, 0xd6, 0x8f, 0x6d, 0x18, + 0x44, 0x17, 0xe9, 0x48, 0x40, 0xbe, 0x14, 0x57, 0x42, 0x49, 0xee, 0x50, 0xab, 0x13, 0x00, 0xbe, + 0x80, 0x12, 0x71, 0x62, 0xc7, 0xc1, 0x03, 0xa5, 0x2c, 0x13, 0xe0, 0x13, 0xe8, 0x3f, 0x50, 0x30, + 0x31, 0x0b, 0x1a, 0xea, 0xd5, 0xa1, 0x53, 0x96, 0x95, 0x81, 0xc6, 0x2e, 0x66, 0x7e, 0xf7, 0x14, + 0x6a, 0xf5, 0x9b, 0x50, 0x0e, 0x19, 0xef, 0x05, 0x0e, 0x5e, 0xc2, 0xec, 0xd0, 0x21, 0x46, 0xcf, + 0x61, 0x39, 0xae, 0xa8, 0xa4, 0xc3, 0x00, 0xab, 0x5c, 0x3e, 0x31, 0x32, 0x6d, 0x8c, 0x01, 0xf5, + 0x15, 0x2c, 0x88, 0x92, 0xd9, 0xea, 0x62, 0x87, 0x9f, 0x11, 0xc8, 0xbd, 0x03, 0x95, 0xc8, 0x65, + 0x66, 0xcd, 0xd4, 0xa1, 0xdc, 0x0f, 0x3f, 0xea, 0xf8, 0x28, 0x37, 0xa2, 0xd5, 0x16, 0xa0, 0x64, + 0xbc, 0x41, 0x27, 0xbf, 0x06, 0xd3, 0xa2, 0x12, 0x42, 0xec, 0xb6, 0x94, 0x6e, 0xdb, 0x52, 0x5c, + 0xf3, 0x65, 0x36, 0xdf, 0x94, 0x60, 0x21, 0x6e, 0x85, 0xe2, 0x2f, 0xd5, 0x09, 0xda, 0x83, 0xda, + 0x76, 0xf0, 0x39, 0x35, 0xbc, 0xbb, 0xa0, 0xe3, 0x3e, 0x06, 0xd4, 0x57, 0xb2, 0x17, 0xfd, 0x88, + 0xd4, 0x29, 0xa4, 0xc3, 0xc5, 0xb4, 0xc1, 0xf8, 0xbb, 0xc3, 0xdf, 0x8e, 0xb1, 0x1c, 0x49, 0x9d, + 0xe4, 0x62, 0x3d, 0x87, 0x9e, 0xc3, 0xdc, 0xf0, 0xed, 0x18, 0x0d, 0xd5, 0x42, 0xe6, 0x85, 0xbd, + 0xae, 0x1e, 0x27, 0x12, 0xc5, 0xff, 0x02, 0xe6, 0x53, 0x57, 0x45, 0xa4, 0x0e, 0x43, 0x8a, 0xac, + 0xab, 0x74, 0xfd, 0xaf, 0xc7, 0xca, 0x44, 0xd6, 0xef, 0x40, 0x39, 0xbc, 0x5a, 0x0d, 0xa7, 0x39, + 0x75, 0xe1, 0xaa, 0xd7, 0x86, 0xed, 0x1d, 0xb9, 0xea, 0x14, 0xba, 0xeb, 0x2b, 0x0b, 0xe8, 0x3d, + 0xaa, 0x9c, 0xb8, 0x50, 0xd4, 0xcf, 0x67, 0x80, 0x78, 0xb9, 0xb5, 0xd9, 0x6d, 0xc2, 0x63, 0x44, + 0x80, 0xfe, 0xfe, 0x4e, 0x58, 0xa9, 0xae, 0xa6, 0xc5, 0x46, 0x41, 0x85, 0x3a, 0x85, 0xbe, 0xcb, + 0xc1, 0xf9, 0x6d, 0xc2, 0xd3, 0x33, 0x16, 0x5d, 0xcf, 0x76, 0x32, 0x66, 0x16, 0xd7, 0x9f, 0x4e, + 0x7a, 0xec, 0x86, 0xcd, 0xaa, 0x53, 0x68, 0x5f, 0x6e, 0x3b, 0x3e, 0x3e, 0xe8, 0x52, 0xe6, 0x39, + 0x89, 0xb2, 0xb7, 0x3a, 0x6e, 0x39, 0xdc, 0xea, 0xbd, 0xd6, 0x9b, 0xb7, 0xab, 0xb9, 0x9f, 0xdf, + 0xae, 0xe6, 0x7e, 0x7b, 0xbb, 0x9a, 0xfb, 0xf4, 0xc6, 0x09, 0x3f, 0x66, 0x24, 0x7e, 0x1f, 0xc1, + 0x8c, 0xea, 0x06, 0x25, 0x16, 0x3f, 0x2c, 0xc9, 0x9f, 0x2e, 0x6e, 0xfc, 0x11, 0x00, 0x00, 0xff, + 0xff, 0x29, 0x30, 0x6e, 0x69, 0x3e, 0x19, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3092,6 +3285,18 @@ func (m *RepoAppDetailsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Plugin != nil { + { + size, err := m.Plugin.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRepository(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } if m.Directory != nil { { size, err := m.Directory.MarshalToSizedBuffer(dAtA[:i]) @@ -3335,6 +3540,154 @@ func (m *DirectoryAppSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ParameterAnnouncement) 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 *ParameterAnnouncement) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ParameterAnnouncement) 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.Map) > 0 { + for k := range m.Map { + v := m.Map[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintRepository(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintRepository(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintRepository(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x4a + } + } + if len(m.Array) > 0 { + for iNdEx := len(m.Array) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Array[iNdEx]) + copy(dAtA[i:], m.Array[iNdEx]) + i = encodeVarintRepository(dAtA, i, uint64(len(m.Array[iNdEx]))) + i-- + dAtA[i] = 0x42 + } + } + if len(m.String_) > 0 { + i -= len(m.String_) + copy(dAtA[i:], m.String_) + i = encodeVarintRepository(dAtA, i, uint64(len(m.String_))) + i-- + dAtA[i] = 0x3a + } + if len(m.CollectionType) > 0 { + i -= len(m.CollectionType) + copy(dAtA[i:], m.CollectionType) + i = encodeVarintRepository(dAtA, i, uint64(len(m.CollectionType))) + i-- + dAtA[i] = 0x32 + } + if len(m.ItemType) > 0 { + i -= len(m.ItemType) + copy(dAtA[i:], m.ItemType) + i = encodeVarintRepository(dAtA, i, uint64(len(m.ItemType))) + i-- + dAtA[i] = 0x2a + } + if m.Required { + i-- + if m.Required { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if len(m.Tooltip) > 0 { + i -= len(m.Tooltip) + copy(dAtA[i:], m.Tooltip) + i = encodeVarintRepository(dAtA, i, uint64(len(m.Tooltip))) + i-- + dAtA[i] = 0x1a + } + if len(m.Title) > 0 { + i -= len(m.Title) + copy(dAtA[i:], m.Title) + i = encodeVarintRepository(dAtA, i, uint64(len(m.Title))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintRepository(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *PluginAppSpec) 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 *PluginAppSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PluginAppSpec) 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.ParametersAnnouncement) > 0 { + for iNdEx := len(m.ParametersAnnouncement) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ParametersAnnouncement[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRepository(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *HelmChartsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -3927,6 +4280,10 @@ func (m *RepoAppDetailsResponse) Size() (n int) { l = m.Directory.Size() n += 1 + l + sovRepository(uint64(l)) } + if m.Plugin != nil { + l = m.Plugin.Size() + n += 1 + l + sovRepository(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -4024,34 +4381,105 @@ func (m *DirectoryAppSpec) Size() (n int) { return n } -func (m *HelmChartsRequest) Size() (n int) { +func (m *ParameterAnnouncement) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Repo != nil { - l = m.Repo.Size() + l = len(m.Name) + if l > 0 { n += 1 + l + sovRepository(uint64(l)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + l = len(m.Title) + if l > 0 { + n += 1 + l + sovRepository(uint64(l)) } - return n -} - -func (m *HelmChart) Size() (n int) { - if m == nil { - return 0 + l = len(m.Tooltip) + if l > 0 { + n += 1 + l + sovRepository(uint64(l)) } - var l int - _ = l - l = len(m.Name) + if m.Required { + n += 2 + } + l = len(m.ItemType) if l > 0 { n += 1 + l + sovRepository(uint64(l)) } - if len(m.Versions) > 0 { - for _, s := range m.Versions { + l = len(m.CollectionType) + if l > 0 { + n += 1 + l + sovRepository(uint64(l)) + } + l = len(m.String_) + if l > 0 { + n += 1 + l + sovRepository(uint64(l)) + } + if len(m.Array) > 0 { + for _, s := range m.Array { + l = len(s) + n += 1 + l + sovRepository(uint64(l)) + } + } + if len(m.Map) > 0 { + for k, v := range m.Map { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovRepository(uint64(len(k))) + 1 + len(v) + sovRepository(uint64(len(v))) + n += mapEntrySize + 1 + sovRepository(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *PluginAppSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ParametersAnnouncement) > 0 { + for _, e := range m.ParametersAnnouncement { + l = e.Size() + n += 1 + l + sovRepository(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *HelmChartsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Repo != nil { + l = m.Repo.Size() + n += 1 + l + sovRepository(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *HelmChart) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovRepository(uint64(l)) + } + if len(m.Versions) > 0 { + for _, s := range m.Versions { l = len(s) n += 1 + l + sovRepository(uint64(l)) } @@ -7027,6 +7455,42 @@ func (m *RepoAppDetailsResponse) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Plugin", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRepository + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Plugin == nil { + m.Plugin = &PluginAppSpec{} + } + if err := m.Plugin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRepository(dAtA[iNdEx:]) @@ -7537,6 +8001,513 @@ func (m *DirectoryAppSpec) Unmarshal(dAtA []byte) error { } return nil } +func (m *ParameterAnnouncement) 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 ErrIntOverflowRepository + } + 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: ParameterAnnouncement: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ParameterAnnouncement: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + 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 ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + 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 ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Title = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tooltip", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + 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 ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tooltip = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Required", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Required = bool(v != 0) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ItemType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + 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 ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ItemType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CollectionType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + 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 ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CollectionType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field String_", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + 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 ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.String_ = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Array", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + 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 ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Array = append(m.Array, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Map", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRepository + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Map == nil { + m.Map = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthRepository + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthRepository + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthRepository + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthRepository + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipRepository(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthRepository + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Map[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRepository(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthRepository + } + 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 *PluginAppSpec) 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 ErrIntOverflowRepository + } + 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: PluginAppSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PluginAppSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ParametersAnnouncement", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRepository + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ParametersAnnouncement = append(m.ParametersAnnouncement, &ParameterAnnouncement{}) + if err := m.ParametersAnnouncement[len(m.ParametersAnnouncement)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRepository(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthRepository + } + 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 *HelmChartsRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/reposerver/repository/repository.go b/reposerver/repository/repository.go index 3429a00f20134..dae67eb4412e4 100644 --- a/reposerver/repository/repository.go +++ b/reposerver/repository/repository.go @@ -1574,13 +1574,22 @@ func runConfigManagementPlugin(appPath, repoRoot string, envVars *v1alpha1.Env, return kube.SplitYAML([]byte(out)) } -func getPluginEnvs(envVars *v1alpha1.Env, q *apiclient.ManifestRequest, creds git.Creds, remote bool) ([]string, error) { - env := envVars.Environ() +func getPluginEnvs(env *v1alpha1.Env, q *apiclient.ManifestRequest, creds git.Creds, remote bool) ([]string, error) { + envVars := env.Environ() + envVars = append(envVars, "KUBE_VERSION="+text.SemVer(q.KubeVersion)) + envVars = append(envVars, "KUBE_API_VERSIONS="+strings.Join(q.ApiVersions, ",")) + + return getPluginParamEnvs(envVars, q.ApplicationSource.Plugin, creds, remote) +} + +// getPluginParamEnvs gets environment variables for plugin parameter announcement generation. +func getPluginParamEnvs(envVars []string, plugin *v1alpha1.ApplicationSourcePlugin, creds git.Creds, remote bool) ([]string, error) { + env := envVars // Local plugins need also to have access to the local environment variables. - // Remote side car plugins will use the environment in the side car + // Remote sidecar plugins will use the environment in the sidecar // container. if !remote { - env = append(os.Environ(), env...) + env = append(os.Environ(), envVars...) } if creds != nil { closer, environ, err := creds.Environ() @@ -1590,8 +1599,6 @@ func getPluginEnvs(envVars *v1alpha1.Env, q *apiclient.ManifestRequest, creds gi defer func() { _ = closer.Close() }() env = append(env, environ...) } - env = append(env, "KUBE_VERSION="+text.SemVer(q.KubeVersion)) - env = append(env, "KUBE_API_VERSIONS="+strings.Join(q.ApiVersions, ",")) parsedEnv := make(v1alpha1.Env, len(env)) for i, v := range env { @@ -1602,13 +1609,19 @@ func getPluginEnvs(envVars *v1alpha1.Env, q *apiclient.ManifestRequest, creds gi parsedEnv[i] = parsedVar } - if q.ApplicationSource.Plugin != nil { - pluginEnv := q.ApplicationSource.Plugin.Env + if plugin != nil { + pluginEnv := plugin.Env for _, entry := range pluginEnv { newValue := parsedEnv.Envsubst(entry.Value) env = append(env, fmt.Sprintf("ARGOCD_ENV_%s=%s", entry.Name, newValue)) } + paramEnv, err := plugin.Parameters.Environ() + if err != nil { + return nil, fmt.Errorf("failed to generate env vars from parameters: %w", err) + } + env = append(env, paramEnv...) } + return env, nil } @@ -1653,7 +1666,7 @@ func runConfigManagementPluginSidecars(ctx context.Context, appPath, repoPath st func generateManifestsCMP(ctx context.Context, appPath, repoPath string, env []string, cmpClient pluginclient.ConfigManagementPluginServiceClient, tarDoneCh chan<- bool, tarExcludedGlobs []string) (*pluginclient.ManifestResponse, error) { generateManifestStream, err := cmpClient.GenerateManifest(ctx, grpc_retry.Disable()) if err != nil { - return nil, fmt.Errorf("error getting generateManifestStream: %s", err) + return nil, fmt.Errorf("error getting generateManifestStream: %w", err) } opts := []cmp.SenderOption{ cmp.WithTarDoneChan(tarDoneCh), @@ -1693,6 +1706,10 @@ func (s *Service) GetAppDetails(ctx context.Context, q *apiclient.RepoServerAppD if err := populateKustomizeAppDetails(res, q, opContext.appPath, commitSHA, s.gitCredsStore); err != nil { return err } + case v1alpha1.ApplicationSourceTypePlugin: + if err := populatePluginAppDetails(ctx, res, opContext.appPath, repoRoot, q, s.gitCredsStore, s.initConstants.CMPTarExcludedGlobs); err != nil { + return fmt.Errorf("failed to populate plugin app details: %w", err) + } } _ = s.cache.SetAppDetails(revision, q.Source, res, v1alpha1.TrackingMethod(q.TrackingMethod)) return nil @@ -1846,6 +1863,51 @@ func populateKustomizeAppDetails(res *apiclient.RepoAppDetailsResponse, q *apicl return nil } +func populatePluginAppDetails(ctx context.Context, res *apiclient.RepoAppDetailsResponse, appPath string, repoPath string, q *apiclient.RepoServerAppDetailsQuery, store git.CredsStore, tarExcludedGlobs []string) error { + res.Plugin = &apiclient.PluginAppSpec{} + + creds := q.Repo.GetGitCreds(store) + + envVars := []string{ + fmt.Sprintf("ARGOCD_APP_NAME=%s", q.AppName), + fmt.Sprintf("ARGOCD_APP_SOURCE_REPO_URL=%s", q.Repo.Repo), + fmt.Sprintf("ARGOCD_APP_SOURCE_PATH=%s", q.Source.Path), + fmt.Sprintf("ARGOCD_APP_SOURCE_TARGET_REVISION=%s", q.Source.TargetRevision), + } + + env, err := getPluginParamEnvs(envVars, q.Source.Plugin, creds, true) + if err != nil { + return fmt.Errorf("failed to get env vars for plugin: %w", err) + } + + // detect config management plugin server (sidecar) + conn, cmpClient, err := discovery.DetectConfigManagementPlugin(ctx, appPath, env, tarExcludedGlobs) + if err != nil { + return fmt.Errorf("failed to detect CMP for app: %w", err) + } + defer io.Close(conn) + + generateManifestStream, err := cmpClient.GetParametersAnnouncement(ctx, grpc_retry.Disable()) + if err != nil { + return fmt.Errorf("error getting generateManifestStream: %w", err) + } + + err = cmp.SendRepoStream(generateManifestStream.Context(), appPath, repoPath, generateManifestStream, env, tarExcludedGlobs) + if err != nil { + return fmt.Errorf("error sending file to cmp-server: %s", err) + } + + announcement, err := generateManifestStream.CloseAndRecv() + if err != nil { + return fmt.Errorf("failed to get parameter anouncement: %w", err) + } + + res.Plugin = &apiclient.PluginAppSpec{ + ParametersAnnouncement: announcement.ParameterAnnouncements, + } + return nil +} + func (s *Service) GetRevisionMetadata(ctx context.Context, q *apiclient.RepoServerRevisionMetadataRequest) (*v1alpha1.RevisionMetadata, error) { if !(git.IsCommitSHA(q.Revision) || git.IsTruncatedCommitSHA(q.Revision)) { return nil, fmt.Errorf("revision %s must be resolved", q.Revision) diff --git a/reposerver/repository/repository.proto b/reposerver/repository/repository.proto index f6a4e7e0194dc..d5b00ff841ee2 100644 --- a/reposerver/repository/repository.proto +++ b/reposerver/repository/repository.proto @@ -127,6 +127,7 @@ message RepoAppDetailsResponse { HelmAppSpec helm = 3; KustomizeAppSpec kustomize = 4; DirectoryAppSpec directory = 5; + PluginAppSpec plugin = 6; } message RepoServerRevisionMetadataRequest { @@ -160,6 +161,34 @@ message KustomizeAppSpec { message DirectoryAppSpec { } +message ParameterAnnouncement { + // name is the name identifying a parameter. + string name = 1; + // title is a human-readable text of the parameter name. + string title = 2; + // tooltip is a human-readable description of the parameter. + string tooltip = 3; + // required defines if this given parameter is mandatory. + bool required = 4; + // itemType determines the primitive data type represented by the parameter. Parameters are always encoded as + // strings, but this field lets them be interpreted as other primitive types. + string itemType = 5; + // collectionType is the type of value this parameter holds - either a single value (a string) or a collection + // (array or map). If collectionType is set, only the field with that type will be used. If collectionType is not + // set, `string` is the default. If collectionType is set to an invalid value, a validation error is thrown. + string collectionType = 6; + // string is the default value of the parameter if the parameter is a string. + string string = 7; + // array is the default value of the parameter if the parameter is an array. + repeated string array = 8; + // map is the default value of the parameter if the parameter is a map. + map map = 9; +} + +// PluginAppSpec contains details about a plugin-type Application +message PluginAppSpec { + repeated ParameterAnnouncement parametersAnnouncement = 1; +} message HelmChartsRequest { github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Repository repo = 1; diff --git a/test/cmp/plugin.yaml b/test/cmp/plugin.yaml index 2439f3d73ec6c..e68fc3dee74af 100644 --- a/test/cmp/plugin.yaml +++ b/test/cmp/plugin.yaml @@ -9,3 +9,17 @@ spec: discover: find: glob: "**/kustomization.yaml" + parameters: + static: + - name: string-param + string: value + - name: array-param + collectionType: array + array: + - value1 + - value2 + - name: map-param + collectionType: map + map: + key: value + key2: value2 diff --git a/ui/src/app/applications/components/application-parameters/application-parameters.tsx b/ui/src/app/applications/components/application-parameters/application-parameters.tsx index 2e47f0714e254..d621ec4af2db2 100644 --- a/ui/src/app/applications/components/application-parameters/application-parameters.tsx +++ b/ui/src/app/applications/components/application-parameters/application-parameters.tsx @@ -9,6 +9,7 @@ import {services} from '../../../shared/services'; import {ImageTagFieldEditor} from './kustomize'; import * as kustomize from './kustomize-image'; import {VarsInputField} from './vars-input-field'; +import {concatMaps} from '../../../shared/utils'; const TextWithMetadataField = ReactFormField((props: {metadata: {value: string}; fieldApi: FieldApi; className: string}) => { const { @@ -278,6 +279,36 @@ export const ApplicationParameters = (props: { view: app.spec.source.plugin && (app.spec.source.plugin.env || []).map(i => `${i.name}='${i.value}'`).join(' '), edit: (formApi: FormApi) => }); + if (props.details.plugin.parametersAnnouncement) { + for (const announcement of props.details.plugin.parametersAnnouncement) { + const liveParam = app.spec.source.plugin.parameters?.find(param => param.name === announcement.name); + if (announcement.collectionType === undefined || announcement.collectionType === '' || announcement.collectionType === 'string') { + attributes.push({ + title: announcement.title ?? announcement.name, + view: liveParam?.string || announcement.string, + edit: () => liveParam?.string || announcement.string + }); + } else if (announcement.collectionType === 'array') { + attributes.push({ + title: announcement.title ?? announcement.name, + view: (liveParam?.array || announcement.array || []).join(' '), + edit: () => (liveParam?.array || announcement.array || []).join(' ') + }); + } else if (announcement.collectionType === 'map') { + const entries = concatMaps(announcement.map, liveParam?.map).entries(); + attributes.push({ + title: announcement.title ?? announcement.name, + view: Array.from(entries) + .map(([key, value]) => `${key}='${value}'`) + .join(' '), + edit: () => + Array.from(entries) + .map(([key, value]) => `${key}='${value}'`) + .join(' ') + }); + } + } + } } else if (props.details.type === 'Directory') { const directory = app.spec.source.directory || ({} as ApplicationSourceDirectory); attributes.push({ diff --git a/ui/src/app/shared/models.ts b/ui/src/app/shared/models.ts index c055c8a765b19..b65e123c04368 100644 --- a/ui/src/app/shared/models.ts +++ b/ui/src/app/shared/models.ts @@ -212,6 +212,14 @@ export interface EnvEntry { export interface ApplicationSourcePlugin { name: string; env: EnvEntry[]; + parameters?: Parameter[]; +} + +export interface Parameter { + name: string; + string?: string; + array?: string[]; + map?: Map; } export interface JsonnetVar { @@ -599,6 +607,19 @@ export interface KustomizeAppSpec { export interface PluginAppSpec { name: string; env: EnvEntry[]; + parametersAnnouncement?: ParameterAnnouncement[]; +} + +export interface ParameterAnnouncement { + name?: string; + title?: string; + tooltip?: string; + required?: boolean; + itemType?: string; + collectionType?: string; + string?: string; + array?: string[]; + map?: Map; } export interface ObjectReference { diff --git a/ui/src/app/shared/utils.test.ts b/ui/src/app/shared/utils.test.ts new file mode 100644 index 0000000000000..e612db98b144f --- /dev/null +++ b/ui/src/app/shared/utils.test.ts @@ -0,0 +1,14 @@ +import {concatMaps} from './utils'; + +test('map concatenation', () => { + const map1 = { + a: '1', + b: '2' + }; + const map2 = { + a: '9', + c: '8' + }; + const map3 = concatMaps(map1, map2); + expect(map3).toEqual(new Map(Object.entries({a: '9', b: '2', c: '8'}))); +}); diff --git a/ui/src/app/shared/utils.ts b/ui/src/app/shared/utils.ts index 6087b5b22bd20..6091cebe12355 100644 --- a/ui/src/app/shared/utils.ts +++ b/ui/src/app/shared/utils.ts @@ -6,3 +6,16 @@ export function hashCode(str: string) { } return hash; } + +// concatMaps merges two maps. Later args take precedence where there's a key conflict. +export function concatMaps(...maps: (Map | null)[]): Map { + const newMap = new Map(); + for (const map of maps) { + if (map) { + for (const entry of Object.entries(map)) { + newMap.set(entry[0], entry[1]); + } + } + } + return newMap; +} diff --git a/util/app/discovery/discovery.go b/util/app/discovery/discovery.go index 84b4941654b9b..86f94a984545a 100644 --- a/util/app/discovery/discovery.go +++ b/util/app/discovery/discovery.go @@ -135,7 +135,7 @@ func DetectConfigManagementPlugin(ctx context.Context, repoPath string, env []st } if !connFound { - return nil, nil, fmt.Errorf("Couldn't find cmp-server plugin supporting repository %s", repoPath) + return nil, nil, fmt.Errorf("could not find plugin supporting the given repository") } return conn, cmpClient, err } diff --git a/util/cmp/stream.go b/util/cmp/stream.go index 0e8c0f981703d..81fc1d0179e74 100644 --- a/util/cmp/stream.go +++ b/util/cmp/stream.go @@ -87,41 +87,49 @@ func WithTarDoneChan(ch chan<- bool) SenderOption { func SendRepoStream(ctx context.Context, appPath, repoPath string, sender StreamSender, env []string, excludedGlobs []string, opts ...SenderOption) error { opt := newSenderOption(opts...) + tgz, mr, err := GetCompressedRepoAndMetadata(repoPath, appPath, env, excludedGlobs, opt) + if err != nil { + return err + } + defer tgzstream.CloseAndDelete(tgz) + err = sender.Send(mr) + if err != nil { + return fmt.Errorf("error sending generate manifest metadata to cmp-server: %w", err) + } + + // send the compressed file + err = sendFile(ctx, sender, tgz, opt) + if err != nil { + return fmt.Errorf("error sending tgz file to cmp-server: %w", err) + } + return nil +} + +func GetCompressedRepoAndMetadata(repoPath string, appPath string, env []string, excludedGlobs []string, opt *senderOption) (*os.File, *pluginclient.AppStreamRequest, error) { // compress all files in appPath in tgz tgz, filesWritten, checksum, err := tgzstream.CompressFiles(repoPath, nil, excludedGlobs) if filesWritten == 0 { - return fmt.Errorf("no files to send") + return nil, nil, fmt.Errorf("no files to send") } if err != nil { - return fmt.Errorf("error compressing repo files: %w", err) + return nil, nil, fmt.Errorf("error compressing repo files: %w", err) } - defer tgzstream.CloseAndDelete(tgz) - if opt.tarDoneChan != nil { + if opt != nil && opt.tarDoneChan != nil { opt.tarDoneChan <- true close(opt.tarDoneChan) } fi, err := tgz.Stat() if err != nil { - return fmt.Errorf("error getting tgz stat: %w", err) + return nil, nil, fmt.Errorf("error getting tgz stat: %w", err) } appRelPath, err := files.RelativePath(appPath, repoPath) if err != nil { - return fmt.Errorf("error building app relative path: %s", err) + return nil, nil, fmt.Errorf("error building app relative path: %w", err) } // send metadata first mr := appMetadataRequest(filepath.Base(appPath), appRelPath, env, checksum, fi.Size()) - err = sender.Send(mr) - if err != nil { - return fmt.Errorf("error sending generate manifest metadata to cmp-server: %w", err) - } - - // send the compressed file - err = sendFile(ctx, sender, tgz, opt) - if err != nil { - return fmt.Errorf("error sending tgz file to cmp-server: %w", err) - } - return nil + return tgz, mr, err } // sendFile will send the file over the gRPC stream using a @@ -137,7 +145,7 @@ func sendFile(ctx context.Context, sender StreamSender, file *os.File, opt *send } n, err := reader.Read(chunk) if n > 0 { - fr := appFileRequest(chunk[:n]) + fr := AppFileRequest(chunk[:n]) if e := sender.Send(fr); e != nil { return fmt.Errorf("error sending stream: %w", e) } @@ -199,8 +207,8 @@ func receiveFile(ctx context.Context, receiver StreamReceiver, checksum, dst str return file, nil } -// appFileRequest build the file payload for the ManifestRequest -func appFileRequest(chunk []byte) *pluginclient.AppStreamRequest { +// AppFileRequest build the file payload for the ManifestRequest +func AppFileRequest(chunk []byte) *pluginclient.AppStreamRequest { return &pluginclient.AppStreamRequest{ Request: &pluginclient.AppStreamRequest_File{ File: &pluginclient.File{