diff --git a/Makefile b/Makefile index 96275f9bff76e..523e820bb5128 100644 --- a/Makefile +++ b/Makefile @@ -486,7 +486,11 @@ start: test-tools-image # Starts a local instance of ArgoCD .PHONY: start-local -start-local: mod-vendor-local dep-ui-local cli-local +start-local: mod-vendor-local start-local-fast + +# Starts a local instance of ArgoCD without vendoring dependencies +.PHONY: start-local-fast +start-local-fast: dep-ui-local cli-local # check we can connect to Docker to start Redis killall goreman || true kubectl create ns argocd || true diff --git a/assets/swagger.json b/assets/swagger.json index 31d771c52f398..6f9ff657bcd15 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -2011,6 +2011,42 @@ } } }, + "/api/v1/applicationsets/{name}/events": { + "get": { + "tags": [ + "ApplicationSetService" + ], + "summary": "ListResourceEvents returns a list of event resources", + "operationId": "ApplicationSetService_ListResourceEvents", + "parameters": [ + { + "type": "string", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "name": "appsetNamespace", + "in": "query" + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1EventList" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + } + } + }, "/api/v1/certificates": { "get": { "tags": [ @@ -3965,6 +4001,74 @@ } } }, + "/api/v1/stream/applicationsets": { + "get": { + "tags": [ + "ApplicationSetService" + ], + "summary": "Watch returns stream of applicationset change events", + "operationId": "ApplicationSetService_Watch", + "parameters": [ + { + "type": "string", + "description": "the applicationsets's name.", + "name": "name", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi", + "description": "the project names to restrict returned list applicationsets.", + "name": "projects", + "in": "query" + }, + { + "type": "string", + "description": "the selector to restrict returned list to applicationsets only with matched labels.", + "name": "selector", + "in": "query" + }, + { + "type": "string", + "description": "The application set namespace. Default empty is argocd control plane namespace.", + "name": "appsetNamespace", + "in": "query" + }, + { + "type": "string", + "description": "when specified with a watch call, shows changes that occur after that particular version of a resource.", + "name": "resourceVersion", + "in": "query" + } + ], + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "title": "Stream result of v1alpha1ApplicationSetWatchEvent", + "properties": { + "error": { + "$ref": "#/definitions/runtimeStreamError" + }, + "result": { + "$ref": "#/definitions/v1alpha1ApplicationSetWatchEvent" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + } + } + }, "/api/version": { "get": { "tags": [ @@ -6240,6 +6344,18 @@ } } }, + "v1alpha1ApplicationSetWatchEvent": { + "description": "ApplicationSetWatchEvent contains information about applicationset change.", + "type": "object", + "properties": { + "applicationSet": { + "$ref": "#/definitions/v1alpha1ApplicationSet" + }, + "type": { + "type": "string" + } + } + }, "v1alpha1ApplicationSource": { "type": "object", "title": "ApplicationSource contains all required information about the source of an application", diff --git a/pkg/apiclient/applicationset/applicationset.pb.go b/pkg/apiclient/applicationset/applicationset.pb.go index 8f717d1f6920f..031c4b8af7e5a 100644 --- a/pkg/apiclient/applicationset/applicationset.pb.go +++ b/pkg/apiclient/applicationset/applicationset.pb.go @@ -17,6 +17,7 @@ import ( codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" io "io" + v1 "k8s.io/api/core/v1" math "math" math_bits "math/bits" ) @@ -156,6 +157,146 @@ func (m *ApplicationSetListQuery) GetAppsetNamespace() string { return "" } +// ApplicationSetEventsQuery is a query for applicationset resource events +type ApplicationSetResourceEventsQuery struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + AppsetNamespace string `protobuf:"bytes,5,opt,name=appsetNamespace,proto3" json:"appsetNamespace,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ApplicationSetResourceEventsQuery) Reset() { *m = ApplicationSetResourceEventsQuery{} } +func (m *ApplicationSetResourceEventsQuery) String() string { return proto.CompactTextString(m) } +func (*ApplicationSetResourceEventsQuery) ProtoMessage() {} +func (*ApplicationSetResourceEventsQuery) Descriptor() ([]byte, []int) { + return fileDescriptor_eacb9df0ce5738fa, []int{2} +} +func (m *ApplicationSetResourceEventsQuery) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplicationSetResourceEventsQuery) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ApplicationSetResourceEventsQuery.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 *ApplicationSetResourceEventsQuery) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplicationSetResourceEventsQuery.Merge(m, src) +} +func (m *ApplicationSetResourceEventsQuery) XXX_Size() int { + return m.Size() +} +func (m *ApplicationSetResourceEventsQuery) XXX_DiscardUnknown() { + xxx_messageInfo_ApplicationSetResourceEventsQuery.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplicationSetResourceEventsQuery proto.InternalMessageInfo + +func (m *ApplicationSetResourceEventsQuery) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *ApplicationSetResourceEventsQuery) GetAppsetNamespace() string { + if m != nil { + return m.AppsetNamespace + } + return "" +} + +type ApplicationSetWatchQuery struct { + // the applicationsets's name + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // the project names to restrict returned list applicationsets + Projects []string `protobuf:"bytes,2,rep,name=projects,proto3" json:"projects,omitempty"` + // the selector to restrict returned list to applicationsets only with matched labels + Selector string `protobuf:"bytes,3,opt,name=selector,proto3" json:"selector,omitempty"` + // The application set namespace. Default empty is argocd control plane namespace + AppsetNamespace string `protobuf:"bytes,4,opt,name=appsetNamespace,proto3" json:"appsetNamespace,omitempty"` + // when specified with a watch call, shows changes that occur after that particular version of a resource. + ResourceVersion string `protobuf:"bytes,5,opt,name=resourceVersion,proto3" json:"resourceVersion,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ApplicationSetWatchQuery) Reset() { *m = ApplicationSetWatchQuery{} } +func (m *ApplicationSetWatchQuery) String() string { return proto.CompactTextString(m) } +func (*ApplicationSetWatchQuery) ProtoMessage() {} +func (*ApplicationSetWatchQuery) Descriptor() ([]byte, []int) { + return fileDescriptor_eacb9df0ce5738fa, []int{3} +} +func (m *ApplicationSetWatchQuery) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplicationSetWatchQuery) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ApplicationSetWatchQuery.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 *ApplicationSetWatchQuery) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplicationSetWatchQuery.Merge(m, src) +} +func (m *ApplicationSetWatchQuery) XXX_Size() int { + return m.Size() +} +func (m *ApplicationSetWatchQuery) XXX_DiscardUnknown() { + xxx_messageInfo_ApplicationSetWatchQuery.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplicationSetWatchQuery proto.InternalMessageInfo + +func (m *ApplicationSetWatchQuery) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *ApplicationSetWatchQuery) GetProjects() []string { + if m != nil { + return m.Projects + } + return nil +} + +func (m *ApplicationSetWatchQuery) GetSelector() string { + if m != nil { + return m.Selector + } + return "" +} + +func (m *ApplicationSetWatchQuery) GetAppsetNamespace() string { + if m != nil { + return m.AppsetNamespace + } + return "" +} + +func (m *ApplicationSetWatchQuery) GetResourceVersion() string { + if m != nil { + return m.ResourceVersion + } + return "" +} + type ApplicationSetResponse struct { Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` Applicationset *v1alpha1.ApplicationSet `protobuf:"bytes,2,opt,name=applicationset,proto3" json:"applicationset,omitempty"` @@ -168,7 +309,7 @@ func (m *ApplicationSetResponse) Reset() { *m = ApplicationSetResponse{} func (m *ApplicationSetResponse) String() string { return proto.CompactTextString(m) } func (*ApplicationSetResponse) ProtoMessage() {} func (*ApplicationSetResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_eacb9df0ce5738fa, []int{2} + return fileDescriptor_eacb9df0ce5738fa, []int{4} } func (m *ApplicationSetResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -223,7 +364,7 @@ func (m *ApplicationSetCreateRequest) Reset() { *m = ApplicationSetCreat func (m *ApplicationSetCreateRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationSetCreateRequest) ProtoMessage() {} func (*ApplicationSetCreateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_eacb9df0ce5738fa, []int{3} + return fileDescriptor_eacb9df0ce5738fa, []int{5} } func (m *ApplicationSetCreateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -279,7 +420,7 @@ func (m *ApplicationSetDeleteRequest) Reset() { *m = ApplicationSetDelet func (m *ApplicationSetDeleteRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationSetDeleteRequest) ProtoMessage() {} func (*ApplicationSetDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_eacb9df0ce5738fa, []int{4} + return fileDescriptor_eacb9df0ce5738fa, []int{6} } func (m *ApplicationSetDeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -325,6 +466,8 @@ func (m *ApplicationSetDeleteRequest) GetAppsetNamespace() string { func init() { proto.RegisterType((*ApplicationSetGetQuery)(nil), "applicationset.ApplicationSetGetQuery") proto.RegisterType((*ApplicationSetListQuery)(nil), "applicationset.ApplicationSetListQuery") + proto.RegisterType((*ApplicationSetResourceEventsQuery)(nil), "applicationset.ApplicationSetResourceEventsQuery") + proto.RegisterType((*ApplicationSetWatchQuery)(nil), "applicationset.ApplicationSetWatchQuery") proto.RegisterType((*ApplicationSetResponse)(nil), "applicationset.ApplicationSetResponse") proto.RegisterType((*ApplicationSetCreateRequest)(nil), "applicationset.ApplicationSetCreateRequest") proto.RegisterType((*ApplicationSetDeleteRequest)(nil), "applicationset.ApplicationSetDeleteRequest") @@ -335,40 +478,50 @@ func init() { } var fileDescriptor_eacb9df0ce5738fa = []byte{ - // 526 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x94, 0xdf, 0x8a, 0x13, 0x31, - 0x14, 0xc6, 0xc9, 0x76, 0xad, 0xbb, 0x11, 0x14, 0x02, 0xee, 0xd6, 0x51, 0x6a, 0x99, 0x8b, 0xb5, - 0xae, 0x98, 0xd0, 0x7a, 0xa7, 0x57, 0xfe, 0x81, 0x45, 0x28, 0xa2, 0xb3, 0xe0, 0x85, 0x5e, 0x48, - 0x76, 0x7a, 0x98, 0x1d, 0x77, 0x3a, 0x89, 0x49, 0x3a, 0x20, 0x8b, 0x37, 0x82, 0x4f, 0xe0, 0x13, - 0xa8, 0x37, 0x82, 0xb7, 0x3e, 0x84, 0x97, 0x82, 0x2f, 0x20, 0xc5, 0x07, 0x91, 0xc9, 0xcc, 0xb4, - 0x3b, 0xa1, 0xdb, 0x0a, 0x76, 0xef, 0x72, 0x26, 0x99, 0x73, 0x7e, 0xf9, 0xf2, 0x9d, 0x83, 0x77, - 0x35, 0xa8, 0x0c, 0x14, 0xe3, 0x52, 0x26, 0x71, 0xc8, 0x4d, 0x2c, 0x52, 0x0d, 0xc6, 0x09, 0xa9, - 0x54, 0xc2, 0x08, 0x72, 0xb1, 0xfe, 0xd5, 0xbb, 0x16, 0x09, 0x11, 0x25, 0xc0, 0xb8, 0x8c, 0x19, - 0x4f, 0x53, 0x61, 0x8a, 0x9d, 0xe2, 0xb4, 0x37, 0x88, 0x62, 0x73, 0x38, 0x3e, 0xa0, 0xa1, 0x18, - 0x31, 0xae, 0x22, 0x21, 0x95, 0x78, 0x6d, 0x17, 0xb7, 0xc3, 0x21, 0xcb, 0xfa, 0x4c, 0x1e, 0x45, - 0xf9, 0x9f, 0xfa, 0x64, 0x2d, 0x96, 0xf5, 0x78, 0x22, 0x0f, 0x79, 0x8f, 0x45, 0x90, 0x82, 0xe2, - 0x06, 0x86, 0x45, 0x36, 0xff, 0x39, 0xde, 0xba, 0x3f, 0x3b, 0xb7, 0x0f, 0x66, 0x0f, 0xcc, 0xb3, - 0x31, 0xa8, 0xb7, 0x84, 0xe0, 0xf5, 0x94, 0x8f, 0xa0, 0x85, 0x3a, 0xa8, 0xbb, 0x19, 0xd8, 0x35, - 0xe9, 0xe2, 0x4b, 0x5c, 0x4a, 0x0d, 0xe6, 0x09, 0x1f, 0x81, 0x96, 0x3c, 0x84, 0xd6, 0x9a, 0xdd, - 0x76, 0x3f, 0xfb, 0xc7, 0x78, 0xbb, 0x9e, 0x77, 0x10, 0xeb, 0x32, 0xb1, 0x87, 0x37, 0x72, 0x66, - 0x08, 0x8d, 0x6e, 0xa1, 0x4e, 0xa3, 0xbb, 0x19, 0x4c, 0xe3, 0x7c, 0x4f, 0x43, 0x02, 0xa1, 0x11, - 0xaa, 0xcc, 0x3c, 0x8d, 0xe7, 0x15, 0x6f, 0xcc, 0x2f, 0xfe, 0x15, 0xb9, 0xb7, 0x0a, 0x40, 0xcb, - 0x5c, 0x5c, 0xd2, 0xc2, 0xe7, 0xcb, 0x62, 0xe5, 0xc5, 0xaa, 0x90, 0x18, 0xec, 0xbc, 0x83, 0x05, - 0xb8, 0xd0, 0x1f, 0xd0, 0x99, 0xe0, 0xb4, 0x12, 0xdc, 0x2e, 0x5e, 0x85, 0x43, 0x9a, 0xf5, 0xa9, - 0x3c, 0x8a, 0x68, 0x2e, 0x38, 0x3d, 0xf1, 0x3b, 0xad, 0x04, 0xa7, 0x0e, 0x87, 0x53, 0xc3, 0xff, - 0x86, 0xf0, 0xd5, 0xfa, 0x91, 0x87, 0x0a, 0xb8, 0x81, 0x00, 0xde, 0x8c, 0x41, 0xcf, 0xa3, 0x42, - 0x67, 0x4f, 0x45, 0xb6, 0x70, 0x73, 0x2c, 0x35, 0xa8, 0x42, 0x83, 0x8d, 0xa0, 0x8c, 0xfc, 0x97, - 0x2e, 0xec, 0x23, 0x48, 0x60, 0x06, 0xfb, 0x5f, 0x96, 0xe9, 0x7f, 0x3a, 0x87, 0x2f, 0xd7, 0xb3, - 0xef, 0x83, 0xca, 0xe2, 0x10, 0xc8, 0x17, 0x84, 0x1b, 0x7b, 0x60, 0xc8, 0x0e, 0x75, 0xfa, 0x67, - 0xbe, 0x75, 0xbd, 0x95, 0x8a, 0xe3, 0xef, 0xbc, 0xff, 0xf5, 0xe7, 0xe3, 0x5a, 0x87, 0xb4, 0x6d, - 0x43, 0x66, 0x3d, 0xa7, 0x89, 0x35, 0x3b, 0xce, 0x2f, 0xfa, 0x8e, 0x7c, 0x46, 0x78, 0x3d, 0x77, - 0x39, 0xb9, 0xb1, 0x18, 0x73, 0xda, 0x09, 0xde, 0xd3, 0x55, 0x72, 0xe6, 0x69, 0xfd, 0xeb, 0x96, - 0xf5, 0x0a, 0xd9, 0x3e, 0x85, 0x95, 0x7c, 0x47, 0xb8, 0x59, 0x38, 0x8c, 0xdc, 0x5a, 0x8c, 0x59, - 0xf3, 0xe1, 0x8a, 0x25, 0x65, 0x16, 0xf3, 0xa6, 0x7f, 0x1a, 0xe6, 0x5d, 0xd7, 0x90, 0x1f, 0x10, - 0x6e, 0x16, 0x5e, 0x5b, 0x86, 0x5d, 0x73, 0xa4, 0xb7, 0xc4, 0x31, 0xd5, 0x58, 0xa8, 0xde, 0x78, - 0x77, 0xc9, 0x1b, 0x3f, 0x78, 0xfc, 0x63, 0xd2, 0x46, 0x3f, 0x27, 0x6d, 0xf4, 0x7b, 0xd2, 0x46, - 0x2f, 0xee, 0xfd, 0xdb, 0x28, 0x0e, 0x93, 0x18, 0x52, 0x77, 0xf6, 0x1f, 0x34, 0xed, 0x00, 0xbe, - 0xf3, 0x37, 0x00, 0x00, 0xff, 0xff, 0x96, 0x3f, 0x16, 0xa7, 0x2a, 0x06, 0x00, 0x00, + // 679 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x96, 0xdf, 0x6a, 0x13, 0x4f, + 0x14, 0xc7, 0x99, 0xa6, 0x4d, 0xdb, 0xf9, 0xc1, 0x4f, 0x18, 0xb0, 0x8d, 0xab, 0xc6, 0xba, 0x60, + 0x1b, 0x2b, 0x9d, 0x35, 0xf1, 0x46, 0xf4, 0xca, 0x7f, 0x14, 0xa1, 0x88, 0xa6, 0x50, 0x41, 0x2f, + 0x64, 0xba, 0x3d, 0x6c, 0xd7, 0x26, 0x3b, 0xe3, 0xcc, 0x64, 0x41, 0x8a, 0x37, 0x82, 0x4f, 0x20, + 0xbe, 0x80, 0xde, 0x08, 0x5e, 0xea, 0x95, 0x4f, 0xe0, 0xa5, 0xe0, 0x0b, 0x48, 0xf1, 0xde, 0x57, + 0x90, 0x99, 0xdd, 0x34, 0xdd, 0xe9, 0x26, 0x51, 0x8c, 0x77, 0xf3, 0xe7, 0xe4, 0x9c, 0xcf, 0x39, + 0x73, 0xce, 0x77, 0x83, 0x57, 0x15, 0xc8, 0x14, 0x64, 0xc0, 0x84, 0xe8, 0xc4, 0x21, 0xd3, 0x31, + 0x4f, 0x14, 0x68, 0x67, 0x4b, 0x85, 0xe4, 0x9a, 0x93, 0xff, 0x8b, 0xa7, 0xde, 0x99, 0x88, 0xf3, + 0xa8, 0x03, 0x01, 0x13, 0x71, 0xc0, 0x92, 0x84, 0xeb, 0xec, 0x26, 0xb3, 0xf6, 0xfc, 0xbd, 0xab, + 0x8a, 0xc6, 0xdc, 0xde, 0x86, 0x5c, 0x42, 0x90, 0x36, 0x83, 0x08, 0x12, 0x90, 0x4c, 0xc3, 0x4e, + 0x6e, 0xb3, 0x11, 0xc5, 0x7a, 0xb7, 0xb7, 0x4d, 0x43, 0xde, 0x0d, 0x98, 0x8c, 0xb8, 0x90, 0xfc, + 0xa9, 0x5d, 0xac, 0x85, 0x3b, 0x41, 0xda, 0x0a, 0xc4, 0x5e, 0x64, 0x7e, 0xaf, 0x8e, 0xf2, 0x04, + 0x69, 0x93, 0x75, 0xc4, 0x2e, 0x3b, 0xe6, 0xcd, 0xdf, 0xc2, 0x0b, 0x37, 0x06, 0x76, 0x9b, 0xa0, + 0xd7, 0x41, 0x3f, 0xe8, 0x81, 0x7c, 0x4e, 0x08, 0x9e, 0x4e, 0x58, 0x17, 0x6a, 0x68, 0x09, 0x35, + 0xe6, 0xdb, 0x76, 0x4d, 0x1a, 0xf8, 0x04, 0x13, 0x42, 0x81, 0xbe, 0xc7, 0xba, 0xa0, 0x04, 0x0b, + 0xa1, 0x36, 0x65, 0xaf, 0xdd, 0x63, 0x7f, 0x1f, 0x2f, 0x16, 0xfd, 0x6e, 0xc4, 0x2a, 0x77, 0xec, + 0xe1, 0x39, 0xc3, 0x0c, 0xa1, 0x56, 0x35, 0xb4, 0x54, 0x69, 0xcc, 0xb7, 0x0f, 0xf7, 0xe6, 0x4e, + 0x41, 0x07, 0x42, 0xcd, 0x65, 0xee, 0xf9, 0x70, 0x5f, 0x16, 0xbc, 0x52, 0x1e, 0x9c, 0xe1, 0xf3, + 0xc5, 0xe0, 0x6d, 0x50, 0xbc, 0x27, 0x43, 0xb8, 0x93, 0x42, 0xa2, 0xd5, 0x1f, 0xe5, 0x37, 0x53, + 0x1e, 0xe2, 0x33, 0xc2, 0xb5, 0x62, 0x8c, 0x87, 0x4c, 0x87, 0xbb, 0xc3, 0x5d, 0x1f, 0xcd, 0x7a, + 0x6a, 0x44, 0xd6, 0x95, 0xf1, 0x59, 0x4f, 0x97, 0x22, 0x19, 0x4b, 0x99, 0xe7, 0xb9, 0x05, 0x52, + 0xc5, 0x3c, 0xe9, 0xc3, 0x3b, 0xc7, 0xfe, 0x7b, 0xe4, 0xbe, 0x7a, 0x1b, 0x94, 0x30, 0x0d, 0x4a, + 0x6a, 0x78, 0x36, 0xc7, 0xca, 0xe9, 0xfb, 0x5b, 0xa2, 0xb1, 0xd3, 0xcb, 0xf6, 0x81, 0xfe, 0x6b, + 0x6d, 0xd0, 0x41, 0x43, 0xd2, 0x7e, 0x43, 0xda, 0xc5, 0x93, 0x70, 0x87, 0xa6, 0x2d, 0x2a, 0xf6, + 0x22, 0x6a, 0x1a, 0x92, 0x1e, 0xf9, 0x39, 0xed, 0x37, 0x24, 0x75, 0x38, 0x9c, 0x18, 0xfe, 0x07, + 0x84, 0x4f, 0x17, 0x4d, 0x6e, 0x49, 0x60, 0x1a, 0xda, 0xf0, 0xac, 0x07, 0xaa, 0x8c, 0x0a, 0xfd, + 0x7b, 0x2a, 0xb2, 0x80, 0xab, 0x3d, 0xa1, 0x40, 0x66, 0x35, 0x98, 0x6b, 0xe7, 0x3b, 0xff, 0xb1, + 0x0b, 0x7b, 0x1b, 0x3a, 0x30, 0x80, 0xfd, 0xab, 0x91, 0x6a, 0xfd, 0x9c, 0xc5, 0x27, 0x8b, 0xde, + 0x37, 0x41, 0xa6, 0x71, 0x08, 0xe4, 0x1d, 0xc2, 0x95, 0x75, 0xd0, 0x64, 0x99, 0x3a, 0x1a, 0x54, + 0x3e, 0xda, 0xde, 0x44, 0x8b, 0xe3, 0x2f, 0xbf, 0xfc, 0xf6, 0xe3, 0xf5, 0xd4, 0x12, 0xa9, 0x5b, + 0xd9, 0x4a, 0x9b, 0x8e, 0x10, 0xaa, 0x60, 0xdf, 0x24, 0xfa, 0x82, 0xbc, 0x45, 0x78, 0xda, 0xa8, + 0x00, 0x59, 0x19, 0x8d, 0x79, 0xa8, 0x14, 0xde, 0xfd, 0x49, 0x72, 0x1a, 0xb7, 0xfe, 0x39, 0xcb, + 0x7a, 0x8a, 0x2c, 0x0e, 0x61, 0x25, 0x6f, 0x10, 0x26, 0xc6, 0xb2, 0xa8, 0x18, 0xa4, 0x39, 0x1a, + 0xb9, 0x44, 0x5f, 0xbc, 0xb3, 0x34, 0x13, 0x73, 0x03, 0x48, 0x8d, 0x98, 0xd3, 0xb4, 0x49, 0xad, + 0x81, 0x25, 0x59, 0xb3, 0x24, 0x2b, 0xe4, 0xc2, 0xe8, 0xaa, 0x05, 0x90, 0x01, 0x7c, 0x44, 0x78, + 0xc6, 0x2a, 0x0c, 0x69, 0x8c, 0x46, 0x19, 0xc8, 0x90, 0xb7, 0x35, 0xc9, 0xf2, 0x59, 0xbf, 0x16, + 0xff, 0xf8, 0x83, 0x2b, 0x2d, 0x81, 0x75, 0xdd, 0x0c, 0x2e, 0x23, 0xf2, 0x09, 0xe1, 0x6a, 0x36, + 0xaf, 0xe4, 0xd2, 0x68, 0xec, 0xc2, 0x54, 0x4f, 0xb8, 0x41, 0x03, 0xcb, 0x7b, 0xd1, 0x1f, 0xf6, + 0xe8, 0xd7, 0xdc, 0xf1, 0x7e, 0x85, 0x70, 0x35, 0x9b, 0xdc, 0x71, 0xd8, 0x85, 0xf9, 0xf6, 0x96, + 0xc7, 0x76, 0x89, 0x15, 0xd9, 0x7e, 0x01, 0x57, 0xc7, 0x4c, 0xcc, 0xcd, 0xbb, 0x5f, 0x0e, 0xea, + 0xe8, 0xeb, 0x41, 0x1d, 0x7d, 0x3f, 0xa8, 0xa3, 0x47, 0xd7, 0x7f, 0xef, 0xc3, 0x1f, 0x76, 0x62, + 0x48, 0xdc, 0x7f, 0x23, 0xdb, 0x55, 0xfb, 0xb9, 0xbf, 0xf2, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x64, + 0x98, 0x30, 0x1c, 0xbc, 0x08, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -387,6 +540,10 @@ type ApplicationSetServiceClient interface { Get(ctx context.Context, in *ApplicationSetGetQuery, opts ...grpc.CallOption) (*v1alpha1.ApplicationSet, error) //List returns list of applicationset List(ctx context.Context, in *ApplicationSetListQuery, opts ...grpc.CallOption) (*v1alpha1.ApplicationSetList, error) + // ListResourceEvents returns a list of event resources + ListResourceEvents(ctx context.Context, in *ApplicationSetResourceEventsQuery, opts ...grpc.CallOption) (*v1.EventList, error) + // Watch returns stream of applicationset change events + Watch(ctx context.Context, in *ApplicationSetWatchQuery, opts ...grpc.CallOption) (ApplicationSetService_WatchClient, error) //Create creates an applicationset Create(ctx context.Context, in *ApplicationSetCreateRequest, opts ...grpc.CallOption) (*v1alpha1.ApplicationSet, error) // Delete deletes an application set @@ -419,6 +576,47 @@ func (c *applicationSetServiceClient) List(ctx context.Context, in *ApplicationS return out, nil } +func (c *applicationSetServiceClient) ListResourceEvents(ctx context.Context, in *ApplicationSetResourceEventsQuery, opts ...grpc.CallOption) (*v1.EventList, error) { + out := new(v1.EventList) + err := c.cc.Invoke(ctx, "/applicationset.ApplicationSetService/ListResourceEvents", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *applicationSetServiceClient) Watch(ctx context.Context, in *ApplicationSetWatchQuery, opts ...grpc.CallOption) (ApplicationSetService_WatchClient, error) { + stream, err := c.cc.NewStream(ctx, &_ApplicationSetService_serviceDesc.Streams[0], "/applicationset.ApplicationSetService/Watch", opts...) + if err != nil { + return nil, err + } + x := &applicationSetServiceWatchClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type ApplicationSetService_WatchClient interface { + Recv() (*v1alpha1.ApplicationSetWatchEvent, error) + grpc.ClientStream +} + +type applicationSetServiceWatchClient struct { + grpc.ClientStream +} + +func (x *applicationSetServiceWatchClient) Recv() (*v1alpha1.ApplicationSetWatchEvent, error) { + m := new(v1alpha1.ApplicationSetWatchEvent) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func (c *applicationSetServiceClient) Create(ctx context.Context, in *ApplicationSetCreateRequest, opts ...grpc.CallOption) (*v1alpha1.ApplicationSet, error) { out := new(v1alpha1.ApplicationSet) err := c.cc.Invoke(ctx, "/applicationset.ApplicationSetService/Create", in, out, opts...) @@ -443,6 +641,10 @@ type ApplicationSetServiceServer interface { Get(context.Context, *ApplicationSetGetQuery) (*v1alpha1.ApplicationSet, error) //List returns list of applicationset List(context.Context, *ApplicationSetListQuery) (*v1alpha1.ApplicationSetList, error) + // ListResourceEvents returns a list of event resources + ListResourceEvents(context.Context, *ApplicationSetResourceEventsQuery) (*v1.EventList, error) + // Watch returns stream of applicationset change events + Watch(*ApplicationSetWatchQuery, ApplicationSetService_WatchServer) error //Create creates an applicationset Create(context.Context, *ApplicationSetCreateRequest) (*v1alpha1.ApplicationSet, error) // Delete deletes an application set @@ -459,6 +661,12 @@ func (*UnimplementedApplicationSetServiceServer) Get(ctx context.Context, req *A func (*UnimplementedApplicationSetServiceServer) List(ctx context.Context, req *ApplicationSetListQuery) (*v1alpha1.ApplicationSetList, error) { return nil, status.Errorf(codes.Unimplemented, "method List not implemented") } +func (*UnimplementedApplicationSetServiceServer) ListResourceEvents(ctx context.Context, req *ApplicationSetResourceEventsQuery) (*v1.EventList, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListResourceEvents not implemented") +} +func (*UnimplementedApplicationSetServiceServer) Watch(req *ApplicationSetWatchQuery, srv ApplicationSetService_WatchServer) error { + return status.Errorf(codes.Unimplemented, "method Watch not implemented") +} func (*UnimplementedApplicationSetServiceServer) Create(ctx context.Context, req *ApplicationSetCreateRequest) (*v1alpha1.ApplicationSet, error) { return nil, status.Errorf(codes.Unimplemented, "method Create not implemented") } @@ -506,6 +714,45 @@ func _ApplicationSetService_List_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _ApplicationSetService_ListResourceEvents_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ApplicationSetResourceEventsQuery) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApplicationSetServiceServer).ListResourceEvents(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/applicationset.ApplicationSetService/ListResourceEvents", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApplicationSetServiceServer).ListResourceEvents(ctx, req.(*ApplicationSetResourceEventsQuery)) + } + return interceptor(ctx, in, info, handler) +} + +func _ApplicationSetService_Watch_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(ApplicationSetWatchQuery) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ApplicationSetServiceServer).Watch(m, &applicationSetServiceWatchServer{stream}) +} + +type ApplicationSetService_WatchServer interface { + Send(*v1alpha1.ApplicationSetWatchEvent) error + grpc.ServerStream +} + +type applicationSetServiceWatchServer struct { + grpc.ServerStream +} + +func (x *applicationSetServiceWatchServer) Send(m *v1alpha1.ApplicationSetWatchEvent) error { + return x.ServerStream.SendMsg(m) +} + func _ApplicationSetService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ApplicationSetCreateRequest) if err := dec(in); err != nil { @@ -554,6 +801,10 @@ var _ApplicationSetService_serviceDesc = grpc.ServiceDesc{ MethodName: "List", Handler: _ApplicationSetService_List_Handler, }, + { + MethodName: "ListResourceEvents", + Handler: _ApplicationSetService_ListResourceEvents_Handler, + }, { MethodName: "Create", Handler: _ApplicationSetService_Create_Handler, @@ -563,7 +814,13 @@ var _ApplicationSetService_serviceDesc = grpc.ServiceDesc{ Handler: _ApplicationSetService_Delete_Handler, }, }, - Streams: []grpc.StreamDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "Watch", + Handler: _ApplicationSetService_Watch_Handler, + ServerStreams: true, + }, + }, Metadata: "server/applicationset/applicationset.proto", } @@ -658,6 +915,111 @@ func (m *ApplicationSetListQuery) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *ApplicationSetResourceEventsQuery) 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 *ApplicationSetResourceEventsQuery) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplicationSetResourceEventsQuery) 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.AppsetNamespace) > 0 { + i -= len(m.AppsetNamespace) + copy(dAtA[i:], m.AppsetNamespace) + i = encodeVarintApplicationset(dAtA, i, uint64(len(m.AppsetNamespace))) + i-- + dAtA[i] = 0x2a + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintApplicationset(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ApplicationSetWatchQuery) 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 *ApplicationSetWatchQuery) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplicationSetWatchQuery) 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.ResourceVersion) > 0 { + i -= len(m.ResourceVersion) + copy(dAtA[i:], m.ResourceVersion) + i = encodeVarintApplicationset(dAtA, i, uint64(len(m.ResourceVersion))) + i-- + dAtA[i] = 0x2a + } + if len(m.AppsetNamespace) > 0 { + i -= len(m.AppsetNamespace) + copy(dAtA[i:], m.AppsetNamespace) + i = encodeVarintApplicationset(dAtA, i, uint64(len(m.AppsetNamespace))) + i-- + dAtA[i] = 0x22 + } + if len(m.Selector) > 0 { + i -= len(m.Selector) + copy(dAtA[i:], m.Selector) + i = encodeVarintApplicationset(dAtA, i, uint64(len(m.Selector))) + i-- + dAtA[i] = 0x1a + } + if len(m.Projects) > 0 { + for iNdEx := len(m.Projects) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Projects[iNdEx]) + copy(dAtA[i:], m.Projects[iNdEx]) + i = encodeVarintApplicationset(dAtA, i, uint64(len(m.Projects[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintApplicationset(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *ApplicationSetResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -851,18 +1213,18 @@ func (m *ApplicationSetListQuery) Size() (n int) { return n } -func (m *ApplicationSetResponse) Size() (n int) { +func (m *ApplicationSetResourceEventsQuery) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Project) + l = len(m.Name) if l > 0 { n += 1 + l + sovApplicationset(uint64(l)) } - if m.Applicationset != nil { - l = m.Applicationset.Size() + l = len(m.AppsetNamespace) + if l > 0 { n += 1 + l + sovApplicationset(uint64(l)) } if m.XXX_unrecognized != nil { @@ -871,18 +1233,72 @@ func (m *ApplicationSetResponse) Size() (n int) { return n } -func (m *ApplicationSetCreateRequest) Size() (n int) { +func (m *ApplicationSetWatchQuery) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Applicationset != nil { - l = m.Applicationset.Size() + l = len(m.Name) + if l > 0 { n += 1 + l + sovApplicationset(uint64(l)) } - if m.Upsert { - n += 2 + if len(m.Projects) > 0 { + for _, s := range m.Projects { + l = len(s) + n += 1 + l + sovApplicationset(uint64(l)) + } + } + l = len(m.Selector) + if l > 0 { + n += 1 + l + sovApplicationset(uint64(l)) + } + l = len(m.AppsetNamespace) + if l > 0 { + n += 1 + l + sovApplicationset(uint64(l)) + } + l = len(m.ResourceVersion) + if l > 0 { + n += 1 + l + sovApplicationset(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ApplicationSetResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Project) + if l > 0 { + n += 1 + l + sovApplicationset(uint64(l)) + } + if m.Applicationset != nil { + l = m.Applicationset.Size() + n += 1 + l + sovApplicationset(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ApplicationSetCreateRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Applicationset != nil { + l = m.Applicationset.Size() + n += 1 + l + sovApplicationset(uint64(l)) + } + if m.Upsert { + n += 2 } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -1178,6 +1594,332 @@ func (m *ApplicationSetListQuery) Unmarshal(dAtA []byte) error { } return nil } +func (m *ApplicationSetResourceEventsQuery) 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 ErrIntOverflowApplicationset + } + 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: ApplicationSetResourceEventsQuery: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplicationSetResourceEventsQuery: 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 ErrIntOverflowApplicationset + } + 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 ErrInvalidLengthApplicationset + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplicationset + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppsetNamespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplicationset + } + 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 ErrInvalidLengthApplicationset + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplicationset + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AppsetNamespace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApplicationset(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplicationset + } + 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 *ApplicationSetWatchQuery) 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 ErrIntOverflowApplicationset + } + 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: ApplicationSetWatchQuery: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplicationSetWatchQuery: 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 ErrIntOverflowApplicationset + } + 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 ErrInvalidLengthApplicationset + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplicationset + } + 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 Projects", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplicationset + } + 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 ErrInvalidLengthApplicationset + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplicationset + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Projects = append(m.Projects, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplicationset + } + 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 ErrInvalidLengthApplicationset + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplicationset + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Selector = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppsetNamespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplicationset + } + 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 ErrInvalidLengthApplicationset + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplicationset + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AppsetNamespace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplicationset + } + 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 ErrInvalidLengthApplicationset + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplicationset + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResourceVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApplicationset(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplicationset + } + 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 *ApplicationSetResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apiclient/applicationset/applicationset.pb.gw.go b/pkg/apiclient/applicationset/applicationset.pb.gw.go index 5e4c73f7add3b..ed7bf41e6cb47 100644 --- a/pkg/apiclient/applicationset/applicationset.pb.gw.go +++ b/pkg/apiclient/applicationset/applicationset.pb.gw.go @@ -141,6 +141,106 @@ func local_request_ApplicationSetService_List_0(ctx context.Context, marshaler r } +var ( + filter_ApplicationSetService_ListResourceEvents_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_ApplicationSetService_ListResourceEvents_0(ctx context.Context, marshaler runtime.Marshaler, client ApplicationSetServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ApplicationSetResourceEventsQuery + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ApplicationSetService_ListResourceEvents_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListResourceEvents(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ApplicationSetService_ListResourceEvents_0(ctx context.Context, marshaler runtime.Marshaler, server ApplicationSetServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ApplicationSetResourceEventsQuery + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ApplicationSetService_ListResourceEvents_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListResourceEvents(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_ApplicationSetService_Watch_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_ApplicationSetService_Watch_0(ctx context.Context, marshaler runtime.Marshaler, client ApplicationSetServiceClient, req *http.Request, pathParams map[string]string) (ApplicationSetService_WatchClient, runtime.ServerMetadata, error) { + var protoReq ApplicationSetWatchQuery + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ApplicationSetService_Watch_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.Watch(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + var ( filter_ApplicationSetService_Create_0 = &utilities.DoubleArray{Encoding: map[string]int{"applicationset": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -317,6 +417,36 @@ func RegisterApplicationSetServiceHandlerServer(ctx context.Context, mux *runtim }) + mux.Handle("GET", pattern_ApplicationSetService_ListResourceEvents_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ApplicationSetService_ListResourceEvents_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ApplicationSetService_ListResourceEvents_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ApplicationSetService_Watch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + mux.Handle("POST", pattern_ApplicationSetService_Create_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -444,6 +574,46 @@ func RegisterApplicationSetServiceHandlerClient(ctx context.Context, mux *runtim }) + mux.Handle("GET", pattern_ApplicationSetService_ListResourceEvents_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ApplicationSetService_ListResourceEvents_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ApplicationSetService_ListResourceEvents_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ApplicationSetService_Watch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ApplicationSetService_Watch_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ApplicationSetService_Watch_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_ApplicationSetService_Create_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -492,6 +662,10 @@ var ( pattern_ApplicationSetService_List_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "applicationsets"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ApplicationSetService_ListResourceEvents_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "applicationsets", "name", "events"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ApplicationSetService_Watch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "stream", "applicationsets"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ApplicationSetService_Create_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "applicationsets"}, "", runtime.AssumeColonVerbOpt(true))) pattern_ApplicationSetService_Delete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "applicationsets", "name"}, "", runtime.AssumeColonVerbOpt(true))) @@ -502,6 +676,10 @@ var ( forward_ApplicationSetService_List_0 = runtime.ForwardResponseMessage + forward_ApplicationSetService_ListResourceEvents_0 = runtime.ForwardResponseMessage + + forward_ApplicationSetService_Watch_0 = runtime.ForwardResponseStream + forward_ApplicationSetService_Create_0 = runtime.ForwardResponseMessage forward_ApplicationSetService_Delete_0 = runtime.ForwardResponseMessage diff --git a/pkg/apis/application/v1alpha1/applicationset_types.go b/pkg/apis/application/v1alpha1/applicationset_types.go index 389f421fed400..803b80d9ca160 100644 --- a/pkg/apis/application/v1alpha1/applicationset_types.go +++ b/pkg/apis/application/v1alpha1/applicationset_types.go @@ -27,6 +27,7 @@ import ( apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/apimachinery/pkg/watch" ) // Utility struct for a reference to a secret key. @@ -835,6 +836,18 @@ type ApplicationSetApplicationStatus struct { Step string `json:"step" protobuf:"bytes,5,opt,name=step"` } +// ApplicationSetWatchEvent contains information about applicationset change. +type ApplicationSetWatchEvent struct { + Type watch.EventType `json:"type" protobuf:"bytes,1,opt,name=type,casttype=k8s.io/apimachinery/pkg/watch.EventType"` + + // ApplicationSet is: + // * If Type is Added or Modified: the new state of the object. + // * If Type is Deleted: the state of the object immediately before deletion. + // * If Type is Error: *api.Status is recommended; other types may make sense + // depending on context. + ApplicationSet ApplicationSet `json:"applicationSet" protobuf:"bytes,2,opt,name=applicationSet"` +} + // ApplicationSetList contains a list of ApplicationSet // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +kubebuilder:object:root=true diff --git a/pkg/apis/application/v1alpha1/generated.pb.go b/pkg/apis/application/v1alpha1/generated.pb.go index f6a253d23ed7d..a8c4e419e409a 100644 --- a/pkg/apis/application/v1alpha1/generated.pb.go +++ b/pkg/apis/application/v1alpha1/generated.pb.go @@ -797,10 +797,38 @@ func (m *ApplicationSetTerminalGenerator) XXX_DiscardUnknown() { var xxx_messageInfo_ApplicationSetTerminalGenerator proto.InternalMessageInfo +func (m *ApplicationSetWatchEvent) Reset() { *m = ApplicationSetWatchEvent{} } +func (*ApplicationSetWatchEvent) ProtoMessage() {} +func (*ApplicationSetWatchEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_030104ce3b95bcac, []int{27} +} +func (m *ApplicationSetWatchEvent) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplicationSetWatchEvent) 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 *ApplicationSetWatchEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplicationSetWatchEvent.Merge(m, src) +} +func (m *ApplicationSetWatchEvent) XXX_Size() int { + return m.Size() +} +func (m *ApplicationSetWatchEvent) XXX_DiscardUnknown() { + xxx_messageInfo_ApplicationSetWatchEvent.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplicationSetWatchEvent proto.InternalMessageInfo + func (m *ApplicationSource) Reset() { *m = ApplicationSource{} } func (*ApplicationSource) ProtoMessage() {} func (*ApplicationSource) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{27} + return fileDescriptor_030104ce3b95bcac, []int{28} } func (m *ApplicationSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -828,7 +856,7 @@ var xxx_messageInfo_ApplicationSource proto.InternalMessageInfo func (m *ApplicationSourceDirectory) Reset() { *m = ApplicationSourceDirectory{} } func (*ApplicationSourceDirectory) ProtoMessage() {} func (*ApplicationSourceDirectory) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{28} + return fileDescriptor_030104ce3b95bcac, []int{29} } func (m *ApplicationSourceDirectory) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -856,7 +884,7 @@ var xxx_messageInfo_ApplicationSourceDirectory proto.InternalMessageInfo func (m *ApplicationSourceHelm) Reset() { *m = ApplicationSourceHelm{} } func (*ApplicationSourceHelm) ProtoMessage() {} func (*ApplicationSourceHelm) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{29} + return fileDescriptor_030104ce3b95bcac, []int{30} } func (m *ApplicationSourceHelm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -884,7 +912,7 @@ var xxx_messageInfo_ApplicationSourceHelm proto.InternalMessageInfo func (m *ApplicationSourceJsonnet) Reset() { *m = ApplicationSourceJsonnet{} } func (*ApplicationSourceJsonnet) ProtoMessage() {} func (*ApplicationSourceJsonnet) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{30} + return fileDescriptor_030104ce3b95bcac, []int{31} } func (m *ApplicationSourceJsonnet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -912,7 +940,7 @@ var xxx_messageInfo_ApplicationSourceJsonnet proto.InternalMessageInfo func (m *ApplicationSourceKustomize) Reset() { *m = ApplicationSourceKustomize{} } func (*ApplicationSourceKustomize) ProtoMessage() {} func (*ApplicationSourceKustomize) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{31} + return fileDescriptor_030104ce3b95bcac, []int{32} } func (m *ApplicationSourceKustomize) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -940,7 +968,7 @@ var xxx_messageInfo_ApplicationSourceKustomize proto.InternalMessageInfo func (m *ApplicationSourcePlugin) Reset() { *m = ApplicationSourcePlugin{} } func (*ApplicationSourcePlugin) ProtoMessage() {} func (*ApplicationSourcePlugin) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{32} + return fileDescriptor_030104ce3b95bcac, []int{33} } func (m *ApplicationSourcePlugin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -968,7 +996,7 @@ var xxx_messageInfo_ApplicationSourcePlugin proto.InternalMessageInfo func (m *ApplicationSourcePluginParameter) Reset() { *m = ApplicationSourcePluginParameter{} } func (*ApplicationSourcePluginParameter) ProtoMessage() {} func (*ApplicationSourcePluginParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{33} + return fileDescriptor_030104ce3b95bcac, []int{34} } func (m *ApplicationSourcePluginParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -996,7 +1024,7 @@ var xxx_messageInfo_ApplicationSourcePluginParameter proto.InternalMessageInfo func (m *ApplicationSpec) Reset() { *m = ApplicationSpec{} } func (*ApplicationSpec) ProtoMessage() {} func (*ApplicationSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{34} + return fileDescriptor_030104ce3b95bcac, []int{35} } func (m *ApplicationSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1024,7 +1052,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{35} + return fileDescriptor_030104ce3b95bcac, []int{36} } func (m *ApplicationStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1052,7 +1080,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{36} + return fileDescriptor_030104ce3b95bcac, []int{37} } func (m *ApplicationSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1080,7 +1108,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{37} + return fileDescriptor_030104ce3b95bcac, []int{38} } func (m *ApplicationTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1108,7 +1136,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{38} + return fileDescriptor_030104ce3b95bcac, []int{39} } func (m *ApplicationWatchEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1136,7 +1164,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{39} + return fileDescriptor_030104ce3b95bcac, []int{40} } func (m *Backoff) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1164,7 +1192,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{40} + return fileDescriptor_030104ce3b95bcac, []int{41} } func (m *BasicAuthBitbucketServer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1192,7 +1220,7 @@ var xxx_messageInfo_BasicAuthBitbucketServer proto.InternalMessageInfo func (m *BearerTokenBitbucketCloud) Reset() { *m = BearerTokenBitbucketCloud{} } func (*BearerTokenBitbucketCloud) ProtoMessage() {} func (*BearerTokenBitbucketCloud) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{41} + return fileDescriptor_030104ce3b95bcac, []int{42} } func (m *BearerTokenBitbucketCloud) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1220,7 +1248,7 @@ var xxx_messageInfo_BearerTokenBitbucketCloud proto.InternalMessageInfo func (m *ChartDetails) Reset() { *m = ChartDetails{} } func (*ChartDetails) ProtoMessage() {} func (*ChartDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{42} + return fileDescriptor_030104ce3b95bcac, []int{43} } func (m *ChartDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1248,7 +1276,7 @@ var xxx_messageInfo_ChartDetails proto.InternalMessageInfo func (m *Cluster) Reset() { *m = Cluster{} } func (*Cluster) ProtoMessage() {} func (*Cluster) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{43} + return fileDescriptor_030104ce3b95bcac, []int{44} } func (m *Cluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1276,7 +1304,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{44} + return fileDescriptor_030104ce3b95bcac, []int{45} } func (m *ClusterCacheInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1304,7 +1332,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{45} + return fileDescriptor_030104ce3b95bcac, []int{46} } func (m *ClusterConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1332,7 +1360,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{46} + return fileDescriptor_030104ce3b95bcac, []int{47} } func (m *ClusterGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1360,7 +1388,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{47} + return fileDescriptor_030104ce3b95bcac, []int{48} } func (m *ClusterInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1388,7 +1416,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{48} + return fileDescriptor_030104ce3b95bcac, []int{49} } func (m *ClusterList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1416,7 +1444,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{49} + return fileDescriptor_030104ce3b95bcac, []int{50} } func (m *Command) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1444,7 +1472,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{50} + return fileDescriptor_030104ce3b95bcac, []int{51} } func (m *ComparedTo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1472,7 +1500,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{51} + return fileDescriptor_030104ce3b95bcac, []int{52} } func (m *ComponentParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1500,7 +1528,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{52} + return fileDescriptor_030104ce3b95bcac, []int{53} } func (m *ConfigManagementPlugin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1528,7 +1556,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{53} + return fileDescriptor_030104ce3b95bcac, []int{54} } func (m *ConnectionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1556,7 +1584,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{54} + return fileDescriptor_030104ce3b95bcac, []int{55} } func (m *DuckTypeGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1584,7 +1612,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{55} + return fileDescriptor_030104ce3b95bcac, []int{56} } func (m *EnvEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1612,7 +1640,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{56} + return fileDescriptor_030104ce3b95bcac, []int{57} } func (m *ExecProviderConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1640,7 +1668,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{57} + return fileDescriptor_030104ce3b95bcac, []int{58} } func (m *GitDirectoryGeneratorItem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1668,7 +1696,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{58} + return fileDescriptor_030104ce3b95bcac, []int{59} } func (m *GitFileGeneratorItem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1696,7 +1724,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{59} + return fileDescriptor_030104ce3b95bcac, []int{60} } func (m *GitGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1724,7 +1752,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{60} + return fileDescriptor_030104ce3b95bcac, []int{61} } func (m *GnuPGPublicKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1752,7 +1780,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{61} + return fileDescriptor_030104ce3b95bcac, []int{62} } func (m *GnuPGPublicKeyList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1780,7 +1808,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{62} + return fileDescriptor_030104ce3b95bcac, []int{63} } func (m *HealthStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1808,7 +1836,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{63} + return fileDescriptor_030104ce3b95bcac, []int{64} } func (m *HelmFileParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1836,7 +1864,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{64} + return fileDescriptor_030104ce3b95bcac, []int{65} } func (m *HelmOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1864,7 +1892,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{65} + return fileDescriptor_030104ce3b95bcac, []int{66} } func (m *HelmParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1892,7 +1920,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{66} + return fileDescriptor_030104ce3b95bcac, []int{67} } func (m *HostInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1920,7 +1948,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{67} + return fileDescriptor_030104ce3b95bcac, []int{68} } func (m *HostResourceInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1948,7 +1976,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{68} + return fileDescriptor_030104ce3b95bcac, []int{69} } func (m *Info) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1976,7 +2004,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{69} + return fileDescriptor_030104ce3b95bcac, []int{70} } func (m *InfoItem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2004,7 +2032,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{70} + return fileDescriptor_030104ce3b95bcac, []int{71} } func (m *JWTToken) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2032,7 +2060,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{71} + return fileDescriptor_030104ce3b95bcac, []int{72} } func (m *JWTTokens) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2060,7 +2088,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{72} + return fileDescriptor_030104ce3b95bcac, []int{73} } func (m *JsonnetVar) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2088,7 +2116,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{73} + return fileDescriptor_030104ce3b95bcac, []int{74} } func (m *KnownTypeField) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2116,7 +2144,7 @@ var xxx_messageInfo_KnownTypeField proto.InternalMessageInfo func (m *KustomizeGvk) Reset() { *m = KustomizeGvk{} } func (*KustomizeGvk) ProtoMessage() {} func (*KustomizeGvk) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{74} + return fileDescriptor_030104ce3b95bcac, []int{75} } func (m *KustomizeGvk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2144,7 +2172,7 @@ var xxx_messageInfo_KustomizeGvk proto.InternalMessageInfo func (m *KustomizeOptions) Reset() { *m = KustomizeOptions{} } func (*KustomizeOptions) ProtoMessage() {} func (*KustomizeOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{75} + return fileDescriptor_030104ce3b95bcac, []int{76} } func (m *KustomizeOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2172,7 +2200,7 @@ var xxx_messageInfo_KustomizeOptions proto.InternalMessageInfo func (m *KustomizePatch) Reset() { *m = KustomizePatch{} } func (*KustomizePatch) ProtoMessage() {} func (*KustomizePatch) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{76} + return fileDescriptor_030104ce3b95bcac, []int{77} } func (m *KustomizePatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2200,7 +2228,7 @@ var xxx_messageInfo_KustomizePatch proto.InternalMessageInfo func (m *KustomizeReplica) Reset() { *m = KustomizeReplica{} } func (*KustomizeReplica) ProtoMessage() {} func (*KustomizeReplica) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{77} + return fileDescriptor_030104ce3b95bcac, []int{78} } func (m *KustomizeReplica) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2228,7 +2256,7 @@ var xxx_messageInfo_KustomizeReplica proto.InternalMessageInfo func (m *KustomizeResId) Reset() { *m = KustomizeResId{} } func (*KustomizeResId) ProtoMessage() {} func (*KustomizeResId) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{78} + return fileDescriptor_030104ce3b95bcac, []int{79} } func (m *KustomizeResId) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2256,7 +2284,7 @@ var xxx_messageInfo_KustomizeResId proto.InternalMessageInfo func (m *KustomizeSelector) Reset() { *m = KustomizeSelector{} } func (*KustomizeSelector) ProtoMessage() {} func (*KustomizeSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{79} + return fileDescriptor_030104ce3b95bcac, []int{80} } func (m *KustomizeSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2284,7 +2312,7 @@ var xxx_messageInfo_KustomizeSelector proto.InternalMessageInfo func (m *ListGenerator) Reset() { *m = ListGenerator{} } func (*ListGenerator) ProtoMessage() {} func (*ListGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{80} + return fileDescriptor_030104ce3b95bcac, []int{81} } func (m *ListGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2312,7 +2340,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{81} + return fileDescriptor_030104ce3b95bcac, []int{82} } func (m *ManagedNamespaceMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2340,7 +2368,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{82} + return fileDescriptor_030104ce3b95bcac, []int{83} } func (m *MatrixGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2368,7 +2396,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{83} + return fileDescriptor_030104ce3b95bcac, []int{84} } func (m *MergeGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2396,7 +2424,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{84} + return fileDescriptor_030104ce3b95bcac, []int{85} } func (m *NestedMatrixGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2424,7 +2452,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{85} + return fileDescriptor_030104ce3b95bcac, []int{86} } func (m *NestedMergeGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2452,7 +2480,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{86} + return fileDescriptor_030104ce3b95bcac, []int{87} } func (m *Operation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2480,7 +2508,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{87} + return fileDescriptor_030104ce3b95bcac, []int{88} } func (m *OperationInitiator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2508,7 +2536,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{88} + return fileDescriptor_030104ce3b95bcac, []int{89} } func (m *OperationState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2536,7 +2564,7 @@ var xxx_messageInfo_OperationState proto.InternalMessageInfo func (m *OptionalArray) Reset() { *m = OptionalArray{} } func (*OptionalArray) ProtoMessage() {} func (*OptionalArray) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{89} + return fileDescriptor_030104ce3b95bcac, []int{90} } func (m *OptionalArray) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2564,7 +2592,7 @@ var xxx_messageInfo_OptionalArray proto.InternalMessageInfo func (m *OptionalMap) Reset() { *m = OptionalMap{} } func (*OptionalMap) ProtoMessage() {} func (*OptionalMap) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{90} + return fileDescriptor_030104ce3b95bcac, []int{91} } func (m *OptionalMap) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2592,7 +2620,7 @@ var xxx_messageInfo_OptionalMap proto.InternalMessageInfo func (m *OrphanedResourceKey) Reset() { *m = OrphanedResourceKey{} } func (*OrphanedResourceKey) ProtoMessage() {} func (*OrphanedResourceKey) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{91} + return fileDescriptor_030104ce3b95bcac, []int{92} } func (m *OrphanedResourceKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2620,7 +2648,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{92} + return fileDescriptor_030104ce3b95bcac, []int{93} } func (m *OrphanedResourcesMonitorSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2648,7 +2676,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{93} + return fileDescriptor_030104ce3b95bcac, []int{94} } func (m *OverrideIgnoreDiff) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2676,7 +2704,7 @@ var xxx_messageInfo_OverrideIgnoreDiff proto.InternalMessageInfo func (m *PluginConfigMapRef) Reset() { *m = PluginConfigMapRef{} } func (*PluginConfigMapRef) ProtoMessage() {} func (*PluginConfigMapRef) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{94} + return fileDescriptor_030104ce3b95bcac, []int{95} } func (m *PluginConfigMapRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2704,7 +2732,7 @@ var xxx_messageInfo_PluginConfigMapRef proto.InternalMessageInfo func (m *PluginGenerator) Reset() { *m = PluginGenerator{} } func (*PluginGenerator) ProtoMessage() {} func (*PluginGenerator) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{95} + return fileDescriptor_030104ce3b95bcac, []int{96} } func (m *PluginGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2732,7 +2760,7 @@ var xxx_messageInfo_PluginGenerator proto.InternalMessageInfo func (m *PluginInput) Reset() { *m = PluginInput{} } func (*PluginInput) ProtoMessage() {} func (*PluginInput) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{96} + return fileDescriptor_030104ce3b95bcac, []int{97} } func (m *PluginInput) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2760,7 +2788,7 @@ var xxx_messageInfo_PluginInput proto.InternalMessageInfo func (m *ProjectRole) Reset() { *m = ProjectRole{} } func (*ProjectRole) ProtoMessage() {} func (*ProjectRole) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{97} + return fileDescriptor_030104ce3b95bcac, []int{98} } func (m *ProjectRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2788,7 +2816,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{98} + return fileDescriptor_030104ce3b95bcac, []int{99} } func (m *PullRequestGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2816,7 +2844,7 @@ var xxx_messageInfo_PullRequestGenerator proto.InternalMessageInfo func (m *PullRequestGeneratorAzureDevOps) Reset() { *m = PullRequestGeneratorAzureDevOps{} } func (*PullRequestGeneratorAzureDevOps) ProtoMessage() {} func (*PullRequestGeneratorAzureDevOps) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{99} + return fileDescriptor_030104ce3b95bcac, []int{100} } func (m *PullRequestGeneratorAzureDevOps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2844,7 +2872,7 @@ var xxx_messageInfo_PullRequestGeneratorAzureDevOps proto.InternalMessageInfo func (m *PullRequestGeneratorBitbucket) Reset() { *m = PullRequestGeneratorBitbucket{} } func (*PullRequestGeneratorBitbucket) ProtoMessage() {} func (*PullRequestGeneratorBitbucket) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{100} + return fileDescriptor_030104ce3b95bcac, []int{101} } func (m *PullRequestGeneratorBitbucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2872,7 +2900,7 @@ var xxx_messageInfo_PullRequestGeneratorBitbucket proto.InternalMessageInfo func (m *PullRequestGeneratorBitbucketServer) Reset() { *m = PullRequestGeneratorBitbucketServer{} } func (*PullRequestGeneratorBitbucketServer) ProtoMessage() {} func (*PullRequestGeneratorBitbucketServer) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{101} + return fileDescriptor_030104ce3b95bcac, []int{102} } func (m *PullRequestGeneratorBitbucketServer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2900,7 +2928,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{102} + return fileDescriptor_030104ce3b95bcac, []int{103} } func (m *PullRequestGeneratorFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2928,7 +2956,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{103} + return fileDescriptor_030104ce3b95bcac, []int{104} } func (m *PullRequestGeneratorGitLab) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2956,7 +2984,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{104} + return fileDescriptor_030104ce3b95bcac, []int{105} } func (m *PullRequestGeneratorGitea) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2984,7 +3012,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{105} + return fileDescriptor_030104ce3b95bcac, []int{106} } func (m *PullRequestGeneratorGithub) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3012,7 +3040,7 @@ var xxx_messageInfo_PullRequestGeneratorGithub proto.InternalMessageInfo func (m *RefTarget) Reset() { *m = RefTarget{} } func (*RefTarget) ProtoMessage() {} func (*RefTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{106} + return fileDescriptor_030104ce3b95bcac, []int{107} } func (m *RefTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3040,7 +3068,7 @@ var xxx_messageInfo_RefTarget proto.InternalMessageInfo func (m *RepoCreds) Reset() { *m = RepoCreds{} } func (*RepoCreds) ProtoMessage() {} func (*RepoCreds) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{107} + return fileDescriptor_030104ce3b95bcac, []int{108} } func (m *RepoCreds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3068,7 +3096,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{108} + return fileDescriptor_030104ce3b95bcac, []int{109} } func (m *RepoCredsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3096,7 +3124,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{109} + return fileDescriptor_030104ce3b95bcac, []int{110} } func (m *Repository) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3124,7 +3152,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{110} + return fileDescriptor_030104ce3b95bcac, []int{111} } func (m *RepositoryCertificate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3152,7 +3180,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{111} + return fileDescriptor_030104ce3b95bcac, []int{112} } func (m *RepositoryCertificateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3180,7 +3208,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{112} + return fileDescriptor_030104ce3b95bcac, []int{113} } func (m *RepositoryList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3208,7 +3236,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{113} + return fileDescriptor_030104ce3b95bcac, []int{114} } func (m *ResourceAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3236,7 +3264,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{114} + return fileDescriptor_030104ce3b95bcac, []int{115} } func (m *ResourceActionDefinition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3264,7 +3292,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{115} + return fileDescriptor_030104ce3b95bcac, []int{116} } func (m *ResourceActionParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3292,7 +3320,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{116} + return fileDescriptor_030104ce3b95bcac, []int{117} } func (m *ResourceActions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3320,7 +3348,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{117} + return fileDescriptor_030104ce3b95bcac, []int{118} } func (m *ResourceDiff) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3348,7 +3376,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{118} + return fileDescriptor_030104ce3b95bcac, []int{119} } func (m *ResourceIgnoreDifferences) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3376,7 +3404,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{119} + return fileDescriptor_030104ce3b95bcac, []int{120} } func (m *ResourceNetworkingInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3404,7 +3432,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{120} + return fileDescriptor_030104ce3b95bcac, []int{121} } func (m *ResourceNode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3432,7 +3460,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{121} + return fileDescriptor_030104ce3b95bcac, []int{122} } func (m *ResourceOverride) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3460,7 +3488,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{122} + return fileDescriptor_030104ce3b95bcac, []int{123} } func (m *ResourceRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3488,7 +3516,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{123} + return fileDescriptor_030104ce3b95bcac, []int{124} } func (m *ResourceResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3516,7 +3544,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{124} + return fileDescriptor_030104ce3b95bcac, []int{125} } func (m *ResourceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3544,7 +3572,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{125} + return fileDescriptor_030104ce3b95bcac, []int{126} } func (m *RetryStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3572,7 +3600,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{126} + return fileDescriptor_030104ce3b95bcac, []int{127} } func (m *RevisionHistory) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3600,7 +3628,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{127} + return fileDescriptor_030104ce3b95bcac, []int{128} } func (m *RevisionMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3628,7 +3656,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{128} + return fileDescriptor_030104ce3b95bcac, []int{129} } func (m *SCMProviderGenerator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3656,7 +3684,7 @@ var xxx_messageInfo_SCMProviderGenerator proto.InternalMessageInfo func (m *SCMProviderGeneratorAWSCodeCommit) Reset() { *m = SCMProviderGeneratorAWSCodeCommit{} } func (*SCMProviderGeneratorAWSCodeCommit) ProtoMessage() {} func (*SCMProviderGeneratorAWSCodeCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{129} + return fileDescriptor_030104ce3b95bcac, []int{130} } func (m *SCMProviderGeneratorAWSCodeCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3684,7 +3712,7 @@ var xxx_messageInfo_SCMProviderGeneratorAWSCodeCommit proto.InternalMessageInfo func (m *SCMProviderGeneratorAzureDevOps) Reset() { *m = SCMProviderGeneratorAzureDevOps{} } func (*SCMProviderGeneratorAzureDevOps) ProtoMessage() {} func (*SCMProviderGeneratorAzureDevOps) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{130} + return fileDescriptor_030104ce3b95bcac, []int{131} } func (m *SCMProviderGeneratorAzureDevOps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3712,7 +3740,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{131} + return fileDescriptor_030104ce3b95bcac, []int{132} } func (m *SCMProviderGeneratorBitbucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3740,7 +3768,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{132} + return fileDescriptor_030104ce3b95bcac, []int{133} } func (m *SCMProviderGeneratorBitbucketServer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3768,7 +3796,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{133} + return fileDescriptor_030104ce3b95bcac, []int{134} } func (m *SCMProviderGeneratorFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3796,7 +3824,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{134} + return fileDescriptor_030104ce3b95bcac, []int{135} } func (m *SCMProviderGeneratorGitea) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3824,7 +3852,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{135} + return fileDescriptor_030104ce3b95bcac, []int{136} } func (m *SCMProviderGeneratorGithub) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3852,7 +3880,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{136} + return fileDescriptor_030104ce3b95bcac, []int{137} } func (m *SCMProviderGeneratorGitlab) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3880,7 +3908,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{137} + return fileDescriptor_030104ce3b95bcac, []int{138} } func (m *SecretRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3908,7 +3936,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{138} + return fileDescriptor_030104ce3b95bcac, []int{139} } func (m *SignatureKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3936,7 +3964,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{139} + return fileDescriptor_030104ce3b95bcac, []int{140} } func (m *SyncOperation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3964,7 +3992,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{140} + return fileDescriptor_030104ce3b95bcac, []int{141} } func (m *SyncOperationResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3992,7 +4020,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{141} + return fileDescriptor_030104ce3b95bcac, []int{142} } func (m *SyncOperationResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4020,7 +4048,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{142} + return fileDescriptor_030104ce3b95bcac, []int{143} } func (m *SyncPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4048,7 +4076,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{143} + return fileDescriptor_030104ce3b95bcac, []int{144} } func (m *SyncPolicyAutomated) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4076,7 +4104,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{144} + return fileDescriptor_030104ce3b95bcac, []int{145} } func (m *SyncStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4104,7 +4132,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{145} + return fileDescriptor_030104ce3b95bcac, []int{146} } func (m *SyncStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4132,7 +4160,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{146} + return fileDescriptor_030104ce3b95bcac, []int{147} } func (m *SyncStrategyApply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4160,7 +4188,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{147} + return fileDescriptor_030104ce3b95bcac, []int{148} } func (m *SyncStrategyHook) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4188,7 +4216,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{148} + return fileDescriptor_030104ce3b95bcac, []int{149} } func (m *SyncWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4216,7 +4244,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{149} + return fileDescriptor_030104ce3b95bcac, []int{150} } func (m *TLSClientConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4244,7 +4272,7 @@ var xxx_messageInfo_TLSClientConfig proto.InternalMessageInfo func (m *TagFilter) Reset() { *m = TagFilter{} } func (*TagFilter) ProtoMessage() {} func (*TagFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_030104ce3b95bcac, []int{150} + return fileDescriptor_030104ce3b95bcac, []int{151} } func (m *TagFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4300,6 +4328,7 @@ func init() { proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetTemplateMeta.AnnotationsEntry") proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetTemplateMeta.LabelsEntry") proto.RegisterType((*ApplicationSetTerminalGenerator)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetTerminalGenerator") + proto.RegisterType((*ApplicationSetWatchEvent)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetWatchEvent") proto.RegisterType((*ApplicationSource)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSource") proto.RegisterType((*ApplicationSourceDirectory)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSourceDirectory") proto.RegisterType((*ApplicationSourceHelm)(nil), "github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSourceHelm") @@ -4448,697 +4477,699 @@ func init() { } var fileDescriptor_030104ce3b95bcac = []byte{ - // 11030 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x1c, 0xc9, - 0x75, 0x98, 0x66, 0x17, 0x0b, 0xec, 0x3e, 0x7c, 0x90, 0x6c, 0x92, 0x77, 0x20, 0x75, 0x77, 0xa0, - 0xe7, 0xe2, 0xd3, 0x39, 0xba, 0x03, 0x7c, 0xf4, 0x9d, 0x7c, 0xf1, 0xd9, 0x92, 0xb1, 0x00, 0x09, - 0x82, 0x04, 0x08, 0x5c, 0x03, 0x24, 0xa5, 0x93, 0x4f, 0xa7, 0xc1, 0x6e, 0x63, 0x31, 0xc4, 0xec, - 0xcc, 0xdc, 0xcc, 0x2c, 0x08, 0x9c, 0x25, 0x59, 0xb2, 0x64, 0x5b, 0x89, 0x3e, 0x4e, 0x91, 0x92, - 0xf2, 0x39, 0xb1, 0x14, 0xd9, 0x72, 0x52, 0x71, 0x25, 0xaa, 0x38, 0xc9, 0x8f, 0x38, 0x71, 0x52, - 0x2e, 0xdb, 0xa9, 0x94, 0x52, 0x4a, 0xca, 0x2e, 0x97, 0xcb, 0x72, 0x12, 0x1b, 0x91, 0x98, 0x4a, - 0x25, 0x95, 0xaa, 0xb8, 0xca, 0x89, 0x7f, 0x24, 0x4c, 0x7e, 0xa4, 0xfa, 0xbb, 0x67, 0x76, 0x16, - 0x58, 0x00, 0x03, 0x92, 0x52, 0xee, 0xdf, 0x6e, 0xbf, 0x37, 0xef, 0xf5, 0xf4, 0x74, 0xbf, 0xf7, - 0xfa, 0xf5, 0x7b, 0xaf, 0x61, 0xa1, 0xe5, 0x26, 0x1b, 0x9d, 0xb5, 0xc9, 0x46, 0xd0, 0x9e, 0x72, - 0xa2, 0x56, 0x10, 0x46, 0xc1, 0x6d, 0xf6, 0xe3, 0xd9, 0x46, 0x73, 0x6a, 0xeb, 0xe2, 0x54, 0xb8, - 0xd9, 0x9a, 0x72, 0x42, 0x37, 0x9e, 0x72, 0xc2, 0xd0, 0x73, 0x1b, 0x4e, 0xe2, 0x06, 0xfe, 0xd4, - 0xd6, 0x73, 0x8e, 0x17, 0x6e, 0x38, 0xcf, 0x4d, 0xb5, 0x88, 0x4f, 0x22, 0x27, 0x21, 0xcd, 0xc9, - 0x30, 0x0a, 0x92, 0x00, 0xfd, 0xa8, 0xa6, 0x36, 0x29, 0xa9, 0xb1, 0x1f, 0xaf, 0x35, 0x9a, 0x93, - 0x5b, 0x17, 0x27, 0xc3, 0xcd, 0xd6, 0x24, 0xa5, 0x36, 0x69, 0x50, 0x9b, 0x94, 0xd4, 0xce, 0x3f, - 0x6b, 0xf4, 0xa5, 0x15, 0xb4, 0x82, 0x29, 0x46, 0x74, 0xad, 0xb3, 0xce, 0xfe, 0xb1, 0x3f, 0xec, - 0x17, 0x67, 0x76, 0xde, 0xde, 0x7c, 0x31, 0x9e, 0x74, 0x03, 0xda, 0xbd, 0xa9, 0x46, 0x10, 0x91, - 0xa9, 0xad, 0xae, 0x0e, 0x9d, 0xbf, 0xa2, 0x71, 0xc8, 0x76, 0x42, 0xfc, 0xd8, 0x0d, 0xfc, 0xf8, - 0x59, 0xda, 0x05, 0x12, 0x6d, 0x91, 0xc8, 0x7c, 0x3d, 0x03, 0x21, 0x8f, 0xd2, 0xf3, 0x9a, 0x52, - 0xdb, 0x69, 0x6c, 0xb8, 0x3e, 0x89, 0x76, 0xf4, 0xe3, 0x6d, 0x92, 0x38, 0x79, 0x4f, 0x4d, 0xf5, - 0x7a, 0x2a, 0xea, 0xf8, 0x89, 0xdb, 0x26, 0x5d, 0x0f, 0xbc, 0x67, 0xbf, 0x07, 0xe2, 0xc6, 0x06, - 0x69, 0x3b, 0x5d, 0xcf, 0xfd, 0x50, 0xaf, 0xe7, 0x3a, 0x89, 0xeb, 0x4d, 0xb9, 0x7e, 0x12, 0x27, - 0x51, 0xf6, 0x21, 0xfb, 0x17, 0x2d, 0x18, 0x9d, 0xbe, 0xb5, 0x32, 0xdd, 0x49, 0x36, 0x66, 0x02, - 0x7f, 0xdd, 0x6d, 0xa1, 0x17, 0x60, 0xb8, 0xe1, 0x75, 0xe2, 0x84, 0x44, 0xd7, 0x9d, 0x36, 0x19, - 0xb7, 0x2e, 0x58, 0x4f, 0xd7, 0xea, 0xa7, 0xbf, 0xb1, 0x3b, 0xf1, 0x8e, 0xbb, 0xbb, 0x13, 0xc3, - 0x33, 0x1a, 0x84, 0x4d, 0x3c, 0xf4, 0x03, 0x30, 0x14, 0x05, 0x1e, 0x99, 0xc6, 0xd7, 0xc7, 0x4b, - 0xec, 0x91, 0x13, 0xe2, 0x91, 0x21, 0xcc, 0x9b, 0xb1, 0x84, 0x53, 0xd4, 0x30, 0x0a, 0xd6, 0x5d, - 0x8f, 0x8c, 0x97, 0xd3, 0xa8, 0xcb, 0xbc, 0x19, 0x4b, 0xb8, 0xfd, 0x87, 0x25, 0x80, 0xe9, 0x30, - 0x5c, 0x8e, 0x82, 0xdb, 0xa4, 0x91, 0xa0, 0x0f, 0x43, 0x95, 0x0e, 0x73, 0xd3, 0x49, 0x1c, 0xd6, - 0xb1, 0xe1, 0x8b, 0x3f, 0x38, 0xc9, 0xdf, 0x7a, 0xd2, 0x7c, 0x6b, 0x3d, 0xc9, 0x28, 0xf6, 0xe4, - 0xd6, 0x73, 0x93, 0x4b, 0x6b, 0xf4, 0xf9, 0x45, 0x92, 0x38, 0x75, 0x24, 0x98, 0x81, 0x6e, 0xc3, - 0x8a, 0x2a, 0xf2, 0x61, 0x20, 0x0e, 0x49, 0x83, 0xbd, 0xc3, 0xf0, 0xc5, 0x85, 0xc9, 0xa3, 0xcc, - 0xe6, 0x49, 0xdd, 0xf3, 0x95, 0x90, 0x34, 0xea, 0x23, 0x82, 0xf3, 0x00, 0xfd, 0x87, 0x19, 0x1f, - 0xb4, 0x05, 0x83, 0x71, 0xe2, 0x24, 0x9d, 0x98, 0x0d, 0xc5, 0xf0, 0xc5, 0xeb, 0x85, 0x71, 0x64, - 0x54, 0xeb, 0x63, 0x82, 0xe7, 0x20, 0xff, 0x8f, 0x05, 0x37, 0xfb, 0x4f, 0x2c, 0x18, 0xd3, 0xc8, - 0x0b, 0x6e, 0x9c, 0xa0, 0x9f, 0xe8, 0x1a, 0xdc, 0xc9, 0xfe, 0x06, 0x97, 0x3e, 0xcd, 0x86, 0xf6, - 0xa4, 0x60, 0x56, 0x95, 0x2d, 0xc6, 0xc0, 0xb6, 0xa1, 0xe2, 0x26, 0xa4, 0x1d, 0x8f, 0x97, 0x2e, - 0x94, 0x9f, 0x1e, 0xbe, 0x78, 0xa5, 0xa8, 0xf7, 0xac, 0x8f, 0x0a, 0xa6, 0x95, 0x79, 0x4a, 0x1e, - 0x73, 0x2e, 0xf6, 0xaf, 0x8e, 0x98, 0xef, 0x47, 0x07, 0x1c, 0x3d, 0x07, 0xc3, 0x71, 0xd0, 0x89, - 0x1a, 0x04, 0x93, 0x30, 0x88, 0xc7, 0xad, 0x0b, 0x65, 0x3a, 0xf5, 0xe8, 0xa4, 0x5e, 0xd1, 0xcd, - 0xd8, 0xc4, 0x41, 0x9f, 0xb7, 0x60, 0xa4, 0x49, 0xe2, 0xc4, 0xf5, 0x19, 0x7f, 0xd9, 0xf9, 0xd5, - 0x23, 0x77, 0x5e, 0x36, 0xce, 0x6a, 0xe2, 0xf5, 0x33, 0xe2, 0x45, 0x46, 0x8c, 0xc6, 0x18, 0xa7, - 0xf8, 0xd3, 0xc5, 0xd9, 0x24, 0x71, 0x23, 0x72, 0x43, 0xfa, 0x5f, 0x2c, 0x1f, 0xb5, 0x38, 0x67, - 0x35, 0x08, 0x9b, 0x78, 0xc8, 0x87, 0x0a, 0x5d, 0x7c, 0xf1, 0xf8, 0x00, 0xeb, 0xff, 0xfc, 0xd1, - 0xfa, 0x2f, 0x06, 0x95, 0xae, 0x6b, 0x3d, 0xfa, 0xf4, 0x5f, 0x8c, 0x39, 0x1b, 0xf4, 0x39, 0x0b, - 0xc6, 0x85, 0x70, 0xc0, 0x84, 0x0f, 0xe8, 0xad, 0x0d, 0x37, 0x21, 0x9e, 0x1b, 0x27, 0xe3, 0x15, - 0xd6, 0x87, 0xa9, 0xfe, 0xe6, 0xd6, 0x5c, 0x14, 0x74, 0xc2, 0x6b, 0xae, 0xdf, 0xac, 0x5f, 0x10, - 0x9c, 0xc6, 0x67, 0x7a, 0x10, 0xc6, 0x3d, 0x59, 0xa2, 0x2f, 0x59, 0x70, 0xde, 0x77, 0xda, 0x24, - 0x0e, 0x1d, 0xfa, 0x69, 0x39, 0xb8, 0xee, 0x39, 0x8d, 0x4d, 0xd6, 0xa3, 0xc1, 0xc3, 0xf5, 0xc8, - 0x16, 0x3d, 0x3a, 0x7f, 0xbd, 0x27, 0x69, 0xbc, 0x07, 0x5b, 0xf4, 0x35, 0x0b, 0x4e, 0x05, 0x51, - 0xb8, 0xe1, 0xf8, 0xa4, 0x29, 0xa1, 0xf1, 0xf8, 0x10, 0x5b, 0x7a, 0x1f, 0x3a, 0xda, 0x27, 0x5a, - 0xca, 0x92, 0x5d, 0x0c, 0x7c, 0x37, 0x09, 0xa2, 0x15, 0x92, 0x24, 0xae, 0xdf, 0x8a, 0xeb, 0x67, - 0xef, 0xee, 0x4e, 0x9c, 0xea, 0xc2, 0xc2, 0xdd, 0xfd, 0x41, 0x3f, 0x09, 0xc3, 0xf1, 0x8e, 0xdf, - 0xb8, 0xe5, 0xfa, 0xcd, 0xe0, 0x4e, 0x3c, 0x5e, 0x2d, 0x62, 0xf9, 0xae, 0x28, 0x82, 0x62, 0x01, - 0x6a, 0x06, 0xd8, 0xe4, 0x96, 0xff, 0xe1, 0xf4, 0x54, 0xaa, 0x15, 0xfd, 0xe1, 0xf4, 0x64, 0xda, - 0x83, 0x2d, 0xfa, 0x39, 0x0b, 0x46, 0x63, 0xb7, 0xe5, 0x3b, 0x49, 0x27, 0x22, 0xd7, 0xc8, 0x4e, - 0x3c, 0x0e, 0xac, 0x23, 0x57, 0x8f, 0x38, 0x2a, 0x06, 0xc9, 0xfa, 0x59, 0xd1, 0xc7, 0x51, 0xb3, - 0x35, 0xc6, 0x69, 0xbe, 0x79, 0x0b, 0x4d, 0x4f, 0xeb, 0xe1, 0x62, 0x17, 0x9a, 0x9e, 0xd4, 0x3d, - 0x59, 0xa2, 0x1f, 0x87, 0x93, 0xbc, 0x49, 0x8d, 0x6c, 0x3c, 0x3e, 0xc2, 0x04, 0xed, 0x99, 0xbb, - 0xbb, 0x13, 0x27, 0x57, 0x32, 0x30, 0xdc, 0x85, 0x8d, 0x5e, 0x87, 0x89, 0x90, 0x44, 0x6d, 0x37, - 0x59, 0xf2, 0xbd, 0x1d, 0x29, 0xbe, 0x1b, 0x41, 0x48, 0x9a, 0xa2, 0x3b, 0xf1, 0xf8, 0xe8, 0x05, - 0xeb, 0xe9, 0x6a, 0xfd, 0x5d, 0xa2, 0x9b, 0x13, 0xcb, 0x7b, 0xa3, 0xe3, 0xfd, 0xe8, 0xd9, 0xff, - 0xba, 0x04, 0x27, 0xb3, 0x8a, 0x13, 0xfd, 0x1d, 0x0b, 0x4e, 0xdc, 0xbe, 0x93, 0xac, 0x06, 0x9b, - 0xc4, 0x8f, 0xeb, 0x3b, 0x54, 0xbc, 0x31, 0x95, 0x31, 0x7c, 0xb1, 0x51, 0xac, 0x8a, 0x9e, 0xbc, - 0x9a, 0xe6, 0x72, 0xc9, 0x4f, 0xa2, 0x9d, 0xfa, 0xa3, 0xe2, 0xed, 0x4e, 0x5c, 0xbd, 0xb5, 0x6a, - 0x42, 0x71, 0xb6, 0x53, 0xe7, 0x3f, 0x63, 0xc1, 0x99, 0x3c, 0x12, 0xe8, 0x24, 0x94, 0x37, 0xc9, - 0x0e, 0x37, 0xe0, 0x30, 0xfd, 0x89, 0x5e, 0x85, 0xca, 0x96, 0xe3, 0x75, 0x88, 0xb0, 0x6e, 0xe6, - 0x8e, 0xf6, 0x22, 0xaa, 0x67, 0x98, 0x53, 0xfd, 0x91, 0xd2, 0x8b, 0x96, 0xfd, 0xbb, 0x65, 0x18, - 0x36, 0xf4, 0xdb, 0x7d, 0xb0, 0xd8, 0x82, 0x94, 0xc5, 0xb6, 0x58, 0x98, 0x6a, 0xee, 0x69, 0xb2, - 0xdd, 0xc9, 0x98, 0x6c, 0x4b, 0xc5, 0xb1, 0xdc, 0xd3, 0x66, 0x43, 0x09, 0xd4, 0x82, 0x90, 0x5a, - 0xef, 0x54, 0xf5, 0x0f, 0x14, 0xf1, 0x09, 0x97, 0x24, 0xb9, 0xfa, 0xe8, 0xdd, 0xdd, 0x89, 0x9a, - 0xfa, 0x8b, 0x35, 0x23, 0xfb, 0x5b, 0x16, 0x9c, 0x31, 0xfa, 0x38, 0x13, 0xf8, 0x4d, 0x97, 0x7d, - 0xda, 0x0b, 0x30, 0x90, 0xec, 0x84, 0x72, 0x87, 0xa0, 0x46, 0x6a, 0x75, 0x27, 0x24, 0x98, 0x41, + // 11059 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, + 0x75, 0x98, 0x66, 0x17, 0x0b, 0xec, 0x3e, 0x7c, 0xdc, 0x5d, 0xdf, 0x1d, 0x09, 0x9e, 0x48, 0xe2, + 0x3c, 0x8c, 0x29, 0x2a, 0x22, 0x01, 0xf3, 0x44, 0xca, 0x8c, 0x68, 0x4b, 0xc6, 0x02, 0x77, 0x38, + 0xdc, 0x01, 0x07, 0xb0, 0x81, 0xbb, 0x93, 0x28, 0x53, 0xd4, 0x60, 0xb7, 0xb1, 0x98, 0xc3, 0xec, + 0xcc, 0x70, 0x66, 0x16, 0x07, 0xd0, 0x92, 0x2c, 0x59, 0xb2, 0xad, 0x44, 0x1f, 0x54, 0xa4, 0xa4, + 0x4c, 0x27, 0x96, 0x22, 0x5b, 0x4e, 0x2a, 0xae, 0x44, 0x15, 0x27, 0xf9, 0x11, 0x27, 0x4e, 0xca, + 0x65, 0x3b, 0x95, 0x52, 0x4a, 0x49, 0xd9, 0xe5, 0x72, 0x59, 0x4e, 0x62, 0x23, 0xd2, 0xa5, 0x52, + 0x49, 0xa5, 0x2a, 0xae, 0x72, 0xe2, 0x4a, 0x25, 0x97, 0xfc, 0x48, 0xf5, 0x77, 0xcf, 0xec, 0x2c, + 0xb0, 0x00, 0x06, 0x77, 0x27, 0x99, 0xff, 0x76, 0xfb, 0xbd, 0x79, 0xaf, 0xa7, 0xa7, 0xfb, 0xbd, + 0xd7, 0xaf, 0xdf, 0x7b, 0x0d, 0x0b, 0x2d, 0x37, 0xd9, 0xe8, 0xac, 0x4d, 0x36, 0x82, 0xf6, 0x94, + 0x13, 0xb5, 0x82, 0x30, 0x0a, 0x6e, 0xb1, 0x1f, 0xcf, 0x34, 0x9a, 0x53, 0x5b, 0x17, 0xa6, 0xc2, + 0xcd, 0xd6, 0x94, 0x13, 0xba, 0xf1, 0x94, 0x13, 0x86, 0x9e, 0xdb, 0x70, 0x12, 0x37, 0xf0, 0xa7, + 0xb6, 0x9e, 0x75, 0xbc, 0x70, 0xc3, 0x79, 0x76, 0xaa, 0x45, 0x7c, 0x12, 0x39, 0x09, 0x69, 0x4e, + 0x86, 0x51, 0x90, 0x04, 0xe8, 0x47, 0x34, 0xb5, 0x49, 0x49, 0x8d, 0xfd, 0x78, 0xb5, 0xd1, 0x9c, + 0xdc, 0xba, 0x30, 0x19, 0x6e, 0xb6, 0x26, 0x29, 0xb5, 0x49, 0x83, 0xda, 0xa4, 0xa4, 0x76, 0xee, + 0x19, 0xa3, 0x2f, 0xad, 0xa0, 0x15, 0x4c, 0x31, 0xa2, 0x6b, 0x9d, 0x75, 0xf6, 0x8f, 0xfd, 0x61, + 0xbf, 0x38, 0xb3, 0x73, 0xf6, 0xe6, 0x0b, 0xf1, 0xa4, 0x1b, 0xd0, 0xee, 0x4d, 0x35, 0x82, 0x88, + 0x4c, 0x6d, 0x75, 0x75, 0xe8, 0xdc, 0x65, 0x8d, 0x43, 0xb6, 0x13, 0xe2, 0xc7, 0x6e, 0xe0, 0xc7, + 0xcf, 0xd0, 0x2e, 0x90, 0x68, 0x8b, 0x44, 0xe6, 0xeb, 0x19, 0x08, 0x79, 0x94, 0x9e, 0xd3, 0x94, + 0xda, 0x4e, 0x63, 0xc3, 0xf5, 0x49, 0xb4, 0xa3, 0x1f, 0x6f, 0x93, 0xc4, 0xc9, 0x7b, 0x6a, 0xaa, + 0xd7, 0x53, 0x51, 0xc7, 0x4f, 0xdc, 0x36, 0xe9, 0x7a, 0xe0, 0x3d, 0xfb, 0x3d, 0x10, 0x37, 0x36, + 0x48, 0xdb, 0xe9, 0x7a, 0xee, 0xdd, 0xbd, 0x9e, 0xeb, 0x24, 0xae, 0x37, 0xe5, 0xfa, 0x49, 0x9c, + 0x44, 0xd9, 0x87, 0xec, 0x5f, 0xb0, 0x60, 0x74, 0xfa, 0xe6, 0xca, 0x74, 0x27, 0xd9, 0x98, 0x09, + 0xfc, 0x75, 0xb7, 0x85, 0x9e, 0x87, 0xe1, 0x86, 0xd7, 0x89, 0x13, 0x12, 0x5d, 0x73, 0xda, 0x64, + 0xdc, 0x3a, 0x6f, 0x3d, 0x55, 0xab, 0x9f, 0xfe, 0xe6, 0xee, 0xc4, 0xdb, 0xee, 0xec, 0x4e, 0x0c, + 0xcf, 0x68, 0x10, 0x36, 0xf1, 0xd0, 0x3b, 0x61, 0x28, 0x0a, 0x3c, 0x32, 0x8d, 0xaf, 0x8d, 0x97, + 0xd8, 0x23, 0x27, 0xc4, 0x23, 0x43, 0x98, 0x37, 0x63, 0x09, 0xa7, 0xa8, 0x61, 0x14, 0xac, 0xbb, + 0x1e, 0x19, 0x2f, 0xa7, 0x51, 0x97, 0x79, 0x33, 0x96, 0x70, 0xfb, 0x0f, 0x4a, 0x00, 0xd3, 0x61, + 0xb8, 0x1c, 0x05, 0xb7, 0x48, 0x23, 0x41, 0x1f, 0x81, 0x2a, 0x1d, 0xe6, 0xa6, 0x93, 0x38, 0xac, + 0x63, 0xc3, 0x17, 0x7e, 0x68, 0x92, 0xbf, 0xf5, 0xa4, 0xf9, 0xd6, 0x7a, 0x92, 0x51, 0xec, 0xc9, + 0xad, 0x67, 0x27, 0x97, 0xd6, 0xe8, 0xf3, 0x8b, 0x24, 0x71, 0xea, 0x48, 0x30, 0x03, 0xdd, 0x86, + 0x15, 0x55, 0xe4, 0xc3, 0x40, 0x1c, 0x92, 0x06, 0x7b, 0x87, 0xe1, 0x0b, 0x0b, 0x93, 0x47, 0x99, + 0xcd, 0x93, 0xba, 0xe7, 0x2b, 0x21, 0x69, 0xd4, 0x47, 0x04, 0xe7, 0x01, 0xfa, 0x0f, 0x33, 0x3e, + 0x68, 0x0b, 0x06, 0xe3, 0xc4, 0x49, 0x3a, 0x31, 0x1b, 0x8a, 0xe1, 0x0b, 0xd7, 0x0a, 0xe3, 0xc8, + 0xa8, 0xd6, 0xc7, 0x04, 0xcf, 0x41, 0xfe, 0x1f, 0x0b, 0x6e, 0xf6, 0x1f, 0x5b, 0x30, 0xa6, 0x91, + 0x17, 0xdc, 0x38, 0x41, 0x3f, 0xde, 0x35, 0xb8, 0x93, 0xfd, 0x0d, 0x2e, 0x7d, 0x9a, 0x0d, 0xed, + 0x49, 0xc1, 0xac, 0x2a, 0x5b, 0x8c, 0x81, 0x6d, 0x43, 0xc5, 0x4d, 0x48, 0x3b, 0x1e, 0x2f, 0x9d, + 0x2f, 0x3f, 0x35, 0x7c, 0xe1, 0x72, 0x51, 0xef, 0x59, 0x1f, 0x15, 0x4c, 0x2b, 0xf3, 0x94, 0x3c, + 0xe6, 0x5c, 0xec, 0x5f, 0x19, 0x31, 0xdf, 0x8f, 0x0e, 0x38, 0x7a, 0x16, 0x86, 0xe3, 0xa0, 0x13, + 0x35, 0x08, 0x26, 0x61, 0x10, 0x8f, 0x5b, 0xe7, 0xcb, 0x74, 0xea, 0xd1, 0x49, 0xbd, 0xa2, 0x9b, + 0xb1, 0x89, 0x83, 0xbe, 0x60, 0xc1, 0x48, 0x93, 0xc4, 0x89, 0xeb, 0x33, 0xfe, 0xb2, 0xf3, 0xab, + 0x47, 0xee, 0xbc, 0x6c, 0x9c, 0xd5, 0xc4, 0xeb, 0x67, 0xc4, 0x8b, 0x8c, 0x18, 0x8d, 0x31, 0x4e, + 0xf1, 0xa7, 0x8b, 0xb3, 0x49, 0xe2, 0x46, 0xe4, 0x86, 0xf4, 0xbf, 0x58, 0x3e, 0x6a, 0x71, 0xce, + 0x6a, 0x10, 0x36, 0xf1, 0x90, 0x0f, 0x15, 0xba, 0xf8, 0xe2, 0xf1, 0x01, 0xd6, 0xff, 0xf9, 0xa3, + 0xf5, 0x5f, 0x0c, 0x2a, 0x5d, 0xd7, 0x7a, 0xf4, 0xe9, 0xbf, 0x18, 0x73, 0x36, 0xe8, 0xf3, 0x16, + 0x8c, 0x0b, 0xe1, 0x80, 0x09, 0x1f, 0xd0, 0x9b, 0x1b, 0x6e, 0x42, 0x3c, 0x37, 0x4e, 0xc6, 0x2b, + 0xac, 0x0f, 0x53, 0xfd, 0xcd, 0xad, 0xb9, 0x28, 0xe8, 0x84, 0x57, 0x5d, 0xbf, 0x59, 0x3f, 0x2f, + 0x38, 0x8d, 0xcf, 0xf4, 0x20, 0x8c, 0x7b, 0xb2, 0x44, 0x5f, 0xb6, 0xe0, 0x9c, 0xef, 0xb4, 0x49, + 0x1c, 0x3a, 0xf4, 0xd3, 0x72, 0x70, 0xdd, 0x73, 0x1a, 0x9b, 0xac, 0x47, 0x83, 0x87, 0xeb, 0x91, + 0x2d, 0x7a, 0x74, 0xee, 0x5a, 0x4f, 0xd2, 0x78, 0x0f, 0xb6, 0xe8, 0xeb, 0x16, 0x9c, 0x0a, 0xa2, + 0x70, 0xc3, 0xf1, 0x49, 0x53, 0x42, 0xe3, 0xf1, 0x21, 0xb6, 0xf4, 0x3e, 0x7c, 0xb4, 0x4f, 0xb4, + 0x94, 0x25, 0xbb, 0x18, 0xf8, 0x6e, 0x12, 0x44, 0x2b, 0x24, 0x49, 0x5c, 0xbf, 0x15, 0xd7, 0xcf, + 0xde, 0xd9, 0x9d, 0x38, 0xd5, 0x85, 0x85, 0xbb, 0xfb, 0x83, 0x7e, 0x02, 0x86, 0xe3, 0x1d, 0xbf, + 0x71, 0xd3, 0xf5, 0x9b, 0xc1, 0xed, 0x78, 0xbc, 0x5a, 0xc4, 0xf2, 0x5d, 0x51, 0x04, 0xc5, 0x02, + 0xd4, 0x0c, 0xb0, 0xc9, 0x2d, 0xff, 0xc3, 0xe9, 0xa9, 0x54, 0x2b, 0xfa, 0xc3, 0xe9, 0xc9, 0xb4, + 0x07, 0x5b, 0xf4, 0xb3, 0x16, 0x8c, 0xc6, 0x6e, 0xcb, 0x77, 0x92, 0x4e, 0x44, 0xae, 0x92, 0x9d, + 0x78, 0x1c, 0x58, 0x47, 0xae, 0x1c, 0x71, 0x54, 0x0c, 0x92, 0xf5, 0xb3, 0xa2, 0x8f, 0xa3, 0x66, + 0x6b, 0x8c, 0xd3, 0x7c, 0xf3, 0x16, 0x9a, 0x9e, 0xd6, 0xc3, 0xc5, 0x2e, 0x34, 0x3d, 0xa9, 0x7b, + 0xb2, 0x44, 0x3f, 0x06, 0x27, 0x79, 0x93, 0x1a, 0xd9, 0x78, 0x7c, 0x84, 0x09, 0xda, 0x33, 0x77, + 0x76, 0x27, 0x4e, 0xae, 0x64, 0x60, 0xb8, 0x0b, 0x1b, 0xbd, 0x06, 0x13, 0x21, 0x89, 0xda, 0x6e, + 0xb2, 0xe4, 0x7b, 0x3b, 0x52, 0x7c, 0x37, 0x82, 0x90, 0x34, 0x45, 0x77, 0xe2, 0xf1, 0xd1, 0xf3, + 0xd6, 0x53, 0xd5, 0xfa, 0x3b, 0x44, 0x37, 0x27, 0x96, 0xf7, 0x46, 0xc7, 0xfb, 0xd1, 0xb3, 0xff, + 0x75, 0x09, 0x4e, 0x66, 0x15, 0x27, 0xfa, 0x3b, 0x16, 0x9c, 0xb8, 0x75, 0x3b, 0x59, 0x0d, 0x36, + 0x89, 0x1f, 0xd7, 0x77, 0xa8, 0x78, 0x63, 0x2a, 0x63, 0xf8, 0x42, 0xa3, 0x58, 0x15, 0x3d, 0x79, + 0x25, 0xcd, 0xe5, 0xa2, 0x9f, 0x44, 0x3b, 0xf5, 0x87, 0xc5, 0xdb, 0x9d, 0xb8, 0x72, 0x73, 0xd5, + 0x84, 0xe2, 0x6c, 0xa7, 0xce, 0x7d, 0xd6, 0x82, 0x33, 0x79, 0x24, 0xd0, 0x49, 0x28, 0x6f, 0x92, + 0x1d, 0x6e, 0xc0, 0x61, 0xfa, 0x13, 0xbd, 0x02, 0x95, 0x2d, 0xc7, 0xeb, 0x10, 0x61, 0xdd, 0xcc, + 0x1d, 0xed, 0x45, 0x54, 0xcf, 0x30, 0xa7, 0xfa, 0xde, 0xd2, 0x0b, 0x96, 0xfd, 0x3b, 0x65, 0x18, + 0x36, 0xf4, 0xdb, 0x3d, 0xb0, 0xd8, 0x82, 0x94, 0xc5, 0xb6, 0x58, 0x98, 0x6a, 0xee, 0x69, 0xb2, + 0xdd, 0xce, 0x98, 0x6c, 0x4b, 0xc5, 0xb1, 0xdc, 0xd3, 0x66, 0x43, 0x09, 0xd4, 0x82, 0x90, 0x5a, + 0xef, 0x54, 0xf5, 0x0f, 0x14, 0xf1, 0x09, 0x97, 0x24, 0xb9, 0xfa, 0xe8, 0x9d, 0xdd, 0x89, 0x9a, + 0xfa, 0x8b, 0x35, 0x23, 0xfb, 0xdb, 0x16, 0x9c, 0x31, 0xfa, 0x38, 0x13, 0xf8, 0x4d, 0x97, 0x7d, + 0xda, 0xf3, 0x30, 0x90, 0xec, 0x84, 0x72, 0x87, 0xa0, 0x46, 0x6a, 0x75, 0x27, 0x24, 0x98, 0x41, 0xa8, 0xa1, 0xdf, 0x26, 0x71, 0xec, 0xb4, 0x48, 0x76, 0x4f, 0xb0, 0xc8, 0x9b, 0xb1, 0x84, 0xa3, 0x08, 0x90, 0xe7, 0xc4, 0xc9, 0x6a, 0xe4, 0xf8, 0x31, 0x23, 0xbf, 0xea, 0xb6, 0x89, 0x18, 0xe0, - 0xbf, 0xd8, 0xdf, 0x8c, 0xa1, 0x4f, 0xd4, 0x1f, 0xb9, 0xbb, 0x3b, 0x81, 0x16, 0xba, 0x28, 0xe1, - 0x1c, 0xea, 0xf6, 0x97, 0x2c, 0x78, 0x24, 0xdf, 0x16, 0x43, 0x4f, 0xc1, 0x20, 0xdf, 0x1e, 0x8a, + 0xbf, 0xd8, 0xdf, 0x8c, 0xa1, 0x4f, 0xd4, 0x1f, 0xba, 0xb3, 0x3b, 0x81, 0x16, 0xba, 0x28, 0xe1, + 0x1c, 0xea, 0xf6, 0x97, 0x2d, 0x78, 0x28, 0xdf, 0x16, 0x43, 0x4f, 0xc2, 0x20, 0xdf, 0x1e, 0x8a, 0xb7, 0xd3, 0x9f, 0x84, 0xb5, 0x62, 0x01, 0x45, 0x53, 0x50, 0x53, 0x7a, 0x42, 0xbc, 0xe3, 0x29, 0x81, 0x5a, 0xd3, 0xca, 0x45, 0xe3, 0xd0, 0x41, 0xa3, 0x7f, 0x84, 0xe5, 0xa6, 0x06, 0x8d, 0xed, - 0xa7, 0x18, 0xc4, 0xfe, 0x8f, 0x16, 0x9c, 0x30, 0x7a, 0x75, 0x1f, 0x4c, 0x73, 0x3f, 0x6d, 0x9a, - 0xcf, 0x17, 0x36, 0x9f, 0x7b, 0xd8, 0xe6, 0x9f, 0xb3, 0xe0, 0xbc, 0x81, 0xb5, 0xe8, 0x24, 0x8d, - 0x8d, 0x4b, 0xdb, 0x61, 0x44, 0x62, 0xba, 0xf5, 0x46, 0x8f, 0x1b, 0x72, 0xab, 0x3e, 0x2c, 0x28, - 0x94, 0xaf, 0x91, 0x1d, 0x2e, 0xc4, 0x9e, 0x81, 0x2a, 0x9f, 0x9c, 0x41, 0x24, 0x46, 0x5c, 0xbd, + 0xa7, 0x18, 0xc4, 0xfe, 0x8f, 0x16, 0x9c, 0x30, 0x7a, 0x75, 0x0f, 0x4c, 0x73, 0x3f, 0x6d, 0x9a, + 0xcf, 0x17, 0x36, 0x9f, 0x7b, 0xd8, 0xe6, 0x9f, 0xb7, 0xe0, 0x9c, 0x81, 0xb5, 0xe8, 0x24, 0x8d, + 0x8d, 0x8b, 0xdb, 0x61, 0x44, 0x62, 0xba, 0xf5, 0x46, 0x8f, 0x19, 0x72, 0xab, 0x3e, 0x2c, 0x28, + 0x94, 0xaf, 0x92, 0x1d, 0x2e, 0xc4, 0x9e, 0x86, 0x2a, 0x9f, 0x9c, 0x41, 0x24, 0x46, 0x5c, 0xbd, 0xdb, 0x92, 0x68, 0xc7, 0x0a, 0x03, 0xd9, 0x30, 0xc8, 0x84, 0x13, 0x5d, 0xac, 0x54, 0x0d, 0x01, - 0xfd, 0x88, 0x37, 0x59, 0x0b, 0x16, 0x10, 0x3b, 0x4e, 0x75, 0x67, 0x39, 0x22, 0xec, 0xe3, 0x36, - 0x2f, 0xbb, 0xc4, 0x6b, 0xc6, 0x74, 0xdb, 0xe0, 0xf8, 0x7e, 0x90, 0x88, 0x1d, 0x80, 0xb1, 0x6d, + 0xfd, 0x88, 0x37, 0x58, 0x0b, 0x16, 0x10, 0x3b, 0x4e, 0x75, 0x67, 0x39, 0x22, 0xec, 0xe3, 0x36, + 0x2f, 0xb9, 0xc4, 0x6b, 0xc6, 0x74, 0xdb, 0xe0, 0xf8, 0x7e, 0x90, 0x88, 0x1d, 0x80, 0xb1, 0x6d, 0x98, 0xd6, 0xcd, 0xd8, 0xc4, 0xa1, 0x4c, 0x3d, 0x67, 0x8d, 0x78, 0x7c, 0x44, 0x05, 0xd3, 0x05, - 0xd6, 0x82, 0x05, 0xc4, 0xbe, 0x5b, 0x62, 0x1b, 0x14, 0xb5, 0xf4, 0xc9, 0xfd, 0xd8, 0xdd, 0x46, - 0x29, 0x59, 0xb9, 0x5c, 0x9c, 0xe0, 0x22, 0xbd, 0x77, 0xb8, 0x6f, 0x64, 0xc4, 0x25, 0x2e, 0x94, - 0xeb, 0xde, 0xbb, 0xdc, 0xdf, 0x2a, 0xc1, 0x44, 0xfa, 0x81, 0x2e, 0x69, 0x4b, 0xb7, 0x54, 0x06, + 0xd6, 0x82, 0x05, 0xc4, 0xbe, 0x53, 0x62, 0x1b, 0x14, 0xb5, 0xf4, 0xc9, 0xbd, 0xd8, 0xdd, 0x46, + 0x29, 0x59, 0xb9, 0x5c, 0x9c, 0xe0, 0x22, 0xbd, 0x77, 0xb8, 0xaf, 0x67, 0xc4, 0x25, 0x2e, 0x94, + 0xeb, 0xde, 0xbb, 0xdc, 0xdf, 0x2c, 0xc1, 0x44, 0xfa, 0x81, 0x2e, 0x69, 0x4b, 0xb7, 0x54, 0x06, 0xa3, 0xac, 0xbf, 0xc3, 0xc0, 0xc7, 0x26, 0x5e, 0x0f, 0x81, 0x55, 0x3a, 0x4e, 0x81, 0x65, 0xca, - 0xd3, 0xf2, 0x3e, 0xf2, 0xf4, 0x29, 0x35, 0xea, 0x03, 0x19, 0x01, 0x96, 0xd6, 0x29, 0x17, 0x60, + 0xd3, 0xf2, 0x3e, 0xf2, 0xf4, 0x49, 0x35, 0xea, 0x03, 0x19, 0x01, 0x96, 0xd6, 0x29, 0xe7, 0x61, 0x20, 0x4e, 0x48, 0x38, 0x5e, 0x49, 0xcb, 0xa3, 0x95, 0x84, 0x84, 0x98, 0x41, 0xec, 0xff, 0x56, - 0x82, 0x47, 0xd3, 0x63, 0xa8, 0x55, 0xc0, 0xfb, 0x52, 0x2a, 0xe0, 0xdd, 0xa6, 0x0a, 0xb8, 0xb7, - 0x3b, 0xf1, 0xce, 0x1e, 0x8f, 0x7d, 0xd7, 0x68, 0x08, 0x34, 0x97, 0x19, 0xc5, 0xa9, 0xf4, 0x28, - 0xde, 0xdb, 0x9d, 0x78, 0xbc, 0xc7, 0x3b, 0x66, 0x86, 0xf9, 0x29, 0x18, 0x8c, 0x88, 0x13, 0x07, - 0xbe, 0x18, 0x68, 0xf5, 0x39, 0x30, 0x6b, 0xc5, 0x02, 0x6a, 0xff, 0x7e, 0x2d, 0x3b, 0xd8, 0x73, - 0xdc, 0x61, 0x17, 0x44, 0xc8, 0x85, 0x01, 0x66, 0xd6, 0x73, 0xd1, 0x70, 0xed, 0x68, 0xcb, 0x88, + 0x82, 0x87, 0xd3, 0x63, 0xa8, 0x55, 0xc0, 0xfb, 0x53, 0x2a, 0xe0, 0x5d, 0xa6, 0x0a, 0xb8, 0xbb, + 0x3b, 0xf1, 0xf6, 0x1e, 0x8f, 0x7d, 0xcf, 0x68, 0x08, 0x34, 0x97, 0x19, 0xc5, 0xa9, 0xf4, 0x28, + 0xde, 0xdd, 0x9d, 0x78, 0xac, 0xc7, 0x3b, 0x66, 0x86, 0xf9, 0x49, 0x18, 0x8c, 0x88, 0x13, 0x07, + 0xbe, 0x18, 0x68, 0xf5, 0x39, 0x30, 0x6b, 0xc5, 0x02, 0x6a, 0xff, 0x5e, 0x2d, 0x3b, 0xd8, 0x73, + 0xdc, 0x61, 0x17, 0x44, 0xc8, 0x85, 0x01, 0x66, 0xd6, 0x73, 0xd1, 0x70, 0xf5, 0x68, 0xcb, 0x88, 0xaa, 0x01, 0x45, 0xba, 0x5e, 0xa5, 0x5f, 0x8d, 0x36, 0x61, 0xc6, 0x02, 0x6d, 0x43, 0xb5, 0x21, 0xad, 0xed, 0x52, 0x11, 0x7e, 0x29, 0x61, 0x6b, 0x6b, 0x8e, 0x23, 0x54, 0x5e, 0x2b, 0x13, 0x5d, 0x71, 0x43, 0x04, 0xca, 0x2d, 0x37, 0x11, 0x9f, 0xf5, 0x88, 0xfb, 0xa9, 0x39, 0xd7, 0x78, 0xc5, - 0x21, 0xaa, 0x44, 0xe6, 0xdc, 0x04, 0x53, 0xfa, 0xe8, 0x67, 0x2c, 0x18, 0x8e, 0x1b, 0xed, 0xe5, + 0x21, 0xaa, 0x44, 0xe6, 0xdc, 0x04, 0x53, 0xfa, 0xe8, 0xa7, 0x2d, 0x18, 0x8e, 0x1b, 0xed, 0xe5, 0x28, 0xd8, 0x72, 0x9b, 0x24, 0x12, 0xd6, 0xd4, 0x11, 0x45, 0xd3, 0xca, 0xcc, 0xa2, 0x24, 0xa8, - 0xf9, 0xf2, 0xfd, 0xad, 0x86, 0x60, 0x93, 0x2f, 0xdd, 0x65, 0x3c, 0x2a, 0xde, 0x7d, 0x96, 0x34, + 0xf9, 0xf2, 0xfd, 0xad, 0x86, 0x60, 0x93, 0x2f, 0xdd, 0x65, 0x3c, 0x2c, 0xde, 0x7d, 0x96, 0x34, 0x5c, 0xaa, 0xff, 0xe4, 0xa6, 0x8a, 0xcd, 0x94, 0x23, 0x5b, 0x97, 0xb3, 0x9d, 0xc6, 0x26, 0x5d, - 0x6f, 0xba, 0x43, 0xef, 0xbc, 0xbb, 0x3b, 0xf1, 0xe8, 0x4c, 0x3e, 0x4f, 0xdc, 0xab, 0x33, 0x6c, - 0xc0, 0xc2, 0x8e, 0xe7, 0x61, 0xf2, 0x7a, 0x87, 0x30, 0x97, 0x49, 0x01, 0x03, 0xb6, 0xac, 0x09, - 0x66, 0x06, 0xcc, 0x80, 0x60, 0x93, 0x2f, 0x7a, 0x1d, 0x06, 0xdb, 0x4e, 0x12, 0xb9, 0xdb, 0xc2, + 0x6f, 0xba, 0x43, 0x6f, 0xbf, 0xb3, 0x3b, 0xf1, 0xf0, 0x4c, 0x3e, 0x4f, 0xdc, 0xab, 0x33, 0x6c, + 0xc0, 0xc2, 0x8e, 0xe7, 0x61, 0xf2, 0x5a, 0x87, 0x30, 0x97, 0x49, 0x01, 0x03, 0xb6, 0xac, 0x09, + 0x66, 0x06, 0xcc, 0x80, 0x60, 0x93, 0x2f, 0x7a, 0x0d, 0x06, 0xdb, 0x4e, 0x12, 0xb9, 0xdb, 0xc2, 0x4f, 0x72, 0x44, 0x7b, 0x7f, 0x91, 0xd1, 0xd2, 0xcc, 0x99, 0xa6, 0xe6, 0x8d, 0x58, 0x30, 0x42, 0x6d, 0xa8, 0xb4, 0x49, 0xd4, 0x22, 0xe3, 0xd5, 0x22, 0x7c, 0xc2, 0x8b, 0x94, 0x94, 0x66, 0x58, - 0xa3, 0xd6, 0x11, 0x6b, 0xc3, 0x9c, 0x0b, 0x7a, 0x15, 0xaa, 0x31, 0xf1, 0x48, 0x83, 0xda, 0x37, - 0x35, 0xc6, 0xf1, 0x87, 0xfa, 0xb4, 0xf5, 0xa8, 0x61, 0xb1, 0x22, 0x1e, 0xe5, 0x0b, 0x4c, 0xfe, - 0xc3, 0x8a, 0x24, 0x1d, 0xc0, 0xd0, 0xeb, 0xb4, 0x5c, 0x7f, 0x1c, 0x8a, 0x18, 0xc0, 0x65, 0x46, - 0x2b, 0x33, 0x80, 0xbc, 0x11, 0x0b, 0x46, 0xf6, 0x7f, 0xb6, 0x00, 0xa5, 0x85, 0xda, 0x7d, 0x30, - 0x6a, 0x5f, 0x4f, 0x1b, 0xb5, 0x0b, 0x45, 0x5a, 0x1d, 0x3d, 0xec, 0xda, 0xdf, 0xa8, 0x41, 0x46, - 0x1d, 0x5c, 0x27, 0x71, 0x42, 0x9a, 0x6f, 0x8b, 0xf0, 0xb7, 0x45, 0xf8, 0xdb, 0x22, 0x5c, 0x89, - 0xf0, 0xb5, 0x8c, 0x08, 0x7f, 0xaf, 0xb1, 0xea, 0xf5, 0x01, 0xec, 0x6b, 0xea, 0x84, 0xd6, 0xec, - 0x81, 0x81, 0x40, 0x25, 0xc1, 0xd5, 0x95, 0xa5, 0xeb, 0xb9, 0x32, 0xfb, 0xb5, 0xb4, 0xcc, 0x3e, - 0x2a, 0x8b, 0xff, 0x1f, 0xa4, 0xf4, 0xbf, 0xb2, 0xe0, 0x5d, 0x69, 0xe9, 0x25, 0x67, 0xce, 0x7c, - 0xcb, 0x0f, 0x22, 0x32, 0xeb, 0xae, 0xaf, 0x93, 0x88, 0xf8, 0x0d, 0x12, 0x2b, 0x2f, 0x86, 0xd5, - 0xcb, 0x8b, 0x81, 0x9e, 0x87, 0x91, 0xdb, 0x71, 0xe0, 0x2f, 0x07, 0xae, 0x2f, 0x44, 0x10, 0xdd, - 0x08, 0x9f, 0xbc, 0xbb, 0x3b, 0x31, 0x42, 0x47, 0x54, 0xb6, 0xe3, 0x14, 0x16, 0x9a, 0x81, 0x53, - 0xb7, 0x5f, 0x5f, 0x76, 0x12, 0xc3, 0x1d, 0x20, 0x37, 0xee, 0xec, 0xc0, 0xe2, 0xea, 0xcb, 0x19, - 0x20, 0xee, 0xc6, 0xb7, 0xff, 0x66, 0x09, 0xce, 0x65, 0x5e, 0x24, 0xf0, 0xbc, 0xa0, 0x93, 0xd0, - 0x4d, 0x0d, 0xfa, 0x8a, 0x05, 0x27, 0xdb, 0x69, 0x8f, 0x43, 0x2c, 0x1c, 0xbb, 0xef, 0x2f, 0x4c, - 0x47, 0x64, 0x5c, 0x1a, 0xf5, 0x71, 0x31, 0x42, 0x27, 0x33, 0x80, 0x18, 0x77, 0xf5, 0x05, 0xbd, - 0x0a, 0xb5, 0xb6, 0xb3, 0x7d, 0x23, 0x6c, 0x3a, 0x89, 0xdc, 0x4f, 0xf6, 0x76, 0x03, 0x74, 0x12, - 0xd7, 0x9b, 0xe4, 0x47, 0xfb, 0x93, 0xf3, 0x7e, 0xb2, 0x14, 0xad, 0x24, 0x91, 0xeb, 0xb7, 0xb8, - 0x3b, 0x6f, 0x51, 0x92, 0xc1, 0x9a, 0xa2, 0xfd, 0x65, 0x2b, 0xab, 0xa4, 0xd4, 0xe8, 0x44, 0x4e, - 0x42, 0x5a, 0x3b, 0xe8, 0x23, 0x50, 0xa1, 0x1b, 0x3f, 0x39, 0x2a, 0xb7, 0x8a, 0xd4, 0x9c, 0xc6, - 0x97, 0xd0, 0x4a, 0x94, 0xfe, 0x8b, 0x31, 0x67, 0x6a, 0x7f, 0xa5, 0x96, 0x35, 0x16, 0xd8, 0xe1, - 0xed, 0x45, 0x80, 0x56, 0xb0, 0x4a, 0xda, 0xa1, 0x47, 0x87, 0xc5, 0x62, 0x27, 0x00, 0xca, 0xd7, - 0x31, 0xa7, 0x20, 0xd8, 0xc0, 0x42, 0x7f, 0xd9, 0x02, 0x68, 0xc9, 0x39, 0x2f, 0x0d, 0x81, 0x1b, - 0x45, 0xbe, 0x8e, 0x5e, 0x51, 0xba, 0x2f, 0x8a, 0x21, 0x36, 0x98, 0xa3, 0x9f, 0xb6, 0xa0, 0x9a, - 0xc8, 0xee, 0x73, 0xd5, 0xb8, 0x5a, 0x64, 0x4f, 0xe4, 0x4b, 0x6b, 0x9b, 0x48, 0x0d, 0x89, 0xe2, - 0x8b, 0x7e, 0xd6, 0x02, 0x88, 0x77, 0xfc, 0xc6, 0x72, 0xe0, 0xb9, 0x8d, 0x1d, 0xa1, 0x31, 0x6f, - 0x16, 0xea, 0x8f, 0x51, 0xd4, 0xeb, 0x63, 0x74, 0x34, 0xf4, 0x7f, 0x6c, 0x70, 0x46, 0x1f, 0x83, - 0x6a, 0x2c, 0xa6, 0x9b, 0xd0, 0x91, 0xab, 0xc5, 0x7a, 0x85, 0x38, 0x6d, 0x21, 0x5e, 0xc5, 0x3f, - 0xac, 0x78, 0xa2, 0x9f, 0xb7, 0xe0, 0x44, 0x98, 0xf6, 0xf3, 0x09, 0x75, 0x58, 0x9c, 0x0c, 0xc8, - 0xf8, 0x11, 0xeb, 0xa7, 0xef, 0xee, 0x4e, 0x9c, 0xc8, 0x34, 0xe2, 0x6c, 0x2f, 0xa8, 0x04, 0xd4, - 0x33, 0x78, 0x29, 0xe4, 0x3e, 0xc7, 0x21, 0x2d, 0x01, 0xe7, 0xb2, 0x40, 0xdc, 0x8d, 0x8f, 0x96, - 0xe1, 0x0c, 0xed, 0xdd, 0x0e, 0x37, 0x3f, 0xa5, 0x7a, 0x89, 0x99, 0x32, 0xac, 0xd6, 0x1f, 0x13, - 0x33, 0x84, 0x79, 0xf5, 0xb3, 0x38, 0x38, 0xf7, 0x49, 0xf4, 0xbb, 0x16, 0x3c, 0xe6, 0x32, 0x35, - 0x60, 0x3a, 0xcc, 0xb5, 0x46, 0x10, 0x27, 0xb1, 0xa4, 0x50, 0x59, 0xd1, 0x4b, 0xfd, 0xd4, 0xff, - 0x82, 0x78, 0x83, 0xc7, 0xe6, 0xf7, 0xe8, 0x12, 0xde, 0xb3, 0xc3, 0xe8, 0x87, 0x61, 0x54, 0xae, - 0x8b, 0x65, 0x2a, 0x82, 0x99, 0xa2, 0xad, 0xd5, 0x4f, 0xdd, 0xdd, 0x9d, 0x18, 0x5d, 0x35, 0x01, - 0x38, 0x8d, 0x67, 0x7f, 0xb3, 0x94, 0x3a, 0x0f, 0x51, 0x4e, 0x48, 0x26, 0x6e, 0x1a, 0xd2, 0xff, - 0x23, 0xa5, 0x67, 0xa1, 0xe2, 0x46, 0x79, 0x97, 0xb4, 0xb8, 0x51, 0x4d, 0x31, 0x36, 0x98, 0x53, - 0xa3, 0xf4, 0x94, 0x93, 0x75, 0x75, 0x0a, 0x09, 0xf8, 0x6a, 0x91, 0x5d, 0xea, 0x3e, 0xbd, 0x3a, - 0x27, 0xba, 0x76, 0xaa, 0x0b, 0x84, 0xbb, 0xbb, 0x64, 0x7f, 0x33, 0x7d, 0x06, 0x63, 0x2c, 0xde, - 0x3e, 0xce, 0x97, 0x3e, 0x6f, 0xc1, 0x70, 0x14, 0x78, 0x9e, 0xeb, 0xb7, 0xa8, 0xa0, 0x11, 0xda, - 0xf2, 0x83, 0xc7, 0xa2, 0xb0, 0x84, 0x44, 0x61, 0xa6, 0x2d, 0xd6, 0x3c, 0xb1, 0xd9, 0x01, 0xfb, - 0x4f, 0x2c, 0x18, 0xef, 0x25, 0x10, 0x11, 0x81, 0x77, 0xca, 0xd5, 0xae, 0xa2, 0x2b, 0x96, 0xfc, - 0x59, 0xe2, 0x11, 0xe5, 0x78, 0xae, 0xd6, 0x9f, 0x14, 0xaf, 0xf9, 0xce, 0xe5, 0xde, 0xa8, 0x78, - 0x2f, 0x3a, 0xe8, 0x15, 0x38, 0x69, 0xbc, 0x57, 0xac, 0x06, 0xa6, 0x56, 0x9f, 0xa4, 0x16, 0xc8, - 0x74, 0x06, 0x76, 0x6f, 0x77, 0xe2, 0x91, 0x6c, 0x9b, 0x90, 0xd8, 0x5d, 0x74, 0xec, 0x5f, 0x29, - 0x65, 0xbf, 0x96, 0x52, 0xb6, 0x6f, 0x59, 0x5d, 0xdb, 0xf9, 0xf7, 0x1f, 0x87, 0x82, 0x63, 0x1b, - 0x7f, 0x15, 0xc0, 0xd1, 0x1b, 0xe7, 0x01, 0x9e, 0x10, 0xdb, 0xff, 0x66, 0x00, 0xf6, 0xe8, 0x59, - 0x1f, 0xd6, 0xf3, 0x81, 0x8f, 0x15, 0x3f, 0x6b, 0xa9, 0x23, 0xa7, 0x32, 0x5b, 0xe4, 0xcd, 0xe3, - 0x1a, 0x7b, 0xbe, 0x81, 0x89, 0x79, 0x94, 0x82, 0x72, 0x63, 0xa7, 0x0f, 0xb7, 0xd0, 0x57, 0xad, + 0xa3, 0xd6, 0x11, 0x6b, 0xc3, 0x9c, 0x0b, 0x7a, 0x05, 0xaa, 0x31, 0xf1, 0x48, 0x83, 0xda, 0x37, + 0x35, 0xc6, 0xf1, 0xdd, 0x7d, 0xda, 0x7a, 0xd4, 0xb0, 0x58, 0x11, 0x8f, 0xf2, 0x05, 0x26, 0xff, + 0x61, 0x45, 0x92, 0x0e, 0x60, 0xe8, 0x75, 0x5a, 0xae, 0x3f, 0x0e, 0x45, 0x0c, 0xe0, 0x32, 0xa3, + 0x95, 0x19, 0x40, 0xde, 0x88, 0x05, 0x23, 0xfb, 0x3f, 0x5b, 0x80, 0xd2, 0x42, 0xed, 0x1e, 0x18, + 0xb5, 0xaf, 0xa5, 0x8d, 0xda, 0x85, 0x22, 0xad, 0x8e, 0x1e, 0x76, 0xed, 0xaf, 0xd7, 0x20, 0xa3, + 0x0e, 0xae, 0x91, 0x38, 0x21, 0xcd, 0xb7, 0x44, 0xf8, 0x5b, 0x22, 0xfc, 0x2d, 0x11, 0xae, 0x44, + 0xf8, 0x5a, 0x46, 0x84, 0xbf, 0xcf, 0x58, 0xf5, 0xfa, 0x00, 0xf6, 0x55, 0x75, 0x42, 0x6b, 0xf6, + 0xc0, 0x40, 0xa0, 0x92, 0xe0, 0xca, 0xca, 0xd2, 0xb5, 0x5c, 0x99, 0xfd, 0x6a, 0x5a, 0x66, 0x1f, + 0x95, 0xc5, 0x9f, 0x07, 0x29, 0xfd, 0xaf, 0x2c, 0x78, 0x47, 0x5a, 0x7a, 0xc9, 0x99, 0x33, 0xdf, + 0xf2, 0x83, 0x88, 0xcc, 0xba, 0xeb, 0xeb, 0x24, 0x22, 0x7e, 0x83, 0xc4, 0xca, 0x8b, 0x61, 0xf5, + 0xf2, 0x62, 0xa0, 0xe7, 0x60, 0xe4, 0x56, 0x1c, 0xf8, 0xcb, 0x81, 0xeb, 0x0b, 0x11, 0x44, 0x37, + 0xc2, 0x27, 0xef, 0xec, 0x4e, 0x8c, 0xd0, 0x11, 0x95, 0xed, 0x38, 0x85, 0x85, 0x66, 0xe0, 0xd4, + 0xad, 0xd7, 0x96, 0x9d, 0xc4, 0x70, 0x07, 0xc8, 0x8d, 0x3b, 0x3b, 0xb0, 0xb8, 0xf2, 0x52, 0x06, + 0x88, 0xbb, 0xf1, 0xed, 0xbf, 0x59, 0x82, 0x47, 0x32, 0x2f, 0x12, 0x78, 0x5e, 0xd0, 0x49, 0xe8, + 0xa6, 0x06, 0x7d, 0xd5, 0x82, 0x93, 0xed, 0xb4, 0xc7, 0x21, 0x16, 0x8e, 0xdd, 0x0f, 0x14, 0xa6, + 0x23, 0x32, 0x2e, 0x8d, 0xfa, 0xb8, 0x18, 0xa1, 0x93, 0x19, 0x40, 0x8c, 0xbb, 0xfa, 0x82, 0x5e, + 0x81, 0x5a, 0xdb, 0xd9, 0xbe, 0x1e, 0x36, 0x9d, 0x44, 0xee, 0x27, 0x7b, 0xbb, 0x01, 0x3a, 0x89, + 0xeb, 0x4d, 0xf2, 0xa3, 0xfd, 0xc9, 0x79, 0x3f, 0x59, 0x8a, 0x56, 0x92, 0xc8, 0xf5, 0x5b, 0xdc, + 0x9d, 0xb7, 0x28, 0xc9, 0x60, 0x4d, 0xd1, 0xfe, 0x8a, 0x95, 0x55, 0x52, 0x6a, 0x74, 0x22, 0x27, + 0x21, 0xad, 0x1d, 0xf4, 0x51, 0xa8, 0xd0, 0x8d, 0x9f, 0x1c, 0x95, 0x9b, 0x45, 0x6a, 0x4e, 0xe3, + 0x4b, 0x68, 0x25, 0x4a, 0xff, 0xc5, 0x98, 0x33, 0xb5, 0xbf, 0x5a, 0xcb, 0x1a, 0x0b, 0xec, 0xf0, + 0xf6, 0x02, 0x40, 0x2b, 0x58, 0x25, 0xed, 0xd0, 0xa3, 0xc3, 0x62, 0xb1, 0x13, 0x00, 0xe5, 0xeb, + 0x98, 0x53, 0x10, 0x6c, 0x60, 0xa1, 0xbf, 0x6c, 0x01, 0xb4, 0xe4, 0x9c, 0x97, 0x86, 0xc0, 0xf5, + 0x22, 0x5f, 0x47, 0xaf, 0x28, 0xdd, 0x17, 0xc5, 0x10, 0x1b, 0xcc, 0xd1, 0x4f, 0x59, 0x50, 0x4d, + 0x64, 0xf7, 0xb9, 0x6a, 0x5c, 0x2d, 0xb2, 0x27, 0xf2, 0xa5, 0xb5, 0x4d, 0xa4, 0x86, 0x44, 0xf1, + 0x45, 0x3f, 0x63, 0x01, 0xc4, 0x3b, 0x7e, 0x63, 0x39, 0xf0, 0xdc, 0xc6, 0x8e, 0xd0, 0x98, 0x37, + 0x0a, 0xf5, 0xc7, 0x28, 0xea, 0xf5, 0x31, 0x3a, 0x1a, 0xfa, 0x3f, 0x36, 0x38, 0xa3, 0x8f, 0x43, + 0x35, 0x16, 0xd3, 0x4d, 0xe8, 0xc8, 0xd5, 0x62, 0xbd, 0x42, 0x9c, 0xb6, 0x10, 0xaf, 0xe2, 0x1f, + 0x56, 0x3c, 0xd1, 0xcf, 0x59, 0x70, 0x22, 0x4c, 0xfb, 0xf9, 0x84, 0x3a, 0x2c, 0x4e, 0x06, 0x64, + 0xfc, 0x88, 0xf5, 0xd3, 0x77, 0x76, 0x27, 0x4e, 0x64, 0x1a, 0x71, 0xb6, 0x17, 0x54, 0x02, 0xea, + 0x19, 0xbc, 0x14, 0x72, 0x9f, 0xe3, 0x90, 0x96, 0x80, 0x73, 0x59, 0x20, 0xee, 0xc6, 0x47, 0xcb, + 0x70, 0x86, 0xf6, 0x6e, 0x87, 0x9b, 0x9f, 0x52, 0xbd, 0xc4, 0x4c, 0x19, 0x56, 0xeb, 0x8f, 0x8a, + 0x19, 0xc2, 0xbc, 0xfa, 0x59, 0x1c, 0x9c, 0xfb, 0x24, 0xfa, 0x1d, 0x0b, 0x1e, 0x75, 0x99, 0x1a, + 0x30, 0x1d, 0xe6, 0x5a, 0x23, 0x88, 0x93, 0x58, 0x52, 0xa8, 0xac, 0xe8, 0xa5, 0x7e, 0xea, 0x7f, + 0x41, 0xbc, 0xc1, 0xa3, 0xf3, 0x7b, 0x74, 0x09, 0xef, 0xd9, 0x61, 0xf4, 0xc3, 0x30, 0x2a, 0xd7, + 0xc5, 0x32, 0x15, 0xc1, 0x4c, 0xd1, 0xd6, 0xea, 0xa7, 0xee, 0xec, 0x4e, 0x8c, 0xae, 0x9a, 0x00, + 0x9c, 0xc6, 0xb3, 0xbf, 0x55, 0x4a, 0x9d, 0x87, 0x28, 0x27, 0x24, 0x13, 0x37, 0x0d, 0xe9, 0xff, + 0x91, 0xd2, 0xb3, 0x50, 0x71, 0xa3, 0xbc, 0x4b, 0x5a, 0xdc, 0xa8, 0xa6, 0x18, 0x1b, 0xcc, 0xa9, + 0x51, 0x7a, 0xca, 0xc9, 0xba, 0x3a, 0x85, 0x04, 0x7c, 0xa5, 0xc8, 0x2e, 0x75, 0x9f, 0x5e, 0x3d, + 0x22, 0xba, 0x76, 0xaa, 0x0b, 0x84, 0xbb, 0xbb, 0x64, 0x7f, 0x2b, 0x7d, 0x06, 0x63, 0x2c, 0xde, + 0x3e, 0xce, 0x97, 0xbe, 0x60, 0xc1, 0x70, 0x14, 0x78, 0x9e, 0xeb, 0xb7, 0xa8, 0xa0, 0x11, 0xda, + 0xf2, 0x43, 0xc7, 0xa2, 0xb0, 0x84, 0x44, 0x61, 0xa6, 0x2d, 0xd6, 0x3c, 0xb1, 0xd9, 0x01, 0xfb, + 0x8f, 0x2d, 0x18, 0xef, 0x25, 0x10, 0x11, 0x81, 0xb7, 0xcb, 0xd5, 0xae, 0xa2, 0x2b, 0x96, 0xfc, + 0x59, 0xe2, 0x11, 0xe5, 0x78, 0xae, 0xd6, 0x9f, 0x10, 0xaf, 0xf9, 0xf6, 0xe5, 0xde, 0xa8, 0x78, + 0x2f, 0x3a, 0xe8, 0x65, 0x38, 0x69, 0xbc, 0x57, 0xac, 0x06, 0xa6, 0x56, 0x9f, 0xa4, 0x16, 0xc8, + 0x74, 0x06, 0x76, 0x77, 0x77, 0xe2, 0xa1, 0x6c, 0x9b, 0x90, 0xd8, 0x5d, 0x74, 0xec, 0x5f, 0x2e, + 0x65, 0xbf, 0x96, 0x52, 0xb6, 0x6f, 0x5a, 0x5d, 0xdb, 0xf9, 0x0f, 0x1c, 0x87, 0x82, 0x63, 0x1b, + 0x7f, 0x15, 0xc0, 0xd1, 0x1b, 0xe7, 0x3e, 0x9e, 0x10, 0xdb, 0xff, 0x66, 0x00, 0xf6, 0xe8, 0x59, + 0x1f, 0xd6, 0xf3, 0x81, 0x8f, 0x15, 0x3f, 0x67, 0xa9, 0x23, 0xa7, 0x32, 0x5b, 0xe4, 0xcd, 0xe3, + 0x1a, 0x7b, 0xbe, 0x81, 0x89, 0x79, 0x94, 0x82, 0x72, 0x63, 0xa7, 0x0f, 0xb7, 0xd0, 0xd7, 0xac, 0xf4, 0xa1, 0x19, 0x0f, 0x3b, 0x73, 0x8f, 0xad, 0x4f, 0xc6, 0x49, 0x1c, 0xef, 0x98, 0x3e, 0xbf, - 0xe9, 0x75, 0x46, 0x37, 0x09, 0xb0, 0xee, 0xfa, 0x8e, 0xe7, 0xbe, 0x41, 0xb7, 0x27, 0x15, 0xa6, - 0x61, 0x99, 0xc9, 0x72, 0x59, 0xb5, 0x62, 0x03, 0xe3, 0xfc, 0x5f, 0x82, 0x61, 0xe3, 0xcd, 0x73, - 0x82, 0x2b, 0xce, 0x98, 0xc1, 0x15, 0x35, 0x23, 0x26, 0xe2, 0xfc, 0x7b, 0xe1, 0x64, 0xb6, 0x83, - 0x07, 0x79, 0xde, 0xfe, 0x5f, 0x43, 0xd9, 0x53, 0xac, 0x55, 0x12, 0xb5, 0x69, 0xd7, 0xde, 0xf6, - 0x2c, 0xbd, 0xed, 0x59, 0x7a, 0xdb, 0xb3, 0x64, 0x1e, 0x0e, 0x08, 0xaf, 0xc9, 0xd0, 0x7d, 0xf2, - 0x9a, 0xa4, 0xfc, 0x40, 0xd5, 0xc2, 0xfd, 0x40, 0xf6, 0xdd, 0x0a, 0xa4, 0xec, 0x28, 0x3e, 0xde, - 0x3f, 0x00, 0x43, 0x11, 0x09, 0x83, 0x1b, 0x78, 0x41, 0xe8, 0x10, 0x1d, 0x6b, 0xcf, 0x9b, 0xb1, - 0x84, 0x53, 0x5d, 0x13, 0x3a, 0xc9, 0x86, 0x50, 0x22, 0x4a, 0xd7, 0x2c, 0x3b, 0xc9, 0x06, 0x66, - 0x10, 0xf4, 0x5e, 0x18, 0x4b, 0x9c, 0xa8, 0x45, 0xed, 0xed, 0x2d, 0xf6, 0x59, 0xc5, 0x59, 0xe7, - 0x23, 0x02, 0x77, 0x6c, 0x35, 0x05, 0xc5, 0x19, 0x6c, 0xf4, 0x3a, 0x0c, 0x6c, 0x10, 0xaf, 0x2d, - 0x86, 0x7c, 0xa5, 0x38, 0x19, 0xcf, 0xde, 0xf5, 0x0a, 0xf1, 0xda, 0x5c, 0x02, 0xd1, 0x5f, 0x98, - 0xb1, 0xa2, 0xf3, 0xad, 0xb6, 0xd9, 0x89, 0x93, 0xa0, 0xed, 0xbe, 0x21, 0x5d, 0x7c, 0xef, 0x2f, - 0x98, 0xf1, 0x35, 0x49, 0x9f, 0xfb, 0x52, 0xd4, 0x5f, 0xac, 0x39, 0xb3, 0x7e, 0x34, 0xdd, 0x88, - 0x7d, 0xaa, 0x1d, 0xe1, 0xa9, 0x2b, 0xba, 0x1f, 0xb3, 0x92, 0x3e, 0xef, 0x87, 0xfa, 0x8b, 0x35, - 0x67, 0xb4, 0xa3, 0xe6, 0xfd, 0x30, 0xeb, 0xc3, 0x8d, 0x82, 0xfb, 0xc0, 0xe7, 0x7c, 0xee, 0xfc, - 0x7f, 0x12, 0x2a, 0x8d, 0x0d, 0x27, 0x4a, 0xc6, 0x47, 0xd8, 0xa4, 0x51, 0x3e, 0x9d, 0x19, 0xda, - 0x88, 0x39, 0x0c, 0x3d, 0x0e, 0xe5, 0x88, 0xac, 0xb3, 0xb8, 0x4d, 0x23, 0xa2, 0x07, 0x93, 0x75, - 0x4c, 0xdb, 0xed, 0x5f, 0x2a, 0xa5, 0xcd, 0xa5, 0xf4, 0x7b, 0xf3, 0xd9, 0xde, 0xe8, 0x44, 0xb1, - 0xf4, 0xfb, 0x18, 0xb3, 0x9d, 0x35, 0x63, 0x09, 0x47, 0x9f, 0xb0, 0x60, 0xe8, 0x76, 0x1c, 0xf8, - 0x3e, 0x49, 0x84, 0x6a, 0xba, 0x59, 0xf0, 0x50, 0x5c, 0xe5, 0xd4, 0x75, 0x1f, 0x44, 0x03, 0x96, - 0x7c, 0x69, 0x77, 0xc9, 0x76, 0xc3, 0xeb, 0x34, 0xbb, 0x82, 0x34, 0x2e, 0xf1, 0x66, 0x2c, 0xe1, - 0x14, 0xd5, 0xf5, 0x39, 0xea, 0x40, 0x1a, 0x75, 0xde, 0x17, 0xa8, 0x02, 0x6e, 0xff, 0xf5, 0x41, - 0x38, 0x9b, 0xbb, 0x38, 0xa8, 0x21, 0xc3, 0x4c, 0x85, 0xcb, 0xae, 0x47, 0x64, 0x78, 0x12, 0x33, - 0x64, 0x6e, 0xaa, 0x56, 0x6c, 0x60, 0xa0, 0x9f, 0x02, 0x08, 0x9d, 0xc8, 0x69, 0x13, 0xe5, 0x97, - 0x3d, 0xb2, 0xbd, 0x40, 0xfb, 0xb1, 0x2c, 0x69, 0xea, 0xbd, 0xa9, 0x6a, 0x8a, 0xb1, 0xc1, 0x12, - 0xbd, 0x00, 0xc3, 0x11, 0xf1, 0x88, 0x13, 0xb3, 0xb0, 0xdf, 0x6c, 0x0e, 0x03, 0xd6, 0x20, 0x6c, - 0xe2, 0xa1, 0xa7, 0x54, 0x24, 0x57, 0x26, 0xa2, 0x25, 0x1d, 0xcd, 0x85, 0xde, 0xb4, 0x60, 0x6c, - 0xdd, 0xf5, 0x88, 0xe6, 0x2e, 0x32, 0x0e, 0x96, 0x8e, 0xfe, 0x92, 0x97, 0x4d, 0xba, 0x5a, 0x42, - 0xa6, 0x9a, 0x63, 0x9c, 0x61, 0x4f, 0x3f, 0xf3, 0x16, 0x89, 0x98, 0x68, 0x1d, 0x4c, 0x7f, 0xe6, - 0x9b, 0xbc, 0x19, 0x4b, 0x38, 0x9a, 0x86, 0x13, 0xa1, 0x13, 0xc7, 0x33, 0x11, 0x69, 0x12, 0x3f, - 0x71, 0x1d, 0x8f, 0xe7, 0x03, 0x54, 0x75, 0x3c, 0xf0, 0x72, 0x1a, 0x8c, 0xb3, 0xf8, 0xe8, 0x03, - 0xf0, 0x28, 0x77, 0x7c, 0x2c, 0xba, 0x71, 0xec, 0xfa, 0x2d, 0x3d, 0x0d, 0x84, 0xff, 0x67, 0x42, - 0x90, 0x7a, 0x74, 0x3e, 0x1f, 0x0d, 0xf7, 0x7a, 0x1e, 0x3d, 0x03, 0xd5, 0x78, 0xd3, 0x0d, 0x67, - 0xa2, 0x66, 0xcc, 0x0e, 0x3d, 0xaa, 0xda, 0xdb, 0xb8, 0x22, 0xda, 0xb1, 0xc2, 0x40, 0x0d, 0x18, - 0xe1, 0x9f, 0x84, 0x87, 0xa2, 0x09, 0xf9, 0xf8, 0x6c, 0x4f, 0xf5, 0x28, 0xd2, 0xdb, 0x26, 0xb1, - 0x73, 0xe7, 0x92, 0x3c, 0x82, 0xe1, 0x27, 0x06, 0x37, 0x0d, 0x32, 0x38, 0x45, 0xd4, 0xfe, 0x85, - 0x52, 0x7a, 0xc7, 0x6d, 0x2e, 0x52, 0x14, 0xd3, 0xa5, 0x98, 0xdc, 0x74, 0x22, 0xe9, 0x8d, 0x39, - 0x62, 0xda, 0x82, 0xa0, 0x7b, 0xd3, 0x89, 0xcc, 0x45, 0xcd, 0x18, 0x60, 0xc9, 0x09, 0xdd, 0x86, - 0x81, 0xc4, 0x73, 0x0a, 0xca, 0x73, 0x32, 0x38, 0x6a, 0x07, 0xc8, 0xc2, 0x74, 0x8c, 0x19, 0x0f, - 0xf4, 0x18, 0xb5, 0xfa, 0xd7, 0xe4, 0x11, 0x89, 0x30, 0xd4, 0xd7, 0x62, 0xcc, 0x5a, 0xed, 0x7b, - 0x90, 0x23, 0x57, 0x95, 0x22, 0x43, 0x17, 0x01, 0xe8, 0x06, 0x72, 0x39, 0x22, 0xeb, 0xee, 0xb6, - 0x30, 0x24, 0xd4, 0xda, 0xbd, 0xae, 0x20, 0xd8, 0xc0, 0x92, 0xcf, 0xac, 0x74, 0xd6, 0xe9, 0x33, - 0xa5, 0xee, 0x67, 0x38, 0x04, 0x1b, 0x58, 0xe8, 0x79, 0x18, 0x74, 0xdb, 0x4e, 0x4b, 0x85, 0x60, - 0x3e, 0x46, 0x17, 0xed, 0x3c, 0x6b, 0xb9, 0xb7, 0x3b, 0x31, 0xa6, 0x3a, 0xc4, 0x9a, 0xb0, 0xc0, - 0x45, 0xbf, 0x62, 0xc1, 0x48, 0x23, 0x68, 0xb7, 0x03, 0x9f, 0x6f, 0xbb, 0xc4, 0x1e, 0xf2, 0xf6, - 0x71, 0xa9, 0xf9, 0xc9, 0x19, 0x83, 0x19, 0xdf, 0x44, 0xaa, 0x84, 0x2c, 0x13, 0x84, 0x53, 0xbd, - 0x32, 0xd7, 0x76, 0x65, 0x9f, 0xb5, 0xfd, 0xeb, 0x16, 0x9c, 0xe2, 0xcf, 0x1a, 0xbb, 0x41, 0x91, - 0x7b, 0x14, 0x1c, 0xf3, 0x6b, 0x75, 0x6d, 0x90, 0x95, 0x97, 0xae, 0x0b, 0x8e, 0xbb, 0x3b, 0x89, - 0xe6, 0xe0, 0xd4, 0x7a, 0x10, 0x35, 0x88, 0x39, 0x10, 0x42, 0x30, 0x29, 0x42, 0x97, 0xb3, 0x08, - 0xb8, 0xfb, 0x19, 0x74, 0x13, 0x1e, 0x31, 0x1a, 0xcd, 0x71, 0xe0, 0xb2, 0xe9, 0x09, 0x41, 0xed, - 0x91, 0xcb, 0xb9, 0x58, 0xb8, 0xc7, 0xd3, 0x69, 0x87, 0x49, 0xad, 0x0f, 0x87, 0xc9, 0x6b, 0x70, - 0xae, 0xd1, 0x3d, 0x32, 0x5b, 0x71, 0x67, 0x2d, 0xe6, 0x92, 0xaa, 0x5a, 0xff, 0x3e, 0x41, 0xe0, - 0xdc, 0x4c, 0x2f, 0x44, 0xdc, 0x9b, 0x06, 0xfa, 0x08, 0x54, 0x23, 0xc2, 0xbe, 0x4a, 0x2c, 0x12, - 0x71, 0x8e, 0xb8, 0x4b, 0xd6, 0x16, 0x28, 0x27, 0xab, 0x65, 0xaf, 0x68, 0x88, 0xb1, 0xe2, 0x88, - 0xee, 0xc0, 0x50, 0xe8, 0x24, 0x8d, 0x0d, 0x91, 0x7e, 0x73, 0xe4, 0xf8, 0x17, 0xc5, 0x9c, 0xf9, - 0xc0, 0x8d, 0x84, 0x5d, 0xce, 0x04, 0x4b, 0x6e, 0xd4, 0x1a, 0x69, 0x04, 0xed, 0x30, 0xf0, 0x89, - 0x9f, 0xc4, 0xe3, 0xa3, 0xda, 0x1a, 0x99, 0x51, 0xad, 0xd8, 0xc0, 0x40, 0xcb, 0x70, 0x86, 0xf9, - 0x8c, 0x6e, 0xb9, 0xc9, 0x46, 0xd0, 0x49, 0xe4, 0x16, 0x68, 0x7c, 0x2c, 0x7d, 0x54, 0xb1, 0x90, - 0x83, 0x83, 0x73, 0x9f, 0x3c, 0xff, 0x3e, 0x38, 0xd5, 0xb5, 0x94, 0x0f, 0xe4, 0xae, 0x99, 0x85, - 0x47, 0xf2, 0x17, 0xcd, 0x81, 0x9c, 0x36, 0xff, 0x38, 0x13, 0x36, 0x6b, 0x18, 0xd2, 0x7d, 0x38, - 0x00, 0x1d, 0x28, 0x13, 0x7f, 0x4b, 0xe8, 0x90, 0xcb, 0x47, 0xfb, 0x76, 0x97, 0xfc, 0x2d, 0xbe, - 0xe6, 0x99, 0x97, 0xe3, 0x92, 0xbf, 0x85, 0x29, 0x6d, 0xf4, 0x45, 0x2b, 0x65, 0x08, 0x72, 0xb7, - 0xe1, 0x87, 0x8e, 0x65, 0xe7, 0xd0, 0xb7, 0x6d, 0x68, 0xff, 0xdb, 0x12, 0x5c, 0xd8, 0x8f, 0x48, - 0x1f, 0xc3, 0xf7, 0x24, 0x0c, 0xc6, 0xec, 0x20, 0x5c, 0x08, 0xe5, 0x61, 0x3a, 0x57, 0xf9, 0xd1, - 0xf8, 0x6b, 0x58, 0x80, 0x90, 0x07, 0xe5, 0xb6, 0x13, 0x0a, 0x6f, 0xd2, 0xfc, 0x51, 0x13, 0x69, - 0xe8, 0x7f, 0xc7, 0x5b, 0x74, 0x42, 0xee, 0xa3, 0x30, 0x1a, 0x30, 0x65, 0x83, 0x12, 0xa8, 0x38, - 0x51, 0xe4, 0xc8, 0x53, 0xd7, 0x6b, 0xc5, 0xf0, 0x9b, 0xa6, 0x24, 0xf9, 0xa1, 0x55, 0xaa, 0x09, - 0x73, 0x66, 0xf6, 0x67, 0x87, 0x52, 0xc9, 0x24, 0xec, 0x28, 0x3d, 0x86, 0x41, 0xe1, 0x44, 0xb2, - 0x8a, 0xce, 0x5f, 0xe2, 0xd9, 0x80, 0x6c, 0x9f, 0x28, 0x72, 0xaa, 0x05, 0x2b, 0xf4, 0x19, 0x8b, - 0x65, 0x2e, 0xcb, 0x04, 0x1b, 0xb1, 0x3b, 0x3b, 0x9e, 0x44, 0x6a, 0x33, 0x1f, 0x5a, 0x36, 0x62, - 0x93, 0xbb, 0xa8, 0x40, 0xc0, 0xac, 0xd2, 0xee, 0x0a, 0x04, 0xcc, 0xca, 0x94, 0x70, 0xb4, 0x9d, - 0x73, 0x64, 0x5e, 0x40, 0xf6, 0x6b, 0x1f, 0x87, 0xe4, 0x5f, 0xb5, 0xe0, 0x94, 0x9b, 0x3d, 0xfb, - 0x14, 0x7b, 0x99, 0x23, 0x06, 0x65, 0xf4, 0x3e, 0x5a, 0x55, 0xea, 0xbc, 0x0b, 0x84, 0xbb, 0x3b, - 0x83, 0x9a, 0x30, 0xe0, 0xfa, 0xeb, 0x81, 0x30, 0x62, 0xea, 0x47, 0xeb, 0xd4, 0xbc, 0xbf, 0x1e, - 0xe8, 0xd5, 0x4c, 0xff, 0x61, 0x46, 0x1d, 0x2d, 0xc0, 0x99, 0x48, 0x78, 0x9b, 0xae, 0xb8, 0x71, - 0x12, 0x44, 0x3b, 0x0b, 0x6e, 0xdb, 0x4d, 0x98, 0x01, 0x52, 0xae, 0x8f, 0x53, 0xfd, 0x80, 0x73, - 0xe0, 0x38, 0xf7, 0x29, 0xf4, 0x06, 0x0c, 0xc9, 0x54, 0xeb, 0x6a, 0x11, 0xfb, 0xc2, 0xee, 0xf9, - 0xaf, 0x26, 0xd3, 0x8a, 0xc8, 0xaa, 0x96, 0x0c, 0xed, 0x37, 0x87, 0xa1, 0xfb, 0x58, 0x14, 0x7d, - 0x14, 0x6a, 0x91, 0x4a, 0xff, 0xb6, 0x8a, 0x50, 0xd7, 0xf2, 0xfb, 0x8a, 0x23, 0x59, 0x65, 0x0a, - 0xe9, 0x44, 0x6f, 0xcd, 0x91, 0x6e, 0x58, 0x62, 0x7d, 0x7a, 0x5a, 0xc0, 0xdc, 0x16, 0x5c, 0xf5, - 0xc9, 0xd8, 0x8e, 0xdf, 0xc0, 0x8c, 0x07, 0x8a, 0x60, 0x70, 0x83, 0x38, 0x5e, 0xb2, 0x51, 0x8c, - 0x13, 0xff, 0x0a, 0xa3, 0x95, 0x4d, 0x02, 0xe2, 0xad, 0x58, 0x70, 0x42, 0xdb, 0x30, 0xb4, 0xc1, - 0x27, 0x80, 0xd8, 0x43, 0x2c, 0x1e, 0x75, 0x70, 0x53, 0xb3, 0x4a, 0x7f, 0x6e, 0xd1, 0x80, 0x25, - 0x3b, 0x16, 0x6f, 0x63, 0x44, 0x04, 0xf0, 0xa5, 0x5b, 0x5c, 0xfe, 0x53, 0xff, 0xe1, 0x00, 0x1f, - 0x86, 0x91, 0x88, 0x34, 0x02, 0xbf, 0xe1, 0x7a, 0xa4, 0x39, 0x2d, 0x1d, 0xf4, 0x07, 0xc9, 0x9a, - 0x61, 0xfb, 0x70, 0x6c, 0xd0, 0xc0, 0x29, 0x8a, 0xe8, 0xd3, 0x16, 0x8c, 0xa9, 0x9c, 0x51, 0xfa, - 0x41, 0x88, 0x70, 0x08, 0x2f, 0x14, 0x94, 0xa1, 0xca, 0x68, 0xd6, 0xd1, 0xdd, 0xdd, 0x89, 0xb1, - 0x74, 0x1b, 0xce, 0xf0, 0x45, 0xaf, 0x00, 0x04, 0x6b, 0x3c, 0xa8, 0x66, 0x3a, 0x11, 0xde, 0xe1, - 0x83, 0xbc, 0xea, 0x18, 0x4f, 0x9f, 0x93, 0x14, 0xb0, 0x41, 0x0d, 0x5d, 0x03, 0xe0, 0xcb, 0x66, - 0x75, 0x27, 0x94, 0x1b, 0x0d, 0x99, 0xf6, 0x04, 0x2b, 0x0a, 0x72, 0x6f, 0x77, 0xa2, 0xdb, 0x5b, - 0xc7, 0x02, 0x17, 0x8c, 0xc7, 0xd1, 0x4f, 0xc2, 0x50, 0xdc, 0x69, 0xb7, 0x1d, 0xe5, 0x3b, 0x2e, - 0x30, 0x21, 0x8f, 0xd3, 0x35, 0x44, 0x11, 0x6f, 0xc0, 0x92, 0x23, 0xba, 0x4d, 0x85, 0x6a, 0x2c, - 0xdc, 0x88, 0x6c, 0x15, 0x71, 0x9b, 0x60, 0x98, 0xbd, 0xd3, 0x7b, 0xa4, 0xe1, 0x8d, 0x73, 0x70, - 0xee, 0xed, 0x4e, 0x3c, 0x92, 0x6e, 0x5f, 0x08, 0x44, 0x8a, 0x5c, 0x2e, 0x4d, 0x74, 0x55, 0x56, - 0x5e, 0xa1, 0xaf, 0x2d, 0x0b, 0x02, 0x3c, 0xad, 0x2b, 0xaf, 0xb0, 0xe6, 0xde, 0x63, 0x66, 0x3e, - 0x8c, 0x16, 0xe1, 0x74, 0x23, 0xf0, 0x93, 0x28, 0xf0, 0x3c, 0x5e, 0x79, 0x88, 0xef, 0xf9, 0xb8, - 0x6f, 0xf9, 0x9d, 0xa2, 0xdb, 0xa7, 0x67, 0xba, 0x51, 0x70, 0xde, 0x73, 0xb6, 0x9f, 0x8e, 0x36, - 0x14, 0x83, 0xf3, 0x3c, 0x8c, 0x90, 0xed, 0x84, 0x44, 0xbe, 0xe3, 0xdd, 0xc0, 0x0b, 0xd2, 0xab, - 0xca, 0xd6, 0xc0, 0x25, 0xa3, 0x1d, 0xa7, 0xb0, 0x90, 0xad, 0x1c, 0x1d, 0x46, 0xda, 0x27, 0x77, - 0x74, 0x48, 0xb7, 0x86, 0xfd, 0xbf, 0x4b, 0x29, 0x83, 0x6c, 0x35, 0x22, 0x04, 0x05, 0x50, 0xf1, - 0x83, 0xa6, 0x92, 0xfd, 0x57, 0x8b, 0x91, 0xfd, 0xd7, 0x83, 0xa6, 0x51, 0x9e, 0x85, 0xfe, 0x8b, - 0x31, 0xe7, 0xc3, 0xea, 0x57, 0xc8, 0x42, 0x1f, 0x0c, 0x20, 0x36, 0x1a, 0x45, 0x72, 0x56, 0xf5, - 0x2b, 0x96, 0x4c, 0x46, 0x38, 0xcd, 0x17, 0x6d, 0x42, 0x65, 0x23, 0x88, 0x13, 0xb9, 0xfd, 0x38, - 0xe2, 0x4e, 0xe7, 0x4a, 0x10, 0x27, 0xcc, 0x8a, 0x50, 0xaf, 0x4d, 0x5b, 0x62, 0xcc, 0x79, 0xd8, - 0xff, 0xc5, 0x4a, 0xf9, 0xd0, 0x6f, 0xb1, 0xc8, 0xdb, 0x2d, 0xe2, 0xd3, 0x65, 0x6d, 0x86, 0x1a, - 0xfd, 0x70, 0x26, 0x8f, 0xf1, 0x5d, 0xbd, 0x0a, 0x6b, 0xdd, 0xa1, 0x14, 0x26, 0x19, 0x09, 0x23, - 0x2a, 0xe9, 0xe3, 0x56, 0x3a, 0xa3, 0xb4, 0x54, 0xc4, 0x06, 0xc3, 0xcc, 0xaa, 0xde, 0x37, 0x39, - 0xd5, 0xfe, 0xa2, 0x05, 0x43, 0x75, 0xa7, 0xb1, 0x19, 0xac, 0xaf, 0xa3, 0x67, 0xa0, 0xda, 0xec, - 0x44, 0x66, 0x72, 0xab, 0x72, 0x1c, 0xcc, 0x8a, 0x76, 0xac, 0x30, 0xe8, 0x1c, 0x5e, 0x77, 0x1a, - 0x32, 0xb7, 0xba, 0xcc, 0xe7, 0xf0, 0x65, 0xd6, 0x82, 0x05, 0x04, 0xbd, 0x00, 0xc3, 0x6d, 0x67, - 0x5b, 0x3e, 0x9c, 0x75, 0xe0, 0x2f, 0x6a, 0x10, 0x36, 0xf1, 0xec, 0x7f, 0x69, 0xc1, 0x78, 0xdd, - 0x89, 0xdd, 0xc6, 0x74, 0x27, 0xd9, 0xa8, 0xbb, 0xc9, 0x5a, 0xa7, 0xb1, 0x49, 0x12, 0x9e, 0x50, - 0x4f, 0x7b, 0xd9, 0x89, 0xe9, 0x52, 0x52, 0xfb, 0x3a, 0xd5, 0xcb, 0x1b, 0xa2, 0x1d, 0x2b, 0x0c, - 0xf4, 0x06, 0x0c, 0x87, 0x4e, 0x1c, 0xdf, 0x09, 0xa2, 0x26, 0x26, 0xeb, 0xc5, 0x94, 0xb3, 0x58, - 0x21, 0x8d, 0x88, 0x24, 0x98, 0xac, 0x8b, 0x43, 0x66, 0x4d, 0x1f, 0x9b, 0xcc, 0xec, 0xcf, 0x5b, - 0x70, 0xae, 0x4e, 0x9c, 0x88, 0x44, 0xac, 0xfa, 0x85, 0x7a, 0x91, 0x19, 0x2f, 0xe8, 0x34, 0xd1, - 0xeb, 0x50, 0x4d, 0x68, 0x33, 0xed, 0x96, 0x55, 0x6c, 0xb7, 0xd8, 0x19, 0xf1, 0xaa, 0x20, 0x8e, - 0x15, 0x1b, 0xfb, 0x6f, 0x58, 0x30, 0xc2, 0x8e, 0xdb, 0x66, 0x49, 0xe2, 0xb8, 0x5e, 0x57, 0x91, - 0x28, 0xab, 0xcf, 0x22, 0x51, 0x17, 0x60, 0x60, 0x23, 0x68, 0x93, 0xec, 0x51, 0xf1, 0x95, 0x80, - 0x6e, 0xab, 0x29, 0x04, 0x3d, 0x47, 0x3f, 0xbc, 0xeb, 0x27, 0x0e, 0x5d, 0x02, 0xd2, 0x9d, 0x7b, - 0x82, 0x7f, 0x74, 0xd5, 0x8c, 0x4d, 0x1c, 0xfb, 0xb7, 0x6a, 0x30, 0x24, 0xe2, 0x09, 0xfa, 0x2e, - 0xaa, 0x20, 0xf7, 0xf7, 0xa5, 0x9e, 0xfb, 0xfb, 0x18, 0x06, 0x1b, 0xac, 0x5a, 0x9d, 0x30, 0x23, - 0xaf, 0x15, 0x12, 0x80, 0xc2, 0x0b, 0xe0, 0xe9, 0x6e, 0xf1, 0xff, 0x58, 0xb0, 0x42, 0x5f, 0xb0, - 0xe0, 0x44, 0x23, 0xf0, 0x7d, 0xd2, 0xd0, 0x36, 0xce, 0x40, 0x11, 0x71, 0x06, 0x33, 0x69, 0xa2, - 0xfa, 0xac, 0x27, 0x03, 0xc0, 0x59, 0xf6, 0xe8, 0x25, 0x18, 0xe5, 0x63, 0x76, 0x33, 0xe5, 0x83, - 0xd6, 0xb5, 0x83, 0x4c, 0x20, 0x4e, 0xe3, 0xa2, 0x49, 0xee, 0xcb, 0x17, 0x55, 0x7a, 0x06, 0xb5, - 0xab, 0xce, 0xa8, 0xcf, 0x63, 0x60, 0xa0, 0x08, 0x50, 0x44, 0xd6, 0x23, 0x12, 0x6f, 0x88, 0x78, - 0x0b, 0x66, 0x5f, 0x0d, 0x1d, 0x2e, 0x01, 0x1b, 0x77, 0x51, 0xc2, 0x39, 0xd4, 0xd1, 0xa6, 0xd8, - 0x60, 0x56, 0x8b, 0x90, 0xa1, 0xe2, 0x33, 0xf7, 0xdc, 0x67, 0x4e, 0x40, 0x25, 0xde, 0x70, 0xa2, - 0x26, 0xb3, 0xeb, 0xca, 0x3c, 0xe9, 0x67, 0x85, 0x36, 0x60, 0xde, 0x8e, 0x66, 0xe1, 0x64, 0xa6, - 0xf2, 0x51, 0x2c, 0x7c, 0xc5, 0x2a, 0xc1, 0x23, 0x53, 0x33, 0x29, 0xc6, 0x5d, 0x4f, 0x98, 0xce, - 0x87, 0xe1, 0x7d, 0x9c, 0x0f, 0x3b, 0x2a, 0xaa, 0x8f, 0x7b, 0x71, 0x5f, 0x2e, 0x64, 0x00, 0xfa, - 0x0a, 0xe1, 0xfb, 0x5c, 0x26, 0x84, 0x6f, 0x94, 0x75, 0xe0, 0x66, 0x31, 0x1d, 0x38, 0x78, 0xbc, - 0xde, 0x83, 0x8c, 0xbf, 0xfb, 0x73, 0x0b, 0xe4, 0x77, 0x9d, 0x71, 0x1a, 0x1b, 0x84, 0x4e, 0x19, - 0xf4, 0x5e, 0x18, 0x53, 0x5b, 0xe8, 0x99, 0xa0, 0xe3, 0xf3, 0xd0, 0xbb, 0xb2, 0x3e, 0x14, 0xc6, - 0x29, 0x28, 0xce, 0x60, 0xa3, 0x29, 0xa8, 0xd1, 0x71, 0xe2, 0x8f, 0x72, 0x5d, 0xab, 0xb6, 0xe9, - 0xd3, 0xcb, 0xf3, 0xe2, 0x29, 0x8d, 0x83, 0x02, 0x38, 0xe5, 0x39, 0x71, 0xc2, 0x7a, 0x40, 0x77, - 0xd4, 0x87, 0x2c, 0x7f, 0xc0, 0xb2, 0x08, 0x16, 0xb2, 0x84, 0x70, 0x37, 0x6d, 0xfb, 0x5b, 0x03, - 0x30, 0x9a, 0x92, 0x8c, 0x07, 0x54, 0xd2, 0xcf, 0x40, 0x55, 0xea, 0xcd, 0x6c, 0xa1, 0x16, 0xa5, - 0x5c, 0x15, 0x06, 0x55, 0x5a, 0x6b, 0x5a, 0xab, 0x66, 0x8d, 0x0a, 0x43, 0xe1, 0x62, 0x13, 0x8f, - 0x09, 0xe5, 0xc4, 0x8b, 0x67, 0x3c, 0x97, 0xf8, 0x09, 0xef, 0x66, 0x31, 0x42, 0x79, 0x75, 0x61, - 0xc5, 0x24, 0xaa, 0x85, 0x72, 0x06, 0x80, 0xb3, 0xec, 0xd1, 0xa7, 0x2c, 0x18, 0x75, 0xee, 0xc4, - 0xba, 0xa4, 0xaa, 0x08, 0xd6, 0x3b, 0xa2, 0x92, 0x4a, 0x55, 0x69, 0xe5, 0x2e, 0xdf, 0x54, 0x13, - 0x4e, 0x33, 0x45, 0x6f, 0x59, 0x80, 0xc8, 0x36, 0x69, 0xc8, 0x70, 0x42, 0xd1, 0x97, 0xc1, 0x22, - 0x76, 0x9a, 0x97, 0xba, 0xe8, 0x72, 0xa9, 0xde, 0xdd, 0x8e, 0x73, 0xfa, 0x60, 0xff, 0xb3, 0xb2, - 0x5a, 0x50, 0x3a, 0x82, 0xd5, 0x31, 0x22, 0xe9, 0xac, 0xc3, 0x47, 0xd2, 0xe9, 0x88, 0x84, 0xee, - 0xac, 0xca, 0x54, 0x12, 0x56, 0xe9, 0x01, 0x25, 0x61, 0xfd, 0xb4, 0x95, 0x2a, 0x49, 0x34, 0x7c, - 0xf1, 0x95, 0x62, 0xa3, 0x67, 0x27, 0x79, 0xb4, 0x44, 0x46, 0xba, 0xa7, 0x83, 0x64, 0xa8, 0x34, - 0x35, 0xd0, 0x0e, 0x24, 0x0d, 0xff, 0x7d, 0x19, 0x86, 0x0d, 0x4d, 0x9a, 0x6b, 0x16, 0x59, 0x0f, - 0x99, 0x59, 0x54, 0x3a, 0x80, 0x59, 0xf4, 0x53, 0x50, 0x6b, 0x48, 0x29, 0x5f, 0x4c, 0x51, 0xde, - 0xac, 0xee, 0xd0, 0x82, 0x5e, 0x35, 0x61, 0xcd, 0x13, 0xcd, 0xa5, 0x52, 0x77, 0x84, 0x86, 0x18, - 0x60, 0x1a, 0x22, 0x2f, 0xb7, 0x46, 0x68, 0x8a, 0xee, 0x67, 0x58, 0xe5, 0xaa, 0xd0, 0x15, 0xef, - 0x25, 0x63, 0xdc, 0x79, 0xe5, 0xaa, 0xe5, 0x79, 0xd9, 0x8c, 0x4d, 0x1c, 0xfb, 0x5b, 0x96, 0xfa, - 0xb8, 0xf7, 0xa1, 0x46, 0xc3, 0xed, 0x74, 0x8d, 0x86, 0x4b, 0x85, 0x0c, 0x73, 0x8f, 0xe2, 0x0c, - 0xd7, 0x61, 0x68, 0x26, 0x68, 0xb7, 0x1d, 0xbf, 0x89, 0xbe, 0x1f, 0x86, 0x1a, 0xfc, 0xa7, 0x70, - 0xec, 0xb0, 0xe3, 0x41, 0x01, 0xc5, 0x12, 0x86, 0x1e, 0x83, 0x01, 0x27, 0x6a, 0x49, 0x67, 0x0e, - 0x0b, 0xae, 0x99, 0x8e, 0x5a, 0x31, 0x66, 0xad, 0xf6, 0x3f, 0x1a, 0x00, 0x76, 0xa6, 0xed, 0x44, - 0xa4, 0xb9, 0x1a, 0xb0, 0xa2, 0x80, 0xc7, 0x7a, 0xa8, 0xa6, 0x37, 0x4b, 0x0f, 0xf3, 0xc1, 0x9a, - 0x71, 0xb8, 0x52, 0xbe, 0xcf, 0x87, 0x2b, 0x3d, 0xce, 0xcb, 0x06, 0x1e, 0xa2, 0xf3, 0x32, 0xfb, - 0xb3, 0x16, 0x20, 0x15, 0x08, 0xa1, 0x0f, 0xb4, 0xa7, 0xa0, 0xa6, 0x42, 0x22, 0x84, 0x61, 0xa5, - 0x45, 0x84, 0x04, 0x60, 0x8d, 0xd3, 0xc7, 0x0e, 0xf9, 0x49, 0x29, 0xbf, 0xcb, 0xe9, 0xb8, 0x5c, - 0x26, 0xf5, 0x85, 0x38, 0xb7, 0x7f, 0xbb, 0x04, 0x8f, 0x70, 0x95, 0xbc, 0xe8, 0xf8, 0x4e, 0x8b, - 0xb4, 0x69, 0xaf, 0xfa, 0x0d, 0x51, 0x68, 0xd0, 0xad, 0x99, 0x2b, 0xe3, 0x6c, 0x8f, 0xba, 0x76, - 0xf9, 0x9a, 0xe3, 0xab, 0x6c, 0xde, 0x77, 0x13, 0xcc, 0x88, 0xa3, 0x18, 0xaa, 0xb2, 0x62, 0xbd, - 0x90, 0xc5, 0x05, 0x31, 0x52, 0x62, 0x49, 0xe8, 0x4d, 0x82, 0x15, 0x23, 0x6a, 0xb8, 0x7a, 0x41, - 0x63, 0x13, 0x93, 0x30, 0x60, 0x72, 0xd7, 0x08, 0x73, 0x5c, 0x10, 0xed, 0x58, 0x61, 0xd8, 0xbf, - 0x6d, 0x41, 0x56, 0x23, 0x19, 0xd5, 0xd7, 0xac, 0x3d, 0xab, 0xaf, 0x1d, 0xa0, 0xfc, 0xd9, 0x4f, - 0xc0, 0xb0, 0x93, 0x50, 0x23, 0x82, 0x6f, 0xbb, 0xcb, 0x87, 0x3b, 0xd6, 0x58, 0x0c, 0x9a, 0xee, - 0xba, 0xcb, 0xb6, 0xdb, 0x26, 0x39, 0xfb, 0x7f, 0x0c, 0xc0, 0xa9, 0xae, 0x6c, 0x10, 0xf4, 0x22, - 0x8c, 0x34, 0xc4, 0xf4, 0x08, 0xa5, 0x43, 0xab, 0x66, 0x86, 0xc5, 0x69, 0x18, 0x4e, 0x61, 0xf6, - 0x31, 0x41, 0xe7, 0xe1, 0x74, 0x44, 0x37, 0xfa, 0x1d, 0x32, 0xbd, 0x9e, 0x90, 0x68, 0x85, 0x34, - 0x02, 0xbf, 0xc9, 0x6b, 0x04, 0x96, 0xeb, 0x8f, 0xde, 0xdd, 0x9d, 0x38, 0x8d, 0xbb, 0xc1, 0x38, - 0xef, 0x19, 0x14, 0xc2, 0xa8, 0x67, 0xda, 0x80, 0x62, 0x03, 0x70, 0x28, 0xf3, 0x51, 0xd9, 0x08, - 0xa9, 0x66, 0x9c, 0x66, 0x90, 0x36, 0x24, 0x2b, 0x0f, 0xc8, 0x90, 0xfc, 0xa4, 0x36, 0x24, 0xf9, - 0xf9, 0xfb, 0x07, 0x0b, 0xce, 0x06, 0x3a, 0x6e, 0x4b, 0xf2, 0x65, 0xa8, 0xca, 0xd8, 0xa4, 0xbe, - 0x62, 0x7a, 0x4c, 0x3a, 0x3d, 0x24, 0xda, 0xbd, 0x12, 0xe4, 0x6c, 0x42, 0xe8, 0x3a, 0xd3, 0x1a, - 0x3f, 0xb5, 0xce, 0x0e, 0xa6, 0xf5, 0xd1, 0x36, 0x8f, 0xcb, 0xe2, 0xba, 0xed, 0x03, 0x45, 0x6f, - 0xa2, 0x74, 0xa8, 0x96, 0x4a, 0x92, 0x50, 0xe1, 0x5a, 0x17, 0x01, 0xb4, 0xa1, 0x26, 0x42, 0xe0, - 0xd5, 0xb1, 0xaf, 0xb6, 0xe7, 0xb0, 0x81, 0x45, 0xf7, 0xd4, 0xae, 0x1f, 0x27, 0x8e, 0xe7, 0x5d, - 0x71, 0xfd, 0x44, 0x38, 0x07, 0x95, 0x12, 0x9f, 0xd7, 0x20, 0x6c, 0xe2, 0x9d, 0x7f, 0x8f, 0xf1, - 0x5d, 0x0e, 0xf2, 0x3d, 0x37, 0xe0, 0xdc, 0x9c, 0x9b, 0xa8, 0xc4, 0x0d, 0x35, 0x8f, 0xa8, 0x1d, - 0xa6, 0x12, 0x91, 0xac, 0x9e, 0x89, 0x48, 0x46, 0xe2, 0x44, 0x29, 0x9d, 0xe7, 0x91, 0x4d, 0x9c, - 0xb0, 0x5f, 0x84, 0x33, 0x73, 0x6e, 0x72, 0xd9, 0xf5, 0xc8, 0x01, 0x99, 0xd8, 0xbf, 0x39, 0x08, - 0x23, 0x66, 0xea, 0xdf, 0x41, 0x72, 0xa9, 0x3e, 0x4f, 0x4d, 0x2d, 0xf1, 0x76, 0xae, 0x3a, 0x34, - 0xbb, 0x75, 0xe4, 0x3c, 0xc4, 0xfc, 0x11, 0x33, 0xac, 0x2d, 0xcd, 0x13, 0x9b, 0x1d, 0x40, 0x77, - 0xa0, 0xb2, 0xce, 0x02, 0xfb, 0xcb, 0x45, 0x44, 0x16, 0xe4, 0x8d, 0xa8, 0x5e, 0x66, 0x3c, 0x35, - 0x80, 0xf3, 0xa3, 0x1a, 0x32, 0x4a, 0x67, 0x8b, 0x19, 0xc1, 0xa8, 0x22, 0x4f, 0x4c, 0x61, 0xf4, - 0x12, 0xf5, 0x95, 0x43, 0x88, 0xfa, 0x94, 0xe0, 0x1d, 0x7c, 0x40, 0x82, 0x97, 0x25, 0x69, 0x24, - 0x1b, 0xcc, 0x7e, 0x13, 0xd1, 0xf3, 0x43, 0x6c, 0x10, 0x8c, 0x24, 0x8d, 0x14, 0x18, 0x67, 0xf1, - 0xd1, 0xc7, 0x94, 0xe8, 0xae, 0x16, 0xe1, 0x57, 0x35, 0x67, 0xf4, 0x71, 0x4b, 0xed, 0xcf, 0x96, - 0x60, 0x6c, 0xce, 0xef, 0x2c, 0xcf, 0x2d, 0x77, 0xd6, 0x3c, 0xb7, 0x71, 0x8d, 0xec, 0x50, 0xd1, - 0xbc, 0x49, 0x76, 0xe6, 0x67, 0xc5, 0x0a, 0x52, 0x73, 0xe6, 0x1a, 0x6d, 0xc4, 0x1c, 0x46, 0x85, - 0xd1, 0xba, 0xeb, 0xb7, 0x48, 0x14, 0x46, 0xae, 0x70, 0x79, 0x1a, 0xc2, 0xe8, 0xb2, 0x06, 0x61, - 0x13, 0x8f, 0xd2, 0x0e, 0xee, 0xf8, 0x24, 0xca, 0x1a, 0xb2, 0x4b, 0xb4, 0x11, 0x73, 0x18, 0x45, - 0x4a, 0xa2, 0x4e, 0x9c, 0x88, 0xc9, 0xa8, 0x90, 0x56, 0x69, 0x23, 0xe6, 0x30, 0xba, 0xd2, 0xe3, - 0xce, 0x1a, 0x0b, 0xdc, 0xc8, 0x84, 0xea, 0xaf, 0xf0, 0x66, 0x2c, 0xe1, 0x14, 0x75, 0x93, 0xec, - 0xcc, 0xd2, 0x5d, 0x6f, 0x26, 0x63, 0xe7, 0x1a, 0x6f, 0xc6, 0x12, 0xce, 0x8a, 0x1b, 0xa6, 0x87, - 0xe3, 0xbb, 0xae, 0xb8, 0x61, 0xba, 0xfb, 0x3d, 0xf6, 0xcf, 0xbf, 0x6c, 0xc1, 0x88, 0x19, 0x6e, - 0x85, 0x5a, 0x19, 0x1b, 0x77, 0xa9, 0xab, 0x36, 0xee, 0x8f, 0xe5, 0x5d, 0x2c, 0xd6, 0x72, 0x93, - 0x20, 0x8c, 0x9f, 0x25, 0x7e, 0xcb, 0xf5, 0x09, 0x3b, 0x45, 0xe7, 0x61, 0x5a, 0xa9, 0x58, 0xae, - 0x99, 0xa0, 0x49, 0x0e, 0x61, 0x24, 0xdb, 0xb7, 0xe0, 0x54, 0x57, 0x9a, 0x56, 0x1f, 0xa6, 0xc5, - 0xbe, 0x49, 0xb2, 0x36, 0x86, 0x61, 0x4a, 0x58, 0x16, 0xd8, 0x99, 0x81, 0x53, 0x7c, 0x21, 0x51, - 0x4e, 0x2b, 0x8d, 0x0d, 0xd2, 0x56, 0xa9, 0x77, 0xcc, 0xbf, 0x7e, 0x33, 0x0b, 0xc4, 0xdd, 0xf8, - 0xf6, 0xe7, 0x2c, 0x18, 0x4d, 0x65, 0xce, 0x15, 0x64, 0x04, 0xb1, 0x95, 0x16, 0xb0, 0xe8, 0x3f, - 0x16, 0x02, 0x5d, 0x66, 0xca, 0x54, 0xaf, 0x34, 0x0d, 0xc2, 0x26, 0x9e, 0xfd, 0xc5, 0x12, 0x54, - 0x65, 0x04, 0x45, 0x1f, 0x5d, 0xf9, 0x8c, 0x05, 0xa3, 0xea, 0x4c, 0x83, 0x39, 0xcb, 0x4a, 0x45, - 0xa4, 0x39, 0xd0, 0x1e, 0xa8, 0xed, 0xb6, 0xbf, 0x1e, 0x68, 0x8b, 0x1c, 0x9b, 0xcc, 0x70, 0x9a, - 0x37, 0xba, 0x09, 0x10, 0xef, 0xc4, 0x09, 0x69, 0x1b, 0x6e, 0x3b, 0xdb, 0x58, 0x71, 0x93, 0x8d, - 0x20, 0x22, 0x74, 0x7d, 0x5d, 0x0f, 0x9a, 0x64, 0x45, 0x61, 0x6a, 0x13, 0x4a, 0xb7, 0x61, 0x83, - 0x92, 0xfd, 0x0f, 0x4a, 0x70, 0x32, 0xdb, 0x25, 0xf4, 0x41, 0x18, 0x91, 0xdc, 0x8d, 0x3b, 0xd2, - 0x64, 0xd8, 0xc8, 0x08, 0x36, 0x60, 0xf7, 0x76, 0x27, 0x26, 0xba, 0x2f, 0xa9, 0x9b, 0x34, 0x51, - 0x70, 0x8a, 0x18, 0x3f, 0x58, 0x12, 0x27, 0xa0, 0xf5, 0x9d, 0xe9, 0x30, 0x14, 0xa7, 0x43, 0xc6, - 0xc1, 0x92, 0x09, 0xc5, 0x19, 0x6c, 0xb4, 0x0c, 0x67, 0x8c, 0x96, 0xeb, 0xc4, 0x6d, 0x6d, 0xac, - 0x05, 0x91, 0xdc, 0x59, 0x3d, 0xa6, 0x03, 0xbb, 0xba, 0x71, 0x70, 0xee, 0x93, 0x54, 0xdb, 0x37, - 0x9c, 0xd0, 0x69, 0xb8, 0xc9, 0x8e, 0xf0, 0x43, 0x2a, 0xd9, 0x34, 0x23, 0xda, 0xb1, 0xc2, 0xb0, - 0x17, 0x61, 0xa0, 0xcf, 0x19, 0xd4, 0x97, 0x45, 0xff, 0x32, 0x54, 0x29, 0x39, 0x69, 0xde, 0x15, - 0x41, 0x32, 0x80, 0xaa, 0xbc, 0xbb, 0x04, 0xd9, 0x50, 0x76, 0x1d, 0x79, 0x76, 0xa7, 0x5e, 0x6b, - 0x3e, 0x8e, 0x3b, 0x6c, 0x93, 0x4c, 0x81, 0xe8, 0x49, 0x28, 0x93, 0xed, 0x30, 0x7b, 0x48, 0x77, - 0x69, 0x3b, 0x74, 0x23, 0x12, 0x53, 0x24, 0xb2, 0x1d, 0xa2, 0xf3, 0x50, 0x72, 0x9b, 0x42, 0x49, - 0x81, 0xc0, 0x29, 0xcd, 0xcf, 0xe2, 0x92, 0xdb, 0xb4, 0xb7, 0xa1, 0xa6, 0x2e, 0x4b, 0x41, 0x9b, - 0x52, 0x76, 0x5b, 0x45, 0x84, 0x3c, 0x49, 0xba, 0x3d, 0xa4, 0x76, 0x07, 0x40, 0xa7, 0x10, 0x16, - 0x25, 0x5f, 0x2e, 0xc0, 0x40, 0x23, 0x10, 0xe9, 0xcd, 0x55, 0x4d, 0x86, 0x09, 0x6d, 0x06, 0xb1, - 0x6f, 0xc1, 0xd8, 0x35, 0x3f, 0xb8, 0xc3, 0x2a, 0xbd, 0xb3, 0xc2, 0x66, 0x94, 0xf0, 0x3a, 0xfd, - 0x91, 0x35, 0x11, 0x18, 0x14, 0x73, 0x98, 0xaa, 0xf8, 0x54, 0xea, 0x55, 0xf1, 0xc9, 0xfe, 0xb8, - 0x05, 0x23, 0x2a, 0x17, 0x69, 0x6e, 0x6b, 0x93, 0xd2, 0x6d, 0x45, 0x41, 0x27, 0xcc, 0xd2, 0x65, - 0xd7, 0x19, 0x61, 0x0e, 0x33, 0x93, 0xf4, 0x4a, 0xfb, 0x24, 0xe9, 0x5d, 0x80, 0x81, 0x4d, 0xd7, - 0x6f, 0x66, 0xef, 0xe7, 0xb8, 0xe6, 0xfa, 0x4d, 0xcc, 0x20, 0xb4, 0x0b, 0x27, 0x55, 0x17, 0xa4, - 0x42, 0x78, 0x11, 0x46, 0xd6, 0x3a, 0xae, 0xd7, 0x94, 0x15, 0xdb, 0x32, 0x9e, 0x92, 0xba, 0x01, - 0xc3, 0x29, 0x4c, 0xba, 0xaf, 0x5b, 0x73, 0x7d, 0x27, 0xda, 0x59, 0xd6, 0x1a, 0x48, 0x09, 0xa5, - 0xba, 0x82, 0x60, 0x03, 0xcb, 0x7e, 0xb3, 0x0c, 0x63, 0xe9, 0x8c, 0xac, 0x3e, 0xb6, 0x57, 0x4f, - 0x42, 0x85, 0x25, 0x69, 0x65, 0x3f, 0x2d, 0x2f, 0x72, 0xc6, 0x61, 0x28, 0x86, 0x41, 0x5e, 0xde, - 0xa1, 0x98, 0xbb, 0x6d, 0x54, 0x27, 0x95, 0x7f, 0x85, 0xc5, 0x93, 0x89, 0x8a, 0x12, 0x82, 0x15, - 0xfa, 0x94, 0x05, 0x43, 0x41, 0x68, 0x56, 0x0a, 0xfa, 0x40, 0x91, 0xd9, 0x6a, 0x22, 0x59, 0x46, - 0x58, 0xc4, 0xea, 0xd3, 0xcb, 0xcf, 0x21, 0x59, 0x9f, 0xff, 0x11, 0x18, 0x31, 0x31, 0xf7, 0x33, - 0x8a, 0xab, 0xa6, 0x51, 0xfc, 0x19, 0x73, 0x52, 0x88, 0x7c, 0xbc, 0x3e, 0x96, 0xdb, 0x0d, 0xa8, - 0x34, 0x54, 0x00, 0xc0, 0xa1, 0xea, 0x7c, 0xaa, 0x7a, 0x0b, 0xec, 0x10, 0x88, 0x53, 0xb3, 0xbf, - 0x65, 0x19, 0xf3, 0x03, 0x93, 0x78, 0xbe, 0x89, 0x22, 0x28, 0xb7, 0xb6, 0x36, 0x85, 0x29, 0x7a, - 0xb5, 0xa0, 0xe1, 0x9d, 0xdb, 0xda, 0xd4, 0x73, 0xdc, 0x6c, 0xc5, 0x94, 0x59, 0x1f, 0x4e, 0xc0, - 0x54, 0xda, 0x66, 0x79, 0xff, 0xb4, 0x4d, 0xfb, 0xad, 0x12, 0x9c, 0xea, 0x9a, 0x54, 0xe8, 0x0d, - 0xa8, 0x44, 0xf4, 0x2d, 0xc5, 0xeb, 0x2d, 0x14, 0x96, 0x68, 0x19, 0xcf, 0x37, 0xb5, 0xde, 0x4d, - 0xb7, 0x63, 0xce, 0x12, 0x5d, 0x05, 0xa4, 0xc3, 0x54, 0x94, 0x07, 0x92, 0xbf, 0xf2, 0x79, 0xf1, - 0x28, 0x9a, 0xee, 0xc2, 0xc0, 0x39, 0x4f, 0xa1, 0x97, 0xb2, 0x8e, 0xcc, 0x72, 0xfa, 0xdc, 0x72, - 0x2f, 0x9f, 0xa4, 0xfd, 0xcf, 0x4b, 0x30, 0x9a, 0x2a, 0xdc, 0x84, 0x3c, 0xa8, 0x12, 0x8f, 0x39, - 0xf5, 0xa5, 0xb2, 0x39, 0x6a, 0x1d, 0x64, 0xa5, 0x20, 0x2f, 0x09, 0xba, 0x58, 0x71, 0x78, 0x38, - 0x0e, 0xd7, 0x5f, 0x84, 0x11, 0xd9, 0xa1, 0x0f, 0x38, 0x6d, 0x4f, 0x0c, 0xa0, 0x9a, 0xa3, 0x97, - 0x0c, 0x18, 0x4e, 0x61, 0xda, 0xbf, 0x53, 0x86, 0x71, 0x7e, 0x0a, 0xd2, 0x54, 0x33, 0x6f, 0x51, - 0xee, 0xb7, 0xfe, 0x8a, 0x2e, 0xaf, 0xc6, 0x07, 0x72, 0xed, 0xa8, 0xd7, 0x0e, 0xe4, 0x33, 0xea, - 0x2b, 0x32, 0xeb, 0x2b, 0x99, 0xc8, 0x2c, 0x6e, 0x76, 0xb7, 0x8e, 0xa9, 0x47, 0xdf, 0x5d, 0xa1, - 0x5a, 0x7f, 0xb7, 0x04, 0x27, 0x32, 0x77, 0x3a, 0xa0, 0x37, 0xd3, 0x65, 0x80, 0xad, 0x22, 0x7c, - 0xe5, 0x7b, 0x96, 0xf9, 0x3f, 0x58, 0x31, 0xe0, 0x07, 0xb4, 0x54, 0xec, 0x3f, 0x28, 0xc1, 0x58, - 0xfa, 0x32, 0x8a, 0x87, 0x70, 0xa4, 0xde, 0x0d, 0x35, 0x56, 0x6f, 0x9d, 0x5d, 0xb2, 0xc9, 0x5d, - 0xf2, 0xbc, 0xb4, 0xb5, 0x6c, 0xc4, 0x1a, 0xfe, 0x50, 0xd4, 0x58, 0xb6, 0xff, 0x9e, 0x05, 0x67, - 0xf9, 0x5b, 0x66, 0xe7, 0xe1, 0x5f, 0xcd, 0x1b, 0xdd, 0x57, 0x8b, 0xed, 0x60, 0xa6, 0x2c, 0xe0, - 0x7e, 0xe3, 0xcb, 0x2e, 0xf7, 0x13, 0xbd, 0x4d, 0x4f, 0x85, 0x87, 0xb0, 0xb3, 0x07, 0x9a, 0x0c, - 0xf6, 0x1f, 0x94, 0x41, 0xdf, 0x67, 0x88, 0x5c, 0x91, 0xe3, 0x58, 0x48, 0x79, 0xc4, 0x95, 0x1d, - 0xbf, 0xa1, 0x6f, 0x4e, 0xac, 0x66, 0x52, 0x1c, 0x7f, 0xce, 0x82, 0x61, 0xd7, 0x77, 0x13, 0xd7, - 0x61, 0xdb, 0xe8, 0x62, 0xee, 0x5a, 0x53, 0xec, 0xe6, 0x39, 0xe5, 0x20, 0x32, 0xcf, 0x71, 0x14, - 0x33, 0x6c, 0x72, 0x46, 0x1f, 0x16, 0xc1, 0xd3, 0xe5, 0xc2, 0xb2, 0x73, 0xab, 0x99, 0x88, 0xe9, - 0x90, 0x1a, 0x5e, 0x49, 0x54, 0x50, 0x52, 0x3b, 0xa6, 0xa4, 0x54, 0xa5, 0x5d, 0x7d, 0xb3, 0x34, - 0x6d, 0xc6, 0x9c, 0x91, 0x1d, 0x03, 0xea, 0x1e, 0x8b, 0x03, 0x06, 0xa6, 0x4e, 0x41, 0xcd, 0xe9, - 0x24, 0x41, 0x9b, 0x0e, 0x93, 0x38, 0x6a, 0xd2, 0xa1, 0xb7, 0x12, 0x80, 0x35, 0x8e, 0xfd, 0x66, - 0x05, 0x32, 0x49, 0x87, 0x68, 0xdb, 0xbc, 0x8b, 0xd3, 0x2a, 0xf6, 0x2e, 0x4e, 0xd5, 0x99, 0xbc, - 0xfb, 0x38, 0x51, 0x0b, 0x2a, 0xe1, 0x86, 0x13, 0x4b, 0xb3, 0xfa, 0x65, 0xb5, 0x8f, 0xa3, 0x8d, - 0xf7, 0x76, 0x27, 0x7e, 0xbc, 0x3f, 0xaf, 0x2b, 0x9d, 0xab, 0x53, 0xbc, 0x7c, 0x89, 0x66, 0xcd, - 0x68, 0x60, 0x4e, 0xff, 0x20, 0xb7, 0xcd, 0x7d, 0x42, 0x14, 0x96, 0xc7, 0x24, 0xee, 0x78, 0x89, - 0x98, 0x0d, 0x2f, 0x17, 0xb8, 0xca, 0x38, 0x61, 0x9d, 0x2e, 0xcf, 0xff, 0x63, 0x83, 0x29, 0xfa, - 0x20, 0xd4, 0xe2, 0xc4, 0x89, 0x92, 0x43, 0x26, 0xb8, 0xaa, 0x41, 0x5f, 0x91, 0x44, 0xb0, 0xa6, - 0x87, 0x5e, 0x61, 0xd5, 0x62, 0xdd, 0x78, 0xe3, 0x90, 0x39, 0x0f, 0xb2, 0xb2, 0xac, 0xa0, 0x80, - 0x0d, 0x6a, 0xe8, 0x22, 0x00, 0x9b, 0xdb, 0x3c, 0xd0, 0xaf, 0xca, 0xbc, 0x4c, 0x4a, 0x14, 0x62, - 0x05, 0xc1, 0x06, 0x96, 0xfd, 0x83, 0x90, 0xae, 0xf7, 0x80, 0x26, 0x64, 0x79, 0x09, 0xee, 0x85, - 0x66, 0xb9, 0x0b, 0xa9, 0x4a, 0x10, 0xbf, 0x6e, 0x81, 0x59, 0x94, 0x02, 0xbd, 0xce, 0xab, 0x5f, - 0x58, 0x45, 0x9c, 0x1c, 0x1a, 0x74, 0x27, 0x17, 0x9d, 0x30, 0x73, 0x84, 0x2d, 0x4b, 0x60, 0x9c, - 0x7f, 0x0f, 0x54, 0x25, 0xf4, 0x40, 0x46, 0xdd, 0xc7, 0xe0, 0x74, 0xf6, 0xa6, 0x72, 0x71, 0xea, - 0xb4, 0xbf, 0xeb, 0x47, 0xfa, 0x73, 0x4a, 0xbd, 0xfc, 0x39, 0x7d, 0xdc, 0xc8, 0xfa, 0x1b, 0x16, - 0x5c, 0xd8, 0xef, 0x42, 0x75, 0xf4, 0x18, 0x0c, 0xdc, 0x71, 0x22, 0x59, 0xc6, 0x9b, 0x09, 0xca, - 0x5b, 0x4e, 0xe4, 0x63, 0xd6, 0x8a, 0x76, 0x60, 0x90, 0x47, 0x83, 0x09, 0x6b, 0xfd, 0xe5, 0x62, - 0xaf, 0x77, 0xbf, 0x46, 0x8c, 0xed, 0x02, 0x8f, 0x44, 0xc3, 0x82, 0xa1, 0xfd, 0x6d, 0x0b, 0xd0, - 0xd2, 0x16, 0x89, 0x22, 0xb7, 0x69, 0xc4, 0xaf, 0xb1, 0x0b, 0x5a, 0x8c, 0x8b, 0x58, 0xcc, 0x14, - 0xd7, 0xcc, 0x05, 0x2d, 0xc6, 0xbf, 0xfc, 0x0b, 0x5a, 0x4a, 0x07, 0xbb, 0xa0, 0x05, 0x2d, 0xc1, - 0xd9, 0x36, 0xdf, 0x6e, 0xf0, 0x4b, 0x0f, 0xf8, 0xde, 0x43, 0x25, 0x94, 0x9d, 0xbb, 0xbb, 0x3b, - 0x71, 0x76, 0x31, 0x0f, 0x01, 0xe7, 0x3f, 0x67, 0xbf, 0x07, 0x10, 0x0f, 0x5b, 0x9b, 0xc9, 0x8b, - 0x41, 0xea, 0xe9, 0x7e, 0xb1, 0xbf, 0x5c, 0x81, 0x13, 0x99, 0x22, 0xaf, 0x74, 0xab, 0xd7, 0x1d, - 0xf4, 0x74, 0x64, 0xfd, 0xdd, 0xdd, 0xbd, 0xbe, 0xc2, 0xa8, 0x7c, 0xa8, 0xb8, 0x7e, 0xd8, 0x49, - 0x8a, 0xc9, 0x21, 0xe5, 0x9d, 0x98, 0xa7, 0x04, 0x0d, 0x77, 0x31, 0xfd, 0x8b, 0x39, 0x9b, 0x22, - 0x83, 0xb2, 0x52, 0xc6, 0xf8, 0xc0, 0x03, 0x72, 0x07, 0x7c, 0x42, 0x87, 0x48, 0x55, 0x8a, 0x70, - 0x2c, 0x66, 0x26, 0xcb, 0x71, 0x1f, 0xb5, 0xff, 0x5a, 0x09, 0x86, 0x8d, 0x8f, 0x86, 0x7e, 0x29, - 0x5d, 0xb2, 0xc9, 0x2a, 0xee, 0x95, 0x18, 0xfd, 0x49, 0x5d, 0x94, 0x89, 0xbf, 0xd2, 0x53, 0xdd, - 0xd5, 0x9a, 0xee, 0xed, 0x4e, 0x9c, 0xcc, 0xd4, 0x63, 0x4a, 0x55, 0x70, 0x3a, 0xff, 0x51, 0x38, - 0x91, 0x21, 0x93, 0xf3, 0xca, 0xab, 0xe9, 0x8b, 0xe8, 0x8f, 0xe8, 0x96, 0x32, 0x87, 0xec, 0xeb, - 0x74, 0xc8, 0x44, 0x1a, 0x5d, 0xe0, 0x91, 0x3e, 0x7c, 0xb0, 0x99, 0x6c, 0xd9, 0x52, 0x9f, 0xd9, - 0xb2, 0x4f, 0x43, 0x35, 0x0c, 0x3c, 0xb7, 0xe1, 0xaa, 0xba, 0x86, 0x2c, 0x3f, 0x77, 0x59, 0xb4, - 0x61, 0x05, 0x45, 0x77, 0xa0, 0xa6, 0xee, 0xec, 0x17, 0xfe, 0xed, 0xa2, 0x0e, 0x7d, 0x94, 0xd1, - 0xa2, 0xef, 0xe2, 0xd7, 0xbc, 0x90, 0x0d, 0x83, 0x4c, 0x09, 0xca, 0xd0, 0x7f, 0xe6, 0x7b, 0x67, - 0xda, 0x31, 0xc6, 0x02, 0x62, 0x7f, 0xad, 0x06, 0x67, 0xf2, 0x2a, 0x6d, 0xa3, 0x8f, 0xc0, 0x20, - 0xef, 0x63, 0x31, 0x97, 0x39, 0xe4, 0xf1, 0x98, 0x63, 0x04, 0x45, 0xb7, 0xd8, 0x6f, 0x2c, 0x78, - 0x0a, 0xee, 0x9e, 0xb3, 0x26, 0x66, 0xc8, 0xf1, 0x70, 0x5f, 0x70, 0x34, 0xf7, 0x05, 0x87, 0x73, - 0xf7, 0x9c, 0x35, 0xb4, 0x0d, 0x95, 0x96, 0x9b, 0x10, 0x47, 0x38, 0x11, 0x6e, 0x1d, 0x0b, 0x73, - 0xe2, 0x70, 0x2b, 0x8d, 0xfd, 0xc4, 0x9c, 0x21, 0xfa, 0xaa, 0x05, 0x27, 0xd6, 0xd2, 0xa9, 0xf1, - 0x42, 0x78, 0x3a, 0xc7, 0x50, 0x4d, 0x3d, 0xcd, 0x88, 0xdf, 0x50, 0x94, 0x69, 0xc4, 0xd9, 0xee, - 0xa0, 0x4f, 0x5a, 0x30, 0xb4, 0xee, 0x7a, 0x46, 0x61, 0xdd, 0x63, 0xf8, 0x38, 0x97, 0x19, 0x03, - 0xbd, 0xe3, 0xe0, 0xff, 0x63, 0x2c, 0x39, 0xf7, 0xd2, 0x54, 0x83, 0x47, 0xd5, 0x54, 0x43, 0x0f, - 0x48, 0x53, 0x7d, 0xda, 0x82, 0x9a, 0x1a, 0x69, 0x91, 0xee, 0xfc, 0xc1, 0x63, 0xfc, 0xe4, 0xdc, - 0x73, 0xa2, 0xfe, 0x62, 0xcd, 0x1c, 0x7d, 0xc1, 0x82, 0x61, 0xe7, 0x8d, 0x4e, 0x44, 0x9a, 0x64, - 0x2b, 0x08, 0x63, 0x71, 0xbd, 0xe1, 0xab, 0xc5, 0x77, 0x66, 0x9a, 0x32, 0x99, 0x25, 0x5b, 0x4b, - 0x61, 0x2c, 0xd2, 0x92, 0x74, 0x03, 0x36, 0xbb, 0x60, 0xef, 0x96, 0x60, 0x62, 0x1f, 0x0a, 0xe8, - 0x45, 0x18, 0x09, 0xa2, 0x96, 0xe3, 0xbb, 0x6f, 0x98, 0xb5, 0x2e, 0x94, 0x95, 0xb5, 0x64, 0xc0, - 0x70, 0x0a, 0xd3, 0x4c, 0xc8, 0x2e, 0xed, 0x93, 0x90, 0x7d, 0x01, 0x06, 0x22, 0x12, 0x06, 0xd9, - 0xcd, 0x02, 0x4b, 0x09, 0x60, 0x10, 0xf4, 0x38, 0x94, 0x9d, 0xd0, 0x15, 0x81, 0x68, 0x6a, 0x0f, - 0x34, 0xbd, 0x3c, 0x8f, 0x69, 0x7b, 0xaa, 0x3e, 0x44, 0xe5, 0xbe, 0xd4, 0x87, 0xa0, 0x6a, 0x40, - 0x9c, 0x5d, 0x0c, 0x6a, 0x35, 0x90, 0x3e, 0x53, 0xb0, 0xdf, 0x2a, 0xc3, 0xe3, 0x7b, 0xce, 0x17, - 0x1d, 0x87, 0x67, 0xed, 0x11, 0x87, 0x27, 0x87, 0xa7, 0xb4, 0xdf, 0xf0, 0x94, 0x7b, 0x0c, 0xcf, - 0x27, 0xe9, 0x32, 0x90, 0x35, 0x42, 0x8a, 0xb9, 0xa0, 0xae, 0x57, 0xc9, 0x11, 0xb1, 0x02, 0x24, - 0x14, 0x6b, 0xbe, 0x74, 0x0f, 0x90, 0x4a, 0x46, 0xae, 0x14, 0xa1, 0x06, 0x7a, 0xd6, 0x0c, 0xe1, - 0x73, 0xbf, 0x57, 0x86, 0xb3, 0xfd, 0xf3, 0x25, 0x78, 0xb2, 0x0f, 0xe9, 0x6d, 0xce, 0x62, 0xab, - 0xcf, 0x59, 0xfc, 0xdd, 0xfd, 0x99, 0xec, 0xbf, 0x66, 0xc1, 0xf9, 0xde, 0xca, 0x03, 0x3d, 0x07, - 0xc3, 0x6b, 0x91, 0xe3, 0x37, 0x36, 0xd8, 0xa5, 0x9b, 0x72, 0x50, 0xd8, 0x58, 0xeb, 0x66, 0x6c, - 0xe2, 0xd0, 0xed, 0x2d, 0x8f, 0x49, 0x30, 0x30, 0x64, 0xf2, 0x28, 0xdd, 0xde, 0xae, 0x66, 0x81, - 0xb8, 0x1b, 0xdf, 0xfe, 0xb3, 0x52, 0x7e, 0xb7, 0xb8, 0x91, 0x71, 0x90, 0xef, 0x24, 0xbe, 0x42, - 0xa9, 0x0f, 0x59, 0x52, 0xbe, 0xdf, 0xb2, 0x64, 0xa0, 0x97, 0x2c, 0x41, 0xb3, 0x70, 0xd2, 0xb8, - 0x94, 0x85, 0x27, 0x04, 0xf3, 0x80, 0x5b, 0x55, 0x25, 0x63, 0x39, 0x03, 0xc7, 0x5d, 0x4f, 0xa0, - 0x67, 0xa0, 0xea, 0xfa, 0x31, 0x69, 0x74, 0x22, 0x1e, 0xe8, 0x6d, 0x24, 0x61, 0xcd, 0x8b, 0x76, - 0xac, 0x30, 0xec, 0x5f, 0x2e, 0xc1, 0xb9, 0x9e, 0x76, 0xd6, 0x7d, 0x92, 0x5d, 0xe6, 0xe7, 0x18, - 0xb8, 0x3f, 0x9f, 0xc3, 0x1c, 0xa4, 0xca, 0xbe, 0x83, 0xf4, 0x87, 0xbd, 0x27, 0x26, 0xb5, 0xb9, - 0xbf, 0x67, 0x47, 0xe9, 0x25, 0x18, 0x75, 0xc2, 0x90, 0xe3, 0xb1, 0x78, 0xcd, 0x4c, 0x95, 0x9c, - 0x69, 0x13, 0x88, 0xd3, 0xb8, 0x7d, 0x69, 0xcf, 0x3f, 0xb6, 0xa0, 0x86, 0xc9, 0x3a, 0x97, 0x0e, - 0xe8, 0xb6, 0x18, 0x22, 0xab, 0x88, 0x7a, 0x9a, 0x74, 0x60, 0x63, 0x97, 0xd5, 0x99, 0xcc, 0x1b, - 0xec, 0xee, 0xcb, 0x7b, 0x4a, 0x07, 0xba, 0xbc, 0x47, 0x5d, 0xdf, 0x52, 0xee, 0x7d, 0x7d, 0x8b, - 0xfd, 0xf5, 0x21, 0xfa, 0x7a, 0x61, 0x30, 0x13, 0x91, 0x66, 0x4c, 0xbf, 0x6f, 0x27, 0xf2, 0xc4, - 0x24, 0x51, 0xdf, 0xf7, 0x06, 0x5e, 0xc0, 0xb4, 0x3d, 0x75, 0x14, 0x53, 0x3a, 0x50, 0x8d, 0x90, - 0xf2, 0xbe, 0x35, 0x42, 0x5e, 0x82, 0xd1, 0x38, 0xde, 0x58, 0x8e, 0xdc, 0x2d, 0x27, 0x21, 0xd7, - 0xc8, 0x8e, 0xb0, 0xb2, 0x74, 0x5e, 0xff, 0xca, 0x15, 0x0d, 0xc4, 0x69, 0x5c, 0x34, 0x07, 0xa7, - 0x74, 0xa5, 0x0e, 0x12, 0x25, 0x2c, 0xba, 0x9f, 0xcf, 0x04, 0x95, 0xc4, 0xab, 0x6b, 0x7b, 0x08, - 0x04, 0xdc, 0xfd, 0x0c, 0x95, 0x6f, 0xa9, 0x46, 0xda, 0x91, 0xc1, 0xb4, 0x7c, 0x4b, 0xd1, 0xa1, - 0x7d, 0xe9, 0x7a, 0x02, 0x2d, 0xc2, 0x69, 0x3e, 0x31, 0xa6, 0xc3, 0xd0, 0x78, 0xa3, 0xa1, 0x74, - 0x1d, 0xc3, 0xb9, 0x6e, 0x14, 0x9c, 0xf7, 0x1c, 0x7a, 0x01, 0x86, 0x55, 0xf3, 0xfc, 0xac, 0x38, - 0x45, 0x50, 0x5e, 0x0c, 0x45, 0x66, 0xbe, 0x89, 0x4d, 0x3c, 0xf4, 0x01, 0x78, 0x54, 0xff, 0xe5, - 0x29, 0x60, 0xfc, 0x68, 0x6d, 0x56, 0x14, 0x41, 0x52, 0x97, 0x85, 0xcc, 0xe5, 0xa2, 0x35, 0x71, - 0xaf, 0xe7, 0xd1, 0x1a, 0x9c, 0x57, 0xa0, 0x4b, 0x7e, 0xc2, 0xf2, 0x39, 0x62, 0x52, 0x77, 0x62, - 0x72, 0x23, 0xf2, 0xc4, 0x6d, 0xab, 0xea, 0x1e, 0xc7, 0x39, 0x37, 0xb9, 0x92, 0x87, 0x89, 0x17, - 0xf0, 0x1e, 0x54, 0xd0, 0x14, 0xd4, 0x88, 0xef, 0xac, 0x79, 0x64, 0x69, 0x66, 0x9e, 0x15, 0x53, - 0x32, 0x4e, 0xf2, 0x2e, 0x49, 0x00, 0xd6, 0x38, 0x2a, 0xc2, 0x74, 0xa4, 0xe7, 0x9d, 0xa2, 0xcb, - 0x70, 0xa6, 0xd5, 0x08, 0xa9, 0xed, 0xe1, 0x36, 0xc8, 0x74, 0x83, 0x05, 0xd4, 0xd1, 0x0f, 0xc3, - 0x0b, 0x4c, 0xaa, 0xf0, 0xe9, 0xb9, 0x99, 0xe5, 0x2e, 0x1c, 0x9c, 0xfb, 0x24, 0x0b, 0xbc, 0x8c, - 0x82, 0xed, 0x9d, 0xf1, 0xd3, 0x99, 0xc0, 0x4b, 0xda, 0x88, 0x39, 0x0c, 0x5d, 0x05, 0xc4, 0x62, - 0xf1, 0xaf, 0x24, 0x49, 0xa8, 0x8c, 0x9d, 0xf1, 0x33, 0xec, 0x95, 0x54, 0x18, 0xd9, 0xe5, 0x2e, - 0x0c, 0x9c, 0xf3, 0x94, 0xfd, 0x1f, 0x2c, 0x18, 0x55, 0xeb, 0xf5, 0x3e, 0x64, 0xa3, 0x78, 0xe9, - 0x6c, 0x94, 0xb9, 0xa3, 0x4b, 0x3c, 0xd6, 0xf3, 0x1e, 0x21, 0xcd, 0x3f, 0x33, 0x0c, 0xa0, 0xa5, - 0xa2, 0x52, 0x48, 0x56, 0x4f, 0x85, 0xf4, 0xd0, 0x4a, 0xa4, 0xbc, 0xca, 0x29, 0x95, 0x07, 0x5b, - 0x39, 0x65, 0x05, 0xce, 0x4a, 0x73, 0x81, 0x9f, 0x15, 0x5d, 0x09, 0x62, 0x25, 0xe0, 0xaa, 0xf5, - 0xc7, 0x05, 0xa1, 0xb3, 0xf3, 0x79, 0x48, 0x38, 0xff, 0xd9, 0x94, 0x95, 0x32, 0xb4, 0x9f, 0x95, - 0xa2, 0xd7, 0xf4, 0xc2, 0xba, 0xbc, 0x15, 0x24, 0xb3, 0xa6, 0x17, 0x2e, 0xaf, 0x60, 0x8d, 0x93, - 0x2f, 0xd8, 0x6b, 0x05, 0x09, 0x76, 0x38, 0xb0, 0x60, 0x97, 0x22, 0x66, 0xb8, 0xa7, 0x88, 0x91, - 0x3e, 0xe9, 0x91, 0x9e, 0x3e, 0xe9, 0xf7, 0xc2, 0x98, 0xeb, 0x6f, 0x90, 0xc8, 0x4d, 0x48, 0x93, - 0xad, 0x05, 0x26, 0x7e, 0xaa, 0x5a, 0xad, 0xcf, 0xa7, 0xa0, 0x38, 0x83, 0x9d, 0x96, 0x8b, 0x63, - 0x7d, 0xc8, 0xc5, 0x1e, 0xda, 0xe8, 0x44, 0x31, 0xda, 0xe8, 0xe4, 0xd1, 0xb5, 0xd1, 0xa9, 0x63, - 0xd5, 0x46, 0xa8, 0x10, 0x6d, 0xd4, 0x97, 0xa0, 0x37, 0xb6, 0x7f, 0x67, 0xf6, 0xd9, 0xfe, 0xf5, - 0x52, 0x45, 0x67, 0x0f, 0xad, 0x8a, 0xf2, 0xb5, 0xcc, 0x23, 0x87, 0xd2, 0x32, 0x9f, 0x2e, 0xc1, - 0x59, 0x2d, 0x87, 0xe9, 0xec, 0x77, 0xd7, 0xa9, 0x24, 0x62, 0x17, 0x4b, 0xf1, 0x73, 0x1b, 0x23, - 0x39, 0x4a, 0xe7, 0x59, 0x29, 0x08, 0x36, 0xb0, 0x58, 0x8e, 0x11, 0x89, 0x58, 0x19, 0xdd, 0xac, - 0x90, 0x9e, 0x11, 0xed, 0x58, 0x61, 0xd0, 0xf9, 0x45, 0x7f, 0x8b, 0xbc, 0xcd, 0x6c, 0xb1, 0xb8, - 0x19, 0x0d, 0xc2, 0x26, 0x1e, 0x7a, 0x9a, 0x33, 0x61, 0x02, 0x82, 0x0a, 0xea, 0x11, 0x71, 0xd3, - 0xac, 0x94, 0x09, 0x0a, 0x2a, 0xbb, 0xc3, 0x92, 0xc9, 0x2a, 0xdd, 0xdd, 0x61, 0x21, 0x50, 0x0a, - 0xc3, 0xfe, 0x9f, 0x16, 0x9c, 0xcb, 0x1d, 0x8a, 0xfb, 0xa0, 0x7c, 0xb7, 0xd3, 0xca, 0x77, 0xa5, - 0xa8, 0xed, 0x86, 0xf1, 0x16, 0x3d, 0x14, 0xf1, 0xbf, 0xb3, 0x60, 0x4c, 0xe3, 0xdf, 0x87, 0x57, - 0x75, 0xd3, 0xaf, 0x5a, 0xdc, 0xce, 0xaa, 0xd6, 0xf5, 0x6e, 0xbf, 0x53, 0x02, 0x55, 0xc0, 0x71, - 0xba, 0x21, 0xcb, 0xe3, 0xee, 0x73, 0x92, 0xb8, 0x03, 0x83, 0xec, 0x20, 0x34, 0x2e, 0x26, 0xc8, - 0x23, 0xcd, 0x9f, 0x1d, 0xaa, 0xea, 0x43, 0x66, 0xf6, 0x37, 0xc6, 0x82, 0x21, 0x2b, 0xf2, 0xec, - 0xc6, 0x54, 0x9a, 0x37, 0x45, 0x5a, 0x96, 0x2e, 0xf2, 0x2c, 0xda, 0xb1, 0xc2, 0xa0, 0xea, 0xc1, - 0x6d, 0x04, 0xfe, 0x8c, 0xe7, 0xc4, 0xf2, 0x36, 0x45, 0xa5, 0x1e, 0xe6, 0x25, 0x00, 0x6b, 0x1c, - 0x76, 0x46, 0xea, 0xc6, 0xa1, 0xe7, 0xec, 0x18, 0xfb, 0x67, 0xa3, 0x3e, 0x81, 0x02, 0x61, 0x13, - 0xcf, 0x6e, 0xc3, 0x78, 0xfa, 0x25, 0x66, 0xc9, 0x3a, 0x0b, 0x50, 0xec, 0x6b, 0x38, 0xa7, 0xa0, - 0xe6, 0xb0, 0xa7, 0x16, 0x3a, 0x4e, 0xf6, 0x12, 0xf4, 0x69, 0x09, 0xc0, 0x1a, 0xc7, 0xfe, 0x55, - 0x0b, 0x4e, 0xe7, 0x0c, 0x5a, 0x81, 0x69, 0x6f, 0x89, 0x96, 0x36, 0x79, 0x8a, 0xfd, 0x07, 0x60, - 0xa8, 0x49, 0xd6, 0x1d, 0x19, 0x02, 0x67, 0xc8, 0xf6, 0x59, 0xde, 0x8c, 0x25, 0xdc, 0xfe, 0xef, - 0x16, 0x9c, 0x48, 0xf7, 0x35, 0x66, 0xa9, 0x24, 0x7c, 0x98, 0xdc, 0xb8, 0x11, 0x6c, 0x91, 0x68, - 0x87, 0xbe, 0xb9, 0x95, 0x49, 0x25, 0xe9, 0xc2, 0xc0, 0x39, 0x4f, 0xb1, 0xf2, 0xad, 0x4d, 0x35, - 0xda, 0x72, 0x46, 0xde, 0x2c, 0x72, 0x46, 0xea, 0x8f, 0x69, 0x1e, 0x97, 0x2b, 0x96, 0xd8, 0xe4, - 0x6f, 0x7f, 0x7b, 0x00, 0x54, 0x5e, 0x2c, 0x8b, 0x3f, 0x2a, 0x28, 0x7a, 0xeb, 0xa0, 0x19, 0x44, - 0x6a, 0x32, 0x0c, 0xec, 0x15, 0x10, 0xc0, 0xbd, 0x24, 0xa6, 0xeb, 0x52, 0xbd, 0xe1, 0xaa, 0x06, - 0x61, 0x13, 0x8f, 0xf6, 0xc4, 0x73, 0xb7, 0x08, 0x7f, 0x68, 0x30, 0xdd, 0x93, 0x05, 0x09, 0xc0, - 0x1a, 0x87, 0xf6, 0xa4, 0xe9, 0xae, 0xaf, 0x8b, 0x2d, 0xbf, 0xea, 0x09, 0x1d, 0x1d, 0xcc, 0x20, - 0xbc, 0x22, 0x77, 0xb0, 0x29, 0xac, 0x60, 0xa3, 0x22, 0x77, 0xb0, 0x89, 0x19, 0x84, 0xda, 0x6d, - 0x7e, 0x10, 0xb5, 0xd9, 0x25, 0xf5, 0x4d, 0xc5, 0x45, 0x58, 0xbf, 0xca, 0x6e, 0xbb, 0xde, 0x8d, - 0x82, 0xf3, 0x9e, 0xa3, 0x33, 0x30, 0x8c, 0x48, 0xd3, 0x6d, 0x24, 0x26, 0x35, 0x48, 0xcf, 0xc0, - 0xe5, 0x2e, 0x0c, 0x9c, 0xf3, 0x14, 0x9a, 0x86, 0x13, 0x32, 0xaf, 0x59, 0x56, 0xad, 0x19, 0x4e, - 0x57, 0xc9, 0xc0, 0x69, 0x30, 0xce, 0xe2, 0x53, 0xa9, 0xd6, 0x16, 0x05, 0xab, 0x98, 0xb1, 0x6c, - 0x48, 0x35, 0x59, 0xc8, 0x0a, 0x2b, 0x0c, 0xfb, 0x13, 0x65, 0xaa, 0x85, 0x7b, 0x14, 0x6a, 0xbb, - 0x6f, 0xd1, 0x82, 0xe9, 0x19, 0x39, 0xd0, 0xc7, 0x8c, 0x7c, 0x1e, 0x46, 0x6e, 0xc7, 0x81, 0xaf, - 0x22, 0xf1, 0x2a, 0x3d, 0x23, 0xf1, 0x0c, 0xac, 0xfc, 0x48, 0xbc, 0xc1, 0xa2, 0x22, 0xf1, 0x86, - 0x0e, 0x19, 0x89, 0xf7, 0xcd, 0x0a, 0xa8, 0xab, 0x41, 0xae, 0x93, 0xe4, 0x4e, 0x10, 0x6d, 0xba, - 0x7e, 0x8b, 0xe5, 0x83, 0x7f, 0xd5, 0x82, 0x11, 0xbe, 0x5e, 0x16, 0xcc, 0x4c, 0xaa, 0xf5, 0x82, - 0xee, 0x9c, 0x48, 0x31, 0x9b, 0x5c, 0x35, 0x18, 0x65, 0x2e, 0xf3, 0x34, 0x41, 0x38, 0xd5, 0x23, - 0xf4, 0x51, 0x00, 0xe9, 0x1f, 0x5d, 0x97, 0x22, 0x73, 0xbe, 0x98, 0xfe, 0x61, 0xb2, 0xae, 0x6d, - 0xe0, 0x55, 0xc5, 0x04, 0x1b, 0x0c, 0xd1, 0xa7, 0x75, 0x96, 0x19, 0x0f, 0xd9, 0xff, 0xf0, 0xb1, - 0x8c, 0x4d, 0x3f, 0x39, 0x66, 0x18, 0x86, 0x5c, 0xbf, 0x45, 0xe7, 0x89, 0x88, 0x58, 0x7a, 0x57, - 0x5e, 0x2d, 0x85, 0x85, 0xc0, 0x69, 0xd6, 0x1d, 0xcf, 0xf1, 0x1b, 0x24, 0x9a, 0xe7, 0xe8, 0xe6, - 0x15, 0xd6, 0xac, 0x01, 0x4b, 0x42, 0x5d, 0x97, 0xaa, 0x54, 0xfa, 0xb9, 0x54, 0xe5, 0xfc, 0xfb, - 0xe0, 0x54, 0xd7, 0xc7, 0x3c, 0x50, 0x4a, 0xd9, 0xe1, 0xb3, 0xd1, 0xec, 0x7f, 0x31, 0xa8, 0x95, - 0xd6, 0xf5, 0xa0, 0xc9, 0xaf, 0xf6, 0x88, 0xf4, 0x17, 0x15, 0x36, 0x6e, 0x81, 0x53, 0xc4, 0xb8, - 0x06, 0x5b, 0x35, 0x62, 0x93, 0x25, 0x9d, 0xa3, 0xa1, 0x13, 0x11, 0xff, 0xb8, 0xe7, 0xe8, 0xb2, - 0x62, 0x82, 0x0d, 0x86, 0x68, 0x23, 0x95, 0x53, 0x72, 0xf9, 0xe8, 0x39, 0x25, 0xac, 0xca, 0x54, - 0x5e, 0x35, 0xfe, 0x2f, 0x58, 0x30, 0xe6, 0xa7, 0x66, 0x6e, 0x31, 0x61, 0xa4, 0xf9, 0xab, 0x82, - 0xdf, 0x2c, 0x95, 0x6e, 0xc3, 0x19, 0xfe, 0x79, 0x2a, 0xad, 0x72, 0x40, 0x95, 0xa6, 0xef, 0x08, - 0x1a, 0xec, 0x75, 0x47, 0x10, 0xf2, 0xd5, 0x25, 0x69, 0x43, 0x85, 0x5f, 0x92, 0x06, 0x39, 0x17, - 0xa4, 0xdd, 0x82, 0x5a, 0x23, 0x22, 0x4e, 0x72, 0xc8, 0xfb, 0xb2, 0xd8, 0x01, 0xfd, 0x8c, 0x24, - 0x80, 0x35, 0x2d, 0xfb, 0xff, 0x0c, 0xc0, 0x49, 0x39, 0x22, 0x32, 0x04, 0x9d, 0xea, 0x47, 0xce, - 0x57, 0x1b, 0xb7, 0x4a, 0x3f, 0x5e, 0x91, 0x00, 0xac, 0x71, 0xa8, 0x3d, 0xd6, 0x89, 0xc9, 0x52, - 0x48, 0xfc, 0x05, 0x77, 0x2d, 0x16, 0xe7, 0x9c, 0x6a, 0xa1, 0xdc, 0xd0, 0x20, 0x6c, 0xe2, 0x51, - 0x63, 0x9c, 0xdb, 0xc5, 0x71, 0x36, 0x7d, 0x45, 0xd8, 0xdb, 0x58, 0xc2, 0xd1, 0x2f, 0xe4, 0x56, - 0x8e, 0x2d, 0x26, 0x71, 0xab, 0x2b, 0xf2, 0xfe, 0x80, 0x57, 0x2c, 0xfe, 0x6d, 0x0b, 0xce, 0xf2, - 0x56, 0x39, 0x92, 0x37, 0xc2, 0xa6, 0x93, 0x90, 0xb8, 0x98, 0x4a, 0xee, 0x39, 0xfd, 0xd3, 0x4e, - 0xde, 0x3c, 0xb6, 0x38, 0xbf, 0x37, 0xe8, 0x4d, 0x0b, 0x4e, 0x6c, 0xa6, 0x6a, 0x7e, 0x48, 0xd5, - 0x71, 0xd4, 0x74, 0xfc, 0x14, 0x51, 0xbd, 0xd4, 0xd2, 0xed, 0x31, 0xce, 0x72, 0xb7, 0xff, 0xcc, - 0x02, 0x53, 0x8c, 0xde, 0xff, 0x52, 0x21, 0x07, 0x37, 0x05, 0xa5, 0x75, 0x59, 0xe9, 0x69, 0x5d, - 0x3e, 0x0e, 0xe5, 0x8e, 0xdb, 0x14, 0xfb, 0x0b, 0x7d, 0xfa, 0x3a, 0x3f, 0x8b, 0x69, 0xbb, 0xfd, - 0x4f, 0x2b, 0xda, 0x6f, 0x21, 0xf2, 0xa2, 0xbe, 0x27, 0x5e, 0x7b, 0x5d, 0x15, 0x1b, 0xe3, 0x6f, - 0x7e, 0xbd, 0xab, 0xd8, 0xd8, 0x8f, 0x1e, 0x3c, 0xed, 0x8d, 0x0f, 0x50, 0xaf, 0x5a, 0x63, 0x43, - 0xfb, 0xe4, 0xbc, 0xdd, 0x86, 0x2a, 0xdd, 0x82, 0x31, 0x07, 0x64, 0x35, 0xd5, 0xa9, 0xea, 0x15, - 0xd1, 0x7e, 0x6f, 0x77, 0xe2, 0x47, 0x0e, 0xde, 0x2d, 0xf9, 0x34, 0x56, 0xf4, 0x51, 0x0c, 0x35, - 0xfa, 0x9b, 0xa5, 0xe7, 0x89, 0xcd, 0xdd, 0x0d, 0x25, 0x33, 0x25, 0xa0, 0x90, 0xdc, 0x3f, 0xcd, - 0x07, 0xf9, 0x50, 0x63, 0xb7, 0xd1, 0x32, 0xa6, 0x7c, 0x0f, 0xb8, 0xac, 0x92, 0xe4, 0x24, 0xe0, - 0xde, 0xee, 0xc4, 0x4b, 0x07, 0x67, 0xaa, 0x1e, 0xc7, 0x9a, 0x85, 0xfd, 0xc5, 0x01, 0x3d, 0x77, - 0x45, 0x8d, 0xb9, 0xef, 0x89, 0xb9, 0xfb, 0x62, 0x66, 0xee, 0x5e, 0xe8, 0x9a, 0xbb, 0x63, 0xfa, - 0xd6, 0xd4, 0xd4, 0x6c, 0xbc, 0xdf, 0x86, 0xc0, 0xfe, 0xfe, 0x06, 0x66, 0x01, 0xbd, 0xde, 0x71, - 0x23, 0x12, 0x2f, 0x47, 0x1d, 0xdf, 0xf5, 0x5b, 0x6c, 0x3a, 0x56, 0x4d, 0x0b, 0x28, 0x05, 0xc6, - 0x59, 0x7c, 0xba, 0xa9, 0xa7, 0xdf, 0xfc, 0x96, 0xb3, 0xc5, 0x67, 0x95, 0x51, 0x76, 0x6b, 0x45, - 0xb4, 0x63, 0x85, 0x61, 0x7f, 0x9d, 0x9d, 0x65, 0x1b, 0x79, 0xc1, 0x74, 0x4e, 0x78, 0xec, 0xfa, - 0x5f, 0x5e, 0xb3, 0x4b, 0xcd, 0x09, 0x7e, 0xe7, 0x2f, 0x87, 0xa1, 0x3b, 0x30, 0xb4, 0xc6, 0xef, - 0xbf, 0x2b, 0xa6, 0x3e, 0xb9, 0xb8, 0x4c, 0x8f, 0xdd, 0x72, 0x22, 0x6f, 0xd6, 0xbb, 0xa7, 0x7f, - 0x62, 0xc9, 0xcd, 0xfe, 0xfd, 0x0a, 0x9c, 0xc8, 0x5c, 0x10, 0x9b, 0xaa, 0x96, 0x5a, 0xda, 0xb7, - 0x5a, 0xea, 0x87, 0x00, 0x9a, 0x24, 0xf4, 0x82, 0x1d, 0x66, 0x8e, 0x0d, 0x1c, 0xd8, 0x1c, 0x53, - 0x16, 0xfc, 0xac, 0xa2, 0x82, 0x0d, 0x8a, 0xa2, 0x50, 0x19, 0x2f, 0xbe, 0x9a, 0x29, 0x54, 0x66, - 0xdc, 0x62, 0x30, 0x78, 0x7f, 0x6f, 0x31, 0x70, 0xe1, 0x04, 0xef, 0xa2, 0xca, 0xbe, 0x3d, 0x44, - 0x92, 0x2d, 0xcb, 0x5f, 0x98, 0x4d, 0x93, 0xc1, 0x59, 0xba, 0x0f, 0xf2, 0xfe, 0x67, 0xf4, 0x6e, - 0xa8, 0xc9, 0xef, 0x1c, 0x8f, 0xd7, 0x74, 0x05, 0x03, 0x39, 0x0d, 0xd8, 0xbd, 0xcc, 0xe2, 0x67, - 0x57, 0x21, 0x01, 0x78, 0x50, 0x85, 0x04, 0xec, 0xcf, 0x97, 0xa8, 0x1d, 0xcf, 0xfb, 0xa5, 0x6a, - 0xe2, 0x3c, 0x05, 0x83, 0x4e, 0x27, 0xd9, 0x08, 0xba, 0x6e, 0xf3, 0x9b, 0x66, 0xad, 0x58, 0x40, - 0xd1, 0x02, 0x0c, 0x34, 0x75, 0x9d, 0x93, 0x83, 0x7c, 0x4f, 0xed, 0x12, 0x75, 0x12, 0x82, 0x19, - 0x15, 0xf4, 0x18, 0x0c, 0x24, 0x4e, 0x4b, 0xa6, 0x5c, 0xb1, 0x34, 0xdb, 0x55, 0xa7, 0x15, 0x63, - 0xd6, 0x6a, 0xaa, 0xef, 0x81, 0x7d, 0xd4, 0xf7, 0x4b, 0x30, 0x1a, 0xbb, 0x2d, 0xdf, 0x49, 0x3a, - 0x11, 0x31, 0x8e, 0xf9, 0x74, 0xe4, 0x86, 0x09, 0xc4, 0x69, 0x5c, 0xfb, 0x37, 0x47, 0xe0, 0xcc, - 0xca, 0xcc, 0xa2, 0xac, 0xde, 0x7d, 0x6c, 0x59, 0x53, 0x79, 0x3c, 0xee, 0x5f, 0xd6, 0x54, 0x0f, - 0xee, 0x9e, 0x91, 0x35, 0xe5, 0x19, 0x59, 0x53, 0xe9, 0x14, 0x96, 0x72, 0x11, 0x29, 0x2c, 0x79, - 0x3d, 0xe8, 0x27, 0x85, 0xe5, 0xd8, 0xd2, 0xa8, 0xf6, 0xec, 0xd0, 0x81, 0xd2, 0xa8, 0x54, 0x8e, - 0x59, 0x21, 0xc9, 0x05, 0x3d, 0x3e, 0x55, 0x6e, 0x8e, 0x99, 0xca, 0xef, 0xe1, 0x89, 0x33, 0x42, - 0xd4, 0xbf, 0x5a, 0x7c, 0x07, 0xfa, 0xc8, 0xef, 0x11, 0xb9, 0x3b, 0x66, 0x4e, 0xd9, 0x50, 0x11, - 0x39, 0x65, 0x79, 0xdd, 0xd9, 0x37, 0xa7, 0xec, 0x25, 0x18, 0x6d, 0x78, 0x81, 0x4f, 0x96, 0xa3, - 0x20, 0x09, 0x1a, 0x81, 0x27, 0xcc, 0x7a, 0x25, 0x12, 0x66, 0x4c, 0x20, 0x4e, 0xe3, 0xf6, 0x4a, - 0x48, 0xab, 0x1d, 0x35, 0x21, 0x0d, 0x1e, 0x50, 0x42, 0xda, 0xcf, 0xea, 0xd4, 0xe9, 0x61, 0xf6, - 0x45, 0x3e, 0x54, 0xfc, 0x17, 0xe9, 0x27, 0x7f, 0x1a, 0xbd, 0xc5, 0xaf, 0xd3, 0xa3, 0x86, 0xf1, - 0x4c, 0xd0, 0xa6, 0x86, 0xdf, 0x08, 0x1b, 0x92, 0xd7, 0x8e, 0x61, 0xc2, 0xde, 0x5a, 0xd1, 0x6c, - 0xd4, 0x15, 0x7b, 0xba, 0x09, 0xa7, 0x3b, 0x72, 0x94, 0xd4, 0xee, 0x2f, 0x97, 0xe0, 0xfb, 0xf6, - 0xed, 0x02, 0xba, 0x03, 0x90, 0x38, 0x2d, 0x31, 0x51, 0xc5, 0x81, 0xc9, 0x11, 0xc3, 0x2b, 0x57, - 0x25, 0x3d, 0x5e, 0x93, 0x44, 0xfd, 0x65, 0x47, 0x11, 0xf2, 0x37, 0x8b, 0xaa, 0x0c, 0xbc, 0xae, - 0xd2, 0x8d, 0x38, 0xf0, 0x08, 0x66, 0x10, 0xaa, 0xfe, 0x23, 0xd2, 0xd2, 0xf7, 0x3f, 0xab, 0xcf, - 0x87, 0x59, 0x2b, 0x16, 0x50, 0xf4, 0x02, 0x0c, 0x3b, 0x9e, 0xc7, 0xf3, 0x63, 0x48, 0x2c, 0xee, - 0xd3, 0xd1, 0x35, 0xe4, 0x34, 0x08, 0x9b, 0x78, 0xf6, 0x9f, 0x96, 0x60, 0x62, 0x1f, 0x99, 0xd2, - 0x95, 0xf1, 0x57, 0xe9, 0x3b, 0xe3, 0x4f, 0xe4, 0x28, 0x0c, 0xf6, 0xc8, 0x51, 0x78, 0x01, 0x86, - 0x13, 0xe2, 0xb4, 0x45, 0x40, 0x96, 0xf0, 0x04, 0xe8, 0x13, 0x60, 0x0d, 0xc2, 0x26, 0x1e, 0x95, - 0x62, 0x63, 0x4e, 0xa3, 0x41, 0xe2, 0x58, 0x26, 0x21, 0x08, 0x6f, 0x6a, 0x61, 0x19, 0x0e, 0xcc, - 0x49, 0x3d, 0x9d, 0x62, 0x81, 0x33, 0x2c, 0xb3, 0x03, 0x5e, 0xeb, 0x73, 0xc0, 0xbf, 0x56, 0x82, - 0xc7, 0xf7, 0xd4, 0x6e, 0x7d, 0xe7, 0x87, 0x74, 0x62, 0x12, 0x65, 0x27, 0xce, 0x8d, 0x98, 0x44, - 0x98, 0x41, 0xf8, 0x28, 0x85, 0xa1, 0x71, 0xbf, 0x76, 0xd1, 0xc9, 0x4b, 0x7c, 0x94, 0x52, 0x2c, - 0x70, 0x86, 0xe5, 0x61, 0xa7, 0xe5, 0xdf, 0x2f, 0xc1, 0x93, 0x7d, 0xd8, 0x00, 0x05, 0x26, 0x79, - 0xa5, 0x53, 0xed, 0xca, 0x0f, 0x28, 0x23, 0xf2, 0x90, 0xc3, 0xf5, 0xf5, 0x12, 0x9c, 0xef, 0xad, - 0x8a, 0xd1, 0x8f, 0xc1, 0x89, 0x48, 0x45, 0x61, 0x99, 0x59, 0x7a, 0xa7, 0xb9, 0x27, 0x21, 0x05, - 0xc2, 0x59, 0x5c, 0x34, 0x09, 0x10, 0x3a, 0xc9, 0x46, 0x7c, 0x69, 0xdb, 0x8d, 0x13, 0x51, 0x85, - 0x66, 0x8c, 0x9f, 0x5d, 0xc9, 0x56, 0x6c, 0x60, 0x50, 0x76, 0xec, 0xdf, 0x6c, 0x70, 0x3d, 0x48, - 0xf8, 0x43, 0x7c, 0x1b, 0x71, 0x5a, 0xde, 0xd9, 0x61, 0x80, 0x70, 0x16, 0x97, 0xb2, 0x63, 0xa7, - 0xa3, 0xbc, 0xa3, 0x7c, 0x7f, 0xc1, 0xd8, 0x2d, 0xa8, 0x56, 0x6c, 0x60, 0x64, 0xf3, 0x0f, 0x2b, - 0xfb, 0xe7, 0x1f, 0xda, 0xff, 0xa4, 0x04, 0xe7, 0x7a, 0x9a, 0x72, 0xfd, 0x2d, 0xc0, 0x87, 0x2f, - 0x67, 0xf0, 0x70, 0x73, 0xe7, 0x80, 0xb9, 0x6d, 0x7f, 0xdc, 0x63, 0xa6, 0x89, 0xdc, 0xb6, 0xc3, - 0x27, 0x87, 0x3f, 0x7c, 0xe3, 0xd9, 0x95, 0xce, 0x36, 0x70, 0x80, 0x74, 0xb6, 0xcc, 0xc7, 0xa8, - 0xf4, 0xb9, 0x90, 0xff, 0xbc, 0xdc, 0x73, 0x78, 0xe9, 0xd6, 0xaf, 0x2f, 0x3f, 0xed, 0x2c, 0x9c, - 0x74, 0x7d, 0x76, 0x7f, 0xd3, 0x4a, 0x67, 0x4d, 0x14, 0x26, 0x29, 0xa5, 0x6f, 0x4f, 0x9f, 0xcf, - 0xc0, 0x71, 0xd7, 0x13, 0x0f, 0x61, 0x7a, 0xe1, 0xe1, 0x86, 0xf4, 0x60, 0x09, 0xae, 0x68, 0x09, - 0xce, 0xca, 0xa1, 0xd8, 0x70, 0x22, 0xd2, 0x14, 0x6a, 0x24, 0x16, 0x09, 0x15, 0xe7, 0x78, 0x52, - 0x46, 0x0e, 0x02, 0xce, 0x7f, 0x8e, 0x5d, 0x99, 0x13, 0x84, 0x6e, 0x43, 0x6c, 0x72, 0xf4, 0x95, - 0x39, 0xb4, 0x11, 0x73, 0x98, 0xfd, 0x21, 0xa8, 0xa9, 0xf7, 0xe7, 0x61, 0xdd, 0x6a, 0xd2, 0x75, - 0x85, 0x75, 0xab, 0x19, 0x67, 0x60, 0xd1, 0xaf, 0x45, 0x4d, 0xe2, 0xcc, 0xea, 0xb9, 0x46, 0x76, - 0x98, 0x7d, 0x6c, 0xff, 0x10, 0x8c, 0x28, 0x3f, 0x4b, 0xbf, 0x17, 0x09, 0xd9, 0x5f, 0x1c, 0x84, - 0xd1, 0x54, 0x71, 0xc0, 0x94, 0x83, 0xd5, 0xda, 0xd7, 0xc1, 0xca, 0xc2, 0xf4, 0x3b, 0xbe, 0xbc, - 0x65, 0xcc, 0x08, 0xd3, 0xef, 0xf8, 0x04, 0x73, 0x18, 0x35, 0x6f, 0x9b, 0xd1, 0x0e, 0xee, 0xf8, - 0x22, 0x9c, 0x56, 0x99, 0xb7, 0xb3, 0xac, 0x15, 0x0b, 0x28, 0xfa, 0xb8, 0x05, 0x23, 0x31, 0xf3, - 0xde, 0x73, 0xf7, 0xb4, 0x98, 0x74, 0x57, 0x8f, 0x5e, 0xfb, 0x50, 0x15, 0xc2, 0x64, 0x11, 0x32, - 0x66, 0x0b, 0x4e, 0x71, 0x44, 0x9f, 0xb2, 0xa0, 0xa6, 0x2e, 0x43, 0x11, 0x57, 0x01, 0xae, 0x14, - 0x5b, 0x7b, 0x91, 0xfb, 0x35, 0xd5, 0x41, 0x88, 0x2a, 0x82, 0x87, 0x35, 0x63, 0x14, 0x2b, 0xdf, - 0xf1, 0xd0, 0xf1, 0xf8, 0x8e, 0x21, 0xc7, 0x6f, 0xfc, 0x6e, 0xa8, 0xb5, 0x1d, 0xdf, 0x5d, 0x27, - 0x71, 0xc2, 0xdd, 0xb9, 0xb2, 0x24, 0xac, 0x6c, 0xc4, 0x1a, 0x4e, 0x15, 0x72, 0xcc, 0x5e, 0x2c, - 0x31, 0xfc, 0xaf, 0x4c, 0x21, 0xaf, 0xe8, 0x66, 0x6c, 0xe2, 0x98, 0xce, 0x62, 0x78, 0xa0, 0xce, - 0xe2, 0xe1, 0xbd, 0x9d, 0xc5, 0xf6, 0x3f, 0xb4, 0xe0, 0x6c, 0xee, 0x57, 0x7b, 0x78, 0x03, 0x1f, - 0xed, 0x2f, 0x55, 0xe0, 0x74, 0x4e, 0x95, 0x4f, 0xb4, 0x63, 0xce, 0x67, 0xab, 0x88, 0x18, 0x82, - 0xf4, 0x91, 0xb8, 0x1c, 0xc6, 0x9c, 0x49, 0x7c, 0xb0, 0xa3, 0x1a, 0x7d, 0x5c, 0x52, 0xbe, 0xbf, - 0xc7, 0x25, 0xc6, 0xb4, 0x1c, 0x78, 0xa0, 0xd3, 0xb2, 0xb2, 0xcf, 0x19, 0xc6, 0xaf, 0x59, 0x30, - 0xde, 0xee, 0x51, 0x5a, 0x5e, 0x38, 0x1e, 0x6f, 0x1e, 0x4f, 0xe1, 0xfa, 0xfa, 0x63, 0x77, 0x77, - 0x27, 0x7a, 0x56, 0xf4, 0xc7, 0x3d, 0x7b, 0x65, 0x7f, 0xbb, 0x0c, 0xac, 0xc4, 0x2c, 0xab, 0xe4, - 0xb6, 0x83, 0x3e, 0x66, 0x16, 0x0b, 0xb6, 0x8a, 0x2a, 0x6c, 0xcb, 0x89, 0xab, 0x62, 0xc3, 0x7c, - 0x04, 0xf3, 0x6a, 0x0f, 0x67, 0x85, 0x56, 0xa9, 0x0f, 0xa1, 0xe5, 0xc9, 0xaa, 0xcc, 0xe5, 0xe2, - 0xab, 0x32, 0xd7, 0xb2, 0x15, 0x99, 0xf7, 0xfe, 0xc4, 0x03, 0x0f, 0xe5, 0x27, 0xfe, 0x45, 0x8b, - 0x0b, 0x9e, 0xcc, 0x57, 0xd0, 0x96, 0x81, 0xb5, 0x87, 0x65, 0xf0, 0x0c, 0x54, 0x63, 0xe2, 0xad, - 0x5f, 0x21, 0x8e, 0x27, 0x2c, 0x08, 0x7d, 0x7e, 0x2d, 0xda, 0xb1, 0xc2, 0x60, 0xd7, 0xb6, 0x7a, - 0x5e, 0x70, 0xe7, 0x52, 0x3b, 0x4c, 0x76, 0x84, 0x2d, 0xa1, 0xaf, 0x6d, 0x55, 0x10, 0x6c, 0x60, - 0xd9, 0x7f, 0xab, 0xc4, 0x67, 0xa0, 0x08, 0x82, 0x78, 0x31, 0x73, 0xd1, 0x5e, 0xff, 0xf1, 0x03, - 0x1f, 0x01, 0x68, 0xa8, 0x2b, 0xea, 0xc5, 0x99, 0xd0, 0x95, 0x23, 0xdf, 0x9f, 0x2d, 0xe8, 0xe9, - 0xd7, 0xd0, 0x6d, 0xd8, 0xe0, 0x97, 0x92, 0xa5, 0xe5, 0x7d, 0x65, 0x69, 0x4a, 0xac, 0x0c, 0xec, - 0xa3, 0xed, 0xfe, 0xd4, 0x82, 0x94, 0x45, 0x84, 0x42, 0xa8, 0xd0, 0xee, 0xee, 0x14, 0x73, 0xfb, - 0xbe, 0x49, 0x9a, 0x8a, 0x46, 0x31, 0xed, 0xd9, 0x4f, 0xcc, 0x19, 0x21, 0x4f, 0xc4, 0x4a, 0xf0, - 0x51, 0xbd, 0x5e, 0x1c, 0xc3, 0x2b, 0x41, 0xb0, 0xc9, 0x0f, 0x36, 0x75, 0xdc, 0x85, 0xfd, 0x22, - 0x9c, 0xea, 0xea, 0x14, 0xbb, 0x53, 0x2b, 0xa0, 0xda, 0x27, 0x33, 0x5d, 0x59, 0x02, 0x27, 0xe6, - 0x30, 0xfb, 0xeb, 0x16, 0x9c, 0xcc, 0x92, 0x47, 0x6f, 0x59, 0x70, 0x2a, 0xce, 0xd2, 0x3b, 0xae, - 0xb1, 0x53, 0xf1, 0x8e, 0x5d, 0x20, 0xdc, 0xdd, 0x09, 0xfb, 0xff, 0x8a, 0xc9, 0x7f, 0xcb, 0xf5, - 0x9b, 0xc1, 0x1d, 0x65, 0x98, 0x58, 0x3d, 0x0d, 0x13, 0xba, 0x1e, 0x1b, 0x1b, 0xa4, 0xd9, 0xf1, - 0xba, 0x32, 0x47, 0x57, 0x44, 0x3b, 0x56, 0x18, 0x2c, 0x51, 0xae, 0x23, 0xca, 0xb6, 0x67, 0x26, - 0xe5, 0xac, 0x68, 0xc7, 0x0a, 0x03, 0x3d, 0x0f, 0x23, 0xc6, 0x4b, 0xca, 0x79, 0xc9, 0x0c, 0x72, - 0x43, 0x65, 0xc6, 0x38, 0x85, 0x85, 0x26, 0x01, 0x94, 0x91, 0x23, 0x55, 0x24, 0x73, 0x14, 0x29, - 0x49, 0x14, 0x63, 0x03, 0x83, 0xa5, 0xa5, 0x7a, 0x9d, 0x98, 0xf9, 0xf8, 0x07, 0x75, 0x29, 0xd1, - 0x19, 0xd1, 0x86, 0x15, 0x94, 0x4a, 0x93, 0xb6, 0xe3, 0x77, 0x1c, 0x8f, 0x8e, 0x90, 0xd8, 0xfa, - 0xa9, 0x65, 0xb8, 0xa8, 0x20, 0xd8, 0xc0, 0xa2, 0x6f, 0x9c, 0xb8, 0x6d, 0xf2, 0x4a, 0xe0, 0xcb, - 0x38, 0x35, 0x7d, 0xec, 0x23, 0xda, 0xb1, 0xc2, 0xb0, 0xff, 0xab, 0x05, 0x27, 0x74, 0x92, 0x3b, - 0xbf, 0x3d, 0xdb, 0xdc, 0xa9, 0x5a, 0xfb, 0xee, 0x54, 0xd3, 0xd9, 0xbf, 0xa5, 0xbe, 0xb2, 0x7f, - 0xcd, 0xc4, 0xdc, 0xf2, 0x9e, 0x89, 0xb9, 0xdf, 0xaf, 0x6f, 0x66, 0xe5, 0x19, 0xbc, 0xc3, 0x79, - 0xb7, 0xb2, 0x22, 0x1b, 0x06, 0x1b, 0x8e, 0xaa, 0xf0, 0x32, 0xc2, 0xf7, 0x0e, 0x33, 0xd3, 0x0c, - 0x49, 0x40, 0xec, 0x25, 0xa8, 0xa9, 0xd3, 0x0f, 0xb9, 0x51, 0xb5, 0xf2, 0x37, 0xaa, 0x7d, 0x25, - 0x08, 0xd6, 0xd7, 0xbe, 0xf1, 0x9d, 0x27, 0xde, 0xf1, 0x7b, 0xdf, 0x79, 0xe2, 0x1d, 0x7f, 0xf4, - 0x9d, 0x27, 0xde, 0xf1, 0xf1, 0xbb, 0x4f, 0x58, 0xdf, 0xb8, 0xfb, 0x84, 0xf5, 0x7b, 0x77, 0x9f, - 0xb0, 0xfe, 0xe8, 0xee, 0x13, 0xd6, 0xb7, 0xef, 0x3e, 0x61, 0x7d, 0xe1, 0x3f, 0x3d, 0xf1, 0x8e, - 0x57, 0x72, 0x03, 0x15, 0xe9, 0x8f, 0x67, 0x1b, 0xcd, 0xa9, 0xad, 0x8b, 0x2c, 0x56, 0x8e, 0x2e, - 0xaf, 0x29, 0x63, 0x4e, 0x4d, 0xc9, 0xe5, 0xf5, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x87, 0xd4, - 0x96, 0xc0, 0xad, 0xe1, 0x00, 0x00, + 0xe9, 0x75, 0x46, 0x37, 0x09, 0xb0, 0xee, 0xfa, 0x8e, 0xe7, 0xbe, 0x4e, 0xb7, 0x27, 0x15, 0xa6, + 0x61, 0x99, 0xc9, 0x72, 0x49, 0xb5, 0x62, 0x03, 0xe3, 0xdc, 0x5f, 0x82, 0x61, 0xe3, 0xcd, 0x73, + 0x82, 0x2b, 0xce, 0x98, 0xc1, 0x15, 0x35, 0x23, 0x26, 0xe2, 0xdc, 0xfb, 0xe0, 0x64, 0xb6, 0x83, + 0x07, 0x79, 0xde, 0xfe, 0xdf, 0x43, 0xd9, 0x53, 0xac, 0x55, 0x12, 0xb5, 0x69, 0xd7, 0xde, 0xf2, + 0x2c, 0xbd, 0xe5, 0x59, 0x7a, 0xcb, 0xb3, 0x64, 0x1e, 0x0e, 0x08, 0xaf, 0xc9, 0xd0, 0x3d, 0xf2, + 0x9a, 0xa4, 0xfc, 0x40, 0xd5, 0xc2, 0xfd, 0x40, 0xf6, 0xff, 0xea, 0x32, 0x28, 0x6e, 0x32, 0x7f, + 0xc1, 0x16, 0xf1, 0x13, 0x74, 0x35, 0x65, 0x20, 0xfd, 0x70, 0xe6, 0xf4, 0xf5, 0x1d, 0xbd, 0xd2, + 0x01, 0x6e, 0x53, 0x0a, 0x93, 0x8c, 0x84, 0x61, 0x4b, 0x7d, 0xce, 0x82, 0x31, 0x27, 0xc5, 0xa9, + 0xb0, 0x18, 0x78, 0xd3, 0x73, 0xfe, 0x90, 0xe8, 0x65, 0x26, 0xf6, 0x01, 0x67, 0x78, 0xdb, 0x77, + 0x2a, 0x90, 0x32, 0x20, 0xf9, 0x44, 0x7b, 0x27, 0x0c, 0x45, 0x24, 0x0c, 0xae, 0xe3, 0x05, 0xf1, + 0xd2, 0x3a, 0xc9, 0x80, 0x37, 0x63, 0x09, 0xa7, 0x4a, 0x36, 0x74, 0x92, 0x0d, 0xa1, 0x3d, 0x95, + 0x92, 0x5d, 0x76, 0x92, 0x0d, 0xcc, 0x20, 0xe8, 0x7d, 0x30, 0x96, 0x38, 0x51, 0x8b, 0x6e, 0x34, + 0xb6, 0xd8, 0x7c, 0x16, 0x87, 0xbc, 0xaa, 0x8b, 0xab, 0x29, 0x28, 0xce, 0x60, 0xa3, 0xd7, 0x60, + 0x60, 0x83, 0x78, 0x6d, 0x31, 0xd7, 0x56, 0x8a, 0x1b, 0x26, 0xf6, 0xae, 0x97, 0x89, 0xd7, 0xe6, + 0xa2, 0x97, 0xfe, 0xc2, 0x8c, 0x15, 0x5d, 0x68, 0xb5, 0xcd, 0x4e, 0x9c, 0x04, 0x6d, 0xf7, 0x75, + 0xe9, 0xdb, 0xfc, 0x40, 0xc1, 0x8c, 0xaf, 0x4a, 0xfa, 0xdc, 0x89, 0xa4, 0xfe, 0x62, 0xcd, 0x99, + 0xf5, 0xa3, 0xe9, 0x46, 0x6c, 0x8e, 0xee, 0x08, 0x17, 0x65, 0xd1, 0xfd, 0x98, 0x95, 0xf4, 0x79, + 0x3f, 0xd4, 0x5f, 0xac, 0x39, 0xa3, 0x1d, 0xb5, 0xe0, 0x87, 0x59, 0x1f, 0xae, 0x17, 0xdc, 0x07, + 0xbe, 0xd8, 0x73, 0x17, 0xfe, 0x13, 0x50, 0x69, 0x6c, 0x38, 0x51, 0x32, 0x3e, 0xc2, 0x26, 0x8d, + 0x72, 0x66, 0xcd, 0xd0, 0x46, 0xcc, 0x61, 0xe8, 0x31, 0x28, 0x47, 0x64, 0x9d, 0x05, 0xac, 0x1a, + 0xa1, 0x4c, 0x98, 0xac, 0x63, 0xda, 0x6e, 0xff, 0x62, 0x29, 0x6d, 0x27, 0xa6, 0xdf, 0x9b, 0xcf, + 0xf6, 0x46, 0x27, 0x8a, 0xa5, 0xc3, 0xcb, 0x98, 0xed, 0xac, 0x19, 0x4b, 0x38, 0xfa, 0xa4, 0x05, + 0x43, 0xb7, 0xe2, 0xc0, 0xf7, 0xd5, 0xb2, 0xbd, 0x51, 0xf0, 0x50, 0x5c, 0xe1, 0xd4, 0x75, 0x1f, + 0x44, 0x03, 0x96, 0x7c, 0x69, 0x77, 0xc9, 0x76, 0xc3, 0xeb, 0x34, 0xbb, 0xa2, 0x53, 0x2e, 0xf2, + 0x66, 0x2c, 0xe1, 0x14, 0xd5, 0xf5, 0x39, 0xea, 0x40, 0x1a, 0x75, 0xde, 0x17, 0xa8, 0x02, 0x6e, + 0xff, 0xf5, 0x41, 0x38, 0x9b, 0xbb, 0x38, 0xa8, 0x05, 0xc7, 0x6c, 0xa4, 0x4b, 0xae, 0x47, 0x64, + 0x5c, 0x16, 0xb3, 0xe0, 0x6e, 0xa8, 0x56, 0x6c, 0x60, 0xa0, 0x9f, 0x04, 0x08, 0x9d, 0xc8, 0x69, + 0x13, 0xe5, 0x90, 0x3e, 0xb2, 0xa1, 0x44, 0xfb, 0xb1, 0x2c, 0x69, 0xea, 0x4d, 0xb9, 0x6a, 0x8a, + 0xb1, 0xc1, 0x12, 0x3d, 0x0f, 0xc3, 0x11, 0xf1, 0x88, 0x13, 0xb3, 0x78, 0xe7, 0x6c, 0xf2, 0x06, + 0xd6, 0x20, 0x6c, 0xe2, 0xa1, 0x27, 0x55, 0x08, 0x5b, 0x26, 0x94, 0x27, 0x1d, 0xc6, 0x86, 0xde, + 0xb0, 0x60, 0x6c, 0xdd, 0xf5, 0x88, 0xe6, 0x2e, 0x52, 0x2d, 0x96, 0x8e, 0xfe, 0x92, 0x97, 0x4c, + 0xba, 0x5a, 0x42, 0xa6, 0x9a, 0x63, 0x9c, 0x61, 0x4f, 0x3f, 0xf3, 0x16, 0x89, 0x98, 0x68, 0x1d, + 0x4c, 0x7f, 0xe6, 0x1b, 0xbc, 0x19, 0x4b, 0x38, 0x9a, 0x86, 0x13, 0xa1, 0x13, 0xc7, 0x33, 0x11, + 0x69, 0x12, 0x3f, 0x71, 0x1d, 0x8f, 0x27, 0x42, 0x54, 0x75, 0x20, 0xf4, 0x72, 0x1a, 0x8c, 0xb3, + 0xf8, 0xe8, 0x83, 0xf0, 0x30, 0xf7, 0xf8, 0x2c, 0xba, 0x71, 0xec, 0xfa, 0x2d, 0x3d, 0x0d, 0x84, + 0xe3, 0x6b, 0x42, 0x90, 0x7a, 0x78, 0x3e, 0x1f, 0x0d, 0xf7, 0x7a, 0x1e, 0x3d, 0x0d, 0xd5, 0x78, + 0xd3, 0x0d, 0x67, 0xa2, 0x66, 0xcc, 0x4e, 0x7b, 0xaa, 0xda, 0xcd, 0xba, 0x22, 0xda, 0xb1, 0xc2, + 0x40, 0x0d, 0x18, 0xe1, 0x9f, 0x84, 0xc7, 0xe0, 0x09, 0xf9, 0xf8, 0x4c, 0x4f, 0xbb, 0x40, 0xe4, + 0xf5, 0x4d, 0x62, 0xe7, 0xf6, 0x45, 0x79, 0xf6, 0xc4, 0x8f, 0x4a, 0x6e, 0x18, 0x64, 0x70, 0x8a, + 0xa8, 0xfd, 0xf3, 0xa5, 0xb4, 0x65, 0x60, 0x2e, 0x52, 0x14, 0xd3, 0xa5, 0x98, 0xdc, 0x70, 0x22, + 0xe9, 0x86, 0x3a, 0x62, 0xbe, 0x86, 0xa0, 0x7b, 0xc3, 0x89, 0xcc, 0x45, 0xcd, 0x18, 0x60, 0xc9, + 0x09, 0xdd, 0x82, 0x81, 0xc4, 0x73, 0x0a, 0x4a, 0xf0, 0x32, 0x38, 0x6a, 0xcf, 0xcf, 0xc2, 0x74, + 0x8c, 0x19, 0x0f, 0xf4, 0x28, 0xdd, 0xee, 0xac, 0xc9, 0xb3, 0x21, 0xb1, 0x43, 0x59, 0x8b, 0x31, + 0x6b, 0xb5, 0xef, 0x42, 0x8e, 0x5c, 0x55, 0x8a, 0x0c, 0x5d, 0x00, 0xa0, 0x3b, 0xe7, 0xe5, 0x88, + 0xac, 0xbb, 0xdb, 0xc2, 0x90, 0x50, 0x6b, 0xf7, 0x9a, 0x82, 0x60, 0x03, 0x4b, 0x3e, 0xb3, 0xd2, + 0x59, 0xa7, 0xcf, 0x94, 0xba, 0x9f, 0xe1, 0x10, 0x6c, 0x60, 0xa1, 0xe7, 0x60, 0xd0, 0x6d, 0x3b, + 0x2d, 0x15, 0x7b, 0xfa, 0x28, 0x5d, 0xb4, 0xf3, 0xac, 0xe5, 0xee, 0xee, 0xc4, 0x98, 0xea, 0x10, + 0x6b, 0xc2, 0x02, 0x17, 0xfd, 0xb2, 0x05, 0x23, 0x8d, 0xa0, 0xdd, 0x0e, 0x7c, 0xbe, 0xdf, 0x14, + 0x9b, 0xe7, 0x5b, 0xc7, 0xa5, 0xe6, 0x27, 0x67, 0x0c, 0x66, 0x7c, 0xf7, 0xac, 0x32, 0xd1, 0x4c, + 0x10, 0x4e, 0xf5, 0xca, 0x5c, 0xdb, 0x95, 0x7d, 0xd6, 0xf6, 0xaf, 0x59, 0x70, 0x8a, 0x3f, 0x6b, + 0x6c, 0x83, 0x45, 0xd2, 0x55, 0x70, 0xcc, 0xaf, 0xd5, 0xe5, 0x19, 0x50, 0xee, 0xc9, 0x2e, 0x38, + 0xee, 0xee, 0x24, 0x9a, 0x83, 0x53, 0xeb, 0x41, 0xd4, 0x20, 0xe6, 0x40, 0x08, 0xc1, 0xa4, 0x08, + 0x5d, 0xca, 0x22, 0xe0, 0xee, 0x67, 0xd0, 0x0d, 0x78, 0xc8, 0x68, 0x34, 0xc7, 0x81, 0xcb, 0xa6, + 0xc7, 0x05, 0xb5, 0x87, 0x2e, 0xe5, 0x62, 0xe1, 0x1e, 0x4f, 0xa7, 0x3d, 0x45, 0xb5, 0x3e, 0x3c, + 0x45, 0xaf, 0xc2, 0x23, 0x8d, 0xee, 0x91, 0xd9, 0x8a, 0x3b, 0x6b, 0x31, 0x97, 0x54, 0xd5, 0xfa, + 0x0f, 0x08, 0x02, 0x8f, 0xcc, 0xf4, 0x42, 0xc4, 0xbd, 0x69, 0xa0, 0x8f, 0x42, 0x35, 0x22, 0xec, + 0xab, 0xc4, 0x22, 0x03, 0xe9, 0x88, 0xee, 0x01, 0x6d, 0x81, 0x72, 0xb2, 0x5a, 0xf6, 0x8a, 0x86, + 0x18, 0x2b, 0x8e, 0xe8, 0x36, 0x0c, 0x85, 0x74, 0x7f, 0x23, 0xf2, 0x8e, 0x8e, 0xbc, 0x7d, 0x51, + 0xcc, 0x99, 0xf3, 0xdf, 0xc8, 0x54, 0xe6, 0x4c, 0xb0, 0xe4, 0x46, 0xad, 0x91, 0x46, 0xd0, 0x0e, + 0x03, 0x9f, 0xf8, 0x49, 0x3c, 0x3e, 0xaa, 0xad, 0x91, 0x19, 0xd5, 0x8a, 0x0d, 0x0c, 0xb4, 0x0c, + 0x67, 0x98, 0xb3, 0xec, 0xa6, 0x9b, 0x6c, 0x04, 0x9d, 0x44, 0xee, 0xfd, 0xc6, 0xc7, 0xd2, 0x67, + 0x34, 0x0b, 0x39, 0x38, 0x38, 0xf7, 0xc9, 0x73, 0xef, 0x87, 0x53, 0x5d, 0x4b, 0xf9, 0x40, 0x7e, + 0xaa, 0x59, 0x78, 0x28, 0x7f, 0xd1, 0x1c, 0xc8, 0x5b, 0xf5, 0x8f, 0x33, 0xf1, 0xc2, 0x86, 0x21, + 0xdd, 0x87, 0xe7, 0xd3, 0x81, 0x32, 0xf1, 0xb7, 0x84, 0x0e, 0xb9, 0x74, 0xb4, 0x6f, 0x77, 0xd1, + 0xdf, 0xe2, 0x6b, 0x9e, 0xb9, 0x77, 0x2e, 0xfa, 0x5b, 0x98, 0xd2, 0x46, 0x5f, 0xb2, 0x52, 0x86, + 0x20, 0xf7, 0x97, 0x7e, 0xf8, 0x58, 0x76, 0x0e, 0x7d, 0xdb, 0x86, 0xf6, 0xbf, 0x2d, 0xc1, 0xf9, + 0xfd, 0x88, 0xf4, 0x31, 0x7c, 0x4f, 0xc0, 0x60, 0xcc, 0x22, 0x00, 0x84, 0x50, 0x1e, 0xa6, 0x73, + 0x95, 0xc7, 0x04, 0xbc, 0x8a, 0x05, 0x08, 0x79, 0x50, 0x6e, 0x3b, 0xa1, 0x70, 0xa3, 0xcd, 0x1f, + 0x35, 0x83, 0x88, 0xfe, 0x77, 0xbc, 0x45, 0x27, 0xe4, 0xce, 0x19, 0xa3, 0x01, 0x53, 0x36, 0x28, + 0x81, 0x8a, 0x13, 0x45, 0x8e, 0x3c, 0x6e, 0xbe, 0x5a, 0x0c, 0xbf, 0x69, 0x4a, 0x92, 0x9f, 0xd6, + 0xa5, 0x9a, 0x30, 0x67, 0x66, 0x7f, 0x6e, 0x28, 0x95, 0x45, 0xc3, 0x62, 0x08, 0x62, 0x18, 0x14, + 0xde, 0x33, 0xab, 0xe8, 0xc4, 0x2d, 0x9e, 0x06, 0xc9, 0xf6, 0x89, 0x22, 0x99, 0x5c, 0xb0, 0x42, + 0x9f, 0xb5, 0x58, 0xca, 0xb6, 0xcc, 0x2c, 0x12, 0xbb, 0xb3, 0xe3, 0xc9, 0x20, 0x37, 0x13, 0xc1, + 0x65, 0x23, 0x36, 0xb9, 0x8b, 0xd2, 0x0b, 0xcc, 0x2a, 0xed, 0x2e, 0xbd, 0xc0, 0xac, 0x4c, 0x09, + 0x47, 0xdb, 0x39, 0xb1, 0x02, 0x05, 0xa4, 0xfd, 0xf6, 0x11, 0x1d, 0xf0, 0x35, 0x0b, 0x4e, 0xb9, + 0xd9, 0x43, 0x5f, 0xb1, 0x97, 0x39, 0x62, 0x34, 0x4a, 0xef, 0x33, 0x65, 0xa5, 0xce, 0xbb, 0x40, + 0xb8, 0xbb, 0x33, 0xa8, 0x09, 0x03, 0xae, 0xbf, 0x1e, 0x08, 0x23, 0xa6, 0x7e, 0xb4, 0x4e, 0xcd, + 0xfb, 0xeb, 0x81, 0x5e, 0xcd, 0xf4, 0x1f, 0x66, 0xd4, 0xd1, 0x02, 0x9c, 0x89, 0x84, 0xb7, 0xe9, + 0xb2, 0x1b, 0x27, 0x41, 0xb4, 0xb3, 0xe0, 0xb6, 0xdd, 0x84, 0x19, 0x20, 0xe5, 0xfa, 0x38, 0xd5, + 0x0f, 0x38, 0x07, 0x8e, 0x73, 0x9f, 0x42, 0xaf, 0xc3, 0x90, 0xcc, 0x31, 0xaf, 0x16, 0xb1, 0x2f, + 0xec, 0x9e, 0xff, 0x6a, 0x32, 0xad, 0x88, 0x74, 0x72, 0xc9, 0xd0, 0x7e, 0x63, 0x18, 0xba, 0xcf, + 0x83, 0xd1, 0xc7, 0xa0, 0x16, 0xa9, 0xbc, 0x77, 0xab, 0x08, 0x75, 0x2d, 0xbf, 0xaf, 0x38, 0x8b, + 0x56, 0xa6, 0x90, 0xce, 0x70, 0xd7, 0x1c, 0xe9, 0x86, 0x25, 0xd6, 0xc7, 0xc6, 0x05, 0xcc, 0x6d, + 0xc1, 0x55, 0x1f, 0x09, 0xee, 0xf8, 0x0d, 0xcc, 0x78, 0xa0, 0x08, 0x06, 0x37, 0x88, 0xe3, 0x25, + 0x1b, 0xc5, 0x9c, 0x5e, 0x5c, 0x66, 0xb4, 0xb2, 0xd9, 0x4f, 0xbc, 0x15, 0x0b, 0x4e, 0x68, 0x1b, + 0x86, 0x36, 0xf8, 0x04, 0x10, 0x7b, 0x88, 0xc5, 0xa3, 0x0e, 0x6e, 0x6a, 0x56, 0xe9, 0xcf, 0x2d, + 0x1a, 0xb0, 0x64, 0xc7, 0x02, 0x8d, 0x8c, 0x50, 0x08, 0xbe, 0x74, 0x8b, 0x4b, 0xfc, 0xea, 0x3f, + 0x0e, 0xe2, 0x23, 0x30, 0x12, 0x91, 0x46, 0xe0, 0x37, 0x5c, 0x8f, 0x34, 0xa7, 0xe5, 0xc9, 0xc4, + 0x41, 0xd2, 0x85, 0xd8, 0x3e, 0x1c, 0x1b, 0x34, 0x70, 0x8a, 0x22, 0xfa, 0x8c, 0x05, 0x63, 0x2a, + 0x59, 0x96, 0x7e, 0x10, 0x22, 0x1c, 0xc2, 0x0b, 0x05, 0xa5, 0xe6, 0x32, 0x9a, 0x75, 0x74, 0x67, + 0x77, 0x62, 0x2c, 0xdd, 0x86, 0x33, 0x7c, 0xd1, 0xcb, 0x00, 0xc1, 0x1a, 0x8f, 0x26, 0x9a, 0x4e, + 0x84, 0x77, 0xf8, 0x20, 0xaf, 0x3a, 0xc6, 0xf3, 0x06, 0x25, 0x05, 0x6c, 0x50, 0x43, 0x57, 0x01, + 0xf8, 0xb2, 0x59, 0xdd, 0x09, 0xe5, 0x46, 0x43, 0xe6, 0x7b, 0xc1, 0x8a, 0x82, 0xdc, 0xdd, 0x9d, + 0xe8, 0xf6, 0xd6, 0xb1, 0x53, 0x06, 0xe3, 0x71, 0xf4, 0x13, 0x30, 0x14, 0x77, 0xda, 0x6d, 0x47, + 0xf9, 0x8e, 0x0b, 0xcc, 0x44, 0xe4, 0x74, 0x0d, 0x51, 0xc4, 0x1b, 0xb0, 0xe4, 0x88, 0x6e, 0x51, + 0xa1, 0x1a, 0x0b, 0x37, 0x22, 0x5b, 0x45, 0xdc, 0x26, 0x18, 0x66, 0xef, 0xf4, 0x1e, 0x69, 0x78, + 0xe3, 0x1c, 0x9c, 0xbb, 0xbb, 0x13, 0x0f, 0xa5, 0xdb, 0x17, 0x02, 0x91, 0x1b, 0x98, 0x4b, 0x13, + 0x5d, 0x91, 0x25, 0x67, 0xe8, 0x6b, 0xcb, 0x4a, 0x08, 0x4f, 0xe9, 0x92, 0x33, 0xac, 0xb9, 0xf7, + 0x98, 0x99, 0x0f, 0xa3, 0x45, 0x38, 0xdd, 0x08, 0xfc, 0x24, 0x0a, 0x3c, 0x8f, 0x97, 0x5c, 0xe2, + 0x7b, 0x3e, 0xee, 0x5b, 0x7e, 0xbb, 0xe8, 0xf6, 0xe9, 0x99, 0x6e, 0x14, 0x9c, 0xf7, 0x9c, 0xed, + 0xa7, 0xc3, 0x2c, 0xc5, 0xe0, 0x3c, 0x07, 0x23, 0x64, 0x3b, 0x21, 0x91, 0xef, 0x78, 0xd7, 0xf1, + 0x82, 0xf4, 0xaa, 0xb2, 0x35, 0x70, 0xd1, 0x68, 0xc7, 0x29, 0x2c, 0x64, 0x2b, 0x47, 0x87, 0x91, + 0xef, 0xca, 0x1d, 0x1d, 0xd2, 0xad, 0x61, 0xff, 0x9f, 0x52, 0xca, 0x20, 0x5b, 0x8d, 0x08, 0x41, + 0x01, 0x54, 0xfc, 0xa0, 0xa9, 0x64, 0xff, 0x95, 0x62, 0x64, 0xff, 0xb5, 0xa0, 0x69, 0xd4, 0xa5, + 0xa1, 0xff, 0x62, 0xcc, 0xf9, 0xb0, 0xc2, 0x1d, 0xb2, 0xc2, 0x09, 0x03, 0x88, 0x8d, 0x46, 0x91, + 0x9c, 0x55, 0xe1, 0x8e, 0x25, 0x93, 0x11, 0x4e, 0xf3, 0x45, 0x9b, 0x50, 0xd9, 0x08, 0xe2, 0x44, + 0x6e, 0x3f, 0x8e, 0xb8, 0xd3, 0xb9, 0x1c, 0xc4, 0x09, 0xb3, 0x22, 0xd4, 0x6b, 0xd3, 0x96, 0x18, + 0x73, 0x1e, 0xf6, 0x7f, 0xb1, 0x52, 0x3e, 0xf4, 0xe3, 0x3a, 0x42, 0xfc, 0x84, 0x95, 0x4e, 0xa5, + 0x2d, 0x15, 0xb1, 0xc1, 0x30, 0xd3, 0xc9, 0xf7, 0xcd, 0xca, 0xb5, 0xbf, 0x64, 0xc1, 0x50, 0xdd, + 0x69, 0x6c, 0x06, 0xeb, 0xeb, 0xe8, 0x69, 0xa8, 0x36, 0x3b, 0x91, 0x99, 0xd5, 0xab, 0x1c, 0x07, + 0xb3, 0xa2, 0x1d, 0x2b, 0x0c, 0x3a, 0x87, 0xd7, 0x9d, 0x86, 0x4c, 0x2a, 0x2f, 0xf3, 0x39, 0x7c, + 0x89, 0xb5, 0x60, 0x01, 0x41, 0xcf, 0xc3, 0x70, 0xdb, 0xd9, 0x96, 0x0f, 0x67, 0x1d, 0xf8, 0x8b, + 0x1a, 0x84, 0x4d, 0x3c, 0xfb, 0x5f, 0x5a, 0x30, 0x5e, 0x77, 0x62, 0xb7, 0x31, 0xdd, 0x49, 0x36, + 0xea, 0x6e, 0xb2, 0xd6, 0x69, 0x6c, 0x92, 0x84, 0x57, 0x12, 0xa0, 0xbd, 0xec, 0xc4, 0x74, 0x29, + 0xa9, 0x7d, 0x9d, 0xea, 0xe5, 0x75, 0xd1, 0x8e, 0x15, 0x06, 0x7a, 0x1d, 0x86, 0x43, 0x27, 0x8e, + 0x6f, 0x07, 0x51, 0x13, 0x93, 0xf5, 0x62, 0xea, 0x78, 0xac, 0x90, 0x46, 0x44, 0x12, 0x4c, 0xd6, + 0xc5, 0xe9, 0xba, 0xa6, 0x8f, 0x4d, 0x66, 0xf6, 0x17, 0x2c, 0x78, 0xa4, 0x4e, 0x9c, 0x88, 0x44, + 0xac, 0xec, 0x87, 0x7a, 0x91, 0x19, 0x2f, 0xe8, 0x34, 0xd1, 0x6b, 0x50, 0x4d, 0x68, 0x33, 0xed, + 0x96, 0x55, 0x6c, 0xb7, 0xd8, 0xe1, 0xf8, 0xaa, 0x20, 0x8e, 0x15, 0x1b, 0xfb, 0x6f, 0x58, 0x30, + 0xc2, 0x8e, 0xdb, 0x66, 0x49, 0xe2, 0xb8, 0x5e, 0x57, 0x75, 0x2c, 0xab, 0xcf, 0xea, 0x58, 0xe7, + 0x61, 0x60, 0x23, 0x68, 0x93, 0xec, 0x51, 0xf1, 0xe5, 0x80, 0x6e, 0xab, 0x29, 0x04, 0x3d, 0x4b, + 0x3f, 0xbc, 0xeb, 0x27, 0x0e, 0x5d, 0x02, 0xd2, 0x9d, 0x7b, 0x82, 0x7f, 0x74, 0xd5, 0x8c, 0x4d, + 0x1c, 0xfb, 0x37, 0x6b, 0x30, 0x24, 0x02, 0x29, 0xfa, 0xae, 0x26, 0x21, 0xf7, 0xf7, 0xa5, 0x9e, + 0xfb, 0xfb, 0x18, 0x06, 0x1b, 0xac, 0x4c, 0x9f, 0x30, 0x23, 0xaf, 0x16, 0x12, 0x79, 0xc3, 0x2b, + 0xff, 0xe9, 0x6e, 0xf1, 0xff, 0x58, 0xb0, 0x42, 0x5f, 0xb4, 0xe0, 0x44, 0x23, 0xf0, 0x7d, 0xd2, + 0xd0, 0x36, 0xce, 0x40, 0x11, 0x01, 0x16, 0x33, 0x69, 0xa2, 0xfa, 0xac, 0x27, 0x03, 0xc0, 0x59, + 0xf6, 0xe8, 0x45, 0x18, 0xe5, 0x63, 0x76, 0x23, 0xe5, 0x83, 0xd6, 0x45, 0x93, 0x4c, 0x20, 0x4e, + 0xe3, 0xa2, 0x49, 0xee, 0xcb, 0x17, 0xe5, 0x89, 0x06, 0xb5, 0xab, 0xce, 0x28, 0x4c, 0x64, 0x60, + 0xa0, 0x08, 0x50, 0x44, 0xd6, 0x23, 0x12, 0x6f, 0x88, 0x40, 0x13, 0x66, 0x5f, 0x0d, 0x1d, 0x2e, + 0xf3, 0x1c, 0x77, 0x51, 0xc2, 0x39, 0xd4, 0xd1, 0xa6, 0xd8, 0x60, 0x56, 0x8b, 0x90, 0xa1, 0xe2, + 0x33, 0xf7, 0xdc, 0x67, 0x4e, 0x40, 0x25, 0xde, 0x70, 0xa2, 0x26, 0xb3, 0xeb, 0xca, 0x3c, 0xdb, + 0x69, 0x85, 0x36, 0x60, 0xde, 0x8e, 0x66, 0xe1, 0x64, 0xa6, 0xe4, 0x53, 0x2c, 0x7c, 0xc5, 0x2a, + 0xb3, 0x25, 0x53, 0x2c, 0x2a, 0xc6, 0x5d, 0x4f, 0x98, 0xce, 0x87, 0xe1, 0x7d, 0x9c, 0x0f, 0x3b, + 0x2a, 0x9c, 0x91, 0x7b, 0x71, 0x5f, 0x2a, 0x64, 0x00, 0xfa, 0x8a, 0x5d, 0xfc, 0x7c, 0x26, 0x76, + 0x71, 0x94, 0x75, 0xe0, 0x46, 0x31, 0x1d, 0x38, 0x78, 0xa0, 0xe2, 0xfd, 0x0c, 0x3c, 0xfc, 0x33, + 0x0b, 0xe4, 0x77, 0x9d, 0x71, 0x1a, 0x1b, 0x84, 0x4e, 0x19, 0xf4, 0x3e, 0x18, 0x53, 0x5b, 0xe8, + 0x99, 0xa0, 0xe3, 0xf3, 0x98, 0xc3, 0xb2, 0x3e, 0x14, 0xc6, 0x29, 0x28, 0xce, 0x60, 0xa3, 0x29, + 0xa8, 0xd1, 0x71, 0xe2, 0x8f, 0x72, 0x5d, 0xab, 0xb6, 0xe9, 0xd3, 0xcb, 0xf3, 0xe2, 0x29, 0x8d, + 0x83, 0x02, 0x38, 0xe5, 0x39, 0x71, 0xc2, 0x7a, 0x40, 0x77, 0xd4, 0x87, 0xac, 0xfb, 0xc0, 0xd2, + 0x27, 0x16, 0xb2, 0x84, 0x70, 0x37, 0x6d, 0xfb, 0xdb, 0x03, 0x30, 0x9a, 0x92, 0x8c, 0x07, 0x54, + 0xd2, 0x4f, 0x43, 0x55, 0xea, 0xcd, 0x6c, 0x85, 0x1a, 0xa5, 0x5c, 0x15, 0x06, 0x55, 0x5a, 0x6b, + 0x5a, 0xab, 0x66, 0x8d, 0x0a, 0x43, 0xe1, 0x62, 0x13, 0x8f, 0x09, 0xe5, 0xc4, 0x8b, 0x67, 0x3c, + 0x97, 0xf8, 0x09, 0xef, 0x66, 0x31, 0x42, 0x79, 0x75, 0x61, 0xc5, 0x24, 0xaa, 0x85, 0x72, 0x06, + 0x80, 0xb3, 0xec, 0xd1, 0xa7, 0x2d, 0x18, 0x75, 0x6e, 0xc7, 0xba, 0x96, 0xac, 0x88, 0x52, 0x3c, + 0xa2, 0x92, 0x4a, 0x95, 0xa7, 0xe5, 0x2e, 0xdf, 0x54, 0x13, 0x4e, 0x33, 0x45, 0x6f, 0x5a, 0x80, + 0xc8, 0x36, 0x69, 0xc8, 0x38, 0x4a, 0xd1, 0x97, 0xc1, 0x22, 0x76, 0x9a, 0x17, 0xbb, 0xe8, 0x72, + 0xa9, 0xde, 0xdd, 0x8e, 0x73, 0xfa, 0x60, 0xff, 0xb3, 0xb2, 0x5a, 0x50, 0x3a, 0x74, 0xd7, 0x31, + 0x42, 0x08, 0xad, 0xc3, 0x87, 0x10, 0xea, 0x88, 0x84, 0xee, 0x74, 0xd2, 0x54, 0xf6, 0x59, 0xe9, + 0x3e, 0x65, 0x9f, 0xfd, 0x94, 0x95, 0xaa, 0xc5, 0x34, 0x7c, 0xe1, 0xe5, 0x62, 0xc3, 0x86, 0x27, + 0x79, 0xb4, 0x44, 0x46, 0xba, 0xa7, 0x83, 0x64, 0xa8, 0x34, 0x35, 0xd0, 0x0e, 0x24, 0x0d, 0xff, + 0x7d, 0x19, 0x86, 0x0d, 0x4d, 0x9a, 0x6b, 0x16, 0x59, 0x0f, 0x98, 0x59, 0x54, 0x3a, 0x80, 0x59, + 0xf4, 0x93, 0x50, 0x6b, 0x48, 0x29, 0x5f, 0x4c, 0x35, 0xe2, 0xac, 0xee, 0xd0, 0x82, 0x5e, 0x35, + 0x61, 0xcd, 0x13, 0xcd, 0xa5, 0x72, 0x96, 0x84, 0x86, 0x18, 0x60, 0x1a, 0x22, 0x2f, 0xa9, 0x48, + 0x68, 0x8a, 0xee, 0x67, 0x58, 0xc9, 0xae, 0xd0, 0x15, 0xef, 0x25, 0x83, 0xfb, 0x79, 0xc9, 0xae, + 0xe5, 0x79, 0xd9, 0x8c, 0x4d, 0x1c, 0xfb, 0xdb, 0x96, 0xfa, 0xb8, 0xf7, 0xa0, 0x38, 0xc5, 0xad, + 0x74, 0x71, 0x8a, 0x8b, 0x85, 0x0c, 0x73, 0x8f, 0xaa, 0x14, 0xd7, 0x60, 0x68, 0x26, 0x68, 0xb7, + 0x1d, 0xbf, 0x89, 0x7e, 0x10, 0x86, 0x1a, 0xfc, 0xa7, 0x70, 0xec, 0xb0, 0xe3, 0x41, 0x01, 0xc5, + 0x12, 0x86, 0x1e, 0x85, 0x01, 0x27, 0x6a, 0x49, 0x67, 0x0e, 0x0b, 0xae, 0x99, 0x8e, 0x5a, 0x31, + 0x66, 0xad, 0xf6, 0x3f, 0x1a, 0x00, 0x76, 0xa6, 0xed, 0x44, 0xa4, 0xb9, 0x1a, 0xb0, 0x6a, 0x88, + 0xc7, 0x7a, 0xa8, 0xa6, 0x37, 0x4b, 0x0f, 0xf2, 0xc1, 0x9a, 0x71, 0xb8, 0x52, 0xbe, 0xc7, 0x87, + 0x2b, 0x3d, 0xce, 0xcb, 0x06, 0x1e, 0xa0, 0xf3, 0x32, 0xfb, 0x73, 0x16, 0x20, 0x15, 0x08, 0xa1, + 0x0f, 0xb4, 0xa7, 0xa0, 0xa6, 0x42, 0x22, 0x84, 0x61, 0xa5, 0x45, 0x84, 0x04, 0x60, 0x8d, 0xd3, + 0xc7, 0x0e, 0xf9, 0x09, 0x29, 0xbf, 0xcb, 0xe9, 0xb8, 0x5c, 0x26, 0xf5, 0x85, 0x38, 0xb7, 0x7f, + 0xab, 0x04, 0x0f, 0x71, 0x95, 0xbc, 0xe8, 0xf8, 0x4e, 0x8b, 0xb4, 0x69, 0xaf, 0xfa, 0x0d, 0x51, + 0x68, 0xd0, 0xad, 0x99, 0x2b, 0xe3, 0x6c, 0x8f, 0xba, 0x76, 0xf9, 0x9a, 0xe3, 0xab, 0x6c, 0xde, + 0x77, 0x13, 0xcc, 0x88, 0xa3, 0x18, 0xaa, 0xb2, 0x54, 0xbf, 0x90, 0xc5, 0x05, 0x31, 0x52, 0x62, + 0x49, 0xe8, 0x4d, 0x82, 0x15, 0x23, 0x6a, 0xb8, 0x7a, 0x41, 0x63, 0x13, 0x93, 0x30, 0x60, 0x72, + 0xd7, 0x08, 0x73, 0x5c, 0x10, 0xed, 0x58, 0x61, 0xd8, 0xbf, 0x65, 0x41, 0x56, 0x23, 0x19, 0x65, + 0xe7, 0xac, 0x3d, 0xcb, 0xce, 0x1d, 0xa0, 0xee, 0xdb, 0x8f, 0xc3, 0xb0, 0x93, 0x50, 0x23, 0x82, + 0x6f, 0xbb, 0xcb, 0x87, 0x3b, 0xd6, 0x58, 0x0c, 0x9a, 0xee, 0xba, 0xcb, 0xb6, 0xdb, 0x26, 0x39, + 0xfb, 0x7f, 0x0c, 0xc0, 0xa9, 0xae, 0x34, 0x18, 0xf4, 0x02, 0x8c, 0x34, 0xc4, 0xf4, 0x08, 0xa5, + 0x43, 0xab, 0x66, 0x86, 0xc5, 0x69, 0x18, 0x4e, 0x61, 0xf6, 0x31, 0x41, 0xe7, 0xe1, 0x74, 0x44, + 0x37, 0xfa, 0x1d, 0x32, 0xbd, 0x9e, 0x90, 0x68, 0x85, 0x34, 0x02, 0xbf, 0xc9, 0x8b, 0x23, 0x96, + 0xeb, 0x0f, 0xdf, 0xd9, 0x9d, 0x38, 0x8d, 0xbb, 0xc1, 0x38, 0xef, 0x19, 0x14, 0xc2, 0xa8, 0x67, + 0xda, 0x80, 0x62, 0x03, 0x70, 0x28, 0xf3, 0x51, 0xd9, 0x08, 0xa9, 0x66, 0x9c, 0x66, 0x90, 0x36, + 0x24, 0x2b, 0xf7, 0xc9, 0x90, 0xfc, 0x94, 0x36, 0x24, 0xf9, 0xf9, 0xfb, 0x87, 0x0a, 0x4e, 0x83, + 0x3a, 0x6e, 0x4b, 0xf2, 0x25, 0xa8, 0xca, 0xd8, 0xa4, 0xbe, 0x62, 0x7a, 0x4c, 0x3a, 0x3d, 0x24, + 0xda, 0xdd, 0x12, 0xe4, 0x6c, 0x42, 0xe8, 0x3a, 0xd3, 0x1a, 0x3f, 0xb5, 0xce, 0x0e, 0xa6, 0xf5, + 0xd1, 0x36, 0x8f, 0xcb, 0xe2, 0xba, 0xed, 0x83, 0x45, 0x6f, 0xa2, 0x74, 0xa8, 0x96, 0x4a, 0x92, + 0x50, 0xe1, 0x5a, 0x17, 0x00, 0xb4, 0xa1, 0x26, 0x42, 0xe0, 0xd5, 0xb1, 0xaf, 0xb6, 0xe7, 0xb0, + 0x81, 0x45, 0xf7, 0xd4, 0xae, 0x1f, 0x27, 0x8e, 0xe7, 0x5d, 0x76, 0xfd, 0x44, 0x38, 0x07, 0x95, + 0x12, 0x9f, 0xd7, 0x20, 0x6c, 0xe2, 0x9d, 0x7b, 0x8f, 0xf1, 0x5d, 0x0e, 0xf2, 0x3d, 0x37, 0xe0, + 0x91, 0x39, 0x37, 0x51, 0x89, 0x1b, 0x6a, 0x1e, 0x51, 0x3b, 0x4c, 0x25, 0x22, 0x59, 0x3d, 0x13, + 0x91, 0x8c, 0xc4, 0x89, 0x52, 0x3a, 0xcf, 0x23, 0x9b, 0x38, 0x61, 0xbf, 0x00, 0x67, 0xe6, 0xdc, + 0xe4, 0x92, 0xeb, 0x91, 0x03, 0x32, 0xb1, 0x7f, 0x63, 0x10, 0x46, 0xcc, 0x9c, 0xc7, 0x83, 0xe4, + 0x52, 0x7d, 0x81, 0x9a, 0x5a, 0xe2, 0xed, 0x5c, 0x75, 0x68, 0x76, 0xf3, 0xc8, 0x09, 0x98, 0xf9, + 0x23, 0x66, 0x58, 0x5b, 0x9a, 0x27, 0x36, 0x3b, 0x80, 0x6e, 0x43, 0x65, 0x9d, 0x05, 0xf6, 0x97, + 0x8b, 0x88, 0x2c, 0xc8, 0x1b, 0x51, 0xbd, 0xcc, 0x78, 0x6a, 0x00, 0xe7, 0x47, 0x35, 0x64, 0x94, + 0xce, 0x16, 0x33, 0x82, 0x51, 0x45, 0x9e, 0x98, 0xc2, 0xe8, 0x25, 0xea, 0x2b, 0x87, 0x10, 0xf5, + 0x29, 0xc1, 0x3b, 0x78, 0x9f, 0x04, 0x2f, 0x4b, 0xd2, 0x48, 0x36, 0x98, 0xfd, 0x26, 0xa2, 0xe7, + 0x87, 0xd8, 0x20, 0x18, 0x49, 0x1a, 0x29, 0x30, 0xce, 0xe2, 0xa3, 0x8f, 0x2b, 0xd1, 0x5d, 0x2d, + 0xc2, 0xaf, 0x6a, 0xce, 0xe8, 0xe3, 0x96, 0xda, 0x9f, 0x2b, 0xc1, 0xd8, 0x9c, 0xdf, 0x59, 0x9e, + 0x5b, 0xee, 0xac, 0x79, 0x6e, 0xe3, 0x2a, 0xd9, 0xa1, 0xa2, 0x79, 0x93, 0xec, 0xcc, 0xcf, 0x8a, + 0x15, 0xa4, 0xe6, 0xcc, 0x55, 0xda, 0x88, 0x39, 0x8c, 0x0a, 0xa3, 0x75, 0xd7, 0x6f, 0x91, 0x28, + 0x8c, 0x5c, 0xe1, 0xf2, 0x34, 0x84, 0xd1, 0x25, 0x0d, 0xc2, 0x26, 0x1e, 0xa5, 0x1d, 0xdc, 0xf6, + 0x49, 0x94, 0x35, 0x64, 0x97, 0x68, 0x23, 0xe6, 0x30, 0x8a, 0x94, 0x44, 0x9d, 0x38, 0x11, 0x93, + 0x51, 0x21, 0xad, 0xd2, 0x46, 0xcc, 0x61, 0x74, 0xa5, 0xc7, 0x9d, 0x35, 0x16, 0xb8, 0x91, 0x09, + 0xd5, 0x5f, 0xe1, 0xcd, 0x58, 0xc2, 0x29, 0xea, 0x26, 0xd9, 0x99, 0xa5, 0xbb, 0xde, 0x4c, 0xc6, + 0xce, 0x55, 0xde, 0x8c, 0x25, 0x9c, 0x55, 0x75, 0x4c, 0x0f, 0xc7, 0xf7, 0x5c, 0x55, 0xc7, 0x74, + 0xf7, 0x7b, 0xec, 0x9f, 0x7f, 0xc9, 0x82, 0x11, 0x33, 0xdc, 0x0a, 0xb5, 0x32, 0x36, 0xee, 0x52, + 0x57, 0x51, 0xe0, 0x1f, 0xcd, 0xbb, 0x51, 0xad, 0xe5, 0x26, 0x41, 0x18, 0x3f, 0x43, 0xfc, 0x96, + 0xeb, 0x13, 0x76, 0x8a, 0xce, 0xc3, 0xb4, 0x52, 0xb1, 0x5c, 0x33, 0x41, 0x93, 0x1c, 0xc2, 0x48, + 0xb6, 0x6f, 0xc2, 0xa9, 0xae, 0x34, 0xad, 0x3e, 0x4c, 0x8b, 0x7d, 0x93, 0x64, 0x6d, 0x0c, 0xc3, + 0x94, 0xb0, 0xac, 0x2c, 0x34, 0x03, 0xa7, 0xf8, 0x42, 0xa2, 0x9c, 0x56, 0x1a, 0x1b, 0xa4, 0xad, + 0x52, 0xef, 0x98, 0x7f, 0xfd, 0x46, 0x16, 0x88, 0xbb, 0xf1, 0xed, 0xcf, 0x5b, 0x30, 0x9a, 0xca, + 0x9c, 0x2b, 0xc8, 0x08, 0x62, 0x2b, 0x2d, 0x60, 0xd1, 0x7f, 0x2c, 0x04, 0xba, 0xcc, 0x94, 0xa9, + 0x5e, 0x69, 0x1a, 0x84, 0x4d, 0x3c, 0xfb, 0x4b, 0x25, 0xa8, 0xca, 0x08, 0x8a, 0x3e, 0xba, 0xf2, + 0x59, 0x0b, 0x46, 0xd5, 0x99, 0x06, 0x73, 0x96, 0x95, 0x8a, 0x48, 0x73, 0xa0, 0x3d, 0x50, 0xdb, + 0x6d, 0x7f, 0x3d, 0xd0, 0x16, 0x39, 0x36, 0x99, 0xe1, 0x34, 0x6f, 0x74, 0x03, 0x20, 0xde, 0x89, + 0x13, 0xd2, 0x36, 0xdc, 0x76, 0xb6, 0xb1, 0xe2, 0x26, 0x1b, 0x41, 0x44, 0xe8, 0xfa, 0xba, 0x16, + 0x34, 0xc9, 0x8a, 0xc2, 0xd4, 0x26, 0x94, 0x6e, 0xc3, 0x06, 0x25, 0xfb, 0x1f, 0x94, 0xe0, 0x64, + 0xb6, 0x4b, 0xe8, 0x43, 0x30, 0x22, 0xb9, 0x1b, 0x97, 0xc3, 0xc9, 0xb0, 0x91, 0x11, 0x6c, 0xc0, + 0xee, 0xee, 0x4e, 0x4c, 0x74, 0xdf, 0xce, 0x37, 0x69, 0xa2, 0xe0, 0x14, 0x31, 0x7e, 0xb0, 0x24, + 0x4e, 0x40, 0xeb, 0x3b, 0xd3, 0x61, 0x28, 0x4e, 0x87, 0x8c, 0x83, 0x25, 0x13, 0x8a, 0x33, 0xd8, + 0x68, 0x19, 0xce, 0x18, 0x2d, 0xd7, 0x88, 0xdb, 0xda, 0x58, 0x0b, 0x22, 0xb9, 0xb3, 0x7a, 0x54, + 0x07, 0x76, 0x75, 0xe3, 0xe0, 0xdc, 0x27, 0xa9, 0xb6, 0x6f, 0x38, 0xa1, 0xd3, 0x70, 0x93, 0x1d, + 0xe1, 0x87, 0x54, 0xb2, 0x69, 0x46, 0xb4, 0x63, 0x85, 0x61, 0x2f, 0xc2, 0x40, 0x9f, 0x33, 0xa8, + 0x2f, 0x8b, 0xfe, 0x25, 0xa8, 0x52, 0x72, 0xd2, 0xbc, 0x2b, 0x82, 0x64, 0x00, 0x55, 0x79, 0x69, + 0x0b, 0xb2, 0xa1, 0xec, 0x3a, 0xf2, 0xec, 0x4e, 0xbd, 0xd6, 0x7c, 0x1c, 0x77, 0xd8, 0x26, 0x99, + 0x02, 0xd1, 0x13, 0x50, 0x26, 0xdb, 0x61, 0xf6, 0x90, 0xee, 0xe2, 0x76, 0xe8, 0x46, 0x24, 0xa6, + 0x48, 0x64, 0x3b, 0x44, 0xe7, 0xa0, 0xe4, 0x36, 0x85, 0x92, 0x02, 0x81, 0x53, 0x9a, 0x9f, 0xc5, + 0x25, 0xb7, 0x69, 0x6f, 0x43, 0x4d, 0xdd, 0x12, 0x83, 0x36, 0xa5, 0xec, 0xb6, 0x8a, 0x08, 0x79, + 0x92, 0x74, 0x7b, 0x48, 0xed, 0x0e, 0x80, 0x4e, 0x21, 0x2c, 0x4a, 0xbe, 0x9c, 0x87, 0x81, 0x46, + 0x20, 0xd2, 0x9b, 0xab, 0x9a, 0x0c, 0x13, 0xda, 0x0c, 0x62, 0xdf, 0x84, 0xb1, 0xab, 0x7e, 0x70, + 0x9b, 0x95, 0xb8, 0x67, 0x15, 0xdd, 0x28, 0xe1, 0x75, 0xfa, 0x23, 0x6b, 0x22, 0x30, 0x28, 0xe6, + 0x30, 0x55, 0xea, 0xaa, 0xd4, 0xab, 0xd4, 0x95, 0xfd, 0x09, 0x0b, 0x46, 0x54, 0x2e, 0xd2, 0xdc, + 0xd6, 0x26, 0xa5, 0xdb, 0x8a, 0x82, 0x4e, 0x98, 0xa5, 0xcb, 0xee, 0x71, 0xc2, 0x1c, 0x66, 0x26, + 0xe9, 0x95, 0xf6, 0x49, 0xd2, 0x3b, 0x0f, 0x03, 0x9b, 0xae, 0xdf, 0xcc, 0x5e, 0x4c, 0x72, 0xd5, + 0xf5, 0x9b, 0x98, 0x41, 0x68, 0x17, 0x4e, 0xaa, 0x2e, 0x48, 0x85, 0xf0, 0x02, 0x8c, 0xac, 0x75, + 0x5c, 0xaf, 0x29, 0x4b, 0xd5, 0x65, 0x3c, 0x25, 0x75, 0x03, 0x86, 0x53, 0x98, 0x74, 0x5f, 0xb7, + 0xe6, 0xfa, 0x4e, 0xb4, 0xb3, 0xac, 0x35, 0x90, 0x12, 0x4a, 0x75, 0x05, 0xc1, 0x06, 0x96, 0xfd, + 0x46, 0x19, 0xc6, 0xd2, 0x19, 0x59, 0x7d, 0x6c, 0xaf, 0x9e, 0x80, 0x0a, 0x4b, 0xd2, 0xca, 0x7e, + 0x5a, 0x5e, 0xdd, 0x8d, 0xc3, 0x50, 0x0c, 0x83, 0xbc, 0xbc, 0x43, 0x31, 0x97, 0xfa, 0xa8, 0x4e, + 0x2a, 0xff, 0x0a, 0x8b, 0x27, 0x13, 0x15, 0x25, 0x04, 0x2b, 0xf4, 0x69, 0x0b, 0x86, 0x82, 0xd0, + 0x2c, 0x91, 0xf4, 0xc1, 0x22, 0xb3, 0xd5, 0x44, 0xb2, 0x8c, 0xb0, 0x88, 0xd5, 0xa7, 0x97, 0x9f, + 0x43, 0xb2, 0x3e, 0xf7, 0x5e, 0x18, 0x31, 0x31, 0xf7, 0x33, 0x8a, 0xab, 0xa6, 0x51, 0xfc, 0x59, + 0x73, 0x52, 0x88, 0x7c, 0xbc, 0x3e, 0x96, 0xdb, 0x75, 0xa8, 0x34, 0x54, 0x00, 0xc0, 0xa1, 0x0a, + 0x9c, 0xaa, 0x7a, 0x0b, 0xec, 0x10, 0x88, 0x53, 0xb3, 0xbf, 0x6d, 0x19, 0xf3, 0x03, 0x93, 0x78, + 0xbe, 0x89, 0x22, 0x28, 0xb7, 0xb6, 0x36, 0x85, 0x29, 0x7a, 0xa5, 0xa0, 0xe1, 0x9d, 0xdb, 0xda, + 0xd4, 0x73, 0xdc, 0x6c, 0xc5, 0x94, 0x59, 0x1f, 0x4e, 0xc0, 0x54, 0xda, 0x66, 0x79, 0xff, 0xb4, + 0x4d, 0xfb, 0xcd, 0x12, 0x9c, 0xea, 0x9a, 0x54, 0xe8, 0x75, 0xa8, 0x44, 0xf4, 0x2d, 0xc5, 0xeb, + 0x2d, 0x14, 0x96, 0x68, 0x19, 0xcf, 0x37, 0xb5, 0xde, 0x4d, 0xb7, 0x63, 0xce, 0x12, 0x5d, 0x01, + 0xa4, 0xc3, 0x54, 0x94, 0x07, 0x92, 0xbf, 0xf2, 0x39, 0xf1, 0x28, 0x9a, 0xee, 0xc2, 0xc0, 0x39, + 0x4f, 0xa1, 0x17, 0xb3, 0x8e, 0xcc, 0x72, 0xfa, 0xdc, 0x72, 0x2f, 0x9f, 0xa4, 0xfd, 0xcf, 0x4b, + 0x30, 0x9a, 0xaa, 0x58, 0x85, 0x3c, 0xa8, 0x12, 0x8f, 0x39, 0xf5, 0xa5, 0xb2, 0x39, 0x6a, 0x01, + 0x68, 0xa5, 0x20, 0x2f, 0x0a, 0xba, 0x58, 0x71, 0x78, 0x30, 0x0e, 0xd7, 0x5f, 0x80, 0x11, 0xd9, + 0xa1, 0x0f, 0x3a, 0x6d, 0x4f, 0x0c, 0xa0, 0x9a, 0xa3, 0x17, 0x0d, 0x18, 0x4e, 0x61, 0xda, 0xbf, + 0x5d, 0x86, 0x71, 0x7e, 0x0a, 0xd2, 0x54, 0x33, 0x6f, 0x51, 0xee, 0xb7, 0xfe, 0x8a, 0xae, 0x2b, + 0xc7, 0x07, 0x72, 0xed, 0xa8, 0xf7, 0x2d, 0xe4, 0x33, 0xea, 0x2b, 0x32, 0xeb, 0xab, 0x99, 0xc8, + 0x2c, 0x6e, 0x76, 0xb7, 0x8e, 0xa9, 0x47, 0xdf, 0x5b, 0xa1, 0x5a, 0x7f, 0xb7, 0x04, 0x27, 0x32, + 0x97, 0x59, 0xa0, 0x37, 0xd2, 0xf5, 0x8f, 0xad, 0x22, 0x7c, 0xe5, 0x7b, 0xde, 0x6f, 0x70, 0xb0, + 0x2a, 0xc8, 0xf7, 0x69, 0xa9, 0xd8, 0xbf, 0x5f, 0x82, 0xb1, 0xf4, 0x2d, 0x1c, 0x0f, 0xe0, 0x48, + 0xbd, 0x0b, 0x6a, 0xac, 0xd0, 0x3c, 0xbb, 0x5d, 0x94, 0xbb, 0xe4, 0x79, 0x4d, 0x6f, 0xd9, 0x88, + 0x35, 0xfc, 0x81, 0x28, 0x2e, 0x6d, 0xff, 0x3d, 0x0b, 0xce, 0xf2, 0xb7, 0xcc, 0xce, 0xc3, 0xbf, + 0x9a, 0x37, 0xba, 0xaf, 0x14, 0xdb, 0xc1, 0x4c, 0x3d, 0xc4, 0xfd, 0xc6, 0x97, 0xdd, 0x6a, 0x28, + 0x7a, 0x9b, 0x9e, 0x0a, 0x0f, 0x60, 0x67, 0x0f, 0x34, 0x19, 0xec, 0xdf, 0x2f, 0x83, 0xbe, 0xc8, + 0x11, 0xb9, 0x22, 0xc7, 0xb1, 0x90, 0xba, 0x90, 0x2b, 0x3b, 0x7e, 0x43, 0x5f, 0x19, 0x59, 0xcd, + 0xa4, 0x38, 0xfe, 0xac, 0x05, 0xc3, 0xae, 0xef, 0x26, 0xae, 0xc3, 0xb6, 0xd1, 0xc5, 0x5c, 0x32, + 0xa7, 0xd8, 0xcd, 0x73, 0xca, 0x41, 0x64, 0x9e, 0xe3, 0x28, 0x66, 0xd8, 0xe4, 0x8c, 0x3e, 0x22, + 0x82, 0xa7, 0xcb, 0x85, 0x65, 0xe7, 0x56, 0x33, 0x11, 0xd3, 0x21, 0x35, 0xbc, 0x92, 0xa8, 0xa0, + 0xa4, 0x76, 0x4c, 0x49, 0xa9, 0x12, 0xc3, 0xfa, 0x4a, 0x6d, 0xda, 0x8c, 0x39, 0x23, 0x3b, 0x06, + 0xd4, 0x3d, 0x16, 0x07, 0x0c, 0x4c, 0x9d, 0x82, 0x9a, 0xd3, 0x49, 0x82, 0x36, 0x1d, 0x26, 0x71, + 0xd4, 0xa4, 0x43, 0x6f, 0x25, 0x00, 0x6b, 0x1c, 0xfb, 0x8d, 0x0a, 0x64, 0x92, 0x0e, 0xd1, 0xb6, + 0x79, 0x09, 0xa9, 0x55, 0xec, 0x25, 0xa4, 0xaa, 0x33, 0x79, 0x17, 0x91, 0xa2, 0x16, 0x54, 0xc2, + 0x0d, 0x27, 0x96, 0x66, 0xf5, 0x4b, 0x6a, 0x1f, 0x47, 0x1b, 0xef, 0xee, 0x4e, 0xfc, 0x58, 0x7f, + 0x5e, 0x57, 0x3a, 0x57, 0xa7, 0x78, 0xf9, 0x12, 0xcd, 0x9a, 0xd1, 0xc0, 0x9c, 0xfe, 0x41, 0xae, + 0xd9, 0xfb, 0xa4, 0xa8, 0xa8, 0x8f, 0x49, 0xdc, 0xf1, 0x12, 0x31, 0x1b, 0x5e, 0x2a, 0x70, 0x95, + 0x71, 0xc2, 0x3a, 0x5d, 0x9e, 0xff, 0xc7, 0x06, 0x53, 0xf4, 0x21, 0xa8, 0xc5, 0x89, 0x13, 0x25, + 0x87, 0x4c, 0x70, 0x55, 0x83, 0xbe, 0x22, 0x89, 0x60, 0x4d, 0x0f, 0xbd, 0xcc, 0xca, 0xe4, 0xba, + 0xf1, 0xc6, 0x21, 0x73, 0x1e, 0x64, 0x49, 0x5d, 0x41, 0x01, 0x1b, 0xd4, 0xd0, 0x05, 0x00, 0x36, + 0xb7, 0x79, 0xa0, 0x5f, 0x95, 0x79, 0x99, 0x94, 0x28, 0xc4, 0x0a, 0x82, 0x0d, 0x2c, 0xfb, 0x87, + 0x20, 0x5d, 0xef, 0x01, 0x4d, 0xc8, 0xf2, 0x12, 0xdc, 0x0b, 0xcd, 0x72, 0x17, 0x52, 0x95, 0x20, + 0x7e, 0xcd, 0x02, 0xb3, 0x28, 0x05, 0x7a, 0x8d, 0x57, 0xbf, 0xb0, 0x8a, 0x38, 0x39, 0x34, 0xe8, + 0x4e, 0x2e, 0x3a, 0x61, 0xe6, 0x08, 0x5b, 0x96, 0xc0, 0x38, 0xf7, 0x1e, 0xa8, 0x4a, 0xe8, 0x81, + 0x8c, 0xba, 0x8f, 0xc3, 0xe9, 0xec, 0x15, 0xed, 0xe2, 0xd4, 0x69, 0x7f, 0xd7, 0x8f, 0xf4, 0xe7, + 0x94, 0x7a, 0xf9, 0x73, 0xfa, 0xb8, 0x8a, 0xf6, 0xd7, 0x2d, 0x38, 0xbf, 0xdf, 0x4d, 0xf2, 0xe8, + 0x51, 0x18, 0xb8, 0xed, 0x44, 0xb2, 0x7e, 0x39, 0x13, 0x94, 0x37, 0x9d, 0xc8, 0xc7, 0xac, 0x15, + 0xed, 0xc0, 0x20, 0x8f, 0x06, 0x13, 0xd6, 0xfa, 0x4b, 0xc5, 0xde, 0x6b, 0x7f, 0x95, 0x18, 0xdb, + 0x05, 0x1e, 0x89, 0x86, 0x05, 0x43, 0xfb, 0x3b, 0x16, 0xa0, 0xa5, 0x2d, 0x12, 0x45, 0x6e, 0xd3, + 0x88, 0x5f, 0x63, 0x37, 0xd3, 0x18, 0x37, 0xd0, 0x98, 0x29, 0xae, 0x99, 0x9b, 0x69, 0x8c, 0x7f, + 0xf9, 0x37, 0xd3, 0x94, 0x0e, 0x76, 0x33, 0x0d, 0x5a, 0x82, 0xb3, 0x6d, 0xbe, 0xdd, 0xe0, 0xb7, + 0x3d, 0xf0, 0xbd, 0x87, 0x4a, 0x28, 0x7b, 0xe4, 0xce, 0xee, 0xc4, 0xd9, 0xc5, 0x3c, 0x04, 0x9c, + 0xff, 0x9c, 0xfd, 0x1e, 0x40, 0x3c, 0x6c, 0x6d, 0x26, 0x2f, 0x06, 0xa9, 0xa7, 0xfb, 0xc5, 0xfe, + 0x4a, 0x05, 0x4e, 0x64, 0xaa, 0xdb, 0xd2, 0xad, 0x5e, 0x77, 0xd0, 0xd3, 0x91, 0xf5, 0x77, 0x77, + 0xf7, 0xfa, 0x0a, 0xa3, 0xf2, 0xa1, 0xe2, 0xfa, 0x61, 0x27, 0x29, 0x26, 0x87, 0x94, 0x77, 0x62, + 0x9e, 0x12, 0x34, 0xdc, 0xc5, 0xf4, 0x2f, 0xe6, 0x6c, 0x8a, 0x0c, 0xca, 0x4a, 0x19, 0xe3, 0x03, + 0xf7, 0xc9, 0x1d, 0xf0, 0x49, 0x1d, 0x22, 0x55, 0x29, 0xc2, 0xb1, 0x98, 0x99, 0x2c, 0xc7, 0x7d, + 0xd4, 0xfe, 0xab, 0x25, 0x18, 0x36, 0x3e, 0x1a, 0xfa, 0xc5, 0x74, 0xc9, 0x26, 0xab, 0xb8, 0x57, + 0x62, 0xf4, 0x27, 0x75, 0x51, 0x26, 0xfe, 0x4a, 0x4f, 0x76, 0x57, 0x6b, 0xba, 0xbb, 0x3b, 0x71, + 0x32, 0x53, 0x8f, 0x29, 0x55, 0xc1, 0xe9, 0xdc, 0xc7, 0xe0, 0x44, 0x86, 0x4c, 0xce, 0x2b, 0xaf, + 0xa6, 0x6f, 0xe0, 0x3f, 0xa2, 0x5b, 0xca, 0x1c, 0xb2, 0x6f, 0xd0, 0x21, 0x13, 0x69, 0x74, 0x81, + 0x47, 0xfa, 0xf0, 0xc1, 0x66, 0xb2, 0x65, 0x4b, 0x7d, 0x66, 0xcb, 0x3e, 0x05, 0xd5, 0x30, 0xf0, + 0xdc, 0x86, 0xab, 0xea, 0x1a, 0xb2, 0xfc, 0xdc, 0x65, 0xd1, 0x86, 0x15, 0x14, 0xdd, 0x86, 0xda, + 0xad, 0xdb, 0x09, 0x3f, 0xfd, 0x11, 0xfe, 0xed, 0xa2, 0x0e, 0x7d, 0x94, 0xd1, 0xa2, 0x8e, 0x97, + 0xb0, 0xe6, 0x85, 0x6c, 0x18, 0x64, 0x4a, 0x50, 0x86, 0xfe, 0x33, 0xdf, 0x3b, 0xd3, 0x8e, 0x31, + 0x16, 0x10, 0xfb, 0xeb, 0x35, 0x38, 0x93, 0x57, 0x62, 0x1c, 0x7d, 0x14, 0x06, 0x79, 0x1f, 0x8b, + 0xb9, 0xc5, 0x22, 0x8f, 0xc7, 0x1c, 0x23, 0x28, 0xba, 0xc5, 0x7e, 0x63, 0xc1, 0x53, 0x70, 0xf7, + 0x9c, 0x35, 0x31, 0x43, 0x8e, 0x87, 0xfb, 0x82, 0xa3, 0xb9, 0x2f, 0x38, 0x9c, 0xbb, 0xe7, 0xac, + 0xa1, 0x6d, 0xa8, 0xb4, 0xdc, 0x84, 0x38, 0xc2, 0x89, 0x70, 0xf3, 0x58, 0x98, 0x13, 0x87, 0x5b, + 0x69, 0xec, 0x27, 0xe6, 0x0c, 0xd1, 0xd7, 0x2c, 0x38, 0xb1, 0x96, 0x4e, 0x8d, 0x17, 0xc2, 0xd3, + 0x39, 0x86, 0x32, 0xf2, 0x69, 0x46, 0xfc, 0x6a, 0xa6, 0x4c, 0x23, 0xce, 0x76, 0x07, 0x7d, 0xca, + 0x82, 0xa1, 0x75, 0xd7, 0x33, 0x0a, 0xeb, 0x1e, 0xc3, 0xc7, 0xb9, 0xc4, 0x18, 0xe8, 0x1d, 0x07, + 0xff, 0x1f, 0x63, 0xc9, 0xb9, 0x97, 0xa6, 0x1a, 0x3c, 0xaa, 0xa6, 0x1a, 0xba, 0x4f, 0x9a, 0xea, + 0x33, 0x16, 0xd4, 0xd4, 0x48, 0x8b, 0x74, 0xe7, 0x0f, 0x1d, 0xe3, 0x27, 0xe7, 0x9e, 0x13, 0xf5, + 0x17, 0x6b, 0xe6, 0xe8, 0x8b, 0x16, 0x0c, 0x3b, 0xaf, 0x77, 0x22, 0xd2, 0x24, 0x5b, 0x41, 0x18, + 0x8b, 0x7b, 0x1d, 0x5f, 0x29, 0xbe, 0x33, 0xd3, 0x94, 0xc9, 0x2c, 0xd9, 0x5a, 0x0a, 0x63, 0x91, + 0x96, 0xa4, 0x1b, 0xb0, 0xd9, 0x05, 0x7b, 0xb7, 0x04, 0x13, 0xfb, 0x50, 0x40, 0x2f, 0xc0, 0x48, + 0x10, 0xb5, 0x1c, 0xdf, 0x7d, 0xdd, 0xac, 0x75, 0xa1, 0xac, 0xac, 0x25, 0x03, 0x86, 0x53, 0x98, + 0x66, 0x42, 0x76, 0x69, 0x9f, 0x84, 0xec, 0xf3, 0x30, 0x10, 0x91, 0x30, 0xc8, 0x6e, 0x16, 0x58, + 0x4a, 0x00, 0x83, 0xa0, 0xc7, 0xa0, 0xec, 0x84, 0xae, 0x08, 0x44, 0x53, 0x7b, 0xa0, 0xe9, 0xe5, + 0x79, 0x4c, 0xdb, 0x53, 0xf5, 0x21, 0x2a, 0xf7, 0xa4, 0x3e, 0x04, 0x55, 0x03, 0xe2, 0xec, 0x62, + 0x50, 0xab, 0x81, 0xf4, 0x99, 0x82, 0xfd, 0x66, 0x19, 0x1e, 0xdb, 0x73, 0xbe, 0xe8, 0x38, 0x3c, + 0x6b, 0x8f, 0x38, 0x3c, 0x39, 0x3c, 0xa5, 0xfd, 0x86, 0xa7, 0xdc, 0x63, 0x78, 0x3e, 0x45, 0x97, + 0x81, 0xac, 0x11, 0x52, 0xcc, 0xcd, 0x7c, 0xbd, 0x4a, 0x8e, 0x88, 0x15, 0x20, 0xa1, 0x58, 0xf3, + 0xa5, 0x7b, 0x80, 0x54, 0x32, 0x72, 0xa5, 0x08, 0x35, 0xd0, 0xb3, 0x66, 0x08, 0x9f, 0xfb, 0xbd, + 0x32, 0x9c, 0xed, 0x9f, 0x2b, 0xc1, 0x13, 0x7d, 0x48, 0x6f, 0x73, 0x16, 0x5b, 0x7d, 0xce, 0xe2, + 0xef, 0xed, 0xcf, 0x64, 0xff, 0x35, 0x0b, 0xce, 0xf5, 0x56, 0x1e, 0xe8, 0x59, 0x18, 0x5e, 0x8b, + 0x1c, 0xbf, 0xb1, 0xc1, 0x6e, 0x1b, 0x95, 0x83, 0xc2, 0xc6, 0x5a, 0x37, 0x63, 0x13, 0x87, 0x6e, + 0x6f, 0x79, 0x4c, 0x82, 0x81, 0x21, 0x93, 0x47, 0xe9, 0xf6, 0x76, 0x35, 0x0b, 0xc4, 0xdd, 0xf8, + 0xf6, 0x9f, 0x96, 0xf2, 0xbb, 0xc5, 0x8d, 0x8c, 0x83, 0x7c, 0x27, 0xf1, 0x15, 0x4a, 0x7d, 0xc8, + 0x92, 0xf2, 0xbd, 0x96, 0x25, 0x03, 0xbd, 0x64, 0x09, 0x9a, 0x85, 0x93, 0xc6, 0x6d, 0x34, 0x3c, + 0x21, 0x98, 0x07, 0xdc, 0xaa, 0x2a, 0x19, 0xcb, 0x19, 0x38, 0xee, 0x7a, 0x02, 0x3d, 0x0d, 0x55, + 0xd7, 0x8f, 0x49, 0xa3, 0x13, 0xf1, 0x40, 0x6f, 0x23, 0x09, 0x6b, 0x5e, 0xb4, 0x63, 0x85, 0x61, + 0xff, 0x52, 0x09, 0x1e, 0xe9, 0x69, 0x67, 0xdd, 0x23, 0xd9, 0x65, 0x7e, 0x8e, 0x81, 0x7b, 0xf3, + 0x39, 0xcc, 0x41, 0xaa, 0xec, 0x3b, 0x48, 0x7f, 0xd0, 0x7b, 0x62, 0x52, 0x9b, 0xfb, 0xfb, 0x76, + 0x94, 0x5e, 0x84, 0x51, 0x27, 0x0c, 0x39, 0x1e, 0x8b, 0xd7, 0xcc, 0x54, 0xc9, 0x99, 0x36, 0x81, + 0x38, 0x8d, 0xdb, 0x97, 0xf6, 0xfc, 0x23, 0x0b, 0x6a, 0x98, 0xac, 0x73, 0xe9, 0x80, 0x6e, 0x89, + 0x21, 0xb2, 0x8a, 0xa8, 0xa7, 0x49, 0x07, 0x36, 0x76, 0x59, 0x9d, 0xc9, 0xbc, 0xc1, 0xee, 0xbe, + 0xbc, 0xa7, 0x74, 0xa0, 0xcb, 0x7b, 0xd4, 0xf5, 0x2d, 0xe5, 0xde, 0xd7, 0xb7, 0xd8, 0xdf, 0x18, + 0xa2, 0xaf, 0x17, 0x06, 0x33, 0x11, 0x69, 0xc6, 0xf4, 0xfb, 0x76, 0x22, 0x4f, 0x4c, 0x12, 0xf5, + 0x7d, 0xaf, 0xe3, 0x05, 0x4c, 0xdb, 0x53, 0x47, 0x31, 0xa5, 0x03, 0xd5, 0x08, 0x29, 0xef, 0x5b, + 0x23, 0xe4, 0x45, 0x18, 0x8d, 0xe3, 0x8d, 0xe5, 0xc8, 0xdd, 0x72, 0x12, 0x72, 0x95, 0xec, 0x08, + 0x2b, 0x4b, 0xe7, 0xf5, 0xaf, 0x5c, 0xd6, 0x40, 0x9c, 0xc6, 0x45, 0x73, 0x70, 0x4a, 0x57, 0xea, + 0x20, 0x51, 0xc2, 0xa2, 0xfb, 0xf9, 0x4c, 0x50, 0x49, 0xbc, 0xba, 0xb6, 0x87, 0x40, 0xc0, 0xdd, + 0xcf, 0x50, 0xf9, 0x96, 0x6a, 0xa4, 0x1d, 0x19, 0x4c, 0xcb, 0xb7, 0x14, 0x1d, 0xda, 0x97, 0xae, + 0x27, 0xd0, 0x22, 0x9c, 0xe6, 0x13, 0x63, 0x3a, 0x0c, 0x8d, 0x37, 0x1a, 0x4a, 0xd7, 0x31, 0x9c, + 0xeb, 0x46, 0xc1, 0x79, 0xcf, 0xa1, 0xe7, 0x61, 0x58, 0x35, 0xcf, 0xcf, 0x8a, 0x53, 0x04, 0xe5, + 0xc5, 0x50, 0x64, 0xe6, 0x9b, 0xd8, 0xc4, 0x43, 0x1f, 0x84, 0x87, 0xf5, 0x5f, 0x9e, 0x02, 0xc6, + 0x8f, 0xd6, 0x66, 0x45, 0x11, 0x24, 0x75, 0x59, 0xc8, 0x5c, 0x2e, 0x5a, 0x13, 0xf7, 0x7a, 0x1e, + 0xad, 0xc1, 0x39, 0x05, 0xba, 0xe8, 0x27, 0x2c, 0x9f, 0x23, 0x26, 0x75, 0x27, 0x26, 0xd7, 0x23, + 0x4f, 0x5c, 0x33, 0xab, 0x2e, 0xb0, 0x9c, 0x73, 0x93, 0xcb, 0x79, 0x98, 0x78, 0x01, 0xef, 0x41, + 0x05, 0x4d, 0x41, 0x8d, 0xf8, 0xce, 0x9a, 0x47, 0x96, 0x66, 0xe6, 0x59, 0x31, 0x25, 0xe3, 0x24, + 0xef, 0xa2, 0x04, 0x60, 0x8d, 0xa3, 0x22, 0x4c, 0x47, 0x7a, 0x5e, 0xa6, 0xba, 0x0c, 0x67, 0x5a, + 0x8d, 0x90, 0xda, 0x1e, 0x6e, 0x83, 0x4c, 0x37, 0x58, 0x40, 0x1d, 0xfd, 0x30, 0xbc, 0xc0, 0xa4, + 0x0a, 0x9f, 0x9e, 0x9b, 0x59, 0xee, 0xc2, 0xc1, 0xb9, 0x4f, 0xb2, 0xc0, 0xcb, 0x28, 0xd8, 0xde, + 0x19, 0x3f, 0x9d, 0x09, 0xbc, 0xa4, 0x8d, 0x98, 0xc3, 0xd0, 0x15, 0x40, 0x2c, 0x16, 0xff, 0x72, + 0x92, 0x84, 0xca, 0xd8, 0x19, 0x3f, 0xc3, 0x5e, 0x49, 0x85, 0x91, 0x5d, 0xea, 0xc2, 0xc0, 0x39, + 0x4f, 0xd9, 0xff, 0xc1, 0x82, 0x51, 0xb5, 0x5e, 0xef, 0x41, 0x36, 0x8a, 0x97, 0xce, 0x46, 0x99, + 0x3b, 0xba, 0xc4, 0x63, 0x3d, 0xef, 0x11, 0xd2, 0xfc, 0xd3, 0xc3, 0x00, 0x5a, 0x2a, 0x2a, 0x85, + 0x64, 0xf5, 0x54, 0x48, 0x0f, 0xac, 0x44, 0xca, 0xab, 0x9c, 0x52, 0xb9, 0xbf, 0x95, 0x53, 0x56, + 0xe0, 0xac, 0x34, 0x17, 0xf8, 0x59, 0xd1, 0xe5, 0x20, 0x56, 0x02, 0xae, 0x5a, 0x7f, 0x4c, 0x10, + 0x3a, 0x3b, 0x9f, 0x87, 0x84, 0xf3, 0x9f, 0x4d, 0x59, 0x29, 0x43, 0xfb, 0x59, 0x29, 0x7a, 0x4d, + 0x2f, 0xac, 0xcb, 0x5b, 0x41, 0x32, 0x6b, 0x7a, 0xe1, 0xd2, 0x0a, 0xd6, 0x38, 0xf9, 0x82, 0xbd, + 0x56, 0x90, 0x60, 0x87, 0x03, 0x0b, 0x76, 0x29, 0x62, 0x86, 0x7b, 0x8a, 0x18, 0xe9, 0x93, 0x1e, + 0xe9, 0xe9, 0x93, 0x7e, 0x1f, 0x8c, 0xb9, 0xfe, 0x06, 0x89, 0xdc, 0x84, 0x34, 0xd9, 0x5a, 0x60, + 0xe2, 0xa7, 0xaa, 0xd5, 0xfa, 0x7c, 0x0a, 0x8a, 0x33, 0xd8, 0x69, 0xb9, 0x38, 0xd6, 0x87, 0x5c, + 0xec, 0xa1, 0x8d, 0x4e, 0x14, 0xa3, 0x8d, 0x4e, 0x1e, 0x5d, 0x1b, 0x9d, 0x3a, 0x56, 0x6d, 0x84, + 0x0a, 0xd1, 0x46, 0x7d, 0x09, 0x7a, 0x63, 0xfb, 0x77, 0x66, 0x9f, 0xed, 0x5f, 0x2f, 0x55, 0x74, + 0xf6, 0xd0, 0xaa, 0x28, 0x5f, 0xcb, 0x3c, 0x74, 0x28, 0x2d, 0xf3, 0x99, 0x12, 0x9c, 0xd5, 0x72, + 0x98, 0xce, 0x7e, 0x77, 0x9d, 0x4a, 0x22, 0x76, 0xb1, 0x14, 0x3f, 0xb7, 0x31, 0x92, 0xa3, 0x74, + 0x9e, 0x95, 0x82, 0x60, 0x03, 0x8b, 0xe5, 0x18, 0x91, 0x88, 0x95, 0xd1, 0xcd, 0x0a, 0xe9, 0x19, + 0xd1, 0x8e, 0x15, 0x06, 0x9d, 0x5f, 0xf4, 0xb7, 0xc8, 0xdb, 0xcc, 0x16, 0x8b, 0x9b, 0xd1, 0x20, + 0x6c, 0xe2, 0xa1, 0xa7, 0x38, 0x13, 0x26, 0x20, 0xa8, 0xa0, 0x1e, 0x11, 0x57, 0xec, 0x4a, 0x99, + 0xa0, 0xa0, 0xb2, 0x3b, 0x2c, 0x99, 0xac, 0xd2, 0xdd, 0x1d, 0x16, 0x02, 0xa5, 0x30, 0xec, 0xff, + 0x69, 0xc1, 0x23, 0xb9, 0x43, 0x71, 0x0f, 0x94, 0xef, 0x76, 0x5a, 0xf9, 0xae, 0x14, 0xb5, 0xdd, + 0x30, 0xde, 0xa2, 0x87, 0x22, 0xfe, 0x77, 0x16, 0x8c, 0x69, 0xfc, 0x7b, 0xf0, 0xaa, 0x6e, 0xfa, + 0x55, 0x8b, 0xdb, 0x59, 0xd5, 0xba, 0xde, 0xed, 0xb7, 0x4b, 0xa0, 0x0a, 0x38, 0x4e, 0x37, 0x64, + 0x79, 0xdc, 0x7d, 0x4e, 0x12, 0x77, 0x60, 0x90, 0x1d, 0x84, 0xc6, 0xc5, 0x04, 0x79, 0xa4, 0xf9, + 0xb3, 0x43, 0x55, 0x7d, 0xc8, 0xcc, 0xfe, 0xc6, 0x58, 0x30, 0x64, 0x45, 0x9e, 0xdd, 0x98, 0x4a, + 0xf3, 0xa6, 0x48, 0xcb, 0xd2, 0x45, 0x9e, 0x45, 0x3b, 0x56, 0x18, 0x54, 0x3d, 0xb8, 0x8d, 0xc0, + 0x9f, 0xf1, 0x9c, 0x58, 0xde, 0xa6, 0xa8, 0xd4, 0xc3, 0xbc, 0x04, 0x60, 0x8d, 0xc3, 0xce, 0x48, + 0xdd, 0x38, 0xf4, 0x9c, 0x1d, 0x63, 0xff, 0x6c, 0xd4, 0x27, 0x50, 0x20, 0x6c, 0xe2, 0xd9, 0x6d, + 0x18, 0x4f, 0xbf, 0xc4, 0x2c, 0x59, 0x67, 0x01, 0x8a, 0x7d, 0x0d, 0xe7, 0x14, 0xd4, 0x1c, 0xf6, + 0xd4, 0x42, 0xc7, 0xc9, 0xde, 0xfe, 0x3e, 0x2d, 0x01, 0x58, 0xe3, 0xd8, 0xbf, 0x62, 0xc1, 0xe9, + 0x9c, 0x41, 0x2b, 0x30, 0xed, 0x2d, 0xd1, 0xd2, 0x26, 0x4f, 0xb1, 0xbf, 0x13, 0x86, 0x9a, 0x64, + 0xdd, 0x91, 0x21, 0x70, 0x86, 0x6c, 0x9f, 0xe5, 0xcd, 0x58, 0xc2, 0xed, 0xff, 0x6e, 0xc1, 0x89, + 0x74, 0x5f, 0x63, 0x96, 0x4a, 0xc2, 0x87, 0xc9, 0x8d, 0x1b, 0xc1, 0x16, 0x89, 0x76, 0xe8, 0x9b, + 0x5b, 0x99, 0x54, 0x92, 0x2e, 0x0c, 0x9c, 0xf3, 0x14, 0x2b, 0xdf, 0xda, 0x54, 0xa3, 0x2d, 0x67, + 0xe4, 0x8d, 0x22, 0x67, 0xa4, 0xfe, 0x98, 0xe6, 0x71, 0xb9, 0x62, 0x89, 0x4d, 0xfe, 0xf6, 0x77, + 0x06, 0x40, 0xe5, 0xc5, 0xb2, 0xf8, 0xa3, 0x82, 0xa2, 0xb7, 0x0e, 0x9a, 0x41, 0xa4, 0x26, 0xc3, + 0xc0, 0x5e, 0x01, 0x01, 0xdc, 0x4b, 0x62, 0xba, 0x2e, 0xd5, 0x1b, 0xae, 0x6a, 0x10, 0x36, 0xf1, + 0x68, 0x4f, 0x3c, 0x77, 0x8b, 0xf0, 0x87, 0x06, 0xd3, 0x3d, 0x59, 0x90, 0x00, 0xac, 0x71, 0x68, + 0x4f, 0x9a, 0xee, 0xfa, 0xba, 0xd8, 0xf2, 0xab, 0x9e, 0xd0, 0xd1, 0xc1, 0x0c, 0xc2, 0x2b, 0x72, + 0x07, 0x9b, 0xc2, 0x0a, 0x36, 0x2a, 0x72, 0x07, 0x9b, 0x98, 0x41, 0xa8, 0xdd, 0xe6, 0x07, 0x51, + 0x9b, 0xdd, 0xce, 0xdf, 0x54, 0x5c, 0x84, 0xf5, 0xab, 0xec, 0xb6, 0x6b, 0xdd, 0x28, 0x38, 0xef, + 0x39, 0x3a, 0x03, 0xc3, 0x88, 0x34, 0xdd, 0x46, 0x62, 0x52, 0x83, 0xf4, 0x0c, 0x5c, 0xee, 0xc2, + 0xc0, 0x39, 0x4f, 0xa1, 0x69, 0x38, 0x21, 0xf3, 0x9a, 0x65, 0xd5, 0x9a, 0xe1, 0x74, 0x95, 0x0c, + 0x9c, 0x06, 0xe3, 0x2c, 0x3e, 0x95, 0x6a, 0x6d, 0x51, 0xb0, 0x8a, 0x19, 0xcb, 0x86, 0x54, 0x93, + 0x85, 0xac, 0xb0, 0xc2, 0xb0, 0x3f, 0x59, 0xa6, 0x5a, 0xb8, 0x47, 0xa1, 0xb6, 0x7b, 0x16, 0x2d, + 0x98, 0x9e, 0x91, 0x03, 0x7d, 0xcc, 0xc8, 0xe7, 0x60, 0xe4, 0x56, 0x1c, 0xf8, 0x2a, 0x12, 0xaf, + 0xd2, 0x33, 0x12, 0xcf, 0xc0, 0xca, 0x8f, 0xc4, 0x1b, 0x2c, 0x2a, 0x12, 0x6f, 0xe8, 0x90, 0x91, + 0x78, 0xdf, 0xaa, 0x80, 0xba, 0x1a, 0xe4, 0x1a, 0x49, 0x6e, 0x07, 0xd1, 0xa6, 0xeb, 0xb7, 0x58, + 0x3e, 0xf8, 0xd7, 0x2c, 0x18, 0xe1, 0xeb, 0x65, 0xc1, 0xcc, 0xa4, 0x5a, 0x2f, 0xe8, 0xce, 0x89, + 0x14, 0xb3, 0xc9, 0x55, 0x83, 0x51, 0xe6, 0x32, 0x4f, 0x13, 0x84, 0x53, 0x3d, 0x42, 0x1f, 0x03, + 0x90, 0xfe, 0xd1, 0x75, 0x29, 0x32, 0xe7, 0x8b, 0xe9, 0x1f, 0x26, 0xeb, 0xda, 0x06, 0x5e, 0x55, + 0x4c, 0xb0, 0xc1, 0x10, 0x7d, 0x46, 0x67, 0x99, 0xf1, 0x90, 0xfd, 0x8f, 0x1c, 0xcb, 0xd8, 0xf4, + 0x93, 0x63, 0x86, 0x61, 0xc8, 0xf5, 0x5b, 0x74, 0x9e, 0x88, 0x88, 0xa5, 0x77, 0xe4, 0xd5, 0x52, + 0x58, 0x08, 0x9c, 0x66, 0xdd, 0xf1, 0x1c, 0xbf, 0x41, 0xa2, 0x79, 0x8e, 0x6e, 0x5e, 0x61, 0xcd, + 0x1a, 0xb0, 0x24, 0xd4, 0x75, 0xa9, 0x4a, 0xa5, 0x9f, 0x4b, 0x55, 0xce, 0xbd, 0x1f, 0x4e, 0x75, + 0x7d, 0xcc, 0x03, 0xa5, 0x94, 0x1d, 0x3e, 0x1b, 0xcd, 0xfe, 0x17, 0x83, 0x5a, 0x69, 0x5d, 0x0b, + 0x9a, 0xfc, 0x6a, 0x8f, 0x48, 0x7f, 0x51, 0x61, 0xe3, 0x16, 0x38, 0x45, 0x8c, 0x6b, 0xb0, 0x55, + 0x23, 0x36, 0x59, 0xd2, 0x39, 0x1a, 0x3a, 0x11, 0xf1, 0x8f, 0x7b, 0x8e, 0x2e, 0x2b, 0x26, 0xd8, + 0x60, 0x88, 0x36, 0x52, 0x39, 0x25, 0x97, 0x8e, 0x9e, 0x53, 0xc2, 0xaa, 0x4c, 0xe5, 0x55, 0xe3, + 0xff, 0xa2, 0x05, 0x63, 0x7e, 0x6a, 0xe6, 0x16, 0x13, 0x46, 0x9a, 0xbf, 0x2a, 0xf8, 0xcd, 0x52, + 0xe9, 0x36, 0x9c, 0xe1, 0x9f, 0xa7, 0xd2, 0x2a, 0x07, 0x54, 0x69, 0xfa, 0x8e, 0xa0, 0xc1, 0x5e, + 0x77, 0x04, 0x21, 0x5f, 0x5d, 0x92, 0x36, 0x54, 0xf8, 0x25, 0x69, 0x90, 0x73, 0x41, 0xda, 0x4d, + 0xa8, 0x35, 0x22, 0xe2, 0x24, 0x87, 0xbc, 0x2f, 0x8b, 0x1d, 0xd0, 0xcf, 0x48, 0x02, 0x58, 0xd3, + 0xb2, 0xff, 0xef, 0x00, 0x9c, 0x94, 0x23, 0x22, 0x43, 0xd0, 0xa9, 0x7e, 0xe4, 0x7c, 0xb5, 0x71, + 0xab, 0xf4, 0xe3, 0x65, 0x09, 0xc0, 0x1a, 0x87, 0xda, 0x63, 0x9d, 0x98, 0x2c, 0x85, 0xc4, 0x5f, + 0x70, 0xd7, 0x62, 0x71, 0xce, 0xa9, 0x16, 0xca, 0x75, 0x0d, 0xc2, 0x26, 0x1e, 0x35, 0xc6, 0xb9, + 0x5d, 0x1c, 0x67, 0xd3, 0x57, 0x84, 0xbd, 0x8d, 0x25, 0x1c, 0xfd, 0x7c, 0x6e, 0xe5, 0xd8, 0x62, + 0x12, 0xb7, 0xba, 0x22, 0xef, 0x0f, 0x78, 0xc5, 0xe2, 0xdf, 0xb6, 0xe0, 0x2c, 0x6f, 0x95, 0x23, + 0x79, 0x3d, 0x6c, 0x3a, 0x09, 0x89, 0x8b, 0xa9, 0xe4, 0x9e, 0xd3, 0x3f, 0xed, 0xe4, 0xcd, 0x63, + 0x8b, 0xf3, 0x7b, 0x83, 0xde, 0xb0, 0xe0, 0xc4, 0x66, 0xaa, 0xe6, 0x87, 0x54, 0x1d, 0x47, 0x4d, + 0xc7, 0x4f, 0x11, 0xd5, 0x4b, 0x2d, 0xdd, 0x1e, 0xe3, 0x2c, 0x77, 0xfb, 0x4f, 0x2d, 0x30, 0xc5, + 0xe8, 0xbd, 0x2f, 0x15, 0x72, 0x70, 0x53, 0x50, 0x5a, 0x97, 0x95, 0x9e, 0xd6, 0xe5, 0x63, 0x50, + 0xee, 0xb8, 0x4d, 0xb1, 0xbf, 0xd0, 0xa7, 0xaf, 0xf3, 0xb3, 0x98, 0xb6, 0xdb, 0xff, 0xb4, 0xa2, + 0xfd, 0x16, 0x22, 0x2f, 0xea, 0xfb, 0xe2, 0xb5, 0xd7, 0x55, 0xb1, 0x31, 0xfe, 0xe6, 0xd7, 0xba, + 0x8a, 0x8d, 0xfd, 0xc8, 0xc1, 0xd3, 0xde, 0xf8, 0x00, 0xf5, 0xaa, 0x35, 0x36, 0xb4, 0x4f, 0xce, + 0xdb, 0x2d, 0xa8, 0xd2, 0x2d, 0x18, 0x73, 0x40, 0x56, 0x53, 0x9d, 0xaa, 0x5e, 0x16, 0xed, 0x77, + 0x77, 0x27, 0xde, 0x7b, 0xf0, 0x6e, 0xc9, 0xa7, 0xb1, 0xa2, 0x8f, 0x62, 0xa8, 0xd1, 0xdf, 0x2c, + 0x3d, 0x4f, 0x6c, 0xee, 0xae, 0x2b, 0x99, 0x29, 0x01, 0x85, 0xe4, 0xfe, 0x69, 0x3e, 0xc8, 0x87, + 0x1a, 0xbb, 0x8d, 0x96, 0x31, 0xe5, 0x7b, 0xc0, 0x65, 0x95, 0x24, 0x27, 0x01, 0x77, 0x77, 0x27, + 0x5e, 0x3c, 0x38, 0x53, 0xf5, 0x38, 0xd6, 0x2c, 0xec, 0x2f, 0x0d, 0xe8, 0xb9, 0x2b, 0x6a, 0xcc, + 0x7d, 0x5f, 0xcc, 0xdd, 0x17, 0x32, 0x73, 0xf7, 0x7c, 0xd7, 0xdc, 0x1d, 0xd3, 0xb7, 0xa6, 0xa6, + 0x66, 0xe3, 0xbd, 0x36, 0x04, 0xf6, 0xf7, 0x37, 0x30, 0x0b, 0xe8, 0xb5, 0x8e, 0x1b, 0x91, 0x78, + 0x39, 0xea, 0xf8, 0xae, 0xdf, 0x62, 0xd3, 0xb1, 0x6a, 0x5a, 0x40, 0x29, 0x30, 0xce, 0xe2, 0xd3, + 0x4d, 0x3d, 0xfd, 0xe6, 0x37, 0x9d, 0x2d, 0x3e, 0xab, 0x8c, 0xb2, 0x5b, 0x2b, 0xa2, 0x1d, 0x2b, + 0x0c, 0xfb, 0x1b, 0xec, 0x2c, 0xdb, 0xc8, 0x0b, 0xa6, 0x73, 0xc2, 0x63, 0xd7, 0xff, 0xf2, 0x9a, + 0x5d, 0x6a, 0x4e, 0xf0, 0x3b, 0x7f, 0x39, 0x0c, 0xdd, 0x86, 0xa1, 0x35, 0x7e, 0xff, 0x5d, 0x31, + 0xf5, 0xc9, 0xc5, 0x65, 0x7a, 0xec, 0x96, 0x13, 0x79, 0xb3, 0xde, 0x5d, 0xfd, 0x13, 0x4b, 0x6e, + 0xf6, 0xef, 0x55, 0xe0, 0x44, 0xe6, 0x82, 0xd8, 0x54, 0xb5, 0xd4, 0xd2, 0xbe, 0xd5, 0x52, 0x3f, + 0x0c, 0xd0, 0x24, 0xa1, 0x17, 0xec, 0x30, 0x73, 0x6c, 0xe0, 0xc0, 0xe6, 0x98, 0xb2, 0xe0, 0x67, + 0x15, 0x15, 0x6c, 0x50, 0x14, 0x85, 0xca, 0x78, 0xf1, 0xd5, 0x4c, 0xa1, 0x32, 0xe3, 0x16, 0x83, + 0xc1, 0x7b, 0x7b, 0x8b, 0x81, 0x0b, 0x27, 0x78, 0x17, 0x55, 0xf6, 0xed, 0x21, 0x92, 0x6c, 0x59, + 0xfe, 0xc2, 0x6c, 0x9a, 0x0c, 0xce, 0xd2, 0xbd, 0x9f, 0xf7, 0x3f, 0xa3, 0x77, 0x41, 0x4d, 0x7e, + 0xe7, 0x78, 0xbc, 0xa6, 0x2b, 0x18, 0xc8, 0x69, 0xc0, 0xee, 0x65, 0x16, 0x3f, 0xbb, 0x0a, 0x09, + 0xc0, 0xfd, 0x2a, 0x24, 0x60, 0x7f, 0xa1, 0x44, 0xed, 0x78, 0xde, 0x2f, 0x55, 0x13, 0xe7, 0x49, + 0x18, 0x74, 0x3a, 0xc9, 0x46, 0xd0, 0x75, 0x9b, 0xdf, 0x34, 0x6b, 0xc5, 0x02, 0x8a, 0x16, 0x60, + 0xa0, 0xa9, 0xeb, 0x9c, 0x1c, 0xe4, 0x7b, 0x6a, 0x97, 0xa8, 0x93, 0x10, 0xcc, 0xa8, 0xa0, 0x47, + 0x61, 0x20, 0x71, 0x5a, 0x32, 0xe5, 0x8a, 0xa5, 0xd9, 0xae, 0x3a, 0xad, 0x18, 0xb3, 0x56, 0x53, + 0x7d, 0x0f, 0xec, 0xa3, 0xbe, 0x5f, 0x84, 0xd1, 0xd8, 0x6d, 0xf9, 0x4e, 0xd2, 0x89, 0x88, 0x71, + 0xcc, 0xa7, 0x23, 0x37, 0x4c, 0x20, 0x4e, 0xe3, 0xda, 0xbf, 0x31, 0x02, 0x67, 0x56, 0x66, 0x16, + 0x65, 0xf5, 0xee, 0x63, 0xcb, 0x9a, 0xca, 0xe3, 0x71, 0xef, 0xb2, 0xa6, 0x7a, 0x70, 0xf7, 0x8c, + 0xac, 0x29, 0xcf, 0xc8, 0x9a, 0x4a, 0xa7, 0xb0, 0x94, 0x8b, 0x48, 0x61, 0xc9, 0xeb, 0x41, 0x3f, + 0x29, 0x2c, 0xc7, 0x96, 0x46, 0xb5, 0x67, 0x87, 0x0e, 0x94, 0x46, 0xa5, 0x72, 0xcc, 0x0a, 0x49, + 0x2e, 0xe8, 0xf1, 0xa9, 0x72, 0x73, 0xcc, 0x54, 0x7e, 0x0f, 0x4f, 0x9c, 0x11, 0xa2, 0xfe, 0x95, + 0xe2, 0x3b, 0xd0, 0x47, 0x7e, 0x8f, 0xc8, 0xdd, 0x31, 0x73, 0xca, 0x86, 0x8a, 0xc8, 0x29, 0xcb, + 0xeb, 0xce, 0xbe, 0x39, 0x65, 0x2f, 0xc2, 0x68, 0xc3, 0x0b, 0x7c, 0xb2, 0x1c, 0x05, 0x49, 0xd0, + 0x08, 0x3c, 0x61, 0xd6, 0x2b, 0x91, 0x30, 0x63, 0x02, 0x71, 0x1a, 0xb7, 0x57, 0x42, 0x5a, 0xed, + 0xa8, 0x09, 0x69, 0x70, 0x9f, 0x12, 0xd2, 0x7e, 0x46, 0xa7, 0x4e, 0x0f, 0xb3, 0x2f, 0xf2, 0xe1, + 0xe2, 0xbf, 0x48, 0x3f, 0xf9, 0xd3, 0xe8, 0x4d, 0x7e, 0x9d, 0x1e, 0x35, 0x8c, 0x67, 0x82, 0x36, + 0x35, 0xfc, 0x46, 0xd8, 0x90, 0xbc, 0x7a, 0x0c, 0x13, 0xf6, 0xe6, 0x8a, 0x66, 0xa3, 0xae, 0xd8, + 0xd3, 0x4d, 0x38, 0xdd, 0x91, 0xa3, 0xa4, 0x76, 0x7f, 0xa5, 0x04, 0x3f, 0xb0, 0x6f, 0x17, 0xd0, + 0x6d, 0x80, 0xc4, 0x69, 0x89, 0x89, 0x2a, 0x0e, 0x4c, 0x8e, 0x18, 0x5e, 0xb9, 0x2a, 0xe9, 0xf1, + 0x9a, 0x24, 0xea, 0x2f, 0x3b, 0x8a, 0x90, 0xbf, 0x59, 0x54, 0x65, 0xe0, 0x75, 0x95, 0x6e, 0xc4, + 0x81, 0x47, 0x30, 0x83, 0x50, 0xf5, 0x1f, 0x91, 0x96, 0xbe, 0xff, 0x59, 0x7d, 0x3e, 0xcc, 0x5a, + 0xb1, 0x80, 0xa2, 0xe7, 0x61, 0xd8, 0xf1, 0x3c, 0x9e, 0x1f, 0x43, 0x62, 0x71, 0x9f, 0x8e, 0xae, + 0x21, 0xa7, 0x41, 0xd8, 0xc4, 0xb3, 0xff, 0xa4, 0x04, 0x13, 0xfb, 0xc8, 0x94, 0xae, 0x8c, 0xbf, + 0x4a, 0xdf, 0x19, 0x7f, 0x22, 0x47, 0x61, 0xb0, 0x47, 0x8e, 0xc2, 0xf3, 0x30, 0x9c, 0x10, 0xa7, + 0x2d, 0x02, 0xb2, 0x84, 0x27, 0x40, 0x9f, 0x00, 0x6b, 0x10, 0x36, 0xf1, 0xa8, 0x14, 0x1b, 0x73, + 0x1a, 0x0d, 0x12, 0xc7, 0x32, 0x09, 0x41, 0x78, 0x53, 0x0b, 0xcb, 0x70, 0x60, 0x4e, 0xea, 0xe9, + 0x14, 0x0b, 0x9c, 0x61, 0x99, 0x1d, 0xf0, 0x5a, 0x9f, 0x03, 0xfe, 0xf5, 0x12, 0x3c, 0xb6, 0xa7, + 0x76, 0xeb, 0x3b, 0x3f, 0xa4, 0x13, 0x93, 0x28, 0x3b, 0x71, 0xae, 0xc7, 0x24, 0xc2, 0x0c, 0xc2, + 0x47, 0x29, 0x0c, 0x8d, 0xfb, 0xb5, 0x8b, 0x4e, 0x5e, 0xe2, 0xa3, 0x94, 0x62, 0x81, 0x33, 0x2c, + 0x0f, 0x3b, 0x2d, 0xff, 0x7e, 0x09, 0x9e, 0xe8, 0xc3, 0x06, 0x28, 0x30, 0xc9, 0x2b, 0x9d, 0x6a, + 0x57, 0xbe, 0x4f, 0x19, 0x91, 0x87, 0x1c, 0xae, 0x6f, 0x94, 0xe0, 0x5c, 0x6f, 0x55, 0x8c, 0x7e, + 0x14, 0x4e, 0x44, 0x2a, 0x0a, 0xcb, 0xcc, 0xd2, 0x3b, 0xcd, 0x3d, 0x09, 0x29, 0x10, 0xce, 0xe2, + 0xa2, 0x49, 0x80, 0xd0, 0x49, 0x36, 0xe2, 0x8b, 0xdb, 0x6e, 0x9c, 0x88, 0x2a, 0x34, 0x63, 0xfc, + 0xec, 0x4a, 0xb6, 0x62, 0x03, 0x83, 0xb2, 0x63, 0xff, 0x66, 0x83, 0x6b, 0x41, 0xc2, 0x1f, 0xe2, + 0xdb, 0x88, 0xd3, 0xf2, 0xce, 0x0e, 0x03, 0x84, 0xb3, 0xb8, 0x94, 0x1d, 0x3b, 0x1d, 0xe5, 0x1d, + 0xe5, 0xfb, 0x0b, 0xc6, 0x6e, 0x41, 0xb5, 0x62, 0x03, 0x23, 0x9b, 0x7f, 0x58, 0xd9, 0x3f, 0xff, + 0xd0, 0xfe, 0x27, 0x25, 0x78, 0xa4, 0xa7, 0x29, 0xd7, 0xdf, 0x02, 0x7c, 0xf0, 0x72, 0x06, 0x0f, + 0x37, 0x77, 0x0e, 0x98, 0xdb, 0xf6, 0x47, 0x3d, 0x66, 0x9a, 0xc8, 0x6d, 0x3b, 0x7c, 0x72, 0xf8, + 0x83, 0x37, 0x9e, 0x5d, 0xe9, 0x6c, 0x03, 0x07, 0x48, 0x67, 0xcb, 0x7c, 0x8c, 0x4a, 0x9f, 0x0b, + 0xf9, 0xcf, 0xca, 0x3d, 0x87, 0x97, 0x6e, 0xfd, 0xfa, 0xf2, 0xd3, 0xce, 0xc2, 0x49, 0xd7, 0x67, + 0xf7, 0x37, 0xad, 0x74, 0xd6, 0x44, 0x61, 0x92, 0x52, 0xfa, 0xf6, 0xf4, 0xf9, 0x0c, 0x1c, 0x77, + 0x3d, 0xf1, 0x00, 0xa6, 0x17, 0x1e, 0x6e, 0x48, 0x0f, 0x96, 0xe0, 0x8a, 0x96, 0xe0, 0xac, 0x1c, + 0x8a, 0x0d, 0x27, 0x22, 0x4d, 0xa1, 0x46, 0x62, 0x91, 0x50, 0xf1, 0x08, 0x4f, 0xca, 0xc8, 0x41, + 0xc0, 0xf9, 0xcf, 0xb1, 0x2b, 0x73, 0x82, 0xd0, 0x6d, 0x88, 0x4d, 0x8e, 0xbe, 0x32, 0x87, 0x36, + 0x62, 0x0e, 0xb3, 0x3f, 0x0c, 0x35, 0xf5, 0xfe, 0x3c, 0xac, 0x5b, 0x4d, 0xba, 0xae, 0xb0, 0x6e, + 0x35, 0xe3, 0x0c, 0x2c, 0xfa, 0xb5, 0xa8, 0x49, 0x9c, 0x59, 0x3d, 0x57, 0xc9, 0x0e, 0xb3, 0x8f, + 0xed, 0x77, 0xc3, 0x88, 0xf2, 0xb3, 0xf4, 0x7b, 0x91, 0x90, 0xfd, 0xa5, 0x41, 0x18, 0x4d, 0x15, + 0x07, 0x4c, 0x39, 0x58, 0xad, 0x7d, 0x1d, 0xac, 0x2c, 0x4c, 0xbf, 0xe3, 0xcb, 0x5b, 0xc6, 0x8c, + 0x30, 0xfd, 0x8e, 0x4f, 0x30, 0x87, 0x51, 0xf3, 0xb6, 0x19, 0xed, 0xe0, 0x8e, 0x2f, 0xc2, 0x69, + 0x95, 0x79, 0x3b, 0xcb, 0x5a, 0xb1, 0x80, 0xa2, 0x4f, 0x58, 0x30, 0x12, 0x33, 0xef, 0x3d, 0x77, + 0x4f, 0x8b, 0x49, 0x77, 0xe5, 0xe8, 0xb5, 0x0f, 0x55, 0x21, 0x4c, 0x16, 0x21, 0x63, 0xb6, 0xe0, + 0x14, 0x47, 0xf4, 0x69, 0x0b, 0x6a, 0xea, 0x32, 0x14, 0x71, 0x15, 0xe0, 0x4a, 0xb1, 0xb5, 0x17, + 0xb9, 0x5f, 0x53, 0x1d, 0x84, 0xa8, 0x22, 0x78, 0x58, 0x33, 0x46, 0xb1, 0xf2, 0x1d, 0x0f, 0x1d, + 0x8f, 0xef, 0x18, 0x72, 0xfc, 0xc6, 0xef, 0x82, 0x5a, 0xdb, 0xf1, 0xdd, 0x75, 0x12, 0x27, 0xdc, + 0x9d, 0x2b, 0x4b, 0xc2, 0xca, 0x46, 0xac, 0xe1, 0x54, 0x21, 0xc7, 0xec, 0xc5, 0x12, 0xc3, 0xff, + 0xca, 0x14, 0xf2, 0x8a, 0x6e, 0xc6, 0x26, 0x8e, 0xe9, 0x2c, 0x86, 0xfb, 0xea, 0x2c, 0x1e, 0xde, + 0xdb, 0x59, 0x6c, 0xff, 0x43, 0x0b, 0xce, 0xe6, 0x7e, 0xb5, 0x07, 0x37, 0xf0, 0xd1, 0xfe, 0x72, + 0x05, 0x4e, 0xe7, 0x54, 0xf9, 0x44, 0x3b, 0xe6, 0x7c, 0xb6, 0x8a, 0x88, 0x21, 0x48, 0x1f, 0x89, + 0xcb, 0x61, 0xcc, 0x99, 0xc4, 0x07, 0x3b, 0xaa, 0xd1, 0xc7, 0x25, 0xe5, 0x7b, 0x7b, 0x5c, 0x62, + 0x4c, 0xcb, 0x81, 0xfb, 0x3a, 0x2d, 0x2b, 0xfb, 0x9c, 0x61, 0xfc, 0xaa, 0x05, 0xe3, 0xed, 0x1e, + 0xa5, 0xe5, 0x85, 0xe3, 0xf1, 0xc6, 0xf1, 0x14, 0xae, 0xaf, 0x3f, 0x7a, 0x67, 0x77, 0xa2, 0x67, + 0x45, 0x7f, 0xdc, 0xb3, 0x57, 0xf6, 0x77, 0xca, 0xc0, 0x4a, 0xcc, 0xb2, 0x4a, 0x6e, 0x3b, 0xe8, + 0xe3, 0x66, 0xb1, 0x60, 0xab, 0xa8, 0xc2, 0xb6, 0x9c, 0xb8, 0x2a, 0x36, 0xcc, 0x47, 0x30, 0xaf, + 0xf6, 0x70, 0x56, 0x68, 0x95, 0xfa, 0x10, 0x5a, 0x9e, 0xac, 0xca, 0x5c, 0x2e, 0xbe, 0x2a, 0x73, + 0x2d, 0x5b, 0x91, 0x79, 0xef, 0x4f, 0x3c, 0xf0, 0x40, 0x7e, 0xe2, 0x5f, 0xb0, 0xb8, 0xe0, 0xc9, + 0x7c, 0x05, 0x6d, 0x19, 0x58, 0x7b, 0x58, 0x06, 0x4f, 0x43, 0x35, 0x26, 0xde, 0xfa, 0x65, 0xe2, + 0x78, 0xc2, 0x82, 0xd0, 0xe7, 0xd7, 0xa2, 0x1d, 0x2b, 0x0c, 0x76, 0x6d, 0xab, 0xe7, 0x05, 0xb7, + 0x2f, 0xb6, 0xc3, 0x64, 0x47, 0xd8, 0x12, 0xfa, 0xda, 0x56, 0x05, 0xc1, 0x06, 0x96, 0xfd, 0xb7, + 0x4a, 0x7c, 0x06, 0x8a, 0x20, 0x88, 0x17, 0x32, 0x17, 0xed, 0xf5, 0x1f, 0x3f, 0xf0, 0x51, 0x80, + 0x86, 0xba, 0xa2, 0x5e, 0x9c, 0x09, 0x5d, 0x3e, 0xf2, 0xfd, 0xd9, 0x82, 0x9e, 0x7e, 0x0d, 0xdd, + 0x86, 0x0d, 0x7e, 0x29, 0x59, 0x5a, 0xde, 0x57, 0x96, 0xa6, 0xc4, 0xca, 0xc0, 0x3e, 0xda, 0xee, + 0x4f, 0x2c, 0x48, 0x59, 0x44, 0x28, 0x84, 0x0a, 0xed, 0xee, 0x4e, 0x31, 0xb7, 0xef, 0x9b, 0xa4, + 0xa9, 0x68, 0x14, 0xd3, 0x9e, 0xfd, 0xc4, 0x9c, 0x11, 0xf2, 0x44, 0xac, 0x04, 0x1f, 0xd5, 0x6b, + 0xc5, 0x31, 0xbc, 0x1c, 0x04, 0x9b, 0xfc, 0x60, 0x53, 0xc7, 0x5d, 0xd8, 0x2f, 0xc0, 0xa9, 0xae, + 0x4e, 0xb1, 0x3b, 0xb5, 0x02, 0xaa, 0x7d, 0x32, 0xd3, 0x95, 0x25, 0x70, 0x62, 0x0e, 0xb3, 0xbf, + 0x61, 0xc1, 0xc9, 0x2c, 0x79, 0xf4, 0xa6, 0x05, 0xa7, 0xe2, 0x2c, 0xbd, 0xe3, 0x1a, 0x3b, 0x15, + 0xef, 0xd8, 0x05, 0xc2, 0xdd, 0x9d, 0xb0, 0xff, 0x9f, 0x98, 0xfc, 0x37, 0x5d, 0xbf, 0x19, 0xdc, + 0x56, 0x86, 0x89, 0xd5, 0xd3, 0x30, 0xa1, 0xeb, 0xb1, 0xb1, 0x41, 0x9a, 0x1d, 0xaf, 0x2b, 0x73, + 0x74, 0x45, 0xb4, 0x63, 0x85, 0xc1, 0x12, 0xe5, 0x3a, 0xa2, 0x6c, 0x7b, 0x66, 0x52, 0xce, 0x8a, + 0x76, 0xac, 0x30, 0xd0, 0x73, 0x30, 0x62, 0xbc, 0xa4, 0x9c, 0x97, 0xcc, 0x20, 0x37, 0x54, 0x66, + 0x8c, 0x53, 0x58, 0x68, 0x12, 0x40, 0x19, 0x39, 0x52, 0x45, 0x32, 0x47, 0x91, 0x92, 0x44, 0x31, + 0x36, 0x30, 0x58, 0x5a, 0xaa, 0xd7, 0x89, 0x99, 0x8f, 0x7f, 0x50, 0x97, 0x12, 0x9d, 0x11, 0x6d, + 0x58, 0x41, 0xa9, 0x34, 0x69, 0x3b, 0x7e, 0xc7, 0xf1, 0xe8, 0x08, 0x89, 0xad, 0x9f, 0x5a, 0x86, + 0x8b, 0x0a, 0x82, 0x0d, 0x2c, 0xfa, 0xc6, 0x89, 0xdb, 0x26, 0x2f, 0x07, 0xbe, 0x8c, 0x53, 0xd3, + 0xc7, 0x3e, 0xa2, 0x1d, 0x2b, 0x0c, 0xfb, 0xbf, 0x5a, 0x70, 0x42, 0x27, 0xb9, 0xf3, 0xdb, 0xb3, + 0xcd, 0x9d, 0xaa, 0xb5, 0xef, 0x4e, 0x35, 0x9d, 0xfd, 0x5b, 0xea, 0x2b, 0xfb, 0xd7, 0x4c, 0xcc, + 0x2d, 0xef, 0x99, 0x98, 0xfb, 0x83, 0xfa, 0x66, 0x56, 0x9e, 0xc1, 0x3b, 0x9c, 0x77, 0x2b, 0x2b, + 0xb2, 0x61, 0xb0, 0xe1, 0xa8, 0x0a, 0x2f, 0x23, 0x7c, 0xef, 0x30, 0x33, 0xcd, 0x90, 0x04, 0xc4, + 0x5e, 0x82, 0x9a, 0x3a, 0xfd, 0x90, 0x1b, 0x55, 0x2b, 0x7f, 0xa3, 0xda, 0x57, 0x82, 0x60, 0x7d, + 0xed, 0x9b, 0xdf, 0x7d, 0xfc, 0x6d, 0xbf, 0xfb, 0xdd, 0xc7, 0xdf, 0xf6, 0x87, 0xdf, 0x7d, 0xfc, + 0x6d, 0x9f, 0xb8, 0xf3, 0xb8, 0xf5, 0xcd, 0x3b, 0x8f, 0x5b, 0xbf, 0x7b, 0xe7, 0x71, 0xeb, 0x0f, + 0xef, 0x3c, 0x6e, 0x7d, 0xe7, 0xce, 0xe3, 0xd6, 0x17, 0xff, 0xd3, 0xe3, 0x6f, 0x7b, 0x39, 0x37, + 0x50, 0x91, 0xfe, 0x78, 0xa6, 0xd1, 0x9c, 0xda, 0xba, 0xc0, 0x62, 0xe5, 0xe8, 0xf2, 0x9a, 0x32, + 0xe6, 0xd4, 0x94, 0x5c, 0x5e, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x75, 0x40, 0xc6, 0xda, 0xa6, + 0xe2, 0x00, 0x00, } func (m *AWSAuthConfig) Marshal() (dAtA []byte, err error) { @@ -6925,6 +6956,44 @@ func (m *ApplicationSetTerminalGenerator) MarshalToSizedBuffer(dAtA []byte) (int return len(dAtA) - i, nil } +func (m *ApplicationSetWatchEvent) 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 *ApplicationSetWatchEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplicationSetWatchEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.ApplicationSet.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *ApplicationSource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -15027,6 +15096,19 @@ func (m *ApplicationSetTerminalGenerator) Size() (n int) { return n } +func (m *ApplicationSetWatchEvent) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + l = m.ApplicationSet.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *ApplicationSource) Size() (n int) { if m == nil { return 0 @@ -18287,6 +18369,17 @@ func (this *ApplicationSetTerminalGenerator) String() string { }, "") return s } +func (this *ApplicationSetWatchEvent) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ApplicationSetWatchEvent{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `ApplicationSet:` + strings.Replace(strings.Replace(this.ApplicationSet.String(), "ApplicationSet", "ApplicationSet", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} func (this *ApplicationSource) String() string { if this == nil { return "nil" @@ -25728,6 +25821,121 @@ func (m *ApplicationSetTerminalGenerator) Unmarshal(dAtA []byte) error { } return nil } +func (m *ApplicationSetWatchEvent) 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: ApplicationSetWatchEvent: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplicationSetWatchEvent: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", 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.Type = k8s_io_apimachinery_pkg_watch.EventType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ApplicationSet", 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 err := m.ApplicationSet.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 *ApplicationSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apis/application/v1alpha1/generated.proto b/pkg/apis/application/v1alpha1/generated.proto index 7a296f1e467fe..7c578f733796b 100644 --- a/pkg/apis/application/v1alpha1/generated.proto +++ b/pkg/apis/application/v1alpha1/generated.proto @@ -395,6 +395,18 @@ message ApplicationSetTerminalGenerator { optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 8; } +// ApplicationSetWatchEvent contains information about applicationset change. +message ApplicationSetWatchEvent { + optional string type = 1; + + // ApplicationSet is: + // * If Type is Added or Modified: the new state of the object. + // * If Type is Deleted: the state of the object immediately before deletion. + // * If Type is Error: *api.Status is recommended; other types may make sense + // depending on context. + optional ApplicationSet applicationSet = 2; +} + // ApplicationSource contains all required information about the source of an application message ApplicationSource { // RepoURL is the URL to the repository (Git or Helm) that contains the application manifests diff --git a/pkg/apis/application/v1alpha1/openapi_generated.go b/pkg/apis/application/v1alpha1/openapi_generated.go index 32eb8a725f353..8d359f07aadaf 100644 --- a/pkg/apis/application/v1alpha1/openapi_generated.go +++ b/pkg/apis/application/v1alpha1/openapi_generated.go @@ -41,6 +41,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetTemplate": schema_pkg_apis_application_v1alpha1_ApplicationSetTemplate(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetTemplateMeta": schema_pkg_apis_application_v1alpha1_ApplicationSetTemplateMeta(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetTerminalGenerator": schema_pkg_apis_application_v1alpha1_ApplicationSetTerminalGenerator(ref), + "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSetWatchEvent": schema_pkg_apis_application_v1alpha1_ApplicationSetWatchEvent(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSource": schema_pkg_apis_application_v1alpha1_ApplicationSource(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSourceDirectory": schema_pkg_apis_application_v1alpha1_ApplicationSourceDirectory(ref), "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSourceHelm": schema_pkg_apis_application_v1alpha1_ApplicationSourceHelm(ref), @@ -1551,6 +1552,36 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSetTerminalGenerator(ref co } } +func schema_pkg_apis_application_v1alpha1_ApplicationSetWatchEvent(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ApplicationSetWatchEvent contains information about applicationset change.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "type": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "applicationSet": { + SchemaProps: spec.SchemaProps{ + Description: "ApplicationSet is:\n * If Type is Added or Modified: the new state of the object.\n * If Type is Deleted: the state of the object immediately before deletion.\n * If Type is Error: *api.Status is recommended; other types may make sense\n depending on context.", + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSet"), + }, + }, + }, + Required: []string{"type", "applicationSet"}, + }, + }, + Dependencies: []string{ + "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1.ApplicationSet"}, + } +} + func schema_pkg_apis_application_v1alpha1_ApplicationSource(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go index 8c851067a6be3..7a40accc3368c 100644 --- a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go @@ -954,6 +954,23 @@ func (in ApplicationSetTerminalGenerators) DeepCopy() ApplicationSetTerminalGene return *out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ApplicationSetWatchEvent) DeepCopyInto(out *ApplicationSetWatchEvent) { + *out = *in + in.ApplicationSet.DeepCopyInto(&out.ApplicationSet) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationSetWatchEvent. +func (in *ApplicationSetWatchEvent) DeepCopy() *ApplicationSetWatchEvent { + if in == nil { + return nil + } + out := new(ApplicationSetWatchEvent) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ApplicationSource) DeepCopyInto(out *ApplicationSource) { *out = *in diff --git a/server/applicationset/applicationset.go b/server/applicationset/applicationset.go index d67815bd9a53d..9d17bd974e0fc 100644 --- a/server/applicationset/applicationset.go +++ b/server/applicationset/applicationset.go @@ -3,6 +3,7 @@ package applicationset import ( "context" "fmt" + "math" "reflect" "sort" "strconv" @@ -16,11 +17,14 @@ import ( v1 "k8s.io/api/core/v1" apierr "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" appsetutils "github.com/argoproj/argo-cd/v2/applicationset/utils" + argocommon "github.com/argoproj/argo-cd/v2/common" "github.com/argoproj/argo-cd/v2/pkg/apiclient/applicationset" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" appclientset "github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned" @@ -29,18 +33,25 @@ import ( "github.com/argoproj/argo-cd/v2/util/argo" "github.com/argoproj/argo-cd/v2/util/collections" "github.com/argoproj/argo-cd/v2/util/db" + "github.com/argoproj/argo-cd/v2/util/env" "github.com/argoproj/argo-cd/v2/util/rbac" "github.com/argoproj/argo-cd/v2/util/security" "github.com/argoproj/argo-cd/v2/util/session" "github.com/argoproj/argo-cd/v2/util/settings" ) +var ( + watchAPIBufferSize = env.ParseNumFromEnv(argocommon.EnvWatchAPIBufferSize, 1000, 0, math.MaxInt32) +) + type Server struct { ns string db db.ArgoDB enf *rbac.Enforcer + kubeclientset kubernetes.Interface appclientset appclientset.Interface appsetInformer cache.SharedIndexInformer + appsetBroadcaster Broadcaster appsetLister applisters.ApplicationSetLister projLister applisters.AppProjectNamespaceLister auditLogger *argo.AuditLogger @@ -56,6 +67,7 @@ func NewServer( enf *rbac.Enforcer, appclientset appclientset.Interface, appsetInformer cache.SharedIndexInformer, + appsetBroadcaster Broadcaster, appsetLister applisters.ApplicationSetLister, projLister applisters.AppProjectNamespaceLister, settings *settings.SettingsManager, @@ -63,12 +75,21 @@ func NewServer( projectLock sync.KeyLock, enabledNamespaces []string, ) applicationset.ApplicationSetServiceServer { + if appsetBroadcaster == nil { + appsetBroadcaster = &broadcasterHandler{} + } + _, err := appsetInformer.AddEventHandler(appsetBroadcaster) + if err != nil { + log.Error(err) + } s := &Server{ ns: namespace, db: db, enf: enf, + kubeclientset: kubeclientset, appclientset: appclientset, appsetInformer: appsetInformer, + appsetBroadcaster: appsetBroadcaster, appsetLister: appsetLister, projLister: projLister, settings: settings, @@ -148,6 +169,108 @@ func (s *Server) List(ctx context.Context, q *applicationset.ApplicationSetListQ } +func (s *Server) Watch(q *applicationset.ApplicationSetWatchQuery, ws applicationset.ApplicationSetService_WatchServer) error { + ctx := ws.Context() + namespace := s.appsetNamespaceOrDefault(q.AppsetNamespace) + + if !s.isNamespaceEnabled(namespace) { + return security.NamespaceNotPermittedError(namespace) + } + + projects := map[string]bool{} + for _, project := range q.GetProjects() { + projects[project] = true + } + + claims := ws.Context().Value("claims") + selector, err := labels.Parse(q.GetSelector()) + if err != nil { + return fmt.Errorf("error parsing the selector: %w", err) + } + + logCtx := log.NewEntry(log.New()) + if q.Name != "" { + logCtx = logCtx.WithField("application", q.GetName()) + } + + minVersion := 0 + if q.GetResourceVersion() != "" { + if minVersion, err = strconv.Atoi(q.GetResourceVersion()); err != nil { + minVersion = 0 + } + } + + // sendIfPermitted is a helper to send the applicationset to the client's streaming channel if the + // caller has RBAC privileges permissions to view it + sendIfPermitted := func(ctx context.Context, a v1alpha1.ApplicationSet, eventType watch.EventType) { + if !s.isApplicationSetPermitted(selector, minVersion, claims, q.GetName(), namespace, projects, a) { + return + } + + err := ws.Send(&v1alpha1.ApplicationSetWatchEvent{ + Type: eventType, + ApplicationSet: a, + }) + if err != nil { + logCtx.Warnf("Unable to send stream message: %v", err) + return + } + } + + events := make(chan *v1alpha1.ApplicationSetWatchEvent, watchAPIBufferSize) + // Mimic watch API behavior: send ADDED events if no resource version provided + // If watch API is executed for one application when emit event even if resource version is provided + // This is required since single app watch API is used for during operations like app syncing and it is + // critical to never miss events. + if q.GetResourceVersion() == "" || q.GetName() != "" { + appsets, err := s.appsetLister.List(selector) + if err != nil { + return fmt.Errorf("error listing appssets with selector: %w", err) + } + sort.Slice(appsets, func(i, j int) bool { + return appsets[i].QualifiedName() < appsets[j].QualifiedName() + }) + for i := range appsets { + sendIfPermitted(ctx, *appsets[i], watch.Added) + } + } + unsubscribe := s.appsetBroadcaster.Subscribe(events) + defer unsubscribe() + for { + select { + case event := <-events: + sendIfPermitted(ctx, event.ApplicationSet, event.Type) + case <-ws.Context().Done(): + return nil + } + } +} + +func (s *Server) isApplicationSetPermitted(selector labels.Selector, minVersion int, claims any, appsetName, appsetNs string, projects map[string]bool, a v1alpha1.ApplicationSet) bool { + if len(projects) > 0 && !projects[a.Spec.Template.Spec.GetProject()] { + return false + } + + if appVersion, err := strconv.Atoi(a.ResourceVersion); err == nil && appVersion < minVersion { + return false + } + matchedEvent := (appsetName == "" || (a.Name == appsetName && a.Namespace == appsetNs)) && selector.Matches(labels.Set(a.Labels)) + if !matchedEvent { + return false + } + + if !s.isNamespaceEnabled(a.Namespace) { + return false + } + + if !s.enf.Enforce(claims, rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionGet, a.RBACName(s.ns)) { + // do not emit appsets user does not have accessing + return false + } + + return true +} + func (s *Server) Create(ctx context.Context, q *applicationset.ApplicationSetCreateRequest) (*v1alpha1.ApplicationSet, error) { appset := q.GetApplicationset() @@ -280,6 +403,38 @@ func (s *Server) Delete(ctx context.Context, q *applicationset.ApplicationSetDel } +// ListResourceEvents returns a list of event resources +func (s *Server) ListResourceEvents(ctx context.Context, q *applicationset.ApplicationSetResourceEventsQuery) (*v1.EventList, error) { + namespace := s.appsetNamespaceOrDefault(q.AppsetNamespace) + + if !s.isNamespaceEnabled(namespace) { + return nil, security.NamespaceNotPermittedError(namespace) + } + + a, err := s.appclientset.ArgoprojV1alpha1().ApplicationSets(namespace).Get(ctx, q.Name, metav1.GetOptions{}) + if err != nil { + return nil, fmt.Errorf("error getting ApplicationSet: %w", err) + } + + if err = s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplicationSets, rbacpolicy.ActionGet, a.RBACName(s.ns)); err != nil { + return nil, err + } + + fieldSelector := fields.SelectorFromSet(map[string]string{ + "involvedObject.name": a.Name, + "involvedObject.uid": string(a.UID), + "involvedObject.namespace": a.Namespace, + }).String() + + log.Infof("Querying for resource events with field selector: %s", fieldSelector) + opts := metav1.ListOptions{FieldSelector: fieldSelector} + list, err := s.kubeclientset.CoreV1().Events(namespace).List(ctx, opts) + if err != nil { + return nil, fmt.Errorf("error listing resource events: %w", err) + } + return list, nil +} + func (s *Server) validateAppSet(ctx context.Context, appset *v1alpha1.ApplicationSet) (string, error) { if appset == nil { return "", fmt.Errorf("ApplicationSet cannot be validated for nil value") diff --git a/server/applicationset/applicationset.proto b/server/applicationset/applicationset.proto index 2a857d41a00ce..03a8089e2b252 100644 --- a/server/applicationset/applicationset.proto +++ b/server/applicationset/applicationset.proto @@ -8,6 +8,7 @@ option go_package = "github.com/argoproj/argo-cd/v2/pkg/apiclient/applicationset package applicationset; import "google/api/annotations.proto"; +import "k8s.io/api/core/v1/generated.proto"; import "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1/generated.proto"; // ApplicationSetGetQuery is a query for applicationset resources @@ -28,6 +29,26 @@ message ApplicationSetListQuery { } +// ApplicationSetEventsQuery is a query for applicationset resource events +message ApplicationSetResourceEventsQuery { + string name = 1; + string appsetNamespace = 5; +} + +message ApplicationSetWatchQuery { + // the applicationsets's name + string name = 1; + // the project names to restrict returned list applicationsets + repeated string projects = 2; + // the selector to restrict returned list to applicationsets only with matched labels + string selector = 3; + // The application set namespace. Default empty is argocd control plane namespace + string appsetNamespace = 4; + // when specified with a watch call, shows changes that occur after that particular version of a resource. + string resourceVersion = 5; +} + + message ApplicationSetResponse { string project = 1; github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSet applicationset = 2; @@ -60,6 +81,16 @@ service ApplicationSetService { option (google.api.http).get = "/api/v1/applicationsets"; } + // ListResourceEvents returns a list of event resources + rpc ListResourceEvents(ApplicationSetResourceEventsQuery) returns (k8s.io.api.core.v1.EventList) { + option (google.api.http).get = "/api/v1/applicationsets/{name}/events"; + } + + // Watch returns stream of applicationset change events + rpc Watch(ApplicationSetWatchQuery) returns (stream github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSetWatchEvent) { + option (google.api.http).get = "/api/v1/stream/applicationsets"; + } + //Create creates an applicationset rpc Create (ApplicationSetCreateRequest) returns (github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSet) { option (google.api.http) = { @@ -73,4 +104,4 @@ service ApplicationSetService { option (google.api.http).delete = "/api/v1/applicationsets/{name}"; } -} \ No newline at end of file +} diff --git a/server/applicationset/applicationset_test.go b/server/applicationset/applicationset_test.go index c49ddb35a7970..d736bef620ff3 100644 --- a/server/applicationset/applicationset_test.go +++ b/server/applicationset/applicationset_test.go @@ -2,13 +2,20 @@ package applicationset import ( "context" + "fmt" + "strconv" "testing" + "time" + appsetmocks "github.com/argoproj/argo-cd/v2/server/applicationset/mocks" "github.com/argoproj/pkg/sync" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "google.golang.org/grpc/metadata" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/kubernetes/fake" k8scache "k8s.io/client-go/tools/cache" @@ -51,7 +58,17 @@ func newTestAppSetServer(objects ...runtime.Object) *Server { enf.SetDefaultRole("role:admin") } scopedNamespaces := "" - return newTestAppSetServerWithEnforcerConfigure(f, scopedNamespaces, objects...) + return newTestAppSetServerWithEnforcerConfigure(f, scopedNamespaces, []runtime.Object{}, objects...) +} + +// return an ApplicationServiceServer which returns fake data +func newTestAppSetServerWithKubeObjects(kubeObjects []runtime.Object, objects ...runtime.Object) *Server { + f := func(enf *rbac.Enforcer) { + _ = enf.SetBuiltinPolicy(assets.BuiltinPolicyCSV) + enf.SetDefaultRole("role:admin") + } + scopedNamespaces := "" + return newTestAppSetServerWithEnforcerConfigure(f, scopedNamespaces, kubeObjects, objects...) } // return an ApplicationServiceServer which returns fake data @@ -61,11 +78,11 @@ func newTestNamespacedAppSetServer(objects ...runtime.Object) *Server { enf.SetDefaultRole("role:admin") } scopedNamespaces := "argocd" - return newTestAppSetServerWithEnforcerConfigure(f, scopedNamespaces, objects...) + return newTestAppSetServerWithEnforcerConfigure(f, scopedNamespaces, []runtime.Object{}, objects...) } -func newTestAppSetServerWithEnforcerConfigure(f func(*rbac.Enforcer), namespace string, objects ...runtime.Object) *Server { - kubeclientset := fake.NewSimpleClientset(&v1.ConfigMap{ +func newTestAppSetServerWithEnforcerConfigure(f func(*rbac.Enforcer), namespace string, kubeObjects []runtime.Object, objects ...runtime.Object) *Server { + kubeObjects = append(kubeObjects, &v1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ Namespace: testNamespace, Name: "argocd-cm", @@ -83,6 +100,7 @@ func newTestAppSetServerWithEnforcerConfigure(f func(*rbac.Enforcer), namespace "server.secretkey": []byte("test"), }, }) + kubeclientset := fake.NewSimpleClientset(kubeObjects...) ctx := context.Background() db := db.NewDB(testNamespace, settings.NewSettingsManager(ctx, kubeclientset, testNamespace), kubeclientset) _, err := db.CreateRepository(ctx, fakeRepo()) @@ -132,6 +150,31 @@ func newTestAppSetServerWithEnforcerConfigure(f func(*rbac.Enforcer), namespace panic("Timed out waiting for caches to sync") } + broadcaster := new(appsetmocks.Broadcaster) + broadcaster.On("Subscribe", mock.Anything, mock.Anything).Return(func() {}).Run(func(args mock.Arguments) { + // Simulate the broadcaster notifying the subscriber of an applicationset update. + // The second parameter to Subscribe is filters. For the purposes of tests, we ignore the filters. Future tests + // might require implementing those. + go func() { + events := args.Get(0).(chan *appsv1.ApplicationSetWatchEvent) + for _, obj := range objects { + app, ok := obj.(*appsv1.ApplicationSet) + if ok { + oldVersion, err := strconv.Atoi(app.ResourceVersion) + if err != nil { + oldVersion = 0 + } + clonedAppSet := app.DeepCopy() + clonedAppSet.ResourceVersion = fmt.Sprintf("%d", oldVersion+1) + events <- &appsv1.ApplicationSetWatchEvent{Type: watch.Added, ApplicationSet: *clonedAppSet} + } + } + }() + }) + broadcaster.On("OnAdd", mock.Anything).Return() + broadcaster.On("OnUpdate", mock.Anything, mock.Anything).Return() + broadcaster.On("OnDelete", mock.Anything).Return() + projInformer := factory.Argoproj().V1alpha1().AppProjects().Informer() go projInformer.Run(ctx.Done()) if !k8scache.WaitForCacheSync(ctx.Done(), projInformer.HasSynced) { @@ -144,6 +187,7 @@ func newTestAppSetServerWithEnforcerConfigure(f func(*rbac.Enforcer), namespace enforcer, fakeAppsClientset, appInformer, + broadcaster, factory.Argoproj().V1alpha1().ApplicationSets().Lister(), fakeProjLister, settingsMgr, @@ -384,6 +428,97 @@ func TestGetAppSet(t *testing.T) { }) } +func TestWatchAppSet(t *testing.T) { + appSet1 := newTestAppSet(func(appset *appsv1.ApplicationSet) { + appset.Name = "AppSet1" + }) + + appSet2 := newTestAppSet(func(appset *appsv1.ApplicationSet) { + appset.Name = "AppSet2" + }) + + appSet3 := newTestAppSet(func(appset *appsv1.ApplicationSet) { + appset.Name = "AppSet3" + }) + + t.Run("Watch in default namespace", func(t *testing.T) { + + appSetServer := newTestAppSetServer(appSet1, appSet2, appSet3) + + appsetQuery := applicationset.ApplicationSetWatchQuery{Name: "AppSet1"} + + ctx, cancel := context.WithCancel(context.Background()) + watchServer := &TestWatchServer{ctx: ctx} + go func() { + // Watch will block until canceled so give 500ms to read send events and cancel + time.Sleep(500 * time.Millisecond) + cancel() + + }() + err := appSetServer.Watch(&appsetQuery, watchServer) + + assert.NoError(t, err) + assert.Len(t, watchServer.sent, 2) // Sent twice because of workaround to avoid missing events + assert.Equal(t, watchServer.sent[0].Type, watch.Added) + assert.Equal(t, watchServer.sent[0].ApplicationSet.Name, "AppSet1") + }) + + t.Run("Watch in named namespace", func(t *testing.T) { + + appSetServer := newTestAppSetServer(appSet1, appSet2, appSet3) + + appsetQuery := applicationset.ApplicationSetWatchQuery{Name: "AppSet1", AppsetNamespace: testNamespace} + + ctx, cancel := context.WithCancel(context.Background()) + watchServer := &TestWatchServer{ctx: ctx} + go func() { + // Watch will block until canceled so give 500ms to read send events and cancel + time.Sleep(500 * time.Millisecond) + cancel() + + }() + err := appSetServer.Watch(&appsetQuery, watchServer) + + assert.NoError(t, err) + assert.Len(t, watchServer.sent, 2) // Sent twice because of workaround to avoid missing events + assert.Equal(t, watchServer.sent[0].Type, watch.Added) + assert.Equal(t, watchServer.sent[0].ApplicationSet.Name, "AppSet1") + }) + + t.Run("Watch in not allowed namespace", func(t *testing.T) { + + appSetServer := newTestAppSetServer(appSet1, appSet2, appSet3) + + appsetQuery := applicationset.ApplicationSetWatchQuery{Name: "AppSet1", AppsetNamespace: "NOT-ALLOWED"} + + watchServer := &TestWatchServer{ctx: context.Background()} + err := appSetServer.Watch(&appsetQuery, watchServer) + + assert.Equal(t, "namespace 'NOT-ALLOWED' is not permitted", err.Error()) + assert.Len(t, watchServer.sent, 0) + }) + + t.Run("Watch all appsets in default namespace", func(t *testing.T) { + + appSetServer := newTestAppSetServer(appSet1, appSet2, appSet3) + + appsetQuery := applicationset.ApplicationSetWatchQuery{} + + ctx, cancel := context.WithCancel(context.Background()) + watchServer := &TestWatchServer{ctx: ctx} + go func() { + // Watch will block until canceled so give 500ms to read events and cancel + time.Sleep(500 * time.Millisecond) + cancel() + + }() + err := appSetServer.Watch(&appsetQuery, watchServer) + + assert.NoError(t, err) + assert.Len(t, watchServer.sent, 6) // Sent twice because of workaround to avoid missing events + }) +} + func TestDeleteAppSet(t *testing.T) { appSet1 := newTestAppSet(func(appset *appsv1.ApplicationSet) { appset.Name = "AppSet1" @@ -474,3 +609,99 @@ func TestUpdateAppSet(t *testing.T) { }) } + +func TestListResourceEventsAppSet(t *testing.T) { + appSet := newTestAppSet(func(appset *appsv1.ApplicationSet) { + appset.Name = "AppSet1" + }) + + event1 := &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "event1", + Namespace: testNamespace, + }, + InvolvedObject: v1.ObjectReference{ + Name: appSet.Name, + Namespace: testNamespace, + UID: appSet.UID, + }, + } + + event2 := &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "event2", + Namespace: "other-namespace", + }, + InvolvedObject: v1.ObjectReference{ + Name: appSet.Name, + Namespace: "other-namespace", + UID: appSet.UID, + }, + } + + t.Run("List events in default namespace", func(t *testing.T) { + + appSetServer := newTestAppSetServerWithKubeObjects([]runtime.Object{event1, event2}, appSet) + + q := applicationset.ApplicationSetResourceEventsQuery{Name: "AppSet1"} + + res, err := appSetServer.ListResourceEvents(context.Background(), &q) + assert.NoError(t, err) + assert.Len(t, res.Items, 1) + assert.Equal(t, res.Items[0].Message, event1.Message) + }) + + t.Run("List events in named namespace", func(t *testing.T) { + + appSetServer := newTestAppSetServerWithKubeObjects([]runtime.Object{event1, event2}, appSet) + + q := applicationset.ApplicationSetResourceEventsQuery{Name: "AppSet1", AppsetNamespace: testNamespace} + + res, err := appSetServer.ListResourceEvents(context.Background(), &q) + assert.NoError(t, err) + assert.Len(t, res.Items, 1) + assert.Equal(t, res.Items[0].Message, event1.Message) + }) + + t.Run("List events in not allowed namespace", func(t *testing.T) { + + appSetServer := newTestAppSetServerWithKubeObjects([]runtime.Object{event1, event2}, appSet) + + q := applicationset.ApplicationSetResourceEventsQuery{Name: "AppSet1", AppsetNamespace: "NOT-ALLOWED"} + + _, err := appSetServer.ListResourceEvents(context.Background(), &q) + assert.Equal(t, "namespace 'NOT-ALLOWED' is not permitted", err.Error()) + }) +} + +type TestWatchServer struct { + ctx context.Context + sent []*appsv1.ApplicationSetWatchEvent +} + +func (t *TestWatchServer) Send(event *appsv1.ApplicationSetWatchEvent) error { + t.sent = append(t.sent, event) + return nil +} + +func (t *TestWatchServer) SetHeader(metadata.MD) error { + return nil +} + +func (t *TestWatchServer) SendHeader(metadata.MD) error { + return nil +} + +func (t *TestWatchServer) SetTrailer(metadata.MD) {} + +func (t *TestWatchServer) Context() context.Context { + return t.ctx +} + +func (t *TestWatchServer) SendMsg(m interface{}) error { + return nil +} + +func (t *TestWatchServer) RecvMsg(m interface{}) error { + return nil +} diff --git a/server/applicationset/broadcaster.go b/server/applicationset/broadcaster.go new file mode 100644 index 0000000000000..77e03221be369 --- /dev/null +++ b/server/applicationset/broadcaster.go @@ -0,0 +1,94 @@ +package applicationset + +import ( + "sync" + + appv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" + log "github.com/sirupsen/logrus" + "k8s.io/apimachinery/pkg/watch" +) + +type subscriber struct { + ch chan *appv1.ApplicationSetWatchEvent + filters []func(*appv1.ApplicationSetWatchEvent) bool +} + +func (s *subscriber) matches(event *appv1.ApplicationSetWatchEvent) bool { + for i := range s.filters { + if !s.filters[i](event) { + return false + } + } + return true +} + +// Broadcaster is an interface for broadcasting application informer watch events to multiple subscribers. +type Broadcaster interface { + Subscribe(ch chan *appv1.ApplicationSetWatchEvent, filters ...func(event *appv1.ApplicationSetWatchEvent) bool) func() + OnAdd(interface{}) + OnUpdate(interface{}, interface{}) + OnDelete(interface{}) +} + +type broadcasterHandler struct { + lock sync.Mutex + subscribers []*subscriber +} + +func (b *broadcasterHandler) notify(event *appv1.ApplicationSetWatchEvent) { + // Make a local copy of b.subscribers, then send channel events outside the lock, + // to avoid data race on b.subscribers changes + subscribers := []*subscriber{} + b.lock.Lock() + subscribers = append(subscribers, b.subscribers...) + b.lock.Unlock() + + for _, s := range subscribers { + if s.matches(event) { + select { + case s.ch <- event: + default: + // drop event if cannot send right away + log.WithField("applicationset", event.ApplicationSet.Name).Warn("unable to send event notification") + } + } + } +} + +// Subscribe forward application informer watch events to the provided channel. +// The watch events are dropped if no receives are reading events from the channel so the channel must have +// buffer if dropping events is not acceptable. +func (b *broadcasterHandler) Subscribe(ch chan *appv1.ApplicationSetWatchEvent, filters ...func(event *appv1.ApplicationSetWatchEvent) bool) func() { + b.lock.Lock() + defer b.lock.Unlock() + subscriber := &subscriber{ch, filters} + b.subscribers = append(b.subscribers, subscriber) + return func() { + b.lock.Lock() + defer b.lock.Unlock() + for i := range b.subscribers { + if b.subscribers[i] == subscriber { + b.subscribers = append(b.subscribers[:i], b.subscribers[i+1:]...) + break + } + } + } +} + +func (b *broadcasterHandler) OnAdd(obj interface{}) { + if app, ok := obj.(*appv1.ApplicationSet); ok { + b.notify(&appv1.ApplicationSetWatchEvent{ApplicationSet: *app, Type: watch.Added}) + } +} + +func (b *broadcasterHandler) OnUpdate(_, newObj interface{}) { + if app, ok := newObj.(*appv1.ApplicationSet); ok { + b.notify(&appv1.ApplicationSetWatchEvent{ApplicationSet: *app, Type: watch.Modified}) + } +} + +func (b *broadcasterHandler) OnDelete(obj interface{}) { + if app, ok := obj.(*appv1.ApplicationSet); ok { + b.notify(&appv1.ApplicationSetWatchEvent{ApplicationSet: *app, Type: watch.Deleted}) + } +} diff --git a/server/applicationset/broadcaster_test.go b/server/applicationset/broadcaster_test.go new file mode 100644 index 0000000000000..f2e063fcfacec --- /dev/null +++ b/server/applicationset/broadcaster_test.go @@ -0,0 +1,53 @@ +package applicationset + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + + appv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" +) + +func TestBroadcasterHandler_SubscribeUnsubscribe(t *testing.T) { + broadcaster := broadcasterHandler{} + + subscriber := make(chan *appv1.ApplicationSetWatchEvent) + unsubscribe := broadcaster.Subscribe(subscriber) + + assert.Len(t, broadcaster.subscribers, 1) + + unsubscribe() + assert.Empty(t, broadcaster.subscribers) +} + +func TestBroadcasterHandler_ReceiveEvents(t *testing.T) { + broadcaster := broadcasterHandler{} + + subscriber1 := make(chan *appv1.ApplicationSetWatchEvent, 1000) + subscriber2 := make(chan *appv1.ApplicationSetWatchEvent, 1000) + + _ = broadcaster.Subscribe(subscriber1) + _ = broadcaster.Subscribe(subscriber2) + + firstReceived := false + secondReceived := false + + go broadcaster.notify(&appv1.ApplicationSetWatchEvent{}) + + for { + select { + case <-time.After(1 * time.Second): + t.Error("timeout expired") + return + case <-subscriber1: + firstReceived = true + case <-subscriber2: + secondReceived = true + } + if firstReceived && secondReceived { + return + } + } + +} diff --git a/server/applicationset/mocks/Broadcaster.go b/server/applicationset/mocks/Broadcaster.go new file mode 100644 index 0000000000000..45d144a97ab82 --- /dev/null +++ b/server/applicationset/mocks/Broadcaster.go @@ -0,0 +1,69 @@ +// Code generated by mockery v2.39.1. DO NOT EDIT. + +package mocks + +import ( + v1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" + mock "github.com/stretchr/testify/mock" +) + +// Broadcaster is an autogenerated mock type for the Broadcaster type +type Broadcaster struct { + mock.Mock +} + +// OnAdd provides a mock function with given fields: _a0 +func (_m *Broadcaster) OnAdd(_a0 interface{}) { + _m.Called(_a0) +} + +// OnDelete provides a mock function with given fields: _a0 +func (_m *Broadcaster) OnDelete(_a0 interface{}) { + _m.Called(_a0) +} + +// OnUpdate provides a mock function with given fields: _a0, _a1 +func (_m *Broadcaster) OnUpdate(_a0 interface{}, _a1 interface{}) { + _m.Called(_a0, _a1) +} + +// Subscribe provides a mock function with given fields: ch, filters +func (_m *Broadcaster) Subscribe(ch chan *v1alpha1.ApplicationSetWatchEvent, filters ...func(*v1alpha1.ApplicationSetWatchEvent) bool) func() { + _va := make([]interface{}, len(filters)) + for _i := range filters { + _va[_i] = filters[_i] + } + var _ca []interface{} + _ca = append(_ca, ch) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for Subscribe") + } + + var r0 func() + if rf, ok := ret.Get(0).(func(chan *v1alpha1.ApplicationSetWatchEvent, ...func(*v1alpha1.ApplicationSetWatchEvent) bool) func()); ok { + r0 = rf(ch, filters...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(func()) + } + } + + return r0 +} + +// NewBroadcaster creates a new instance of Broadcaster. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewBroadcaster(t interface { + mock.TestingT + Cleanup(func()) +}) *Broadcaster { + mock := &Broadcaster{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/server/server.go b/server/server.go index 625fa2053023e..9e6d11c8d9ae3 100644 --- a/server/server.go +++ b/server/server.go @@ -870,6 +870,7 @@ func newArgoCDServiceSet(a *ArgoCDServer) *ArgoCDServiceSet { a.enf, a.AppClientset, a.appsetInformer, + nil, a.appsetLister, a.projLister, a.settingsMgr, diff --git a/ui/src/app/app.tsx b/ui/src/app/app.tsx index d0a58d3fbdc7f..74e71dad56f28 100644 --- a/ui/src/app/app.tsx +++ b/ui/src/app/app.tsx @@ -31,6 +31,7 @@ type Routes = {[path: string]: {component: React.ComponentType { } /> - services.applications.list([], {fields: ['items.metadata.name']})}> + services.applications.list([], ctx, {fields: ['items.metadata.name']})}> {apps => apps.items .filter(app => { diff --git a/ui/src/app/applications/components/application-details/application-details.tsx b/ui/src/app/applications/components/application-details/application-details.tsx index a3e8175591dde..3eb16ccfdaa0c 100644 --- a/ui/src/app/applications/components/application-details/application-details.tsx +++ b/ui/src/app/applications/components/application-details/application-details.tsx @@ -11,7 +11,15 @@ import {delay, filter, map, mergeMap, repeat, retryWhen} from 'rxjs/operators'; import {DataLoader, EmptyState, ErrorNotification, ObservableQuery, Page, Paginate, Revision, Timestamp} from '../../../shared/components'; import {AppContext, ContextApis} from '../../../shared/context'; import * as appModels from '../../../shared/models'; -import {AppDetailsPreferences, AppsDetailsViewKey, AppsDetailsViewType, services} from '../../../shared/services'; +import { + AbstractAppDetailsPreferences, + AppDetailsPreferences, + AppSetsDetailsViewKey, + AppSetsDetailsViewType, + AppsDetailsViewKey, + AppsDetailsViewType, + services +} from '../../../shared/services'; import {ApplicationConditions} from '../application-conditions/application-conditions'; import {ApplicationDeploymentHistory} from '../application-deployment-history/application-deployment-history'; @@ -23,9 +31,9 @@ import {ApplicationSyncPanel} from '../application-sync-panel/application-sync-p import {ResourceDetails} from '../resource-details/resource-details'; import * as AppUtils from '../utils'; import {ApplicationResourceList} from './application-resource-list'; -import {Filters, FiltersProps} from './application-resource-filter'; -import {getAppDefaultSource, urlPattern, helpTip} from '../utils'; -import {ChartDetails, ResourceStatus} from '../../../shared/models'; +import {AbstractFiltersProps, Filters} from './application-resource-filter'; +import {getAppDefaultSource, urlPattern, helpTip, isApp, isInvokedFromAppsPath} from '../utils'; +import {AbstractApplication, ApplicationTree, ChartDetails, ResourceStatus} from '../../../shared/models'; import {ApplicationsDetailsAppDropdown} from './application-details-app-dropdown'; import {useSidebarTarget} from '../../../sidebar/sidebar'; @@ -54,7 +62,7 @@ interface FilterInput { namespace: string[]; } -const ApplicationDetailsFilters = (props: FiltersProps) => { +const ApplicationDetailsFilters = (props: AbstractFiltersProps) => { const sidebarTarget = useSidebarTarget(); return ReactDOM.createPortal(, sidebarTarget?.current); }; @@ -79,7 +87,7 @@ export class ApplicationDetails extends React.Component(null); + private appChanged = new BehaviorSubject(null); private appNamespace: string; constructor(props: RouteComponentProps<{appnamespace: string; name: string}>) { @@ -160,22 +168,36 @@ export class ApplicationDetails extends React.Component (usrMsg.appName === appName && usrMsg.msgKey === 'groupNodes' ? {...usrMsg, display: true} : usrMsg)); + private toggleCompactView(app: AbstractApplication, pref: AbstractAppDetailsPreferences) { + if (isApp(app)) { + (pref as AppDetailsPreferences).userHelpTipMsgs = (pref as AppDetailsPreferences).userHelpTipMsgs.map(usrMsg => + usrMsg.appName === app.metadata.name && usrMsg.msgKey === 'groupNodes' ? {...usrMsg, display: true} : usrMsg + ); + } services.viewPreferences.updatePreferences({appDetails: {...pref, groupNodes: !pref.groupNodes}}); } - private getPageTitle(view: string) { - const {Tree, Pods, Network, List} = AppsDetailsViewKey; - switch (view) { - case Tree: - return 'Application Details Tree'; - case Network: - return 'Application Details Network'; - case Pods: - return 'Application Details Pods'; - case List: - return 'Application Details List'; + private getPageTitle(view: string, isAnApp: boolean) { + if (isAnApp) { + const {Tree, Pods, Network, List} = AppsDetailsViewKey; + switch (view) { + case Tree: + return 'Application Details Tree'; + case Network: + return 'Application Details Network'; + case Pods: + return 'Application Details Pods'; + case List: + return 'Application Details List'; + } + } else { + const {Tree, List} = AppSetsDetailsViewKey; + switch (view) { + case Tree: + return 'ApplicationSet Details Tree'; + case List: + return 'ApplicationSet Details List'; + } } return ''; } @@ -185,8 +207,12 @@ export class ApplicationDetails extends React.Component {q => ( {error}} - loadingRenderer={() => Loading...} + errorRenderer={error => ( + {error} + )} + loadingRenderer={() => ( + Loading... + )} input={this.props.match.params.name} load={name => combineLatest([this.loadAppInfo(name, this.appNamespace), services.viewPreferences.getPreferences(), q]).pipe( @@ -201,11 +227,15 @@ export class ApplicationDetails extends React.Component !!item); } if (params.get('view') != null) { - pref.view = params.get('view') as AppsDetailsViewType; + pref.view = isApp(application) ? (params.get('view') as AppsDetailsViewType) : (params.get('view') as AppSetsDetailsViewType); } else { - const appDefaultView = (application.metadata && - application.metadata.annotations && - application.metadata.annotations[appModels.AnnotationDefaultView]) as AppsDetailsViewType; + const appDefaultView = isApp(application) + ? ((application.metadata && + application.metadata.annotations && + application.metadata.annotations[appModels.AnnotationDefaultView]) as AppsDetailsViewType) + : ((application.metadata && + application.metadata.annotations && + application.metadata.annotations[appModels.AnnotationDefaultView]) as AppSetsDetailsViewType); if (appDefaultView != null) { pref.view = appDefaultView; } @@ -213,21 +243,29 @@ export class ApplicationDetails extends React.Component - {({application, tree, pref}: {application: appModels.Application; tree: appModels.ApplicationTree; pref: AppDetailsPreferences}) => { + {({ + application, + tree, + pref + }: { + application: appModels.AbstractApplication; + tree: appModels.AbstractApplicationTree; + pref: AbstractAppDetailsPreferences; + }) => { tree.nodes = tree.nodes || []; const treeFilter = this.getTreeFilter(pref.resourceFilter); const setFilter = (items: string[]) => { @@ -240,19 +278,28 @@ export class ApplicationDetails extends React.Component usrMsg.appName === application.metadata.name); + const source = isApp(application) ? getAppDefaultSource(application as models.Application) : null; + const showToolTip = isApp(application) + ? (pref as AppDetailsPreferences)?.userHelpTipMsgs.find(usrMsg => usrMsg.appName === application.metadata.name) + : null; const resourceNodes = (): any[] => { const statusByKey = new Map(); - application.status.resources.forEach(res => statusByKey.set(AppUtils.nodeKey(res), res)); + if (isApp(application)) { + (application as models.Application).status.resources.forEach(res => statusByKey.set(AppUtils.nodeKey(res), res)); + } const resources = new Map(); tree.nodes .map(node => ({...node, orphaned: false})) - .concat(((pref.orphanedResources && tree.orphanedNodes) || []).map(node => ({...node, orphaned: true}))) + .concat( + ((pref.orphanedResources && isApp(application) ? (tree as models.ApplicationTree).orphanedNodes : []) || []).map(node => ({ + ...node, + orphaned: true + })) + ) .forEach(node => { const resource: any = {...node}; resource.uid = node.uid; @@ -312,11 +359,15 @@ export class ApplicationDetails extends React.Component { - const existingIndex = pref.userHelpTipMsgs.findIndex(msg => msg.appName === usrHelpTip.appName && msg.msgKey === usrHelpTip.msgKey); - if (existingIndex !== -1) { - pref.userHelpTipMsgs[existingIndex] = usrHelpTip; - } else { - (pref.userHelpTipMsgs || []).push(usrHelpTip); + if (isApp(application)) { + const existingIndex = (pref as AppDetailsPreferences).userHelpTipMsgs.findIndex( + msg => msg.appName === usrHelpTip.appName && msg.msgKey === usrHelpTip.msgKey + ); + if (existingIndex !== -1) { + (pref as AppDetailsPreferences).userHelpTipMsgs[existingIndex] = usrHelpTip; + } else { + ((pref as AppDetailsPreferences).userHelpTipMsgs || []).push(usrHelpTip); + } } }; const toggleNameDirection = () => { @@ -329,7 +380,7 @@ export class ApplicationDetails extends React.Component(); tree.nodes .map(node => ({...node, orphaned: false})) - .concat((tree.orphanedNodes || []).map(node => ({...node, orphaned: true}))) + .concat((isApp(application) ? (tree as models.ApplicationTree).orphanedNodes : [] || []).map(node => ({...node, orphaned: true}))) .forEach(node => { const resourceNode: ResourceTreeNode = {...node}; nodes.push(resourceNode); @@ -372,12 +423,12 @@ export class ApplicationDetails extends React.Component } ], actionMenu: {items: this.getApplicationActionMenu(application, true)}, @@ -392,22 +443,26 @@ export class ApplicationDetails extends React.Component - { - this.appContext.apis.navigation.goto('.', {view: Pods}); - services.viewPreferences.updatePreferences({appDetails: {...pref, view: Pods}}); - }} - /> - { - this.appContext.apis.navigation.goto('.', {view: Network}); - services.viewPreferences.updatePreferences({appDetails: {...pref, view: Network}}); - }} - /> + {isApp(application) && ( + { + this.appContext.apis.navigation.goto('.', {view: Pods}); + services.viewPreferences.updatePreferences({appDetails: {...pref, view: Pods}}); + }} + /> + )} + {isApp(application) && ( + { + this.appContext.apis.navigation.goto('.', {view: Network}); + services.viewPreferences.updatePreferences({appDetails: {...pref, view: Network}}); + }} + /> + )} this.toggleCompactView(application.metadata.name, pref)}> + onClick={() => this.toggleCompactView(application, pref)}> @@ -511,12 +566,18 @@ export class ApplicationDetails extends React.Component this.selectNode(fullName)} nodeMenu={node => - AppUtils.renderResourceMenu(node, application, tree, this.appContext.apis, this.appChanged, () => - this.getApplicationActionMenu(application, false) + AppUtils.renderResourceMenu( + node, + application, + tree as ApplicationTree, + this.appContext.apis, + this.props.history, + this.appChanged, + () => this.getApplicationActionMenu(application, false) ) } showCompactNodes={pref.groupNodes} - userMsgs={pref.userHelpTipMsgs} + userMsgs={isApp(application) ? (pref as AppDetailsPreferences).userHelpTipMsgs : []} tree={tree} app={application} showOrphanedResources={pref.orphanedResources} @@ -524,7 +585,7 @@ export class ApplicationDetails extends React.Component openGroupNodeDetails(groupdedNodeIds)} zoom={pref.zoom} - podGroupCount={pref.podGroupCount} + // podGroupCount={isApp(application) ? (pref as AppDetailsPreferences).podGroupCount : 0} appContext={this.appContext} nameDirection={this.state.truncateNameOnRight} filters={pref.resourceFilter} @@ -538,19 +599,34 @@ export class ApplicationDetails extends React.Component this.selectNode(fullName)} nodeMenu={node => - AppUtils.renderResourceMenu(node, application, tree, this.appContext.apis, this.appChanged, () => - this.getApplicationActionMenu(application, false) + AppUtils.renderResourceMenu( + node, + application, + tree as ApplicationTree, + this.appContext.apis, + this.props.history, + this.appChanged, + () => this.getApplicationActionMenu(application, false) + ) + } + quickStarts={node => + AppUtils.renderResourceButtons( + node, + application, + tree as ApplicationTree, + this.appContext.apis, + this.props.history, + this.appChanged ) } - quickStarts={node => AppUtils.renderResourceButtons(node, application, tree, this.appContext.apis, this.appChanged)} /> )) || (this.state.extensionsMap[pref.view] != null && ( - + )) || (
services.viewPreferences.getPreferences()}> @@ -579,13 +655,14 @@ export class ApplicationDetails extends React.Component this.getApplicationActionMenu(application, false) ) } - tree={tree} + tree={tree as ApplicationTree} /> )} @@ -611,11 +688,17 @@ export class ApplicationDetails extends React.Component this.selectNode(fullName)} resources={data} nodeMenu={node => - AppUtils.renderResourceMenu({...node, root: node}, application, tree, this.appContext.apis, this.appChanged, () => - this.getApplicationActionMenu(application, false) + AppUtils.renderResourceMenu( + {...node, root: node}, + application, + tree as ApplicationTree, + this.appContext.apis, + this.props.history, + this.appChanged, + () => this.getApplicationActionMenu(application, false) ) } - tree={tree} + tree={tree as ApplicationTree} /> )} @@ -623,7 +706,7 @@ export class ApplicationDetails extends React.Component this.selectNode('')}> this.updateApp(app, query)} @@ -766,80 +849,89 @@ export class ApplicationDetails extends React.Component {prop.actionLabel}; - const hasMultipleSources = app.spec.sources && app.spec.sources.length > 0; - return [ - { - iconClassName: 'fa fa-info-circle', - title: , - action: () => this.selectNode(fullName) - }, - { - iconClassName: 'fa fa-file-medical', - title: , - action: () => this.selectNode(fullName, 0, 'diff'), - disabled: app.status.sync.status === appModels.SyncStatuses.Synced - }, - { - iconClassName: 'fa fa-sync', - title: , - action: () => AppUtils.showDeploy('all', null, this.appContext.apis) - }, - { - iconClassName: 'fa fa-info-circle', - title: , - action: () => this.setOperationStatusVisible(true), - disabled: !app.status.operationState - }, - { - iconClassName: 'fa fa-history', - title: hasMultipleSources ? ( - - - {helpTip('Rollback is not supported for apps with multiple sources')} - - ) : ( - - ), - action: () => { - this.setRollbackPanelVisible(0); - }, - disabled: !app.status.operationState || hasMultipleSources - }, - { - iconClassName: 'fa fa-times-circle', - title: , - action: () => this.deleteApplication() - }, - { - iconClassName: classNames('fa fa-redo', {'status-icon--spin': !!refreshing}), - title: ( - - {' '} - !refreshing && services.applications.get(app.metadata.name, app.metadata.namespace, 'hard') - } - ]} - anchor={() => } - /> - - ), - disabled: !!refreshing, - action: () => { - if (!refreshing) { - services.applications.get(app.metadata.name, app.metadata.namespace, 'normal'); - AppUtils.setAppRefreshing(app); - this.appChanged.next(app); - } - } - } - ]; + const hasMultipleSources = isApp(app) ? app.spec.sources && app.spec.sources.length > 0 : false; + return isApp(app) + ? [ + { + iconClassName: 'fa fa-info-circle', + title: , + action: () => this.selectNode(fullName) + }, + { + iconClassName: 'fa fa-file-medical', + title: , + action: () => this.selectNode(fullName, 0, 'diff'), + disabled: (app as models.Application).status.sync.status === appModels.SyncStatuses.Synced + }, + { + iconClassName: 'fa fa-sync', + title: , + action: () => AppUtils.showDeploy('all', null, this.appContext.apis) + }, + { + iconClassName: 'fa fa-info-circle', + title: , + action: () => this.setOperationStatusVisible(true), + disabled: !(app as models.Application).status.operationState + }, + { + iconClassName: 'fa fa-history', + title: hasMultipleSources ? ( + + + {helpTip('Rollback is not supported for apps with multiple sources')} + + ) : ( + + ), + action: () => { + this.setRollbackPanelVisible(0); + }, + disabled: !(app as models.Application).status.operationState || hasMultipleSources + }, + { + iconClassName: 'fa fa-times-circle', + title: , + action: () => this.deleteApplication() + }, + { + iconClassName: classNames('fa fa-redo', {'status-icon--spin': !!refreshing}), + title: ( + + {' '} + + !refreshing && services.applications.get(app.metadata.name, app.metadata.namespace, this.props.history.location.pathname, 'hard') + } + ]} + anchor={() => } + /> + + ), + disabled: !!refreshing, + action: () => { + if (!refreshing) { + services.applications.get(app.metadata.name, app.metadata.namespace, this.props.location.pathname, 'normal'); + AppUtils.setAppRefreshing(app); + this.appChanged.next(app); + } + } + } + ] + : [ + { + iconClassName: 'fa fa-info-circle', + title: , + action: () => this.selectNode(fullName) + } + ]; } private filterTreeNode(node: ResourceTreeNode, filterInput: FilterInput): boolean { @@ -883,22 +975,24 @@ export class ApplicationDetails extends React.Component { - return from(services.applications.get(name, appNamespace)) + private loadAppInfo(name: string, appNamespace: string): Observable<{application: appModels.AbstractApplication; tree: appModels.AbstractApplicationTree}> { + return from(services.applications.get(name, appNamespace, this.props.history.location.pathname)) .pipe( mergeMap(app => { const fallbackTree = { - nodes: app.status.resources.map(res => ({...res, parentRefs: [], info: [], resourceVersion: '', uid: ''})), + nodes: isApp(app) + ? (app as models.Application).status.resources.map(res => ({...res, parentRefs: [], info: [], resourceVersion: '', uid: ''})) + : (app as models.ApplicationSet).status.resources.map(res => ({...res, parentRefs: [], info: [], resourceVersion: '', uid: ''})), orphanedNodes: [], hosts: [] - } as appModels.ApplicationTree; + } as appModels.AbstractApplicationTree; return combineLatest( merge( from([app]), this.appChanged.pipe(filter(item => !!item)), AppUtils.handlePageVisibility(() => services.applications - .watch({name, appNamespace}) + .watch(this.props.history.location.pathname, {name, appNamespace}) .pipe( map(watchEvent => { if (watchEvent.type === 'DELETED') { @@ -913,10 +1007,10 @@ export class ApplicationDetails extends React.Component fallbackTree), + services.applications.resourceTree(name, appNamespace, this.props.history.location.pathname).catch(() => fallbackTree), AppUtils.handlePageVisibility(() => services.applications - .watchResourceTree(name, appNamespace) + .watchResourceTree(name, appNamespace, this.props.history.location.pathname) .pipe(repeat()) .pipe(retryWhen(errors => errors.pipe(delay(500)))) ) @@ -934,7 +1028,7 @@ export class ApplicationDetails extends React.Component(); - tree.nodes.concat(tree.orphanedNodes || []).forEach(node => nodeByKey.set(AppUtils.nodeKey(node), node)); + private groupAppNodesByKey(application: appModels.AbstractApplication, tree: appModels.AbstractApplicationTree) { + const nodeByKey = new Map(); + tree.nodes.concat((isApp(application) ? (tree as appModels.ApplicationTree).orphanedNodes : []) || []).forEach(node => nodeByKey.set(AppUtils.nodeKey(node), node)); nodeByKey.set(AppUtils.nodeKey({group: 'argoproj.io', kind: application.kind, name: application.metadata.name, namespace: application.metadata.namespace}), application); return nodeByKey; } @@ -1015,7 +1109,7 @@ Are you sure you want to disable auto-sync and rollback application '${this.prop await services.applications.update(update); } await services.applications.rollback(this.props.match.params.name, this.appNamespace, revisionHistory.id); - this.appChanged.next(await services.applications.get(this.props.match.params.name, this.appNamespace)); + this.appChanged.next(await services.applications.get(this.props.match.params.name, this.appNamespace, this.props.history.location.pathname)); this.setRollbackPanelVisible(-1); } } catch (e) { diff --git a/ui/src/app/applications/components/application-details/application-resource-filter.tsx b/ui/src/app/applications/components/application-details/application-resource-filter.tsx index a3d99f92488f3..d95037e1e2014 100644 --- a/ui/src/app/applications/components/application-details/application-resource-filter.tsx +++ b/ui/src/app/applications/components/application-details/application-resource-filter.tsx @@ -1,10 +1,10 @@ import * as React from 'react'; import {Checkbox} from 'argo-ui/v2'; -import {ApplicationTree, HealthStatusCode, HealthStatuses, SyncStatusCode, SyncStatuses} from '../../../shared/models'; -import {AppDetailsPreferences, services} from '../../../shared/services'; +import {AbstractApplicationTree, ApplicationTree, HealthStatusCode, HealthStatuses, SyncStatusCode, SyncStatuses} from '../../../shared/models'; +import {AppDetailsPreferences, AppSetDetailsPreferences, services} from '../../../shared/services'; import {Context} from '../../../shared/context'; import {Filter, FiltersGroup} from '../filter/filter'; -import {ComparisonStatusIcon, HealthStatusIcon} from '../utils'; +import {ComparisonStatusIcon, HealthStatusIcon, isInvokedFromAppsPath} from '../utils'; import {resources} from '../resources'; import * as models from '../../../shared/models'; @@ -14,17 +14,26 @@ function toOption(label: string) { return {label}; } -export interface FiltersProps { +export interface AbstractFiltersProps { children?: React.ReactNode; - pref: AppDetailsPreferences; - tree: ApplicationTree; + pref: AppDetailsPreferences | AppSetDetailsPreferences; + tree: AbstractApplicationTree; // | ApplicationSetTree; resourceNodes: models.ResourceStatus[]; onSetFilter: (items: string[]) => void; onClearFilter: () => void; collapsed?: boolean; } -export const Filters = (props: FiltersProps) => { +export interface FiltersProps extends AbstractFiltersProps { + pref: AppDetailsPreferences; + tree: ApplicationTree; +} + +export interface AppSetFiltersProps extends AbstractFiltersProps { + pref: AppSetDetailsPreferences; +} + +export const Filters = (props: AbstractFiltersProps) => { const ctx = React.useContext(Context); const {pref, tree, onSetFilter} = props; @@ -152,7 +161,7 @@ export const Filters = (props: FiltersProps) => { })) })} {namespaces.length > 1 && ResourceFilter({label: 'NAMESPACES', prefix: 'namespace', options: (namespaces || []).filter(l => l && l !== '').map(toOption), field: true})} - {(tree.orphanedNodes || []).length > 0 && ( + {((isInvokedFromAppsPath(ctx.history.location.pathname) ? (tree as ApplicationTree).orphanedNodes : []) || []).length > 0 && (
{ public render() { return ( - services.viewPreferences.getPreferences()}> + services.viewPreferences.getPreferences() as Observable}> {prefs => { const podPrefs = prefs.appDetails.podView || ({} as PodViewPreferences); const groups = this.processTree(podPrefs.sortMode, this.props.tree.hosts || []) || []; @@ -75,7 +76,10 @@ export class PodView extends React.Component { style={{border: 'none', width: '170px'}} onClick={() => services.viewPreferences.updatePreferences({ - appDetails: {...prefs.appDetails, podView: {...podPrefs, hideUnschedulable: !podPrefs.hideUnschedulable}} + appDetails: { + ...prefs.appDetails, + podView: {...podPrefs, hideUnschedulable: !podPrefs.hideUnschedulable} + } as AppDetailsPreferences }) }> @@ -270,7 +274,7 @@ export class PodView extends React.Component { ), action: () => { this.appContext.apis.navigation.goto('.', {podSortMode: mode}); - services.viewPreferences.updatePreferences({appDetails: {...prefs.appDetails, podView: {...podPrefs, sortMode: mode}}}); + services.viewPreferences.updatePreferences({appDetails: {...prefs.appDetails, podView: {...podPrefs, sortMode: mode}} as AppDetailsPreferences}); } })); } diff --git a/ui/src/app/applications/components/application-resource-tree/application-resource-tree.tsx b/ui/src/app/applications/components/application-resource-tree/application-resource-tree.tsx index 3d5b1782a0e0c..031d398ece5e5 100644 --- a/ui/src/app/applications/components/application-resource-tree/application-resource-tree.tsx +++ b/ui/src/app/applications/components/application-resource-tree/application-resource-tree.tsx @@ -19,6 +19,7 @@ import { getAppOverridesCount, HealthStatusIcon, isAppNode, + isApp, isYoungerThanXMinutes, NodeId, nodeKey, @@ -29,6 +30,7 @@ import {NodeUpdateAnimation} from './node-update-animation'; import {PodGroup} from '../application-pod-view/pod-view'; import './application-resource-tree.scss'; import {ArrowConnector} from './arrow-connector'; +import {Application, ApplicationSet, ApplicationTree} from '../../../shared/models'; function treeNodeKey(node: NodeId & {uid?: string}) { return node.uid || nodeKey(node); @@ -47,9 +49,9 @@ export interface ResourceTreeNode extends models.ResourceNode { isExpanded?: boolean; } -export interface ApplicationResourceTreeProps { - app: models.Application; - tree: models.ApplicationTree; +export interface AbstractApplicationResourceTreeProps { + app: models.AbstractApplication; + tree: models.AbstractApplicationTree; useNetworkingHierarchy: boolean; nodeFilter: (node: ResourceTreeNode) => boolean; selectedNodeFullName?: string; @@ -64,7 +66,6 @@ export interface ApplicationResourceTreeProps { updateUsrHelpTipMsgs: (userMsgs: models.UserMessages) => void; setShowCompactNodes: (showCompactNodes: boolean) => void; zoom: number; - podGroupCount: number; filters?: string[]; setTreeFilterGraph?: (filterGraph: any[]) => void; nameDirection: boolean; @@ -72,6 +73,15 @@ export interface ApplicationResourceTreeProps { getNodeExpansion: (node: string) => boolean; } +export interface ApplicationResourceTreeProps extends AbstractApplicationResourceTreeProps { + podGroupCount: number; +} + +export interface ApplicationSetResourceTreeProps extends AbstractApplicationResourceTreeProps { + // FFU + dummyMemberToPlacateLinter: any; +} + interface Line { x1: number; y1: number; @@ -249,7 +259,7 @@ export function compareNodes(first: ResourceTreeNode, second: ResourceTreeNode) ); } -function appNodeKey(app: models.Application) { +function appNodeKey(app: models.AbstractApplication) { return nodeKey({group: 'argoproj.io', kind: app.kind, name: app.metadata.name, namespace: app.metadata.namespace}); } @@ -412,7 +422,7 @@ function renderPodGroup(props: ApplicationResourceTreeProps, id: string, node: R } const appNode = isAppNode(node); const rootNode = !node.root; - const extLinks: string[] = props.app.status.summary.externalURLs; + const extLinks: string[] = isApp(props.app) ? (props.app as models.Application).status.summary.externalURLs : []; const podGroupChildren = childMap.get(treeNodeKey(node)); const nonPodChildren = podGroupChildren?.reduce((acc, child) => { if (child.kind !== 'Pod') { @@ -753,7 +763,7 @@ function renderResourceNode(props: ApplicationResourceTreeProps, id: string, nod } const appNode = isAppNode(node); const rootNode = !node.root; - const extLinks: string[] = props.app.status.summary.externalURLs; + const extLinks: string[] = isApp(props.app) ? (props.app as models.Application).status.summary.externalURLs : []; const childCount = nodesHavingChildren.get(node.uid); return (
{ +export const ApplicationResourceTree = (props: AbstractApplicationResourceTreeProps) => { const graph = new dagre.graphlib.Graph(); graph.setGraph({nodesep: 25, rankdir: 'LR', marginy: 45, marginx: -100, ranksep: 80}); graph.setDefaultEdgeLabel(() => ({})); @@ -893,8 +903,8 @@ export const ApplicationResourceTree = (props: ApplicationResourceTreeProps) => group: 'argoproj.io', version: '', children: Array(), - status: props.app.status.sync.status, - health: props.app.status.health, + status: isApp(props.app) ? props.app.status.sync.status : null, + health: isApp(props.app) ? props.app.status.health : props.app.status, uid: props.app.kind + '-' + props.app.metadata.namespace + '-' + props.app.metadata.name, info: overridesCount > 0 @@ -908,11 +918,17 @@ export const ApplicationResourceTree = (props: ApplicationResourceTreeProps) => }; const statusByKey = new Map(); - props.app.status.resources.forEach(res => statusByKey.set(nodeKey(res), res)); + if (isApp(props.app)) { + (props.app as models.Application).status.resources.forEach(res => statusByKey.set(nodeKey(res), res)); + } else { + // Assuming AppSet. Revisit this if a third type of an AbstractApp is born. + (props.app as models.ApplicationSet).status.resources.forEach(res => statusByKey.set(nodeKey(res), res)); + } + const nodeByKey = new Map(); props.tree.nodes .map(node => ({...node, orphaned: false})) - .concat(((props.showOrphanedResources && props.tree.orphanedNodes) || []).map(node => ({...node, orphaned: true}))) + .concat(((props.showOrphanedResources && isApp(props.app) ? (props.tree as ApplicationTree).orphanedNodes : []) || []).map(node => ({...node, orphaned: true}))) .forEach(node => { const status = statusByKey.get(nodeKey(node)); const resourceNode: ResourceTreeNode = {...node}; @@ -940,18 +956,20 @@ export const ApplicationResourceTree = (props: ApplicationResourceTreeProps) => props.setTreeFilterGraph(filteredGraph); } }, [props.filters]); - const {podGroupCount, userMsgs, updateUsrHelpTipMsgs, setShowCompactNodes} = props; - const podCount = nodes.filter(node => node.kind === 'Pod').length; - React.useEffect(() => { - if (podCount > podGroupCount) { - const userMsg = getUsrMsgKeyToDisplay(appNode.name, 'groupNodes', userMsgs); - updateUsrHelpTipMsgs(userMsg); - if (!userMsg.display) { - setShowCompactNodes(true); + if (isApp(props.app)) { + const podCount = nodes.filter(node => node.kind === 'Pod').length; + const {podGroupCount, userMsgs, updateUsrHelpTipMsgs, setShowCompactNodes} = props as ApplicationResourceTreeProps; + React.useEffect(() => { + if (podCount > podGroupCount) { + const userMsg = getUsrMsgKeyToDisplay(appNode.name, 'groupNodes', userMsgs); + updateUsrHelpTipMsgs(userMsg); + if (!userMsg.display) { + setShowCompactNodes(true); + } } - } - }, [podCount]); + }, [podCount]); + } function filterGraph(app: models.Application, filteredIndicatorParent: string, graphNodesFilter: dagre.graphlib.Graph, predicate: (node: ResourceTreeNode) => boolean) { const appKey = appNodeKey(app); @@ -978,7 +996,7 @@ export const ApplicationResourceTree = (props: ApplicationResourceTreeProps) => } } - if (props.useNetworkingHierarchy) { + if (props.useNetworkingHierarchy && isApp(props.app)) { // Network view const hasParents = new Set(); const networkNodes = nodes.filter(node => node.networkingInfo); @@ -1002,7 +1020,7 @@ export const ApplicationResourceTree = (props: ApplicationResourceTreeProps) => hiddenNodes.push(child); } } else { - processPodGroup(parent, child, props); + processPodGroup(parent, child, props as ApplicationResourceTreeProps); } }); }); @@ -1076,8 +1094,10 @@ export const ApplicationResourceTree = (props: ApplicationResourceTreeProps) => } } else { // Tree view - const managedKeys = new Set(props.app.status.resources.map(nodeKey)); - const orphanedKeys = new Set(props.tree.orphanedNodes?.map(nodeKey)); + const managedKeys = isApp(props.app) + ? new Set((props.app as Application).status.resources.map(nodeKey)) + : new Set((props.app as ApplicationSet).status.resources.map(nodeKey)); + const orphanedKeys = isApp(props.app) ? new Set((props.tree as ApplicationTree).orphanedNodes?.map(nodeKey)) : new Set(); const orphans: ResourceTreeNode[] = []; let allChildNodes: ResourceTreeNode[] = []; nodesHavingChildren.set(appNode.uid, 1); @@ -1106,7 +1126,9 @@ export const ApplicationResourceTree = (props: ApplicationResourceTreeProps) => } } else { const parentTreeNode = nodeByKey.get(parentId); - processPodGroup(parentTreeNode, node, props); + if (isApp(props.app)) { + processPodGroup(parentTreeNode, node, props as ApplicationResourceTreeProps); + } } if (props.showCompactNodes) { if (childrenMap.has(parentId)) { @@ -1247,11 +1269,19 @@ export const ApplicationResourceTree = (props: ApplicationResourceTreeProps) => case NODE_TYPES.externalLoadBalancer: return {renderLoadBalancerNode(node as any)}; case NODE_TYPES.groupedNodes: - return {renderGroupedNodes(props, node as any)}; + return {renderGroupedNodes(props as ApplicationResourceTreeProps, node as any)}; case NODE_TYPES.podGroup: - return {renderPodGroup(props, key, node as ResourceTreeNode & dagre.Node, childrenMap)}; + return ( + + {renderPodGroup(props as ApplicationResourceTreeProps, key, node as ResourceTreeNode & dagre.Node, childrenMap)} + + ); default: - return {renderResourceNode(props, key, node as ResourceTreeNode & dagre.Node, nodesHavingChildren)}; + return ( + + {renderResourceNode(props as ApplicationResourceTreeProps, key, node as ResourceTreeNode & dagre.Node, nodesHavingChildren)} + + ); } })} {edges.map(edge => ( diff --git a/ui/src/app/applications/components/application-status-panel/application-status-panel.tsx b/ui/src/app/applications/components/application-status-panel/application-status-panel.tsx index 7c2b65cd3ce27..1eedfb1fb7027 100644 --- a/ui/src/app/applications/components/application-status-panel/application-status-panel.tsx +++ b/ui/src/app/applications/components/application-status-panel/application-status-panel.tsx @@ -5,14 +5,14 @@ import {Revision} from '../../../shared/components/revision'; import {Timestamp} from '../../../shared/components/timestamp'; import * as models from '../../../shared/models'; import {services} from '../../../shared/services'; -import {ApplicationSyncWindowStatusIcon, ComparisonStatusIcon, getAppDefaultSource, getAppOperationState} from '../utils'; +import {AppSetHealthStatusIcon, ApplicationSyncWindowStatusIcon, ComparisonStatusIcon, getAppDefaultSource, getAppOperationState, getAppSetHealthStatus, isApp} from '../utils'; import {getConditionCategory, HealthStatusIcon, OperationState, syncStatusMessage, helpTip} from '../utils'; import {RevisionMetadataPanel} from './revision-metadata-panel'; import './application-status-panel.scss'; interface Props { - application: models.Application; + application: models.AbstractApplication; showDiff?: () => any; showOperation?: () => any; showConditions?: () => any; @@ -47,21 +47,35 @@ const sectionHeader = (info: SectionInfo, hasMultipleSources: boolean, onClick?: }; export const ApplicationStatusPanel = ({application, showDiff, showOperation, showConditions, showExtension, showMetadataInfo}: Props) => { - const today = new Date(); - + let cntByCategory; + let hasMultipleSources; + let source; + let appOperationState: models.OperationState; let daysSinceLastSynchronized = 0; - const history = application.status.history || []; - if (history.length > 0) { - const deployDate = new Date(history[history.length - 1].deployedAt); - daysSinceLastSynchronized = Math.round(Math.abs((today.getTime() - deployDate.getTime()) / (24 * 60 * 60 * 1000))); - } - const cntByCategory = (application.status.conditions || []).reduce( - (map, next) => map.set(getConditionCategory(next), (map.get(getConditionCategory(next)) || 0) + 1), - new Map() - ); - const appOperationState = getAppOperationState(application); - if (application.metadata.deletionTimestamp && !appOperationState) { - showOperation = null; + + if (isApp) { + const today = new Date(); + + const history = application.status.history || []; + if (history.length > 0) { + const deployDate = new Date(history[history.length - 1].deployedAt); + daysSinceLastSynchronized = Math.round(Math.abs((today.getTime() - deployDate.getTime()) / (24 * 60 * 60 * 1000))); + } + cntByCategory = ((application as models.Application).status.conditions || []).reduce( + (map, next) => map.set(getConditionCategory(next), (map.get(getConditionCategory(next)) || 0) + 1), + new Map() + ); + appOperationState = getAppOperationState(application); + if (application.metadata.deletionTimestamp && !appOperationState) { + showOperation = null; + } + hasMultipleSources = (application as models.Application).spec.sources && (application as models.Application).spec.sources.length > 0; + source = getAppDefaultSource(application as models.Application); + } else { + cntByCategory = ((application as models.ApplicationSet).status.conditions || []).reduce( + (map, next) => map.set(getConditionCategory(next), (map.get(getConditionCategory(next)) || 0) + 1), + new Map() + ); } const statusExtensions = services.extensions.getStatusPanelExtensions(); @@ -69,57 +83,76 @@ export const ApplicationStatusPanel = ({application, showDiff, showOperation, sh const infos = cntByCategory.get('info'); const warnings = cntByCategory.get('warning'); const errors = cntByCategory.get('error'); - const source = getAppDefaultSource(application); - const hasMultipleSources = application.spec.sources && application.spec.sources.length > 0; + return (
-
{sectionLabel({title: 'APP HEALTH', helpContent: 'The health status of your app'})}
+
+ {sectionLabel( + isApp(application) + ? {title: 'APP HEALTH', helpContent: 'The health status of your app'} + : {title: 'APPSET HEALTH', helpContent: 'The health status of your appset'} + )} +
- + {isApp(application) && } + {!isApp(application) && }   - {application.status.health.status} + {isApp(application) ? (application as models.Application).status.health.status : getAppSetHealthStatus((application as models.ApplicationSet).status)}
- {application.status.health.message &&
{application.status.health.message}
} + {isApp(application) && (application as models.Application).status.health.message && ( +
{(application as models.Application).status.health.message}
+ )} + {!isApp(application) && (application as models.ApplicationSet).status.conditions[0].message && ( +
{(application as models.ApplicationSet).status.conditions[0].message}
+ )}
-
- - {sectionHeader( - { - title: 'SYNC STATUS', - helpContent: 'Whether or not the version of your app is up to date with your repo. You may wish to sync your app if it is out-of-sync.' - }, - hasMultipleSources, - () => showMetadataInfo(application.status.sync ? application.status.sync.revision : '') - )} -
-
- {application.status.sync.status === models.SyncStatuses.OutOfSync ? ( - showDiff && showDiff()}> - - - ) : ( - - )} + {isApp(application) && ( +
+ + {sectionHeader( + { + title: 'SYNC STATUS', + helpContent: 'Whether or not the version of your app is up to date with your repo. You may wish to sync your app if it is out-of-sync.' + }, + hasMultipleSources, + () => showMetadataInfo((application as models.Application).status.sync ? (application as models.Application).status.sync.revision : '') + )} +
+
+ {(application as models.Application).status.sync.status === models.SyncStatuses.OutOfSync ? ( + showDiff && showDiff()}> + + + ) : ( + + )} +
+
{syncStatusMessage(application)}
-
{syncStatusMessage(application)}
-
-
- {application.spec.syncPolicy?.automated ? 'Auto sync is enabled.' : 'Auto sync is not enabled.'} -
- {application.status && application.status.sync && application.status.sync.revision && !application.spec.source.chart && ( -
- +
+ {(application as models.Application).spec.syncPolicy?.automated ? 'Auto sync is enabled.' : 'Auto sync is not enabled.'}
- )} - -
- {appOperationState && ( + {(application as models.Application).status && + (application as models.Application).status.sync && + (application as models.Application).status.sync.revision && + !(application as models.Application).spec.source.chart && ( +
+ +
+ )} + +
+ )} + {isApp(application) && appOperationState && (
{sectionHeader( @@ -160,7 +193,7 @@ export const ApplicationStatusPanel = ({application, showDiff, showOperation, sh )} {application.status.conditions && (
- {sectionLabel({title: 'APP CONDITIONS'})} + {sectionLabel(isApp(application) ? {title: 'APP CONDITIONS'} : {title: 'APPSET CONDITIONS'})}
)} - { - return await services.applications.getApplicationSyncWindowState(app.metadata.name, app.metadata.namespace); - }}> - {(data: models.ApplicationSyncWindowState) => ( - - {data.assignedWindows && ( -
- {sectionLabel({ - title: 'SYNC WINDOWS', - helpContent: - 'The aggregate state of sync windows for this app. ' + - 'Red: no syncs allowed. ' + - 'Yellow: manual syncs allowed. ' + - 'Green: all syncs allowed' - })} -
- + {isApp(application) && ( + { + return await services.applications.getApplicationSyncWindowState(app.metadata.name, app.metadata.namespace); + }}> + {(data: models.ApplicationSyncWindowState) => ( + + {data.assignedWindows && ( +
+ {sectionLabel({ + title: 'SYNC WINDOWS', + helpContent: + 'The aggregate state of sync windows for this app. ' + + 'Red: no syncs allowed. ' + + 'Yellow: manual syncs allowed. ' + + 'Green: all syncs allowed' + })} +
+ +
-
- )} - - )} - + )} + + )} + + )} {statusExtensions && statusExtensions.map(ext => showExtension && showExtension(ext.id)} />)}
); diff --git a/ui/src/app/applications/components/applications-container.tsx b/ui/src/app/applications/components/applications-container.tsx index 756f7ea22f2d8..e8e86a474a73d 100644 --- a/ui/src/app/applications/components/applications-container.tsx +++ b/ui/src/app/applications/components/applications-container.tsx @@ -3,13 +3,16 @@ import {Route, RouteComponentProps, Switch} from 'react-router'; import {ApplicationDetails} from './application-details/application-details'; import {ApplicationFullscreenLogs} from './application-fullscreen-logs/application-fullscreen-logs'; import {ApplicationsList} from './applications-list/applications-list'; +// import {ApplicationSetsList, ApplicationsList} from './applications-list/applications-list'; export const ApplicationsContainer = (props: RouteComponentProps) => ( - + } /> + + {/* */} ); diff --git a/ui/src/app/applications/components/applications-list/applications-filter.tsx b/ui/src/app/applications/components/applications-list/applications-filter.tsx index af1da7a371d0f..f88eb5a4ffa17 100644 --- a/ui/src/app/applications/components/applications-list/applications-filter.tsx +++ b/ui/src/app/applications/components/applications-list/applications-filter.tsx @@ -2,27 +2,69 @@ import {useData, Checkbox} from 'argo-ui/v2'; import * as minimatch from 'minimatch'; import * as React from 'react'; import {Context} from '../../../shared/context'; -import {Application, ApplicationDestination, Cluster, HealthStatusCode, HealthStatuses, SyncPolicy, SyncStatusCode, SyncStatuses} from '../../../shared/models'; -import {AppsListPreferences, services} from '../../../shared/services'; +import { + AbstractApplication, + Application, + ApplicationDestination, + ApplicationSet, + ApplicationSetConditionStatuses, + ApplicationSetSpec, + ApplicationSetStatus, + ApplicationSpec, + ApplicationStatus, + Cluster, + HealthStatusCode, + HealthStatuses, + Operation, + SyncPolicy, + SyncStatusCode, + SyncStatuses +} from '../../../shared/models'; +import {AbstractAppsListPreferences, AppSetsListPreferences, AppsListPreferences, services} from '../../../shared/services'; import {Filter, FiltersGroup} from '../filter/filter'; import * as LabelSelector from '../label-selector'; -import {ComparisonStatusIcon, getAppDefaultSource, HealthStatusIcon} from '../utils'; +import {ComparisonStatusIcon, getAppDefaultSource, getAppSetHealthStatus, HealthStatusIcon, isApp, isInvokedFromAppsPath} from '../utils'; +import {ContextApis} from '../../../shared/context'; +import {History} from 'history'; -export interface FilterResult { +export interface AbstractFilterResult { + favourite: boolean; + labels: boolean; + health: boolean; +} + +export interface FilterResult extends AbstractFilterResult { repos: boolean; sync: boolean; autosync: boolean; - health: boolean; - namespaces: boolean; clusters: boolean; - favourite: boolean; - labels: boolean; } -export interface FilteredApp extends Application { +export interface ApplicationSetFilterResult extends AbstractFilterResult { + // FFU + dummyToPlacateLinter: any; +} + +export interface AbstractFilteredApp extends AbstractApplication { + filterResult: AbstractFilterResult; +} + +export interface FilteredApp extends AbstractFilteredApp { + spec: ApplicationSpec; + status: ApplicationStatus; + operation?: Operation; + isAppOfAppsPattern?: boolean; + filterResult: FilterResult; } +export interface ApplicationSetFilteredApp extends AbstractFilteredApp { + spec: ApplicationSetSpec; + status: ApplicationSetStatus; + + filterResult: ApplicationSetFilterResult; +} + function getAutoSyncStatus(syncPolicy?: SyncPolicy) { if (!syncPolicy || !syncPolicy.automated) { return 'Disabled'; @@ -30,30 +72,42 @@ function getAutoSyncStatus(syncPolicy?: SyncPolicy) { return 'Enabled'; } -export function getFilterResults(applications: Application[], pref: AppsListPreferences): FilteredApp[] { +export function getFilterResults(applications: AbstractApplication[], pref: AbstractAppsListPreferences): AbstractFilteredApp[] { return applications.map(app => ({ ...app, - filterResult: { - repos: pref.reposFilter.length === 0 || pref.reposFilter.includes(getAppDefaultSource(app).repoURL), - sync: pref.syncFilter.length === 0 || pref.syncFilter.includes(app.status.sync.status), - autosync: pref.autoSyncFilter.length === 0 || pref.autoSyncFilter.includes(getAutoSyncStatus(app.spec.syncPolicy)), - health: pref.healthFilter.length === 0 || pref.healthFilter.includes(app.status.health.status), - namespaces: pref.namespacesFilter.length === 0 || pref.namespacesFilter.some(ns => app.spec.destination.namespace && minimatch(app.spec.destination.namespace, ns)), - favourite: !pref.showFavorites || (pref.favoritesAppList && pref.favoritesAppList.includes(app.metadata.name)), - clusters: - pref.clustersFilter.length === 0 || - pref.clustersFilter.some(filterString => { - const match = filterString.match('^(.*) [(](http.*)[)]$'); - if (match?.length === 3) { - const [, name, url] = match; - return url === app.spec.destination.server || name === app.spec.destination.name; - } else { - const inputMatch = filterString.match('^http.*$'); - return (inputMatch && inputMatch[0] === app.spec.destination.server) || (app.spec.destination.name && minimatch(app.spec.destination.name, filterString)); - } - }), - labels: pref.labelsFilter.length === 0 || pref.labelsFilter.every(selector => LabelSelector.match(selector, app.metadata.labels)) - } + filterResult: isApp(app) + ? { + repos: (pref as AppsListPreferences).reposFilter.length === 0 || (pref as AppsListPreferences).reposFilter.includes(getAppDefaultSource(app).repoURL), + sync: (pref as AppsListPreferences).syncFilter.length === 0 || (pref as AppsListPreferences).syncFilter.includes(app.status.sync.status), + autosync: + (pref as AppsListPreferences).autoSyncFilter.length === 0 || + (pref as AppsListPreferences).autoSyncFilter.includes(getAutoSyncStatus((app as Application).spec.syncPolicy)), + health: pref.healthFilter.length === 0 || pref.healthFilter.includes((app as Application).status.health.status), + namespaces: + (pref as AppsListPreferences).namespacesFilter.length === 0 || + (pref as AppsListPreferences).namespacesFilter.some(ns => app.spec.destination.namespace && minimatch(app.spec.destination.namespace, ns)), + favourite: !pref.showFavorites || (pref.favoritesAppList && pref.favoritesAppList.includes(app.metadata.name)), + clusters: + (pref as AppsListPreferences).clustersFilter.length === 0 || + (pref as AppsListPreferences).clustersFilter.some(filterString => { + const match = filterString.match('^(.*) [(](http.*)[)]$'); + if (match?.length === 3) { + const [, name, url] = match; + return url === app.spec.destination.server || name === app.spec.destination.name; + } else { + const inputMatch = filterString.match('^http.*$'); + return ( + (inputMatch && inputMatch[0] === app.spec.destination.server) || (app.spec.destination.name && minimatch(app.spec.destination.name, filterString)) + ); + } + }), + labels: pref.labelsFilter.length === 0 || pref.labelsFilter.every(selector => LabelSelector.match(selector, app.metadata.labels)) + } + : { + health: pref.healthFilter.length === 0 || pref.healthFilter.includes(getAppSetHealthStatus((app as ApplicationSet).status)), + favourite: !pref.showFavorites || (pref.favoritesAppList && pref.favoritesAppList.includes(app.metadata.name)), + labels: pref.labelsFilter.length === 0 || pref.labelsFilter.every(selector => LabelSelector.match(selector, app.metadata.labels)) + } })); } @@ -65,12 +119,32 @@ const optionsFrom = (options: string[], filter: string[]) => { }); }; -interface AppFilterProps { +interface AbstractAppFilterProps { + apps: AbstractFilteredApp[]; // FilteredApp[] | ApplicationSetFilteredApp[]; + pref: AbstractAppsListPreferences; + onChange: (newPrefs: AbstractAppsListPreferences) => void; + children?: React.ReactNode; + collapsed?: boolean; +} +interface AppFilterProps extends AbstractAppFilterProps { apps: FilteredApp[]; pref: AppsListPreferences; onChange: (newPrefs: AppsListPreferences) => void; - children?: React.ReactNode; - collapsed?: boolean; +} + +interface ApplicationSetFilterProps extends AbstractAppFilterProps { + apps: ApplicationSetFilteredApp[]; + pref: AppSetsListPreferences; + onChange: (newPrefs: AppSetsListPreferences) => void; +} +export function isAppFilterProps( + abstractAppFilterProps: AbstractAppFilterProps, + ctx: ContextApis & { + history: History; + } +): abstractAppFilterProps is AppFilterProps { + // return isApp(abstractAppFilterProps.apps[0]); + return isInvokedFromAppsPath(ctx.history.location.pathname); } const getCounts = (apps: FilteredApp[], filterType: keyof FilterResult, filter: (app: Application) => string, init?: string[]) => { @@ -85,6 +159,18 @@ const getCounts = (apps: FilteredApp[], filterType: keyof FilterResult, filter: return map; }; +const getAppSetCounts = (apps: ApplicationSetFilteredApp[], filterType: keyof ApplicationSetFilterResult, filter: (app: ApplicationSet) => string, init?: string[]) => { + const map = new Map(); + if (init) { + init.forEach(key => map.set(key, 0)); + } + // filter out all apps that does not match other filters and ignore this filter result + apps.filter(app => filter(app) && Object.keys(app.filterResult).every((key: keyof ApplicationSetFilterResult) => key === filterType || app.filterResult[key])).forEach(app => + map.set(filter(app), (map.get(filter(app)) || 0) + 1) + ); + return map; +}; + const getOptions = (apps: FilteredApp[], filterType: keyof FilterResult, filter: (app: Application) => string, keys: string[], getIcon?: (k: string) => React.ReactNode) => { const counts = getCounts(apps, filterType, filter, keys); return keys.map(k => { @@ -96,6 +182,23 @@ const getOptions = (apps: FilteredApp[], filterType: keyof FilterResult, filter: }); }; +const getAppSetOptions = ( + apps: ApplicationSetFilteredApp[], + filterType: keyof ApplicationSetFilterResult, + filter: (app: ApplicationSet) => string, + keys: string[], + getIcon?: (k: string) => React.ReactNode +) => { + const counts = getAppSetCounts(apps, filterType, filter, keys); + return keys.map(k => { + return { + label: k, + icon: getIcon && getIcon(k), + count: counts.get(k) + }; + }); +}; + const SyncFilter = (props: AppFilterProps) => ( ( /> ); -const HealthFilter = (props: AppFilterProps) => ( - props.onChange({...props.pref, healthFilter: s})} - options={getOptions( - props.apps, - 'health', - app => app.status.health.status, - Object.keys(HealthStatuses), - s => ( - - ) - )} - /> -); +const HealthFilter = (props: AbstractAppFilterProps) => { + const ctx = React.useContext(Context); + return ( + + isAppFilterProps(props, ctx) ? props.onChange({...props.pref, healthFilter: s}) : props.onChange({...(props as ApplicationSetFilterProps).pref, healthFilter: s}) + } + options={ + isAppFilterProps(props, ctx) + ? getOptions( + props.apps, + 'health', + app => app.status.health.status, + Object.keys(HealthStatuses), + s => + ) + : getAppSetOptions( + (props as ApplicationSetFilterProps).apps, + 'health', + app => getAppSetHealthStatus(app.status), + Object.keys(ApplicationSetConditionStatuses) + // state={(app as ApplicationSet).status + /* + export interface ApplicationSetStatus { + conditions?: ApplicationSetCondition[]; + applicationStatus: ApplicationSetApplicationStatus[]; +} + */ + // s => + ) + } + /> + ); +}; -const LabelsFilter = (props: AppFilterProps) => { +const LabelsFilter = (props: AbstractAppFilterProps) => { const labels = new Map>(); - props.apps + (props.apps as AbstractFilteredApp[]) .filter(app => app.metadata && app.metadata.labels) .forEach(app => Object.keys(app.metadata.labels).forEach(label => { @@ -224,7 +347,7 @@ const NamespaceFilter = (props: AppFilterProps) => { ); }; -const FavoriteFilter = (props: AppFilterProps) => { +const FavoriteFilter = (props: AbstractAppFilterProps) => { const ctx = React.useContext(Context); const onChange = (val: boolean) => { ctx.navigation.goto('.', {showFavorites: val}, {replace: true}); @@ -276,17 +399,18 @@ const AutoSyncFilter = (props: AppFilterProps) => ( /> ); -export const ApplicationsFilter = (props: AppFilterProps) => { +export const ApplicationsFilter = (props: AbstractAppFilterProps) => { + const ctx = React.useContext(Context); return ( - + {isAppFilterProps(props, ctx) && } - - - - + {isAppFilterProps(props, ctx) && } + {isAppFilterProps(props, ctx) && } + {isAppFilterProps(props, ctx) && } + {isAppFilterProps(props, ctx) && } ); }; diff --git a/ui/src/app/applications/components/applications-list/applications-list.scss b/ui/src/app/applications/components/applications-list/applications-list.scss index 6d359e59723e3..da7a07118ff90 100644 --- a/ui/src/app/applications/components/applications-list/applications-list.scss +++ b/ui/src/app/applications/components/applications-list/applications-list.scss @@ -43,6 +43,11 @@ border-left-color: $argo-success-color; } + // For AppSet + &--health-True { + border-left-color: $argo-success-color; + } + // intermediate statuses &--health-Progressing { border-left-color: $argo-running-color; @@ -57,6 +62,11 @@ border-left-color: $argo-failed-color; } + // For AppSet + &--health-False { + border-left-color: $argo-failed-color; + } + &--health-Unknown { border-left-color: $argo-color-gray-4; } @@ -218,4 +228,4 @@ i.menu_icon { margin: 0 auto !important; } } -} \ No newline at end of file +} diff --git a/ui/src/app/applications/components/applications-list/applications-list.tsx b/ui/src/app/applications/components/applications-list/applications-list.tsx index d6ddfeb343e66..a55c1d62d6238 100644 --- a/ui/src/app/applications/components/applications-list/applications-list.tsx +++ b/ui/src/app/applications/components/applications-list/applications-list.tsx @@ -9,21 +9,31 @@ import {bufferTime, delay, filter, map, mergeMap, repeat, retryWhen} from 'rxjs/ import {AddAuthToToolbar, ClusterCtx, DataLoader, EmptyState, ObservableQuery, Page, Paginate, Query, Spinner} from '../../../shared/components'; import {AuthSettingsCtx, Consumer, Context, ContextApis} from '../../../shared/context'; import * as models from '../../../shared/models'; -import {AppsListViewKey, AppsListPreferences, AppsListViewType, HealthStatusBarPreferences, services} from '../../../shared/services'; +import { + AppsListViewKey, + AppsListPreferences, + AppsListViewType, + HealthStatusBarPreferences, + services, + AbstractAppsListPreferences, + AppSetsListPreferences +} from '../../../shared/services'; import {ApplicationCreatePanel} from '../application-create-panel/application-create-panel'; import {ApplicationSyncPanel} from '../application-sync-panel/application-sync-panel'; import {ApplicationsSyncPanel} from '../applications-sync-panel/applications-sync-panel'; import * as AppUtils from '../utils'; -import {ApplicationsFilter, FilteredApp, getFilterResults} from './applications-filter'; +import {AbstractFilteredApp, ApplicationsFilter, getFilterResults} from './applications-filter'; import {ApplicationsStatusBar} from './applications-status-bar'; import {ApplicationsSummary} from './applications-summary'; import {ApplicationsTable} from './applications-table'; -import {ApplicationTiles} from './applications-tiles'; +import {AbstractApplicationTilesProps, ApplicationSetTilesProps, ApplicationTiles, ApplicationTilesProps} from './applications-tiles'; import {ApplicationsRefreshPanel} from '../applications-refresh-panel/applications-refresh-panel'; import {useSidebarTarget} from '../../../sidebar/sidebar'; import './applications-list.scss'; import './flex-top-bar.scss'; +import {AbstractApplication, Application, ApplicationSet} from '../../../shared/models'; +import {History} from 'history'; const EVENTS_BUFFER_TIMEOUT = 500; const WATCH_RETRY_TIMEOUT = 500; @@ -48,17 +58,39 @@ const APP_FIELDS = [ 'status.summary', 'status.resources' ]; -const APP_LIST_FIELDS = ['metadata.resourceVersion', ...APP_FIELDS.map(field => `items.${field}`)]; -const APP_WATCH_FIELDS = ['result.type', ...APP_FIELDS.map(field => `result.application.${field}`)]; -function loadApplications(projects: string[], appNamespace: string): Observable { - return from(services.applications.list(projects, {appNamespace, fields: APP_LIST_FIELDS})).pipe( +const APPSET_FIELDS = ['metadata.name', 'metadata.namespace', 'metadata.annotations', 'metadata.labels', 'metadata.creationTimestamp', 'metadata.deletionTimestamp', 'spec']; + +function getAppListFields(isFromApps: boolean): string[] { + const APP_LIST_FIELDS = isFromApps + ? ['metadata.resourceVersion', ...APP_FIELDS.map(field => `items.${field}`)] + : ['metadata.resourceVersion', ...APPSET_FIELDS.map(field => `items.${field}`)]; + return APP_LIST_FIELDS; +} + +function getAppWatchFields(isFromApps: boolean): string[] { + const APP_WATCH_FIELDS = isFromApps + ? ['result.type', ...APP_FIELDS.map(field => `result.application.${field}`)] + : ['result.type', ...APPSET_FIELDS.map(field => `result.application.${field}`)]; + return APP_WATCH_FIELDS; +} + +function loadApplications( + ctx: ContextApis & { + history: History; + }, + projects: string[], + appNamespace: string, + objectListKind: string +): Observable { + const isListOfApplications = objectListKind === 'application'; + return from(services.applications.list(projects, ctx, {appNamespace, fields: getAppListFields(isListOfApplications)})).pipe( mergeMap(applicationsList => { const applications = applicationsList.items; return merge( from([applications]), services.applications - .watch({projects, resourceVersion: applicationsList.metadata.resourceVersion}, {fields: APP_WATCH_FIELDS}) + .watch(ctx.history.location.pathname, {projects, resourceVersion: applicationsList.metadata.resourceVersion}, {fields: getAppWatchFields(isListOfApplications)}) .pipe(repeat()) .pipe(retryWhen(errors => errors.pipe(delay(WATCH_RETRY_TIMEOUT)))) // batch events to avoid constant re-rendering and improve UI performance @@ -67,6 +99,7 @@ function loadApplications(projects: string[], appNamespace: string): Observable< map(appChanges => { appChanges.forEach(appChange => { const index = applications.findIndex(item => AppUtils.appInstanceName(item) === AppUtils.appInstanceName(appChange.application)); + switch (appChange.type) { case 'DELETED': if (index > -1) { @@ -87,91 +120,115 @@ function loadApplications(projects: string[], appNamespace: string): Observable< ) .pipe(filter(item => item.updated)) .pipe(map(item => item.applications)) + // .pipe(map(item => (isApp(applications[0]) ? (item.applications as models.Application[]) : (item.applications as models.ApplicationSet[])))) ); }) ); } -const ViewPref = ({children}: {children: (pref: AppsListPreferences & {page: number; search: string}) => React.ReactNode}) => ( - - {q => ( - - combineLatest([services.viewPreferences.getPreferences().pipe(map(item => item.appList)), q]).pipe( - map(items => { - const params = items[1]; - const viewPref: AppsListPreferences = {...items[0]}; - if (params.get('proj') != null) { - viewPref.projectsFilter = params - .get('proj') - .split(',') - .filter(item => !!item); - } - if (params.get('sync') != null) { - viewPref.syncFilter = params - .get('sync') - .split(',') - .filter(item => !!item); - } - if (params.get('autoSync') != null) { - viewPref.autoSyncFilter = params - .get('autoSync') - .split(',') - .filter(item => !!item); - } - if (params.get('health') != null) { - viewPref.healthFilter = params - .get('health') - .split(',') - .filter(item => !!item); - } - if (params.get('namespace') != null) { - viewPref.namespacesFilter = params - .get('namespace') - .split(',') - .filter(item => !!item); - } - if (params.get('cluster') != null) { - viewPref.clustersFilter = params - .get('cluster') - .split(',') - .filter(item => !!item); - } - if (params.get('showFavorites') != null) { - viewPref.showFavorites = params.get('showFavorites') === 'true'; - } - if (params.get('view') != null) { - viewPref.view = params.get('view') as AppsListViewType; - } - if (params.get('labels') != null) { - viewPref.labelsFilter = params - .get('labels') - .split(',') - .map(decodeURIComponent) - .filter(item => !!item); - } - return {...viewPref, page: parseInt(params.get('page') || '0', 10), search: params.get('search') || ''}; - }) - ) - }> - {pref => children(pref)} - - )} - -); - -function filterApps(applications: models.Application[], pref: AppsListPreferences, search: string): {filteredApps: models.Application[]; filterResults: FilteredApp[]} { +const ViewPref = ({children, objectListKind}: {children: (pref: AbstractAppsListPreferences & {page: number; search: string}) => React.ReactNode; objectListKind: string}) => { + return ( + + {q => ( + + combineLatest([services.viewPreferences.getPreferences().pipe(map(item => item.appList)), q]).pipe( + map(items => { + const params = items[1]; + const viewPref: AbstractAppsListPreferences = {...items[0]}; + if (objectListKind === 'application') { + // App specific filters + if (params.get('proj') != null) { + (viewPref as AppsListPreferences).projectsFilter = params + .get('proj') + .split(',') + .filter(item => !!item); + } + if (params.get('sync') != null) { + (viewPref as AppsListPreferences).syncFilter = params + .get('sync') + .split(',') + .filter(item => !!item); + } + if (params.get('autoSync') != null) { + (viewPref as AppsListPreferences).autoSyncFilter = params + .get('autoSync') + .split(',') + .filter(item => !!item); + } + if (params.get('cluster') != null) { + (viewPref as AppsListPreferences).clustersFilter = params + .get('cluster') + .split(',') + .filter(item => !!item); + } + if (params.get('namespace') != null) { + (viewPref as AppsListPreferences).namespacesFilter = params + .get('namespace') + .split(',') + .filter(item => !!item); + } + } + // App and AppSet common filters + if (params.get('health') != null) { + viewPref.healthFilter = params + .get('health') + .split(',') + .filter(item => !!item); + } + + if (params.get('showFavorites') != null) { + viewPref.showFavorites = params.get('showFavorites') === 'true'; + } + if (params.get('view') != null) { + viewPref.view = params.get('view') as AppsListViewType; + } + if (params.get('labels') != null) { + viewPref.labelsFilter = params + .get('labels') + .split(',') + .map(decodeURIComponent) + .filter(item => !!item); + } + return {...viewPref, page: parseInt(params.get('page') || '0', 10), search: params.get('search') || ''}; + }) + ) + }> + {pref => children(pref)} + + )} + + ); +}; + +function filterApps( + applications: AbstractApplication[], + pref: AbstractAppsListPreferences, + search: string, + isListOfApplications: boolean +): {filteredApps: AbstractApplication[]; filterResults: AbstractFilteredApp[]} { applications = applications.map(app => { let isAppOfAppsPattern = false; - for (const resource of app.status.resources) { - if (resource.kind === 'Application') { - isAppOfAppsPattern = true; - break; + if (!isListOfApplications) { + // AppSet behaves like an app of apps + isAppOfAppsPattern = true; + } else { + // It is an App and may or may not be app-of-apps pattern + for (const resource of (app as models.Application).status.resources) { + if (resource.kind === 'Application') { + isAppOfAppsPattern = true; + break; + } } } return {...app, isAppOfAppsPattern}; }); - const filterResults = getFilterResults(applications, pref); + const filterResults = + applications.length === 0 + ? getFilterResults(applications, pref) + : isListOfApplications + ? getFilterResults(applications as Application[], pref as AppsListPreferences) + : getFilterResults(applications as ApplicationSet[], pref as AppSetsListPreferences); return { filterResults, filteredApps: filterResults.filter( @@ -188,7 +245,14 @@ function tryJsonParse(input: string) { } } -const SearchBar = (props: {content: string; ctx: ContextApis; apps: models.Application[]}) => { +const SearchBar = (props: { + content: string; + ctx: ContextApis & { + history: History; + }; + apps: models.AbstractApplication[]; + objectListKind: string; +}) => { const {content, ctx, apps} = {...props}; const searchBar = React.useRef(null); @@ -200,6 +264,8 @@ const SearchBar = (props: {content: string; ctx: ContextApis; apps: models.Appli const [isFocused, setFocus] = React.useState(false); const useAuthSettingsCtx = React.useContext(AuthSettingsCtx); + const placeholderText = props.objectListKind === 'application' ? 'Search applications...' : 'Search application sets...'; + useKeybinding({ keys: Key.SLASH, action: () => { @@ -248,7 +314,7 @@ const SearchBar = (props: {content: string; ctx: ContextApis; apps: models.Appli }} style={{fontSize: '14px'}} className='argo-field' - placeholder='Search applications...' + placeholder={placeholderText} />
/
{content && ( @@ -309,7 +375,11 @@ const FlexTopBar = (props: {toolbar: Toolbar | Observable}) => { ); }; -export const ApplicationsList = (props: RouteComponentProps<{}>) => { +interface RouteComponentPropsExtended extends RouteComponentProps { + objectListKind: string; +} + +export const ApplicationsList = (props: RouteComponentPropsExtended) => { const query = new URLSearchParams(props.location.search); const appInput = tryJsonParse(query.get('new')); const syncAppsInput = tryJsonParse(query.get('syncApps')); @@ -320,6 +390,11 @@ export const ApplicationsList = (props: RouteComponentProps<{}>) => { const loaderRef = React.useRef(); const {List, Summary, Tiles} = AppsListViewKey; + const listCtx = React.useContext(Context); + + const objectListKind = props.objectListKind; + const isListOfApplications = objectListKind === 'application'; + function refreshApp(appName: string, appNamespace: string) { // app refreshing might be done too quickly so that UI might miss it due to event batching // add refreshing annotation in the UI to improve user experience @@ -334,69 +409,127 @@ export const ApplicationsList = (props: RouteComponentProps<{}>) => { services.applications.get(appName, appNamespace, 'normal'); } - function onFilterPrefChanged(ctx: ContextApis, newPref: AppsListPreferences) { + function onFilterPrefChanged(newPref: AbstractAppsListPreferences) { services.viewPreferences.updatePreferences({appList: newPref}); - ctx.navigation.goto( + listCtx.navigation.goto( '.', + { - proj: newPref.projectsFilter.join(','), - sync: newPref.syncFilter.join(','), - autoSync: newPref.autoSyncFilter.join(','), + proj: isListOfApplications ? (newPref as AppsListPreferences).projectsFilter.join(',') : '', + sync: isListOfApplications ? (newPref as AppsListPreferences).syncFilter.join(',') : '', + autoSync: isListOfApplications ? (newPref as AppsListPreferences).autoSyncFilter.join(',') : '', health: newPref.healthFilter.join(','), - namespace: newPref.namespacesFilter.join(','), - cluster: newPref.clustersFilter.join(','), + namespace: isListOfApplications ? (newPref as AppsListPreferences).namespacesFilter.join(',') : '', + cluster: isListOfApplications ? (newPref as AppsListPreferences).clustersFilter.join(',') : '', labels: newPref.labelsFilter.map(encodeURIComponent).join(',') }, {replace: true} ); } + const pageTitlePrefix = isListOfApplications ? 'Applications ' : 'ApplicationSets '; + function getPageTitle(view: string) { switch (view) { case List: - return 'Applications List'; + return pageTitlePrefix + 'List'; case Tiles: - return 'Applications Tiles'; + return pageTitlePrefix + 'Tiles'; case Summary: - return 'Applications Summary'; + return pageTitlePrefix + 'Summary'; } return ''; } const sidebarTarget = useSidebarTarget(); + const getEmptyStateText = isListOfApplications ? 'No matching applications found' : 'No matching application sets found'; + + const applicationTilesProps = (data: models.Application[]): ApplicationTilesProps => { + return { + applications: data, + syncApplication: (appName, appNamespace) => listCtx.navigation.goto('.', {syncApp: appName, appNamespace}, {replace: true}), + + refreshApplication: refreshApp, + deleteApplication: (appName, appNamespace) => AppUtils.deleteApplication(appName, appNamespace, listCtx), + objectListKind: '{objectListKind}' + }; + }; + + const applicationSetTilesProps = (data: models.ApplicationSet[]): ApplicationSetTilesProps => { + return { + applications: data, + deleteApplication: (appName, appNamespace) => AppUtils.deleteApplication(appName, appNamespace, listCtx), + objectListKind: '{objectListKind}' + }; + }; + + const abstractApplicationTilesProps = (applications: models.AbstractApplication[]): AbstractApplicationTilesProps => { + if (isListOfApplications) { + return applicationTilesProps(applications); + } else { + return applicationSetTilesProps(applications); + } + }; + + function getProjectsFilter(pref: AbstractAppsListPreferences): string[] { + return isListOfApplications ? (pref as AppsListPreferences & {page: number; search: string}).projectsFilter : []; + } + return ( {ctx => ( - + {pref => ( AppUtils.handlePageVisibility(() => loadApplications(pref.projectsFilter, query.get('appNamespace')))} + load={() => + AppUtils.handlePageVisibility(() => + loadApplications( + ctx, + isListOfApplications ? (pref as AppsListPreferences & {page: number; search: string}).projectsFilter : [], + query.get('appNamespace'), + objectListKind + ) + ) + } loadingRenderer={() => (
)}> - {(applications: models.Application[]) => { + {(applications: models.AbstractApplication[]) => { const healthBarPrefs = pref.statusBarView || ({} as HealthStatusBarPreferences); - const {filteredApps, filterResults} = filterApps(applications, pref, pref.search); + const {filteredApps, filterResults} = filterApps( + isListOfApplications ? (applications as Application[]) : (applications as ApplicationSet[]), + isListOfApplications + ? (pref as AppsListPreferences & {page: number; search: string}) + : (pref as AppSetsListPreferences & {page: number; search: string}), + pref.search, + isListOfApplications + ); return ( - {q => } + + {q => } +
+ {applications.length > 0 && isListOfApplications && ( + + {q => ( + + q.pipe( + mergeMap(params => { + const syncApp = params.get('syncApp'); + const appNamespace = params.get('appNamespace'); + return ( + (syncApp && + from(services.applications.get(syncApp, appNamespace, ctx.history.location.pathname))) || + from([null]) + ); + }) + ) + }> + {app => ( + ctx.navigation.goto('.', {syncApp: null}, {replace: true})} + /> + )} + + )} + + )} ctx.navigation.goto('.', {new: null}, {replace: true})} header={
- {' '} + {applications.length > 0 && isListOfApplications && ( + + )}{' '}
}> - {appInput && ( + {appInput && isListOfApplications && ( { setCreateApi(api); diff --git a/ui/src/app/applications/components/applications-list/applications-status-bar.tsx b/ui/src/app/applications/components/applications-list/applications-status-bar.tsx index c20b5612d121f..ce350a09049bd 100644 --- a/ui/src/app/applications/components/applications-list/applications-status-bar.tsx +++ b/ui/src/app/applications/components/applications-list/applications-status-bar.tsx @@ -5,44 +5,67 @@ import {Consumer} from '../../../shared/context'; import * as models from '../../../shared/models'; import './applications-status-bar.scss'; +import {getAppSetHealthStatus, isApp} from '../utils'; +import {Application, ApplicationSet} from '../../../shared/models'; export interface ApplicationsStatusBarProps { - applications: models.Application[]; + applications: models.AbstractApplication[]; } export const ApplicationsStatusBar = ({applications}: ApplicationsStatusBarProps) => { - const readings = [ - { - name: 'Healthy', - value: applications.filter(app => app.status.health.status === 'Healthy').length, - color: COLORS.health.healthy - }, - { - name: 'Progressing', - value: applications.filter(app => app.status.health.status === 'Progressing').length, - color: COLORS.health.progressing - }, - { - name: 'Degraded', - value: applications.filter(app => app.status.health.status === 'Degraded').length, - color: COLORS.health.degraded - }, - { - name: 'Suspended', - value: applications.filter(app => app.status.health.status === 'Suspended').length, - color: COLORS.health.suspended - }, - { - name: 'Missing', - value: applications.filter(app => app.status.health.status === 'Missing').length, - color: COLORS.health.missing - }, - { - name: 'Unknown', - value: applications.filter(app => app.status.health.status === 'Unknown').length, - color: COLORS.health.unknown - } - ]; + const readings: any[] = []; + if (isApp(applications[0])) { + readings.push( + { + name: 'Healthy', + value: applications.filter(app => (app as Application).status.health.status === 'Healthy').length, + color: COLORS.health.healthy + }, + { + name: 'Progressing', + value: applications.filter(app => (app as Application).status.health.status === 'Progressing').length, + color: COLORS.health.progressing + }, + { + name: 'Degraded', + value: applications.filter(app => (app as Application).status.health.status === 'Degraded').length, + color: COLORS.health.degraded + }, + { + name: 'Suspended', + value: applications.filter(app => (app as Application).status.health.status === 'Suspended').length, + color: COLORS.health.suspended + }, + { + name: 'Missing', + value: applications.filter(app => (app as Application).status.health.status === 'Missing').length, + color: COLORS.health.missing + }, + { + name: 'Unknown', + value: applications.filter(app => (app as Application).status.health.status === 'Unknown').length, + color: COLORS.health.unknown + } + ); + } else { + readings.push( + { + name: 'True', + value: applications.filter(app => getAppSetHealthStatus((app as ApplicationSet).status) === 'True').length, + color: COLORS.health.healthy + }, + { + name: 'False', + value: applications.filter(app => getAppSetHealthStatus((app as ApplicationSet).status) === 'False').length, + color: COLORS.health.degraded + }, + { + name: 'Unknown', + value: applications.filter(app => getAppSetHealthStatus((app as ApplicationSet).status) === 'Unknown').length, + color: COLORS.health.unknown + } + ); + } // will sort readings by value greatest to lowest, then by name readings.sort((a, b) => (a.value < b.value ? 1 : a.value === b.value ? (a.name > b.name ? 1 : -1) : -1)); @@ -55,7 +78,7 @@ export const ApplicationsStatusBar = ({applications}: ApplicationsStatusBarProps {ctx => ( <> - {totalItems > 1 && ( + {totalItems > 0 && (
{readings && readings.length > 1 && diff --git a/ui/src/app/applications/components/applications-list/applications-summary.tsx b/ui/src/app/applications/components/applications-list/applications-summary.tsx index 0a77350fd1127..5433cefc81bab 100644 --- a/ui/src/app/applications/components/applications-list/applications-summary.tsx +++ b/ui/src/app/applications/components/applications-list/applications-summary.tsx @@ -3,8 +3,10 @@ const PieChart = require('react-svg-piechart').default; import {COLORS} from '../../../shared/components'; import * as models from '../../../shared/models'; -import {HealthStatusCode, SyncStatusCode} from '../../../shared/models'; -import {ComparisonStatusIcon, HealthStatusIcon} from '../utils'; +import {Application, ApplicationSet, HealthStatusCode, SyncStatusCode} from '../../../shared/models'; +import {ComparisonStatusIcon, HealthStatusIcon, getAppSetHealthStatus, isInvokedFromAppsPath} from '../utils'; +import {ContextApis} from '../../../shared/context'; +import {History} from 'history'; const healthColors = new Map(); healthColors.set('Unknown', COLORS.health.unknown); @@ -14,52 +16,96 @@ healthColors.set('Healthy', COLORS.health.healthy); healthColors.set('Degraded', COLORS.health.degraded); healthColors.set('Missing', COLORS.health.missing); +const appSetHealthColors = new Map(); +appSetHealthColors.set('Unknown', COLORS.health.unknown); +appSetHealthColors.set('True', COLORS.health.healthy); +appSetHealthColors.set('False', COLORS.health.degraded); + const syncColors = new Map(); syncColors.set('Unknown', COLORS.sync.unknown); syncColors.set('Synced', COLORS.sync.synced); syncColors.set('OutOfSync', COLORS.sync.out_of_sync); -export const ApplicationsSummary = ({applications}: {applications: models.Application[]}) => { +export const ApplicationsSummary = ({ + applications, + ctx +}: { + applications: models.AbstractApplication[]; + ctx: ContextApis & { + history: History; + }; +}) => { const sync = new Map(); - applications.forEach(app => sync.set(app.status.sync.status, (sync.get(app.status.sync.status) || 0) + 1)); const health = new Map(); - applications.forEach(app => health.set(app.status.health.status, (health.get(app.status.health.status) || 0) + 1)); - const attributes = [ - { - title: 'APPLICATIONS', - value: applications.length - }, - { - title: 'SYNCED', - value: applications.filter(app => app.status.sync.status === 'Synced').length - }, - { - title: 'HEALTHY', - value: applications.filter(app => app.status.health.status === 'Healthy').length - }, - { - title: 'CLUSTERS', - value: new Set(applications.map(app => app.spec.destination.server)).size - }, - { - title: 'NAMESPACES', - value: new Set(applications.map(app => app.spec.destination.namespace)).size - } - ]; + if (isInvokedFromAppsPath(ctx.history.location.pathname)) { + applications.forEach(app => sync.set((app as Application).status.sync.status, (sync.get((app as Application).status.sync.status) || 0) + 1)); + applications.forEach(app => health.set((app as Application).status.health.status, (health.get((app as Application).status.health.status) || 0) + 1)); + } else { + applications.forEach(app => + health.set(getAppSetHealthStatus((app as ApplicationSet).status), (health.get(getAppSetHealthStatus((app as ApplicationSet).status)) || 0) + 1) + ); + } + + const attributes = isInvokedFromAppsPath(ctx.history.location.pathname) + ? [ + { + title: 'APPLICATIONS', + value: applications.length + }, + { + title: 'SYNCED', + value: applications.filter(app => app.status.sync.status === 'Synced').length + }, + { + title: 'HEALTHY', + value: applications.filter(app => app.status.health.status === 'Healthy').length + }, + { + title: 'CLUSTERS', + value: new Set(applications.map(app => app.spec.destination.server)).size + }, + { + title: 'NAMESPACES', + value: new Set(applications.map(app => app.spec.destination.namespace)).size + } + ] + : [ + { + title: 'APPLICATIONSETS', + value: applications.length + }, + { + title: 'HEALTHY', + value: applications.filter(app => getAppSetHealthStatus((app as ApplicationSet).status) === 'True').length + } + ]; + + const charts = isInvokedFromAppsPath(ctx.history.location.pathname) + ? [ + { + title: 'Sync', + data: Array.from(sync.keys()).map(key => ({title: key, value: sync.get(key), color: syncColors.get(key as models.SyncStatusCode)})), + legend: syncColors as Map + }, + { + title: 'Health', + data: Array.from(health.keys()).map(key => ({title: key, value: health.get(key), color: healthColors.get(key as models.HealthStatusCode)})), + legend: healthColors as Map + } + ] + : [ + { + title: 'Health', + data: Array.from(health.keys()).map(key => ({ + title: key, + value: health.get(key), + color: appSetHealthColors.get(key as models.ApplicationSetConditionStatus) + })), + legend: appSetHealthColors as Map + } + ]; - const charts = [ - { - title: 'Sync', - data: Array.from(sync.keys()).map(key => ({title: key, value: sync.get(key), color: syncColors.get(key as models.SyncStatusCode)})), - legend: syncColors as Map - }, - { - title: 'Health', - data: Array.from(health.keys()).map(key => ({title: key, value: health.get(key), color: healthColors.get(key as models.HealthStatusCode)})), - legend: healthColors as Map - } - ]; return (
@@ -95,7 +141,10 @@ export const ApplicationsSummary = ({applications}: {applications: models.Applic
    {Array.from(chart.legend.keys()).map(key => (
  • - {chart.title === 'Health' && } + {isInvokedFromAppsPath(ctx.history.location.pathname) && chart.title === 'Health' && ( + + )} + {/* {chart.title === 'Health' && } */} {chart.title === 'Sync' && } {` ${key} (${getLegendValue(key)})`}
  • diff --git a/ui/src/app/applications/components/applications-list/applications-table.tsx b/ui/src/app/applications/components/applications-list/applications-table.tsx index a34ea5d4d2191..7e32032be40a8 100644 --- a/ui/src/app/applications/components/applications-list/applications-table.tsx +++ b/ui/src/app/applications/components/applications-list/applications-table.tsx @@ -7,14 +7,15 @@ import {Consumer, Context} from '../../../shared/context'; import * as models from '../../../shared/models'; import {ApplicationURLs} from '../application-urls'; import * as AppUtils from '../utils'; -import {getAppDefaultSource, OperationState} from '../utils'; +import {getAppDefaultSource, getAppSetHealthStatus, isApp, OperationState} from '../utils'; import {ApplicationsLabels} from './applications-labels'; import {ApplicationsSource} from './applications-source'; import {services} from '../../../shared/services'; import './applications-table.scss'; +import {Application, ApplicationSet} from '../../../shared/models'; export const ApplicationsTable = (props: { - applications: models.Application[]; + applications: models.AbstractApplication[]; syncApplication: (appName: string, appNamespace: string) => any; refreshApplication: (appName: string, appNamespace: string) => any; deleteApplication: (appName: string, appNamespace: string) => any; @@ -37,7 +38,7 @@ export const ApplicationsTable = (props: { keys: Key.ENTER, action: () => { if (selectedApp > -1) { - ctxh.navigation.goto(`/applications/${props.applications[selectedApp].metadata.name}`); + ctxh.navigation.goto(`${AppUtils.getRootPathByPath(ctxh.history.location.pathname)}/${props.applications[selectedApp].metadata.name}`); return true; } return false; @@ -56,10 +57,18 @@ export const ApplicationsTable = (props: {
    + applications-list__entry applications-list__entry--health-${ + isApp(app) ? (app as models.Application).status.health.status : getAppSetHealthStatus((app as ApplicationSet).status) + } ${selectedApp === i ? 'applications-tiles__selected' : ''}`}>
    ctx.navigation.goto(`/applications/${app.metadata.namespace}/${app.metadata.name}`, {}, {event: e})}> + onClick={e => + ctx.navigation.goto( + `${AppUtils.getRootPathByPath(ctx.history.location.pathname)}/${app.metadata.namespace}/${app.metadata.name}`, + {}, + {event: e} + ) + }>
    @@ -83,11 +92,11 @@ export const ApplicationsTable = (props: { /> - + {isApp(app) && }
    -
    Project:
    -
    {app.spec.project}
    + {isApp(app) &&
    Project:
    } + {isApp(app) &&
    {(app as models.Application).spec.project}
    }
    @@ -109,42 +118,50 @@ export const ApplicationsTable = (props: {
    -
    -
    -
    Source:
    -
    -
    - -
    -
    - + {isApp(app) && ( +
    +
    +
    Source:
    +
    +
    + +
    +
    + +
    -
    -
    -
    Destination:
    -
    - /{app.spec.destination.namespace} +
    +
    Destination:
    +
    + / + {(app as Application).spec.destination.namespace} +
    -
    - + )}
    - {app.status.health.status}
    - - {app.status.sync.status} - ( - - )} - items={[ - {title: 'Sync', action: () => props.syncApplication(app.metadata.name, app.metadata.namespace)}, - {title: 'Refresh', action: () => props.refreshApplication(app.metadata.name, app.metadata.namespace)}, - {title: 'Delete', action: () => props.deleteApplication(app.metadata.name, app.metadata.namespace)} - ]} - /> + {isApp(app) && }{' '} + {isApp(app) && {(app as Application).status.health.status}} {isApp(app) &&
    } + {!isApp(app) && }{' '} + {!isApp(app) && {getAppSetHealthStatus((app as ApplicationSet).status)}} {!isApp(app) &&
    } + {isApp(app) && } + {isApp(app) && {(app as Application).status.sync.status}}{' '} + {isApp(app) && } + {isApp(app) && ( + ( + + )} + items={[ + {title: 'Sync', action: () => props.syncApplication(app.metadata.name, app.metadata.namespace)}, + {title: 'Refresh', action: () => props.refreshApplication(app.metadata.name, app.metadata.namespace)}, + {title: 'Delete', action: () => props.deleteApplication(app.metadata.name, app.metadata.namespace)} + ]} + /> + )}
    diff --git a/ui/src/app/applications/components/applications-list/applications-tiles.tsx b/ui/src/app/applications/components/applications-list/applications-tiles.tsx index 3467d3b952a87..889770c51ea21 100644 --- a/ui/src/app/applications/components/applications-list/applications-tiles.tsx +++ b/ui/src/app/applications/components/applications-list/applications-tiles.tsx @@ -7,16 +7,27 @@ import {Consumer, Context, AuthSettingsCtx} from '../../../shared/context'; import * as models from '../../../shared/models'; import {ApplicationURLs} from '../application-urls'; import * as AppUtils from '../utils'; -import {getAppDefaultSource, OperationState} from '../utils'; +import {getAppDefaultSource, getAppSetHealthStatus, OperationState} from '../utils'; import {services} from '../../../shared/services'; import './applications-tiles.scss'; +import {Application, ApplicationSet} from '../../../shared/models'; +import {ResourceIcon} from '../resource-icon'; -export interface ApplicationTilesProps { +export interface ApplicationTilesProps extends AbstractApplicationTilesProps { applications: models.Application[]; syncApplication: (appName: string, appNamespace: string) => any; refreshApplication: (appName: string, appNamespace: string) => any; +} + +export interface AbstractApplicationTilesProps { + applications: models.AbstractApplication[]; deleteApplication: (appName: string, appNamespace: string) => any; + objectListKind: string; +} + +export interface ApplicationSetTilesProps extends AbstractApplicationTilesProps { + applications: models.ApplicationSet[]; } const useItemsPerContainer = (itemRef: any, containerRef: any): number => { @@ -46,8 +57,8 @@ const useItemsPerContainer = (itemRef: any, containerRef: any): number => { return itemsPer || 1; }; -export const ApplicationTiles = ({applications, syncApplication, refreshApplication, deleteApplication}: ApplicationTilesProps) => { - const [selectedApp, navApp, reset] = useNav(applications.length); +export const ApplicationTiles = (tilesProps: AbstractApplicationTilesProps) => { + const [selectedApp, navApp, reset] = useNav(tilesProps.applications.length); const ctxh = React.useContext(Context); const appRef = {ref: React.useRef(null), set: false}; @@ -56,6 +67,7 @@ export const ApplicationTiles = ({applications, syncApplication, refreshApplicat const useAuthSettingsCtx = React.useContext(AuthSettingsCtx); const {useKeybinding} = React.useContext(KeybindingContext); + const isListOfApplications = tilesProps.objectListKind === 'application'; useKeybinding({keys: Key.RIGHT, action: () => navApp(1)}); useKeybinding({keys: Key.LEFT, action: () => navApp(-1)}); @@ -66,7 +78,8 @@ export const ApplicationTiles = ({applications, syncApplication, refreshApplicat keys: Key.ENTER, action: () => { if (selectedApp > -1) { - ctxh.navigation.goto(`/applications/${applications[selectedApp].metadata.name}`); + ctxh.navigation.goto(`${AppUtils.getRootPathByPath(ctxh.history.location.pathname)}/${tilesProps.applications[selectedApp].metadata.name}`); + // tilesProps.applications[selectedApp] return true; } return false; @@ -106,65 +119,93 @@ export const ApplicationTiles = ({applications, syncApplication, refreshApplicat const favList = pref.appList.favoritesAppList || []; return (
    - {applications.map((app, i) => { + {tilesProps.applications.map((app, i) => { const source = getAppDefaultSource(app); return (
    + className={ + isListOfApplications + ? `argo-table-list__row applications-list__entry applications-list__entry--health-${ + (app as models.Application).status.health.status + } ${selectedApp === i ? 'applications-tiles__selected' : ''}` + : `argo-table-list__row applications-list__entry applications-list__entry--health-${getAppSetHealthStatus( + (app as ApplicationSet).status + )} ${selectedApp === i ? 'applications-tiles__selected' : ''}` + }>
    - ctx.navigation.goto(`/applications/${app.metadata.namespace}/${app.metadata.name}`, {view: pref.appDetails.view}, {event: e}) + ctx.navigation.goto( + `${AppUtils.getRootPathByPath(ctx.history.location.pathname)}/${app.metadata.namespace}/${app.metadata.name}`, + {view: pref.appDetails.view}, + {event: e} + ) }>
    -
    -
    0 ? 'columns small-10' : 'columns small-11'}> - - - - {AppUtils.appQualifiedName(app, useAuthSettingsCtx?.appsInAnyNamespaceEnabled)} - - -
    -
    0 ? 'columns small-2' : 'columns small-1'}> -
    - - - +
    + {isListOfApplications && ( +
    0 ? 'columns small-10' : 'columns small-11'}> + + + + {AppUtils.appQualifiedName(app, useAuthSettingsCtx?.appsInAnyNamespaceEnabled)} +
    -
    + )} + {!isListOfApplications && ( +
    + {'{'} + + {'}'} + + + {AppUtils.appQualifiedName(app, useAuthSettingsCtx?.appsInAnyNamespaceEnabled)} + + +
    + )} + {isListOfApplications && ( +
    0 ? 'columns small-2' : 'columns small-1'}> +
    + + + + +
    +
    + )}
    -
    -
    - Project: + {isListOfApplications && ( +
    +
    + Project: +
    +
    {app.spec.project}
    -
    {app.spec.project}
    -
    + )}
    Labels: @@ -196,30 +237,38 @@ export const ApplicationTiles = ({applications, syncApplication, refreshApplicat Status:
    - {app.status.health.status} + {isListOfApplications && }{' '} + {isListOfApplications && (app as Application).status.health.status} + {!isListOfApplications && }{' '} + {!isListOfApplications && getAppSetHealthStatus((app as ApplicationSet).status)}   - {app.status.sync.status} + {isListOfApplications && }{' '} + {isListOfApplications && (app as Application).status.sync.status}   - + {isListOfApplications && }
    -
    -
    - Repository: -
    -
    - - {source.repoURL} - + {isListOfApplications && ( +
    +
    + Repository: +
    +
    + + {source.repoURL} + +
    -
    -
    -
    - Target Revision: + )} + {isListOfApplications && ( +
    +
    + Target Revision: +
    +
    {source.targetRevision || 'HEAD'}
    -
    {source.targetRevision || 'HEAD'}
    -
    - {source.path && ( + )} + {isListOfApplications && source.path && (
    Path: @@ -227,7 +276,7 @@ export const ApplicationTiles = ({applications, syncApplication, refreshApplicat
    {source.path}
    )} - {source.chart && ( + {isListOfApplications && source.chart && (
    Chart: @@ -235,71 +284,80 @@ export const ApplicationTiles = ({applications, syncApplication, refreshApplicat
    {source.chart}
    )} -
    -
    - Destination: -
    -
    - + {isListOfApplications && ( +
    +
    + Destination: +
    +
    + +
    -
    -
    -
    - Namespace: + )} + {isListOfApplications && ( +
    +
    + Namespace: +
    +
    {(app as models.Application).spec.destination.namespace}
    -
    {app.spec.destination.namespace}
    -
    + )}
    Created At:
    {AppUtils.formatCreationTimestamp(app.metadata.creationTimestamp)}
    - {app.status.operationState && ( + {isListOfApplications && (app as models.Application).status.operationState && (
    Last Sync:
    - {AppUtils.formatCreationTimestamp(app.status.operationState.finishedAt || app.status.operationState.startedAt)} + {AppUtils.formatCreationTimestamp( + (app as Application).status.operationState.finishedAt || app.status.operationState.startedAt + )}
    )} -
    -
    - { - e.stopPropagation(); - syncApplication(app.metadata.name, app.metadata.namespace); - }}> - Sync - -   - { - e.stopPropagation(); - refreshApplication(app.metadata.name, app.metadata.namespace); - }}> - {' '} - Refresh - -   - { - e.stopPropagation(); - deleteApplication(app.metadata.name, app.metadata.namespace); - }}> - Delete - + {isListOfApplications && ( + -
    + )}
    diff --git a/ui/src/app/applications/components/applications-refresh-panel/applications-refresh-panel.tsx b/ui/src/app/applications/components/applications-refresh-panel/applications-refresh-panel.tsx index 56cab7a39e982..1a9c3f67aa5b3 100644 --- a/ui/src/app/applications/components/applications-refresh-panel/applications-refresh-panel.tsx +++ b/ui/src/app/applications/components/applications-refresh-panel/applications-refresh-panel.tsx @@ -50,7 +50,7 @@ export const ApplicationsRefreshPanel = ({show, apps, hide}: {show: boolean; app const refreshActions = []; for (const app of selectedApps) { const refreshAction = async () => { - await services.applications.get(app.metadata.name, app.metadata.namespace, params.refreshType).catch(e => { + await services.applications.get(app.metadata.name, app.metadata.namespace, ctx.history.location.pathname, params.refreshType).catch(e => { ctx.notifications.show({ content: , type: NotificationType.Error @@ -95,7 +95,7 @@ export const ApplicationsRefreshPanel = ({show, apps, hide}: {show: boolean; app ))}
    - +
    )} diff --git a/ui/src/app/applications/components/applications-sync-panel/applications-sync-panel.tsx b/ui/src/app/applications/components/applications-sync-panel/applications-sync-panel.tsx index 0c97b75eb0b70..58e77d8bf318a 100644 --- a/ui/src/app/applications/components/applications-sync-panel/applications-sync-panel.tsx +++ b/ui/src/app/applications/components/applications-sync-panel/applications-sync-panel.tsx @@ -147,7 +147,7 @@ export const ApplicationsSyncPanel = ({show, apps, hide}: {show: boolean; apps: - +
    )} diff --git a/ui/src/app/applications/components/resource-details/resource-details.tsx b/ui/src/app/applications/components/resource-details/resource-details.tsx index 52d2fef184703..544d96449b525 100644 --- a/ui/src/app/applications/components/resource-details/resource-details.tsx +++ b/ui/src/app/applications/components/resource-details/resource-details.tsx @@ -5,7 +5,7 @@ import {EventsList, YamlEditor} from '../../../shared/components'; import * as models from '../../../shared/models'; import {ErrorBoundary} from '../../../shared/components/error-boundary/error-boundary'; import {Context} from '../../../shared/context'; -import {Application, ApplicationTree, AppSourceType, Event, RepoAppDetails, ResourceNode, State, SyncStatuses} from '../../../shared/models'; +import {AbstractApplication, Application, ApplicationTree, AppSourceType, Event, RepoAppDetails, ResourceNode, State, SyncStatuses} from '../../../shared/models'; import {services} from '../../../shared/services'; import {ResourceTabExtension} from '../../../shared/services/extensions-service'; import {NodeInfo, SelectNode} from '../application-details/application-details'; @@ -21,12 +21,13 @@ import {ResourceIcon} from '../resource-icon'; import {ResourceLabel} from '../resource-label'; import * as AppUtils from '../utils'; import './resource-details.scss'; +import {isApp} from '../utils'; const jsonMergePatch = require('json-merge-patch'); interface ResourceDetailsProps { selectedNode: ResourceNode; - updateApp: (app: Application, query: {validate?: boolean}) => Promise; + updateApp: (app: AbstractApplication, query: {validate?: boolean}) => Promise; application: Application; isAppSelected: boolean; tree: ApplicationTree; @@ -154,52 +155,55 @@ export const ResourceDetails = (props: ResourceDetailsProps) => { }; const getApplicationTabs = () => { - const tabs: Tab[] = [ - { - title: 'SUMMARY', - key: 'summary', - content: updateApp(app, query)} /> - }, - { - title: 'PARAMETERS', - key: 'parameters', - content: ( - - services.repos.appDetails(AppUtils.getAppDefaultSource(app), app.metadata.name, app.spec.project).catch(() => ({ - type: 'Directory' as AppSourceType, - path: AppUtils.getAppDefaultSource(app).path - })) - }> - {(details: RepoAppDetails) => ( - updateApp(app, query)} - application={application} - details={details} - /> - )} - - ) - }, - { - title: 'MANIFEST', - key: 'manifest', - content: ( - { - const spec = JSON.parse(JSON.stringify(application.spec)); - return services.applications.updateSpec(application.metadata.name, application.metadata.namespace, jsonMergePatch.apply(spec, JSON.parse(patch))); - }} - /> - ) - } - ]; + const tabs: Tab[] = []; + if (isApp(application)) { + tabs.push( + { + title: 'SUMMARY', + key: 'summary', + content: updateApp(app, query)} /> + }, + { + title: 'PARAMETERS', + key: 'parameters', + content: ( + + services.repos.appDetails(AppUtils.getAppDefaultSource(app), app.metadata.name, app.spec.project).catch(() => ({ + type: 'Directory' as AppSourceType, + path: AppUtils.getAppDefaultSource(app).path + })) + }> + {(details: RepoAppDetails) => ( + updateApp(app, query)} + application={application} + details={details} + /> + )} + + ) + } + ); + } + tabs.push({ + title: 'MANIFEST', + key: 'manifest', + content: ( + { + const spec = JSON.parse(JSON.stringify(application.spec)); + return services.applications.updateSpec(application.metadata.name, application.metadata.namespace, jsonMergePatch.apply(spec, JSON.parse(patch))); + }} + /> + ) + }); - if (application.status.sync.status !== SyncStatuses.Synced) { + if (isApp(application) && (application as Application).status.sync.status !== SyncStatuses.Synced) { tabs.push({ icon: 'fa fa-file-medical', title: 'DIFF', @@ -208,7 +212,7 @@ export const ResourceDetails = (props: ResourceDetailsProps) => { - await services.applications.managedResources(application.metadata.name, application.metadata.namespace, { + await services.applications.managedResources(application.metadata.name, application.metadata.namespace, appContext.history.location.pathname, { fields: ['items.normalizedLiveState', 'items.predictedLiveState', 'items.group', 'items.kind', 'items.namespace', 'items.name'] }) }> @@ -224,7 +228,7 @@ export const ResourceDetails = (props: ResourceDetailsProps) => { content: }); - const extensionTabs = services.extensions.getResourceTabs('argoproj.io', 'Application').map((ext, i) => ({ + const extensionTabs = services.extensions.getResourceTabs('argoproj.io', application.kind).map((ext, i) => ({ title: ext.title, key: `extension-${i}`, content: , @@ -243,14 +247,19 @@ export const ResourceDetails = (props: ResourceDetailsProps) => { noLoaderOnInputChange={true} input={selectedNode.resourceVersion} load={async () => { - const managedResources = await services.applications.managedResources(application.metadata.name, application.metadata.namespace, { - id: { - name: selectedNode.name, - namespace: selectedNode.namespace, - kind: selectedNode.kind, - group: selectedNode.group + const managedResources = await services.applications.managedResources( + application.metadata.name, + application.metadata.namespace, + appContext.history.location.pathname, + { + id: { + name: selectedNode.name, + namespace: selectedNode.namespace, + kind: selectedNode.kind, + group: selectedNode.group + } } - }); + ); const controlled = managedResources.find(item => AppUtils.isSameNode(selectedNode, item)); const summary = application.status.resources.find(item => AppUtils.isSameNode(selectedNode, item)); const controlledState = (controlled && summary && {summary, state: controlled}) || null; @@ -258,7 +267,9 @@ export const ResourceDetails = (props: ResourceDetailsProps) => { if (controlled && controlled.targetState) { resQuery.version = AppUtils.parseApiVersion(controlled.targetState.apiVersion).version; } - const liveState = await services.applications.getResource(application.metadata.name, application.metadata.namespace, resQuery).catch(() => null); + const liveState = await services.applications + .getResource(application.metadata.name, application.metadata.namespace, appContext.history.location.pathname, resQuery) + .catch(() => null); const events = (liveState && (await services.applications.resourceEvents(application.metadata.name, application.metadata.namespace, { @@ -273,7 +284,9 @@ export const ResourceDetails = (props: ResourceDetailsProps) => { } else { const childPod = AppUtils.findChildPod(selectedNode, tree); if (childPod) { - podState = await services.applications.getResource(application.metadata.name, application.metadata.namespace, childPod).catch(() => null); + podState = await services.applications + .getResource(application.metadata.name, application.metadata.namespace, appContext.history.location.pathname, childPod) + .catch(() => null); } } @@ -307,7 +320,7 @@ export const ResourceDetails = (props: ResourceDetailsProps) => { SYNC