diff --git a/config/crds/kudo.dev_operatorversions.yaml b/config/crds/kudo.dev_operatorversions.yaml index ff821f61d..3972e6122 100644 --- a/config/crds/kudo.dev_operatorversions.yaml +++ b/config/crds/kudo.dev_operatorversions.yaml @@ -234,6 +234,8 @@ spec: description: PipeSpec describes how a file generated by a PipeTask is stored and referenced properties: + envFile: + type: string file: type: string key: diff --git a/pkg/apis/kudo/v1beta1/operatorversion_types.go b/pkg/apis/kudo/v1beta1/operatorversion_types.go index 1fab0faaa..4c3f8257f 100644 --- a/pkg/apis/kudo/v1beta1/operatorversion_types.go +++ b/pkg/apis/kudo/v1beta1/operatorversion_types.go @@ -192,6 +192,8 @@ type PipeSpec struct { // +optional File string `json:"file"` // +optional + EnvFile string `json:"envFile"` + // +optional Kind string `json:"kind"` // +optional Key string `json:"key"` diff --git a/pkg/engine/task/env_file.go b/pkg/engine/task/env_file.go new file mode 100644 index 000000000..864951f77 --- /dev/null +++ b/pkg/engine/task/env_file.go @@ -0,0 +1,77 @@ +package task + +// This file has been adopted from kubectl/pkg/generate/versioned/env_file.go and used to read files containing +// env var pairs in pipe-tasks. + +import ( + "bufio" + "bytes" + "fmt" + "strings" + "unicode" + "unicode/utf8" + + "k8s.io/apimachinery/pkg/util/validation" +) + +var utf8bom = []byte{0xEF, 0xBB, 0xBF} + +// proccessEnvFileLine returns a blank key if the line is empty or a comment. +// The value will be retrieved from the environment if necessary. +func proccessEnvFileLine(line []byte, currentLine int) (key, value string, err error) { + + if !utf8.Valid(line) { + return ``, ``, fmt.Errorf("invalid utf8 bytes at line %d: %v", currentLine+1, line) + } + + // We trim UTF8 BOM from the first line of the file but no others + if currentLine == 0 { + line = bytes.TrimPrefix(line, utf8bom) + } + + // trim the line from all leading whitespace first + line = bytes.TrimLeftFunc(line, unicode.IsSpace) + + // If the line is empty or a comment, we return a blank key/value pair. + if len(line) == 0 || line[0] == '#' { + return ``, ``, nil + } + + data := strings.SplitN(string(line), "=", 2) + if len(data) != 2 { + return ``, ``, fmt.Errorf("%q is not a valid env var definition (KEY=VAL)", line) + } + + key = data[0] + if errs := validation.IsEnvVarName(key); len(errs) != 0 { + return ``, ``, fmt.Errorf("%q is not a valid key name: %s", key, strings.Join(errs, ";")) + } + value = data[1] + + return key, value, nil +} + +// addFromEnvFile processes an env file allows a generic addTo to handle the +// collection of key value pairs or returns an error. +func addFromEnvFile(data []byte, addTo func(key, value string)) error { + r := bytes.NewReader(data) + scanner := bufio.NewScanner(r) + currentLine := 0 + for scanner.Scan() { + // Process the current line, retrieving a key/value pair if possible. + scannedBytes := scanner.Bytes() + key, value, err := proccessEnvFileLine(scannedBytes, currentLine) + if err != nil { + return err + } + currentLine++ + + if len(key) == 0 { + // no key means line was empty or a comment + continue + } + + addTo(key, value) + } + return nil +} diff --git a/pkg/engine/task/task.go b/pkg/engine/task/task.go index 1c45fae03..2d1a375e8 100644 --- a/pkg/engine/task/task.go +++ b/pkg/engine/task/task.go @@ -115,7 +115,7 @@ func newPipe(task *v1beta1.Task) (Tasker, error) { var pipeFiles []PipeFile for _, pp := range task.Spec.PipeTaskSpec.Pipe { - pf := PipeFile{File: pp.File, Kind: PipeFileKind(pp.Kind), Key: pp.Key} + pf := PipeFile{File: pp.File, EnvFile: pp.EnvFile, Kind: PipeFileKind(pp.Kind), Key: pp.Key} // validate pipe file if err := validPipeFile(pf); err != nil { return nil, err @@ -151,9 +151,12 @@ var ( ) func validPipeFile(pf PipeFile) error { - if pf.File == "" { - return fmt.Errorf("task validation error: pipe file is empty: %v", pf) + fl := pf.File != "" + efl := pf.EnvFile != "" + if fl == efl { + return fmt.Errorf("task validation error: pipe file %v must have either 'file' or 'envFile' field set but not both", pf) } + if pf.Kind != PipeFileKindSecret && pf.Kind != PipeFileKindConfigMap { return fmt.Errorf("task validation error: invalid pipe kind (must be Secret or ConfigMap): %v", pf) } diff --git a/pkg/engine/task/task_pipe.go b/pkg/engine/task/task_pipe.go index ef2291660..679982a1c 100644 --- a/pkg/engine/task/task_pipe.go +++ b/pkg/engine/task/task_pipe.go @@ -49,9 +49,19 @@ type PipeTask struct { } type PipeFile struct { - File string - Kind PipeFileKind - Key string + File string + EnvFile string + Kind PipeFileKind + Key string +} + +// fileSource return either File or EnvFile depending on which one of them is set. Note that only one can be set at a +// time which is enforced by the validation. +func (pf PipeFile) fileSource() string { + if pf.File != "" { + return pf.File + } + return pf.EnvFile } func (pt PipeTask) Run(ctx Context) (bool, error) { @@ -218,11 +228,11 @@ func validate(pod *corev1.Pod, ff []PipeFile) error { // check if all referenced pipe files are children of the container mountPath for _, f := range ff { - if !isRelative(mountPath, f.File) { - return fmt.Errorf("pipe file %s should be a child of %s mount path", f.File, mountPath) + if !isRelative(mountPath, f.fileSource()) { + return fmt.Errorf("pipe file %s should be a child of %s mount path", f.fileSource(), mountPath) } - fileName := path.Base(f.File) + fileName := path.Base(f.fileSource()) // Same as k8s we use file names as ConfigMap data keys. A valid key name for a ConfigMap must consist // of alphanumeric characters, '-', '_' or '.' (e.g. 'key.name', or 'KEY_NAME', or 'key-name', regex // used for validation is '[-._a-zA-Z0-9]+') @@ -271,12 +281,12 @@ func copyFiles(fs afero.Fs, ff []PipeFile, pod *corev1.Pod, ctx Context) error { for _, f := range ff { f := f - log.Printf("PipeTask: %s/%s copying pipe file %s", ctx.Meta.InstanceNamespace, ctx.Meta.InstanceName, f.File) + log.Printf("PipeTask: %s/%s copying pipe file %s", ctx.Meta.InstanceNamespace, ctx.Meta.InstanceName, f.fileSource()) g.Go(func() error { // Check the size of the pipe file first. K87 has a inherent limit on the size of // Secret/ConfigMap, so we avoid unnecessary copying of files that are too big by // checking its size first. - size, err := podexec.FileSize(f.File, pod, pipePodContainerName, ctx.Config) + size, err := podexec.FileSize(f.fileSource(), pod, pipePodContainerName, ctx.Config) if err != nil { // Any remote command exit code > 0 is treated as a fatal error since retrying it doesn't make sense if podexec.HasCommandFailed(err) { @@ -286,10 +296,10 @@ func copyFiles(fs afero.Fs, ff []PipeFile, pod *corev1.Pod, ctx Context) error { } if size > maxPipeFileSize { - return fatalExecutionError(fmt.Errorf("pipe file %s size %d exceeds maximum file size of %d bytes", f.File, size, maxPipeFileSize), pipeTaskError, ctx.Meta) + return fatalExecutionError(fmt.Errorf("pipe file %s size %d exceeds maximum file size of %d bytes", f.fileSource(), size, maxPipeFileSize), pipeTaskError, ctx.Meta) } - if err = podexec.DownloadFile(fs, f.File, pod, pipePodContainerName, ctx.Config); err != nil { + if err = podexec.DownloadFile(fs, f.fileSource(), pod, pipePodContainerName, ctx.Config); err != nil { // Any remote command exit code > 0 is treated as a fatal error since retrying it doesn't make sense if podexec.HasCommandFailed(err) { return fatalExecutionError(err, pipeTaskError, ctx.Meta) @@ -309,9 +319,9 @@ func createArtifacts(fs afero.Fs, files []PipeFile, meta renderer.Metadata) (map artifacts := map[string]string{} for _, pf := range files { - data, err := afero.ReadFile(fs, pf.File) + data, err := afero.ReadFile(fs, pf.fileSource()) if err != nil { - return nil, fmt.Errorf("error opening pipe file %s", pf.File) + return nil, fmt.Errorf("error opening pipe file %s", pf.fileSource()) } var art string @@ -337,7 +347,7 @@ func createArtifacts(fs afero.Fs, files []PipeFile, meta renderer.Metadata) (map // as Secret data key. Secret name will be of the form ....- func createSecret(pf PipeFile, data []byte, meta renderer.Metadata) (string, error) { name := PipeArtifactName(meta, pf.Key) - key := path.Base(pf.File) + key := path.Base(pf.fileSource()) secret := corev1.Secret{ TypeMeta: metav1.TypeMeta{ @@ -347,10 +357,23 @@ func createSecret(pf PipeFile, data []byte, meta renderer.Metadata) (string, err ObjectMeta: metav1.ObjectMeta{ Name: name, }, - Data: map[string][]byte{key: data}, + Data: map[string][]byte{}, Type: corev1.SecretTypeOpaque, } + if pf.File != "" { + secret.Data = map[string][]byte{key: data} + } + if pf.EnvFile != "" { + err := addFromEnvFile(data, func(key, value string) { + secret.Data[key] = []byte(value) + }) + + if err != nil { + return "", fmt.Errorf("failed to read env var file %q: %v", pf.fileSource(), err) + } + } + b, err := yaml.Marshal(secret) if err != nil { return "", fmt.Errorf("failed to marshal pipe secret for pipe file %s: %v", pf.File, err) @@ -363,7 +386,7 @@ func createSecret(pf PipeFile, data []byte, meta renderer.Metadata) (string, err // as ConfigMap data key. ConfigMap name will be of the form ....- func createConfigMap(pf PipeFile, data []byte, meta renderer.Metadata) (string, error) { name := PipeArtifactName(meta, pf.Key) - key := path.Base(pf.File) + key := path.Base(pf.fileSource()) configMap := corev1.ConfigMap{ TypeMeta: metav1.TypeMeta{ @@ -373,7 +396,21 @@ func createConfigMap(pf PipeFile, data []byte, meta renderer.Metadata) (string, ObjectMeta: metav1.ObjectMeta{ Name: name, }, - BinaryData: map[string][]byte{key: data}, + Data: map[string]string{}, + BinaryData: map[string][]byte{}, + } + + if pf.File != "" { + configMap.BinaryData = map[string][]byte{key: data} + } + if pf.EnvFile != "" { + err := addFromEnvFile(data, func(key, value string) { + configMap.Data[key] = value + }) + + if err != nil { + return "", fmt.Errorf("failed to read env var file %q: %v", pf.fileSource(), err) + } } b, err := yaml.Marshal(configMap) diff --git a/pkg/engine/task/task_pipe_test.go b/pkg/engine/task/task_pipe_test.go index 2299191c4..ff3d0d7a8 100644 --- a/pkg/engine/task/task_pipe_test.go +++ b/pkg/engine/task/task_pipe_test.go @@ -383,7 +383,7 @@ func Test_pipeFiles(t *testing.T) { wantErr bool }{ { - name: "pipe a secret", + name: "pipe a file to a secret", data: map[string]string{"/tmp/foo.txt": "foo"}, file: PipeFile{ File: "/tmp/foo.txt", @@ -400,7 +400,32 @@ func Test_pipeFiles(t *testing.T) { wantErr: false, }, { - name: "pipe a configMap", + name: "pipe an env file to a secret", + data: map[string]string{"/tmp/foo.env": ` + enemies=aliens + lives=3 + allowed="true" + `}, + file: PipeFile{ + EnvFile: "/tmp/foo.env", + Kind: PipeFileKindSecret, + Key: "Foo", + }, + meta: meta, + wantArtifact: v1.Secret{ + TypeMeta: metav1.TypeMeta{Kind: "Secret", APIVersion: "v1"}, + ObjectMeta: metav1.ObjectMeta{Name: "fooinstance.deploy.first.step.genfiles.foo"}, + Data: map[string][]byte{ + "enemies": []byte("aliens"), + "lives": []byte("3"), + "allowed": []byte("\"true\""), + }, + Type: v1.SecretTypeOpaque, + }, + wantErr: false, + }, + { + name: "pipe a file to a configMap", data: map[string]string{"/tmp/bar.txt": "bar"}, file: PipeFile{ File: "/tmp/bar.txt", @@ -415,6 +440,30 @@ func Test_pipeFiles(t *testing.T) { }, wantErr: false, }, + { + name: "pipe an env file to a configMap", + data: map[string]string{"/tmp/bar.env": ` + enemies=aliens + lives=3 + allowed="true" + `}, + file: PipeFile{ + EnvFile: "/tmp/bar.env", + Kind: PipeFileKindConfigMap, + Key: "Bar", + }, + meta: meta, + wantArtifact: v1.ConfigMap{ + TypeMeta: metav1.TypeMeta{Kind: "ConfigMap", APIVersion: "v1"}, + ObjectMeta: metav1.ObjectMeta{Name: "fooinstance.deploy.first.step.genfiles.bar"}, + Data: map[string]string{ + "enemies": "aliens", + "lives": "3", + "allowed": "\"true\"", + }, + }, + wantErr: false, + }, { name: "return an error for an invalid pipe", data: map[string]string{"nope.txt": ""}, @@ -428,6 +477,7 @@ func Test_pipeFiles(t *testing.T) { wantErr: true, }, } + for _, tt := range tests { tt := tt diff --git a/pkg/engine/task/task_test.go b/pkg/engine/task/task_test.go index b1b66ff00..cf25c6aca 100644 --- a/pkg/engine/task/task_test.go +++ b/pkg/engine/task/task_test.go @@ -91,7 +91,7 @@ kind: Pipe spec: pod: pipe-pod.yaml pipe: - - file: /tmp/bar.txt + - envFile: /tmp/bar.txt kind: ConfigMap key: Bar`, want: PipeTask{ @@ -99,9 +99,9 @@ spec: Pod: "pipe-pod.yaml", PipeFiles: []PipeFile{ { - File: "/tmp/bar.txt", - Kind: "ConfigMap", - Key: "Bar", + EnvFile: "/tmp/bar.txt", + Kind: "ConfigMap", + Key: "Bar", }, }, }, @@ -122,14 +122,28 @@ spec: wantErr: true, }, { - name: "pipe task file must be defined", + name: "either pipe task file or envFile must be defined", + taskYaml: ` +name: pipe-task +kind: Pipe +spec: + pod: pipe-pod.yaml + pipe: + - kind: Secret + key: Bar`, + want: nil, + wantErr: true, + }, + { + name: "pipe task file and envFile should not be defined at the same time", taskYaml: ` name: pipe-task kind: Pipe spec: pod: pipe-pod.yaml pipe: - - file: + - file: foo.yaml + envFile: bar.yaml kind: Secret key: Bar`, want: nil, @@ -177,7 +191,7 @@ spec: } if !reflect.DeepEqual(got, tt.want) { - t.Errorf("Build(%s) got = %v, want %v", tt.name, got, tt.want) + t.Errorf("Build(%s) got = %+v, want %+v", tt.name, got, tt.want) } }) } diff --git a/pkg/kudoctl/cmd/testdata/deploy-kudo-ns.yaml.golden b/pkg/kudoctl/cmd/testdata/deploy-kudo-ns.yaml.golden index 96f4f9f75..b2e19b168 100644 --- a/pkg/kudoctl/cmd/testdata/deploy-kudo-ns.yaml.golden +++ b/pkg/kudoctl/cmd/testdata/deploy-kudo-ns.yaml.golden @@ -306,6 +306,8 @@ spec: description: PipeSpec describes how a file generated by a PipeTask is stored and referenced properties: + envFile: + type: string file: type: string key: diff --git a/pkg/kudoctl/cmd/testdata/deploy-kudo-sa.yaml.golden b/pkg/kudoctl/cmd/testdata/deploy-kudo-sa.yaml.golden index 67709482b..9abe7cedc 100644 --- a/pkg/kudoctl/cmd/testdata/deploy-kudo-sa.yaml.golden +++ b/pkg/kudoctl/cmd/testdata/deploy-kudo-sa.yaml.golden @@ -306,6 +306,8 @@ spec: description: PipeSpec describes how a file generated by a PipeTask is stored and referenced properties: + envFile: + type: string file: type: string key: diff --git a/pkg/kudoctl/cmd/testdata/deploy-kudo-webhook.yaml.golden b/pkg/kudoctl/cmd/testdata/deploy-kudo-webhook.yaml.golden index 34a8ade08..82d72edeb 100644 --- a/pkg/kudoctl/cmd/testdata/deploy-kudo-webhook.yaml.golden +++ b/pkg/kudoctl/cmd/testdata/deploy-kudo-webhook.yaml.golden @@ -306,6 +306,8 @@ spec: description: PipeSpec describes how a file generated by a PipeTask is stored and referenced properties: + envFile: + type: string file: type: string key: diff --git a/pkg/kudoctl/cmd/testdata/deploy-kudo.yaml.golden b/pkg/kudoctl/cmd/testdata/deploy-kudo.yaml.golden index c371e9b7b..dcf6208e2 100644 --- a/pkg/kudoctl/cmd/testdata/deploy-kudo.yaml.golden +++ b/pkg/kudoctl/cmd/testdata/deploy-kudo.yaml.golden @@ -306,6 +306,8 @@ spec: description: PipeSpec describes how a file generated by a PipeTask is stored and referenced properties: + envFile: + type: string file: type: string key: diff --git a/pkg/kudoctl/kudoinit/crd/bindata.go b/pkg/kudoctl/kudoinit/crd/bindata.go index 87b39e13c..092b99660 100644 --- a/pkg/kudoctl/kudoinit/crd/bindata.go +++ b/pkg/kudoctl/kudoinit/crd/bindata.go @@ -119,7 +119,7 @@ func configCrdsKudoDev_operatorsYaml() (*asset, error) { return a, nil } -var _configCrdsKudoDev_operatorversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\xdd\x6f\xe3\x36\x12\x7f\xcf\x5f\x31\x48\x1f\xf6\x0a\xc4\xf6\x75\x7b\x38\x1c\xfc\xb6\xd8\x6d\x0f\xb9\xb6\x49\xb0\xc9\xf6\x70\x68\x7b\x08\x2d\x8d\x2d\x36\x14\xa9\x92\x94\xbd\xbe\x45\xff\xf7\xc3\xf0\x43\x92\x6d\x51\x56\xbc\x9b\xde\x1e\x10\xbd\x24\x96\x28\xce\x07\xe7\xe3\x37\x43\xea\x6c\x32\x99\x9c\xb1\x8a\xff\x88\xda\x70\x25\xe7\xc0\x2a\x8e\xef\x2d\x4a\xfa\x65\xa6\x0f\x7f\x33\x53\xae\x66\xeb\xaf\x16\x68\xd9\x57\x67\x0f\x5c\xe6\x73\x78\x5d\x1b\xab\xca\xb7\x68\x54\xad\x33\x7c\x83\x4b\x2e\xb9\xe5\x4a\x9e\x95\x68\x59\xce\x2c\x9b\x9f\x01\x30\x29\x95\x65\x74\xdb\xd0\x4f\x80\x4c\x49\xab\x95\x10\xa8\x27\x2b\x94\xd3\x87\x7a\x81\x8b\x9a\x8b\x1c\xb5\xa3\x10\xe9\xaf\xff\x3c\x7d\x39\xfd\xeb\x19\x40\xa6\xd1\xbd\x7e\xc7\x4b\x34\x96\x95\xd5\x1c\x64\x2d\xc4\x19\x80\x64\x25\xce\x41\x55\xa8\x99\x55\x3a\xbc\x69\xa6\x0f\x75\xae\xa6\x39\xae\xcf\x4c\x85\x19\xd1\x5c\x69\x55\x57\x73\x68\xee\xfb\x37\x03\x3b\x5e\x94\xeb\x30\x49\x10\xdf\x3d\x11\xdc\xd8\xef\xfa\x9e\x7e\xcf\x8d\x75\x23\x2a\x51\x6b\x26\x0e\x59\x70\x0f\x0d\x97\xab\x5a\x30\x7d\xf0\xf8\x0c\xc0\x64\xaa\xc2\x39\x5c\x11\x1b\x15\xcb\x30\x3f\x03\x58\x33\xc1\x73\x27\xa9\x67\x4c\x55\x28\x5f\xdd\x5c\xfe\xf8\xf5\x6d\x56\x60\xc9\xfc\x4d\x80\x1c\x4d\xa6\x79\xe5\xc6\xed\x33\x06\xdc\x80\x2d\x10\xfc\x1b\xb0\x54\xda\xfd\xdc\x67\x0f\x5e\xdd\x5c\x4e\xc3\x74\x95\xa6\xa7\x96\x47\x75\xd0\xd5\x31\x83\xe6\xde\x1e\xe1\x17\xc4\x59\x20\x9a\xd3\xc2\xa3\xa7\x1c\x48\x60\x0e\xc6\xf3\xa0\x96\x60\x0b\x6e\x40\x63\xa5\xd1\xa0\xf4\xa6\xd0\x99\x16\x68\x08\x93\xa0\x16\xbf\x62\x66\xa7\x70\x8b\x8e\x4f\x30\x85\xaa\x45\x4e\xd6\xb2\x46\x6d\x41\x63\xa6\x56\x92\xff\xa7\x99\xd9\x80\x55\x8e\xa4\x60\x16\xc3\x7a\xc4\x8b\x4b\x8b\x5a\x32\x41\x3a\xad\xf1\x02\x98\xcc\xa1\x64\x5b\xd0\x48\x34\xa0\x96\x9d\xd9\xdc\x10\x33\x85\x1f\x94\x46\xe0\x72\xa9\xe6\x50\x58\x5b\x99\xf9\x6c\xb6\xe2\x36\x1a\x7e\xa6\xca\xb2\x96\xdc\x6e\x67\xce\x7c\xf9\xa2\xb6\x4a\x9b\x59\x8e\x6b\x14\x33\xc3\x57\x13\xa6\xb3\x82\x5b\xcc\x6c\xad\x71\xc6\x2a\x3e\x71\x8c\x4b\x67\xf7\xd3\x32\xff\x42\x07\x2f\x31\x2f\x3a\x9c\xda\x2d\x59\x81\xb1\x9a\xcb\x55\x73\xdb\x19\x64\x52\xef\x64\x90\xb4\xcc\x2c\xbc\xe6\xf9\x6f\xd5\x4b\xb7\x48\x2b\x6f\xbf\xb9\xbd\x83\x48\xd4\x2d\xc1\xae\xce\x9d\xb6\xdb\xd7\x4c\xab\x78\x52\x14\x97\x4b\xd4\x7e\xe1\x96\x5a\x95\x6e\x46\x94\x79\xa5\xb8\xb4\xee\x47\x26\x38\xca\x5d\xa5\x9b\x7a\x51\x72\x4b\x2b\xfd\x5b\x8d\xc6\xd2\xfa\x4c\xe1\xb5\x73\x7f\x58\x20\xd4\x55\xce\x2c\xe6\x53\xb8\x94\xf0\x9a\x95\x28\x5e\x33\x83\x4f\xae\x76\xd2\xb0\x99\x90\x4a\x8f\x2b\xbe\x1b\xb5\x76\x07\x7a\x6d\x35\xb7\x63\x5c\xe9\x5d\xa1\x3d\x97\xbc\xad\x30\xdb\xf1\x90\x1c\x0d\xd7\x64\xc5\x96\x59\x24\xdb\xdf\x7b\x61\xda\x99\xb8\xcf\x39\xbd\x83\x56\x3d\x0e\x9a\x14\x0c\x7c\xd4\x95\x98\x11\x8b\xb7\xee\xe1\xfe\x8b\x3b\x32\xbc\xde\x1b\xdc\x08\xc0\xc0\x62\x59\x91\xc7\xe5\xd1\xfe\x6c\xc1\x2c\x64\x4c\xc2\x02\xf7\xa6\x04\xa8\x0d\xe6\xe4\xa6\x81\x38\xfd\xcb\x24\x70\x69\x2c\x93\x19\xfa\xd8\x80\x8d\x02\xa6\x63\x65\xc9\xb1\x42\x99\xa3\xcc\x0e\x14\xb3\x27\xc7\x9b\xce\x40\x60\x2e\xa0\xbb\x68\x23\xc4\xce\x1c\x91\x11\x95\x60\x84\x5b\x2c\x0f\x08\x25\x96\xbd\x21\x49\xd1\x66\x89\x1a\x65\xe6\x68\x7b\x0d\xe6\x49\x1a\xe9\xc5\x8e\x4b\xde\x17\x93\x13\xcc\xbc\xba\xb9\x8c\x91\x38\xca\x16\x98\xb1\x87\x74\x07\x55\xed\xaf\x25\x47\x91\xdf\x30\x5b\x8c\xa0\xfd\xe2\x72\xe9\x89\x79\xeb\x50\xc0\xa0\xe2\xe8\x57\xbb\x09\xf3\xce\x06\x90\xe5\xa0\x96\xbd\x33\x12\x6c\x00\x72\x63\x8d\xe1\x8d\x0b\x1f\x8d\x82\xd1\xb5\xc9\xc1\x32\x2e\x81\xf9\xe4\x09\xff\xb8\xbd\xbe\x9a\xfd\x5d\x25\xa6\x74\x52\x00\xcb\x32\x34\xc6\xbb\x5f\x89\xd2\x5e\x80\xa9\xb3\x02\x98\x89\x9e\x79\x4b\x4f\xa6\x25\x93\x7c\x89\xc6\x4e\x03\x0d\xd4\xe6\xa7\x97\xbf\xf4\x6b\x0f\xe0\x5b\xa5\x01\xdf\xb3\xb2\x12\x78\x01\x3c\x58\x53\x0c\xb1\xc1\x0a\x5c\x72\x26\x75\x34\x33\xc2\x86\xdb\x82\xcb\x94\x06\xa0\x52\x79\x10\x7b\xe3\xc4\xb5\xec\x01\x41\x05\x71\x6b\x04\xc1\x1f\x70\x0e\xe7\x14\x8e\x3a\x6c\x7e\x20\x70\xf3\xfb\x79\x62\xd6\x3f\x6d\x0a\xd4\x08\xe7\x34\xe8\xdc\x33\xd7\x64\x52\xba\x17\xed\xa5\x65\xd2\x39\xb8\xd5\x7c\xb5\x42\xed\x80\x4a\xdf\xe5\x12\x04\x05\xde\x2f\x41\x69\xd2\x80\x54\x9d\x29\xdc\xc4\xb4\x7a\x15\x66\x7c\xc9\x31\x3f\x60\xfa\xa7\x97\xbf\x24\x39\xde\xd5\x17\x70\x99\xe3\x7b\x78\x09\x5c\x7a\xdd\x54\x2a\xff\x72\x0a\x77\xce\x3a\xb6\xd2\xb2\xf7\x44\x29\x2b\x94\xc1\x94\x66\x95\x14\x5b\x92\xb9\x60\x6b\x04\xa3\x4a\x84\x0d\x0a\x31\x89\x2e\xba\x61\x5b\xd2\x42\x5c\x38\xb2\x37\x06\x15\xd3\x76\xd0\x5a\x23\x7e\xb9\xbb\x7e\x73\x3d\xf7\x9c\x91\x41\xad\x1c\x28\xa3\x1c\xb8\xe4\x84\x48\x08\x8a\xf8\xbc\xea\xac\x71\x2f\x2d\xb7\x97\xa9\xbd\xf9\x50\xf4\x2c\x98\x5c\xa1\x97\x17\x61\x59\x53\xae\x9b\xbe\x38\xc5\x8f\xf7\xa1\x45\x7b\xf5\x80\x8c\xfd\xc0\xf1\x3f\x4a\xd5\xa3\x85\x73\xd5\xc0\x08\xe1\xae\x3a\x56\x3e\x28\x1c\x55\x26\x5a\xa2\x45\x27\x5f\xae\x32\x43\xa2\x65\x58\x59\x33\x53\x6b\xd4\x6b\x8e\x9b\xd9\x46\xe9\x07\x2e\x57\x13\x32\xcd\x89\xb7\x01\x33\x73\xe5\xc5\xec\x0b\xf7\xe7\x64\x59\x5c\x61\x30\x56\x20\x37\xf8\x8f\x90\x8a\xe8\x98\xd9\x49\x42\x35\x91\xf0\x6a\xdc\x4a\xb9\x85\x8a\x21\xc3\x1c\x44\xa8\x26\x83\x6f\xa7\xf0\x36\x4e\x9d\x8a\x4f\x6b\xee\x52\x30\xab\x85\x35\x14\x76\x96\x7c\x75\x52\x26\x8c\x88\x7a\x7c\x2e\x7e\x71\xeb\x25\xc8\xf6\xdf\x25\xd7\xde\x14\x3c\x2b\x62\x81\x14\x44\x48\x48\xc0\x09\x99\xe7\x3e\xbd\x30\xb9\x7d\x72\x77\x24\xa3\xa8\x35\x71\xb4\x9d\x84\x92\x7d\xc2\x64\x4e\xff\x1b\x6e\x2c\xdd\x3f\xc9\x0a\x6a\x3e\x2a\x04\xbd\xbb\x7c\xf3\xc7\x38\x69\xcd\x4f\x8c\x37\xeb\xd1\x26\x70\x1e\x57\x3c\x63\x15\xa9\xdb\x04\xb1\x7e\xab\xb9\x76\x18\xc4\xb8\x52\x7d\x43\x89\x76\xa7\x85\x70\x78\x05\x95\xb0\x85\x5a\x37\x08\x83\x69\x24\x48\xab\x36\x54\x5d\xfd\x2c\xe1\x1b\x0f\x44\xe6\xf0\xef\xaf\xa7\x5f\x4d\xff\xd2\x9f\x57\x07\x85\x0b\xac\xf5\x2c\xd4\x64\xd7\x8b\x7b\x9e\xaf\x3b\x1d\x94\x43\x82\x7b\x95\x54\xf7\x11\xd3\x9a\x6d\x77\x8b\xd4\x80\x95\x07\x31\xfe\xb5\x9b\xb1\x09\x00\x11\x75\x18\x40\xa9\xea\x55\xe1\xcc\x45\x97\xae\xeb\x40\x1e\x27\xd0\xc2\x56\xd5\x07\xec\x71\x49\x91\xc6\x12\x7a\x29\x55\xce\x97\xdb\xd6\xf4\xa8\x5a\x0b\xd9\x7d\xef\xb5\x21\xc8\x3e\x0c\xd8\x3f\x06\xae\x0f\x2e\xdd\x20\x54\xff\x28\xa0\x0e\xac\x1f\x4f\x9d\x0c\xd3\x3d\xaf\xbd\x73\x3e\x01\x48\xff\xf4\x10\xfd\x29\x00\xfa\x93\xc0\xf3\x27\x03\xe7\x1f\x01\xcd\x1d\x08\xef\xe7\xf6\x24\x60\xde\x81\xe0\xbd\xb3\x3e\x16\x96\x1f\x02\xf0\xde\x69\x8f\x83\xf2\x41\x6f\x4d\x01\xf2\xcf\x1f\x8e\x0f\x8a\x95\x82\xe2\x9f\x1d\x10\x3f\x2a\x45\x12\x84\x7f\x96\x10\xfc\x48\x52\x3f\x0a\x5d\x3f\x0e\xb8\xa6\x8a\xd9\xff\x07\xd8\x3a\xa8\xb9\x04\x64\xfd\xcc\x00\xeb\x80\x08\x49\xec\x55\x31\xcd\x4a\xb4\xa8\x0f\x00\xcc\x98\x9e\xe7\x4d\x7c\x7b\x17\xd8\xae\x99\xe6\x6c\xc1\x05\xb7\xdb\x10\x98\xfb\x76\xd7\x76\xaf\x05\x52\x34\xf7\x9d\x61\xcb\x5d\x7f\x99\x00\x43\xdb\x2c\x7e\x6c\xbf\x34\x14\x7b\x23\xd0\xf9\x1b\x3f\xd2\x6f\xaa\x84\xd7\x42\xfe\xf6\xa9\xb2\x51\x12\x0d\xa9\xb4\x5a\xf3\x3c\x59\x67\x2e\x3c\x6e\x4c\x73\x0d\xc7\x0b\x8b\x2e\x77\x63\xd8\x6f\x7e\xb4\xcb\xc0\x40\x28\xb9\x42\xdd\x1d\x4a\x6b\x51\xa8\xcd\x40\x03\xaf\x15\x74\xc3\x85\x70\x9b\x36\x06\xf3\xd3\x64\xe0\xa6\x12\x6c\x3b\xb2\xd2\x7f\xd3\x8e\x0e\x5b\x09\x7e\xeb\x60\xb1\x85\x77\x97\xe6\x24\x06\x46\x76\x83\xce\xaf\x02\xfa\x21\xf9\xbb\x3b\x1a\x01\xba\x46\x4e\x42\x9e\x8f\xbb\x1f\xc9\x0e\xb3\x40\x57\xca\x75\x81\xe6\xbd\xdf\xa6\x7e\x7d\xfd\xee\xea\xee\x9e\x66\x91\x50\x9b\xb8\x4d\xe7\x7d\x45\x90\xc5\x24\xdb\xc0\x84\xc6\x02\x94\xfc\x59\xfa\xcd\x27\x17\xce\x2b\xc1\x33\x66\xe6\x00\x1f\x3e\xc0\xd4\xf9\xa2\x99\x3a\x2a\xf0\x7b\x02\x5d\x1e\x6d\x6e\xa4\xca\xbe\x03\xbd\xbd\x0d\x43\x3b\xfd\x99\x80\xa9\x77\xbc\x25\xce\x08\x36\xd5\x94\x5f\x60\xe3\x52\xb4\xdc\x4c\x88\xc6\x79\xcc\x05\xb8\xaa\x18\x6d\x81\xba\xe3\x9b\x64\x21\xa6\x5e\x2e\xf9\xb0\x7f\x2d\x94\x12\xd8\x5b\xb3\x04\xb4\x3c\x42\xcc\x3b\x3f\x12\x78\x4e\x29\xa6\x69\x43\x55\x82\x49\x6f\x26\x2b\xb4\x06\xf0\x3d\x66\x35\x85\xac\x4d\x91\xec\x39\x7b\x3c\xdc\x06\x4c\x07\x29\x4d\xb4\xab\xcb\x66\x4b\x2c\x74\x91\x3b\x41\xe9\xde\xef\x9c\xde\xa7\xfa\x42\x4b\x02\xc1\xc4\x90\x83\xe0\x8e\x2b\x07\xe9\xf1\x3d\x37\x96\x74\x48\xea\xdb\x70\x83\xc0\xed\x0b\x03\xf7\x39\x56\x42\x6d\xef\x4f\xf2\x2a\x17\x16\x27\x6e\xd0\x08\xe5\x6d\xab\xfd\xfe\x9d\x0f\xab\xf4\x7e\x23\xa2\x2b\x6f\xee\x3d\xc5\x53\x98\x3a\xa1\xaf\x40\xda\x3a\x48\x1a\x2c\xcf\xdd\xe1\x15\x26\x6e\x06\x12\xcb\x6e\xfe\x23\xad\xb7\x02\x32\x30\xa8\xc3\x76\xe2\x4d\xc1\x8c\x93\x99\x56\x03\xfd\x2e\xe8\x82\xca\x36\x0a\x0b\xb6\x2f\xa8\x0e\xa7\xb3\xca\xcd\x37\x42\xe9\x81\x70\xc9\x2a\x62\xc8\xbd\xe6\xcd\xc1\xd5\xb5\xee\xe9\x60\x9d\x94\xc8\xfb\x29\x4a\x3b\xe2\xc7\xfd\x55\x63\xb1\x0a\xb2\xc7\xd2\xff\xbb\x06\xf5\x24\xa6\x8e\x47\x12\x12\xd1\xfe\x98\x7e\xfc\x95\x0e\xfa\xfe\x3a\x62\xdd\xfe\x72\xdc\x0f\xcd\xb2\xa3\x85\x5b\x27\x6b\x50\x37\xbd\xda\xd1\x76\xd4\x47\xb3\x67\x3e\x30\x29\x74\x54\x14\x55\x01\xc6\x2a\x0a\x9e\xac\x3d\xee\x91\xd2\x0e\x1c\x5b\xba\x04\xeb\x9d\x9d\x7d\x13\xe1\xbe\x41\xc7\xb5\xef\xbe\x0d\xf4\x22\xe3\xe5\x16\x5a\x65\x59\xdd\xb3\xa9\xdd\xbd\xc6\xac\xa0\xbf\x8e\xad\x63\xa0\x3b\x66\x35\xc3\x50\x66\x1e\x8e\x52\x1d\xa5\xc1\x47\x93\x4e\x87\xa1\xfe\x71\xbd\x91\xec\xb1\xd3\x19\xab\x99\xc5\xd5\x76\xb4\x19\x5f\xeb\x1c\x7d\xcb\xae\xf1\xe7\x42\x6d\x3c\x2a\xaa\x17\x4e\x2f\xb1\xab\x33\xbc\xc6\x82\xc9\x99\x8f\x3a\x2d\x82\x72\xa7\xfd\x72\x50\x75\x22\xe6\x74\xe5\x1a\xd4\xe9\x51\x0d\xc9\x5a\x08\x82\x53\x73\xb0\xba\xee\x47\x69\xc3\xea\x1b\x56\xdc\xa9\x2a\xeb\xa8\x25\x21\xd9\x78\x65\x9d\x9a\x0c\x0f\x32\x57\x9b\x24\x28\x8d\xb5\x51\x8b\x7e\xee\x93\x1e\xd4\x6b\x92\x68\xaf\xd7\xed\xf0\xf1\x7d\xe7\x44\x8e\x1b\x0d\x6c\xcd\xb8\x08\x88\xd8\xeb\x6e\xe0\x7c\x14\x8c\x2c\x54\xef\x98\x79\xf0\xf5\xdd\x4a\xa8\x05\x13\x17\x50\x29\xb1\x2d\x95\xae\x0a\x9e\x01\xa7\x9c\x5c\xc6\xa3\x89\x91\x9d\xaa\x5e\x08\x9e\xf5\xf6\x28\x5b\x1e\x1d\xcf\x8f\x4c\xe5\xe9\x4d\xf8\x93\x4b\x9a\x23\x2f\xee\x9f\x57\x1b\xd0\x92\x3b\xae\x86\xe5\x02\x73\xe3\xb5\xa0\x8c\xe1\x51\x52\x37\x91\x09\x0d\x5d\xb7\xe3\x94\x0a\x06\xb5\xef\xa3\xaf\x15\xcf\x61\xa3\xb9\x3b\x95\x98\xb9\xd3\xc2\x50\xcb\x59\xc9\xb4\x29\x98\x10\xae\xb7\x4d\xc9\xc3\x77\xcf\xdd\xb1\x8c\x8a\xe9\xa4\x93\x64\xa8\x1d\x98\x70\x3d\x5a\x13\x36\x80\x69\x6a\x15\xaa\x33\xe2\xf1\x3b\x2e\x73\x62\x11\x21\x57\x1b\x69\x78\x8e\xf1\x0c\x6a\xaa\xc0\xaa\x2a\xad\x58\x56\x00\x37\x17\x9e\x1d\x27\x3f\x15\x24\xae\x07\xea\xea\x0d\xa9\xac\xef\x4a\x07\xda\x01\x6b\x27\xdd\x99\xbc\xe9\x57\xa3\xbc\x5f\x19\xca\xe0\x3c\x8a\xb9\xc0\x4c\x95\x08\xac\x5c\xf0\x55\xad\x6a\xd3\x1c\xd3\x0d\xf5\x4d\x0a\xff\x90\x62\xf4\x14\xfe\x89\x50\xf2\x55\x61\x41\xe3\x9a\x1b\x6e\xbd\x93\xb4\x42\x74\x1b\xd2\x21\xac\x0c\x95\x24\x91\x1b\x09\xdc\x98\x3a\x51\x50\x1d\xcf\xdc\xb9\x92\x03\x19\xfb\x58\x41\x46\xd7\x92\x59\x26\x3e\x6e\x8a\xa6\xbc\x3a\x36\xcd\x60\x92\xa9\x78\xaa\xba\x81\x31\x10\x61\x37\xce\xf2\x0a\xc3\x09\x50\xba\xbb\x08\x39\x82\xf9\x4e\xc1\x0a\x25\x85\x36\x57\xf9\x0e\x66\x55\xe6\x26\x8a\x51\x2c\xa2\x42\x99\xb7\xbd\xd7\x21\x68\x39\x16\x77\x11\x4f\xc7\xc0\xcf\x68\xe0\xf3\x80\x83\xe0\xe3\x71\x73\x25\x23\xe6\xa3\x27\x1b\x85\xb1\x46\xa0\x08\x18\x05\xc4\x2a\x35\xc0\xf7\x08\x8e\x9b\x43\xe3\x1f\x61\x8f\xa3\x14\xf3\xc9\x24\xde\x30\x69\xbf\xd1\x47\x1d\x70\xc8\x8f\x07\x97\xe8\x84\x6a\x3f\x56\x5f\x27\x56\xfc\x03\xfa\xdb\xcd\x9e\x91\x8c\x07\x1a\xb1\xf6\xeb\x1c\x02\xb6\x0a\xfe\xf5\xea\x87\xef\x5b\x86\x40\xa8\xac\xb7\x2c\xdc\xeb\x36\x52\x8a\x10\x39\x6a\xe7\xf2\x74\x43\x77\x1c\x3f\x1c\xd0\x27\x20\xd2\x7f\x80\xba\x47\x59\x75\xb5\xd2\x2c\xa7\x05\xff\x56\xab\x72\x10\xa1\xbd\xdb\x19\xea\xc4\xf2\xc8\x60\x0f\x96\x99\xf6\x20\xb8\x9f\xfd\xd0\x8a\xdc\x36\xf6\xa7\x01\x74\x9f\xe8\xd0\xc7\x89\xc7\x3e\x9e\xcf\x6a\xef\xc9\xfb\x7c\x56\xfb\xf9\xac\xb6\xe7\xf8\xf9\xac\xf6\xf3\x59\xed\x11\xc2\x3d\x9f\xd5\xfe\xec\xcf\x6a\x3f\x9f\x73\x7e\x3e\xe7\x7c\x1a\xe0\x4e\x1c\x8c\x4e\x90\xe9\xff\xc2\xd2\x32\x5b\x9b\xd1\xdf\x58\xba\xd1\x3b\x5f\x59\xaa\x85\x41\xbd\x1e\xf9\x99\x65\x0f\x0b\x7b\xb7\xda\xaf\xd2\xc3\x07\xf0\xcd\x2d\xc7\xe4\x24\x7c\x8a\xde\x3e\x05\xf0\xf4\x3b\x05\x15\x95\xed\x6c\x15\x4b\xac\x56\x42\x02\x39\x95\xc5\xfc\x6a\xff\x9b\xf4\x73\x9f\x65\xe3\x47\xe6\xee\x67\xa6\xa4\x2f\x5a\xcc\x1c\x7e\xfa\xe5\x0c\x42\x33\x20\x82\x70\x77\xf3\xbf\x01\x00\x00\xff\xff\xf7\x67\x74\x00\xcb\x3f\x00\x00") +var _configCrdsKudoDev_operatorversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x5f\x6f\xe3\x36\x12\x7f\xcf\xa7\x18\xa4\x0f\x7b\x05\x62\xfb\xba\x3d\x1c\x0e\x7e\x5b\xec\xb6\x87\x5c\xdb\x24\xd8\x64\x7b\x38\xb4\x3d\x84\x96\xc6\x16\x1b\x8a\x54\x49\xca\x5e\xdf\xa2\xdf\xfd\x30\xfc\x23\xc9\xb6\x28\x2b\xde\x4d\x6f\x0f\x88\x5e\x12\x4b\xd4\x70\x66\x38\x7f\x7e\x33\xa4\xce\x26\x93\xc9\x19\xab\xf8\x8f\xa8\x0d\x57\x72\x0e\xac\xe2\xf8\xde\xa2\xa4\x5f\x66\xfa\xf0\x37\x33\xe5\x6a\xb6\xfe\x6a\x81\x96\x7d\x75\xf6\xc0\x65\x3e\x87\xd7\xb5\xb1\xaa\x7c\x8b\x46\xd5\x3a\xc3\x37\xb8\xe4\x92\x5b\xae\xe4\x59\x89\x96\xe5\xcc\xb2\xf9\x19\x00\x93\x52\x59\x46\xb7\x0d\xfd\x04\xc8\x94\xb4\x5a\x09\x81\x7a\xb2\x42\x39\x7d\xa8\x17\xb8\xa8\xb9\xc8\x51\xbb\x19\xe2\xfc\xeb\x3f\x4f\x5f\x4e\xff\x7a\x06\x90\x69\x74\xaf\xdf\xf1\x12\x8d\x65\x65\x35\x07\x59\x0b\x71\x06\x20\x59\x89\x73\x50\x15\x6a\x66\x95\x0e\x6f\x9a\xe9\x43\x9d\xab\x69\x8e\xeb\x33\x53\x61\x46\x73\xae\xb4\xaa\xab\x39\x34\xf7\xfd\x9b\x81\x1d\x2f\xca\x75\x20\x12\xc4\x77\x4f\x04\x37\xf6\xbb\xbe\xa7\xdf\x73\x63\xdd\x88\x4a\xd4\x9a\x89\x43\x16\xdc\x43\xc3\xe5\xaa\x16\x4c\x1f\x3c\x3e\x03\x30\x99\xaa\x70\x0e\x57\xc4\x46\xc5\x32\xcc\xcf\x00\xd6\x4c\xf0\xdc\x49\xea\x19\x53\x15\xca\x57\x37\x97\x3f\x7e\x7d\x9b\x15\x58\x32\x7f\x13\x20\x47\x93\x69\x5e\xb9\x71\xfb\x8c\x01\x37\x60\x0b\x04\xff\x06\x2c\x95\x76\x3f\xf7\xd9\x83\x57\x37\x97\xd3\x40\xae\xd2\xf4\xd4\xf2\xa8\x0e\xba\x3a\x66\xd0\xdc\xdb\x9b\xf8\x05\x71\x16\x26\xcd\x69\xe1\xd1\xcf\x1c\xa6\xc0\x1c\x8c\xe7\x41\x2d\xc1\x16\xdc\x80\xc6\x4a\xa3\x41\xe9\x4d\xa1\x43\x16\x68\x08\x93\xa0\x16\xbf\x62\x66\xa7\x70\x8b\x8e\x4f\x30\x85\xaa\x45\x4e\xd6\xb2\x46\x6d\x41\x63\xa6\x56\x92\xff\xa7\xa1\x6c\xc0\x2a\x37\xa5\x60\x16\xc3\x7a\xc4\x8b\x4b\x8b\x5a\x32\x41\x3a\xad\xf1\x02\x98\xcc\xa1\x64\x5b\xd0\x48\x73\x40\x2d\x3b\xd4\xdc\x10\x33\x85\x1f\x94\x46\xe0\x72\xa9\xe6\x50\x58\x5b\x99\xf9\x6c\xb6\xe2\x36\x1a\x7e\xa6\xca\xb2\x96\xdc\x6e\x67\xce\x7c\xf9\xa2\xb6\x4a\x9b\x59\x8e\x6b\x14\x33\xc3\x57\x13\xa6\xb3\x82\x5b\xcc\x6c\xad\x71\xc6\x2a\x3e\x71\x8c\x4b\x67\xf7\xd3\x32\xff\x42\x07\x2f\x31\x2f\x3a\x9c\xda\x2d\x59\x81\xb1\x9a\xcb\x55\x73\xdb\x19\x64\x52\xef\x64\x90\xb4\xcc\x2c\xbc\xe6\xf9\x6f\xd5\x4b\xb7\x48\x2b\x6f\xbf\xb9\xbd\x83\x38\xa9\x5b\x82\x5d\x9d\x3b\x6d\xb7\xaf\x99\x56\xf1\xa4\x28\x2e\x97\xa8\xfd\xc2\x2d\xb5\x2a\x1d\x45\x94\x79\xa5\xb8\xb4\xee\x47\x26\x38\xca\x5d\xa5\x9b\x7a\x51\x72\x4b\x2b\xfd\x5b\x8d\xc6\xd2\xfa\x4c\xe1\xb5\x73\x7f\x58\x20\xd4\x55\xce\x2c\xe6\x53\xb8\x94\xf0\x9a\x95\x28\x5e\x33\x83\x4f\xae\x76\xd2\xb0\x99\x90\x4a\x8f\x2b\xbe\x1b\xb5\x76\x07\x7a\x6d\x35\xb7\x63\x5c\xe9\x5d\xa1\x3d\x97\xbc\xad\x30\xdb\xf1\x90\x1c\x0d\xd7\x64\xc5\x96\x59\x24\xdb\xdf\x7b\x61\xda\x21\xdc\xe7\x9c\xde\x41\xab\x1e\x07\x4d\x0a\x06\x3e\xea\x4a\xcc\x88\xc5\x5b\xf7\x70\xff\xc5\x1d\x19\x5e\xef\x0d\x6e\x04\x60\x60\xb1\xac\xc8\xe3\xf2\x68\x7f\xb6\x60\x16\x32\x26\x61\x81\x7b\x24\x01\x6a\x83\x39\xb9\x69\x98\x9c\xfe\x65\x12\xb8\x34\x96\xc9\x0c\x7d\x6c\xc0\x46\x01\xd3\xb1\xb2\xe4\x58\xa1\xcc\x51\x66\x07\x8a\xd9\x93\xe3\x4d\x67\x20\x30\x17\xd0\x5d\xb4\x11\x62\x87\x46\x64\x44\x25\x18\xe1\x16\xcb\x83\x89\x12\xcb\xde\x4c\x49\xd1\x66\x89\x1a\x65\xe6\xe6\xf6\x1a\xcc\x93\x73\xa4\x17\x3b\x2e\x79\x5f\x4c\x4e\x30\xf3\xea\xe6\x32\x46\xe2\x28\x5b\x60\xc6\x1e\xce\x3b\xa8\x6a\x7f\x2d\x39\x8a\xfc\x86\xd9\x62\xc4\xdc\x2f\x2e\x97\x7e\x32\x6f\x1d\x0a\x18\x54\x1c\xfd\x6a\x37\x61\xde\xd9\x00\xb2\x1c\xd4\xb2\x97\x22\xc1\x06\x20\x37\xd6\x18\xde\xb8\xf0\xd1\x28\x18\x5d\x9b\x1c\x2c\xe3\x12\x98\x4f\x9e\xf0\x8f\xdb\xeb\xab\xd9\xdf\x55\x82\xa4\x93\x02\x58\x96\xa1\x31\xde\xfd\x4a\x94\xf6\x02\x4c\x9d\x15\xc0\x4c\xf4\xcc\x5b\x7a\x32\x2d\x99\xe4\x4b\x34\x76\x1a\xe6\x40\x6d\x7e\x7a\xf9\x4b\xbf\xf6\x00\xbe\x55\x1a\xf0\x3d\x2b\x2b\x81\x17\xc0\x83\x35\xc5\x10\x1b\xac\xc0\x25\x67\x52\x47\x43\x11\x36\xdc\x16\x5c\xa6\x34\x00\x95\xca\x83\xd8\x1b\x27\xae\x65\x0f\x08\x2a\x88\x5b\x23\x08\xfe\x80\x73\x38\xa7\x70\xd4\x61\xf3\x03\x81\x9b\xdf\xcf\x13\x54\xff\xb4\x29\x50\x23\x9c\xd3\xa0\x73\xcf\x5c\x93\x49\xe9\x5e\xb4\x97\x96\x49\xe7\xe0\x56\xf3\xd5\x0a\xb5\x03\x2a\x7d\x97\x4b\x10\x14\x78\xbf\x04\xa5\x49\x03\x52\x75\x48\x38\xc2\xb4\x7a\x15\x66\x7c\xc9\x31\x3f\x60\xfa\xa7\x97\xbf\x24\x39\xde\xd5\x17\x70\x99\xe3\x7b\x78\x09\x5c\x7a\xdd\x54\x2a\xff\x72\x0a\x77\xce\x3a\xb6\xd2\xb2\xf7\x34\x53\x56\x28\x83\x29\xcd\x2a\x29\xb6\x24\x73\xc1\xd6\x08\x46\x95\x08\x1b\x14\x62\x12\x5d\x74\xc3\xb6\xa4\x85\xb8\x70\x64\x6f\x0c\x2a\xa6\xed\xa0\xb5\x46\xfc\x72\x77\xfd\xe6\x7a\xee\x39\x23\x83\x5a\x39\x50\x46\x39\x70\xc9\x09\x91\x10\x14\xf1\x79\xd5\x59\xe3\x5e\x5a\x6e\x2f\x53\x7b\xf3\xa1\xe8\x59\x30\xb9\x42\x2f\x2f\xc2\xb2\xa6\x5c\x37\x7d\x71\x8a\x1f\xef\x43\x8b\xf6\xea\x01\x19\xfb\x81\xe3\x7f\x94\xaa\x47\x0b\xe7\xaa\x81\x11\xc2\x5d\x75\xac\x7c\x50\x38\xaa\x4c\xb4\x44\x8b\x4e\xbe\x5c\x65\x86\x44\xcb\xb0\xb2\x66\xa6\xd6\xa8\xd7\x1c\x37\xb3\x8d\xd2\x0f\x5c\xae\x26\x64\x9a\x13\x6f\x03\x66\xe6\xca\x8b\xd9\x17\xee\xcf\xc9\xb2\xb8\xc2\x60\xac\x40\x6e\xf0\x1f\x21\x15\xcd\x63\x66\x27\x09\xd5\x44\xc2\xab\x71\x2b\xe5\x16\x2a\x86\x0c\x73\x10\xa1\x9a\x0c\xbe\x9d\xc2\xdb\x48\x3a\x15\x9f\xd6\xdc\xa5\x60\x56\x0b\x6b\x28\xec\x2c\xf9\xea\xa4\x4c\x18\x11\xf5\xf8\x5c\xfc\xe2\xd6\x4b\x90\xed\xbf\x4b\xae\xbd\x29\x78\x56\xc4\x02\x29\x88\x90\x90\x80\x13\x32\xcf\x7d\x7a\x61\x72\xfb\xe4\xee\x48\x46\x51\x6b\xe2\x68\x3b\x09\x25\xfb\x84\xc9\x9c\xfe\x37\xdc\x58\xba\x7f\x92\x15\xd4\x7c\x54\x08\x7a\x77\xf9\xe6\x8f\x71\xd2\x9a\x9f\x18\x6f\xd6\xa3\x4d\xe0\x3c\xae\x78\xc6\x2a\x52\xb7\x09\x62\xfd\x56\x73\xed\x30\x88\x71\xa5\xfa\x86\x12\xed\x4e\x0b\xe1\xf0\x0a\x2a\x61\x0b\xb5\x6e\x10\x06\xd3\x48\x90\x56\x6d\xa8\xba\xfa\x59\xc2\x37\x1e\x88\xcc\xe1\xdf\x5f\x4f\xbf\x9a\xfe\xa5\x3f\xaf\x0e\x0a\x17\x58\xeb\x59\xa8\xc9\xae\x17\xf7\x3c\x5f\x77\x3a\x28\x87\x13\xee\x55\x52\xdd\x47\x4c\x6b\xb6\xdd\x2d\x52\x03\x56\x1e\xc4\xf8\xd7\x8e\x62\x13\x00\x22\xea\x30\x80\x52\xd5\xab\xc2\x99\x8b\x2e\x5d\xd7\x81\x3c\x4e\xa0\x85\xad\xaa\x0f\xd8\xe3\x92\x22\x8d\x25\xf4\x52\xaa\x9c\x2f\xb7\xad\xe9\x51\xb5\x16\xb2\xfb\xde\x6b\x43\x90\x7d\x18\xb0\x7f\x0c\x5c\x1f\x5c\xba\x41\xa8\xfe\x51\x40\x1d\x58\x3f\x9e\x3a\x19\xa6\x7b\x5e\x7b\x69\x3e\x01\x48\xff\xf4\x10\xfd\x29\x00\xfa\x93\xc0\xf3\x27\x03\xe7\x1f\x01\xcd\x1d\x08\xef\xe7\xf6\x24\x60\xde\x81\xe0\xbd\x54\x1f\x0b\xcb\x0f\x01\x78\x2f\xd9\xe3\xa0\x7c\xd0\x5b\x53\x80\xfc\xf3\x87\xe3\x83\x62\xa5\xa0\xf8\x67\x07\xc4\x8f\x4a\x91\x04\xe1\x9f\x25\x04\x3f\x92\xd4\x8f\x42\xd7\x8f\x03\xae\xa9\x62\xf6\xff\x01\xb6\x0e\x6a\x2e\x01\x59\x3f\x33\xc0\x3a\x20\x42\x12\x7b\x55\x4c\xb3\x12\x2d\xea\x03\x00\x33\xa6\xe7\x79\x13\xdf\xde\x05\xb6\x6b\xa6\x39\x5b\x70\xc1\xed\x36\x04\xe6\xbe\xdd\xb5\xdd\x6b\x81\x14\xcd\x7d\x67\xd8\x72\xd7\x5f\x26\xc0\xd0\x36\x8b\x1f\xdb\x2f\x0d\xc5\xde\x08\x74\xfe\xc6\x8f\xf4\x9b\x2a\xe1\xb5\x90\xbf\x7d\xaa\x6c\x94\x44\x43\x2a\xad\xd6\x3c\x4f\xd6\x99\x0b\x8f\x1b\xd3\x5c\xc3\xf1\xc2\xa2\xcb\xdd\x18\xf6\x9b\x1f\xed\x32\x30\x10\x4a\xae\x50\x77\x87\xd2\x5a\x14\x6a\x33\xd0\xc0\x6b\x05\xdd\x70\x21\xdc\xa6\x8d\xc1\xfc\x34\x19\xb8\xa9\x04\xdb\x8e\xac\xf4\xdf\xb4\xa3\xc3\x56\x82\xdf\x3a\x58\x6c\xe1\xdd\xa5\x39\x89\x81\x91\xdd\xa0\xf3\xab\x80\x7e\x48\xfe\xee\x8e\x46\x80\xae\x91\x93\x90\xe7\xe3\xee\x47\xb2\xc3\x2c\xd0\x95\x72\x5d\xa0\x79\xef\xb7\xa9\x5f\x5f\xbf\xbb\xba\xbb\x27\x2a\x12\x6a\x13\xb7\xe9\xbc\xaf\x08\xb2\x98\x64\x1b\x98\xd0\x58\x80\x92\x3f\x4b\xbf\xf9\xe4\xc2\x79\x25\x78\xc6\xcc\x1c\xe0\xc3\x07\x98\x3a\x5f\x34\x53\x37\x0b\xfc\x9e\x40\x97\x47\x9b\x1b\xa9\xb2\xef\x40\x6f\x6f\xc3\xd0\x4e\x7f\x26\x60\xea\x1d\x6f\x89\x14\xc1\xa6\x9a\xf2\x0b\x6c\x5c\x8a\x96\x9b\x09\xd1\x38\x8f\xb9\x00\x57\x15\xa3\x2d\x50\x77\x7c\x93\x2c\xc4\xd4\xcb\x25\x1f\xf6\xaf\x85\x52\x02\x7b\x6b\x96\x80\x96\x47\x88\x79\xe7\x47\x02\xcf\x29\xc5\x34\x6d\xa8\x4a\x30\xe9\xcd\x64\x85\xd6\x00\xbe\xc7\xac\xa6\x90\xb5\x29\x92\x3d\x67\x8f\x87\xdb\x80\xe9\x20\xa5\x89\x76\x75\xd9\x6c\x89\x85\x2e\x72\x27\x28\xdd\xfb\x9d\xd3\xfb\x54\x5f\x68\x49\x20\x98\x18\x72\x10\xdc\x71\xe5\x20\x3d\xbe\xe7\xc6\x92\x0e\x49\x7d\x1b\x6e\x10\xb8\x7d\x61\xe0\x3e\xc7\x4a\xa8\xed\xfd\x49\x5e\xe5\xc2\xe2\xc4\x0d\x1a\xa1\xbc\x6d\xb5\xdf\xbf\xf3\x61\x95\xde\x6f\x44\x74\xe5\xcd\xbd\x9f\xf1\x14\xa6\x4e\xe8\x2b\x90\xb6\x0e\x92\x06\xcb\x73\x77\x78\x85\x89\x9b\x81\xc4\xb2\x9b\xff\x48\xeb\xad\x80\x0c\x0c\xea\xb0\x9d\x78\x53\x30\xe3\x64\xa6\xd5\x40\xbf\x0b\xba\xa0\xb2\x8d\xc2\x82\xed\x0b\xaa\xc3\xe9\xac\x72\xf4\x46\x28\x3d\x4c\x5c\xb2\x8a\x18\x72\xaf\x79\x73\x70\x75\xad\x7b\x3a\x58\x27\x25\xf2\x7e\x6a\xa6\x1d\xf1\xe3\xfe\xaa\xb1\x58\x05\xd9\x63\xe9\xff\x5d\x83\x7a\x12\xa4\xe3\x91\x84\x44\xb4\x3f\xa6\x1f\x7f\xa5\x83\xbe\xbf\x8e\x58\xb7\xbf\x1c\xf7\x43\x54\x76\xb4\x70\xeb\x64\x0d\xea\xa6\x57\x3b\xda\x8e\xfa\x68\xf6\xcc\x07\x88\x42\x47\x45\x51\x15\x60\xac\xa2\xe0\xc9\xda\xe3\x1e\x29\xed\xc0\xb1\xa5\x4b\xb0\xde\xd9\xd9\x37\x11\xee\x1b\x74\x5c\xfb\xee\xdb\x40\x2f\x32\x5e\x6e\xa1\x55\x96\xd5\x3d\x9b\xda\xdd\x6b\xcc\x0a\xfa\xeb\xd8\x3a\x86\x79\xc7\xac\x66\x18\xca\xcc\xc3\xd1\x59\x47\x69\xf0\xd1\x53\xa7\xc3\x50\xff\xb8\xde\x48\xf6\x58\x72\xc6\x6a\x66\x71\xb5\x1d\x6d\xc6\xd7\x3a\x47\xdf\xb2\x6b\xfc\xb9\x50\x1b\x8f\x8a\xea\x85\xd3\x4b\xec\xea\x0c\xaf\xb1\x60\x72\xe6\xa3\x4e\x8b\xa0\xdc\x69\xbf\x1c\x54\x9d\x88\x39\x5d\xb9\x06\x75\x7a\x54\x43\xb2\x16\x82\xe0\xd4\x1c\xac\xae\xfb\x51\xda\xb0\xfa\x86\x15\x77\xaa\xca\x3a\x6a\x49\x48\x36\x5e\x59\xa7\x26\xc3\x83\xcc\xd5\x26\x09\x4a\x63\x6d\xd4\xa2\x9f\xfb\x53\x0f\xea\x35\x39\x69\xaf\xd7\xed\xf0\xf1\x7d\xe7\x44\x8e\x1b\x0d\x6c\xcd\xb8\x08\x88\xd8\xeb\x6e\xe0\x7c\x14\x8c\x2c\x54\xef\x98\x79\xf0\xf5\xdd\x4a\xa8\x05\x13\x17\x50\x29\xb1\x2d\x95\xae\x0a\x9e\x01\xa7\x9c\x5c\xc6\xa3\x89\x91\x9d\xaa\x5e\x08\x9e\xf5\xf6\x28\x5b\x1e\x1d\xcf\x8f\x4c\xe5\xe9\x4d\xf8\x93\x4b\x9a\x23\x2f\xee\x9f\x57\x1b\xd0\x92\x3b\xae\x86\xe5\x02\x73\xe3\xb5\xa0\x8c\xe1\x51\x52\x47\xc8\x84\x86\xae\xdb\x71\x4a\x05\x83\xda\xf7\xd1\xd7\x8a\xe7\xb0\xd1\xdc\x9d\x4a\xcc\xdc\x69\x61\xa8\xe5\xac\x64\xda\x14\x4c\x08\xd7\xdb\xa6\xe4\xe1\xbb\xe7\xee\x58\x46\xc5\x74\xd2\x49\x32\xd4\x0e\x4c\xb8\x1e\xad\x09\x1b\xc0\x44\x5a\x85\xea\x8c\x78\xfc\x8e\xcb\x9c\x58\x44\xc8\xd5\x46\x1a\x9e\x63\x3c\x83\x9a\x2a\xb0\xaa\x4a\x2b\x96\x15\xc0\xcd\x85\x67\xc7\xc9\x4f\x05\x89\xeb\x81\xba\x7a\x43\x2a\xeb\xbb\xd2\x61\xee\x80\xb5\x93\xee\x4c\xde\xf4\xab\x51\xde\xaf\x0c\x65\x70\x1e\xc5\x5c\x60\xa6\x4a\x04\x56\x2e\xf8\xaa\x56\xb5\x69\x8e\xe9\x86\xfa\x26\x85\x7f\x48\x31\x7a\x0a\xff\x44\x28\xf9\xaa\xb0\xa0\x71\xcd\x0d\xb7\xde\x49\x5a\x21\xba\x0d\xe9\x10\x56\x86\x4a\x92\xc8\x8d\x04\x6e\x4c\x9d\x28\xa8\x8e\x67\xee\x5c\xc9\x81\x8c\x7d\xac\x20\xa3\x6b\xc9\x2c\x13\x1f\x47\xa2\x29\xaf\x8e\x91\x19\x4c\x32\x15\x4f\x55\x37\x30\x06\x22\xec\xc6\x59\x5e\x61\x38\x01\x4a\x77\x17\x21\x47\x30\xdf\x29\x58\xa1\xa4\xd0\xe6\x2a\xdf\xc1\xac\xca\x1c\xa1\x18\xc5\x22\x2a\x94\x79\xdb\x7b\x1d\x82\x96\x63\x71\x17\xca\xf5\xb7\x5c\x1c\x05\x5e\xa3\xb1\xcf\xf2\x53\x12\x7b\xc0\x41\x30\xf3\x38\x5a\xc9\x08\xfc\x68\x62\xa3\x30\xdb\x08\x54\x02\xa3\x80\x5d\xa5\x06\xf8\x1e\xc1\x71\x73\x08\xfd\x23\xec\x7b\x94\x62\x3e\x99\xc4\x1b\x26\xed\x37\xfa\xa8\x43\x0f\xc5\x85\xc1\x25\x3a\xa1\x7b\x10\xab\xb9\x13\x3b\x08\x03\xfa\xdb\xcd\xc6\x71\x1a\x0f\x5c\x62\x2d\xd9\x39\x54\x6c\x15\xfc\xeb\xd5\x0f\xdf\xb7\x0c\x81\x50\x59\x6f\x99\xb9\xd7\xbd\xa4\x94\x23\x72\xd4\x2e\x84\xd0\x0d\xdd\x09\x24\xe1\xc0\x3f\x01\x9b\xfe\x03\xd9\x3d\xca\xaa\xab\x95\x66\x39\x2d\xf8\xb7\x5a\x95\x83\x88\xef\xdd\xce\x50\x27\x96\x47\x1a\x7b\x30\xcf\xb4\x07\xcb\x3d\xf5\x43\x2b\x72\xdb\xe2\x9f\x06\x20\x7e\xa2\x43\x24\x27\x1e\x23\x79\x3e\xfb\xbd\x27\xef\xf3\xd9\xef\xe7\xb3\xdf\x9e\xe3\xe7\xb3\xdf\xcf\x67\xbf\x47\x08\xf7\x7c\xf6\xfb\xb3\x3f\xfb\xfd\x7c\x6e\xfa\xf9\xdc\xf4\x69\x80\x3b\x71\xd0\x3a\x31\x4d\xff\x17\x9b\x96\xd9\xda\x8c\xfe\x66\xd3\x8d\xde\xf9\x6a\x53\x2d\x0c\xea\xf5\xc8\xcf\x36\x7b\x58\xd8\xbb\xd5\x7e\xe5\x1e\x3e\xa8\x6f\x6e\x39\x26\x27\xe1\xd3\xf6\xf6\x29\x80\x9f\xbf\x53\x50\x19\xab\x34\x5b\xc5\x12\xab\x95\x90\x40\x4e\x65\x31\xbf\xda\xff\xc6\xfd\xdc\x67\xd9\xf8\xd1\xba\xfb\x99\x29\xe9\x8b\x16\x33\x87\x9f\x7e\x39\x83\xd0\x5c\x88\x20\xdc\xdd\xfc\x6f\x00\x00\x00\xff\xff\xac\xc2\xd6\x24\x1b\x40\x00\x00") func configCrdsKudoDev_operatorversionsYamlBytes() ([]byte, error) { return bindataRead(