diff --git a/.github/workflows/builder.yml b/.github/workflows/builder.yml index 317c9079d3..52e3e201a8 100644 --- a/.github/workflows/builder.yml +++ b/.github/workflows/builder.yml @@ -116,6 +116,7 @@ jobs: export KAMEL_INSTALL_REGISTRY=$KIND_REGISTRY export KAMEL_INSTALL_REGISTRY_INSECURE=true export KAMEL_INSTALL_OPERATOR_IMAGE=$KIND_REGISTRY/apache/camel-k:$(make get-version) + export KAMEL_INSTALL_OPERATOR_ENV_VARS=KAMEL_INSTALL_DEFAULT_KAMELETS=false # Configure test options export CAMEL_K_TEST_IMAGE_NAME=$KIND_REGISTRY/apache/camel-k diff --git a/.github/workflows/openshift.yml b/.github/workflows/openshift.yml index a99c31c3f0..e14ad1d800 100644 --- a/.github/workflows/openshift.yml +++ b/.github/workflows/openshift.yml @@ -203,6 +203,34 @@ jobs: apiGroup: rbac.authorization.k8s.io EOF + # Grant read permission on the Kubernetes Service to the default developer user + # Required by the HTTP proxy tests + cat <[:]@][:]` format, e.g.: + +[source] +---- +HTTP_PROXY=http://proxy.corp.tld +---- + +NOTE: Maven currently does not support connecting to an HTTP proxy via TLS. For this reason, the scheme of the `HTTPS_PROXY` value is restricted to `http`. + +The `NO_PROXY` environment variable value expects a comma-separated list of destination domain names, domain suffixes, IP addresses or other network CIDRs, e.g.: + +[source] +---- +NO_PROXY=.cluster.local,.svc,10.0.0.0/16,127.0.0.1,localhost +---- + +By default, all egress traffic, generated by all the workloads and processes managed by the Camel K operator, will be proxied. +This encompasses: + +* Communicating with the Kubernetes API server +* Downloading Maven artifacts from repositories +* Pulling base images from container registries +* Pushing images to the configured container registry + +For this reason, services that the operator requires access to should be reviewed, and it must be determined whether any of them must bypass the proxy. + +This particularly applies to internal services, hosted within the cluster, whose internal domain names or IP addresses should be added to the `NO_PROXY` environment variable. + +Typically, the `NO_PROXY` variable should be populated with the internal domain suffixes, as well as the cluster network CIDRs, e.g.: + +[source] +---- +NO_PROXY=.cluster.local,.svc,10.0.0.0/16,127.0.0.1,172.17.0.0/18,172.21.0.0/16,localhost +---- + +NOTE: As the Camel K operator communicates with the Kubernetes API, the cluster IPs of the Kubernetes Service must at least be specified in `NO_PROXY`, anytime an HTTP proxy is configured. + +By default, the `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables are also propagated to the integrations. +This behavior can be deactivated, by using the `http-proxy` parameter of the _environment_ trait, e.g.: + +[source,console] +---- +$ kamel run -t environment.http-proxy=false +---- + +Alternatively, it can be disabled globally, by editing the IntegrationPlatform resources, e.g.: + +[source, yaml] +---- +apiVersion: camel.apache.org/v1 +kind: IntegrationPlatform +metadata: + name: camel-k +spec: + traits: + environment: + configuration: + httpProxy: false # <1> +---- +<1> Deactivates the propagation of HTTP proxy environment variables at the platform level + +[[openshift]] +== OpenShift + +On OpenShift 4, cluster-wide egress proxy can be configured by editing the `cluster` Proxy resource: + +[source,yaml] +---- +apiVersion: config.openshift.io/v1 +kind: Proxy +metadata: + name: cluster +spec: + httpProxy: http://:@: +---- + +Operator Lifecycle Manager (OLM), sources the status of this `cluster` Proxy, to automatically populate the `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables, on the operator Deployment resources it manages. + +These cluster-wide proxy settings can be overwritten, specifically for the Camel K operator if necessary, by editing the corresponding Subscription resource, e.g.: + +[source,yaml] +---- +apiVersion: operators.coreos.com/v1alpha1 +kind: Subscription +metadata: + name: camel-k + namespace: openshift-operators +spec: + config: + env: + - name: HTTP_PROXY + value: "" + - name: NO_PROXY + value: "" +---- diff --git a/docs/modules/ROOT/pages/configuration/maven.adoc b/docs/modules/ROOT/pages/configuration/maven.adoc index d5ff11fe1f..69a71960af 100644 --- a/docs/modules/ROOT/pages/configuration/maven.adoc +++ b/docs/modules/ROOT/pages/configuration/maven.adoc @@ -1,5 +1,6 @@ = Configure Maven +[[maven-settings]] == Maven Settings The Maven settings, used by the Camel K operator, can be provided in a ConfigMap or a Secret. @@ -114,6 +115,17 @@ WARNING: The `--maven-settings` and `--maven-repository` options are mutually ex You can find more information in the https://maven.apache.org/guides/introduction/introduction-to-repositories.html[Introduction to Repositories] from the Maven documentation. +[[http-proxy]] +== HTTP Proxy + +HTTP proxy can be configured on the Camel K operator Deployment, with the usual `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables. + +The operator automatically configures Maven according to the values of these variables. + +See the xref:configuration/http-proxy.adoc[HTTP proxy] documentation for more details. + +The generated configuration can be overwritten in the <> if necessary. + [[ca-certificates]] == CA Certificates @@ -131,6 +143,7 @@ A JKS formatted keystore is automatically created to store the CA certificate(s) The root CA certificates are also imported into the created keystore. The created Secret can then be referenced in the IntegrationPlatform resource, from the `spec.build.maven.caSecret` field, e.g.: + [source,yaml] ---- apiVersion: camel.apache.org/v1 @@ -191,12 +204,18 @@ Maven extensions are typically used to enable https://maven.apache.org/wagon/wag [[use-case]] == S3 Bucket as a Maven Repository -In this section, we will show how to configure Camel K to fetch artifacts from a https://aws.amazon.com/s3/[S3] bucket that's setup as a Maven repository. We will assume that the bucket is already up and running and configured correctly. We will also assume you know how to setup Maven locally to fetch artifacts from it. +In this section, we will show how to configure Camel K to fetch artifacts from a https://aws.amazon.com/s3/[S3] bucket that's set up as a Maven repository. +We will assume that the bucket is already up and running and configured correctly. We will also assume you know how to set up Maven locally to fetch artifacts from it. === Custom Maven Settings -The first thing that needs to be done is to create a Maven settings file configured to use the S3 bucket as a Maven repository. The Maven settings file will be used by the Camel K operator so make sure your S3 instance is accessible in your cluster. + -The Maven settings will contain all the information needed for Maven to access the S3 bucket namely your credentials, S3 URL and bucket name. This information will typically be located in the `server` and `repository` section of your Maven settings. For example when using https://min.io/[MinIO] as a S3 provider and https://github.com/Yleisradio/aws-maven/pull/20[`fi.yle.tools:aws-maven:1.4.3`] as a Wagon Provider, your Maven settings will look something like this: +The first thing that needs to be done is to create a Maven settings file configured to use the S3 bucket as a Maven repository. +The Maven settings file will be used by the Camel K operator so make sure your S3 instance is accessible in your cluster. + +The Maven settings will contain all the information needed for Maven to access the S3 bucket namely your credentials, S3 URL and bucket name. +This information will typically be located in the `server` and `repository` section of your Maven settings. + +For example when using https://min.io/[MinIO] as a S3 provider and https://github.com/Yleisradio/aws-maven/pull/20[`fi.yle.tools:aws-maven:1.4.3`] as a Wagon Provider, your Maven settings will look something like this: [source,xml] ---- @@ -289,7 +308,10 @@ xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache. ---- -Since these settings contains credentials, you will want to store it in a Kubernetes `secret`. As mentioned above, the `kubectl` CLI provides a convenient command to create a Secret from a file, e.g.: + +Since these settings contains credentials, you will want to store it in a Kubernetes Secret. +As mentioned above, the `kubectl` CLI provides a convenient command to create a Secret from a file, e.g.: + [source,console] ---- $ kubectl create secret generic camel-k-s3-maven-settings --from-file=maven-settings=maven_settings.xml @@ -297,8 +319,10 @@ $ kubectl create secret generic camel-k-s3-maven-settings --from-file=maven-sett === S3 TLS Certificates -In most cases, you will need to add the certificate(s) served by your S3 instance to the list of certificate(s) trusted by the Camel K Operator when running Maven commands. Where/how to get the certificate(s) varies greatly depending on how your S3 instance is setup and will not be covered here. + -Once retrieved, you should create a Kubernetes `secret` containing the certificate(s) similar to what is described in the section <>, e.g.: +In most cases, you will need to add the certificate(s) served by your S3 instance to the list of certificate(s) trusted by the Camel K Operator when running Maven commands. +Where/how to get the certificate(s) varies greatly depending on how your S3 instance is set up, and will not be covered here. +Once retrieved, you should create a Kubernetes Secret containing the certificate(s) similar to what is described in the section <>, e.g.: + [source,console] ---- $ kubectl create secret generic s3-ca --from-file=s3-ca=ca.crt @@ -306,13 +330,17 @@ $ kubectl create secret generic s3-ca --from-file=s3-ca=ca.crt === Maven settings, certificates and extensions -We are now ready to configure the Camel K operator to use your S3 bucket as a Maven repository. This can be done while installing the Operator using the Kamel CLI, e.g: +We are now ready to configure the Camel K operator to use your S3 bucket as a Maven repository. +This can be done while installing the Operator using the Kamel CLI, e.g: + [source,console] ---- $ kamel install --maven-settings secret:camel-k-s3-maven-settings/maven-settings --maven-ca-secret s3-ca/s3-ca --maven-extension fi.yle.tools:aws-maven:1.4.3 ---- -Maven dependencies hosted in your S3 bucket can now be used just like any other dependency when running an integration. For example when using the Kamel CLI using the `--dependency` option: +Maven dependencies hosted in your S3 bucket can now be used just like any other dependency when running an integration. +For example when using the Kamel CLI using the `--dependency` option: + [source,console] ---- $ kamel run S3.java --dependency=mvn:artfiactId:groupId:version diff --git a/docs/modules/traits/pages/environment.adoc b/docs/modules/traits/pages/environment.adoc index 896d3690ff..6e89e2676a 100755 --- a/docs/modules/traits/pages/environment.adoc +++ b/docs/modules/traits/pages/environment.adoc @@ -32,6 +32,14 @@ The following configuration options are available: | bool | Enables injection of `NAMESPACE` and `POD_NAME` environment variables (default `true`) +| environment.http-proxy +| bool +| Propagates the `HTTP_PROXY`, `HTTPS_PROXY` and `NO_PROXY` environment variables (default `true`) + +| environment.vars +| []string +| A list of variables to be created on the Pod. Must have KEY=VALUE syntax (ie, MY_VAR="my value"). + |=== // End of autogenerated code - DO NOT EDIT! (configuration) diff --git a/e2e/common/build/maven_http_proxy_test.go b/e2e/common/build/maven_http_proxy_test.go new file mode 100644 index 0000000000..e507b72880 --- /dev/null +++ b/e2e/common/build/maven_http_proxy_test.go @@ -0,0 +1,367 @@ +//go:build integration +// +build integration + +// To enable compilation of this file in Goland, go to "Settings -> Go -> Vendoring & Build Tags -> Custom Tags" and add "integration" + +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package build + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "fmt" + "math/big" + rand2 "math/rand" + "strings" + "testing" + "time" + + . "github.com/onsi/gomega" + . "github.com/onsi/gomega/gstruct" + + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" + + ctrl "sigs.k8s.io/controller-runtime/pkg/client" + + . "github.com/apache/camel-k/e2e/support" + v1 "github.com/apache/camel-k/pkg/apis/camel/v1" +) + +var httpdTlsMountPath = "/etc/tls/private" + +func TestMavenProxy(t *testing.T) { + WithNewTestNamespace(t, func(ns string) { + hostname := fmt.Sprintf("%s.%s.svc", "proxy", ns) + + // Generate the TLS certificate + serialNumber := big.NewInt(rand2.Int63()) + cert := &x509.Certificate{ + SerialNumber: serialNumber, + Subject: pkix.Name{ + Organization: []string{"Camel K test"}, + }, + DNSNames: []string{hostname}, + NotBefore: time.Now(), + NotAfter: time.Now().AddDate(1, 0, 0), + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, + BasicConstraintsValid: true, + } + + // generate the certificate private key + certPrivateKey, err := rsa.GenerateKey(rand.Reader, 2048) + Expect(err).To(BeNil()) + + privateKeyBytes := x509.MarshalPKCS1PrivateKey(certPrivateKey) + // encode for storing into a Secret + privateKeyPem := pem.EncodeToMemory( + &pem.Block{ + Type: "RSA PRIVATE KEY", + Bytes: privateKeyBytes, + }, + ) + certBytes, err := x509.CreateCertificate(rand.Reader, cert, cert, &certPrivateKey.PublicKey, certPrivateKey) + Expect(err).To(BeNil()) + + // encode for storing into a Secret + certPem := pem.EncodeToMemory(&pem.Block{ + Type: "CERTIFICATE", + Bytes: certBytes, + }) + + secret := &corev1.Secret{ + TypeMeta: metav1.TypeMeta{ + Kind: "Secret", + APIVersion: corev1.SchemeGroupVersion.String(), + }, + ObjectMeta: metav1.ObjectMeta{ + Namespace: ns, + Name: "tls-secret", + }, + Type: corev1.SecretTypeTLS, + Data: map[string][]byte{ + corev1.TLSCertKey: certPem, + corev1.TLSPrivateKeyKey: privateKeyPem, + }, + } + Expect(TestClient().Create(TestContext, secret)).To(Succeed()) + + // HTTPD ConfigMap + config := newHTTPDConfigMap(ns, hostname) + Expect(TestClient().Create(TestContext, config)).To(Succeed()) + + // HTTPD Deployment + deployment := newHTTPDDeployment(ns, config.Name, secret.Name) + Expect(TestClient().Create(TestContext, deployment)).To(Succeed()) + + service := newHTTPDService(deployment) + Expect(TestClient().Create(TestContext, service)).To(Succeed()) + + // Wait for the Deployment to become ready + Eventually(Deployment(ns, deployment.Name), TestTimeoutMedium).Should(PointTo(MatchFields(IgnoreExtras, + Fields{ + "Status": MatchFields(IgnoreExtras, + Fields{ + "ReadyReplicas": Equal(int32(1)), + }), + }), + )) + + svc := Service("default", "kubernetes")() + Expect(svc).NotTo(BeNil()) + + // It may be needed to populate the values from the cluster, machine and service network CIDRs + noProxy := []string{ + ".cluster.local", + ".svc", + "localhost", + } + noProxy = append(noProxy, svc.Spec.ClusterIPs...) + + // Install Camel K with the HTTP proxy + Expect(Kamel("install", "-n", ns, + "--operator-env-vars", fmt.Sprintf("HTTP_PROXY=http://%s", hostname), + // TODO: enable TLS for the HTTPS proxy when Maven supports it + // "--operator-env-vars", fmt.Sprintf("HTTPS_PROXY=https://%s", hostname), + // "--maven-ca-secret", secret.Name+"/"+corev1.TLSCertKey, + "--operator-env-vars", "NO_PROXY="+strings.Join(noProxy, ","), + ).Execute()).To(Succeed()) + + Eventually(PlatformPhase(ns), TestTimeoutMedium).Should(Equal(v1.IntegrationPlatformPhaseReady)) + + // Run the Integration + name := "java" + Expect(Kamel("run", "-n", ns, "files/Java.java", "--name", name).Execute()).To(Succeed()) + + Eventually(IntegrationPodPhase(ns, name), TestTimeoutMedium).Should(Equal(corev1.PodRunning)) + Eventually(IntegrationCondition(ns, name, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue)) + Eventually(IntegrationLogs(ns, name), TestTimeoutShort).Should(ContainSubstring("Magicstring!")) + + proxies := corev1.PodList{ + TypeMeta: metav1.TypeMeta{ + Kind: "Pod", + APIVersion: corev1.SchemeGroupVersion.String(), + }, + } + err = TestClient().List(TestContext, &proxies, + ctrl.InNamespace(ns), + ctrl.MatchingLabels(deployment.Spec.Selector.MatchLabels), + ) + Expect(err).To(Succeed()) + Expect(proxies.Items).To(HaveLen(1)) + + logs := Logs(ns, proxies.Items[0].Name, corev1.PodLogOptions{})() + Expect(logs).NotTo(BeEmpty()) + Expect(logs).To(ContainSubstring("\"CONNECT repo.maven.apache.org:443 HTTP/1.1\" 200")) + + // Clean up + Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed()) + Expect(TestClient().Delete(TestContext, deployment)).To(Succeed()) + Expect(TestClient().Delete(TestContext, service)).To(Succeed()) + Expect(TestClient().Delete(TestContext, secret)).To(Succeed()) + Expect(TestClient().Delete(TestContext, config)).To(Succeed()) + }) +} + +func newHTTPDConfigMap(ns, hostname string) *corev1.ConfigMap { + return &corev1.ConfigMap{ + TypeMeta: metav1.TypeMeta{ + Kind: "ConfigMap", + APIVersion: corev1.SchemeGroupVersion.String(), + }, + ObjectMeta: metav1.ObjectMeta{ + Namespace: ns, + Name: "httpd-config", + }, + Data: map[string]string{ + "httpd.conf": fmt.Sprintf(` +ServerRoot "/etc/httpd + +PidFile /var/run/httpd/httpd.pid" + +LoadModule mpm_event_module /usr/local/apache2/modules/mod_mpm_event.so +LoadModule authn_core_module /usr/local/apache2/modules/mod_authn_core.so +LoadModule authz_core_module /usr/local/apache2/modules/mod_authz_core.so +LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so +LoadModule proxy_http_module /usr/local/apache2/modules/mod_proxy_http.so +LoadModule proxy_connect_module /usr/local/apache2/modules/mod_proxy_connect.so +LoadModule headers_module /usr/local/apache2/modules/mod_headers.so +LoadModule setenvif_module /usr/local/apache2/modules/mod_setenvif.so +LoadModule version_module /usr/local/apache2/modules/mod_version.so +LoadModule log_config_module /usr/local/apache2/modules/mod_log_config.so +LoadModule env_module /usr/local/apache2/modules/mod_env.so +LoadModule unixd_module /usr/local/apache2/modules/mod_unixd.so +LoadModule status_module /usr/local/apache2/modules/mod_status.so +LoadModule autoindex_module /usr/local/apache2/modules/mod_autoindex.so +LoadModule ssl_module /usr/local/apache2/modules/mod_ssl.so + +Mutex posixsem + +LogFormat "%%h %%l %%u %%t \"%%r\" %%>s %%b" common +CustomLog /dev/stdout common +ErrorLog /dev/stderr + +LogLevel warn + +Listen 8080 +Listen 8443 + +ServerName %s + +ProxyRequests On +ProxyVia Off + + + SSLEngine on + + SSLCertificateFile "%s/%s" + SSLCertificateKeyFile "%s/%s" + + AllowEncodedSlashes NoDecode + +`, + hostname, httpdTlsMountPath, corev1.TLSCertKey, httpdTlsMountPath, corev1.TLSPrivateKeyKey, + ), + }, + } +} + +func newHTTPDDeployment(ns, configName, secretName string) *appsv1.Deployment { + // $ curl --proxy-cacert ca.crt --proxy https://proxy.http-proxy.svc:443 https://www.google.com + // https://github.com/curl/curl/pull/1127 + return &appsv1.Deployment{ + TypeMeta: metav1.TypeMeta{ + Kind: "Deployment", + APIVersion: appsv1.SchemeGroupVersion.String(), + }, + ObjectMeta: metav1.ObjectMeta{ + Namespace: ns, + Name: "proxy", + }, + Spec: appsv1.DeploymentSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "app": "proxy", + }, + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "app": "proxy", + }, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: "httpd", + Image: "httpd:2.4.46", + Command: []string{"httpd", "-f", "/etc/httpd/httpd.conf", "-DFOREGROUND"}, + Ports: []corev1.ContainerPort{ + { + Name: "http", + ContainerPort: 8080, + }, + { + Name: "https", + ContainerPort: 8443, + }, + }, + VolumeMounts: []corev1.VolumeMount{ + { + Name: "tls", + MountPath: httpdTlsMountPath, + ReadOnly: true, + }, + { + Name: "httpd-conf", + MountPath: "/etc/httpd", + ReadOnly: true, + }, + { + Name: "httpd-run", + MountPath: "/var/run/httpd", + }, + }, + }, + }, + Volumes: []corev1.Volume{ + { + Name: "tls", + VolumeSource: corev1.VolumeSource{ + Secret: &corev1.SecretVolumeSource{ + SecretName: secretName, + }, + }, + }, + { + Name: "httpd-conf", + VolumeSource: corev1.VolumeSource{ + ConfigMap: &corev1.ConfigMapVolumeSource{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: configName, + }, + }, + }, + }, + { + Name: "httpd-run", + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }, + }, + }, + }, + }, + } +} + +func newHTTPDService(deployment *appsv1.Deployment) *corev1.Service { + return &corev1.Service{ + TypeMeta: metav1.TypeMeta{ + Kind: "Service", + APIVersion: corev1.SchemeGroupVersion.String(), + }, + ObjectMeta: metav1.ObjectMeta{ + Namespace: deployment.Namespace, + Name: deployment.Name, + }, + Spec: corev1.ServiceSpec{ + Selector: deployment.Spec.Template.Labels, + Ports: []corev1.ServicePort{ + { + Name: "http", + Port: 80, + TargetPort: intstr.FromString("http"), + }, + { + Name: "https", + Port: 443, + TargetPort: intstr.FromString("https"), + }, + }, + }, + } +} diff --git a/e2e/common/traits/environment_test.go b/e2e/common/traits/environment_test.go new file mode 100644 index 0000000000..1400572bdf --- /dev/null +++ b/e2e/common/traits/environment_test.go @@ -0,0 +1,146 @@ +//go:build integration +// +build integration + +// To enable compilation of this file in Goland, go to "Settings -> Go -> Vendoring & Build Tags -> Custom Tags" and add "integration" + +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package traits + +import ( + "fmt" + "strings" + "testing" + + . "github.com/onsi/gomega" + + corev1 "k8s.io/api/core/v1" + + . "github.com/apache/camel-k/e2e/support" + v1 "github.com/apache/camel-k/pkg/apis/camel/v1" + "github.com/apache/camel-k/pkg/util/defaults" +) + +func TestEnvironmentTrait(t *testing.T) { + WithNewTestNamespace(t, func(ns string) { + // HTTP proxy configuration + httpProxy := "http://proxy" + noProxy := []string{"*"} + + // Install Camel K with the HTTP proxy environment variable + Expect(Kamel("install", "-n", ns, + "--operator-env-vars", fmt.Sprintf("HTTP_PROXY=%s", httpProxy), + "--operator-env-vars", "NO_PROXY="+strings.Join(noProxy, ","), + ).Execute()).To(Succeed()) + + t.Run("Run integration with default environment", func(t *testing.T) { + name := "java-default" + Expect(Kamel("run", "-n", ns, "--name", name, "files/Java.java").Execute()).To(Succeed()) + Eventually(IntegrationPodPhase(ns, name), TestTimeoutLong).Should(Equal(corev1.PodRunning)) + Eventually(IntegrationCondition(ns, name, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue)) + Eventually(IntegrationLogs(ns, name), TestTimeoutShort).Should(ContainSubstring("Magicstring!")) + + Expect(IntegrationPod(ns, name)()).To(WithTransform(podEnvVars, And( + ContainElement(corev1.EnvVar{Name: "CAMEL_K_VERSION", Value: defaults.Version}), + ContainElement(corev1.EnvVar{Name: "NAMESPACE", ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "metadata.namespace", + }, + }}), + ContainElement(corev1.EnvVar{Name: "POD_NAME", ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "metadata.name", + }, + }}), + ContainElement(corev1.EnvVar{Name: "HTTP_PROXY", Value: httpProxy}), + ContainElement(corev1.EnvVar{Name: "NO_PROXY", Value: strings.Join(noProxy, ",")}), + ))) + }) + + t.Run("Run integration with custom environment", func(t *testing.T) { + name := "java-custom-proxy" + Expect(Kamel("run", "-n", ns, "files/Java.java", + "--name", name, + "-t", "environment.vars=HTTP_PROXY=http://custom.proxy", + ).Execute()).To(Succeed()) + Eventually(IntegrationPodPhase(ns, name), TestTimeoutLong).Should(Equal(corev1.PodRunning)) + Eventually(IntegrationCondition(ns, name, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue)) + Eventually(IntegrationLogs(ns, name), TestTimeoutShort).Should(ContainSubstring("Magicstring!")) + + Expect(IntegrationPod(ns, name)()).To(WithTransform(podEnvVars, And( + ContainElement(corev1.EnvVar{Name: "CAMEL_K_VERSION", Value: defaults.Version}), + ContainElement(corev1.EnvVar{Name: "NAMESPACE", ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "metadata.namespace", + }, + }}), + ContainElement(corev1.EnvVar{Name: "POD_NAME", ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "metadata.name", + }, + }}), + ContainElement(corev1.EnvVar{Name: "HTTP_PROXY", Value: "http://custom.proxy"}), + ContainElement(corev1.EnvVar{Name: "NO_PROXY", Value: strings.Join(noProxy, ",")}), + ))) + }) + + t.Run("Run integration without default HTTP proxy environment", func(t *testing.T) { + name := "java-no-proxy" + Expect(Kamel("run", "-n", ns, "files/Java.java", + "--name", name, + "-t", "environment.http-proxy=false", + ).Execute()).To(Succeed()) + Eventually(IntegrationPodPhase(ns, name), TestTimeoutLong).Should(Equal(corev1.PodRunning)) + Eventually(IntegrationCondition(ns, name, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue)) + Eventually(IntegrationLogs(ns, name), TestTimeoutShort).Should(ContainSubstring("Magicstring!")) + + Expect(IntegrationPod(ns, name)()).To(WithTransform(podEnvVars, And( + ContainElement(corev1.EnvVar{Name: "CAMEL_K_VERSION", Value: defaults.Version}), + ContainElement(corev1.EnvVar{Name: "NAMESPACE", ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "metadata.namespace", + }, + }}), + ContainElement(corev1.EnvVar{Name: "POD_NAME", ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "metadata.name", + }, + }}), + Not(ContainElement(corev1.EnvVar{Name: "HTTP_PROXY", Value: httpProxy})), + Not(ContainElement(corev1.EnvVar{Name: "NO_PROXY", Value: strings.Join(noProxy, ",")})), + ))) + }) + + Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed()) + }) +} + +func podEnvVars(pod *corev1.Pod) []corev1.EnvVar { + for _, container := range pod.Spec.Containers { + if container.Name == "integration" { + return container.Env + } + } + return nil +} diff --git a/e2e/support/regexp.go b/e2e/support/regexp.go new file mode 100644 index 0000000000..ba44168350 --- /dev/null +++ b/e2e/support/regexp.go @@ -0,0 +1,119 @@ +//go:build integration +// +build integration + +// To enable compilation of this file in Goland, go to "Settings -> Go -> Vendoring & Build Tags -> Custom Tags" and add "integration" + +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package support + +import "regexp" + +var ( + // alphaNumericRegexp defines the alpha numeric atom, typically a + // component of names. This only allows lower case characters and digits. + alphaNumericRegexp = match(`[a-z0-9]+`) + + // separatorRegexp defines the separators allowed to be embedded in name + // components. This allow one period, one or two underscore and multiple + // dashes. + separatorRegexp = match(`(?:[._]|__|[-]*)`) + + // nameComponentRegexp restricts registry path component names to start + // with at least one letter or number, with following parts able to be + // separated by one period, one or two underscore and multiple dashes. + nameComponentRegexp = expression( + alphaNumericRegexp, + optional(repeated(separatorRegexp, alphaNumericRegexp))) + + // domainComponentRegexp restricts the registry domain component of a + // repository name to start with a component as defined by DomainRegexp + // and followed by an optional port. + domainComponentRegexp = match(`(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])`) + + // DomainRegexp defines the structure of potential domain components + // that may be part of image names. This is purposely a subset of what is + // allowed by DNS to ensure backwards compatibility with Docker image + // names. + DomainRegexp = expression( + domainComponentRegexp, + optional(repeated(literal(`.`), domainComponentRegexp)), + optional(literal(`:`), match(`[0-9]+`))) + + RegistryRegexp = anchored( + capture(DomainRegexp), + optional( + literal(`/`), + nameComponentRegexp, + optional(repeated(literal(`/`), nameComponentRegexp)), + ), + ) +) + +// match compiles the string to a regular expression. +var match = regexp.MustCompile + +// literal compiles s into a literal regular expression, escaping any regexp +// reserved characters. +func literal(s string) *regexp.Regexp { + re := match(regexp.QuoteMeta(s)) + + if _, complete := re.LiteralPrefix(); !complete { + panic("must be a literal") + } + + return re +} + +// expression defines a full expression, where each regular expression must +// follow the previous. +func expression(res ...*regexp.Regexp) *regexp.Regexp { + var s string + for _, re := range res { + s += re.String() + } + + return match(s) +} + +// optional wraps the expression in a non-capturing group and makes the +// production optional. +func optional(res ...*regexp.Regexp) *regexp.Regexp { + return match(group(expression(res...)).String() + `?`) +} + +// repeated wraps the regexp in a non-capturing group to get one or more +// matches. +func repeated(res ...*regexp.Regexp) *regexp.Regexp { + return match(group(expression(res...)).String() + `+`) +} + +// group wraps the regexp in a non-capturing group. +func group(res ...*regexp.Regexp) *regexp.Regexp { + return match(`(?:` + expression(res...).String() + `)`) +} + +// capture wraps the expression in a capturing group. +func capture(res ...*regexp.Regexp) *regexp.Regexp { + return match(`(` + expression(res...).String() + `)`) +} + +// anchored anchors the regular expression by adding start and end delimiters. +func anchored(res ...*regexp.Regexp) *regexp.Regexp { + return match(`^` + expression(res...).String() + `$`) +} diff --git a/examples/README.md b/examples/README.md index 03b605f300..04b29b5398 100644 --- a/examples/README.md +++ b/examples/README.md @@ -9,6 +9,7 @@ In this section you will find the most basic examples. Useful to start learning | Type | Description | Link | |---|---|---| | Languages | Simple integrations developed in various supported languages | [see examples](./languages/)| +| Basic | Simple integrations with basic configuration | [see examples](./basic/)| | Cron | How to create a `cront` integration | [see examples](./cron/)| | User Config | Explore how to include a `property`, `secret`, `configmap` or file `resource` in your integration | [see examples](./user-config/)| | Processor | Show how to include `Processor`s logic | [see examples](./processor/)| @@ -20,7 +21,6 @@ In this section you will find the most basic examples. Useful to start learning In this section you can find a few examples of certain [`Camel` components](https://camel.apache.org/components/latest/index.html). This is a limited number of the wide variety of components supported by Apache Camel. You can also find useful examples [in this repository](https://github.com/apache/camel-k-examples). - | Type | Description | Link | |---|---|---| | AMQP | Component usage | [see examples](./amqp/)| @@ -50,4 +50,5 @@ Traits configuration will be very helpful to fine tune your `Integration`. Here | Type | Description | Link | |---|---|---| -| JVM | How to use `JVM` trait| [see examples](./traits/jvm/)| \ No newline at end of file +| Container | How to customize with `container` trait| [see examples](./traits/container/)| +| JVM | How to use `jvm` trait| [see examples](./traits/jvm/)| \ No newline at end of file diff --git a/examples/basic/Env.java b/examples/basic/Env.java new file mode 100644 index 0000000000..988da150d0 --- /dev/null +++ b/examples/basic/Env.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// To run this integrations use: +// +// kamel run --env MY_ENV_VAR="hello world" Env.java --dev +// + +import org.apache.camel.builder.RouteBuilder; + +public class Env extends RouteBuilder { + @Override + public void configure() throws Exception { + from("timer:tick") + .log("${env:MY_ENV_VAR}"); + } +} \ No newline at end of file diff --git a/examples/basic/README.md b/examples/basic/README.md new file mode 100644 index 0000000000..9bdef5cd69 --- /dev/null +++ b/examples/basic/README.md @@ -0,0 +1,3 @@ +# Camel K basic examples + +Find useful examples about how to run an integration in Camel K. \ No newline at end of file diff --git a/examples/kamelets/kameletbindings/env-var-writer.kamelet.yaml b/examples/kamelets/kameletbindings/env-var-writer.kamelet.yaml new file mode 100644 index 0000000000..840e9feba1 --- /dev/null +++ b/examples/kamelets/kameletbindings/env-var-writer.kamelet.yaml @@ -0,0 +1,31 @@ +# --------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# --------------------------------------------------------------------------- + +apiVersion: camel.apache.org/v1alpha1 +kind: Kamelet +metadata: + name: env-var-writer +spec: + definition: + title: "Log some env vars" + flow: + from: + uri: kamelet:source + steps: + - set-body: + simple: "${env:MY_ENV_VAR1} / ${env:MY_ENV_VAR2}" + - to: "log:bar" diff --git a/examples/kamelets/kameletbindings/kb-env-vars.yaml b/examples/kamelets/kameletbindings/kb-env-vars.yaml index 7e42760a6d..4ce9e5ad4a 100644 --- a/examples/kamelets/kameletbindings/kb-env-vars.yaml +++ b/examples/kamelets/kameletbindings/kb-env-vars.yaml @@ -15,17 +15,23 @@ # limitations under the License. # --------------------------------------------------------------------------- +# Apply kamelet used in this binding +# kubectl apply -f env-var-writer.kamelet.yaml +# +# Apply kamelet binding +# kubect apply -f kb-env-vars.yaml +# apiVersion: camel.apache.org/v1alpha1 kind: KameletBinding metadata: name: timer-to-log - namespace: default + annotations: + trait.camel.apache.org/environment.vars: "[\"MY_ENV_VAR1 = value1\", \"MY_ENV_VAR2 = value2\"]" spec: - integration: - configuration: - - type: env - value: X=hello world! - sink: - uri: log:bar source: - uri: timer:foo \ No newline at end of file + uri: timer:foo + sink: + ref: + kind: Kamelet + apiVersion: camel.apache.org/v1alpha1 + name: env-var-writer diff --git a/examples/kamelets/kameletbindings/kb-trait-annotation.yaml b/examples/kamelets/kameletbindings/kb-log-trait-annotation.yaml similarity index 100% rename from examples/kamelets/kameletbindings/kb-trait-annotation.yaml rename to examples/kamelets/kameletbindings/kb-log-trait-annotation.yaml diff --git a/go.mod b/go.mod index d6bcb24498..c0435fa425 100644 --- a/go.mod +++ b/go.mod @@ -49,10 +49,11 @@ require ( k8s.io/api v0.20.2 k8s.io/apiextensions-apiserver v0.20.2 k8s.io/apimachinery v0.20.2 - k8s.io/client-go v0.20.2 k8s.io/cli-runtime v0.20.2 + k8s.io/client-go v0.20.2 k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027 k8s.io/klog/v2 v2.8.0 + k8s.io/kubectl v0.20.2 k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 knative.dev/eventing v0.23.2 knative.dev/pkg v0.0.0-20210510175900-4564797bf3b7 diff --git a/go.sum b/go.sum index e5a95dae51..3c98da4ba1 100644 --- a/go.sum +++ b/go.sum @@ -93,6 +93,7 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20200415212048-7901bc822317/go.mod h1:DF8FZRxMHMGv/vP2lQP6h+dYzzjpuRn24VeRiYn3qjQ= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= @@ -188,6 +189,7 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -285,6 +287,7 @@ github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -336,6 +339,8 @@ github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/set v0.2.1 h1:nn2CaJyknWE/6txyUDGwysr3G5QC6xWB/PtVjPBbeaA= github.com/fatih/set v0.2.1/go.mod h1:+RKtMCH+favT2+3YecHGxcc0b4KyVWA1QWWJUs4E0CI= @@ -349,11 +354,11 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/gertd/go-pluralize v0.1.1 h1:fQhql/WRRwr4TVp+TCw12s2esCacvEVBdkTUUwNqF/Q= github.com/gertd/go-pluralize v0.1.1/go.mod h1:t5DfHcumb6m0RqyVJDrDLEzL2AGeaiqUXIcDNwLaeAs= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= @@ -476,7 +481,6 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= @@ -484,8 +488,10 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450 h1:7xqw01UYS+KCI25bMrPxwNYkSns2Db1ziQPpVq99FpE= github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= +github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= github.com/golangplus/fmt v1.0.0 h1:FnUKtw86lXIPfBMc3FimNF3+ABcV+aH5F17OOitTN+E= github.com/golangplus/fmt v1.0.0/go.mod h1:zpM0OfbMCjPtd2qkTD/jX2MgiFCqklhSUFyDW44gVQE= +github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= github.com/golangplus/testing v1.0.0 h1:+ZeeiKZENNOMkTTELoSySazi+XaEhVO0mb+eanrSEUQ= github.com/golangplus/testing v1.0.0/go.mod h1:ZDreixUV3YzhoVraIDyOzHrr76p6NUh6k/pPg/Q3gYA= github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= @@ -509,7 +515,6 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -674,11 +679,10 @@ github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhn github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lightstep/tracecontext.go v0.0.0-20181129014701-1757c391b1ac h1:+2b6iGRJe3hvV/yVXrd41yVEjxuFHxasJqDhkIjS4gk= github.com/lightstep/tracecontext.go v0.0.0-20181129014701-1757c391b1ac/go.mod h1:Frd2bnT3w5FB5q49ENTfVlztJES+1k/7lyWX2+9gq/M= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= @@ -715,6 +719,7 @@ github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -769,7 +774,6 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4= github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= @@ -783,7 +787,6 @@ github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/onsi/gomega v1.10.4 h1:NiTx7EEvBzu9sFOD1zORteLSt3o8gnlvZZwSE9TnY9U= github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ= @@ -858,7 +861,6 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_golang v1.10.0 h1:/o0BDeWzLWXNZ+4q5gXltUvaMpJqckTa+jTNoB+z4cg= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= @@ -879,7 +881,6 @@ github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.20.0 h1:pfeDeUdQcIxOMutNjCejsEFp7qeP+/iltHSSmLpE+hU= @@ -895,7 +896,6 @@ github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= @@ -965,9 +965,7 @@ github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKv github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= @@ -1132,7 +1130,6 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= @@ -1199,9 +1196,7 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210224082022-3d97a244fca7 h1:OgUuv8lsRpBibGNbSizVwKWlysjaNzmC9gYMhPVfqFM= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= @@ -1225,7 +1220,6 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1308,9 +1302,7 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073 h1:8qxJSnu+7dRq6upnbntrmriWByIakBuct5OM/MdQC1M= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1327,7 +1319,6 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -1535,7 +1526,6 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= @@ -1652,17 +1642,16 @@ k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZ k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= k8s.io/code-generator v0.20.1/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= k8s.io/code-generator v0.20.2/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= -k8s.io/code-generator v0.21.1 h1:jvcxHpVu5dm/LMXr3GOj/jroiP8+v2YnJE9i2OVRenk= k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= k8s.io/component-base v0.17.4/go.mod h1:5BRqHMbbQPm2kKu35v3G+CpVq4K0RJKC7TRioF0I9lE= k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo= k8s.io/component-base v0.19.7/go.mod h1:YX8spPBgwl3I6UGcSdQiEMAqRMSUsGQOW7SEr4+Qa3U= -k8s.io/component-base v0.20.1 h1:6OQaHr205NSl24t5wOF2IhdrlxZTWEZwuGlLvBgaeIg= k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.2 h1:LMmu5I0pLtwjpp5009KLuMGFqSc2S2isGw8t1hpYKLE= k8s.io/component-base v0.20.2/go.mod h1:pzFtCiwe/ASD0iV7ySMu8SYVJjCapNM9bjvk7ptpKh0= +k8s.io/component-helpers v0.20.2/go.mod h1:qeM6iAWGqIr+WE8n2QW2OK9XkpZkPNTxAoEv9jl40/I= k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/csi-translation-lib v0.17.4/go.mod h1:CsxmjwxEI0tTNMzffIAcgR9lX4wOh6AKHdxQrT7L0oo= @@ -1684,7 +1673,6 @@ k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.5.0 h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI= k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= @@ -1693,14 +1681,15 @@ k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210113233702-8566a335510f h1:ZcWbnalfwIst131Zff7dGd1HQdt+NA9q7z9Fi0vbsHY= k8s.io/kube-openapi v0.0.0-20210113233702-8566a335510f/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= +k8s.io/kubectl v0.20.2 h1:mXExF6N4eQUYmlfXJmfWIheCBLF6/n4VnwQKbQki5iE= +k8s.io/kubectl v0.20.2/go.mod h1:/bchZw5fZWaGZxaRxxfDQKej/aDEtj/Tf9YSS4Jl0es= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuBkhu+yxOc1Js= k8s.io/legacy-cloud-providers v0.19.7/go.mod h1:dsZk4gH9QIwAtHQ8CK0Ps257xlfgoXE3tMkMNhW2xDU= +k8s.io/metrics v0.20.2/go.mod h1:yTck5nl5wt/lIeLcU6g0b8/AKJf2girwe0PQiaM4Mwk= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= @@ -1745,7 +1734,6 @@ sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1 sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.1.0 h1:C4r9BgJ98vrKnnVCjwCSXcWjWe0NKcUQkmzDXZXGwH8= sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= diff --git a/helm/camel-k/crds/crd-build.yaml b/helm/camel-k/crds/crd-build.yaml index 88b548c11a..d678755e86 100644 --- a/helm/camel-k/crds/crd-build.yaml +++ b/helm/camel-k/crds/crd-build.yaml @@ -98,8 +98,6 @@ spec: type: string contextDir: type: string - httpProxySecret: - type: string image: type: string name: @@ -134,7 +132,7 @@ spec: type: string type: array maven: - description: MavenSpec -- + description: MavenBuildSpec -- properties: caSecret: description: The Secret name and key, containing the @@ -164,9 +162,9 @@ spec: - key type: object extension: - description: Maven build extensions https://maven.apache.org/guides/mini/guide-using-extensions.html + description: The Maven build extensions. See https://maven.apache.org/guides/mini/guide-using-extensions.html. items: - description: MavenArtifact -- + description: MavenArtifact defines a Maven artifact properties: artifactId: type: string @@ -188,15 +186,17 @@ spec: description: The Maven properties. type: object repositories: + description: The Maven repositories. items: - description: Repository -- + description: Repository defines a Maven repository properties: id: type: string name: type: string releases: - description: RepositoryPolicy -- + description: RepositoryPolicy defines the policy + associated to a Maven repository properties: checksumPolicy: type: string @@ -208,7 +208,8 @@ spec: - enabled type: object snapshots: - description: RepositoryPolicy -- + description: RepositoryPolicy defines the policy + associated to a Maven repository properties: checksumPolicy: type: string @@ -316,7 +317,7 @@ spec: properties: dependencies: items: - description: MavenArtifact -- + description: MavenArtifact defines a Maven artifact properties: artifactId: type: string @@ -339,7 +340,7 @@ spec: type: object dependencies: items: - description: MavenArtifact -- + description: MavenArtifact defines a Maven artifact properties: artifactId: type: string @@ -434,8 +435,6 @@ spec: type: object contextDir: type: string - httpProxySecret: - type: string image: type: string name: diff --git a/helm/camel-k/crds/crd-camel-catalog.yaml b/helm/camel-k/crds/crd-camel-catalog.yaml index 4d33593353..536db4072a 100644 --- a/helm/camel-k/crds/crd-camel-catalog.yaml +++ b/helm/camel-k/crds/crd-camel-catalog.yaml @@ -227,7 +227,7 @@ spec: type: string dependencies: items: - description: MavenArtifact -- + description: MavenArtifact defines a Maven artifact properties: artifactId: type: string @@ -264,7 +264,7 @@ spec: properties: dependencies: items: - description: MavenArtifact -- + description: MavenArtifact defines a Maven artifact properties: artifactId: type: string @@ -287,7 +287,7 @@ spec: type: object dependencies: items: - description: MavenArtifact -- + description: MavenArtifact defines a Maven artifact properties: artifactId: type: string diff --git a/helm/camel-k/crds/crd-integration-platform.yaml b/helm/camel-k/crds/crd-integration-platform.yaml index a8c6699e2f..a5b28c64a9 100644 --- a/helm/camel-k/crds/crd-integration-platform.yaml +++ b/helm/camel-k/crds/crd-integration-platform.yaml @@ -76,8 +76,6 @@ spec: - routine - pod type: string - httpProxySecret: - type: string kanikoBuildCache: type: boolean maven: @@ -108,9 +106,9 @@ spec: - key type: object extension: - description: Maven build extensions https://maven.apache.org/guides/mini/guide-using-extensions.html + description: The Maven build extensions. See https://maven.apache.org/guides/mini/guide-using-extensions.html. items: - description: MavenArtifact -- + description: MavenArtifact defines a Maven artifact properties: artifactId: type: string @@ -131,45 +129,6 @@ spec: type: string description: The Maven properties. type: object - repositories: - items: - description: Repository -- - properties: - id: - type: string - name: - type: string - releases: - description: RepositoryPolicy -- - properties: - checksumPolicy: - type: string - enabled: - type: boolean - updatePolicy: - type: string - required: - - enabled - type: object - snapshots: - description: RepositoryPolicy -- - properties: - checksumPolicy: - type: string - enabled: - type: boolean - updatePolicy: - type: string - required: - - enabled - type: object - url: - type: string - required: - - id - - url - type: object - type: array settings: description: A reference to the ConfigMap or Secret key that contains the Maven settings. @@ -317,8 +276,6 @@ spec: - routine - pod type: string - httpProxySecret: - type: string kanikoBuildCache: type: boolean maven: @@ -349,9 +306,9 @@ spec: - key type: object extension: - description: Maven build extensions https://maven.apache.org/guides/mini/guide-using-extensions.html + description: The Maven build extensions. See https://maven.apache.org/guides/mini/guide-using-extensions.html. items: - description: MavenArtifact -- + description: MavenArtifact defines a Maven artifact properties: artifactId: type: string @@ -372,45 +329,6 @@ spec: type: string description: The Maven properties. type: object - repositories: - items: - description: Repository -- - properties: - id: - type: string - name: - type: string - releases: - description: RepositoryPolicy -- - properties: - checksumPolicy: - type: string - enabled: - type: boolean - updatePolicy: - type: string - required: - - enabled - type: object - snapshots: - description: RepositoryPolicy -- - properties: - checksumPolicy: - type: string - enabled: - type: boolean - updatePolicy: - type: string - required: - - enabled - type: object - url: - type: string - required: - - id - - url - type: object - type: array settings: description: A reference to the ConfigMap or Secret key that contains the Maven settings. diff --git a/pkg/apis/camel/v1/build_types.go b/pkg/apis/camel/v1/build_types.go index 7345702439..8b8d35acba 100644 --- a/pkg/apis/camel/v1/build_types.go +++ b/pkg/apis/camel/v1/build_types.go @@ -62,10 +62,17 @@ type BuilderTask struct { Resources []ResourceSpec `json:"resources,omitempty"` Dependencies []string `json:"dependencies,omitempty"` Steps []string `json:"steps,omitempty"` - Maven MavenSpec `json:"maven,omitempty"` + Maven MavenBuildSpec `json:"maven,omitempty"` BuildDir string `json:"buildDir,omitempty"` } +// MavenBuildSpec -- +type MavenBuildSpec struct { + MavenSpec `json:",inline"` + // The Maven repositories. + Repositories []Repository `json:"repositories,omitempty"` +} + // PublishTask -- type PublishTask struct { ContextDir string `json:"contextDir,omitempty"` @@ -76,19 +83,17 @@ type PublishTask struct { // BuildahTask -- type BuildahTask struct { - BaseTask `json:",inline"` - PublishTask `json:",inline"` - Verbose *bool `json:"verbose,omitempty"` - HttpProxySecret string `json:"httpProxySecret,omitempty"` + BaseTask `json:",inline"` + PublishTask `json:",inline"` + Verbose *bool `json:"verbose,omitempty"` } // KanikoTask -- type KanikoTask struct { - BaseTask `json:",inline"` - PublishTask `json:",inline"` - Verbose *bool `json:"verbose,omitempty"` - HttpProxySecret string `json:"httpProxySecret,omitempty"` - Cache KanikoTaskCache `json:"cache,omitempty"` + BaseTask `json:",inline"` + PublishTask `json:",inline"` + Verbose *bool `json:"verbose,omitempty"` + Cache KanikoTaskCache `json:"cache,omitempty"` } // KanikoTaskCache -- diff --git a/pkg/apis/camel/v1/common_types.go b/pkg/apis/camel/v1/common_types.go index 34e4074b5c..9880081c50 100644 --- a/pkg/apis/camel/v1/common_types.go +++ b/pkg/apis/camel/v1/common_types.go @@ -98,29 +98,6 @@ type Configurable interface { Configurations() []ConfigurationSpec } -// MavenSpec -- -type MavenSpec struct { - // The path of the local Maven repository. - LocalRepository string `json:"localRepository,omitempty"` - // The Maven properties. - Properties map[string]string `json:"properties,omitempty"` - // A reference to the ConfigMap or Secret key that contains - // the Maven settings. - Settings ValueSource `json:"settings,omitempty"` - // The Secret name and key, containing the CA certificate(s) used to connect - // to remote Maven repositories. - // It can contain X.509 certificates, and PKCS#7 formatted certificate chains. - // A JKS formatted keystore is automatically created to store the CA certificate(s), - // and configured to be used as a trusted certificate(s) by the Maven commands. - // Note that the root CA certificates are also imported into the created keystore. - CASecret *corev1.SecretKeySelector `json:"caSecret,omitempty"` - // Deprecated: use IntegrationPlatform.Spec.Build.Timeout instead - Timeout *metav1.Duration `json:"timeout,omitempty"` - Repositories []Repository `json:"repositories,omitempty"` - // Maven build extensions https://maven.apache.org/guides/mini/guide-using-extensions.html - Extension []MavenArtifact `json:"extension,omitempty"` -} - // RegistrySpec provides the configuration for the container registry type RegistrySpec struct { Insecure bool `json:"insecure,omitempty"` @@ -138,13 +115,6 @@ type ValueSource struct { SecretKeyRef *corev1.SecretKeySelector `json:"secretKeyRef,omitempty"` } -// MavenArtifact -- -type MavenArtifact struct { - GroupID string `json:"groupId" yaml:"groupId" xml:"groupId"` - ArtifactID string `json:"artifactId" yaml:"artifactId" xml:"artifactId"` - Version string `json:"version,omitempty" yaml:"version,omitempty" xml:"version,omitempty"` -} - // RuntimeSpec -- type RuntimeSpec struct { Version string `json:"version" yaml:"version"` diff --git a/pkg/apis/camel/v1/integrationplatform_types.go b/pkg/apis/camel/v1/integrationplatform_types.go index 1468e4bba1..ba6fa32a0c 100644 --- a/pkg/apis/camel/v1/integrationplatform_types.go +++ b/pkg/apis/camel/v1/integrationplatform_types.go @@ -115,7 +115,6 @@ type IntegrationPlatformBuildSpec struct { Timeout *metav1.Duration `json:"timeout,omitempty"` PersistentVolumeClaim string `json:"persistentVolumeClaim,omitempty"` Maven MavenSpec `json:"maven,omitempty"` - HTTPProxySecret string `json:"httpProxySecret,omitempty"` KanikoBuildCache *bool `json:"kanikoBuildCache,omitempty"` } diff --git a/pkg/apis/camel/v1/maven_types.go b/pkg/apis/camel/v1/maven_types.go index 426f113d14..569336c5e1 100644 --- a/pkg/apis/camel/v1/maven_types.go +++ b/pkg/apis/camel/v1/maven_types.go @@ -17,7 +17,35 @@ limitations under the License. package v1 -// Repository -- +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// MavenSpec -- +type MavenSpec struct { + // The path of the local Maven repository. + LocalRepository string `json:"localRepository,omitempty"` + // The Maven properties. + Properties map[string]string `json:"properties,omitempty"` + // A reference to the ConfigMap or Secret key that contains + // the Maven settings. + Settings ValueSource `json:"settings,omitempty"` + // The Secret name and key, containing the CA certificate(s) used to connect + // to remote Maven repositories. + // It can contain X.509 certificates, and PKCS#7 formatted certificate chains. + // A JKS formatted keystore is automatically created to store the CA certificate(s), + // and configured to be used as a trusted certificate(s) by the Maven commands. + // Note that the root CA certificates are also imported into the created keystore. + CASecret *corev1.SecretKeySelector `json:"caSecret,omitempty"` + // Deprecated: use IntegrationPlatform.Spec.Build.Timeout instead + Timeout *metav1.Duration `json:"timeout,omitempty"` + // The Maven build extensions. + // See https://maven.apache.org/guides/mini/guide-using-extensions.html. + Extension []MavenArtifact `json:"extension,omitempty"` +} + +// Repository defines a Maven repository type Repository struct { ID string `xml:"id" json:"id"` Name string `xml:"name,omitempty" json:"name,omitempty"` @@ -26,9 +54,16 @@ type Repository struct { Releases RepositoryPolicy `xml:"releases,omitempty" json:"releases,omitempty"` } -// RepositoryPolicy -- +// RepositoryPolicy defines the policy associated to a Maven repository type RepositoryPolicy struct { Enabled bool `xml:"enabled" json:"enabled"` UpdatePolicy string `xml:"updatePolicy,omitempty" json:"updatePolicy,omitempty"` ChecksumPolicy string `xml:"checksumPolicy,omitempty" json:"checksumPolicy,omitempty"` } + +// MavenArtifact defines a Maven artifact +type MavenArtifact struct { + GroupID string `json:"groupId" yaml:"groupId" xml:"groupId"` + ArtifactID string `json:"artifactId" yaml:"artifactId" xml:"artifactId"` + Version string `json:"version,omitempty" yaml:"version,omitempty" xml:"version,omitempty"` +} diff --git a/pkg/apis/camel/v1/zz_generated.deepcopy.go b/pkg/apis/camel/v1/zz_generated.deepcopy.go index bc44413c51..7bfdcd44ea 100644 --- a/pkg/apis/camel/v1/zz_generated.deepcopy.go +++ b/pkg/apis/camel/v1/zz_generated.deepcopy.go @@ -1231,6 +1231,27 @@ func (in *MavenArtifact) DeepCopy() *MavenArtifact { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MavenBuildSpec) DeepCopyInto(out *MavenBuildSpec) { + *out = *in + in.MavenSpec.DeepCopyInto(&out.MavenSpec) + if in.Repositories != nil { + in, out := &in.Repositories, &out.Repositories + *out = make([]Repository, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MavenBuildSpec. +func (in *MavenBuildSpec) DeepCopy() *MavenBuildSpec { + if in == nil { + return nil + } + out := new(MavenBuildSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MavenSpec) DeepCopyInto(out *MavenSpec) { *out = *in @@ -1252,11 +1273,6 @@ func (in *MavenSpec) DeepCopyInto(out *MavenSpec) { *out = new(metav1.Duration) **out = **in } - if in.Repositories != nil { - in, out := &in.Repositories, &out.Repositories - *out = make([]Repository, len(*in)) - copy(*out, *in) - } if in.Extension != nil { in, out := &in.Extension, &out.Extension *out = make([]MavenArtifact, len(*in)) diff --git a/pkg/builder/project.go b/pkg/builder/project.go index 39182e0524..fa89f4fa6f 100644 --- a/pkg/builder/project.go +++ b/pkg/builder/project.go @@ -23,6 +23,7 @@ import ( "github.com/apache/camel-k/pkg/util/camel" "github.com/apache/camel-k/pkg/util/jvm" "github.com/apache/camel-k/pkg/util/kubernetes" + "github.com/apache/camel-k/pkg/util/maven" ) func init() { @@ -93,9 +94,19 @@ func generateProjectSettings(ctx *builderContext) error { return err } if val != "" { - ctx.Maven.SettingsData = []byte(val) + ctx.Maven.UserSettings = []byte(val) } + settings, err := maven.NewSettings(maven.DefaultRepositories, maven.ProxyFromEnvironment) + if err != nil { + return err + } + data, err := settings.MarshalBytes() + if err != nil { + return err + } + ctx.Maven.GlobalSettings = data + return nil } diff --git a/pkg/builder/project_test.go b/pkg/builder/project_test.go index 7e03333da5..6f6e0ec64f 100644 --- a/pkg/builder/project_test.go +++ b/pkg/builder/project_test.go @@ -58,13 +58,15 @@ func TestMavenSettingsFromConfigMap(t *testing.T) { Namespace: "ns", Build: v1.BuilderTask{ Runtime: catalog.Runtime, - Maven: v1.MavenSpec{ - Settings: v1.ValueSource{ - ConfigMapKeyRef: &corev1.ConfigMapKeySelector{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: "maven-settings", + Maven: v1.MavenBuildSpec{ + MavenSpec: v1.MavenSpec{ + Settings: v1.ValueSource{ + ConfigMapKeyRef: &corev1.ConfigMapKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: "maven-settings", + }, + Key: "settings.xml", }, - Key: "settings.xml", }, }, }, @@ -74,7 +76,7 @@ func TestMavenSettingsFromConfigMap(t *testing.T) { err = Steps.GenerateProjectSettings.execute(&ctx) assert.Nil(t, err) - assert.Equal(t, []byte("setting-data"), ctx.Maven.SettingsData) + assert.Equal(t, []byte("setting-data"), ctx.Maven.UserSettings) } func TestMavenSettingsFromSecret(t *testing.T) { @@ -105,13 +107,15 @@ func TestMavenSettingsFromSecret(t *testing.T) { Namespace: "ns", Build: v1.BuilderTask{ Runtime: catalog.Runtime, - Maven: v1.MavenSpec{ - Settings: v1.ValueSource{ - SecretKeyRef: &corev1.SecretKeySelector{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: "maven-settings", + Maven: v1.MavenBuildSpec{ + MavenSpec: v1.MavenSpec{ + Settings: v1.ValueSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: "maven-settings", + }, + Key: "settings.xml", }, - Key: "settings.xml", }, }, }, @@ -121,5 +125,5 @@ func TestMavenSettingsFromSecret(t *testing.T) { err = Steps.GenerateProjectSettings.execute(&ctx) assert.Nil(t, err) - assert.Equal(t, []byte("setting-data"), ctx.Maven.SettingsData) + assert.Equal(t, []byte("setting-data"), ctx.Maven.UserSettings) } diff --git a/pkg/builder/quarkus.go b/pkg/builder/quarkus.go index 22e505bed4..08250dcdb2 100644 --- a/pkg/builder/quarkus.go +++ b/pkg/builder/quarkus.go @@ -150,7 +150,8 @@ func GenerateQuarkusProjectCommon(camelQuarkusVersion string, runtimeVersion str func buildQuarkusRunner(ctx *builderContext) error { mc := maven.NewContext(path.Join(ctx.Path, "maven")) - mc.SettingsContent = ctx.Maven.SettingsData + mc.GlobalSettings = ctx.Maven.GlobalSettings + mc.UserSettings = ctx.Maven.UserSettings mc.LocalRepository = ctx.Build.Maven.LocalRepository if ctx.Maven.TrustStoreName != "" { @@ -195,7 +196,8 @@ func BuildQuarkusRunnerCommon(ctx context.Context, mc maven.Context, project mav func computeQuarkusDependencies(ctx *builderContext) error { mc := maven.NewContext(path.Join(ctx.Path, "maven")) - mc.SettingsContent = ctx.Maven.SettingsData + mc.GlobalSettings = ctx.Maven.GlobalSettings + mc.UserSettings = ctx.Maven.UserSettings mc.LocalRepository = ctx.Build.Maven.LocalRepository // Process artifacts list and add it to existing artifacts. diff --git a/pkg/builder/types.go b/pkg/builder/types.go index 3e5d1d887f..91f6612154 100644 --- a/pkg/builder/types.go +++ b/pkg/builder/types.go @@ -85,7 +85,8 @@ type builderContext struct { Resources []resource Maven struct { Project maven.Project - SettingsData []byte + UserSettings []byte + GlobalSettings []byte TrustStoreName string TrustStorePass string } diff --git a/pkg/cmd/install.go b/pkg/cmd/install.go index 9d6ed3826c..94eb2e50ef 100644 --- a/pkg/cmd/install.go +++ b/pkg/cmd/install.go @@ -18,27 +18,34 @@ limitations under the License. package cmd import ( + "context" "fmt" "os" "regexp" "strings" "time" - "go.uber.org/multierr" - "github.com/pkg/errors" "github.com/spf13/cobra" "github.com/spf13/viper" + "go.uber.org/multierr" + corev1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + + ctrl "sigs.k8s.io/controller-runtime/pkg/client" v1 "github.com/apache/camel-k/pkg/apis/camel/v1" "github.com/apache/camel-k/pkg/client" "github.com/apache/camel-k/pkg/install" + "github.com/apache/camel-k/pkg/util" "github.com/apache/camel-k/pkg/util/kubernetes" + "github.com/apache/camel-k/pkg/util/maven" "github.com/apache/camel-k/pkg/util/olm" + "github.com/apache/camel-k/pkg/util/patch" "github.com/apache/camel-k/pkg/util/registry" "github.com/apache/camel-k/pkg/util/watch" ) @@ -97,8 +104,6 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) (*cobra.Command, *installCmdO cmd.Flags().String("build-timeout", "", "Set how long the build process can last") cmd.Flags().String("trait-profile", "", "The profile to use for traits") cmd.Flags().Bool("kaniko-build-cache", false, "To enable or disable the Kaniko cache") - cmd.Flags().String("http-proxy-secret", "", "Configure the source of the secret holding HTTP proxy server details "+ - "(HTTP_PROXY|HTTPS_PROXY|NO_PROXY)") // OLM cmd.Flags().Bool("olm", true, "Try to install everything via OLM (Operator Lifecycle Manager) if available") @@ -127,10 +132,11 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) (*cobra.Command, *installCmdO cmd.Flags().Bool("monitoring", false, "To enable or disable the operator monitoring") cmd.Flags().Int("monitoring-port", 8080, "The port of the metrics endpoint") - // Pod settings + // Operator settings cmd.Flags().StringArray("toleration", nil, "Add a Toleration to the operator Pod") cmd.Flags().StringArray("node-selector", nil, "Add a NodeSelector to the operator Pod") - cmd.Flags().StringArray("operator-resources", nil, "Define the resources requests and limits assigned to the operator Pod as (ie, limits.memory=256Mi)") + cmd.Flags().StringArray("operator-resources", nil, "Define the resources requests and limits assigned to the operator Pod as (i.e., limits.memory=256Mi)") + cmd.Flags().StringArray("operator-env-vars", nil, "Add an environment variable to set in the operator Pod(s), as ") // save cmd.Flags().Bool("save", false, "Save the install parameters into the default kamel configuration file (kamel-config.yaml)") @@ -181,8 +187,8 @@ type installCmdOptions struct { TraitProfile string `mapstructure:"trait-profile"` Tolerations []string `mapstructure:"tolerations"` NodeSelectors []string `mapstructure:"node-selectors"` - HTTPProxySecret string `mapstructure:"http-proxy-secret"` ResourcesRequirements []string `mapstructure:"operator-resources"` + EnvVars []string `mapstructure:"operator-env-vars"` registry v1.RegistrySpec registryAuth registry.Auth @@ -229,7 +235,7 @@ func (o *installCmdOptions) install(cobraCmd *cobra.Command, _ []string) error { fmt.Fprintln(cobraCmd.OutOrStdout(), "OLM is available in the cluster") var installed bool if installed, err = olm.Install(o.Context, olmClient, o.Namespace, o.Global, o.olmOptions, collection, - o.Tolerations, o.NodeSelectors, o.ResourcesRequirements); err != nil { + o.Tolerations, o.NodeSelectors, o.ResourcesRequirements, o.EnvVars); err != nil { return err } if !installed { @@ -283,6 +289,7 @@ func (o *installCmdOptions) install(cobraCmd *cobra.Command, _ []string) error { Tolerations: o.Tolerations, NodeSelectors: o.NodeSelectors, ResourcesRequirements: o.ResourcesRequirements, + EnvVars: o.EnvVars, } err = install.OperatorOrCollect(o.Context, c, cfg, collection, o.Force) if err != nil { @@ -380,8 +387,19 @@ func (o *installCmdOptions) install(cobraCmd *cobra.Command, _ []string) error { } if len(o.MavenRepositories) > 0 { - for _, r := range o.MavenRepositories { - platform.AddConfiguration("repository", r) + settings, err := maven.NewSettings(maven.Repositories(o.MavenRepositories...)) + if err != nil { + return err + } + err = createDefaultMavenSettingsConfigMap(o.Context, c, namespace, platform.Name, settings) + if err != nil { + return err + } + platform.Spec.Build.Maven.Settings.ConfigMapKeyRef = &corev1.ConfigMapKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: platform.Name + "-maven-settings", + }, + Key: "settings.xml", } } @@ -401,10 +419,6 @@ func (o *installCmdOptions) install(cobraCmd *cobra.Command, _ []string) error { platform.Spec.Build.Maven.CASecret = secret } - if o.HTTPProxySecret != "" { - platform.Spec.Build.HTTPProxySecret = o.HTTPProxySecret - } - if o.ClusterType != "" { for _, c := range v1.AllIntegrationPlatformClusters { if strings.EqualFold(string(c), o.ClusterType) { @@ -668,3 +682,64 @@ func decodeSecretKeySelector(secretKey string) (*corev1.SecretKeySelector, error Key: match[2], }, nil } + +func createDefaultMavenSettingsConfigMap(ctx context.Context, client client.Client, namespace, name string, settings maven.Settings) error { + cm, err := settingsConfigMap(namespace, name, settings) + if err != nil { + return err + } + + err = client.Create(ctx, cm) + if err != nil && !k8serrors.IsAlreadyExists(err) { + return err + } else if k8serrors.IsAlreadyExists(err) { + existing := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: cm.Namespace, + Name: cm.Name, + }, + } + err = client.Get(ctx, ctrl.ObjectKeyFromObject(existing), existing) + if err != nil { + return err + } + + p, err := patch.PositiveMergePatch(existing, cm) + if err != nil { + return err + } else if len(p) != 0 { + err = client.Patch(ctx, cm, ctrl.RawPatch(types.MergePatchType, p)) + if err != nil { + return errors.Wrap(err, "error during patch resource") + } + } + } + + return nil +} + +func settingsConfigMap(namespace string, name string, settings maven.Settings) (*corev1.ConfigMap, error) { + data, err := util.EncodeXML(settings) + if err != nil { + return nil, err + } + + cm := &corev1.ConfigMap{ + TypeMeta: metav1.TypeMeta{ + Kind: "ConfigMap", + APIVersion: corev1.SchemeGroupVersion.String(), + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name + "-maven-settings", + Namespace: namespace, + Labels: map[string]string{ + "app": "camel-k", + }, + }, + Data: map[string]string{ + "settings.xml": string(data), + }, + } + + return cm, nil +} diff --git a/pkg/cmd/install_test.go b/pkg/cmd/install_test.go index de3561b4ff..f913422866 100644 --- a/pkg/cmd/install_test.go +++ b/pkg/cmd/install_test.go @@ -153,12 +153,6 @@ func TestInstallHealthFlag(t *testing.T) { assert.Nil(t, err) assert.Equal(t, int32(7777), installCmdOptions.HealthPort) } -func TestInstallHttpProxySecretFlag(t *testing.T) { - installCmdOptions, rootCmd, _ := initializeInstallCmdOptions(t) - _, err := test.ExecuteCommand(rootCmd, cmdInstall, "--http-proxy-secret", "someString") - assert.Nil(t, err) - assert.Equal(t, "someString", installCmdOptions.HTTPProxySecret) -} func TestInstallKanikoBuildCacheFlag(t *testing.T) { installCmdOptions, rootCmd, _ := initializeInstallCmdOptions(t) diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go index 8cb1ebf820..2b8faac613 100644 --- a/pkg/cmd/run.go +++ b/pkg/cmd/run.go @@ -621,7 +621,7 @@ func (o *runCmdOptions) createOrUpdateIntegration(cmd *cobra.Command, c client.C integration.Spec.AddConfiguration("volume", item) } for _, item := range o.EnvVars { - integration.Spec.AddConfiguration("env", item) + o.Traits = append(o.Traits, fmt.Sprintf("environment.vars=%s", item)) } if err := o.configureTraits(integration, o.Traits, catalog); err != nil { diff --git a/pkg/cmd/util_dependencies.go b/pkg/cmd/util_dependencies.go index 89c1999017..8ad7fe7c90 100644 --- a/pkg/cmd/util_dependencies.go +++ b/pkg/cmd/util_dependencies.go @@ -118,30 +118,15 @@ func getTransitiveDependencies(ctx context.Context, catalog *camel.RuntimeCatalo mc.LocalRepository = "" if len(repositories) > 0 { - var repoList []v1.Repository - var mirrors []maven.Mirror - for i, repo := range repositories { - if strings.Contains(repo, "@mirrorOf=") { - mirror := maven.NewMirror(repo) - if mirror.ID == "" { - mirror.ID = fmt.Sprintf("mirror-%03d", i) - } - mirrors = append(mirrors, mirror) - } else { - repository := maven.NewRepository(repo) - if repository.ID == "" { - repository.ID = fmt.Sprintf("repository-%03d", i) - } - repoList = append(repoList, repository) - } + settings, err := maven.NewSettings(maven.DefaultRepositories, maven.Repositories(repositories...)) + if err != nil { + return nil, err } - - settings := maven.NewDefaultSettings(repoList, mirrors) settingsData, err := util.EncodeXML(settings) if err != nil { return nil, err } - mc.SettingsContent = settingsData + mc.UserSettings = settingsData } // Make maven command less verbose @@ -211,7 +196,6 @@ func getLocalBuildRoutes(integrationDirectory string) ([]string, error) { func generateCatalog(ctx context.Context) (*camel.RuntimeCatalog, error) { // A Camel catalog is required for this operation - settings := "" mvn := v1.MavenSpec{ LocalRepository: "", } @@ -221,7 +205,7 @@ func generateCatalog(ctx context.Context) (*camel.RuntimeCatalog, error) { } var providerDependencies []maven.Dependency var caCert []byte - catalog, err := camel.GenerateCatalogCommon(ctx, settings, caCert, mvn, runtime, providerDependencies) + catalog, err := camel.GenerateCatalogCommon(ctx, nil, nil, caCert, mvn, runtime, providerDependencies) if err != nil { return nil, err } diff --git a/pkg/controller/build/build_pod.go b/pkg/controller/build/build_pod.go index e81cadf6d5..6d2404bd8b 100644 --- a/pkg/controller/build/build_pod.go +++ b/pkg/controller/build/build_pod.go @@ -20,18 +20,19 @@ package build import ( "context" "fmt" + "os" "path" "strconv" "strings" + "github.com/pkg/errors" + corev1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ctrl "sigs.k8s.io/controller-runtime/pkg/client" - "github.com/pkg/errors" - v1 "github.com/apache/camel-k/pkg/apis/camel/v1" "github.com/apache/camel-k/pkg/builder" "github.com/apache/camel-k/pkg/client" @@ -244,6 +245,7 @@ func addBuildTaskToPod(ctx context.Context, c ctrl.Reader, build *v1.Build, task taskName, }, WorkingDir: path.Join(builderDir, build.Name), + Env: proxyFromEnvironment(), } addContainerToPod(build, container, pod) @@ -314,7 +316,7 @@ func addBuildahTaskToPod(ctx context.Context, c client.Client, build *v1.Build, push = append(push[:2], append([]string{"--tls-verify=false"}, push[2:]...)...) } - env = append(env, proxySecretEnvVars(task.HttpProxySecret)...) + env = append(env, proxyFromEnvironment()...) args := []string{ strings.Join(bud, " "), @@ -378,7 +380,7 @@ func addKanikoTaskToPod(ctx context.Context, c ctrl.Reader, build *v1.Build, tas args = append(args, "--insecure-pull") } - env = append(env, proxySecretEnvVars(task.HttpProxySecret)...) + env = append(env, proxyFromEnvironment()...) if cache { // Co-locate with the Kaniko warmer pod for sharing the host path volume as the current @@ -558,30 +560,29 @@ func addRegistrySecret(name string, secret registrySecret, volumes *[]corev1.Vol } } -func proxySecretEnvVars(secret string) []corev1.EnvVar { - if secret == "" { - return []corev1.EnvVar{} +func proxyFromEnvironment() []corev1.EnvVar { + var envVars []corev1.EnvVar + + if httpProxy, ok := os.LookupEnv("HTTP_PROXY"); ok { + envVars = append(envVars, corev1.EnvVar{ + Name: "HTTP_PROXY", + Value: httpProxy, + }) } - return []corev1.EnvVar{ - proxySecretEnvVar("HTTP_PROXY", secret), - proxySecretEnvVar("HTTPS_PROXY", secret), - proxySecretEnvVar("NO_PROXY", secret), + if httpsProxy, ok := os.LookupEnv("HTTPS_PROXY"); ok { + envVars = append(envVars, corev1.EnvVar{ + Name: "HTTPS_PROXY", + Value: httpsProxy, + }) } -} -func proxySecretEnvVar(name string, secret string) corev1.EnvVar { - optional := true - return corev1.EnvVar{ - Name: name, - ValueFrom: &corev1.EnvVarSource{ - SecretKeyRef: &corev1.SecretKeySelector{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: secret, - }, - Key: name, - Optional: &optional, - }, - }, + if noProxy, ok := os.LookupEnv("NO_PROXY"); ok { + envVars = append(envVars, corev1.EnvVar{ + Name: "NO_PROXY", + Value: noProxy, + }) } + + return envVars } diff --git a/pkg/controller/integrationplatform/initialize_test.go b/pkg/controller/integrationplatform/initialize_test.go index 4c7aa12595..a718b1202e 100644 --- a/pkg/controller/integrationplatform/initialize_test.go +++ b/pkg/controller/integrationplatform/initialize_test.go @@ -115,29 +115,3 @@ func TestTimeouts_Truncated(t *testing.T) { assert.Equal(t, 5*time.Minute, answer.Status.Build.GetTimeout().Duration) } - -func TestDefaultMavenSettingsApplied(t *testing.T) { - ip := v1.IntegrationPlatform{} - ip.Namespace = "ns" - ip.Name = "test-platform" - ip.Spec.Cluster = v1.IntegrationPlatformClusterOpenShift - ip.Spec.Profile = v1.TraitProfileOpenShift - - c, err := test.NewFakeClient(&ip) - assert.Nil(t, err) - - assert.Nil(t, platform.ConfigureDefaults(context.TODO(), c, &ip, false)) - - h := NewInitializeAction() - h.InjectLogger(log.Log) - h.InjectClient(c) - - answer, err := h.Handle(context.TODO(), &ip) - assert.Nil(t, err) - assert.NotNil(t, answer) - - assert.NotNil(t, answer.Status.Build.Maven.Settings.ConfigMapKeyRef) - assert.Nil(t, answer.Spec.Build.Maven.Settings.ConfigMapKeyRef) - assert.Equal(t, "test-platform-maven-settings", answer.Status.Build.Maven.Settings.ConfigMapKeyRef.Name) - assert.Equal(t, "settings.xml", answer.Status.Build.Maven.Settings.ConfigMapKeyRef.Key) -} diff --git a/pkg/install/operator.go b/pkg/install/operator.go index 34db587cc3..c843338d43 100644 --- a/pkg/install/operator.go +++ b/pkg/install/operator.go @@ -32,6 +32,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/kubectl/pkg/cmd/set/env" ctrl "sigs.k8s.io/controller-runtime/pkg/client" @@ -56,6 +57,7 @@ type OperatorConfiguration struct { Tolerations []string NodeSelectors []string ResourcesRequirements []string + EnvVars []string } type OperatorHealthConfiguration struct { @@ -117,6 +119,20 @@ func OperatorOrCollect(ctx context.Context, c client.Client, cfg OperatorConfigu } } + if cfg.EnvVars != nil { + if d, ok := o.(*appsv1.Deployment); ok { + if d.Labels["camel.apache.org/component"] == "operator" { + envVars, _, err := env.ParseEnv(cfg.EnvVars, nil) + if err != nil { + fmt.Println("Warning: could not parse environment variables!") + } + for i := 0; i < len(d.Spec.Template.Spec.Containers); i++ { + d.Spec.Template.Spec.Containers[i].Env = append(d.Spec.Template.Spec.Containers[i].Env, envVars...) + } + } + } + } + if cfg.NodeSelectors != nil { if d, ok := o.(*appsv1.Deployment); ok { if d.Labels["camel.apache.org/component"] == "operator" { diff --git a/pkg/platform/defaults.go b/pkg/platform/defaults.go index 0c94af8c87..0b9dcd2766 100644 --- a/pkg/platform/defaults.go +++ b/pkg/platform/defaults.go @@ -19,7 +19,6 @@ package platform import ( "context" - "fmt" "strings" "time" @@ -39,9 +38,7 @@ import ( "github.com/apache/camel-k/pkg/kamelet/repository" "github.com/apache/camel-k/pkg/util/defaults" "github.com/apache/camel-k/pkg/util/log" - "github.com/apache/camel-k/pkg/util/maven" "github.com/apache/camel-k/pkg/util/openshift" - "github.com/apache/camel-k/pkg/util/patch" ) // BuilderServiceAccount -- @@ -86,7 +83,7 @@ func ConfigureDefaults(ctx context.Context, c client.Client, p *v1.IntegrationPl } } - err := setPlatformDefaults(ctx, c, p, verbose) + err := setPlatformDefaults(p, verbose) if err != nil { return err } @@ -153,7 +150,7 @@ func configureRegistry(ctx context.Context, c client.Client, p *v1.IntegrationPl return nil } -func setPlatformDefaults(ctx context.Context, c client.Client, p *v1.IntegrationPlatform, verbose bool) error { +func setPlatformDefaults(p *v1.IntegrationPlatform, verbose bool) error { if p.Status.Build.RuntimeVersion == "" { p.Status.Build.RuntimeVersion = defaults.DefaultRuntimeVersion } @@ -184,42 +181,6 @@ func setPlatformDefaults(ctx context.Context, c client.Client, p *v1.Integration } } - if p.Status.Build.Maven.Settings.ConfigMapKeyRef == nil && p.Status.Build.Maven.Settings.SecretKeyRef == nil { - var repositories []v1.Repository - var mirrors []maven.Mirror - for i, c := range p.Status.Configuration { - if c.Type == "repository" { - if strings.Contains(c.Value, "@mirrorOf=") { - mirror := maven.NewMirror(c.Value) - if mirror.ID == "" { - mirror.ID = fmt.Sprintf("mirror-%03d", i) - } - mirrors = append(mirrors, mirror) - } else { - repo := maven.NewRepository(c.Value) - if repo.ID == "" { - repo.ID = fmt.Sprintf("repository-%03d", i) - } - repositories = append(repositories, repo) - } - } - } - - settings := maven.NewDefaultSettings(repositories, mirrors) - - err := createDefaultMavenSettingsConfigMap(ctx, c, p, settings) - if err != nil { - return err - } - - p.Status.Build.Maven.Settings.ConfigMapKeyRef = &corev1.ConfigMapKeySelector{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: p.Name + "-maven-settings", - }, - Key: "settings.xml", - } - } - if p.Status.Build.PublishStrategy == v1.IntegrationPlatformBuildPublishStrategyKaniko && p.Status.Build.KanikoBuildCache == nil { // Default to disabling Kaniko cache warmer // Using the cache warmer pod seems unreliable with the current Kaniko version @@ -247,41 +208,6 @@ func setPlatformDefaults(ctx context.Context, c client.Client, p *v1.Integration return nil } -func createDefaultMavenSettingsConfigMap(ctx context.Context, client client.Client, p *v1.IntegrationPlatform, settings maven.Settings) error { - cm, err := maven.SettingsConfigMap(p.Namespace, p.Name, settings) - if err != nil { - return err - } - - err = client.Create(ctx, cm) - if err != nil && !k8serrors.IsAlreadyExists(err) { - return err - } else if k8serrors.IsAlreadyExists(err) { - existing := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: cm.Namespace, - Name: cm.Name, - }, - } - err = client.Get(ctx, ctrl.ObjectKeyFromObject(existing), existing) - if err != nil { - return err - } - - p, err := patch.PositiveMergePatch(existing, cm) - if err != nil { - return err - } else if len(p) != 0 { - err = client.Patch(ctx, cm, ctrl.RawPatch(types.MergePatchType, p)) - if err != nil { - return errors.Wrap(err, "error during patch resource") - } - } - } - - return nil -} - func createServiceCaBundleConfigMap(ctx context.Context, client client.Client, p *v1.IntegrationPlatform) (*corev1.ConfigMap, error) { cm := &corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ diff --git a/pkg/resources/resources.go b/pkg/resources/resources.go index 9fd1adb6cd..c8f61e13ae 100644 --- a/pkg/resources/resources.go +++ b/pkg/resources/resources.go @@ -78,9 +78,9 @@ var assets = func() http.FileSystem { "/crd/bases/camel.apache.org_builds.yaml": &vfsgenÛ°CompressedFileInfo{ name: "camel.apache.org_builds.yaml", modTime: time.Time{}, - uncompressedSize: 26787, + uncompressedSize: 26973, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3d\x5d\x73\xdb\x3a\x76\xef\xfa\x15\x67\xe2\x87\x24\x33\x16\x75\xef\xdd\xdd\xf6\xd6\x7d\xe8\x68\x95\x64\xaa\x26\xb1\x3d\x96\x73\xb7\xfb\x78\x44\x1e\x51\x58\x91\x00\x0b\x80\x96\xb5\x9d\xfe\xf7\x0e\x3e\x28\x51\x16\x3f\x40\x47\x9e\x4d\x7b\x8d\x97\x44\x24\x70\x70\xbe\x70\xbe\x00\xc2\x17\x30\x3e\x5f\x1b\x5d\xc0\x17\x16\x13\x57\x94\x80\x16\xa0\xd7\x04\xd3\x02\xe3\x35\xc1\x42\xac\xf4\x16\x25\xc1\x27\x51\xf2\x04\x35\x13\x1c\xde\x4d\x17\x9f\xde\x43\xc9\x13\x92\x20\x38\x81\x90\x90\x0b\x49\xa3\x0b\x88\x05\xd7\x92\x2d\x4b\x2d\x24\x64\x0e\x20\x60\x2a\x89\x72\xe2\x5a\x45\x00\x0b\x22\x0b\xfd\xfa\xe6\x7e\x3e\xfb\x08\x2b\x96\x11\x24\x4c\xb9\x41\x94\xc0\x96\xe9\xf5\xe8\x02\xf4\x9a\x29\xd8\x0a\xb9\x81\x95\x90\x80\x49\xc2\xcc\xc4\x98\x01\xe3\x2b\x21\x73\x87\x86\xa4\x14\x65\xc2\x78\x0a\xb1\x28\x76\x92\xa5\x6b\x0d\x62\xcb\x49\xaa\x35\x2b\xa2\xd1\x05\xdc\x1b\x32\x16\x9f\x2a\x4c\x94\x03\x6b\xe7\xd4\x02\xfe\x2a\x4a\x4f\x43\x8d\x5c\xcf\x85\x4b\xf8\x8d\xa4\x32\x93\xfc\x12\xfd\x34\xba\x80\x77\xa6\xcb\x1b\xff\xf2\xcd\xfb\x7f\x85\x9d\x28\x21\xc7\x1d\x70\xa1\xa1\x54\x54\x83\x4c\x8f\x31\x15\x1a\x18\x87\x58\xe4\x45\xc6\x90\xc7\x74\x20\x6b\x3f\x43\x04\x16\x01\x03\x43\x2c\x35\x32\x0e\x68\xc9\x00\xb1\xaa\x77\x03\xd4\xa3\x8b\xd1\x05\xd8\xb6\xd6\xba\xb8\x9a\x4c\xb6\xdb\x6d\x84\x16\xdd\x48\xc8\x74\x52\x51\x37\xf9\x32\x9f\x7d\xbc\x5e\x7c\x1c\x5b\x94\x47\x17\xf0\x8d\x67\xa4\x14\x48\xfa\xaf\x92\x49\x4a\x60\xb9\x03\x2c\x8a\x8c\xc5\xb8\xcc\x08\x32\xdc\x1a\xc1\x59\xe9\x58\xa1\x33\x0e\x5b\xc9\x34\xe3\xe9\x25\x28\x2f\xf5\xd1\xc5\x91\x74\x0e\xec\xaa\xd0\x63\xea\xa8\x83\xe0\x80\x1c\xde\x4c\x17\x30\x5f\xbc\x81\x3f\x4f\x17\xf3\xc5\xe5\xe8\x02\xfe\x32\xbf\xff\xf7\x9b\x6f\xf7\xf0\x97\xe9\xdd\xdd\xf4\xfa\x7e\xfe\x71\x01\x37\x77\x30\xbb\xb9\xfe\x30\xbf\x9f\xdf\x5c\x2f\xe0\xe6\x13\x4c\xaf\xff\x0a\x9f\xe7\xd7\x1f\x2e\x81\x98\x5e\x93\x04\x7a\x2c\xa4\xc1\x5f\x48\x60\x86\x91\x94\x18\x99\x56\x0a\x54\x21\x60\xf4\xc3\xfc\x56\x05\xc5\x6c\xc5\x62\xc8\x90\xa7\x25\xa6\x04\xa9\x78\x20\xc9\x8d\x7a\x14\x24\x73\xa6\x8c\x38\x15\x20\x4f\x46\x17\x90\xb1\x9c\x69\xab\x45\xea\x94\x28\x33\xcd\x39\xd7\xd6\x08\x0b\xe6\xd5\xe9\x0a\xb0\x60\xf4\xa8\x89\x5b\x6c\xa2\xcd\xaf\x2a\x62\x62\xf2\xf0\xf3\x68\xc3\x78\x72\x05\xb3\x52\x69\x91\xdf\x91\x12\xa5\x8c\xe9\x03\xad\x18\xb7\x9a\x3f\xca\x49\x63\x82\x1a\xaf\x46\x00\xc8\xb9\xf0\xc8\x9b\x9f\xe0\x56\x9d\xc8\x32\x92\xe3\x94\x78\xb4\x29\x97\xb4\x2c\x59\x96\x90\xb4\xc0\xab\xa9\x1f\x7e\x8a\xfe\x18\xfd\x3c\x02\x88\x25\xd9\xe1\xf7\x2c\x27\xa5\x31\x2f\xae\x80\x97\x59\x36\x02\xc8\x70\x49\x99\x87\x8a\x45\x71\x05\x31\xe6\x94\x8d\x37\x23\x00\x8e\x39\x5d\x81\x85\xab\x22\xfb\xb8\xa6\x84\x23\xc3\x7e\x33\x2c\x95\xa2\xac\x86\xd5\xdf\xbb\xf1\x15\xbe\xa8\x29\x15\x92\x55\xbf\xc7\xb0\x31\xfd\xfd\xff\xe3\xfd\xff\x1d\x4f\xfe\x6c\xa6\xb4\xbf\x33\xa6\xf4\xe7\xc3\xb3\x2f\x4c\x69\xfb\xbc\xc8\x4a\x89\x59\x85\x9c\x7d\xa4\xd6\x42\xea\xeb\xc3\x94\x63\x60\x9b\xa5\x7b\xc3\x78\x5a\x66\x28\x7d\xf7\x11\x80\x8a\x45\x41\x57\x60\x7b\x17\x18\x93\x79\xe6\x99\x66\x47\x8f\x6b\x06\xe8\x56\x32\xae\x49\xce\x44\x56\xe6\x7c\x0f\x3b\x21\x15\x4b\x56\x68\xcb\x66\x63\x75\x2c\x68\x28\xd6\xa8\x68\xe4\xd6\xee\xdf\x94\xe0\xb7\xa8\xd7\x57\x10\x29\x8d\xba\x54\x51\xfd\xad\x63\xee\x6d\xed\x89\xde\x19\x9c\xcc\xca\xe2\x69\xdb\x2c\x9a\xe5\xc6\x40\xc0\x76\xcd\xe2\xb5\xd5\x60\x37\xef\x16\x95\x93\x31\x25\xa7\xb3\x57\x9a\x14\x9d\x68\xc1\x11\x2e\xd3\xf4\x18\x93\x04\x35\x3d\x07\x8f\x0c\x95\x86\x77\x92\xc6\xef\x95\x46\xd9\x88\x91\xe7\x87\x7f\x3f\xd5\x47\x78\x2c\x8e\x46\xf5\xe3\xe2\x66\xb6\xb3\xd2\x23\xc5\xa5\xf5\x14\x49\x29\x2d\xa9\xad\x73\x3f\xe9\xe0\xa6\xfe\x70\xfc\x30\x44\x22\xbc\xcc\x97\xc6\x29\xae\x6a\x93\xa3\xd6\x94\x17\x5a\xb5\x4e\xbe\x42\x96\x95\x92\x22\x49\xb1\x31\x59\xbb\xc8\x8f\x38\x96\xc7\x31\x14\x87\x8c\xd1\xc5\x94\xe4\xe8\xd0\xed\xe1\x67\xa7\xe4\xf1\x9a\x72\xbc\xf2\x9d\x45\x41\x7c\x7a\x3b\xff\xed\x0f\x8b\xa3\xc7\x70\x8c\xbf\x5d\x53\xc6\xa0\x1b\x01\xba\x9e\x7b\xeb\xea\x56\x16\x4c\x6f\xe7\xfb\xb1\x85\x14\x05\x49\xbd\x5f\xc4\xae\xd5\x4c\x5d\xed\xe9\x93\x99\xde\x1a\x64\xbc\x7f\x4d\x8c\x8d\x23\x37\xa9\x5f\x74\x94\x78\xfc\x9d\x2f\x64\xc6\x85\x19\x57\x40\x5c\xd7\xe5\x51\x35\xb1\x32\x3e\x47\x2c\xff\x46\xb1\x8e\x60\x41\xd2\x80\x31\x06\xa0\xcc\x12\x63\x1a\x1f\x48\x6a\x30\xbc\x4d\x39\xfb\xfb\x1e\xb6\xaa\xe2\x9c\x0c\x35\x29\xfd\x04\xa6\x5d\xe4\x26\xde\x78\xc0\xac\xa4\x4b\xe3\x35\xac\xab\x96\x64\x66\x81\x92\xd7\xe0\xd9\x2e\x2a\x82\xaf\x42\x92\x8d\x4f\xae\xac\xa3\x56\x57\x93\x49\xca\x74\x65\xe2\x63\x91\xe7\x25\x67\x7a\x37\xa9\xc5\x48\x6a\x92\xd0\x03\x65\x13\xc5\xd2\x31\xca\x78\xcd\x34\xc5\xba\x94\x34\xc1\x82\x8d\x2d\xea\xdc\x9a\xf9\x28\x4f\x2e\xa4\x77\x0a\xea\xed\x11\xae\x27\x5a\xe9\x9a\x35\x9d\x1d\x12\x30\x66\xd4\xc8\x1a\xfd\x50\x47\xc5\x81\xd1\xe6\x91\xe1\xce\xdd\xc7\xc5\x3d\x54\x53\x5b\x61\x3c\xe5\xbe\xe5\xfb\x61\xa0\x3a\x88\xc0\x30\x8c\xf1\x95\x75\xae\x26\x3a\x92\x22\xb7\x30\x89\x27\x85\x60\x5c\xdb\x1f\x71\xc6\x88\x3f\x65\xbf\x2a\x97\x39\xd3\x2e\x74\x21\xa5\x8d\xac\x22\x98\x59\xbf\x07\x4b\x82\xb2\x30\x16\x20\x89\x60\xce\x61\x66\xbc\xc5\x0c\x4d\x40\xf5\xc2\x02\x30\x9c\x56\x63\xc3\xd8\x30\x11\xd4\x5d\xf6\xd3\xce\x8e\x6b\xb5\x17\x95\xff\x6c\x91\x97\x5d\x9b\x8b\x82\xe2\xa3\xf5\xe2\x56\xac\x16\x86\x27\xce\xde\xec\x0d\xa5\x6b\xcd\x6b\xd4\xce\xa7\xa5\x71\xc2\xbb\xa7\xcf\xe1\xd4\xa6\x55\x5d\x41\xaf\x51\x57\xeb\xca\x48\xc1\x27\x0b\x05\x49\x13\x93\x1f\x30\x8a\x4e\x60\x12\x2f\xf3\xd3\x99\xc6\x20\x45\xa9\x19\xa7\x86\x37\x85\x48\x4e\x9e\xb6\xf0\xd9\xbe\x42\xb5\x39\xa1\xb1\x89\x16\xa3\x50\x26\x20\x17\xab\x8a\x7b\x66\xa4\xe7\xa1\xa7\x84\x12\x40\x05\x05\x4a\x0d\x62\x75\x02\x13\x6a\xac\xdf\x1b\xf9\x53\x92\x99\xa6\xbc\x01\xa3\xa7\x38\xa1\xda\xc0\x78\xdc\xd0\xad\x5d\x74\xae\x59\x8b\x8c\xeb\xe6\x97\x4d\xda\x83\xeb\xf6\xc9\x42\x26\xb4\x93\xa2\xa2\x79\x8e\x29\xb5\x77\xe9\x14\xd3\xa1\x99\x35\x48\x8f\xfa\x03\x93\xdf\x0d\xca\xac\xf5\x5b\x29\x1e\x77\x0b\x8a\x25\xe9\xef\x86\xc7\xce\x42\xa0\x75\xc7\xdf\x0b\x44\x52\x6a\x92\xab\x86\x55\x7a\x68\x47\x92\xbe\xf3\x03\xac\xa9\x28\xa4\x78\x60\x89\xb7\x15\xb1\xe0\x2b\x96\xfa\x88\xc6\xf8\xf5\x0e\x90\x50\x8d\x30\x79\x29\xc9\x3d\x1a\x1d\x43\x42\xb4\xc7\x34\x4c\x12\x93\xd4\x75\x77\x0a\xe4\x0e\xd8\x54\xe2\x6c\xa0\x18\x57\x14\x97\xb2\x53\x6a\x07\x80\x4b\x21\x32\xc2\xa7\xb1\xc8\x71\x13\x32\x45\xce\xfe\x6e\x59\x7e\x36\x34\x55\xaf\x96\x0f\x00\xd7\xe2\x8d\x8e\xdb\x03\xc9\xa5\x50\x01\xda\xdc\xcd\x93\xde\xb9\x7c\xce\x1a\x6e\xd2\x48\xfe\x48\x26\xcd\xa2\x7f\x0e\x83\x96\x50\x41\x3c\x21\x1e\xf7\xac\xa6\x56\x17\x33\x70\xbe\xaa\x1b\x4a\x89\xed\x6b\x3c\xc7\x07\xea\xd4\xe2\x23\xf9\x7c\x35\xbd\xad\x15\x6a\x95\x0e\x0c\x30\x1b\x31\xf6\x1b\xf7\x13\x1c\x8c\xc3\x77\xc3\xac\x35\xb6\x41\xfc\x86\x76\x97\x95\x65\xf3\x31\x6e\x0f\x48\x80\xd9\x14\x62\x83\xe4\x8a\xc5\xa8\xe9\x9d\x7a\xbf\x0f\x7d\x62\xc1\xb9\x89\x7e\xb5\x00\x49\xb9\xd0\xe4\xe8\xee\x85\x28\xa9\x10\x8a\x69\x5b\x02\x89\x60\xae\x21\x46\x5e\x61\x05\xff\x19\xfd\xe9\xa7\x7f\xa9\xcf\xa8\x6c\xfe\xd1\x0b\xf4\xf6\xf3\x6c\x71\xf1\xcf\xe0\xea\xa3\x9a\x92\x3a\x08\x88\xd7\xc8\xb8\x8a\x60\x0a\xff\xf1\x79\x71\xe8\xd3\x0b\x74\x43\x3b\xa5\x6d\x5c\xad\x00\x4b\x2d\x72\xd4\x2c\xc6\x2c\xdb\x55\x05\x06\x43\xbb\xeb\x61\x7c\xc6\x6c\xda\x0b\xf1\x98\x95\x2e\xb5\xaa\x9c\x13\x55\xd1\xac\x65\x30\x9a\xf4\x44\xcb\x52\x85\x20\xfa\x44\x42\xcb\x9d\xc5\xc7\x8a\x03\x4c\xe8\x8f\x3c\x51\x11\x5c\x1b\x19\xd9\x38\x36\x44\xf0\x52\x08\xfd\x44\xfa\x0a\x50\x12\x60\xa6\x04\xb0\xbc\x10\xd2\x70\x80\x71\x9f\x4a\x1e\xd7\x5c\xfa\x99\x7a\x1a\x35\x1e\xb7\xd0\xd5\xe1\x61\xf6\x77\x6a\x58\x20\x1b\xda\x97\x9c\x9d\x67\xb1\x02\xa5\xcc\xa8\xb5\xc9\xd8\x22\x80\xaf\xe5\x49\x7e\xdc\xdc\x96\x04\x68\x12\x49\x96\x54\xb0\x36\xb4\xeb\x23\x12\x86\x38\x3f\x08\x88\xac\x1a\x49\x7d\x7b\x6d\x2c\x80\x27\x54\xd2\x8a\x24\x71\xdd\x98\x32\x6e\xca\x25\x49\x4e\x9a\x6c\xd6\x98\x88\x58\x99\x84\x31\xa6\x42\xab\x89\x78\x20\xf9\xc0\x68\x3b\xd9\x0a\xb9\x61\x3c\x1d\x6f\x99\x5e\x8f\x9d\x4b\x53\x13\x5b\xe1\x9c\x5c\xd8\x7f\x82\xf8\x75\x7f\xf3\xe1\xe6\x0a\xa6\x49\x02\xc2\x56\xbc\x4b\x45\xab\x32\x83\x15\xa3\xcc\x28\xeb\xa1\x96\x72\x69\xf3\xf9\xcb\x20\xa0\x25\x4b\xfe\xed\xed\xb9\x79\x2e\x0a\x57\xfe\x1c\xcc\xf7\x85\x2d\xcb\xef\x60\xbb\x26\x4b\xa2\x3e\xd8\x64\x21\xc1\xe4\xf8\x1b\xea\x8a\x2b\x0f\x2d\x2f\x95\x4d\xfe\x5d\x02\xdc\xbf\xc8\x86\x04\x6a\xb0\xdf\x24\xe9\x23\x70\x1c\x80\x6f\x50\x50\x65\xda\x7e\x23\x60\x90\x5b\x73\x36\x6d\xe9\x13\xd0\x6a\x2b\x61\xaf\xbf\xd6\x4f\xd7\xf7\x87\xd2\xd2\x24\x01\x93\x9c\x71\xe6\xfe\x3f\x2e\x95\xd1\xdd\xda\x36\xc4\x5a\xe7\x59\x0f\x0a\x01\xc1\x46\x33\xa6\x53\x63\x3b\x31\xd6\xdd\x81\x80\x6b\x43\x0c\x1e\x00\x7a\xc8\xf3\x5e\xa9\xb9\x36\x48\xe3\xfd\x56\xc6\x0b\xc1\x7e\x68\xaa\x91\x9e\x05\x76\xa8\x22\xdb\x6d\x8d\x3d\x03\x03\x3a\x7b\x76\xf4\xf6\x0c\xd6\xfe\xb0\xb0\xd3\xb4\x4c\xc4\x98\xdd\x55\x31\x53\xaf\x9f\x3b\xf1\x71\x05\xea\x75\x65\xfb\x2d\x2c\xbf\x86\xf6\x61\x58\xaf\x93\x0a\x16\x41\xb8\x06\xd7\xf7\x94\xc2\xb5\x7e\x80\x2e\x9c\xb0\xc1\x11\x7d\xc0\x30\x8c\xe8\x00\x49\xd6\xc3\xd9\x3e\x12\x9e\x63\x47\x0e\xa2\x3f\xbf\x11\x61\x2f\xb3\xc0\x43\x83\x94\xc1\x80\x25\x65\x84\x2a\x8c\xb6\x56\x36\xde\x8a\x8c\xc5\x41\xcc\x84\xc1\x0c\x35\x2d\x5e\x53\xbc\x51\x65\xee\xe6\x09\x1d\x35\x98\x17\x60\x4b\xcb\xb8\xcc\x42\xcc\xdd\xf1\x1c\x61\x51\x41\xd5\xdc\x86\xc3\x8b\x53\x13\x6e\xbb\xc1\x9a\x64\x4f\xfb\x00\x35\x0b\x32\xcb\xa6\x29\x8e\x85\x5a\x0b\xfd\xaa\x67\xbe\xbd\xea\xd9\x8b\xe8\x59\x29\x83\x72\x8a\x17\x0c\x82\x58\x48\xf0\x53\xca\xbe\xf8\xf8\x45\x02\x1f\x45\x5a\x33\x9e\xf6\xae\x87\xa3\xe5\x37\xad\xf2\xdb\x98\xaa\x3d\xee\x99\xad\xaf\x7c\xc5\xc2\x24\x5d\x2e\xfd\x0a\x29\x28\xb8\x4a\x89\xaf\x4b\xa9\x5a\x41\xa5\xc2\xeb\x9c\x05\x8c\xb8\xc2\xf1\x33\xed\xee\x68\x35\x3c\xd3\xb4\x35\x0b\x05\x58\x95\x34\xf0\x40\x76\x48\x0d\x62\xa8\xf5\x09\x2c\xb8\x9c\xe0\x59\x15\x5d\xf6\x65\x96\x10\xe4\xe0\x39\xcb\x3c\x3c\x06\x19\x5a\x2c\x09\x36\x4d\xff\x80\xa2\x0a\x0c\x2a\xac\x04\x83\xb4\x05\x98\xe0\xe2\x0a\x3c\x47\x5e\x43\x8a\x2c\x10\x52\x68\xa9\x2f\xfb\x60\x42\x7d\x4d\xe6\x19\xf5\x16\x78\x86\xd7\x1b\xe2\x8a\x42\x6a\x2f\x30\xd4\x05\xb9\x42\xe5\xf9\x6c\x8e\x83\xf7\x23\x1a\x9c\x96\x2a\x6f\xb0\x62\xd4\xaa\xc1\xcf\xaf\xf4\xc2\xab\x21\x7b\x35\x64\x4f\xdb\xb0\x8a\x71\x38\xa5\xbf\x17\x2b\x16\xdc\x55\xb3\x9c\x44\x39\x6c\x17\xf5\xed\x07\x2a\x24\xc5\xa8\x29\xb9\xb2\x9f\x3a\xcc\xb9\xa6\xd4\x9d\x23\xb9\xcd\x50\xaf\x84\xcc\x23\x23\xb4\xc8\x1d\xfe\xba\x77\x73\xf4\x52\xc8\xb8\xd2\x84\x49\x9f\x12\x9e\xf3\x20\xc3\x99\xce\xe4\xf8\x73\x98\xdf\xb9\x35\xff\x24\x65\x76\x40\xfb\x77\xcc\x87\xf8\x8d\x58\xe4\xf6\x13\x8a\xa0\x4a\xf3\x10\x9d\xb7\xa7\xb7\x78\xaf\x1e\x0d\x32\x1d\x1e\xe6\xe7\x10\x2f\x37\x1c\x6c\x90\x77\x1f\x0e\xf6\xde\x8c\x38\x27\xdc\x5c\x94\x5c\xdb\xe3\xe1\xe7\x84\x1a\xe6\x40\x07\x00\x2c\xce\x8d\xa1\xc4\xed\x2c\x54\xa9\xdc\xe9\x85\x2b\x58\xee\x74\xff\x1e\xfe\x00\x1c\x74\x90\x30\x1b\xd7\xad\xd1\x83\x90\x32\x57\x30\x36\x81\x26\x3d\xa4\x90\x20\x4b\x6e\xec\x7e\xf8\x19\x42\xd7\xff\x7c\x87\x77\xfc\x47\x67\x06\xfa\x2c\xc3\xb3\x1e\xfe\x2b\x70\xc9\x32\xf6\x72\xdb\x2d\x47\x8c\x99\x55\xd3\xbd\xc0\x36\x44\xe8\x99\xaf\x43\x0b\xdc\x48\x69\xa0\x63\xf0\xb6\xac\x6b\xc3\xcb\xb3\xc3\xb7\x68\x5d\x7b\x46\x79\x76\xe0\x76\xed\x77\xcc\x33\x68\xeb\xf6\xd9\xf3\x0c\x2b\xd1\x0e\xdc\xcc\xad\x86\x84\x6e\xe9\xba\x36\xb0\xb2\x1b\x5e\xe5\x74\xad\xf9\x73\x89\xb6\xf6\xbc\xe5\x5c\xc7\x6b\x80\x38\x06\x51\x3e\xa4\xf6\x5c\x5f\xf5\xe7\xaf\x2f\x07\x74\x1d\x62\x76\x5e\x4f\x80\x9c\x13\xf6\xeb\x09\x10\x18\x60\x22\x42\x8d\xc3\x8b\x1f\xaa\x08\xa6\xcd\x7f\x7c\xd1\x79\x1a\x1c\x5a\x42\xaf\x5b\x3f\xb6\x7f\xc1\x04\x63\x1e\xa8\x6e\x81\xf0\x42\x54\x6c\x7c\x12\xf7\x75\x76\x0e\x34\x85\xe3\x3d\x63\x3b\x3b\x79\x72\xbf\xb7\x60\xf0\x02\x99\xfe\xe2\x35\xcf\x7f\xcd\xf3\xfd\x07\xc6\x31\x15\x5a\xc8\xa1\x3e\x75\x5e\x1b\x6a\x4f\xa3\x57\xe5\x56\x60\x09\x71\xcd\x56\x8c\x64\x48\x91\x54\xaf\x09\x84\x4c\xab\xa3\xa2\xee\xca\x86\x4d\x74\x27\x4a\x4d\xea\x8b\xc0\xc4\xd5\x9b\xed\xc7\x91\x85\xa4\x49\x21\x82\x8e\x81\x17\x52\xc4\xa4\x54\xb5\x76\xfa\xeb\x80\xa1\x79\xcc\x20\x27\x18\x1e\x7b\x56\xf7\x85\x0c\x94\xc2\x97\xea\x9a\x91\x73\x66\xfd\x00\x99\xe5\xfb\x50\x5c\x9c\xb0\x98\xb2\x1f\xc2\x1f\xb4\xa1\xda\xf9\xe8\x91\x72\x90\xae\xa0\x86\x2d\xcb\x32\xa7\xb8\x85\xdd\x41\x5a\xb3\x4a\xca\x80\xba\x2a\x33\xfc\xbe\xca\x56\xde\x46\xef\xc6\xb5\xdb\x4d\xba\xda\xb1\xd8\x98\xd2\x46\x44\x15\x10\x77\x45\x4a\xb5\x55\x01\x8c\x07\x7d\xa4\x52\x79\x29\x78\x47\x51\x1a\x01\x5b\x59\xfc\x8d\x32\xbc\xd1\x94\x17\x19\x6a\x7a\xf3\xfe\x87\x5f\x85\xff\x47\xeb\x7f\xb6\xee\x57\xff\x24\x7f\xc3\xb8\x5d\x76\x5e\x26\xae\xf3\x32\x68\xe3\xc9\x7e\xb2\xc4\x54\x68\x9e\xf9\x8f\x28\x25\x2a\x4d\xc5\x0f\xf3\x49\x62\x2f\x5d\x1b\xe4\x6c\xd3\xba\xc7\x7b\x24\xc7\xcf\xb6\xeb\x8f\xf4\x35\x69\x6c\xcc\x75\x70\xcd\xf6\x80\xff\xcc\x5e\x63\x76\x96\xba\x6d\xe0\x91\xc7\xf0\x80\xb2\x30\x51\xb9\x32\x8b\xfc\x37\x91\x95\x39\xcd\x32\x64\x0d\xf7\x42\x34\x81\x3f\xcf\x06\xe0\xeb\xad\x03\xaf\xb7\x0e\x74\xcd\xff\x7a\xeb\x40\x5b\xfb\xff\x7b\xeb\x80\xfa\x85\x05\xb9\x88\xc5\x2f\xec\xfb\xfd\xc3\x19\x0d\xd0\x59\x96\xba\xc6\xf4\x3b\x61\xf4\xf3\xb7\xa0\x58\xcb\xa6\xfb\x7f\x5c\x3b\x39\xfc\x63\x3a\xff\x50\x9e\xf8\x7c\x32\x7b\x35\xf2\xaf\x46\xbe\x1f\xe0\xef\xc6\xc8\xf7\x74\xe9\x7c\xdd\x9e\x1f\xb4\x1e\x72\x3b\xce\xdc\x5c\xaf\x86\xfb\xd4\x72\x7c\x64\x79\x99\x37\x5c\x1f\xd9\x74\xc0\xf5\x7e\x3f\x2e\x21\x4c\x32\xc6\x6d\xea\xad\xdc\x09\xdb\x03\x50\x7b\xb9\xa5\xbb\x28\xb3\xc8\x4a\x37\x5d\xfb\x49\xb9\xfd\x84\x30\x5f\xd5\x80\xd4\x67\xa0\xc7\x98\x28\xa1\xe4\xb2\xf6\xde\x5b\x2a\x38\xb9\xa4\x0f\xac\x3a\xf3\x98\x32\x33\x00\x79\x62\x4f\x79\xdb\x0b\x48\x2b\x54\x2d\x04\x7b\x01\xe9\x27\x64\x19\x35\x5c\xe2\x56\xa5\xdd\x4f\xee\xca\x7c\x2a\x92\x06\xc5\x68\x11\xa4\xbb\xfe\xf2\x58\x4e\x0d\xb7\xde\xd9\x5e\x47\x72\x12\x4b\x45\xf2\x81\x2c\x57\xf5\xe1\x2e\xb7\x23\x40\xed\x56\xa3\xda\xf3\x6a\xb0\x14\x61\x97\xb6\x75\xef\x67\xf6\x99\xab\xea\x9b\xb5\xb6\x65\xd6\xbb\xbc\xda\xbf\x58\xed\x1d\x9a\x89\xb8\xd3\x62\xf4\x02\xd0\x28\xd3\x76\x0b\xd1\x33\xbc\x6b\xd7\xa8\xe5\x3b\xac\x67\x9a\x80\x0e\xe7\xdf\x81\x63\x2c\xb8\xdb\x3d\x7c\xb6\x66\x58\x35\x9c\x55\x60\xf6\xd5\x1f\xa7\xb5\x7b\x65\xc5\xc3\x85\x9a\xd8\x6c\x1a\xd1\x5e\x39\x83\x8c\x83\xbd\x28\xb3\xc9\xee\xf4\xa9\x59\x86\x4a\xdf\x4b\xe4\x8a\x55\x77\xfc\x06\x05\x60\x5f\x50\x79\x33\xe5\xfd\xb4\x27\x45\xef\x41\x51\xe2\x6e\xf2\x14\x9c\xfc\x0a\x6e\x8f\x2e\x05\x20\xb7\x07\xd7\xdb\x3e\x0d\xd8\xdb\x14\xd4\x34\xee\x28\x1f\xf7\x6b\x36\x2a\xfd\xcd\x7e\x3d\x19\x4c\xea\xbd\xbd\xfc\xf5\x40\x2e\x53\x35\x7a\xb7\xa8\xf6\xd7\x8c\xbe\x34\xee\x39\x29\xd5\x11\x17\x3e\xf9\xb8\x6f\x5d\xe6\xc8\xc7\x92\x30\xb1\xd7\xb8\xfb\xc1\xc0\x78\x62\xf7\x5a\x79\x0a\x09\x69\x64\x99\x02\x5c\x76\x9d\xc3\x36\xf2\x3d\x48\xb5\x8d\xc8\x5e\xe4\x25\xa1\x6a\x37\x28\x27\x0c\x77\xdd\xf7\xf7\x0a\xef\x19\xfe\xd6\xdf\x14\x7d\x06\x8c\x9a\xdc\x4a\x0b\x46\xde\xb7\xf8\x6d\x92\x3d\x32\x97\xee\xaf\x1a\xac\xe0\x5e\x96\x74\x09\x9f\x30\x53\x74\x09\xdf\xf8\x86\x8b\xed\xf3\xf1\xea\x2a\x2f\x9f\x16\x95\xc5\xca\xdd\xee\xec\xa3\xea\x3d\x6e\xcf\x9c\xbe\xdb\xf6\xb6\xae\xe3\xb1\x85\x7b\x3e\xc3\x9c\xb0\x94\x54\x83\xff\xe8\xc0\xbe\x0a\x37\x7a\xe2\xb9\xd9\x1a\x79\x6a\x3f\x78\xad\xae\xed\x86\x09\xcc\x17\x37\xf0\xeb\x3f\xfd\xf4\x33\x6c\xd7\xc4\x61\x76\xf7\xc1\x6d\x68\xde\xb8\xfb\xb0\x6d\x6a\xda\x40\xdb\xc3\x1f\xea\xf7\x07\xaf\xcb\x65\x14\x8b\x7c\x72\x33\x9d\x4f\xfc\xc0\xf1\xc2\xff\xb1\x01\x3b\xcf\x84\x29\x55\x92\x9a\xfc\xfa\xc7\x3f\x0d\xa1\x8b\xa4\x14\x0d\x19\x65\xc7\x08\x7f\x4f\x78\x0f\x23\x3e\xb9\x5e\x4d\xc1\x49\xb7\xcf\xe8\x5a\xc9\xbd\xda\xe5\x6e\x2e\x6f\x1e\xdc\x84\xde\x9d\x1f\xd1\x96\xe4\xf7\x27\x7d\xfe\x92\xf4\xf6\x6c\xc5\xe1\x5c\xbf\x22\xbd\x15\xc8\x57\x7c\x3c\x0b\x9c\x2e\xdf\x13\xee\x30\x82\xac\x6e\xd7\x01\x9c\x31\x1c\xdf\x20\xdf\xf2\xf6\x2b\x3e\x76\x08\xbb\x3d\x2d\x6b\x25\x32\x8c\xc0\x4e\xe2\xda\x09\x1b\x7b\x05\x6d\x7c\xe1\x94\xa9\xe1\x55\x23\x16\x1d\x04\xb6\x54\x68\x3a\x70\xb6\x59\x54\xcf\x9a\x3c\x24\x57\x4d\xfa\xde\x01\x7c\xff\x37\x11\x4e\x27\xe8\x67\xf6\xb0\x7c\xec\xe4\xa1\xcb\xb1\xae\x40\xcb\xd2\xc1\x56\x5a\x48\xc3\x9d\xda\x93\x72\x79\xf2\x39\x94\x77\xbf\xf0\xdf\xff\x33\xfa\xdf\x00\x00\x00\xff\xff\x1a\x0b\x9f\x7f\xa3\x68\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3d\x5d\x73\xe3\x38\x72\xef\xfa\x15\x5d\xe3\x87\x99\xa9\xb2\xa8\xdd\xbd\xbb\x64\xa3\x3c\xa4\x74\xf2\x4c\x45\x99\x19\xdb\x65\x79\xf7\x72\x8f\x10\xd9\xa2\x70\x22\x01\x06\x00\x2d\xeb\x52\xf9\xef\x29\x7c\x90\x22\x25\x7e\x80\xb2\x7c\x3b\x57\x6b\xbc\xcc\x88\x04\x1a\xfd\x85\xee\x46\x03\x6c\x5f\xc1\xf8\x72\x6d\x74\x05\x5f\x69\x88\x4c\x62\x04\x8a\x83\xda\x20\xcc\x32\x12\x6e\x10\x96\x7c\xad\x76\x44\x20\x7c\xe6\x39\x8b\x88\xa2\x9c\xc1\x87\xd9\xf2\xf3\x47\xc8\x59\x84\x02\x38\x43\xe0\x02\x52\x2e\x70\x74\x05\x21\x67\x4a\xd0\x55\xae\xb8\x80\xc4\x02\x04\x12\x0b\xc4\x14\x99\x92\x01\xc0\x12\xd1\x40\xbf\xbd\x7b\x5c\xcc\x3f\xc1\x9a\x26\x08\x11\x95\x76\x10\x46\xb0\xa3\x6a\x33\xba\x02\xb5\xa1\x12\x76\x5c\x6c\x61\xcd\x05\x90\x28\xa2\x7a\x62\x92\x00\x65\x6b\x2e\x52\x8b\x86\xc0\x98\x88\x88\xb2\x18\x42\x9e\xed\x05\x8d\x37\x0a\xf8\x8e\xa1\x90\x1b\x9a\x05\xa3\x2b\x78\xd4\x64\x2c\x3f\x17\x98\x48\x0b\xd6\xcc\xa9\x38\xfc\x95\xe7\x8e\x86\x0a\xb9\x8e\x0b\xd7\xf0\x2b\x0a\xa9\x27\xf9\x29\xf8\x61\x74\x05\x1f\x74\x97\x77\xee\xe5\xbb\x8f\xff\x0e\x7b\x9e\x43\x4a\xf6\xc0\xb8\x82\x5c\x62\x05\x32\x3e\x87\x98\x29\xa0\x0c\x42\x9e\x66\x09\x25\x2c\xc4\x03\x59\xe5\x0c\x01\x18\x04\x34\x0c\xbe\x52\x84\x32\x20\x86\x0c\xe0\xeb\x6a\x37\x20\x6a\x74\x35\xba\x02\xd3\x36\x4a\x65\xd3\xc9\x64\xb7\xdb\x05\xc4\xa0\x1b\x70\x11\x4f\x0a\xea\x26\x5f\x17\xf3\x4f\xb7\xcb\x4f\x63\x83\xf2\xe8\x0a\x7e\x61\x09\x4a\x09\x02\xff\x27\xa7\x02\x23\x58\xed\x81\x64\x59\x42\x43\xb2\x4a\x10\x12\xb2\xd3\x82\x33\xd2\x31\x42\xa7\x0c\x76\x82\x2a\xca\xe2\x6b\x90\x4e\xea\xa3\xab\x9a\x74\x0e\xec\x2a\xd0\xa3\xb2\xd6\x81\x33\x20\x0c\xde\xcd\x96\xb0\x58\xbe\x83\x3f\xcf\x96\x8b\xe5\xf5\xe8\x0a\xfe\xb2\x78\xfc\xcf\xbb\x5f\x1e\xe1\x2f\xb3\x87\x87\xd9\xed\xe3\xe2\xd3\x12\xee\x1e\x60\x7e\x77\x7b\xb3\x78\x5c\xdc\xdd\x2e\xe1\xee\x33\xcc\x6e\xff\x0a\x5f\x16\xb7\x37\xd7\x80\x54\x6d\x50\x00\x3e\x67\x42\xe3\xcf\x05\x50\xcd\x48\x8c\xb4\x4c\x0b\x05\x2a\x10\xd0\xfa\xa1\x7f\xcb\x0c\x43\xba\xa6\x21\x24\x84\xc5\x39\x89\x11\x62\xfe\x84\x82\x69\xf5\xc8\x50\xa4\x54\x6a\x71\x4a\x20\x2c\x1a\x5d\x41\x42\x53\xaa\x8c\x16\xc9\x53\xa2\xf4\x34\x97\x5c\x5b\x23\x92\x51\xa7\x4e\x53\x20\x19\xc5\x67\x85\xcc\x60\x13\x6c\x7f\x96\x01\xe5\x93\xa7\x1f\x47\x5b\xca\xa2\x29\xcc\x73\xa9\x78\xfa\x80\x92\xe7\x22\xc4\x1b\x5c\x53\x66\x34\x7f\x94\xa2\x22\x11\x51\x64\x3a\x02\x20\x8c\x71\x87\xbc\xfe\x09\x76\xd5\xf1\x24\x41\x31\x8e\x91\x05\xdb\x7c\x85\xab\x9c\x26\x11\x0a\x03\xbc\x98\xfa\xe9\x87\xe0\x8f\xc1\x8f\x23\x80\x50\xa0\x19\xfe\x48\x53\x94\x8a\xa4\xd9\x14\x58\x9e\x24\x23\x80\x84\xac\x30\x71\x50\x49\x96\x4d\x21\x24\x29\x26\xe3\xed\x08\x80\x91\x14\xa7\x60\xe0\xca\xc0\x3c\xae\x28\xe1\x48\xb3\x5f\x0f\x8b\x05\xcf\x8b\x61\xd5\xf7\x76\x7c\x81\x2f\x51\x18\x73\x41\x8b\xdf\x63\xd8\xea\xfe\xee\xff\x61\xf9\x7f\xcb\x93\x3f\xeb\x29\xcd\xef\x84\x4a\xf5\xe5\xf0\xec\x2b\x95\xca\x3c\xcf\x92\x5c\x90\xa4\x40\xce\x3c\x92\x1b\x2e\xd4\xed\x61\xca\x31\xd0\xed\xca\xbe\xa1\x2c\xce\x13\x22\x5c\xf7\x11\x80\x0c\x79\x86\x53\x30\xbd\x33\x12\xa2\x7e\xe6\x98\x66\x46\x8f\x2b\x06\xe8\x5e\x50\xa6\x50\xcc\x79\x92\xa7\xac\x84\x1d\xa1\x0c\x05\xcd\x94\x61\xb3\xb6\x3a\x06\x34\x64\x1b\x22\x71\x64\xd7\xee\xdf\x24\x67\xf7\x44\x6d\xa6\x10\x48\x45\x54\x2e\x83\xea\x5b\xcb\xdc\xfb\xca\x13\xb5\xd7\x38\xe9\x95\xc5\xe2\xb6\x59\x14\x4d\xb5\x81\x80\xdd\x86\x86\x1b\xa3\xc1\x76\xde\x1d\x91\x56\xc6\x18\x9d\xce\x5e\x68\x52\x70\xa2\x05\x35\x5c\x66\x71\x1d\x93\x88\x28\x3c\x07\x8f\x84\x48\x05\x1f\x04\x8e\x3f\x4a\x45\x44\x23\x46\x8e\x1f\xee\xfd\x4c\xd5\xf0\x58\xd6\x46\xf5\xe3\x62\x67\x36\xb3\xe2\x33\x86\xb9\xf1\x14\x51\x2e\x0c\xa9\xad\x73\x1f\x75\xb0\x53\xdf\xd4\x1f\xfa\x48\x84\xe5\xe9\x4a\x3b\xc5\x75\x65\x72\xa2\x14\xa6\x99\x92\xad\x93\xaf\x09\x4d\x72\x81\x81\xc0\x50\x9b\xac\x7d\xe0\x46\xd4\xe5\x51\x87\x62\x91\xd1\xba\x18\xa3\x18\x1d\xba\x3d\xfd\x68\x95\x3c\xdc\x60\x4a\xa6\xae\x33\xcf\x90\xcd\xee\x17\xbf\xfe\x61\x59\x7b\x0c\x75\xfc\xcd\x9a\xd2\x06\x5d\x0b\xd0\xf6\x2c\xad\xab\x5d\x59\x30\xbb\x5f\x94\x63\x33\xc1\x33\x14\xaa\x5c\xc4\xb6\x55\x4c\x5d\xe5\xe9\xd1\x4c\xef\x35\x32\xce\xbf\x46\xda\xc6\xa1\x9d\xd4\x2d\x3a\x8c\x1c\xfe\xd6\x17\x52\xed\xc2\xb4\x2b\x40\xa6\xaa\xf2\x28\x1a\x5f\x6b\x9f\xc3\x57\x7f\xc3\x50\x05\xb0\x44\xa1\xc1\x68\x03\x90\x27\x91\x36\x8d\x4f\x28\x14\x68\xde\xc6\x8c\xfe\xbd\x84\x2d\x8b\x38\x27\x21\x0a\xa5\x3a\x82\x69\x16\xb9\x8e\x37\x9e\x48\x92\xe3\xb5\xf6\x1a\xc6\x55\x0b\xd4\xb3\x40\xce\x2a\xf0\x4c\x17\x19\xc0\x37\x2e\xd0\xc4\x27\x53\xe3\xa8\xe5\x74\x32\x89\xa9\x2a\x4c\x7c\xc8\xd3\x34\x67\x54\xed\x27\x95\x18\x49\x4e\x22\x7c\xc2\x64\x22\x69\x3c\x26\x22\xdc\x50\x85\xa1\xca\x05\x4e\x48\x46\xc7\x06\x75\x66\xcc\x7c\x90\x46\x57\xc2\x39\x05\xf9\xbe\x86\xeb\x89\x56\xda\x66\x4c\x67\x87\x04\xb4\x19\xd5\xb2\x26\x6e\xa8\xa5\xe2\xc0\x68\xfd\x48\x73\xe7\xe1\xd3\xf2\x11\x8a\xa9\x8d\x30\x8e\xb9\x6f\xf8\x7e\x18\x28\x0f\x22\xd0\x0c\xa3\x6c\x6d\x9c\xab\x8e\x8e\x04\x4f\x0d\x4c\x64\x51\xc6\x29\x53\xe6\x47\x98\x50\x64\xc7\xec\x97\xf9\x2a\xa5\xca\x86\x2e\x28\x95\x96\x55\x00\x73\xe3\xf7\x60\x85\x90\x67\xda\x02\x44\x01\x2c\x18\xcc\xb5\xb7\x98\x13\x1d\x50\xbd\xb2\x00\x34\xa7\xe5\x58\x33\xd6\x4f\x04\x55\x97\x7d\xdc\xd9\x72\xad\xf2\xa2\xf0\x9f\x2d\xf2\x32\x6b\x73\x99\x61\x58\x5b\x2f\x76\xc5\x2a\xae\x79\x62\xed\x4d\x69\x28\x6d\x6b\x5e\xa3\x66\x3e\x25\xb4\x13\xde\x1f\x3f\x87\x53\x9b\x56\x74\x05\xb5\x21\xaa\x58\x57\x5a\x0a\x6e\xb3\x90\xa1\xd0\x31\xf9\x01\xa3\xe0\x04\x26\xb2\x3c\x3d\x9d\x69\x0c\x82\xe7\x8a\x32\x6c\x78\x93\xf1\xe8\xe4\x69\x0b\x9f\xcd\x2b\x22\xb7\x27\x34\x36\xd1\xa2\x15\x4a\x07\xe4\x7c\x5d\x70\x4f\x8f\x74\x3c\x74\x94\x60\x04\x44\x42\x46\x84\x02\xbe\x3e\x81\x09\x15\xd6\x97\x46\xfe\x94\x64\xaa\x30\x6d\xc0\xe8\x18\x27\x22\xb7\x30\x1e\x37\x74\x6b\x17\x9d\x6d\xc6\x22\x93\x4d\xf3\xcb\x26\xed\x21\x9b\xf6\xc9\x7c\x26\x34\x93\x12\x89\x8b\x94\xc4\xd8\xde\xa5\x53\x4c\x87\xa6\xd7\x20\x3e\xab\x1b\x2a\x5e\x0c\x8a\x5e\x04\x21\xe3\x3e\x5f\x0a\x44\x60\xac\x37\x43\x0d\xab\xea\xd0\x6a\x92\x79\x70\x03\xcc\xd2\xce\x04\x7f\xa2\x91\x5b\xdb\x21\x67\x6b\x1a\xbb\x08\x44\xfb\xe1\x0e\x90\x50\x8c\xd0\xfb\x48\x14\x25\x1a\x1d\x43\x7c\xa4\xad\x1b\x89\x22\xbd\x09\xeb\xee\xe4\xc9\x1d\x30\xa1\xff\xc5\x40\x51\x26\x31\xcc\x45\xa7\xd4\x0e\x00\x57\x9c\x27\x48\x8e\x63\x87\x7a\xe3\x22\x26\x8c\xfe\xdd\xb0\xfc\x62\x68\x4a\x0c\x05\xaa\x0b\x81\x6b\xf1\x1e\xf5\xf6\x84\x62\xc5\xa5\x87\x36\x77\xf3\xa4\x77\x2e\xb7\xc7\xf4\x37\x41\x28\xbe\x27\x13\x64\xd0\xbf\x84\x01\x8a\x30\x43\x16\x21\x0b\x7b\x56\x53\xab\x4b\x18\x38\x5f\xd1\x8d\x08\x41\xda\xd7\x78\x4a\x9e\xb0\x53\x8b\x6b\xf2\xf9\xa6\x7b\x1f\xa2\x8c\x56\x11\xc1\x00\xdb\x11\x92\xa5\x97\xee\x9f\x78\x69\x3b\xcc\x98\x64\x13\x79\x6f\x71\x7f\x5d\x98\x37\x17\x98\xf6\x80\x04\x98\xcf\x20\xd4\x48\xae\x69\x48\x14\x7e\x90\x1f\xcb\x78\x25\xe4\x8c\xe9\x90\x55\x71\x10\x98\x72\x85\x96\xf8\x5e\x88\x02\x33\x2e\xa9\x32\x79\x8b\x00\x16\x0a\x42\xc2\x0a\xac\xe0\xbf\x83\x3f\xfd\xf0\x6f\xd5\x19\xa5\xd9\x34\xf4\x02\xbd\xff\x32\x5f\x5e\xfd\x2b\xd8\xa4\xa6\xc2\xa8\x0a\x02\xc2\x0d\xa1\x4c\x06\x30\x83\xff\xfa\xb2\x3c\xf4\xe9\x05\xba\xc5\xbd\x54\x26\x18\x96\x40\x72\xc5\x53\xa2\x68\x48\x92\x64\x5f\x64\x05\x34\xed\xb6\x87\x76\x1c\xf3\x59\x2f\xc4\x3a\x2b\xed\x7e\xa8\xf0\x50\x58\x84\xa0\x86\xc1\x44\xef\x29\x94\xc8\xa5\x0f\xa2\x47\x12\x5a\xed\x0d\x3e\x46\x1c\xa0\xe3\x75\xc2\x22\x19\xc0\xad\x96\x91\x09\x3e\x7d\x04\x2f\x38\x57\x47\xd2\x97\x40\x04\x02\x49\x24\x07\x9a\x66\x5c\x68\x0e\x50\xe6\xf6\x7f\xf5\x44\x49\x3f\x53\x4f\x43\xbd\x7a\xf3\x5d\x1d\x0e\x66\x7f\xa7\x86\x05\xb2\xc5\x32\x4f\x6c\xdd\x8b\x11\x28\x26\x5a\xad\xf5\x36\x2b\x00\xf8\x96\x9f\x6c\x6a\x9b\xdb\x0a\x81\xe8\xdd\x1f\x8d\x0a\x58\x5b\xdc\xf7\x11\x09\x43\x3c\x20\x78\x84\x57\x8d\xa4\xbe\xbf\xd5\x16\xc0\x11\x2a\x70\x8d\x02\x99\x6a\xdc\xe7\x6d\xf3\x15\x0a\x86\x0a\xcd\x56\x2f\xe2\xa1\xd4\xbb\xbc\x10\x33\x25\x27\xfc\x09\xc5\x13\xc5\xdd\x64\xc7\xc5\x96\xb2\x78\xbc\xa3\x6a\x33\xb6\x7e\x4d\x4e\x4c\x5a\x72\x72\x65\xfe\xf1\xe2\xd7\xe3\xdd\xcd\xdd\x14\x66\x51\x04\xdc\xa4\xa9\x73\x89\xeb\x3c\x81\x35\xc5\x44\x2b\xeb\x21\x01\x72\x6d\x36\xe1\xd7\x5e\x40\x73\x1a\xfd\xc7\xfb\x4b\xf3\x9c\x67\x36\x67\x39\x98\xef\x4b\x93\x4b\xdf\xc3\x6e\x83\x86\x44\x75\xb0\xc9\x5c\x80\xde\x98\x6f\xb1\x2b\xb8\x3c\xb4\x34\x97\x66\xc7\x6e\x77\xad\xfd\x8b\x6c\x48\xb4\x06\xe5\xc9\x46\x1f\x81\x63\x0f\x7c\xbd\x22\x2b\xdd\xca\xec\xfd\x60\xb7\x66\xed\xda\xca\xed\x1c\xcb\x33\x00\x73\xa4\x51\x28\xb2\xf1\xda\xd5\xd3\x9d\x38\xd7\x5b\x82\x49\x4a\x19\xb5\xff\x1f\xe7\x52\x2b\x71\x05\xc0\x46\xa5\x49\xdf\x82\xf5\x88\x3d\x4e\x70\x36\xf8\xce\xb4\x15\x25\xa1\x2a\x13\x0f\xc4\xd1\x41\xdc\x8b\x5e\x98\x43\x0c\x22\x94\x60\x17\xbd\x52\xb5\x6d\xd0\x8a\x70\xe7\x13\xaf\x04\xfb\xa9\x29\xf1\x79\x11\xd8\xbe\x8a\x6e\xce\x2a\x4a\x06\x7a\x74\x76\xec\xe8\xed\xe9\xbd\x3a\xfc\x62\x53\xdd\x12\x1e\x92\xe4\xa1\x88\xa9\x7a\xfd\xe0\xc9\x6a\xca\x88\xda\x14\xbe\xc1\xc0\x72\x7a\x59\x86\x69\xbd\x4e\xcc\x5b\x04\xfe\x1a\x5c\x3d\x28\xf2\xd7\xfa\x01\xba\xd0\x62\x54\x0e\x18\xfa\x11\xed\x21\xc9\x6a\xb8\x7b\xa6\xa9\xab\x45\xcc\xaf\x60\xa0\x0e\xda\x73\x62\x9d\x0e\x5a\x70\x61\xfb\x44\x5f\xc7\x76\xf8\xc6\x47\x83\x01\x0b\x4c\x90\x48\x3f\xda\x5a\xd9\x7b\xcf\x13\x1a\xee\x6b\xb9\xe7\xcc\x3c\xf2\x02\x0a\x40\xa4\xe4\x21\x2d\x76\x1e\x67\xc8\x08\x06\xcb\x49\xb7\x70\x83\xe1\x56\xe6\xa9\x45\xdf\x77\xd4\x60\x16\x83\xc9\x70\x93\x55\xe2\x63\xa0\xeb\x73\xf8\xc5\x39\x45\xb3\xe7\x1e\xaf\x4e\x8d\xbf\xb7\x01\xe3\x44\x1c\xed\x03\xb4\xd7\xcb\x91\xe8\x26\x19\xc9\xe4\x86\xab\x37\xf5\x7d\x53\xdf\x7f\x42\xf5\xcd\x85\xd7\xe6\xeb\x15\xa3\x41\xea\x13\x05\xe6\x22\xf9\x2d\x22\x40\x89\x4a\x51\x16\x0f\x8b\x2e\x66\x45\x22\x20\xc4\xe2\x04\x7f\x6e\x12\x51\xdf\x48\xa6\x77\xa7\x76\x9f\xea\x93\x79\xb1\x29\x25\x97\xc0\x93\x95\xcc\x53\x81\xd7\x25\x33\x3d\x61\x81\xe3\x17\xdc\x3f\xe0\x7a\xf8\x96\xdc\x24\x77\x74\x7c\xe3\x72\x3f\xe4\x40\xb6\x4f\xb2\x66\xa8\xf5\xf1\xcc\x4c\x9d\xe0\x59\x64\xa7\xca\x7c\x94\x0f\x72\x70\xce\x32\xf7\x8f\x98\x86\x66\x95\xbc\x4d\xd3\x6f\x90\x7d\x82\x41\x19\x28\x6f\x90\x26\x53\xe5\x9d\x85\x82\x73\xe4\x35\x24\x1b\x05\x3e\x19\xa9\xea\xb2\xf7\x26\xd4\x25\xaf\xce\x48\x4c\xc1\x19\x5e\x6f\x88\x2b\xf2\x49\x52\xc1\x50\x17\x64\x33\xba\x97\xb3\x39\x16\xde\xf7\x68\x70\x5a\xd2\xe1\xde\x8a\x51\x49\x9b\x9f\x9f\x12\x87\x37\x43\xf6\x66\xc8\x8e\xdb\xb0\xd4\xba\x3f\xa5\xbf\x17\x2b\xe6\xdd\x55\xd1\x14\x79\x3e\xec\xb8\xf9\xfd\x0d\x66\x02\x43\xbd\xb7\x9b\x9a\x0f\x39\x16\x4c\x61\x6c\x6f\xdd\xdc\x27\x44\xad\xb9\x48\x03\x2d\xb4\xc0\x5e\x6d\x7b\xb4\x73\xf4\x52\x48\x99\x54\x48\xa2\x3e\x25\xbc\xe4\xb5\x8f\x0b\xdd\x60\x72\xb7\x4c\x5f\x78\x91\xe1\x68\x27\x6e\x81\xf6\x5f\x2d\x18\xe2\x37\x42\x9e\x9a\x0f\x44\xbc\x52\xee\x43\x74\xde\xdc\x4d\x63\xbd\x7a\x34\xc8\x74\x38\x98\x5f\x7c\xbc\xdc\x70\xb0\x5e\xde\x7d\x38\xd8\x47\x3d\xe2\x92\x70\x53\x9e\x33\x65\x2e\xbf\x5f\x12\xaa\x9f\x03\x1d\x00\x30\xbb\x34\x86\x82\xec\xe6\xbe\x4a\x65\xaf\x79\x4c\x61\xb5\x57\xfd\x97\x1d\x06\xe0\xa0\xbc\x84\xd9\xb8\x6e\xb5\x1e\xf4\xad\xdb\x41\xd8\x78\x9a\x74\x9f\x44\x82\xc8\x99\xb6\xfb\xfe\x37\x2e\x6d\xff\xcb\xdd\x72\x72\x9f\xd4\x69\xe8\xf3\x84\x5c\xf4\xaa\x64\x46\x56\x34\xa1\xaf\x77\xee\x54\x63\xcc\xbc\x98\x6e\xef\x23\xea\x61\xe1\xbd\xef\x0d\xb9\x43\xf3\x3c\x0e\x6a\xa0\xe3\x42\xa7\xd6\xb6\x0d\x4f\xda\x0e\x3f\xc1\xb6\xed\x8c\xa4\xed\xc0\xd3\xec\x17\xcc\x33\xe8\x64\xfb\xec\x79\x86\x25\x6e\x07\x9e\x75\x17\x43\x7c\x4f\xbc\x6d\x1b\x98\xef\xf5\xcf\x7d\xda\xd6\xfc\x89\x48\x5b\x3b\x6f\x91\x57\xf1\x1a\x20\x8e\x41\x94\x0f\xc9\x48\x57\x6d\xc1\xe5\xb3\xce\x1e\x5d\x87\x18\xa3\xb7\x6b\x33\xb6\xbd\x5d\x9b\xa9\x75\xfe\x0d\xaf\xcd\xf8\x9a\x8c\x57\xbf\x89\xe2\x4d\x9b\xfb\xac\xa5\xf3\x9e\x3d\xb4\x84\x69\xf7\x6e\x6c\x7f\x48\xe2\x8d\xb9\xa7\xba\x79\xc2\xf3\x51\xb1\xf1\x49\x8c\xd8\xd9\xd9\xd3\x40\x8e\x4b\xc6\x76\x76\x72\xe4\xbe\x34\xb9\xf0\x0a\x59\x81\xe5\x5b\x4e\xe0\x2d\x27\xe0\x3e\xb5\x0e\x31\x53\x5c\x0c\xf5\xb4\x8b\xca\x50\x73\xc5\xbf\x48\xcd\x02\x8d\x90\x29\xba\xa6\x28\x7c\x12\xaa\x6a\x83\xc0\x45\x5c\x5c\xbb\xb5\xc5\x2b\xb6\xc1\x03\xcf\x15\xca\xaf\x9c\x44\x36\x37\x6d\x3e\x13\xcd\x04\x4e\x32\xee\x75\xb7\x3e\x13\x3c\x44\x29\x8b\xb5\xd3\x9f\x33\xf4\xdd\xf3\x0c\x72\x82\xfe\x11\x69\x51\x39\x65\xa0\x14\xbe\x16\x05\x57\x2e\x99\x21\x00\x48\x0c\xdf\x87\xe2\x62\x85\x45\xa5\x29\x09\x70\xd0\x86\xe2\x94\xa4\x47\xca\x5e\xba\x42\x14\xec\x68\x92\x58\xc5\xcd\xcc\x69\xd3\x86\x16\x52\x06\xa2\x8a\x94\xc4\xef\x2b\xc5\xe5\x6c\xf4\x7e\x5c\xa9\xf3\xd2\xd5\xea\x62\xa3\x52\x69\x11\x15\x40\x6c\xb1\x98\xe2\x58\x03\x28\xf3\xfa\xf2\xa7\xf0\x52\xf0\x01\x83\x38\x00\xba\x36\xf8\x6b\x65\x78\xa7\x30\xcd\x12\xa2\xf0\xdd\xc7\xef\x7e\x15\xfe\x93\xe6\x0a\x4d\x8e\xb0\x7a\xc3\x6e\x4b\x99\x59\x76\x4e\x26\xb6\xf3\xca\xeb\x90\xca\x7c\x07\x46\xa5\xef\xee\xf3\xb7\x48\x3b\x4a\x85\xd9\x77\xf3\xb1\x67\x2f\x5d\x5b\xc2\xe8\xb6\xf5\x3c\xb8\x26\xc7\x2f\xa6\xeb\xf7\xf4\x9d\x6e\xa8\xcd\xb5\x77\x7e\xf7\x80\xff\xdc\x14\x74\xbb\x48\x8e\xd7\xf3\x7a\xa4\x7f\x40\x99\xe9\xa8\x5c\xea\x45\xfe\x2b\x4f\xf2\x14\xe7\x09\xa1\x0d\x15\x32\x9a\xc0\x5f\xe6\xb0\xf0\xad\xfe\xc2\x5b\xfd\x85\x17\x82\x7a\xab\xbf\xd0\xd2\xfe\x51\xf5\x17\xe4\x4f\xd4\xcb\xa4\x2f\x7f\xa2\x2f\xb7\xe7\x17\x34\x18\x17\x59\xea\x8a\xc4\x2f\x84\xd1\xcf\xdf\x0c\x43\x25\x9a\x2a\x17\xd9\x76\x72\xb1\x47\x77\xfe\xae\x3c\xe7\x9b\x91\x7f\x33\xf2\x2f\x03\xf5\x66\xe4\xcf\xe9\xd2\xf9\xba\x3d\x9e\x6f\xbd\xc0\x56\xdf\x69\xd9\x5e\x0d\x95\xe0\x52\xf2\x4c\xd3\x3c\x6d\x28\x7c\xd9\x74\x79\xf5\xb1\x1c\x17\x21\x89\x12\xca\xcc\x56\x59\xda\xdb\xb3\x07\xa0\xa6\x2c\xa7\x2d\xf1\x99\x25\xb9\x9d\xae\xfd\x16\x5c\x39\x21\x2c\xd6\x15\x20\xd5\x19\xf0\x39\x44\x8c\x30\xba\xae\xbc\x77\x96\x0a\x4e\xca\x0b\x82\x51\x67\x16\x62\xa2\x07\x10\x16\x99\x1b\xdc\xa6\x74\x6a\x81\xaa\x81\x60\x4a\xa7\x7e\x26\x34\xc1\x86\xf2\x73\xc5\x36\xf9\xa8\xca\xe7\xb1\x48\x1a\x14\xa3\x45\x90\xb6\x70\x67\x5d\x4e\x0d\xf5\xfa\x4c\xaf\x9a\x9c\xf8\x4a\xa2\x78\x42\xc3\x55\x75\xa8\x42\x57\x03\xd4\x6e\x35\x8a\x33\xaa\x06\x4b\xe1\x57\x6e\xae\x3c\x95\x3c\xab\xe4\x5c\xf1\x3d\x5a\xdb\x32\xeb\x5d\x5e\xed\xdf\xce\xf6\x0e\x4d\x78\xd8\x69\x31\x7a\x01\x28\x22\xe2\x76\x0b\xd1\x33\xbc\xeb\x94\xa7\xe5\x1b\xab\x33\x4d\x40\x87\xf3\xef\xc0\x31\xe4\xcc\x9e\xf6\x9d\xad\x19\x46\x0d\xe7\x05\x98\x32\x5b\x63\xb5\xb6\x54\x56\x72\x28\x05\x4a\x9a\x4d\x23\x31\x75\x77\x08\x65\x60\x4a\x7c\x36\xd9\x9d\x3e\x35\x4b\x88\x54\x8f\x82\x30\x49\x8b\xea\xc4\x5e\x01\xd8\x57\x22\x9d\x99\x72\x7e\xda\x91\xa2\x4a\x50\x18\xd9\x1a\xa4\x9c\xa1\x5b\xc1\xed\xd1\x25\x07\xc2\xcc\xa5\xf4\xb6\x6b\xff\xa5\x4d\x21\x0a\xc7\x1d\xe9\xde\x7e\xcd\x26\x52\xfd\x62\xbe\x8c\xf4\x26\xf5\xd1\x94\xad\x3d\x90\x4b\x65\x85\xde\x1d\x91\x65\x81\xd4\xd7\xc6\x3d\x45\x29\x3b\xe2\xc2\xa3\x0f\xf7\x36\x79\x4a\xd8\x58\x20\x89\x4c\x01\x7a\x37\x18\x28\x8b\xcc\xd9\x28\x8b\x21\x42\x45\x68\x22\x81\xac\xba\xee\x58\x6b\xf9\x1e\xa4\xda\x46\x64\x2f\xf2\x02\x89\x6c\x37\x28\x27\x0c\xb7\xdd\xcb\x8a\xc8\x25\xc3\xdf\xbb\x1a\xd7\x17\xc0\xa8\xc9\xad\xb4\x60\xe4\x7c\x8b\x3b\xd6\x28\x91\xb9\xb6\x7f\x8f\x61\x0d\x8f\x22\xc7\x6b\xf8\x4c\x12\x89\xd7\xf0\x0b\xdb\x32\xbe\x3b\x1f\xaf\xae\x74\xf0\x69\x12\x98\xaf\x6d\x5d\x6a\x17\x55\x97\xb8\x9d\x39\x7d\xb7\xed\x6d\x5d\xc7\x63\x03\xf7\x72\x86\x39\xa2\x31\xca\x06\xff\xd1\x81\x7d\x11\x6e\xf4\xc4\x73\xf3\x0d\x61\xb1\xf9\x98\xb5\x28\x38\x0e\x13\x58\x2c\xef\xe0\xe7\x7f\xf9\xe1\x47\xd8\x6d\x90\xc1\xfc\xe1\xc6\x1e\x40\xde\xd9\x4a\xde\x66\x6b\xda\x40\xdb\xd3\x1f\xaa\x95\x8f\x37\xf9\x2a\x08\x79\x3a\xb9\x9b\x2d\x26\x6e\xe0\x78\xe9\xfe\x4c\x82\x99\x67\x42\xa5\xcc\x51\x4e\x7e\xfe\xe3\x9f\x86\xd0\x85\x42\xf0\x86\x1d\x65\xc7\x08\x57\xe1\xbc\x87\x11\x9f\x6d\xaf\xa6\xe0\xa4\xdb\x67\x74\xad\xe4\x5e\xed\xb2\x35\xd7\x9b\x07\x37\xa1\xf7\xe0\x46\xb4\x6d\xf2\xfb\x37\x7d\xae\xbc\x7b\xfb\x6e\xc5\xe2\x5c\x2d\xee\xde\x0a\xe4\x1b\x79\xbe\x08\x9c\x2e\xdf\xe3\xef\x30\xbc\xac\x6e\xd7\x85\x99\x31\xd4\x6b\xdf\xb7\xbc\xfd\x46\x9e\x3b\x84\xdd\xbe\x2d\x6b\x25\xd2\x8f\xc0\x4e\xe2\xda\x09\x1b\x3b\x05\x6d\x7c\x61\x95\xa9\xe1\x55\x23\x16\x1d\x04\xb6\x64\x68\x3a\x70\x36\xbb\xa8\x9e\x35\x79\xd8\x5c\x35\xe9\x7b\x07\xf0\xf2\xaf\x39\x9c\x4e\xd0\xcf\xec\x61\xfb\xb1\x93\x87\x76\x8f\x35\x05\x25\x72\x0b\x5b\x2a\x2e\x34\x77\x2a\x4f\xf2\xd5\xc9\xa7\x4e\xce\xfd\xc2\xff\xfe\xdf\xe8\xff\x03\x00\x00\xff\xff\xbd\xf3\x13\x2c\x5d\x69\x00\x00"), }, "/crd/bases/camel.apache.org_camelcatalogs.yaml": &vfsgenÛ°CompressedFileInfo{ name: "camel.apache.org_camelcatalogs.yaml", @@ -99,9 +99,9 @@ var assets = func() http.FileSystem { "/crd/bases/camel.apache.org_integrationplatforms.yaml": &vfsgenÛ°CompressedFileInfo{ name: "camel.apache.org_integrationplatforms.yaml", modTime: time.Time{}, - uncompressedSize: 25962, + uncompressedSize: 22596, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5c\xdf\x93\xe2\xb8\xf1\x7f\xe7\xaf\xe8\x5a\x1e\xf6\xae\x6a\x30\x77\xdf\x6f\x52\x49\xc8\x43\x8a\x63\x77\x2b\x64\x76\x67\xa8\x81\xbd\xcb\x3d\x0a\xbb\x01\x1d\xb2\xe4\x48\xf2\xb0\x5c\x2a\xff\x7b\xaa\x25\x1b\xec\xc1\xbf\x98\x99\xab\x24\x77\xd6\xcb\xee\x60\xa9\xd5\xdd\xea\x9f\xf2\x07\x86\x30\x7a\xbd\x31\x18\xc2\x47\x1e\xa2\x34\x18\x81\x55\x60\x77\x08\xd3\x84\x85\x3b\x84\xa5\xda\xd8\x03\xd3\x08\x1f\x54\x2a\x23\x66\xb9\x92\xf0\xd5\x74\xf9\xe1\x6b\x48\x65\x84\x1a\x94\x44\x50\x1a\x62\xa5\x71\x30\x84\x50\x49\xab\xf9\x3a\xb5\x4a\x83\xf0\x04\x81\x6d\x35\x62\x8c\xd2\x9a\x00\x60\x89\xe8\xa8\xdf\xdd\xaf\xe6\xb3\xf7\xb0\xe1\x02\x21\xe2\xc6\x2f\xc2\x08\x0e\xdc\xee\x06\x43\xb0\x3b\x6e\xe0\xa0\xf4\x1e\x36\x4a\x03\x8b\x22\x4e\x1b\x33\x01\x5c\x6e\x94\x8e\x3d\x1b\x1a\xb7\x4c\x47\x5c\x6e\x21\x54\xc9\x51\xf3\xed\xce\x82\x3a\x48\xd4\x66\xc7\x93\x60\x30\x84\x15\x89\xb1\xfc\x90\x73\x62\x3c\x59\xb7\xa7\x55\xf0\xa3\x4a\x33\x19\x0a\xe2\x66\x5a\xb8\x81\xef\x51\x1b\xda\xe4\xff\x82\x6f\x06\x43\xf8\x8a\xa6\xbc\xc9\x1e\xbe\xf9\xfa\xcf\x70\x54\x29\xc4\xec\x08\x52\x59\x48\x0d\x16\x28\xe3\x97\x10\x13\x0b\x5c\x42\xa8\xe2\x44\x70\x26\x43\x3c\x8b\x75\xda\x21\x00\xc7\x00\xd1\x50\x6b\xcb\xb8\x04\xe6\xc4\x00\xb5\x29\x4e\x03\x66\x07\xc3\xc1\x10\xdc\xd8\x59\x9b\x4c\xc6\xe3\xc3\xe1\x10\x30\xc7\x6e\xa0\xf4\x76\x9c\x4b\x37\xfe\x38\x9f\xbd\xbf\x5b\xbe\x1f\x39\x96\x07\x43\xf8\x2c\x05\x1a\x03\x1a\xff\x91\x72\x8d\x11\xac\x8f\xc0\x92\x44\xf0\x90\xad\x05\x82\x60\x07\x3a\x38\x77\x3a\xee\xd0\xb9\x84\x83\xe6\x96\xcb\xed\x0d\x98\xec\xd4\x07\xc3\xd2\xe9\x9c\xd5\x95\xb3\xc7\x4d\x69\x82\x92\xc0\x24\xbc\x99\x2e\x61\xbe\x7c\x03\xdf\x4d\x97\xf3\xe5\xcd\x60\x08\x3f\xcc\x57\x7f\xbd\xff\xbc\x82\x1f\xa6\x0f\x0f\xd3\xbb\xd5\xfc\xfd\x12\xee\x1f\x60\x76\x7f\xf7\x6e\xbe\x9a\xdf\xdf\x2d\xe1\xfe\x03\x4c\xef\x7e\x84\xdb\xf9\xdd\xbb\x1b\x40\x6e\x77\xa8\x01\xbf\x24\x9a\xf8\x57\x1a\x38\x29\x12\x23\x3a\xd3\xdc\x80\x72\x06\xc8\x3e\xe8\x6f\x93\x60\xc8\x37\x3c\x04\xc1\xe4\x36\x65\x5b\x84\xad\x7a\x44\x2d\xc9\x3c\x12\xd4\x31\x37\x74\x9c\x06\x98\x8c\x06\x43\x10\x3c\xe6\xd6\x59\x91\xb9\x14\x8a\xb6\x79\x4d\xdf\x1a\xb0\x84\x67\xe6\x34\x01\x96\x70\xfc\x62\x51\x3a\x6e\x82\xfd\x1f\x4d\xc0\xd5\xf8\xf1\xdb\xc1\x9e\xcb\x68\x02\xb3\xd4\x58\x15\x3f\xa0\x51\xa9\x0e\xf1\x1d\x6e\xb8\x74\x96\x3f\x88\xd1\xb2\x88\x59\x36\x19\x00\x30\x29\x55\xc6\x3c\xfd\x09\xde\xeb\x94\x10\xa8\x47\x5b\x94\xc1\x3e\x5d\xe3\x3a\xe5\x22\x42\xed\x88\xe7\x5b\x3f\x7e\x13\xfc\x2e\xf8\x76\x00\x10\x6a\x74\xcb\x57\x3c\x46\x63\x59\x9c\x4c\x40\xa6\x42\x0c\x00\x04\x5b\xa3\xc8\xa8\xb2\x24\x99\x40\xc8\x62\x14\xa3\xfd\x00\x40\xb2\x18\x27\xc0\xa5\xc5\xad\x76\xab\x13\xc1\x2c\x39\xa3\x09\xdc\xa4\x82\x49\x0e\xe8\x30\x88\xc8\x56\xab\x34\x27\x52\x7c\xee\xa9\xe5\xdc\x33\x8b\x5b\xa5\x79\xfe\xf7\x08\xf6\x34\x3f\xfb\x7f\x78\xfa\xbf\xd7\xd0\xfc\xcc\xc0\x22\x63\xc0\x3d\x15\xdc\xd8\xdb\xba\x19\x1f\xb9\xb1\x6e\x56\x22\x52\xcd\x44\xb5\x18\x6e\x82\xd9\x29\x6d\xef\xce\xcc\x8d\x80\x27\xfe\x01\x97\xdb\x54\x30\x5d\xb9\x76\x00\x60\x42\x95\xe0\x04\xdc\xd2\x84\x85\x18\x0d\x00\x32\xcd\x3b\x52\xa3\x42\x14\x5b\x68\xa2\xa1\x67\x4a\xa4\xb1\x3c\x6d\x14\xa1\x09\x35\x4f\xac\x3b\x2b\x0a\x5d\x85\x8d\x20\xdf\x09\x92\x1d\x33\x38\xf0\xf1\xe0\x27\xa3\xe4\x82\xd9\xdd\x04\x02\x63\x99\x4d\x4d\x50\x7c\xea\x0f\x6c\x51\xf8\xc4\x1e\x89\x45\xf2\x56\xb9\x1d\x9c\xa7\x3c\x7e\xeb\x25\x0c\x77\x18\xb3\x49\x36\x57\x25\x28\xa7\x8b\xf9\xf7\xff\xbf\x2c\x7d\x0c\x65\x36\x2b\x74\x4d\x21\x81\x9c\xc9\xaf\x3b\xf9\x67\xad\xc6\xfd\x98\x2e\xe6\xa7\xbf\x12\xad\x12\xd4\xf6\x64\x10\x7e\x14\x9c\xa8\xf0\xe9\x13\x7e\xde\x12\xcb\x59\xe4\x8e\xc8\x7b\xd0\x33\x93\x9d\x04\x46\x99\x94\x3e\xca\x72\x0a\x8e\x14\x64\x50\x7a\x7f\x2a\x11\x06\x9a\xc4\x24\xa8\xf5\x4f\x18\xda\x00\x96\xa8\x89\x0c\x99\x48\x2a\x22\x72\xba\x47\xd4\x16\x34\x86\x6a\x2b\xf9\xcf\x27\xda\x26\xcf\xa0\x82\x59\xcc\xec\xee\x3c\xdc\xc9\x53\x26\x7b\x64\x22\xc5\x1b\x8a\x47\x2e\x09\x68\xa4\x5d\x20\x95\x05\x7a\x6e\x8a\x09\xe0\x93\xd2\xe8\x32\xdf\xc4\xa5\x00\x33\x19\x8f\xb7\xdc\xe6\xc1\x23\x54\x71\x9c\x4a\x6e\x8f\xe3\x42\xf6\x35\xe3\x08\x1f\x51\x8c\x0d\xdf\x8e\x98\x0e\x77\xdc\x62\x68\x53\x8d\x63\x96\xf0\x91\x63\x5d\xba\x00\x12\xc4\xd1\x50\x67\xe1\xc6\xbc\x2d\xf1\x7a\x61\x2d\x7e\x38\x37\x6c\x38\x01\x72\x42\xb2\x01\x96\x2d\xf5\x52\x9c\x15\x4d\x1f\x91\x76\x1e\xde\x2f\x57\x90\x6f\xed\x0e\xe3\xa9\xf6\x9d\xde\xcf\x0b\xcd\xf9\x08\x48\x61\x5c\x6e\x5c\xd8\xa6\xbc\xab\x55\xec\x68\xa2\x8c\x12\xc5\xa5\x75\x7f\x84\x82\xa3\x7c\xaa\x7e\x93\xae\x63\x6e\x7d\x52\x44\x63\xe9\xac\x02\x98\xb9\x88\x0a\x6b\x84\x34\x89\x98\xc5\x28\x80\xb9\x84\x19\x45\x9e\x19\xa3\x54\xfd\x0b\x1f\x00\x69\xda\x8c\x48\xb1\xdd\x8e\xa0\x98\x0c\x9e\x4e\xf6\x5a\x2b\x3c\xc8\x63\x71\xcd\x79\x55\x78\xf0\x32\xc1\xb0\xe4\x3d\x11\x1a\x57\x40\x50\x90\x41\xf2\x8a\xba\x20\x9c\x8f\x6a\x0f\xa6\xe1\xf2\xd2\xd3\x0f\xdb\x59\xfa\x8e\x96\x39\xbe\x48\xc5\x8c\x4b\x73\x8e\x88\x1a\xc9\xd1\xa2\x0b\x9a\xd9\x66\xc5\x92\xf1\x62\x4e\x3d\xa3\x6e\x3d\x33\x38\x8f\xd9\x16\xab\x1e\xd6\x9e\x4e\x69\xf7\xa5\xd5\x94\xde\x8e\xd5\x14\x4a\x62\x7f\x57\x9c\x9f\xd7\x33\x68\x60\xa7\x0e\xee\x14\xdc\xf3\x3c\xfa\xac\xa9\xd0\xc4\x30\xad\x16\x1c\x00\x65\x1a\x57\xef\x39\x02\xad\x52\xcb\x25\xd6\x3c\x4d\x54\x35\xc5\x16\x69\xc9\x2f\x16\x5a\x7d\x39\x2e\x31\xd4\x68\x9f\xa5\xb1\x3d\x93\x7c\xaf\x9c\x9c\x33\xaa\x15\x9a\x88\xac\x95\x12\xc8\x2e\x4f\x14\x20\x66\x8f\x28\x3b\xe8\xfb\x13\xcd\x73\x36\x35\x1a\x55\xce\x6e\x36\x0e\x70\xa5\x4b\x93\xb4\x17\x3b\x52\x52\xf7\x0b\x5c\xe6\x75\xb1\x7f\x8f\xc7\x9b\xdc\xa8\xf3\xd0\x38\x9b\x42\x48\x1b\x6f\x38\xd5\x46\x5f\x99\xaf\x6b\xc9\x03\x35\x1f\xae\x7a\x0f\x95\x94\x14\x2e\xad\x02\x8d\xb1\xb2\xe8\xe5\xa3\xf0\xa9\x0c\xb7\xae\xbe\x0a\x60\x6e\x21\x64\x32\xdf\xaf\x81\xec\xdf\x83\xdf\x7f\xf3\xa7\x22\x17\xc6\xa7\xaa\xc5\xed\x6c\x39\xfc\x03\x78\x8f\xa2\x8a\xbf\x30\x05\xc2\x1d\x79\x66\xd0\x40\x76\x0a\x7f\xbb\x5d\x16\x56\xef\xf1\x68\xac\x0b\xae\x06\x58\x6a\x15\xb9\x69\xc8\x84\x38\xfa\x1a\xd5\x8b\xe6\x66\x34\x10\xad\x54\x99\x67\x37\x54\x72\xc3\xb7\xa9\xf6\x84\x28\xc0\x93\xba\x18\x65\x27\xab\x53\x53\xe7\x3d\x7e\x94\x09\x52\xfb\x44\x3b\x79\xb5\x52\xcc\x67\x32\x32\x01\xdc\x91\xae\xed\x8e\xf9\xa4\xa3\x95\x7a\x9a\x72\x8a\xa3\xcc\xa6\x01\x6a\xac\x99\x30\x8a\x3a\x1c\xa5\x49\x5e\x2e\xb3\xea\x21\x57\x40\xae\xa2\x7a\xb5\xb6\xdb\x29\x8d\x3d\xd6\x04\xa1\x7c\x5c\x98\xea\x1e\x4f\xdd\xa8\xf1\x56\x4b\x87\x81\x82\xcc\x8c\x52\x6e\x00\xf0\x29\xbd\x28\x70\x9e\x8e\x35\x02\xa3\x1a\x80\x47\x39\x95\x3d\x1e\x9b\x6c\xa4\x35\x4c\xe4\xc3\x55\xaf\xdd\x45\x7a\x4b\xb5\x79\x2e\x90\xc6\x0d\x6a\x94\xb6\x32\xb7\x53\x03\xa5\x25\x5a\x74\xe9\x3d\x52\xa1\xa1\xcc\x4e\x6d\xbd\x19\x53\x53\xf9\xc8\xf1\x30\x3e\x28\xbd\xe7\x72\x3b\xa2\xd6\x7e\xe4\xb3\xae\x19\xbb\xb6\x66\x3c\x74\xff\xb4\xe8\x65\x75\xff\xee\x7e\x02\xd3\x28\x02\xe5\xda\xdd\xd4\xe0\x26\x15\xb0\xe1\x28\xc8\xac\xce\xe5\xee\x8d\x2b\xb9\x6e\x20\xe5\xd1\x5f\xde\xbe\x86\xde\x54\xe2\xdb\x90\x2b\x74\xb7\x74\xd9\xe8\x08\x87\x1d\x3a\x66\xed\x39\x92\x51\x7b\x6e\x8d\x33\x96\xb8\x93\x35\xf8\xca\xa2\xc9\xf1\xda\x63\xbc\x1f\xf9\xcd\x46\xbd\x20\x23\xe2\xab\xf6\x69\x4d\xc5\x54\x1c\xa7\x5e\xbd\x63\x88\xf7\xd1\xc1\x17\x1e\xe7\x3e\xff\x64\x59\x2e\x37\x15\x2f\x6f\xb6\x29\x8f\xd0\x8c\x63\x2e\xb9\xff\xff\x28\xa5\x4e\x73\x54\xb8\x23\xd8\xd9\x58\xd4\x6e\xce\x2d\xc6\x8d\x6e\x7f\xc9\xdd\x94\xe2\x0f\x0b\x6d\x5d\xda\xf3\xa3\x5b\x50\x01\x60\x19\xb5\x79\xc3\x29\xf8\xd1\xd1\x3a\xb3\x5b\x83\x57\xa4\xf7\x58\xd5\x36\x3e\x9b\x5e\xbb\xd1\xb9\x66\xff\xa4\x96\xc6\x69\x99\xa8\x4d\xc9\xad\xdd\x46\xf3\x49\x4c\x6b\x56\x67\xec\x42\x85\x4c\x3c\xe4\xb5\x40\x43\x26\xb8\xc8\x02\x09\xb3\xbb\x3c\x6a\x3a\x2a\x4f\x0b\x8b\x86\x60\xde\x41\xa5\x5d\xec\xac\x78\x73\xd2\xc5\x2a\x3b\x9d\xe4\x85\xa0\x5e\xac\x33\x3f\x6d\x62\x35\x9e\x49\xb1\xec\xaa\x67\xf5\x3a\xef\x3d\x1f\xdf\xeb\xb8\x2e\x7f\x3d\x17\x6b\x4f\xc5\x57\x10\xd3\x28\x90\x99\x36\xee\x6b\x95\xb3\x50\x82\x87\x2d\x2a\x82\x2b\xd4\x44\x23\xdc\x61\xb8\x37\x69\xec\x69\xb7\xcf\xbf\x42\x5a\x70\xdd\x1a\x5b\x8b\xe6\x90\x52\xa6\xdb\x96\x19\xf3\xe1\xef\x33\x7e\x11\xae\xbb\xc4\x41\x70\x41\x2e\x93\xae\x93\x79\xb4\x04\x3a\x1a\x46\xb2\xc4\xec\x94\xed\xed\xa3\x9e\xee\x6f\xd9\x3e\x52\xdd\x52\xd9\xbe\x72\xaa\xe7\xcd\x29\x3e\xd5\xf5\xd5\xdb\xab\xa5\x77\x83\xd6\x72\xb9\x6d\xb0\xd4\x92\x33\x4c\xf3\xfe\x27\xc4\xfc\xb2\x7a\xe6\x3a\xe5\x4f\x2c\xa1\x82\x7e\x79\x6a\xd4\x5c\x67\xdb\xd4\x23\xe7\xd7\x71\xe7\xd6\x38\xe7\xe5\xa5\x0d\x6b\x98\x73\x74\x8b\xc7\x07\xdc\x5c\xd3\xad\xb8\x1e\x95\x9a\xfc\xac\x85\x65\x67\xf1\x9a\x3b\xcf\xee\x3e\xdf\xda\x4e\x5f\x70\x95\xb7\xd4\xa7\x26\xba\x99\x15\xb8\xce\xdd\xba\x64\xe0\xff\xee\x86\x18\x9e\xd1\x14\x77\x20\xd9\xde\x36\xc3\x75\x9a\xee\xd6\x3e\x43\x97\x16\xba\xe4\x74\xdc\x76\xd1\x50\xde\x67\x77\xed\xa4\xe1\xaa\x9c\xd0\x2d\x68\x37\x77\xd5\xd0\x3d\x58\xfb\x0b\xa1\xd7\xf0\x6f\x4f\xe9\x3f\xef\xdc\x2f\xbf\x2f\x83\xe7\xdd\x99\x41\x1f\x2e\x7e\xf5\xe1\xe2\xe2\xc6\xad\x83\x3c\xbf\x92\x58\xd1\x61\x92\xe5\x31\xaa\xb4\xeb\xbb\x98\xb7\xef\x30\xd1\x18\x32\x8b\xd1\xc4\x21\xb8\x2a\xde\x3a\x06\x74\x08\x81\x7b\x1f\x15\xac\x3c\xf5\x06\x49\xb8\x34\x16\x59\x54\x6f\x3c\xad\x46\xd3\x22\x64\x42\xb6\x6c\x2c\x4a\xfb\xbd\x12\x69\x8c\x33\xc1\x78\xcd\x4b\xbe\x96\xad\x92\x74\x2d\xb8\xd9\x5d\xf1\x72\xb2\xee\x9d\xec\xa2\x4c\xc9\xbd\x77\x44\xfa\x7f\x9d\xfb\x32\x21\x1c\x9c\xcb\x21\x02\x31\xca\x59\x21\x5e\x89\x02\xaf\x59\xd8\x22\x90\xc6\x2d\x37\xb6\xee\x5e\xeb\x49\x23\xe8\xa7\xba\x37\x7f\x89\x56\x8f\x3c\xca\x5e\x73\xe7\x2f\x8b\x3c\xe2\x26\x07\xae\x64\x15\x2e\xea\xda\x9b\x1e\x4f\xaf\xf2\x71\x7b\xca\x61\x51\xa4\xd1\x34\x64\xa4\x0e\xa1\x26\x64\x2f\x5a\xce\xa5\xc1\x30\xd5\x0d\xf9\xa0\x4b\x50\x50\x7a\xcb\x24\xff\xd9\x29\xef\x45\xec\x98\x96\x57\xaa\x2f\x75\x23\x9d\x4a\x0a\x15\x0b\x7f\xf4\xba\x8b\xc9\x94\x57\xd4\x5d\x1d\xb4\xd9\xa8\xa7\x52\x09\x62\xea\x48\xa2\x31\xc4\x35\xae\x6d\xd0\x49\x28\x52\x63\xab\xf4\xd0\x16\x00\x66\x7e\x61\x0e\xf8\xa2\x0c\x4b\xe5\x81\xd2\xe1\x0e\x9d\x3b\x57\x21\x2e\x4e\xfb\xb9\x35\x49\x01\x34\x46\xf1\x93\x09\x91\xbd\x03\xad\x91\xa0\x52\xbc\x92\xe3\x5e\xca\x51\x7b\xcb\x5a\x12\x70\x56\x24\x52\x0f\x0b\x68\xf3\xe8\x1c\xd1\x74\x5b\x5f\x42\xb6\x1a\x70\x4e\xe3\x93\x4a\xa5\x5d\x28\x2e\x6b\xbd\xa1\x33\xa9\x15\x4d\x7c\x2e\x11\xfb\x92\xc5\x0e\xfe\xf5\xcc\xd5\x4d\x25\xc6\xc8\x2d\xae\x7c\xe0\xb6\xac\x72\x9f\xa6\xc0\x50\x7f\xc9\xe2\xe0\xa8\x55\x11\xa9\xcd\x41\x6e\xfd\xc2\x3a\x63\x6a\x36\xa5\xf6\x37\x08\x8d\x6f\x0f\x3a\xf2\x76\xbe\x16\x6d\x42\xc2\x74\xeb\x9d\x52\xcd\x5f\xf8\x56\xa6\xb5\xca\x6b\xba\x09\x6b\x58\x9c\x68\xb5\xe1\xa2\xc2\x0a\xcb\x3d\x9c\x66\xdc\x2e\xfc\xd4\x02\xec\xd0\x41\x8b\x8d\x6b\x7c\x68\x82\xf1\x60\x0f\xa6\xb1\xe1\xe2\xf2\x02\x95\x9e\x05\x37\x77\x04\xe3\x02\x16\xf6\x9a\x30\x77\xc2\x69\x5e\x6f\x89\x39\xa2\xdc\x5c\x8d\xa1\x3b\x6d\x7a\x8d\xbe\xbd\xa2\x2e\xd9\xec\xfa\x22\xef\xc9\x65\xa5\x3b\x98\x32\xe7\x97\xf5\x9a\xbb\x06\x70\x1b\x3f\x23\x6a\xb7\x64\x90\x0a\xae\x1c\x4f\xa5\x9c\x51\xef\x3c\x1d\x9a\x97\x2f\xa3\x73\xd3\x3c\x72\x96\xa7\x1f\x71\x94\xca\xbd\x54\x07\x39\xf2\x0d\xed\x04\xac\xae\x8c\x6b\xcd\x61\xb2\x24\xdb\xf3\xa2\x62\xc5\xc3\x3a\xb4\xa9\xc3\xa1\x5f\x89\x37\x75\x6b\x4a\x88\x53\xb5\x76\x0a\xe8\x21\xa7\x95\xc7\xd1\x43\x4e\xdd\xe8\x21\xa7\x95\xa3\x87\x9c\x96\x46\x0f\x39\xed\x21\xa7\x3d\xe4\xd4\x8d\x1e\x72\xda\x2a\x49\x0f\x39\xed\x21\xa7\xaf\x40\xaf\x87\x9c\xf6\x90\xd3\x0e\x82\xf6\x90\xd3\x8b\xd1\x43\x4e\xb3\xd1\x43\x0a\x2f\x46\x0f\x39\x2d\x8c\xde\x3e\x2e\x46\x0f\x39\x85\x1e\x72\x5a\x3d\x7a\xc8\x69\x0f\x39\xad\x1e\xbf\x31\x0c\x59\x0f\x39\xed\x21\xa7\x55\xa3\x87\x9c\xf6\xe1\xa2\x87\x9c\x5e\x39\xa9\x87\x9c\x76\xde\xaa\x87\x9c\xf6\x90\xd3\xf3\xe8\x21\xa7\x97\xa3\x87\x9c\xfe\x6f\x41\x4e\xfd\x05\x71\x85\x1b\x75\xc3\x9b\x56\x49\x97\x13\xcd\x66\xae\xb3\x28\x91\x83\x60\x2a\xcf\x80\x9d\x7f\x44\x8f\x59\x60\xee\x65\x2f\xe3\x12\xdc\x0f\xe1\x55\x15\x70\x6d\x01\x42\x30\x63\x57\x9a\x49\xc3\xf3\xdf\x08\xed\x04\x88\xfa\xc8\x8c\x75\xd6\x92\x87\xb0\x4c\x14\x7b\x22\x85\x91\xff\xa5\x3e\x25\x31\xc3\x09\xd5\x3b\x9c\x02\x26\x5d\x81\x55\x57\x82\xfa\x17\xfa\x13\x88\x98\xc5\x11\x6d\x5b\x97\xa2\xdb\x5c\x97\xc4\xfd\xec\xee\xa4\x3a\x8b\xba\x72\x3f\xee\x78\x16\x97\x9b\x82\xbc\x07\x66\x4e\x3f\x23\xf8\x4b\xf3\x1e\xa3\x31\xb5\x58\xa1\x8b\x0b\x98\x5d\x1a\x33\x39\xd2\xc8\x22\xf7\x03\xc0\xd9\x62\xe0\x32\xe2\x21\x73\xbf\xcb\x18\xa1\x65\x5c\x18\x60\xeb\xa6\xba\x83\xce\xf7\x7c\xaa\x75\x42\x76\x80\x26\x33\xd3\x15\x6c\xe7\xca\x7f\x9a\x5e\xcc\x91\x5e\xe1\x6f\x4d\x76\x16\x2f\xe7\xa8\x0a\xbc\x56\xc3\x51\x86\x59\xcb\x5a\x93\x13\x33\x37\xfe\xf7\xb0\x37\xb0\xd2\x29\xde\xc0\x07\x26\x0c\xde\xc0\x67\x0f\xe3\x7b\x36\x5f\x4d\xf8\xeb\xb2\x9e\x8e\x89\xdb\xbd\xf8\xcb\xb1\x27\xde\x9e\xb9\x7d\x33\xb8\xb0\xd6\x8f\x6b\xe1\xd9\xcf\x04\x61\xf7\x18\xff\x1e\xe3\x5f\x7c\xd0\x63\xfc\x7b\x8c\x7f\x99\xfb\x1d\x33\x6d\x08\xff\x0a\x1d\xb9\xdf\xc7\xae\xd2\x49\x83\x28\xfd\xd7\x09\xfa\xaf\x13\xf4\x5f\x27\x78\xd5\xaf\x13\x34\x40\xa6\x6a\x4d\xb8\x92\xd8\xc5\x87\xfe\x8b\x04\x05\x61\x8d\x55\x9a\x8a\xe6\xc2\x27\xe9\xfa\xc2\x19\xb2\x5a\x10\xfe\xf9\xaf\xc1\xbf\x03\x00\x00\xff\xff\x78\x08\x72\x7e\x6a\x65\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x1c\xcb\x8e\xe3\xb8\xf1\xee\xaf\x28\x8c\x0f\xb3\x0b\xb4\xe5\xdd\x3c\x90\xc4\x39\x04\x5e\xcf\x0c\xe2\xf4\x4c\x77\xa3\xed\xd9\xcd\x1e\x69\xa9\x6c\x73\x2d\x91\x0a\x49\xb5\xc7\x1b\xe4\xdf\x83\x2a\x4a\xb6\xdc\xd6\xab\x1f\x8b\x04\x03\xf1\xd2\x6d\x89\x2c\xd6\xfb\x41\x16\x34\x84\xd1\xeb\x8d\xc1\x10\x3e\xca\x10\x95\xc5\x08\x9c\x06\xb7\x45\x98\xa6\x22\xdc\x22\x2c\xf4\xda\xed\x85\x41\xf8\xa0\x33\x15\x09\x27\xb5\x82\x6f\xa6\x8b\x0f\xdf\x42\xa6\x22\x34\xa0\x15\x82\x36\x90\x68\x83\x83\x21\x84\x5a\x39\x23\x57\x99\xd3\x06\x62\x0f\x10\xc4\xc6\x20\x26\xa8\x9c\x0d\x00\x16\x88\x0c\xfd\xe6\x76\x39\x9f\xbd\x87\xb5\x8c\x11\x22\x69\xfd\x22\x8c\x60\x2f\xdd\x76\x30\x04\xb7\x95\x16\xf6\xda\xec\x60\xad\x0d\x88\x28\x92\xb4\xb1\x88\x41\xaa\xb5\x36\x89\x47\xc3\xe0\x46\x98\x48\xaa\x0d\x84\x3a\x3d\x18\xb9\xd9\x3a\xd0\x7b\x85\xc6\x6e\x65\x1a\x0c\x86\xb0\x24\x32\x16\x1f\x0a\x4c\xac\x07\xcb\x7b\x3a\x0d\x3f\xeb\x2c\xa7\xa1\x44\x6e\xce\x85\x2b\xf8\x11\x8d\xa5\x4d\x7e\x17\x7c\x37\x18\xc2\x37\x34\xe5\x4d\xfe\xf2\xcd\xb7\x7f\x85\x83\xce\x20\x11\x07\x50\xda\x41\x66\xb1\x04\x19\xbf\x84\x98\x3a\x90\x0a\x42\x9d\xa4\xb1\x14\x2a\xc4\x13\x59\xc7\x1d\x02\x60\x04\x08\x86\x5e\x39\x21\x15\x08\x26\x03\xf4\xba\x3c\x0d\x84\x1b\x0c\x07\x43\xe0\xb1\x75\x2e\x9d\x8c\xc7\xfb\xfd\x3e\x10\x8c\x6e\xa0\xcd\x66\x5c\x50\x37\xfe\x38\x9f\xbd\xbf\x59\xbc\x1f\x31\xca\x83\x21\x7c\x56\x31\x5a\x0b\x06\xff\x95\x49\x83\x11\xac\x0e\x20\xd2\x34\x96\xa1\x58\xc5\x08\xb1\xd8\x93\xe0\x58\x3a\x2c\x74\xa9\x60\x6f\xa4\x93\x6a\x73\x05\x36\x97\xfa\x60\x78\x26\x9d\x13\xbb\x0a\xf4\xa4\x3d\x9b\xa0\x15\x08\x05\x6f\xa6\x0b\x98\x2f\xde\xc0\x0f\xd3\xc5\x7c\x71\x35\x18\xc2\x4f\xf3\xe5\xdf\x6f\x3f\x2f\xe1\xa7\xe9\xfd\xfd\xf4\x66\x39\x7f\xbf\x80\xdb\x7b\x98\xdd\xde\xbc\x9b\x2f\xe7\xb7\x37\x0b\xb8\xfd\x00\xd3\x9b\x9f\xe1\x7a\x7e\xf3\xee\x0a\x50\xba\x2d\x1a\xc0\x2f\xa9\x21\xfc\xb5\x01\x49\x8c\xc4\x88\x64\x5a\x28\x50\x81\x00\xe9\x07\xfd\xb6\x29\x86\x72\x2d\x43\x88\x85\xda\x64\x62\x83\xb0\xd1\x0f\x68\x14\xa9\x47\x8a\x26\x91\x96\xc4\x69\x41\xa8\x68\x30\x84\x58\x26\xd2\xb1\x16\xd9\x4b\xa2\x68\x9b\xd7\xb4\xad\x81\x48\x65\xae\x4e\x13\x10\xa9\xc4\x2f\x0e\x15\x63\x13\xec\xfe\x6c\x03\xa9\xc7\x0f\xdf\x0f\x76\x52\x45\x13\x98\x65\xd6\xe9\xe4\x1e\xad\xce\x4c\x88\xef\x70\x2d\x15\x6b\xfe\x20\x41\x27\x22\xe1\xc4\x64\x00\x20\x94\xd2\x39\xf2\xf4\x13\xbc\xd5\xe9\x38\x46\x33\xda\xa0\x0a\x76\xd9\x0a\x57\x99\x8c\x23\x34\x0c\xbc\xd8\xfa\xe1\xbb\xe0\x0f\xc1\xf7\x03\x80\xd0\x20\x2f\x5f\xca\x04\xad\x13\x49\x3a\x01\x95\xc5\xf1\x00\x20\x16\x2b\x8c\x73\xa8\x22\x4d\x27\x10\x8a\x04\xe3\xd1\x6e\x00\xa0\x44\x82\x13\x90\xca\xe1\xc6\xf0\xea\x34\x16\x8e\x8c\xd1\x06\x3c\xa9\xa4\x92\x03\x12\x06\x01\xd9\x18\x9d\x15\x40\xca\xef\x3d\xb4\x02\x7b\xe1\x70\xa3\x8d\x2c\x7e\x8f\x60\x47\xf3\xf3\xff\xc3\xe3\xff\x9e\x43\xf3\x13\x02\x77\x39\x02\xfc\x36\x96\xd6\x5d\xd7\xcd\xf8\x28\xad\xe3\x59\x69\x9c\x19\x11\x57\x93\xc1\x13\xec\x56\x1b\x77\x73\x42\x6e\x04\x32\xf5\x2f\xa4\xda\x64\xb1\x30\x95\x6b\x07\x00\x36\xd4\x29\x4e\x80\x97\xa6\x22\xc4\x68\x00\x90\x73\x9e\x41\x8d\x4a\x5e\xec\xce\x10\x0c\x33\xd3\x71\x96\xa8\xe3\x46\x11\xda\xd0\xc8\xd4\xb1\xac\xc8\x75\x95\x36\x82\x62\x27\x48\xb7\xc2\xe2\xc0\xfb\x83\x5f\xac\x56\x77\xc2\x6d\x27\x10\x58\x27\x5c\x66\x83\xf2\x5b\x2f\xb0\xbb\xd2\x13\x77\x20\x14\xc9\x5a\xd5\x66\x70\x9a\xf2\xf0\xbd\xa7\x30\xdc\x62\x22\x26\xf9\x5c\x9d\xa2\x9a\xde\xcd\x7f\xfc\xfd\xe2\xec\x31\x9c\xa3\x59\xc1\x6b\x72\x09\x64\x4c\x7e\xdd\xd1\x3e\x6b\x39\xee\xc7\xf4\x6e\x7e\xfc\x95\x1a\x9d\xa2\x71\x47\x85\xf0\xa3\x64\x44\xa5\xa7\x8f\xf0\x79\x4b\x28\xe7\x9e\x3b\x22\xeb\x41\x8f\x4c\x2e\x09\x8c\x72\x2a\xbd\x97\x95\xe4\x1c\xc9\xc9\xa0\xf2\xf6\x74\x06\x18\x68\x92\x50\xa0\x57\xbf\x60\xe8\x02\x58\xa0\x21\x30\xa4\x22\x59\x1c\x91\xd1\x3d\xa0\x71\x60\x30\xd4\x1b\x25\x7f\x3d\xc2\xb6\x45\x04\x8d\x85\xc3\x5c\xef\x4e\x83\x25\x4f\x91\xec\x41\xc4\x19\x5e\x91\x3f\xe2\x20\x60\x90\x76\x81\x4c\x95\xe0\xf1\x14\x1b\xc0\x27\x6d\x90\x23\xdf\x84\x43\x80\x9d\x8c\xc7\x1b\xe9\x0a\xe7\x11\xea\x24\xc9\x94\x74\x87\x71\x29\xfa\xda\x71\x84\x0f\x18\x8f\xad\xdc\x8c\x84\x09\xb7\xd2\x61\xe8\x32\x83\x63\x91\xca\x11\xa3\xae\xd8\x81\x04\x49\x34\x34\xb9\xbb\xb1\x6f\xcf\x70\xbd\xd0\x16\x3f\xd8\x0c\x1b\x24\x40\x46\x48\x3a\x20\xf2\xa5\x9e\x8a\x13\xa3\xe9\x11\x71\xe7\xfe\xfd\x62\x09\xc5\xd6\x2c\x8c\xc7\xdc\x67\xbe\x9f\x16\xda\x93\x08\x88\x61\x52\xad\xd9\x6d\x53\xdc\x35\x3a\x61\x98\xa8\xa2\x54\x4b\xe5\xf8\x47\x18\x4b\x54\x8f\xd9\x6f\xb3\x55\x22\x9d\x0f\x8a\x68\x1d\xc9\x2a\x80\x19\x7b\x54\x58\x21\x64\x69\x24\x1c\x46\x01\xcc\x15\xcc\xc8\xf3\xcc\x04\x85\xea\xdf\x58\x00\xc4\x69\x3b\x22\xc6\x76\x13\x41\x39\x18\x3c\x9e\xec\xb9\x56\x7a\x51\xf8\xe2\x1a\x79\x55\x58\xf0\x22\xc5\xf0\xcc\x7a\x22\xb4\x9c\x40\x90\x93\x41\xb2\x8a\x3a\x27\x5c\x8c\x6a\x0b\xa6\xc1\x71\xe9\xf1\xc3\x76\x94\x7e\xa0\x65\x8c\x17\xb1\x58\x48\x65\x4f\x1e\xd1\x20\x19\x5a\x74\x01\x33\xdf\xac\x9c\x32\x5e\xcc\xa9\x47\x94\xd7\x0b\x8b\xf3\x44\x6c\xb0\xea\x65\xad\x74\xce\x76\x5f\x38\x43\xe1\xed\x50\x0d\xe1\x8c\xec\x1f\xca\xf3\x8b\x7c\x06\x2d\x6c\xf5\x9e\xa5\xc0\xef\x0b\xef\xb3\xa2\x44\x13\xc3\xac\x9a\x70\x00\x54\x59\x52\xbd\xe7\x08\x8c\xce\x9c\x54\x58\xf3\x36\xd5\xd5\x10\x5b\xa8\xdd\x09\x25\x77\x9a\x71\x9c\x51\x9c\x6f\x62\xd9\x4a\xeb\x18\xc5\xa5\x34\x00\x12\xf1\x80\xaa\x03\xaf\x3e\xd1\x3c\xd6\x87\xd1\xa8\x72\x76\xb3\x60\x81\xd3\x8e\x05\x86\x06\x5d\xdd\x7b\xb8\x0c\xc8\x7e\x01\x47\x4d\xf6\xdb\x3b\x3c\x5c\x15\x0a\x59\xb8\xb5\xd9\x14\x42\xda\x78\x2d\x29\xaf\xf9\xc6\x7e\x5b\x0b\x1e\xa8\x70\xe0\xcc\x3b\xd4\x4a\x91\xab\x73\x1a\x0c\x26\xda\xa1\xa7\x8f\x5c\x9f\xb6\xd2\x71\x6e\x14\xc0\xdc\x41\x28\x54\xb1\x5f\x03\xd8\x7f\x06\x7f\xfc\xee\x2f\x65\x2c\xac\x0f\x33\x77\xd7\xb3\xc5\xf0\x4f\xe0\xad\x81\xb2\xf5\xd2\x14\x08\xb7\x64\x55\x41\x03\xd8\x29\xfc\xe3\x7a\x51\x5a\xbd\xc3\x83\x75\xec\x18\x2d\x88\xcc\x69\x32\xb1\x50\xc4\xf1\xc1\xe7\x97\x9e\x34\x9e\xd1\x00\xb4\x92\x65\x1e\xdd\x50\xab\xb5\xdc\x64\xc6\x03\x22\xe7\x4c\xec\x12\x14\x59\x9c\xc9\x6c\x9d\xe6\xfb\x71\x0e\x90\x4a\x1f\xda\xc9\xb3\x95\xfc\xb5\x50\x91\x0d\xe0\x86\x78\xed\xb6\xc2\x07\x0c\xa3\xf5\xe3\x70\x51\x1e\xe7\x68\x5a\xa0\xa2\x58\xc4\x56\x53\x75\xa2\x0d\xd1\x2b\x55\x1e\xf9\x0b\x06\x14\x2c\xaa\x67\x6b\xbb\x9e\xd2\xd8\x61\x8d\x03\x29\xc6\x85\xaa\xee\xf0\x58\x49\x5a\xaf\xb5\x24\x0c\x8c\x49\xcd\x28\x5c\x06\x00\x9f\xb2\x8b\xe4\xe4\xf1\x58\x21\x08\x8a\xdf\x32\x2a\xa0\xec\xf0\xd0\xa4\x23\xad\x6e\xa2\x18\x9c\x79\x76\x27\xe9\x2d\xe5\xd5\x05\x41\x06\xd7\x68\x50\xb9\xca\xb8\x4c\xc5\x8f\x51\xe8\x90\x43\x73\xa4\x43\x4b\x51\x99\x4a\x72\x3b\xa6\x82\xf0\x41\xe2\x7e\xbc\xd7\x66\x27\xd5\x66\x44\x65\xf9\xc8\x47\x4c\x3b\xe6\x92\x64\x3c\xe4\x3f\x2d\x7c\x59\xde\xbe\xbb\x9d\xc0\x34\x8a\x40\x73\xa9\x9a\x59\x5c\x67\x31\xac\x25\xc6\xa4\x56\xa7\x54\xf5\x8a\xd3\xa5\x2b\xc8\x64\xf4\xb7\xb7\xaf\xc1\x37\x9d\xfa\x12\xe2\x09\xbc\x5b\x70\x24\x39\xc0\x7e\x8b\x8c\xac\x3b\x79\x32\x2a\xad\x9d\x65\x65\x49\x3a\x69\x83\xcf\x0a\x9a\x0c\xaf\xdd\xc7\xfb\x51\x9c\x4a\xd4\x13\x32\x22\xbc\x6a\xdf\xd6\x64\x3b\xe5\x71\xac\xb3\x9f\xe0\xe2\xbd\x87\xf0\x89\x43\xa9\x4e\xe7\x63\x87\x42\xc5\x38\x48\x95\x4f\x60\x36\x99\x8c\xd0\x8e\x13\xa9\xa4\xff\x7f\x94\x51\xb9\x38\x2a\x01\xd8\xba\x24\xae\x37\x1c\xe9\x30\x69\x74\x00\x97\xc1\x6f\x4a\x9e\x48\x84\xee\x98\xa8\x89\x1c\x77\x91\xbf\x68\x80\xd6\xcd\xe9\xc0\x11\xd4\xbc\x41\x4a\x7e\x74\xd4\xde\xfc\x44\xe0\x15\xe1\x3d\x54\x95\x84\xcf\x86\xd7\xae\x94\x5c\xc8\x1f\xd9\xd2\x38\x2d\x27\xb5\x29\xf8\xb5\xeb\x70\x31\x49\x18\x23\xea\x8c\x21\xd6\xa1\x88\xef\x8b\x5c\xa1\x21\x52\x5c\x68\x7b\x2a\xdc\xb6\xf0\xaa\x0c\xe5\x71\xe2\xd1\xe0\xec\x3b\xb0\xb4\x8b\x9e\x95\x4f\x45\xba\x68\x65\x27\x49\xd6\x98\xf5\x09\x9f\x36\xb2\x1a\x65\x62\xd1\x51\x15\xdb\x80\xe6\xd9\xfe\xd3\x22\x60\x85\x58\x9c\x0c\xcc\x38\xb5\xf9\x24\x52\xf2\xc0\x8b\x63\x64\xe5\x54\xa4\x29\xa9\x29\x6a\x9f\x53\x2e\x53\xe0\xf2\xd2\x0c\x23\x2c\x30\xba\xc6\xc3\x3d\xae\x9f\x12\x5e\x38\xa9\x20\xff\x93\xe7\x1c\xe2\x44\x5e\x73\xaa\xd0\xd5\x0d\x75\xc8\x7f\x2e\xb0\x2a\x72\xa0\x63\xd6\xd3\x8c\x0a\x3c\xc5\xe7\x74\xc9\x5e\x2e\x10\xfa\x3f\xcb\x60\xe0\x19\x59\x4c\x07\x90\xed\x79\x0e\x3c\x8d\xd3\xdd\xf2\x1d\xe8\x92\xf3\x9c\x19\x9d\x74\x5d\x38\x54\x24\x46\x5d\x53\x1f\xe8\x9c\xfe\x40\xc7\x68\xd3\x96\x06\x41\xd7\x30\x02\x79\x06\xff\x1a\xf6\xed\x21\xfd\xef\x8d\xfb\xe5\x05\x0e\x3c\xaf\xc8\x81\xde\x5d\x7c\xf5\xee\xe2\xa2\x44\xea\x40\xcf\x57\xe2\x2b\x3a\x4c\x72\x32\x41\x9d\x75\x3d\x3c\x7b\xfb\x0e\x53\x83\xa1\x70\x18\x4d\xf8\xba\xbc\xe2\x88\x37\x20\x21\x04\x7c\x80\x18\x2c\x3d\xf4\x06\x4a\xa4\xb2\x0e\x45\x54\xaf\x3c\xad\x4a\xd3\x42\x64\x4a\xba\x6c\x1d\x2a\xf7\xa3\x8e\xb3\x04\x67\xb1\x90\x35\x27\xaa\x2d\x5b\xa5\xd9\x2a\x96\x76\xfb\x84\x93\xe0\xba\x03\xf0\xbb\x73\x48\x7c\xc8\x8b\xf4\x7f\x9d\xf9\x8a\x38\xe6\xbb\x73\x6e\xbf\xc0\xa8\x40\x85\x70\x25\x08\xb2\x66\x61\x0b\x41\x06\x37\xd2\xba\xba\x42\xe3\x8c\x92\xfb\x7c\x2a\x1f\xd5\xa6\x46\x3f\x50\xa1\xec\x8f\xc8\xf2\xd3\x3d\x7f\xbd\x59\xdc\x12\xe6\x19\x2e\x9a\x1a\x82\x8a\xad\x9f\x79\xe6\x2b\xa2\xc8\xa0\x6d\x88\x48\x1d\x5c\x4d\x28\x5e\xb4\x5c\x2a\x8b\x61\x66\x1a\xe2\x41\x17\xa7\xa0\xcd\x46\x28\xf9\x2b\x33\xef\x45\xe8\xd8\x96\x33\xf0\x97\x9a\x91\xc9\x14\xb9\x8a\x3b\x2f\x7a\xd3\x45\x65\xce\x57\xd4\x1d\xf0\xb7\xe9\xa8\x87\x52\x79\x63\xdc\x11\x44\xa3\x8b\x6b\x5c\xdb\xc0\x93\x30\xce\xac\xab\xe2\x43\x9b\x03\x98\xf9\x85\xc5\xed\x3a\x45\x58\x4a\x0f\xb4\x09\xb7\xc8\xe6\x5c\x75\xbd\x75\xdc\x8f\xd7\xa4\xa5\x1b\x7a\xf2\x9f\x22\x8e\xf3\x43\xeb\x1a\x0a\x2a\xc9\x3b\x33\xdc\x4b\x3a\x6a\x8f\xb2\xce\x08\x9c\x95\x81\xd4\xdf\xe3\xb4\x59\x74\x71\x7d\x7c\x5d\x9f\x42\xb6\x2a\x70\x01\xe3\x93\xce\x94\xbb\xd3\x52\xd5\x5a\x43\x67\x50\x4b\x9a\xf8\x5c\x20\xee\x25\x8b\xf9\xae\xfd\x99\xab\x9b\x52\x8c\x11\x2f\xae\x7c\xc1\x5b\x56\x99\x4f\x93\x63\xa8\x3f\xd4\xe2\xde\x9f\x2a\x8f\xd4\x66\x20\xd7\x7e\x61\x9d\x32\x35\xab\x52\xf9\xa6\xad\x9a\x7d\x8d\x47\xb4\x1d\x71\x3b\x9d\xd1\x35\x5d\x5d\x76\xab\x9d\x32\x23\x5f\x78\x4c\xd6\x9a\xe5\x35\x9d\x3c\x36\x2c\x4e\x8d\x5e\xcb\xb8\x42\x0b\xcf\x6b\x38\x23\xa4\xbb\xf3\x53\x4b\x3d\x1e\xdc\xc7\x65\xb9\xf0\xa1\x09\xd6\xdf\xce\x09\x83\x80\x4a\xac\xe2\xca\x9c\xfa\xa2\x05\x30\x77\x6e\x2c\x82\x71\xa9\xf1\xe8\x29\x6e\xee\xd8\x14\xf3\x74\x4d\x2c\xda\xf7\xec\x93\x1b\x16\x8e\x9b\x3e\x85\xdf\x9e\x51\x97\x68\x76\x3d\x59\x7d\x74\x58\xc9\x82\x39\xc7\xfc\x32\x5f\xe3\x63\x00\xde\xf8\x19\x5e\xbb\x25\x82\x54\x60\xc5\x38\x9d\xc5\x8c\x7a\xe3\xe9\x50\xbc\x7c\x19\x9d\x8a\xe6\x11\x6b\x9e\x79\xc0\x51\xa6\x76\x4a\xef\xd5\xc8\x17\xb4\x13\x70\xa6\xd2\xaf\x35\xbb\xc9\x33\xda\x9e\xe7\x15\x2b\x5e\xd6\xb5\xf6\x70\xd3\xdf\x13\x9b\x7b\x78\xcd\x59\x7b\x8f\x5e\x31\x03\xfa\xfe\x9e\x4a\x71\xf4\xfd\x3d\x3c\xfa\xfe\x9e\xbe\xbf\xa7\xef\xef\xe9\xfb\x7b\xfa\xfe\x9e\xbe\xbf\xa7\xef\xef\xe9\xfb\x7b\x6a\x46\xdf\xdf\x73\x81\x55\xdf\xdf\xd3\xf7\xf7\xf4\xfd\x3d\x8d\xa3\xef\xef\xe9\x2f\xec\xdb\x80\xf6\xfd\x3d\x7d\x7f\x4f\xdf\xdf\xd3\xbb\x8b\xbe\xbf\xa7\x7d\xc7\xbe\xbf\xa7\xef\xef\xe9\xfb\x7b\x9e\x4e\x39\xf4\xfd\x3d\xd5\x13\xfa\xfe\x9e\x8e\x3c\xf9\x2a\xfa\x7b\x7c\xc5\x5e\x61\x46\xdd\x9a\x7b\xaa\xa8\x2b\x80\xe6\x33\x57\xb9\x97\x28\x6e\x1c\x2b\x65\x20\x4e\x9f\x87\x10\x0e\x04\x9f\xce\x0b\xa9\x80\x3f\xf1\x50\x95\xc0\xb5\x39\x88\x58\x58\xb7\x34\x42\x59\x59\x7c\xfd\xa6\xd3\xed\xf3\x47\x61\x1d\x6b\x4b\xe1\xc2\x72\x52\xdc\x11\x14\x46\xfe\x1b\x14\x5a\x61\x7e\x29\x5b\x6f\x70\x1a\x84\xe2\x04\xab\x2e\x05\xf5\x37\x30\x13\x88\x84\xc3\x11\x6d\x5b\x17\xa2\xdb\x4c\x97\xc8\xfd\xcc\x1f\xb4\xe8\x4c\xea\x92\x3f\x5b\x72\x22\x57\xda\x12\xbd\x7b\x61\x8f\x1f\xc8\xf8\xad\x71\x4f\xd0\xda\xda\x8b\xd9\x8b\x03\x98\x6d\x96\x08\x35\x32\x28\x22\xfe\xb4\x55\xbe\x18\xa4\x8a\x64\x28\xf8\x8b\x23\x11\x3a\x21\x63\x0b\x62\xd5\x94\x77\x90\x7c\x4f\x52\xad\x23\xb2\x43\x1f\x98\xb0\x5d\x3b\x1b\x38\xfd\xa7\xe9\xe5\x18\xe9\x19\xfe\xd6\xe6\xb2\x78\x39\x46\x55\x9d\x02\x35\x18\xe5\x0d\x02\x79\x69\x72\x44\xe6\xca\x7f\xe9\x6d\x0d\x4b\x93\xe1\x15\x7c\x10\xb1\xc5\x2b\xf8\xec\x7b\x26\x9e\x8d\x57\x53\xb3\xdb\x39\x9f\x0e\x29\xef\x5e\xfe\x26\xd2\x11\xb7\x67\x6e\xdf\xdc\xc9\x51\x6b\xc7\xb5\xbd\x70\xcf\xec\x78\xeb\x1b\x2a\xfb\x86\xca\xf2\x8b\xbe\xa1\xb2\x6f\xa8\x3c\xc7\x7e\x2b\x6c\x5b\x3b\x65\x05\x8f\xf8\xcb\x6f\x55\x3c\x69\x20\xa5\xef\xdd\xec\x7b\x37\xfb\xde\xcd\x57\xed\xdd\x6c\xb8\xc3\xae\x55\xe1\x4a\x60\x17\x0f\x7d\xd7\x66\x89\x58\xeb\xb4\xa1\xa4\xb9\xf4\x24\x5b\x5d\x18\x43\x9e\x0b\xc2\xbf\xff\x33\xf8\x6f\x00\x00\x00\xff\xff\x8f\x81\x9f\xfa\x44\x58\x00\x00"), }, "/crd/bases/camel.apache.org_integrations.yaml": &vfsgenÛ°CompressedFileInfo{ name: "camel.apache.org_integrations.yaml", @@ -467,9 +467,9 @@ var assets = func() http.FileSystem { "/traits.yaml": &vfsgenÛ°CompressedFileInfo{ name: "traits.yaml", modTime: time.Time{}, - uncompressedSize: 41625, + uncompressedSize: 41938, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\x23\x37\xb6\xd8\xf7\xf9\x15\x28\xde\x54\x8d\xa4\x22\x29\xd9\x9b\xdd\x75\x94\x38\x5b\xf2\xcc\x78\x2d\x7b\x1e\xca\x48\xeb\xad\xd4\xc4\xb5\x04\xbb\x0f\x49\x8c\xd0\x40\x2f\x80\x96\x86\x9b\x9b\xff\x9e\xc2\x39\x78\x35\xd9\xa2\xa8\xf1\xc8\xb1\x52\x77\xf7\x83\x47\x52\x37\x70\x70\x70\xde\xaf\x76\x86\x0b\x67\x4f\x9f\x4d\x98\xe2\x0d\x9c\x32\xbe\x58\x08\x25\xdc\xfa\x19\x63\xad\xe4\x6e\xa1\x4d\x73\xca\x16\x5c\x5a\xf0\xbf\x31\x7a\x21\x24\xd8\xd3\x67\x8c\x4d\xd8\x4f\xdd\x1c\x8c\x02\x07\x96\x7e\x54\xdc\x89\x1b\xc0\x7f\xbf\x6b\x41\x5d\xae\xc4\xc2\x3d\x63\xac\x06\x5b\x19\xd1\x3a\xa1\xd5\x29\x3b\x93\x52\xdf\x5a\x56\x69\x65\xfd\xce\x4a\xa8\x25\xbb\x5d\x89\x6a\xc5\x94\xae\xc1\x32\xb7\x02\x26\x94\x83\xa5\xe1\xfe\x05\xd6\xea\xfa\xc0\x1e\x32\x6e\x80\x81\x14\x4b\x31\x97\x7e\x03\xc6\x9c\x66\x73\x60\xb6\x5a\x41\xdd\x49\xa8\x99\x56\x63\x36\xe7\x16\xff\xc5\x24\x9f\x83\xb4\xfe\x5f\x7e\x39\xbf\xf0\x98\x69\xc3\x6e\x85\x5b\xe1\xe2\x66\xd2\xea\x3a\x9d\x94\x71\x55\xe3\x9a\x5c\x39\x31\x89\xbf\x1d\x5c\xae\xd5\xb5\x07\x91\x3b\x04\x88\x4b\x03\xbc\x5e\x33\xd3\x29\x3c\x47\xb1\x9f\x9d\xe2\x8a\xe7\xee\xb9\x65\xb5\xb0\x7c\xee\x61\x9c\xaf\x59\x0d\x0b\xde\x49\x37\x25\x5c\xb6\x60\x9c\x88\xd8\x24\xf4\x83\xc2\x67\xe9\x8c\xeb\x16\x4e\xd9\x5c\x6b\x89\x3f\xf6\xf0\xf8\x82\x2b\x8f\x80\xce\x83\xe8\x74\x78\xcd\x1f\x32\xec\xc6\x38\xc3\x9b\x9d\x7a\x8c\xd3\x3f\x2d\xb3\x2b\x0f\xb6\x5b\x09\x7f\x01\x4d\xa3\x15\xae\x9b\x40\x59\x4f\x0b\x40\x5a\x5d\x4f\x0a\x5a\xd8\x0d\xcd\x99\xbc\xe5\x6b\xbf\xe8\x44\xea\x8a\x3b\xb0\xac\xe9\xa4\x13\xad\x04\x66\xa0\x95\xa2\xe2\x96\xe9\xc5\xd6\xe5\x0a\x42\x98\xe5\x0d\x04\x48\x3c\xee\xd8\x41\xc0\x12\x3b\x42\xba\x3b\x3a\xdc\x82\xab\xbc\xa8\x7b\x81\x7b\x0b\x37\x60\x7e\x13\xd8\xfc\x13\x09\xae\x09\x91\x4d\x01\xde\xf3\x0f\xbf\x58\x67\x84\x5a\x3e\xdf\x06\xf2\x25\x2c\x84\x02\xcb\x38\xb3\xe0\x3c\x3c\x7b\xb3\x03\xb1\x42\x80\x71\x6f\x86\xb8\xeb\xaa\x7f\x25\xd4\xc8\x20\x07\x7e\x59\xb9\x66\x6e\xa5\x2d\xb0\x86\xbb\x6a\xe5\xd9\xc3\x6f\x8d\xab\x33\x0b\x12\x2a\xa7\xcd\x38\x40\x6d\x40\xa2\xe8\xf0\x47\xf1\x4f\x2d\xc5\x0d\x28\x04\xce\xb6\xbc\x82\x43\x62\x39\xb7\x82\x01\x54\xd8\x95\xee\x64\xed\x79\x21\xdd\x70\x1d\x96\xf5\xfc\xbe\x93\x74\x9e\xea\x61\x95\x76\x3b\x0e\x1c\x8f\x3b\xef\x84\xac\xc1\xf4\x04\xb9\x33\xdd\x97\x91\xe3\x57\x2b\x88\x1b\x90\x74\x61\xc2\x92\x6c\x55\x5c\xca\x75\x12\x4c\x35\x38\x30\x8d\x50\x80\x67\x9d\x83\x75\xcc\x0b\x7e\x07\xcb\x75\x92\xe3\x7e\x19\x2f\x84\xbd\x56\x58\x88\x65\x67\x80\x9d\xe7\xb3\xff\x24\x9c\x7d\x02\xf2\xf2\x06\xcc\x5c\x5b\xb8\x17\x90\x57\xb4\x73\x78\x9c\x49\xbd\x5c\x06\xdd\x41\x78\xa8\x74\xd3\x6a\x05\xca\x05\x45\x63\xbb\xb6\xd5\xc6\x31\xe1\xd8\x01\x4c\x97\xd3\x00\xc2\x4f\x5c\x89\xeb\x88\xbb\x56\xd7\x7d\x19\x99\x50\xb5\x27\x69\x9f\x31\x29\x2c\xd1\x74\x7a\x35\xa8\xd8\xd6\xe8\x1b\x51\x13\xd6\x5c\xbc\x74\xe6\xb8\xbd\x4e\x84\x56\x79\x0e\x78\x3c\x32\x7b\xe1\x97\x0f\x44\x56\xf5\xaf\x31\x13\xcc\x0d\x18\x2b\xb4\x42\x51\x7e\xd6\xf2\x2a\xbd\xf7\x13\x9e\xd6\x74\xca\x89\x06\x90\xca\x90\x01\xa1\x66\x52\xcc\x0d\x37\x02\xec\x98\xd1\xca\x81\xad\xa2\xbe\x7e\x02\x44\x17\x8e\x35\x09\xa7\x2f\x00\xa2\xab\xde\x06\xc9\x23\x14\xef\x6b\x72\x3d\x89\x48\x09\x6f\x7b\x10\x3b\x0b\x6c\xa1\xcd\xa6\xde\x99\xb2\x73\xc7\xf4\x0d\x18\x23\xea\x40\x54\x0c\x9f\x89\xda\x30\x2e\xe1\x25\x63\xd0\x9c\x05\x0b\xb3\x8b\x40\x19\x59\x38\x55\x5a\x39\x2e\xd4\x63\x8a\xa7\x17\x71\x8b\xfb\x68\xa7\xa0\xf9\x60\x08\x94\xd0\x31\x76\xbb\x02\x03\x5b\xaa\xf8\x56\x48\xe9\x2f\x00\x71\xc3\xa5\xd5\x91\x55\x6c\x5a\x9a\x1e\xf4\xf8\xbc\x04\x73\x23\x2a\xaf\x3c\xac\xd5\x95\x48\x32\x3b\x30\x55\xda\xef\x09\xd0\x1c\xef\x9c\xbe\x17\x8a\xd1\xa8\xa4\x52\xf8\x67\x07\xd6\x4d\xaa\xb6\xdb\x93\x42\x1b\xa1\x44\xd3\x35\x8c\x37\xba\x53\x28\x97\x5e\x5c\xfc\x0d\xd7\x11\x86\x18\x73\x73\xed\x06\x1a\x6d\xd6\x9f\xbd\x3c\xbd\x3e\xb8\x83\x14\x8d\x78\x10\xec\xfc\xd3\x9e\xb0\xd3\xca\x0f\x83\x7c\x6b\xf1\x1d\x90\xc3\xa7\x76\x1f\x8d\x34\x48\x31\xc7\x91\x5c\x70\x11\x94\xb0\x82\xb3\xeb\xc4\x8a\x91\xa2\xfb\xf6\x95\x71\xc5\x6e\x42\xb9\x81\x43\x94\x8c\xc7\x59\x2d\x16\x0b\x30\xa0\x1c\xbe\x1c\x20\x46\x4f\xa9\xc7\x16\xd9\xec\x9e\x7d\x73\xf2\xcd\xc9\xec\x70\x73\xdb\x89\x8a\x76\xfa\x3d\x38\xdc\xb9\xbd\x5f\x24\x89\xbf\x9d\x00\x05\xfe\xc8\x60\xad\x9c\x6b\xfb\x60\x59\x42\xd0\xe4\xc1\x58\xe9\x94\x37\xaa\xc8\x29\x0e\x8b\x10\x30\x7d\x94\x90\x55\x60\x7b\xe6\x7f\x04\xb7\x44\xd7\xdd\x50\x7d\x16\xd2\xee\x84\x0e\x91\x37\x08\x62\xd4\x17\x68\x4f\x6c\x83\xb8\x8d\xba\x7d\xe1\x42\x86\x10\xaa\xd8\xd1\xbf\x39\x25\xb7\xdb\xff\xb3\x66\xb3\x42\x64\xcf\x36\x3c\xf0\xb8\x9d\x68\xf8\xf2\x33\xf7\x8b\xaf\xf6\x96\x9a\xb4\x9d\x94\x93\x56\x4b\x51\x95\x7c\x7d\xd1\x49\x79\x91\x7f\xd9\x5b\xfa\xb9\x5f\xdb\xbf\xc6\xe8\xb5\xe8\x52\xff\x3b\x3a\xaf\xff\x7e\xbe\x78\xab\xdd\x85\x01\x0b\xca\x3d\xef\x1b\x7a\x73\xb0\x93\x7d\x75\xc3\x05\x3e\x4e\x16\x68\xbd\xc9\xe8\xb4\x56\xf4\x11\x87\x58\x0f\x3d\xde\xd9\x61\x4f\x82\xdd\x80\x02\x6b\x27\xde\xef\xdc\xeb\xce\x2e\xf1\xc1\x68\x6a\xdc\xae\x00\xb1\xa9\xa0\x72\x42\x2d\xa7\xde\xc7\xf2\x7b\x21\x55\xff\x70\x75\x75\x31\x65\x67\x6d\x2b\x83\x35\x8a\x3e\x55\xd8\x31\x2b\xa8\x39\x4c\x87\x20\xf2\x0e\x9e\xe0\x72\x52\x83\xe4\xeb\x3e\xff\xfd\xe1\xeb\x81\x20\x41\xd7\xcc\xc1\x78\x81\x6a\xa1\xd2\xaa\xb6\x8c\x2f\x1c\x98\x0d\x5c\xac\xb8\x65\xd6\x71\xe3\xcd\xc7\x39\x2c\xb4\x19\x06\xc8\xa2\x83\x4e\x10\xb8\x4d\x99\x1f\xe0\xf3\x96\x97\xee\xdc\xe7\x43\x46\x2c\x88\x92\xca\xef\xc9\xfc\x82\x96\xe9\xce\x6d\xe2\x2c\x40\x16\x77\xde\x81\xb3\x16\x8c\xd0\xf5\xfd\x20\xfd\xa0\x6f\x99\x5e\x38\x40\x93\xb1\x05\xe3\x8d\xb7\x0c\xc9\x9d\x77\xb6\x63\x67\xdb\x55\x15\x62\x65\x65\xc0\xae\xb4\xdc\x03\x88\x37\x41\x89\x57\x5a\x59\xa8\x3a\x74\xa9\xc3\x32\x60\xb3\x14\x27\xdc\x68\xf2\x97\x95\x15\x35\x18\xa8\xe3\x83\x8b\x4e\x06\xec\x10\x4e\x57\xfc\xc6\x3b\x63\x0b\x2e\xbc\xfd\xff\xf0\x63\xf8\x17\x3b\x03\xbf\xf6\x18\x61\x99\x7b\x4f\x41\x70\x0e\x9d\x00\xcf\x07\xf5\x43\x0e\x61\x80\xd7\xe2\xb7\x65\xe6\xb4\xe5\x5d\xdc\x9c\x61\xfa\xad\xd8\x79\x10\xa4\x1d\xfc\x9c\x21\xfc\xcd\x19\x3a\x6d\xbd\x0b\x6f\x8f\xc4\xd2\x7b\xed\xfd\x14\x98\x7a\xaf\x83\xfc\xfe\xd9\x7a\xeb\x18\xc9\xcf\x36\xe8\xcc\x3d\x46\x2a\x07\x6d\x96\x17\xc6\x1b\x0c\x83\xfe\x75\x67\x9d\x6e\xc4\xbf\x62\xe4\xcf\x1f\x41\x77\x48\xf7\x44\x94\xa2\x22\x34\x8a\x06\xcc\xb1\x87\x33\xc4\xab\x0b\x8b\xcd\x4e\xd9\xdf\x57\x42\x02\x53\xda\x34\x18\x57\xe4\xaa\xe7\x84\x07\xb7\xc7\x32\xce\x5a\xed\xb7\xc5\x25\xe7\xc0\x38\x65\x24\xba\x96\x42\x3e\x94\xa1\x19\x33\xab\x1b\x48\xdb\x63\x14\xcb\x8e\x3d\x56\x57\x8c\x5b\x36\xe7\xae\x5a\xb1\x8f\x7a\x6e\xc7\x71\xe1\x72\xc5\xca\x89\x1b\x0c\x1c\x71\xc7\x6c\x0b\x95\x58\x88\x8a\xad\x74\x67\x52\xd8\xa0\xe6\xeb\x94\x67\xe2\x79\x1b\x94\x59\xe8\xab\x09\xd5\xb9\x98\x1b\xfa\x5e\x1b\xda\x39\x40\x81\xa2\xa9\x8f\xcd\x86\x3b\x30\x82\xcb\x88\xc4\xf2\xe4\xdc\x9f\xb9\x77\x6d\x0c\x2f\xe3\x47\x3d\x67\x42\x59\x07\xbc\xf6\x5b\x72\x2f\xe0\x54\xcd\x4d\xcd\x6a\x68\xa5\x5e\x37\xa0\xdc\x98\x09\xc5\xb4\xc1\xd8\xad\x66\x96\xdf\x78\x02\xb2\xba\x33\x15\x58\x12\xe3\x51\xca\x94\x3b\xd6\x1a\x2c\x86\x9e\x15\xd0\x0d\xa3\x35\xef\x89\x1b\xea\x69\x19\xee\x89\x91\x4b\x2f\x59\xd9\xc2\x68\x12\x24\x0b\x2d\xa5\xbe\x8d\x7a\xa4\x08\x73\x62\x32\xe3\x86\xcb\x0e\x91\x1b\x3d\xad\x84\x89\x53\x36\x43\x12\x99\x8d\xd9\xcc\xff\xd6\xff\xf7\x9f\x1d\x37\xee\x5f\xb3\x29\x9a\xe4\xa6\x93\xe1\xfc\x9e\xaf\x3a\xeb\x19\xa5\x44\x4d\x42\x0b\x0f\x51\x9c\x04\xc9\x29\x9b\xc4\xc5\x4f\xe9\xdc\x74\x67\xd6\x63\x3f\xde\xfb\xad\x11\xce\xcb\x45\x6e\x09\x28\xf8\xd4\x1a\xb0\x96\xa8\xf3\xd5\x74\x39\x0d\x4b\x9c\x3a\x51\x5d\xff\x85\x16\xf8\xf6\x4f\x27\x27\x27\x27\xb3\xa9\x5f\x7f\x03\xe6\xd3\x18\x52\x52\xf9\x9c\x79\xc9\x8c\xe4\xa0\xa5\x92\x8e\x38\x08\x32\x63\x14\x7e\x31\x62\x2d\x27\x07\xd0\x82\x8b\xb1\xa4\x93\xc3\x08\x92\x5f\xf7\xd4\xf1\xf9\x5f\x62\x46\xe8\xdb\x93\xe3\xaf\xff\xd3\xff\x6e\x65\x67\xff\xcf\xd1\xd0\x7f\xfe\x32\xf3\xa4\x1b\xa0\x3c\x75\x46\x2c\x97\x60\xfe\xe2\x97\xf9\xf6\x84\x9e\x38\x39\xfe\x7a\xe7\xfb\xd3\xe7\xbf\xff\xe0\x55\xc4\xc6\x9e\xde\x5e\xa4\x9c\xf8\x5a\x92\xdc\xb7\x2b\x2d\x37\x23\xa4\x8b\x22\xb1\xa8\x3b\x97\xe2\xa4\x1e\xba\x1a\x2a\xc9\x0d\xd4\xc8\xe6\x6b\xd6\x74\xd6\x79\x99\x0e\x29\xc7\xb8\xb9\x85\xb0\x0d\x54\x2b\xae\x84\x6d\x3c\x26\x6e\xb5\xb9\x66\x95\x36\x06\x2a\x27\x7b\x27\xca\x8c\xb4\xc7\x99\x9e\x9f\x21\x8a\x38\xb3\xd0\x72\x13\xa2\xe0\x14\xf8\x77\x29\x62\xbe\x99\x81\x28\xd8\x3d\xc9\xf4\xa8\x9d\x92\x1c\x09\x88\xc9\xc0\x26\x0a\x4f\x07\x13\x96\x05\xb2\xf2\xce\xe7\xa7\x94\x2a\x9a\xaf\x0b\x66\x9d\x9e\xc5\x4c\x66\x94\xb0\x69\x4f\xe3\x57\xc8\x52\xd8\xef\x08\xbc\x5a\xc5\x27\xa1\xc8\x9d\x04\x2e\x08\x40\x85\x15\x03\xa7\xe7\xa7\x48\xe6\x22\xab\x4c\xe2\xdf\xca\xcd\xf2\x5e\x07\xc2\x3d\x7f\xee\x75\x2b\x7a\xe0\x4c\xa8\x22\x04\x3e\xd3\x66\x39\xe5\x98\x72\x98\x62\x64\x7d\x7a\x7d\x1a\x23\xec\xc8\xfb\x21\xd1\xb0\x3e\x9c\x5e\x52\x2e\x07\xea\x4d\xf1\x57\x75\xc6\x80\x72\x72\x7d\x1a\x61\x8d\x52\x23\xc0\xe5\x95\x58\x92\x7a\x65\x04\x60\xc1\xa5\x9c\xf3\xea\xfa\x5e\xd6\xfa\x9b\x85\x5e\xc4\x9e\xee\x5a\x34\xad\x04\xaf\x12\x48\xc4\x07\x3a\xa0\xdd\x19\xa8\xba\xd5\x42\x39\x76\x10\xb7\x3e\x4c\xd7\x9e\x14\x8c\x33\x6b\xcc\x77\xea\x5d\xda\x8a\xdb\x01\x79\xdc\xa7\x62\x45\x38\xa8\xd6\xdb\x81\x93\x3b\xa9\xf9\x32\xdc\xbc\x65\x2b\x7d\x8b\xa6\x90\x01\xee\xf2\x62\x2e\xe8\xa7\x98\x18\xe2\xcc\x6f\xfb\x33\x97\xa2\x66\x5e\xe1\x94\x2c\x7a\x3a\x61\x23\x2c\x4e\x19\x9d\x32\x4e\x45\x2a\x01\x4e\x34\xb2\x4c\xa7\x8a\x75\xe5\xfa\xbf\x4e\xd8\xe8\x7b\x6d\xe6\xa2\x1e\xa5\x08\xc9\xe1\xa9\xa7\xb8\xb9\xa8\xe3\xb2\x05\x20\xa6\x53\xde\xd2\xb8\x16\x6d\xeb\xd1\xa5\xe0\x13\xfe\x8e\x89\x85\xa7\x2a\x6f\x19\x59\xfc\x79\xc5\xad\x7a\xfe\xdc\xb1\x85\x50\xc2\xae\xa0\x66\x6b\x70\x7e\xaf\xf7\xd0\x4a\x5e\xc1\x28\x12\x48\xc5\x55\x05\xd2\x66\xca\x49\x55\x28\x1f\xbd\xa6\xc3\x34\x17\xbe\x61\x99\x70\xd1\x22\x51\x70\xcb\xb4\x82\xe7\x0f\x8d\xe6\x9f\x75\x4e\x37\xdc\x89\x0a\xf9\x95\xec\x88\x21\x83\x24\x8a\x4b\xe4\x7d\x2e\x65\x90\x83\x1e\xbd\x20\xdc\x2a\x85\x4d\xd1\x32\x40\x9b\xdc\x1b\x07\x85\xa5\xe4\x8d\xe0\xae\x01\xc3\x0e\xb4\x92\xeb\x9d\x5c\x80\x7c\x63\x23\x43\x45\xc2\xd4\xc6\x2f\xc7\xad\xf5\xf6\x76\x5e\x0d\x50\x27\xd6\xc2\x8b\xcf\x19\x8a\x91\xad\x87\x0e\xa7\x18\x35\x8c\x71\x74\x14\x7d\x91\x3a\xa4\xdc\x06\xd1\x6e\xc8\x6f\x7a\x00\x41\xcc\xb6\x70\x50\xec\xde\x66\xb4\xd1\x14\x67\x45\x99\x46\x84\xec\xab\x66\x36\xf8\xca\xec\xe4\xf8\x2b\x76\x44\xff\x9f\x8d\x6f\xd1\x14\x9e\xfd\xe1\x8f\x0d\xe9\xea\x3f\x9e\xd8\x59\xc8\x5b\xf6\x63\xbc\x01\xbd\x93\x1a\x78\x2d\x85\x82\x49\xb0\x19\xfa\x6e\xcb\x9f\xfe\xf3\xf6\x4d\xbf\xc3\xff\x72\xc9\xe2\xab\xac\x30\x41\xbc\x38\x4d\x57\xe7\x0f\xee\x49\x4d\x2c\xfc\x79\x1b\x81\x0e\x5a\x2a\x3f\xf1\x17\x16\xce\xea\xdf\xe2\x6a\xed\x5d\x14\xeb\xf5\x24\x7b\x23\xf0\x78\xde\xce\x2e\xf9\x13\xf3\x69\xe8\x08\x75\xca\xd1\xf1\xc9\x11\xf2\x24\x6b\xb3\x47\x53\x43\x0b\xaa\x06\x55\x51\x7a\xfb\x91\x92\x87\x2f\x8b\x5d\x76\x16\x38\xf0\x1e\x6f\xf0\xba\x8e\x49\xd9\x80\xdc\x62\x99\x54\x8e\xb3\xc9\x3a\xb1\xe2\xc3\x2f\x6a\xd8\x2d\x57\x2e\xca\x9c\x8d\x7c\x20\xfb\xf0\x4b\x89\x07\xa9\xd7\x8f\x99\x40\x8d\x3b\x0c\xfb\x77\xf0\xa9\x95\xa2\x12\x5e\xf4\x50\x89\x0b\x9e\xe0\x5a\x28\x54\x0b\x2b\xb1\x5c\x21\x06\x24\xdc\x80\x4c\xee\x05\x1d\x15\xaf\x7a\x58\x8c\x3c\x81\x04\xa8\x3f\xe2\x1e\xda\x29\x54\x3a\xde\x89\xa9\x1a\x2c\x0a\x9a\xec\x96\x11\xf2\xe6\xe0\x6e\x01\x14\x9b\xe5\x3f\xcc\xc6\xa5\x59\x30\xf9\xa8\xe7\x24\x00\xae\xe9\x26\x27\x21\x0f\x33\x0b\x21\x38\xaf\x04\x23\x8b\x66\xbf\xce\xf3\x61\xd4\x11\xd9\x28\xea\xa1\xbe\x4f\x5a\x7e\xe7\x47\x65\xb0\x78\xec\xc4\x5e\x06\x6c\xab\x95\xc5\xaa\x36\x0f\xee\x12\x14\x98\x7c\x96\xc2\x84\xe8\x41\xc8\x0a\xaa\x6a\xf8\xb5\x57\x0b\x3b\xf2\xf5\xb1\x3e\xa1\x92\x9d\x75\x5b\x19\xf7\x92\xc3\x40\xdd\x08\xa3\xd5\xe3\xe2\xa1\xd8\x24\x23\xa2\x8b\x71\x90\x20\x6c\x9c\x66\x42\x7d\xf4\x94\x93\xbc\xf9\x3e\x70\x8c\xdd\x70\x23\x3c\x79\xdb\x78\xbe\xf2\xec\x29\xe4\x99\x83\x1d\xb3\xb7\x67\x6f\x5e\x5d\x5e\x9c\xbd\x78\xe5\x15\xec\xc5\xbb\x97\xff\xf0\xbf\x20\x1d\xab\xbd\xae\x7e\x0a\x45\x57\xe9\x5c\x93\x06\x1c\xbf\x17\x1e\xca\x7c\xd9\x80\xcb\x60\xf0\x16\x88\x20\x03\x23\xe3\xa2\xbc\x9b\x84\xdf\xad\xd4\xaf\x27\x87\xd9\x61\xa6\x1a\x63\xb4\x99\xac\xb8\xaa\xe5\x63\x0a\xe7\xde\x36\xc1\xa4\x09\x3b\x05\x3a\x8a\x68\x0f\x94\xf3\xca\xbf\xc0\x7e\x48\x70\x31\x16\x44\xb2\x50\x21\x88\xd8\x0b\xac\x91\x12\x7b\x02\x34\x60\x60\xb1\xa7\x37\x8f\x28\x63\x11\x65\x06\x16\x94\xb3\x4e\x15\x6e\xda\xbb\xb1\x9d\x37\xe0\x14\xe3\x2d\x96\x06\x53\xf1\x65\x2e\xa7\x8b\x9b\x2e\xab\x47\x0a\xaa\x7a\x38\xff\xfa\x82\x5d\xe1\x0d\x2e\xb9\x99\xf3\x25\x4c\x2a\x2d\xbd\xda\xb0\x64\x53\x27\x89\x9e\x0a\xd1\x95\x66\x52\xab\x25\x18\xa6\xa0\x02\x6b\x79\xa8\x27\xe9\x5a\xdd\x0f\x97\x76\x6d\xcd\x43\x00\xf2\x77\x7e\xab\xb5\xb0\x95\xbe\x01\xb3\x9e\x54\xde\xb3\x2e\x00\x9a\x1e\xb7\xd7\xcb\x63\x5a\x3d\x3d\xf5\xc2\x3f\x74\xb5\x6e\x61\x1b\xd4\x97\xf1\x19\x56\x49\xe1\x39\x19\x17\x0c\x01\x0d\x7f\x80\x31\x23\xe7\xc4\x3b\x08\x54\xf9\xe7\x25\x62\x2d\xec\x35\x69\x59\xaa\xb0\x99\x6d\xf1\x7d\xf8\x7d\xe6\x7c\xa1\x96\x86\x32\x47\x0f\xa2\x8c\xad\xfb\x3f\xa7\x75\xee\x34\xbb\x74\x70\xe5\x63\xf9\x45\xae\x29\x43\x47\xef\x59\x8c\x4c\xf4\x4c\x4c\x62\x71\xdd\x39\x2b\x6a\x60\xb7\xda\xc8\x3a\xba\x85\x85\x5e\x0d\x5b\x87\x12\x8a\x40\x0d\x6c\x1e\x2b\x16\xe8\xe4\xde\xca\xc0\x9a\x7a\x1e\xab\x80\x50\xfe\xd4\x45\x95\x68\xb9\xf5\x81\x5b\x19\xdd\x2d\x29\xb5\x35\x8b\xb6\x0a\x41\xe9\x4f\x78\xf8\x04\xc8\x71\xa5\xad\xdb\x27\x22\x71\x74\xf4\x3e\x38\x90\x47\x47\xd3\x7e\xe1\x8c\x3f\xbd\x5f\x66\xb3\xa6\x28\x50\xcd\xf4\xc1\x5e\xf9\xd5\x90\xf3\x81\xf9\x11\x22\x9f\x74\x4d\x9b\x17\xd2\x59\x4c\x98\xfc\x70\x75\x75\x11\xeb\x86\x62\xa4\x27\x7a\xb7\xd9\x16\x14\xd6\x09\xfd\x88\xc2\xee\xdc\xaf\x1f\x48\x9d\x27\x93\x79\xb0\x38\x33\x16\xee\x06\x1a\x3b\x0f\x90\xb1\xc4\x08\x0d\xd8\x55\xb6\x70\x3c\xa1\x57\xdc\x14\xda\x1e\x6d\x9b\xce\xcd\x51\xc8\x9f\x5f\x30\xc3\xd5\xf2\x49\x48\x43\x44\xcc\x1e\xf4\xf7\x22\xa2\xcd\xdf\xef\x01\x86\x7a\x27\x29\xd4\x7b\x98\x62\xbd\x2f\xce\x5f\xbe\x67\xb6\x9b\x2b\x48\x55\xe6\xa9\xb1\x20\x40\x31\x27\x92\x31\x15\xb4\x45\x56\x86\x2e\xab\x35\xfa\xd3\x9a\x1d\xcc\xbe\x3a\x99\xe2\xff\x8f\xbf\x19\x7f\xf5\xe7\xaf\xa7\x5f\xfd\x09\x7f\xf8\xea\xeb\xf1\x57\xff\xc5\xff\xf4\x0d\xfd\xf8\xa7\x28\x39\x73\xf1\x55\x2f\x5a\x41\xd7\x73\x2f\x8e\xbf\xd7\x41\xe7\x01\x85\xee\xd0\x41\x08\x7d\x2d\xb3\x70\xd5\x53\x24\xd6\xa9\xd0\xc7\xb4\xe8\x6c\xca\xbe\x4b\x9b\x16\x21\x5b\x6a\xcc\xa0\xd4\x89\xbf\x30\x32\xe1\xbc\x67\x5e\x38\x63\x9e\x58\x94\x76\xd4\xec\xa1\x22\x41\xe7\xba\xc7\x08\xff\x47\x2d\xf5\xb5\xe0\x8f\xc8\x22\x3f\xd2\x0e\x91\x49\x42\x54\xda\xf6\x5b\x26\x08\x35\xf1\xd1\x1f\xf9\x0d\x67\x7c\x09\xca\x51\xb2\xf1\x12\x80\xad\x9c\x6b\xed\xe9\xf1\x71\x00\x78\xaa\xcd\xf2\xd8\x00\xd6\x3f\x56\x70\xbc\x72\x8d\x3c\xc6\x37\xec\xd4\xff\xfb\xf7\xcf\x14\x15\x9f\x54\x60\xf6\x11\xcb\x1e\x89\x17\xaf\xde\x30\x50\x95\xf6\x4a\xea\xc5\x19\xf3\x6f\x8a\x45\xb4\xf0\xfc\x25\xb1\x96\xbb\xd5\x38\xc1\x7b\x03\x46\x2c\xa2\xcd\x10\x83\xae\xe9\x25\xb0\xe3\x60\x21\xfa\x93\xa0\xdb\x3d\x6b\x8d\x76\xba\xd2\x12\x03\x8c\x58\xd5\x68\x83\x47\xd1\x59\x98\x58\x2b\x27\xb4\xd8\x84\x77\x6e\x05\xca\x85\xcd\x23\x7b\xf8\x97\x90\x0e\xb3\x85\x71\x7c\xc3\xcd\xb1\xe9\xd4\xb1\x85\xca\x80\xb3\xc7\xb9\xfe\xd6\x13\x79\x10\x7b\xbc\xc2\x90\x59\xfc\x71\x52\xf1\x69\x65\xdc\xac\x08\xbf\x25\xea\xea\x31\x5e\x80\xa6\x35\x42\x55\xa2\xe5\xb2\x40\xe4\xae\x5e\x11\xac\x54\x8c\xef\x1c\xd8\xc3\x50\xb7\x82\x29\xad\x79\x6c\x67\xf2\x16\x74\xb2\xb7\x32\xd6\x30\x60\x96\x64\x19\x63\x1c\x0b\x36\xa2\x40\x8f\xc4\x1b\xb5\xd1\x6f\x81\x62\x7a\xfe\x22\x9e\xe7\xdb\x4a\x7d\x6b\xd7\xd6\x41\x73\xda\x70\x8b\x9d\xa2\x5e\xd8\x61\xee\x59\x7d\xbb\xe2\xb7\x4e\xe8\x89\x56\x52\x28\x98\xd2\x4f\x53\x7b\x53\xc5\xf5\x11\x92\x4a\x7d\xbb\xf0\xd0\x78\x55\xaa\x25\x4c\xfd\x0f\xf8\xd0\x8e\xab\xc8\xd6\xee\xbe\xdc\xf5\x5a\x58\x07\xd4\x5b\x80\x59\xc7\x8a\x5b\x17\x8b\xe1\xed\xce\x9a\x4d\xf8\xe4\x40\xd5\x50\x47\x54\x55\x2b\xd8\x23\x7d\xf4\x86\xab\x1a\x2f\x10\x23\x27\x5b\xf7\x1a\x1c\x71\x9b\x6f\x7d\x21\xf9\x32\x86\x22\xe2\x96\x01\x4d\xd7\xb0\x66\x9d\xe5\x4b\x6f\xc1\xa2\x62\xfe\x2d\x2e\x9a\x44\xfc\xdd\x57\xb0\xa7\x85\xe7\xa9\xff\x07\x6f\xc5\xf1\xba\x36\x81\x76\x73\xe1\x56\xa4\x60\x94\xa3\xa9\x35\x51\x28\x2f\x51\x30\x43\x3c\x1b\xfd\xaf\xa3\xd1\x2c\x27\x2b\x66\xa3\xa0\x43\x47\x78\x52\x64\x9e\x71\xb4\xed\xc1\x58\x7c\x99\x82\x88\xe8\xc2\x28\x70\x98\x5d\x45\xdd\xbc\xe0\x55\x6e\x48\x8d\x11\xc2\xd1\xd1\x68\xa3\x3c\x9e\x5b\x7b\xab\xcd\x3e\x21\x4b\x64\xed\xf0\x38\x09\x42\x0c\xde\xf7\x50\x3c\x66\x9b\x97\x85\x66\x7d\x67\xc1\xa4\x73\xb5\xd4\x41\x8b\xfa\xf5\xc1\x0d\x02\x03\x82\x80\x0a\xc9\x8b\xa2\xf6\x3f\xff\xf9\x9b\xd9\x66\xc7\x1b\xd2\xcb\xbe\x87\x0c\x8f\x87\xd2\xc5\xec\x01\x62\x2d\x3a\x5e\x4c\xa0\xb9\x7e\x99\xba\x45\x0a\x0a\xc7\xcc\x74\x54\x00\xe2\xf1\xb0\x27\x10\x18\xec\xcf\x6e\xe8\x00\xae\xfb\xeb\xde\x4d\xf6\xf7\x72\xef\xdf\x57\x80\xe7\xdb\xe6\x5c\x5b\x34\xd0\xde\x01\xc5\x16\x89\xdd\xc7\x4a\x74\xff\x0f\xef\x3d\xe4\x75\x2d\x42\xfa\x29\x52\x40\x58\xca\x9b\xf3\x35\xb6\xdf\xd6\x42\x3d\xd0\x90\xf9\x37\xfc\xf7\xe4\xe3\x4d\x33\x21\x63\xe9\xc3\x8f\x3f\xbf\x89\x02\x1b\xf9\xb4\xdf\xae\x15\xb6\xcc\x61\xe0\x8f\x37\xcd\xe3\x85\xf1\x7e\xfc\xf9\xcd\x46\xd8\xd7\x6d\x3a\x8d\xf8\x88\x37\xd2\x4d\xa7\xb6\x3a\xc2\x9f\x80\xf3\x52\xc3\xbc\x5b\xde\x9f\x63\x4e\x66\xad\x81\x46\x3b\xa0\xd7\x96\xa1\x6a\x2f\xc4\xba\xc2\x2f\x3d\x25\x13\xd4\xdc\x39\x5e\xad\x20\x55\xfe\xb1\x88\xb1\x31\x83\xe9\x72\x3a\x0e\xe5\x60\xd8\xed\xb2\xd0\xe6\x96\x9b\x9a\xf8\xb1\x07\xdc\xc4\x76\xb6\x05\x75\x3f\xae\x2e\xe9\x39\xba\x05\xc7\xcd\x12\x1c\x5e\x8f\x68\x1a\xa8\x05\x77\x20\xd7\xb1\x90\xd8\xa5\x66\x11\xc9\xad\xf5\xb7\x2b\x35\x27\x1d\x98\x85\x96\xf0\xfa\xd7\x7b\x69\x7b\xec\xed\x6d\x14\x67\x43\x05\x33\xbe\x12\xee\xcc\x6b\x0b\x2c\xb5\x8b\xc4\x22\x36\x5b\x38\xa4\x5e\xda\x61\x2e\x3e\xdc\x42\x45\xd0\x6b\xfb\xc8\x30\xc3\x95\x45\xc9\x1c\x75\x21\x77\x51\x17\x6a\x64\xea\x60\xa0\xe0\xcc\x01\xb8\x95\x6b\x26\x79\xa7\xf0\xba\x3c\x98\x9b\x00\x1d\x9d\xfe\xf1\xe4\xe4\x8f\x3d\x90\x3e\x57\x92\xf8\xe5\xf3\xbb\xd9\xe0\xe5\xd6\x7a\x2b\x7f\x9f\xec\x5d\x21\x8b\x7e\x7e\x93\x5f\x65\x07\x9d\x05\x36\x7b\x2d\x54\xf7\x69\x56\xfc\x3a\x78\xd9\xda\xe4\x70\xe0\x35\x6f\x40\x82\x7b\xc4\x24\x75\xdc\x21\x4b\x90\xfb\x92\x00\x3f\xc5\x37\x84\x8a\x11\xa6\x27\x1b\xf8\xff\x8c\xd2\x95\x80\x05\x0a\xa3\x07\x85\x51\x67\xa4\x78\x9e\x72\x2b\x10\x26\x85\x3a\x7b\xaa\x21\x46\x80\x73\x58\x34\x05\x34\x7a\xcd\x20\x7b\x19\x92\x2f\xee\xa8\xc3\x0b\xc0\xd0\x40\x08\x64\x24\xcd\xeb\x9c\xa3\x89\xf5\x44\xc5\x95\x65\x82\xeb\xa7\x83\xf7\x89\x48\x24\x4a\xdb\xa2\xad\x8d\x78\xc7\x8e\x08\x5d\xd4\xd1\x68\x0c\x86\x0c\xf3\x20\x69\x71\x9b\x56\x8d\x11\xbb\xe1\x4a\xe5\x22\x20\x9d\xd3\xc4\x14\xc8\x78\x1f\x32\xd8\x65\x91\x78\xb9\x70\x6e\xb4\xae\x6b\x8b\x24\x32\xb1\x15\x97\xfe\x95\x03\x7f\xbd\xe1\x87\x89\xd3\x93\x7f\x81\xd1\x54\x37\xb4\x00\xee\x3a\x03\x76\xcc\xe6\x9d\x0b\x93\x3c\xe2\xef\x30\xc1\x82\xd5\x48\x0d\x70\xbf\xf5\xa2\x93\xd9\xee\x0d\x05\x4e\x5e\x26\x50\x40\x35\xd9\xac\xb8\x70\x0e\xa7\x3e\x09\x6e\x8a\xc8\x41\xb1\xf6\xb0\x70\xa3\x2b\x48\xa6\x58\x2a\x68\xbf\xb8\x61\xa8\x77\x72\x1a\xa3\x6a\xb3\x55\xcb\xa7\xc5\xc3\xd3\x40\xc0\xd3\x1a\x6e\x4a\x1f\xe9\x7a\xc7\x63\xe5\x66\x87\xd3\xf7\x9e\xa9\x63\x38\x21\x82\x53\xeb\xaa\x4b\x25\x8e\x45\x54\xa4\xd1\xd8\xd4\xe3\xf9\x23\x99\x52\x43\xd8\x68\xc0\x99\xd8\xab\xf0\x6b\xd1\x41\x6b\xdd\x85\x8f\xa2\x0a\x32\x05\x4d\xa9\x66\xc8\xb0\x59\xd5\x76\xb3\xf0\xe3\x03\xcf\x9c\x4e\x9b\x6a\x3e\xee\x3d\x33\xd9\x36\xf7\xf9\x6a\x97\x10\x0c\x12\x14\x0b\x58\xd6\x9a\x0e\x10\x0a\x7f\xb4\xc1\xf6\xf7\x16\x4c\xe5\xc1\x59\xa2\xc3\xea\x6d\x28\x1a\x7a\x52\x18\x6d\xdb\x68\x3a\xcc\x35\xbe\x17\xba\xde\xf3\xa0\x61\xc5\x5d\x97\xdb\x08\x85\x42\x01\xf6\xf1\x45\xe3\xac\x00\x95\xba\xb6\x2e\xd2\x10\xb0\xec\x3a\xc5\xc2\x1a\x6f\xa4\xaa\x35\xf6\xb4\x14\xc0\x0c\x4c\xd3\x78\x6e\xd9\xd1\x91\x97\x40\x47\x47\x85\x1e\x19\x47\x21\x83\xeb\x6f\x8d\xa4\xb2\x28\xbe\x52\x1c\xa5\xd6\xb7\x98\xd8\xf3\xcb\x90\x48\x52\xda\x15\x5e\x5c\x96\xd1\x75\x31\x30\x00\xb5\xfb\x10\x2e\xd3\xaa\x43\xa4\x73\x27\x2e\xf9\xa7\xfd\x70\x79\xa6\x58\xd7\xb6\x60\x18\x65\x5f\x92\x5d\x38\x80\xd6\x60\xdb\x9b\x24\xea\x99\x57\x92\x52\x82\x2c\xb8\x77\x13\xa7\x91\x20\x56\xdc\x32\x2f\xfb\x3c\x6e\x2a\xde\x86\x64\x01\xae\x4b\x84\x67\x73\x05\x9e\x75\x5c\x4a\x7a\x1d\x11\x12\xaf\x6b\x1f\x5e\xda\xc5\x45\x0f\xb4\x4a\xee\x2e\xa8\xdd\x54\x97\xb1\xb0\x36\xc6\xa3\xb5\x22\x2b\xd5\xb2\x95\x96\xf5\xe9\x51\x6f\xe8\x0a\x3a\x94\xa9\x76\x2a\xac\x14\xf4\xff\x11\xaa\x89\x5c\x9e\xcb\x76\xd6\xe7\xa2\x62\x23\xd1\x93\x6a\x6a\xf7\xac\xb4\x8d\x8e\xf6\x76\xbd\xed\xa6\xd9\xf2\x65\xcc\x95\x60\xa6\xf4\xf1\x1b\xa2\xab\x36\x3a\x2a\x34\xe8\x25\xbe\x92\x0a\x2a\x10\x56\x2c\xe0\x25\x33\x11\xfb\x19\x92\xe5\x65\xb6\x2d\x0f\xea\x3f\x5a\x74\x52\xa6\xc5\xfa\xb1\x84\x70\x7e\x5a\x0f\x4b\xba\xa8\xcf\xe2\xec\xcd\xab\xd7\xff\xf8\xe9\xed\xd9\xd5\xf9\xcf\xaf\xfe\xf1\xe2\xdd\xdb\xef\xcf\xff\xfa\xb7\xf7\x67\x57\xe7\xef\xde\xfa\x47\x7e\xbc\x7c\xf7\x96\x11\x71\x4d\x8b\x09\x48\x25\x9b\xa6\xfe\x01\x2a\x6b\x73\x9e\x2e\xba\x50\x16\x80\xf0\xf4\xe1\xd8\x8a\x29\xd0\xcd\xd3\xea\x88\x32\x82\xb3\x4c\xf9\xf7\xd2\xfd\x43\x34\x94\xda\x31\x9e\x82\xb3\xb0\x6d\xc8\xdf\xa3\xcb\xfb\x00\x45\xc7\xa1\xb8\xe7\xa6\x95\xe0\xb6\x2e\xbc\x7f\x7b\x25\x00\x2b\xae\x14\xc8\x49\x49\x6b\xf7\xbb\xb4\xaf\x83\x57\x10\xde\x0e\x21\x22\x6e\x63\xed\x96\x5e\xf4\x9d\x37\xba\x56\x0f\x7c\xf0\xfe\x23\x47\x63\xa3\x47\x5c\x26\x38\x17\xda\x10\xad\x10\x79\xfd\xed\xfd\xb9\x1d\x04\x58\xa8\xeb\x5f\x0d\x6e\x0d\xd6\x09\x95\x9a\x4c\x1e\x0b\xe6\x68\x7c\xff\x26\x58\x1e\xdc\xf7\x33\x90\x15\x5f\xfe\x22\xd8\x4a\x21\xf3\xbd\xd0\x75\x03\x9f\x8d\x2b\x7c\x17\x9f\xb7\xb9\x7e\x7d\xab\xde\x76\x0e\xcc\x76\x73\xff\xfa\x1c\x19\xc9\x03\x9e\x95\x17\x35\x38\x06\xc0\x8b\xf5\xb6\xa1\x66\x07\x61\xc8\x00\xcf\x8d\x61\x73\xa3\xaf\xc1\xe4\x19\x3e\xd1\x38\xf0\x3a\x6b\x14\x84\xd7\xe8\x70\xe0\xbc\x9f\x73\x47\x7b\x9d\xb6\x35\xba\xee\x2a\xd8\x71\x3b\x9f\x79\xc8\xde\x29\x16\x42\x3a\x30\xe1\xda\x26\x91\x66\xef\x15\xb1\xb1\xf8\x95\x5e\x0f\x33\x07\x11\xa0\x8d\xce\x84\x15\xf0\x1a\x0c\x1b\x55\x30\x09\xaa\x79\x25\xac\xd3\x66\x3d\x8a\xc3\x07\x2f\x85\xaa\x82\xe0\x0d\x0f\x7b\xab\x6b\x0e\xde\xff\x87\x46\xdf\x90\xa6\x53\x70\x0b\xa6\x1c\xcc\x17\x64\xe7\xb8\x00\x21\x19\x08\x77\x0c\xc9\x4d\x2d\x2d\x42\x5d\x4f\xe6\x42\xd5\x29\xb6\xb0\x73\x1a\x2d\x06\x29\xc2\xe3\x43\xa5\x70\x1c\x17\xc4\x91\x56\x59\xa4\x5f\x0a\x75\xfd\x5d\xb1\x05\x4b\x96\xc1\xf4\x0a\x75\x4c\xa1\x12\x92\x4e\xec\x2d\x8c\x4e\x93\xa5\xd5\x97\x12\x70\x93\x69\x59\x49\x17\x9d\xba\x01\xe5\x7a\xef\x42\x07\xf0\xa9\x82\x76\xf8\x8d\x9c\xf6\xd4\xb7\x8a\x90\x98\xcf\x45\x67\x38\x7c\xb0\x91\x1a\x26\x55\x26\x5b\x2a\x67\xa9\x31\x5c\x13\xf5\x70\xa1\xf9\x73\x51\x4c\x18\x6b\xf9\x88\x45\x31\xaf\xc3\xe0\xcc\x1d\xc9\x93\xf3\xed\xb0\x66\x01\x18\x4b\x81\xab\x83\x58\x31\x56\x69\x89\xcd\x4a\x75\xd0\xdf\x87\x64\x20\xc5\x19\x9d\x73\x5e\x5d\x83\x37\x0f\x6d\xae\x19\x9e\xaf\xd9\xff\xe8\xb8\xb9\xee\x2c\xf5\x68\xdc\x62\xf0\x68\xd3\x0a\x4c\x3e\x04\x4d\x0f\x88\x09\xac\x7f\xd2\x9b\x53\xa1\x8f\x97\x9d\xa8\xc1\x1e\x87\xad\x9e\x84\x41\x25\xb5\xb9\x1f\x0c\xff\x54\x6c\x08\x95\x7a\xc9\x74\xe7\x5a\x1c\x92\x92\xa4\x19\x62\x7a\x0f\x8b\xec\xb5\x5e\x5a\xd6\x80\xc5\xc2\x81\xf4\x56\x22\x38\xb8\x81\x7d\xb2\xbf\x67\xf5\xc7\xce\xba\x08\x0e\x5e\x2b\x05\x2a\x62\x36\x02\x83\x9b\xe7\x6f\xbf\x7f\x57\xc6\x74\x3f\xda\x3d\x92\xac\xef\xf0\x68\x71\x69\x1b\x6d\xc1\x8d\x65\x26\xad\x01\xe7\xd6\x58\x76\x73\x7f\xd5\x5b\xe0\xc1\x11\xbd\x44\x19\x23\xa1\x96\xa3\xd8\xa9\x8b\xc6\xa6\xdf\xed\x59\x76\xc8\xad\xdb\xe8\x3b\xf8\xc2\x23\x3f\xde\xe0\x0e\x3b\x02\xc2\x43\x02\xb7\x74\xc8\xf0\x98\x1e\xeb\xc6\x5f\x65\x11\xec\xed\x37\x2b\xd5\x9a\x6e\x07\x15\x0c\xf6\x4d\xc5\x1a\xce\xe4\x9f\x1e\xd1\x69\x8f\x70\xc5\xe0\xcd\x62\xac\x56\x2b\x4c\x72\x7b\xfb\x02\xdd\x7c\x55\x01\x15\x35\x3f\x2f\x5b\xc8\xfb\x6e\xe2\x2d\x39\x51\x65\x7f\x14\x2d\x9f\x8d\x2a\x2c\x6b\xc2\x7d\x28\xbf\xc8\x66\xde\xda\x38\x18\xd1\x73\xa7\x52\x57\xd7\x78\x0b\x0e\xa4\x3f\x7d\x73\x3a\xd7\xce\x8e\x0e\xa7\xd3\xe9\x6c\xca\xde\xbe\xbb\x7a\x75\x1a\x02\xe3\x22\xe6\x6c\x30\x4c\x8d\xda\x9e\x63\x93\x69\x23\x68\xb4\xc4\x50\x21\x75\xaa\xf7\xa6\x82\xaf\xd4\x7c\xff\x2c\x04\x2d\x0c\xf0\xfa\xf8\xd6\x88\xe4\x95\x34\xbc\xb5\xa1\x17\x98\xe3\x94\xe0\x84\x03\x03\x9e\xc1\xb1\x28\x87\x25\xa3\x23\x4f\x43\xcc\x19\x04\x96\x76\x73\x2b\xae\xb2\x5d\xd5\x8b\xf6\x6f\x05\x63\x9e\xc0\x24\x88\x07\xa8\x40\x5b\xe8\xc0\x8d\x5a\x01\xe2\x42\x82\xa4\x57\xd3\x5a\xc9\xae\x86\x49\xed\xe9\x80\x3b\xff\x8f\x5e\xd3\xea\xbd\xd5\x1a\x8a\x4e\x41\x45\x54\xd1\xcd\xa6\x79\x05\xfe\x28\xdc\xa1\x9e\xe2\x72\xfd\xaf\x10\x6c\x0e\x9e\x4a\xa5\x6b\xc8\xb9\x70\x5e\xd7\xfd\x0e\xd4\xd4\xdd\x8c\x16\x08\xc1\x96\xfd\x8f\x29\x0e\x4d\x28\xd8\x60\xb6\x45\xd7\x34\x88\x25\x87\x35\x15\x9b\xe1\xac\x83\xf0\x17\x84\x75\xb3\x26\x3d\x57\x6c\x87\xb9\xe9\x25\x48\xbb\xcd\xa3\x6d\x0f\xbe\xe1\xed\x1e\x52\xfe\xf9\x5b\xde\x40\x31\xcc\x97\x5e\x2c\xda\x04\x0b\xd2\xf2\xa6\x6d\xd4\x4f\xd5\x75\x9e\x5a\x96\x83\x81\xa3\xff\x56\xd0\x36\x0e\xcd\xfc\xef\x13\xff\xec\x68\xfa\x12\x5a\x03\x38\x81\xfd\x34\xf6\xdb\x23\x6e\x47\x51\x92\xe1\xd3\xa3\x5e\x6d\x7f\xef\x4f\x7b\x9c\x65\xf0\x28\xc7\x12\xb8\x85\xa1\xb6\xda\xa1\x93\x85\xa3\xf4\xcf\xb7\xfb\x64\x43\x00\xbb\xd8\x5f\x73\x4f\x5d\xc0\xba\x45\x80\x07\x04\x7b\x39\x62\xda\xef\x83\x69\xb9\x11\xe5\x4d\xde\xf0\x76\xe4\x19\x7c\xf4\xda\x1f\x8d\x1c\x37\xff\xbf\x1e\xbc\xf4\xb7\xde\xec\x3d\x3e\x07\x39\xb9\x86\x7d\x06\x46\xbc\xc6\xba\xef\x41\x5c\x89\x1a\x94\x13\x8b\x35\x35\xfb\xe3\x08\x20\xad\x1c\x64\x0f\x02\x91\x37\x04\x12\xcd\xfc\x08\x03\x40\xb4\x59\x1e\x17\x28\x1d\x80\x14\xe3\xd1\x7b\xc3\x5a\x44\xaf\x1f\x0a\xf1\x9d\x97\xbe\xa9\x56\x70\x66\xea\xb3\x5c\x72\x01\x8a\xb7\xe2\xf1\x8a\x16\xfc\x1f\xcf\x2e\xce\xd9\xcb\xcb\xd7\xbb\x1b\xeb\xbd\x65\x91\x9b\x99\xcb\x84\xef\xb3\xe4\xe7\xf3\xb4\x9c\xd7\xa1\x9b\xad\x1c\x65\x33\xaf\x77\x8c\x1e\xb1\x1d\xf3\xdd\x6d\x1e\x34\x0e\xca\x86\x24\x20\xa7\x5a\x03\x3c\x04\xd4\x85\x7d\x33\x07\xa9\x69\x6a\xca\x90\x27\x37\x07\x4c\x9d\x86\xb7\xb0\x2a\xc1\x70\x65\x17\x18\xc2\x56\x4a\xbb\x98\xf7\x56\xf5\xc6\xa7\x3d\xca\x7b\xd5\x21\x72\x1d\x46\x40\x93\x67\x98\x40\x78\x02\x2e\x06\xb9\xc1\x93\xe2\xc4\x7b\x46\x6d\xae\xb2\xae\x29\xd1\x45\xb5\x96\x11\x95\xa6\x57\x8b\x15\xf6\x7a\xd0\x07\x41\x8a\x6d\xc2\x2d\x6c\xef\x90\x6a\xbd\xea\xf9\x23\x3a\xc3\x17\x2f\xbf\xbb\xc7\x1e\xbf\xd0\xf5\x4b\x61\x4d\x87\x2f\x7d\xd7\xd5\x4b\x70\x89\x16\x88\x9d\x42\x4e\xed\xbc\xff\xd5\x91\xa7\x40\x27\x8d\x50\x13\x7e\xc3\x85\xe4\xf3\xbd\x27\x7b\xe5\xbc\x23\x8a\xce\xa1\xd3\x23\xfb\x62\x5b\x83\x75\x41\xf6\xf6\x77\x89\xc3\x19\xb9\x62\x70\x23\xd0\x3d\x99\x9e\xe7\xd9\x2f\x54\x52\xcc\x15\xe3\x73\xab\x65\xe7\xf2\xa6\x86\x66\xde\x84\x8c\xf8\xf4\x1d\x79\x2c\x71\x51\xbd\x60\xb3\xde\x91\x42\xe5\x7b\xc3\x3f\x4d\x3a\x55\xfc\x36\x6c\x94\xe6\x5f\x6d\xe6\x65\x8b\x87\xbf\x30\x56\x62\x28\x2c\x6f\x40\xa8\x88\x68\xf9\x75\x08\x29\x8a\xae\xbf\x4a\x15\xfd\xdb\x48\xf1\xb6\xa6\xb4\x3a\x36\x69\x1d\x26\x3c\x12\x06\x37\xb1\x45\x38\xec\x2d\x11\x23\xd1\x5b\x78\x4c\x5c\x1b\xf8\xf5\xf1\xf4\xc6\x46\xb9\x1e\x96\xf0\xcd\xbd\x69\x47\x3f\x23\xb6\x8b\xe0\x16\xb7\x56\x2c\xd5\xc6\x14\x4c\x3c\x46\x5e\x48\x6f\xfc\x79\xca\xce\x15\xab\x78\xc8\x0e\xa6\xe7\x84\xc5\xa9\x3d\x58\x60\x9b\x9c\x18\x42\x2a\x16\x73\x44\xaf\x92\xd4\x10\xd6\xde\xd2\xa5\xc4\x15\xa6\x0c\xc3\xa2\xa1\x50\x0a\x93\x87\xc1\x91\x25\x2d\xbe\xe8\x24\x0b\xc3\xd2\xe1\x93\xb3\xf4\x19\x8d\xe0\xff\x82\x81\xe7\x96\x29\x9d\x86\xcb\x85\x80\x1a\xe3\x61\x04\xdb\xc0\x37\x34\x7a\xd0\x53\xa2\x59\xab\x1e\x76\xfb\xdf\x24\xb1\xe0\xbc\xe5\x60\x71\x1e\xdd\x98\xd9\x10\xb4\xa6\xad\x3d\x89\x36\x73\x40\xef\x64\x63\x9c\x3b\x33\xb0\x14\xd6\x99\xf5\x53\x68\x4c\xa6\xdb\x99\x94\xa5\xb4\xf7\xf4\x0c\x6f\xdd\xe7\x01\x34\xad\x5b\x1f\x66\xdc\xa6\x08\xf3\x00\xad\x94\x7b\x2f\xa5\x9e\xf7\xda\xc6\x86\xf7\x3c\x57\x75\x68\x35\x10\x8b\xfe\xb2\xc5\xb7\xbb\x82\xad\x43\x4b\x62\xa5\x26\x39\x3c\xdc\x16\x62\x91\xfe\x9a\x3d\xe0\x24\x27\x3c\x4b\x3e\x3c\xc0\xbd\xd5\x40\x5d\x83\x83\xaa\x18\x59\x5a\xce\xff\x10\x8b\x01\x16\xe8\x0b\x90\x78\x88\x03\x91\xad\xf5\xf8\xbb\x92\x52\x31\x44\x75\x58\x48\x19\x1c\xd0\xfc\x58\xb6\x01\xce\xc5\xed\xd9\x06\xab\x3c\xc8\xb1\x17\xc6\xd8\x52\xfd\xec\x9c\x28\x8a\xc7\x61\xc3\x2b\x60\xb3\x0b\x5d\x5f\xb6\x50\x5d\x41\xe3\x21\x86\x99\x57\x28\x5d\x95\x06\x96\xe6\x2a\x87\x72\xb9\xd9\xd4\x8b\x86\x69\xab\xeb\xf4\x1e\x59\x1d\x02\x64\x3d\xce\x45\x16\xe5\x3b\x45\x2f\x2e\xd5\x06\x85\x37\x63\x51\x7f\xf8\x8e\x98\xa8\x58\x03\x66\x89\xfd\x9b\xd5\x8a\x5c\xb4\xad\x7c\xcd\xd6\x3c\xe2\xcc\xf3\xf4\x75\x1f\xca\xc2\x85\x10\x62\x98\x6a\x3b\xf6\xae\x3c\xee\x95\x64\x4b\xff\x73\x12\x1b\xdf\x9d\xb8\xdb\xf9\x68\x8d\x6e\xc0\xad\xa0\x7b\xf0\x70\x88\x87\x04\x66\x2f\xd2\x2e\x71\x74\x44\xd9\x0e\x9e\xff\x3a\xa9\x74\xd3\x72\x87\x63\x96\x62\xf0\x27\x7e\xaf\x92\x54\x2a\x51\xad\x7f\xcb\x5f\xf7\x1b\xad\x84\xd3\x66\x96\x0c\xc6\xdc\x91\x41\x5c\x12\x87\x07\x04\x3d\x5a\x19\xde\x6e\x46\x57\x63\x76\xa4\x0c\xb1\x96\x00\x47\x9e\xa6\x8c\x0b\xd5\xff\x85\xca\xa4\x30\x2e\x81\x5e\x7b\x23\x2a\xa3\x2f\x08\x5f\xb8\xe4\x1b\x7a\x74\xca\xfe\x7e\xf6\xfe\xed\xf9\xdb\xbf\x86\x4f\x5c\xa1\xdb\x58\x4c\xb4\x1c\x3a\x46\x9e\x1e\x8d\x69\xcf\x90\x94\x59\x0a\xb7\xea\xe6\xd3\x4a\x37\xc7\x95\x36\xa0\xed\x71\xbe\xbd\x49\x04\xf3\xc3\x45\x79\xa3\xd8\x0b\x86\xbf\xff\x25\xaa\xaf\xb4\x07\xb6\x2d\x89\x18\x07\x9f\xa7\xb2\x33\xa8\xa7\xec\x7f\xea\x0e\x91\x86\xc5\x9f\xad\xae\x27\x4d\x00\x31\xea\xde\xd0\xbe\x99\xd4\xdf\xd6\x0d\xa7\x69\xab\xc2\xad\x74\x48\x3e\x14\x0f\xbd\x2b\xb1\x8a\x8b\x6e\xad\x20\x86\x3f\x50\xfa\x04\x22\xb8\x05\xc2\xf6\x09\xa9\x92\xf1\x79\x07\x25\xf8\xfd\xa2\xf4\xde\x18\xec\x74\xc7\x96\x0f\x77\x15\x87\x77\xa6\x65\xb6\xbb\x2a\x7b\xf4\x90\xf3\xe4\x04\x54\xa1\x3b\x3a\x29\x27\xd4\x1e\xfe\x98\xfe\x65\x27\x25\xbb\xc4\x5d\x02\xd9\x58\xca\x4f\xe3\x27\x6b\x68\xfb\x18\x82\x68\x75\x3d\xce\xf1\x9b\x8d\x09\xe5\x98\xa5\x70\x46\xc0\xcd\xa6\x18\x26\xd3\x8b\x82\x3a\x2a\x8d\x07\x4e\xb6\x18\xc9\x85\x72\xbb\x62\x44\x77\x9e\x00\xdc\x70\xd5\xa1\x2a\xd7\x06\x87\x9c\xa3\xd9\xbb\xd6\xdd\xf3\xa2\x34\x8f\x44\x53\xd9\xe0\x48\x23\x2a\xd3\xa6\xb8\x6c\x86\x2c\x82\x10\x0f\x38\x2b\x94\x54\xfc\xb0\xdd\x8c\x6c\x68\x9a\xe4\x4c\xf0\x15\x56\xbb\x07\x1b\x17\xc5\x43\x6e\x4f\xd7\xd9\x9e\xac\xb3\xf6\x92\x21\x7f\xa8\xea\x73\xc0\x45\x21\xed\xb5\xbe\xb5\x5d\x13\xa3\x51\x9b\x78\x15\xa1\xfc\xb3\x35\x98\x12\xc3\x1e\xe5\xb5\xee\x88\xa1\xd2\xc1\xfb\x93\xdf\x07\xa0\xf1\x07\xc4\x20\x1d\x9e\x6f\x4c\xe0\x73\x95\x58\xdd\x33\x34\xdd\x7f\xcc\x94\xfc\xce\x65\x0b\xdd\xe1\xde\x1f\xc8\xda\x20\x4d\x1c\x2b\x16\x8a\xfa\x03\xd1\x5c\xe8\x1a\x91\x2b\x61\xe1\x18\x1a\xdc\x04\xc9\x66\xc2\x24\x66\x1d\xf8\x35\xa8\x6c\x88\x0e\x92\x5c\xbe\x9f\x9e\xaf\xb4\xf5\x65\x2b\xfc\x1c\x15\x98\x98\x8c\xda\xb3\x5f\x58\xa5\x49\xfa\x9b\x56\x77\x98\x1a\x85\xe8\xac\x93\xc8\x19\xd3\x79\xe8\x2a\x52\x55\x4f\xda\x32\x29\xe2\x30\x5d\xa1\x84\x6c\x16\x67\x31\x32\xa3\xfd\x35\xaa\x7e\x9e\x4b\xc5\x4f\xe3\xe6\x8c\xcc\x3d\x99\xd1\x5f\x59\x8f\xbd\x31\x53\x25\xb9\x2b\x09\xdf\x5b\x02\x2f\x07\x29\x48\xa3\xfa\xc3\xae\x5b\x60\xb3\xfe\xc0\x8e\x5a\x57\xd7\x60\x68\xf9\x8f\x56\xab\x42\x8e\x87\x52\x90\xc7\x0b\x34\x84\x2a\x95\xad\x21\x32\xae\xf8\x5b\xec\xfd\xbb\x4b\x3e\x3d\x01\xc6\x2d\x6a\xa4\x77\xba\x7e\xdb\xa7\xa6\x1b\x3b\x30\x80\xa3\x17\xa8\x43\x61\xd1\x61\x68\xa3\xb3\x90\xcb\xd5\xd1\x47\xd8\x43\xd7\xee\xb6\xd5\xdf\xfb\x55\xee\xfb\x30\xa9\xdb\xb0\x64\xfb\xb1\x8e\xe0\xac\x0c\x7e\xae\x15\x6d\xe0\x62\x3e\x07\x57\x35\x8e\xdd\xa0\x14\x91\xb3\xac\xe1\x6b\xd4\x9c\x68\x84\xd4\x65\xf9\x7f\x12\x3a\x52\x57\x5c\xe2\x68\x1c\xe2\x59\x7f\x4d\x58\x00\xe1\xc1\xb0\xe8\xc8\xce\x88\x13\x66\x4c\xcf\x3f\x42\x15\xaa\xd5\x71\xae\x81\x5f\xbf\xb3\x29\xdc\x83\x1d\x1c\x0d\x38\x30\x9e\xae\xea\xd0\xd6\x31\x9b\xc4\xf7\x0f\xe0\x13\x6f\x5a\x09\xa7\x6c\xe6\xa4\x9d\x14\xa0\xc7\x47\x0e\xc9\x76\x08\x4d\x9b\xe4\x96\xf6\x8e\x88\xd9\x4e\x9a\xdd\x98\xe0\x9a\xb2\x8b\xdd\xfb\xe2\x0c\xef\x95\x58\xc6\xc3\xb7\x46\x68\x23\x70\xda\x18\x35\x02\xe4\xc0\x19\xea\x76\xc4\x79\x3e\x4c\x98\x71\x31\xa6\x46\xa5\xde\x11\xae\x61\x1d\x77\x21\x60\x55\x9d\xfe\x40\xd6\x82\xda\x7a\x30\xda\x0c\xe1\xbb\x26\x45\x8d\x06\x6f\x5b\xa3\x39\x75\x56\xa7\xef\x7d\xac\x00\xef\x14\xc7\x40\x95\x13\x1d\xe8\xa3\x90\xd8\xa7\x1c\x06\x07\xcd\x7a\xe9\x60\x61\x32\x1d\x84\x36\xf2\x94\x30\x4c\xdf\x46\x29\x6f\xac\xc4\x3c\x76\x45\xdc\x7d\x4d\xe3\xad\x43\x91\xe7\x47\xcf\xf3\x1d\xaf\x14\x45\xcf\x77\x3c\x88\x53\xac\x68\x9e\x0c\x62\x9a\xb4\x8c\x8d\x85\x41\xc9\x1b\x25\x5d\x23\x2c\x6b\xbd\x49\x89\x18\x8b\x03\x13\x5d\xd7\xc6\xb2\xbf\xa7\xe0\xe2\xec\x3b\x94\x66\x9f\x39\x83\x48\xba\xbd\xf4\x9a\xb4\x13\xfa\x38\xfb\xbe\x4d\x11\x9e\x2a\xaf\x5e\x5f\xb2\xe2\x2d\x7c\x63\xcc\xa4\xb8\x06\x36\x83\x7a\x09\xfe\x3a\x5b\x6e\x6d\x18\xfa\x48\xc3\x54\x0c\x80\xaa\xcc\xba\x75\xb3\xa1\x46\xab\x1c\x18\x23\xf6\xda\x6e\xb8\x2a\x26\x83\xdc\xd1\x76\xb5\x41\x8e\x0f\x38\xcc\xe6\x18\x23\x1c\x1c\xd2\xeb\x8f\xdb\x09\x5f\x38\xca\x67\x41\x99\x1d\xb7\x7d\x80\x2d\x8d\xcb\x28\xcf\x0b\xb6\x24\x58\x37\x4e\x14\x3a\x94\x72\x8d\x25\x16\x09\x8f\x0a\xf3\xf6\xc3\xb1\xe7\x55\xff\xaf\x5f\x46\xe4\xc4\x50\xcd\x81\x81\xf0\xb5\x93\x50\x5f\x94\x37\x1f\x87\x38\x6e\xee\x27\x4d\x45\x77\x24\x90\x42\xfc\x2f\xfa\x41\x39\x18\x6a\x80\xd7\x63\x9a\x2e\x7d\x2b\xc8\x31\x4b\xf1\x0f\x8e\xaf\x26\x83\x9b\x15\xad\xf1\xc1\xe0\x1c\x1d\x8f\x1e\x70\x2f\x1b\x37\x12\x41\xbd\xfb\x5e\xf6\x2b\x21\x19\xa2\x9a\x52\xb1\x3e\x26\xe5\x64\xa1\xfa\x88\x14\xe3\x1f\xca\xe1\x22\x16\x68\xe7\xcb\x50\x4d\x64\x7b\x8c\xb8\x7e\x19\xaa\x09\x4b\x46\xda\xf9\x12\x54\x13\x93\x98\xfb\x71\x33\xff\x4c\xb1\xd3\x9b\x41\xf8\x1b\x49\x9e\x21\xad\xfa\xa5\x49\xa9\x7f\xae\xff\xa0\xa4\xbd\x29\xe9\x6e\xfb\x67\xcf\x2b\x2a\xbb\xc6\x36\xa8\x2b\x64\x57\x6d\x8a\xb9\x21\x5e\x63\x51\x61\xcf\x8e\xce\xd9\x36\xec\x25\x15\xf4\x31\x98\xb4\xf2\x94\x95\xc1\x81\xa4\xd7\x7b\x16\x01\x66\x85\x85\x84\x90\xdf\x0b\x2b\xce\x8b\x49\xeb\xe5\xe7\x07\xd1\x04\x47\x04\x1a\x1a\xa4\x21\x1c\xd2\xf4\x0a\xb8\x74\x2b\x86\xe3\x09\x53\x7d\x93\x85\xaa\x4b\x7a\x27\x7e\x6b\x56\xab\xe9\xf9\x22\x6e\x0b\x12\x1b\x34\xb0\x28\x20\x86\x05\xc7\xd9\x00\x22\xcf\x24\x66\x9b\x63\xa3\x78\x71\xc0\xb0\xf6\x8b\x33\x24\xf3\xf8\x25\x54\x6f\x50\x21\x55\xdc\x70\x29\xea\x38\x46\x59\xa8\x25\x02\xb5\xd2\x26\xd5\x4c\x13\xf1\x1c\x84\x9f\xa6\x29\x78\x31\xb5\x37\xd5\x61\xac\x9c\xa5\x29\x49\x21\x1f\x27\xd4\xc2\x70\x4a\xa2\x79\xfb\x2d\x7c\xf4\x02\x36\x8c\xfa\xcd\x22\x7a\x9a\x4f\xfa\x98\xe6\xd4\xbd\x06\xf9\x97\x14\x1d\x77\x13\x6f\x2c\xba\xcc\x86\xcc\x17\x10\x21\x39\x60\xf3\xe5\x44\x48\xe4\xf6\xff\x77\x22\x44\x28\xe2\x8f\x89\x37\xc4\x4b\xdb\x7e\xff\x6f\xaa\xf5\x5c\x89\xf0\x55\xb5\x1a\xb8\xa4\x13\xc4\x0d\xbc\x2f\xb3\x58\x88\x2a\x76\x41\x60\xc7\x9d\xb7\xfc\x5f\x92\xe3\x53\x4e\x6f\x79\x0f\x71\x1a\x40\x78\xe9\xcb\x1a\x71\x39\x62\x4b\xd3\x6f\x73\x93\xe0\xa3\xe5\x59\xe3\x48\xa4\xef\x62\x83\x61\x99\x5d\xef\x6c\xf0\x98\x83\x74\xf2\xff\xbc\xf0\xe2\xc6\x0a\xad\xa0\x4e\x03\x8a\x52\x50\x20\xfc\x22\x2c\x86\x6d\x43\x19\xb2\xd3\xa1\xb4\xe4\xf5\x37\x76\xb2\x71\x5c\x7b\xec\x85\xdd\xbf\x6d\x23\x81\xb1\xb3\x40\xfd\xa1\xa3\x34\x8f\x12\xc1\xa2\x36\xb8\xd1\xf2\x86\xf2\xb1\x14\x8d\xb6\xdd\xfc\x63\x00\xbb\x5a\x71\xb5\x84\x27\xe0\x26\x6f\x22\x63\xcf\xa4\x5c\x6c\xee\x1d\xba\x9e\xbb\xae\xc6\x05\x29\xc4\x3e\x7c\xe0\xad\x58\x1a\xdd\xb5\xc7\xbf\x84\x1e\xd7\xd3\x5f\xae\x85\xaa\x4f\x3f\x24\x99\x7f\xfc\x0b\xfa\x33\x1b\x60\x3e\x9c\x34\x77\x06\x76\xfb\x03\xba\xc8\xe9\xdf\x1a\x13\x19\x05\x50\x7c\x38\xa5\x1f\x6d\x9c\x02\xc7\x5d\xf1\xdd\x3a\x9a\xcb\x4c\xb1\x03\x4d\x89\xd3\xfc\x3d\x14\xfa\x16\x6d\x59\x8f\x7d\x98\xe4\xa5\x97\x7a\x59\xe5\x85\x9a\x82\xe1\x5c\x57\x28\x06\x12\xfd\x8a\x8f\x38\xa0\x85\x6f\x7e\x8c\x34\x15\x1e\xe2\xa2\xe1\x2b\x18\x1b\x33\xb7\x9e\x40\x7c\xfa\xcb\x14\x26\x61\x9b\x0f\x56\x24\xc5\x0b\x55\x00\x75\xac\x3f\x0e\x99\xec\x5e\x58\x5c\xd7\x30\xd9\x18\xbf\xbb\xb3\xe3\x30\x51\x55\xf8\xcc\x33\x85\x92\xb8\x65\x6f\x75\x0d\x17\x7e\xa1\xb8\xf4\x1f\xe2\xf8\x9f\xc7\x4a\x3e\xd3\x06\xc3\xb1\xf2\x3e\x9a\x62\x69\x5b\x59\xf3\x1d\x3f\xe3\x48\xe9\xe8\xb8\x96\x4e\xcd\xcc\x88\xcf\x6c\x73\xa5\x4c\x92\xaa\xe9\x5b\x62\x5e\xb2\xa7\x22\x57\xaf\x8e\xce\x2e\xce\x59\xc3\x15\x5f\x42\x9e\x4a\xb7\x05\xe6\x1d\x55\x15\xff\x9f\xd0\xe7\xe7\xb6\xc5\xd9\x6a\x05\x7b\x27\x54\xe9\xe1\x18\xc9\x26\x85\xea\x78\xf8\x78\x5e\xbc\xa6\xfe\x78\xe6\xde\xec\xd0\x3d\x07\x7d\xd2\xcc\x6b\xb7\x0a\x75\x60\x7e\x71\x7f\xc3\xc2\xb2\xb6\x9b\x4b\xfa\x06\x6b\x31\x91\xbf\xbf\xc5\x9e\xf3\xac\x71\x48\x6a\x5e\xdf\xe6\x8f\xe6\x44\xc6\x2a\x66\x5b\x9f\x6c\x0c\x65\x4d\x6b\x4d\x3e\xff\x44\x9e\xbf\x26\xb1\x4b\xa6\x67\x05\x0c\x1e\x32\xf4\x00\x4d\x31\x47\x99\x33\x5f\x4e\x4b\x48\x15\xc7\x8f\x64\x5d\xa5\xc6\x58\x2c\x30\xb9\x4a\x3b\x5a\x86\xcc\xba\x5d\xa2\x58\x3e\x92\x3f\x2d\x70\x30\xef\x1c\xab\xa9\x36\x3c\x54\x79\x1d\xc6\x64\x2d\x8a\xc9\xf4\x05\x56\xec\x92\xf1\xe2\xd1\x92\x8e\x6c\xb8\xab\x56\x68\x10\x71\xec\x89\x64\x97\x40\x14\x1b\x0d\xb1\xad\x94\xae\x3d\xae\xb4\xaa\xa0\x75\xf6\x38\xac\x2a\xd4\x72\x12\x0b\xe0\x8f\x71\x9d\x09\x57\xf5\x24\xe3\xef\xf8\x19\x2b\x87\x10\xd6\xe0\xb8\x90\x71\x1c\x53\x7a\xaa\xa8\x8f\xcd\x5f\x85\xc5\xfc\x96\x15\x8d\x90\xdc\xfb\xb2\x0a\xdb\x8e\xa2\x90\xf3\x8c\x87\x60\x8f\x99\x98\xc2\x74\xcc\x66\x3f\xc1\xfa\xc3\xb7\x3f\x7b\x77\xe8\x97\xd3\x57\x8b\x05\x54\xee\xc3\xe9\x25\x7d\xcf\xf5\x97\xd9\x38\x90\x08\x7d\x0b\x19\x3f\xf5\xfa\xcf\xce\xcb\x8a\xb9\xe1\xd5\x35\x84\x1e\x48\x9e\x66\x7c\x72\x39\x65\xdf\xe7\x4c\x97\xc5\xef\xe7\xa3\x6a\x31\x5a\xc2\xb4\x8f\x99\xd0\x3b\xfa\x56\x5f\x06\x54\xcf\xe2\xd3\x1b\x0f\x86\x99\xf6\x65\xb5\xfe\xe9\x5b\xfd\x8a\x6a\x30\x4f\xff\x70\x72\x72\x42\xee\xc4\x84\x3e\xca\xe5\x89\xff\x5b\x6b\xeb\xd3\x0b\x74\x22\xcb\xf5\xa9\xb7\xf9\x89\x96\xb3\xd1\xc5\xed\x69\xba\xe2\x58\x8a\xf8\xe5\x76\x2e\xc2\x07\x63\x03\xe9\xc0\xb8\x67\xa9\xee\xa6\x81\xcc\xdd\x86\x57\x8f\x3b\xb2\xe3\x8a\x76\xd8\x47\x93\x07\xb1\x14\x81\x2a\x5d\xbe\x67\x21\xd4\xc1\xa9\xa2\x3a\x2e\x5a\xd4\xb4\x86\xcf\xe5\xc5\x62\xd2\xdc\xd8\x30\x27\xd5\x3f\x3c\x1d\x2e\xe5\x54\xe3\x9e\xa9\xae\x35\xeb\xff\x80\xd6\x64\xe1\xb2\x83\xf0\x05\x6a\xcb\x8e\x8e\x7e\xe4\xb0\x04\x73\x74\x14\xa6\x86\x5c\x25\x7c\xb2\xff\x30\x0a\x36\x8c\x82\x71\xe8\x90\xc7\x02\xa3\xf8\x7c\xac\x19\x2a\xa7\xcc\x0c\xdd\xc7\x90\xe7\xf7\x80\x42\x2d\x55\xf4\x53\x47\x4d\x8c\xbe\x45\x54\x85\x36\xed\x58\x73\xc7\x7b\x83\x41\x72\xd8\x79\xab\x83\xf6\x70\x60\x1c\xd8\x9e\x10\x85\x41\xf2\x89\xde\x02\x70\x25\x75\x27\x7b\x67\x98\x76\x07\x5a\xe7\x4b\x78\x2c\x8a\x6b\xb3\x77\x03\x37\x79\x72\xfe\x95\x50\x14\x13\x4d\x83\x51\xa5\x95\x75\xa3\xa1\xb5\xb1\x5c\xe0\x81\x8b\xa7\x29\x57\xf8\x72\xb1\xcd\x57\xa3\xc3\x67\xff\x37\x00\x00\xff\xff\x1f\xb2\x0b\x70\x99\xa2\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\x1c\x37\xb6\xd8\x77\xfd\x0a\xd4\xdc\x54\x89\x64\xcd\x34\xe9\xdd\xec\xae\xc3\x44\xd9\xa2\x25\x79\x4d\x5b\x0f\x46\x94\xbd\xd9\x52\x5c\x1e\x4c\xf7\x99\x19\x88\xdd\x40\x2f\x80\x26\x35\x9b\x9b\xff\x9e\xc2\x39\x78\x75\x4f\x73\x38\x94\x45\xc7\x4c\xdd\xdd\x0f\x16\xc9\x6e\xe0\xe0\xe0\xbc\x5f\x6d\x35\x17\xd6\x9c\x3e\x99\x31\xc9\x1b\x38\x65\x7c\xb9\x14\x52\xd8\xcd\x13\xc6\xda\x9a\xdb\xa5\xd2\xcd\x29\x5b\xf2\xda\x80\xfb\x8d\x56\x4b\x51\x83\x39\x7d\xc2\xd8\x8c\xfd\xd0\x2d\x40\x4b\xb0\x60\xe8\x47\xc9\xad\xb8\x06\xfc\xf7\xdb\x16\xe4\xe5\x5a\x2c\xed\x13\xc6\x2a\x30\xa5\x16\xad\x15\x4a\x9e\xb2\xb3\xba\x56\x37\x86\x95\x4a\x1a\xb7\xb3\x14\x72\xc5\x6e\xd6\xa2\x5c\x33\xa9\x2a\x30\xcc\xae\x81\x09\x69\x61\xa5\xb9\x7b\x81\xb5\xaa\x3a\x30\x87\x8c\x6b\x60\x50\x8b\x95\x58\xd4\x6e\x03\xc6\xac\x62\x0b\x60\xa6\x5c\x43\xd5\xd5\x50\x31\x25\xa7\x6c\xc1\x0d\xfe\x8b\xd5\x7c\x01\xb5\x71\xff\x72\xcb\xb9\x85\xa7\x4c\x69\x76\x23\xec\x1a\x17\xd7\xb3\x56\x55\xf1\xa4\x8c\xcb\x0a\xd7\xe4\xd2\x8a\x59\xf8\xed\xe8\x72\xad\xaa\x1c\x88\xdc\x22\x40\xbc\xd6\xc0\xab\x0d\xd3\x9d\xc4\x73\x64\xfb\x99\x02\x57\x3c\xb7\x4f\x0d\xab\x84\xe1\x0b\x07\xe3\x62\xc3\x2a\x58\xf2\xae\xb6\x05\xe1\xb2\x05\x6d\x45\xc0\x26\xa1\x1f\x24\x3e\x4b\x67\xdc\xb4\x70\xca\x16\x4a\xd5\xf8\x63\x0f\x8f\xcf\xb9\x74\x08\xe8\x1c\x88\x56\xf9\xd7\xdc\x21\xfd\x6e\x8c\x33\xbc\xd9\xc2\x61\x9c\xfe\x69\x98\x59\x3b\xb0\xed\x5a\xb8\x0b\x68\x1a\x25\x71\xdd\x08\xca\xa6\xc8\x00\x69\x55\x35\xcb\x68\x61\x37\x34\x67\xf5\x0d\xdf\xb8\x45\x67\xb5\x2a\xb9\x05\xc3\x9a\xae\xb6\xa2\xad\x81\x69\x68\x6b\x51\x72\xc3\xd4\x72\xeb\x72\x05\x21\xcc\xf0\x06\x3c\x24\x0e\x77\xec\xc0\x63\x89\x1d\x21\xdd\x1d\x1d\x6e\xc1\x95\x5f\xd4\x9d\xc0\xbd\x81\x6b\xd0\xbf\x09\x6c\xee\x89\x08\xd7\x8c\xc8\x26\x03\xef\xe9\x87\x9f\x8d\xd5\x42\xae\x9e\x6e\x03\xf9\x02\x96\x42\x82\x61\x9c\x19\xb0\x0e\x9e\xbd\xd9\x81\x58\xc1\xc3\xb8\x37\x43\xdc\x76\xd5\xbf\x12\x6a\x64\x90\x03\xb7\x6c\xbd\x61\x76\xad\x0c\xb0\x86\xdb\x72\xed\xd8\xc3\x6d\x8d\xab\x33\x03\x35\x94\x56\xe9\xa9\x87\x5a\x43\x8d\xa2\xc3\x1d\xc5\x3d\xb5\x12\xd7\x20\x11\x38\xd3\xf2\x12\x0e\x89\xe5\xec\x1a\x46\x50\x61\xd6\xaa\xab\x2b\xc7\x0b\xf1\x86\x2b\xbf\xac\xe3\xf7\x9d\xa4\xf3\x58\x0f\x2b\x95\xdd\x71\xe0\x70\xdc\x45\x27\xea\x0a\x74\x4f\x90\x5b\xdd\x7d\x19\x39\xfe\x7e\x0d\x61\x03\x92\x2e\x4c\x18\x92\xad\x92\xd7\xf5\x26\x0a\xa6\x0a\x2c\xe8\x46\x48\xc0\xb3\x2e\xc0\x58\xe6\x04\xbf\x85\xd5\x26\xca\x71\xb7\x8c\x13\xc2\x4e\x2b\x2c\xc5\xaa\xd3\xc0\xce\xd3\xd9\x7f\x10\xd6\x3c\x02\x79\x79\x0d\x7a\xa1\x0c\xdc\x09\xc8\x4b\xda\xd9\x3f\xce\x6a\xb5\x5a\x79\xdd\x41\x78\x28\x55\xd3\x2a\x09\xd2\x7a\x45\x63\xba\xb6\x55\xda\x32\x61\xd9\x01\x14\xab\xc2\x83\xf0\x03\x97\xe2\x2a\xe0\xae\x55\x55\x5f\x46\x46\x54\xed\x49\xda\x67\xac\x16\x86\x68\x3a\xbe\xea\x55\x6c\xab\xd5\xb5\xa8\x08\x6b\x36\x5c\x3a\xb3\xdc\x5c\x45\x42\x2b\x1d\x07\x3c\x1c\x99\x3d\x77\xcb\x7b\x22\x2b\xfb\xd7\x98\x08\xe6\x1a\xb4\x11\x4a\xa2\x28\x3f\x6b\x79\x19\xdf\xfb\x01\x4f\xab\x3b\x69\x45\x03\x48\x65\xc8\x80\x50\xb1\x5a\x2c\x34\xd7\x02\xcc\x94\xd1\xca\x9e\xad\x82\xbe\x7e\x04\x44\xe7\x8f\x35\xf3\xa7\xcf\x00\xa2\xab\xde\x06\xc9\x21\x14\xef\x6b\x76\x35\x0b\x48\xf1\x6f\x3b\x10\x3b\x03\x6c\xa9\xf4\x50\xef\x14\xec\xdc\x32\x75\x0d\x5a\x8b\xca\x13\x15\xc3\x67\x82\x36\x0c\x4b\x38\xc9\xe8\x35\x67\xc6\xc2\xec\xc2\x53\x46\x12\x4e\xa5\x92\x96\x0b\xf9\x90\xe2\xe9\x79\xd8\xe2\x2e\xda\xc9\x68\xde\x1b\x02\x39\x74\x8c\xdd\xac\x41\xc3\x96\x2a\xbe\x11\x75\xed\x2e\x00\x71\xc3\x6b\xa3\x02\xab\x98\xb8\x34\x3d\xe8\xf0\x79\x09\xfa\x5a\x94\x4e\x79\x18\xa3\x4a\x11\x65\xb6\x67\xaa\xb8\xdf\x23\xa0\x39\xde\x59\x75\x27\x14\x93\x49\x4e\xa5\xf0\xcf\x0e\x8c\x9d\x95\x6d\xb7\x27\x85\x36\x42\x8a\xa6\x6b\x18\x6f\x54\x27\x51\x2e\x3d\xbf\xf8\x11\xd7\x11\x9a\x18\x73\xb8\x76\x03\x8d\xd2\x9b\xcf\x5e\x9e\x5e\x1f\xdd\xa1\x16\x8d\xb8\x17\xec\xfc\xd3\x9e\xb0\xd3\xca\xf7\x83\x7c\x6b\xf1\x1d\x90\xc3\xa7\x76\x1f\x8d\x34\x4a\x31\xc7\x81\x5c\x70\x11\x94\xb0\x82\xb3\xab\xc8\x8a\x81\xa2\xfb\xf6\x95\xb6\xd9\x6e\x42\xda\x91\x43\xe4\x8c\xc7\x59\x25\x96\x4b\xd0\x20\x2d\xbe\xec\x21\x46\x4f\xa9\xc7\x16\xc9\xec\x9e\x7f\x7d\xf2\xf5\xc9\xfc\x70\xb8\xed\x4c\x06\x3b\xfd\x0e\x1c\xee\xdc\xde\x2d\x12\xc5\xdf\x4e\x80\x3c\x7f\x24\xb0\xd6\xd6\xb6\x7d\xb0\x0c\x21\x68\x76\x6f\xac\x74\xd2\x19\x55\xe4\x14\xfb\x45\x08\x98\x3e\x4a\xc8\x2a\x30\x3d\xf3\x3f\x80\x9b\xa3\xeb\x76\xa8\x3e\x0b\x69\xb7\x42\x87\xc8\x1b\x05\x31\xe8\x0b\xb4\x27\xb6\x41\xdc\x46\xdd\xbe\x70\x21\x43\x08\x99\xed\xe8\xde\x2c\xc8\xed\x76\xff\xac\xd8\x3c\x13\xd9\xf3\x81\x07\x1e\xb6\x13\x0d\x5f\x7d\xe6\x7e\xe1\xd5\xde\x52\xb3\xb6\xab\xeb\x59\xab\x6a\x51\xe6\x7c\x7d\xd1\xd5\xf5\x45\xfa\x65\x6f\xe9\xa7\x6e\x6d\xf7\x1a\xa3\xd7\x82\x4b\xfd\xef\xe8\xbc\xfe\xfb\xf9\xf2\x8d\xb2\x17\x1a\x0c\x48\xfb\xb4\x6f\xe8\x2d\xc0\xcc\xf6\xd5\x0d\x17\xf8\x38\x59\xa0\xd5\x90\xd1\x69\xad\xe0\x23\x8e\xb1\x1e\x7a\xbc\xf3\xc3\x9e\x04\xbb\x06\x09\xc6\xcc\x9c\xdf\xb9\xd7\x9d\x5d\xe2\x83\xc1\xd4\xb8\x59\x03\x62\x53\x42\x69\x85\x5c\x15\xce\xc7\x72\x7b\x21\x55\x7f\xf7\xfe\xfd\x45\xc1\xce\xda\xb6\xf6\xd6\x28\xfa\x54\x7e\xc7\xa4\xa0\x16\x50\x8c\x41\xe4\x1c\x3c\xc1\xeb\x59\x05\x35\xdf\xf4\xf9\xef\x8f\x7f\x18\x09\x12\x74\xcd\x02\xb4\x13\xa8\x06\x4a\x25\x2b\xc3\xf8\xd2\x82\x1e\xe0\x62\xcd\x0d\x33\x96\x6b\x67\x3e\x2e\x60\xa9\xf4\x38\x40\x06\x1d\x74\x82\xc0\x0e\x65\xbe\x87\xcf\x59\x5e\xaa\xb3\x9f\x0f\x19\xb1\x20\x4a\x2a\xb7\x27\x73\x0b\x1a\xa6\x3a\x3b\xc4\x99\x87\x2c\xec\xbc\x03\x67\x2d\x68\xa1\xaa\xbb\x41\xfa\x4e\xdd\x30\xb5\xb4\x80\x26\x63\x0b\xda\x19\x6f\x09\x92\x5b\xef\x6c\xc7\xce\xa6\x2b\x4b\xc4\xca\x5a\x83\x59\xab\x7a\x0f\x20\x5e\x7b\x25\x5e\x2a\x69\xa0\xec\xd0\xa5\xf6\xcb\x80\x49\x52\x9c\x70\xa3\xc8\x5f\x96\x46\x54\xa0\xa1\x0a\x0f\x2e\xbb\xda\x63\x87\x70\xba\xe6\xd7\xce\x19\x5b\x72\xe1\xec\xff\xfb\x1f\xc3\xbd\xd8\x69\xf8\xb5\xc7\xf0\xcb\xdc\x79\x0a\x82\x73\xec\x04\x78\x3e\xa8\xee\x73\x08\x0d\xbc\x12\xbf\x2d\x33\xc7\x2d\x6f\xe3\xe6\x04\xd3\x6f\xc5\xce\xa3\x20\xed\xe0\xe7\x04\xe1\x6f\xce\xd0\x71\xeb\x5d\x78\x7b\x20\x96\xde\x6b\xef\xc7\xc0\xd4\x7b\x1d\xe4\xf7\xcf\xd6\x5b\xc7\x88\x7e\xb6\x46\x67\xee\x21\x52\x39\x68\xb3\x3c\xd7\xce\x60\x18\xf5\xaf\x3b\x63\x55\x23\xfe\x15\x22\x7f\xee\x08\xaa\x43\xba\x27\xa2\x14\x25\xa1\x51\x34\xa0\x8f\x1d\x9c\x3e\x5e\x9d\x59\x6c\xa6\x60\x7f\x5f\x8b\x1a\x98\x54\xba\xc1\xb8\x22\x97\x3d\x27\xdc\xbb\x3d\x86\x71\xd6\x2a\xb7\x2d\x2e\xb9\x00\xc6\x29\x23\xd1\xb5\x14\xf2\xa1\x0c\xcd\x94\x19\xd5\x40\xdc\x1e\xa3\x58\x66\xea\xb0\xba\x66\xdc\xb0\x05\xb7\xe5\x9a\x7d\x54\x0b\x33\x0d\x0b\xe7\x2b\x96\x56\x5c\x63\xe0\x88\x5b\x66\x5a\x28\xc5\x52\x94\x6c\xad\x3a\x1d\xc3\x06\x15\xdf\xc4\x3c\x13\x4f\xdb\xa0\xcc\x42\x5f\x4d\xc8\xce\x86\xdc\xd0\xb7\x4a\xd3\xce\x1e\x0a\x14\x4d\x7d\x6c\x36\xdc\x82\x16\xbc\x0e\x48\xcc\x4f\xce\xdd\x99\x7b\xd7\xc6\xf0\x32\xbe\x57\x0b\x26\xa4\xb1\xc0\x2b\xb7\x25\x77\x02\x4e\x56\x5c\x57\xac\x82\xb6\x56\x9b\x06\xa4\x9d\x32\x21\x99\xd2\x18\xbb\x55\xcc\xf0\x6b\x47\x40\x46\x75\xba\x04\x43\x62\x3c\x48\x99\x7c\xc7\x4a\x81\xc1\xd0\xb3\x04\xba\x61\xb4\xe6\x1d\x71\x43\x55\xe4\xe1\x9e\x10\xb9\x74\x92\x95\x2d\xb5\x22\x41\xb2\x54\x75\xad\x6e\x82\x1e\xc9\xc2\x9c\x98\xcc\xb8\xe6\x75\x87\xc8\x0d\x9e\x56\xc4\xc4\x29\x9b\x23\x89\xcc\xa7\x6c\xee\x7e\xeb\xfe\xfb\xcf\x8e\x6b\xfb\xaf\x79\x81\x26\xb9\xee\x6a\x7f\x7e\xc7\x57\x9d\x71\x8c\x92\xa3\x26\xa2\x85\xfb\x28\x4e\x84\xe4\x94\xcd\xc2\xe2\xa7\x74\x6e\xba\x33\xe3\xb0\x1f\xee\xfd\x46\x0b\xeb\xe4\x22\x37\x04\x14\x7c\x6a\x35\x18\x43\xd4\xf9\xb2\x58\x15\x7e\x89\x53\x2b\xca\xab\xbf\xd2\x02\xcf\xfe\x7c\x72\x72\x72\x32\x2f\xdc\xfa\x03\x98\x4f\x43\x48\x49\xa6\x73\xa6\x25\x13\x92\xbd\x96\x8a\x3a\xe2\xc0\xcb\x8c\x89\xff\xc5\x84\xb5\x9c\x1c\x40\x03\x36\xc4\x92\x4e\x0e\x03\x48\x6e\xdd\x53\xcb\x17\x7f\x0d\x19\xa1\x67\x27\xc7\x7f\xf8\x4f\xff\xbb\xad\x3b\xf3\x7f\x8e\xc6\xfe\xf3\xd7\xb9\x23\x5d\x0f\xe5\xa9\xd5\x62\xb5\x02\xfd\x57\xb7\xcc\xb3\x13\x7a\xe2\xe4\xf8\x0f\x3b\xdf\x2f\x9e\xfe\xfe\x83\x57\x01\x1b\x7b\x7a\x7b\x81\x72\xc2\x6b\x51\x72\xdf\xac\x55\x3d\x8c\x90\x2e\xb3\xc4\xa2\xea\x6c\x8c\x93\x3a\xe8\x2a\x28\x6b\xae\xa1\x42\x36\xdf\xb0\xa6\x33\xd6\xc9\x74\x88\x39\xc6\xe1\x16\xc2\x34\x50\xae\xb9\x14\xa6\x71\x98\xb8\x51\xfa\x8a\x95\x4a\x6b\x28\x6d\xdd\x3b\x51\x62\xa4\x3d\xce\xf4\xf4\x0c\x51\xc4\x99\x81\x96\x6b\x1f\x05\xa7\xc0\xbf\x8d\x11\xf3\x61\x06\x22\x63\xf7\x28\xd3\x83\x76\x8a\x72\xc4\x23\x26\x01\x1b\x29\x3c\x1e\x4c\x18\xe6\xc9\xca\x39\x9f\x9f\x62\xaa\x68\xb1\xc9\x98\xb5\x38\x0b\x99\xcc\x20\x61\xe3\x9e\xda\xad\x90\xa4\xb0\xdb\x11\x78\xb9\x0e\x4f\x42\x96\x3b\xf1\x5c\xe0\x81\xf2\x2b\x7a\x4e\x4f\x4f\x91\xcc\x45\x56\x99\x85\xbf\xe5\x9b\xa5\xbd\x0e\x84\x7d\xfa\xd4\xe9\x56\xf4\xc0\x99\x90\x59\x08\x7c\xae\xf4\xaa\xe0\x98\x72\x28\x30\xb2\x5e\x5c\x9d\x86\x08\x3b\xf2\xbe\x4f\x34\x6c\x0e\x8b\x4b\xca\xe5\x40\x35\x14\x7f\x65\xa7\x35\x48\x5b\x6f\x4e\x03\xac\x41\x6a\x78\xb8\x9c\x12\x8b\x52\x2f\x8f\x00\x2c\x79\x5d\x2f\x78\x79\x75\x27\x6b\xfd\x68\xa0\x17\xb1\xa7\xbb\x16\x4d\x5b\x83\x53\x09\x24\xe2\x3d\x1d\xd0\xee\x0c\x64\xd5\x2a\x21\x2d\x3b\x08\x5b\x1f\xc6\x6b\x8f\x0a\xc6\xea\x0d\xe6\x3b\xd5\x2e\x6d\xc5\xcd\x88\x3c\xee\x53\xb1\x24\x1c\x94\x9b\xed\xc0\xc9\xad\xd4\x7c\xe9\x6f\xde\xb0\xb5\xba\x41\x53\x48\x03\xb7\x69\x31\xeb\xf5\x53\x48\x0c\x71\xe6\xb6\xfd\x89\xd7\xa2\x62\x4e\xe1\xe4\x2c\x7a\x3a\x63\x13\x2c\x4e\x99\x9c\x32\x4e\x45\x2a\x1e\x4e\x34\xb2\x74\x27\xb3\x75\xeb\xcd\x7f\x9d\xb1\xc9\xb7\x4a\x2f\x44\x35\x89\x11\x92\xc3\x53\x47\x71\x0b\x51\x85\x65\x33\x40\x74\x27\x9d\xa5\x71\x25\xda\xd6\xa1\x4b\xc2\x27\xfc\x1d\x13\x4b\x47\x55\xce\x32\x32\xf8\xf3\x9a\x1b\xf9\xf4\xa9\x65\x4b\x21\x85\x59\x43\xc5\x36\x60\xdd\x5e\xef\xa0\xad\x79\x09\x93\x40\x20\x25\x97\x25\xd4\x26\x51\x4e\xac\x42\xf9\xe8\x34\x1d\xa6\xb9\xf0\x0d\xc3\x84\x0d\x16\x89\x84\x1b\xa6\x24\x3c\xbd\x6f\x34\xff\xac\xb3\xaa\xe1\x56\x94\xc8\xaf\x64\x47\x8c\x19\x24\x41\x5c\x22\xef\xf3\xba\xf6\x72\xd0\xa1\x17\x84\x5d\xc7\xb0\x29\x5a\x06\x68\x93\x3b\xe3\x20\xb3\x94\x9c\x11\xdc\x35\xa0\xd9\x81\x92\xf5\x66\x27\x17\x20\xdf\x98\xc0\x50\x81\x30\x95\x76\xcb\x71\x63\x9c\xbd\x9d\x56\x03\xd4\x89\x95\x70\xe2\x73\x8e\x62\x64\xeb\xa1\xc3\x02\xa3\x86\x21\x8e\x8e\xa2\x2f\x50\x47\x5d\x6f\x83\x68\x06\xf2\x9b\x1e\x40\x10\x93\x2d\xec\x15\xbb\xb3\x19\x4d\x30\xc5\x59\x56\xa6\x11\x20\xfb\xaa\x99\x8f\xbe\x32\x3f\x39\xfe\x8a\x1d\xd1\xff\xe7\xd3\x1b\x34\x85\xe7\x7f\xfc\x53\x43\xba\xfa\x4f\x27\x66\xee\xf3\x96\xfd\x18\xaf\x47\xef\xac\x02\x5e\xd5\x42\xc2\xcc\xdb\x0c\x7d\xb7\xe5\xcf\xff\x79\xfb\xa6\xdf\xe2\x7f\x79\xcd\xc2\xab\x2c\x33\x41\x9c\x38\x8d\x57\xe7\x0e\xee\x48\x4d\x2c\xdd\x79\x1b\x81\x0e\x5a\x2c\x3f\x71\x17\xe6\xcf\xea\xde\xe2\x72\xe3\x5c\x14\xe3\xf4\x24\x7b\x2d\xf0\x78\xce\xce\xce\xf9\x13\xf3\x69\xe8\x08\x75\xd2\xd2\xf1\xc9\x11\x72\x24\x6b\x92\x47\x53\x41\x0b\xb2\x02\x59\x52\x7a\xfb\x81\x92\x87\x2f\xb2\x5d\x76\x16\x38\xf0\x1e\x6f\xf0\xaa\x0a\x49\x59\x8f\xdc\x6c\x99\x58\x8e\x33\x64\x9d\x50\xf1\xe1\x16\xd5\xec\x86\x4b\x1b\x64\xce\x20\x1f\xc8\x3e\xfc\x9c\xe3\xa1\x56\x9b\x87\x4c\xa0\x86\x1d\xc6\xfd\x3b\xf8\xd4\xd6\xa2\x14\x4e\xf4\x50\x89\x0b\x9e\xe0\x4a\x48\x54\x0b\x6b\xb1\x5a\x23\x06\x6a\xb8\x86\x3a\xba\x17\x74\x54\xbc\xea\x71\x31\xf2\x08\x12\xa0\xee\x88\x7b\x68\x27\x5f\xe9\x78\x2b\xa6\x2a\x30\x28\x68\x92\x5b\x46\xc8\x5b\x80\xbd\x01\x90\x6c\x9e\xfe\x30\x9f\xe6\x66\xc1\xec\xa3\x5a\x90\x00\xb8\xa2\x9b\x9c\xf9\x3c\xcc\xdc\x87\xe0\x9c\x12\x0c\x2c\x9a\xfc\x3a\xc7\x87\x41\x47\x24\xa3\xa8\x87\xfa\x3e\x69\xb9\x9d\x1f\x94\xc1\xc2\xb1\x23\x7b\x69\x30\xad\x92\x06\xab\xda\x1c\xb8\x2b\x90\xa0\xd3\x59\x32\x13\xa2\x07\x21\xcb\xa8\xaa\xe1\x57\x4e\x2d\xec\xc8\xd7\x87\xfa\x84\xb2\xee\x8c\xdd\xca\xb8\xe7\x1c\x06\xf2\x5a\x68\x25\x1f\x16\x0f\xd9\x26\x09\x11\x5d\x88\x83\x78\x61\x63\x15\x13\xf2\xa3\xa3\x9c\xe8\xcd\xf7\x81\x63\xec\x9a\x6b\xe1\xc8\xdb\x84\xf3\xe5\x67\x8f\x21\xcf\x14\xec\x98\xbf\x39\x7b\xfd\xf2\xf2\xe2\xec\xf9\x4b\xa7\x60\x2f\xde\xbe\xf8\xc5\xfd\x82\x74\xac\x72\xba\xfa\x31\x14\x5d\xc5\x73\xcd\x1a\xb0\xfc\x4e\x78\x28\xf3\x65\x3c\x2e\xbd\xc1\x9b\x21\x82\x0c\x8c\x84\x8b\xfc\x6e\x22\x7e\xb7\x52\xbf\x8e\x1c\x7a\x59\xb1\xb5\xb5\xed\xac\xd5\xea\xd3\xdd\xb5\xa9\x17\x5a\xb5\x7c\x85\x55\xa9\x68\x78\x7f\xf7\xfe\xfd\xc5\x2f\x17\xef\xde\xfe\xcf\x7f\xb8\x5b\x71\x3f\x5d\xfa\x1f\x09\xb6\x37\x6f\xc3\x8f\xc3\xfb\xcf\x29\x60\x07\x6c\xd7\x5c\xdf\xbf\x28\x2c\xad\xec\xdd\x40\x27\x61\x92\x2a\xbb\x50\x55\xc1\x5e\x47\x97\xf6\x87\x97\xff\x78\xf6\xd3\xd9\xab\x1f\x5f\x06\x63\x67\x23\x2d\xff\xc4\x0e\x04\x4c\xd9\xeb\x7f\xfc\xf2\xd3\xd9\xbb\x67\x93\x66\x43\x06\xf8\xe4\x30\x49\x1d\xd0\x5a\xe9\xd9\x9a\xcb\xaa\x7e\x48\xad\xd6\xdb\xc6\xdb\x82\x7e\x27\xcf\x80\x81\x5e\x3d\xcb\xbd\x74\x2f\xb0\xef\x22\x5c\x8c\x79\x5d\x26\xa4\x8f\xbe\xf6\x22\x92\xa4\xfd\x1f\x01\xf3\x68\x58\xee\x19\x06\x41\x94\xb1\x80\x32\x0d\x4b\x4a\xf6\xc7\xd2\x40\xe5\xfc\xff\xce\x59\xbe\x92\xf1\x16\x6b\xaa\xa9\x6a\x35\xd5\x21\x86\x4d\x57\xe5\x03\x45\xa3\x1d\x9c\x7f\x7b\xce\xde\xe3\x0d\xae\xb8\x5e\xf0\x15\xcc\x4a\x55\x3b\x7d\x6b\xc8\x19\x89\xaa\x30\x56\xf0\x4b\xc5\x6a\x25\x57\xa0\x99\x84\x12\x8c\xe1\xbe\x10\xa7\x6b\x55\x3f\xce\xdc\xb5\x15\xf7\x91\xdb\xdf\xf9\xad\x56\xc2\x94\xea\x1a\xf4\x66\x56\xf2\x72\x9d\x07\xba\x8a\xe3\xf6\x6a\x75\x4c\xab\xc7\xa7\x9e\xbb\x87\xde\x6f\x5a\xd8\x06\xf5\x45\x78\x86\x95\xb5\x70\x22\x10\x17\xf4\x22\xc0\x1d\x60\xca\xc8\xab\x73\x9e\x15\x95\x4c\x3a\xa1\x55\x09\x73\x45\xe6\x09\x95\x26\xcd\xb7\x04\xa6\xff\xfd\x61\x24\x0a\x21\x57\x9a\x52\x6e\xf7\xa2\x8c\xad\xfb\x3f\xa7\x75\x6e\xb5\x57\x95\x8f\x81\x84\xba\x95\x54\x8c\x87\x1e\xf2\x93\x10\xd2\xe9\xd9\xe6\xc4\xe2\xaa\xb3\x46\x54\xc0\x6e\x94\xae\xab\xe0\x4f\x67\x06\x89\xdf\xda\xd7\x9e\x78\x6a\x60\x8b\x50\xea\x41\x27\x77\xe6\x19\x36\x23\xf0\x50\x3e\x85\xf2\xa7\xca\xca\x6b\xf3\xad\x0f\xec\x5a\xab\x6e\x45\x39\xc1\x79\x30\xf2\x08\x4a\x77\xc2\xc3\x47\x40\x8e\x6b\x65\xec\x3e\xa1\x9c\xa3\xa3\x77\xde\xf3\x3e\x3a\x2a\xfa\x15\x47\xee\xf4\x6e\x99\x61\x31\x96\xa7\x9a\xe2\xde\xe1\x8c\xf7\x63\x5e\x1b\x26\x96\x88\x7c\xe2\x35\x0d\x2f\xa4\x33\x98\x69\x72\x6a\xd9\x1f\x39\x86\xc8\x42\x58\x20\xa9\x33\x61\xac\x50\x0f\x28\xec\xce\xdd\xfa\x9e\xd4\x79\xf4\x35\x46\xab\x5a\x43\xc5\xb3\xa7\xb1\x73\x0f\x19\x8b\x8c\xd0\x80\x59\x27\xd3\xd0\x11\x7a\xc9\x75\x66\x26\xa1\x51\xd8\xd9\x05\x0a\xf9\xf3\x0b\xa6\xb9\x5c\x3d\x0a\x69\x88\x88\xd9\x83\xfe\x9e\x07\xb4\xb9\xfb\x3d\xc0\x18\xf9\x2c\xc6\xc8\x0f\xa3\x21\xf4\xfc\xfc\xc5\x3b\x66\xba\x85\x84\x58\x9e\x1f\x3b\x32\x3c\x14\x0b\x22\x19\x5d\x42\x9b\xa5\xb3\xe8\xb2\xd0\x26\x64\x07\xf3\xaf\x4e\x0a\xfc\xff\xf1\xd7\xd3\xaf\xfe\xf2\x87\xe2\xab\x3f\xe3\x0f\x5f\xfd\x61\xfa\xd5\x7f\x71\x3f\x7d\x4d\x3f\xfe\x39\x48\xce\x54\xb5\xd6\x0b\xf3\xd0\xf5\xdc\x89\xe3\x6f\x95\xd7\x79\x40\x26\x17\x7a\x56\xbe\x21\x68\xee\xaf\xba\x40\x62\x2d\x84\x3a\xa6\x45\xe7\x05\xfb\x26\x6e\x9a\xc5\xba\xa9\xa3\x85\x72\x4e\xee\xc2\xc8\xbe\x74\x76\x60\xe6\xc5\x3a\x62\x91\xca\x52\x97\x8c\x0c\x04\x9d\x0a\x46\x03\xfc\x1f\x55\xad\xae\x04\x7f\x40\x16\xf9\x9e\x76\x08\x4c\xe2\xc3\xf9\xa6\xdf\x6b\x42\xa8\x09\x8f\x7e\xcf\xaf\x39\xe3\x2b\x90\x96\xb2\xb4\x97\x00\x68\xcf\x9b\xd3\xe3\x63\x0f\x70\xa1\xf4\xea\x58\x03\x16\x8e\x96\x70\xbc\xb6\x4d\x7d\x8c\x6f\x98\xc2\xfd\xfb\xf7\xcf\x14\x25\x9f\x95\xa0\xf7\x11\xcb\x0e\x89\x17\x2f\x5f\x33\x90\xa5\x72\x4a\xea\xf9\x19\x73\x6f\x8a\x65\xb0\xf0\xdc\x25\xb1\x96\xdb\xf5\x34\xc2\x7b\x0d\x5a\x2c\x83\xcd\x10\xa2\xd5\xf1\x25\x30\x53\x6f\x21\xba\x93\x60\xbc\x62\xde\x6a\x65\x55\xa9\x6a\x8c\xcc\x62\x39\xa8\xf1\xee\x4e\x67\x60\x66\x4c\x3d\xa3\xc5\x66\xbc\xb3\x6b\x90\xd6\x6f\x1e\xd8\xc3\xbd\x84\x74\x98\x2c\x8c\xe3\x6b\xae\x8f\x75\x27\x8f\x0d\x94\x1a\xac\x39\x4e\x85\xcb\x8e\xc8\xbd\xd8\xe3\x25\xc6\x1a\xc3\x8f\xb3\x92\x17\xa5\xb6\xf3\x2c\x6e\x19\xa9\xab\xc7\x78\x1e\x9a\x56\x0b\x59\x8a\x96\xd7\x7b\xfa\x53\x58\xe2\x19\xde\x39\x30\x87\xbe\xe0\x07\x73\x81\x8b\xd0\x07\xe6\x2c\xe8\x68\x6f\x25\xac\x61\xa4\x31\xca\x32\xc6\x38\x56\xba\x04\x81\x1e\x88\x37\x68\xa3\xdf\x02\xc5\xf4\xfc\x45\x38\xcf\xb3\x52\x3e\x33\x1b\x63\xa1\x39\x6d\xb8\xc1\x16\x5b\x27\xec\x30\x69\x2f\x9f\xad\xf9\x8d\x15\x6a\xa6\x64\x2d\x24\x14\xf4\x53\x61\xae\xcb\xb0\x3e\x42\x52\xca\x67\x4b\x07\x8d\x53\xa5\xaa\x86\xc2\xfd\x80\x0f\xed\xb8\x8a\x64\xed\xee\xcb\x5d\xaf\x84\xb1\x40\x4d\x19\x98\xae\x2d\xb9\xb1\xa1\x8b\xc0\xec\x2c\x76\x85\x4f\x16\x64\x05\x55\x40\x55\xb9\x86\x3d\xf2\x6e\xaf\xb9\xac\xf0\x02\x31\xe4\xb4\x75\xaf\x3e\x82\x61\xd2\xad\x2f\x6b\xbe\x0a\x31\x9c\xb0\xa5\x47\xd3\x15\x6c\x58\x67\xf8\xca\x59\xb0\xa8\x98\x7f\x8b\x8b\x26\x11\x7f\xfb\x15\xec\x69\xe1\x39\xea\xff\xce\x59\x71\xbc\xaa\xb4\xa7\xdd\x54\xf1\x16\x28\x18\xe5\x68\xec\xe9\x14\xd2\x49\x14\x4c\xad\xcf\x27\xff\xeb\x68\x32\x4f\x59\x9e\xf9\xc4\xeb\xd0\x09\x9e\x14\x99\x67\x1a\x6c\x7b\xd0\x06\x5f\xa6\xe8\x2b\xba\x30\x12\x2c\xa6\xa5\x51\x37\x2f\x79\x99\x3a\x79\x43\x68\x75\x72\x34\x19\xf4\x15\x70\x63\x6e\x94\xde\x27\xd6\x8b\xac\xed\x1f\x27\x41\x88\x59\x8f\x1e\x8a\xa7\x6c\x78\x59\x68\xd6\x77\x06\x74\x3c\x57\x4b\xad\xc7\xa8\x5f\xef\xdd\x59\x31\x22\x08\xa8\x02\x3f\xeb\x06\xf8\xcb\x5f\xbe\x9e\x0f\x5b\x05\x91\x5e\xf6\x3d\xa4\x7f\xdc\xd7\x7c\x26\x0f\x10\x8b\xf8\xf1\x62\x3c\xcd\xf5\xeb\xfb\x0d\x52\x90\x3f\x66\xa2\xa3\x0c\x10\x87\x87\x3d\x81\xc0\x2c\x49\x72\x43\x47\x70\xdd\x5f\xf7\x76\xb2\xbf\x93\x7b\xff\xbe\x06\x3c\xdf\x36\xe7\x9a\xac\xf3\xf8\x16\x28\xb6\x48\xec\x2e\x56\xa2\xfb\xbf\x7f\x7c\x8e\x57\x95\xf0\x79\xbb\x40\x01\x7e\x29\x67\xce\x57\xd8\xb7\x5c\x09\x79\x4f\x43\xe6\xdf\xf0\xdf\xb3\x8f\xd7\xcd\x8c\x8c\xa5\x0f\xdf\xff\xf4\x3a\x08\x6c\xe4\xd3\x7e\x9f\x9b\xdf\x32\xc5\xcf\x3f\x5e\x37\x0f\x17\xc6\xfb\xfe\xa7\xd7\x83\x78\xb9\x1d\x3a\x8d\xf8\x88\x33\xd2\x75\x27\xb7\x5a\xe9\x1f\x81\xf3\x52\xc1\xa2\x5b\xdd\x9d\x9c\x8f\x66\xad\x86\x46\x59\xa0\xd7\x56\xbe\xdc\xd1\xc7\xba\xfc\x2f\x1d\x25\x13\xd4\xdc\x5a\x5e\xae\x21\x96\x4c\xb2\x80\xb1\x29\x83\x62\x55\x4c\x7d\x1d\x1d\xb6\x09\x2d\x95\xbe\xe1\xba\x22\x7e\xec\x01\x37\x33\x9d\x69\x41\xde\x8d\xab\x4b\x7a\x8e\x6e\xc1\x72\xbd\x02\x8b\xd7\x23\x9a\x06\x2a\xc1\x2d\xd4\x9b\x50\x81\x6d\x63\x97\x4d\xcd\x8d\x71\xb7\x5b\x2b\x4e\x3a\x30\x09\x2d\xe1\xf4\xaf\xf3\xd2\xf6\xd8\xdb\xd9\x28\xd6\xf8\xd2\x6f\x7c\xc5\xdf\x99\xd3\x16\x58\xa3\x18\x88\x45\x0c\x7b\x5f\x6a\xb5\x32\xe3\x5c\x7c\xb8\x85\x0a\xaf\xd7\xf6\x91\x61\x9a\x4b\x83\x92\x39\xe8\x42\x6e\x83\x2e\x54\xc8\xd4\xde\x40\xc1\x61\x0d\x70\x53\x6f\x58\xcd\x3b\x89\xd7\xe5\xc0\x1c\x02\x74\x74\xfa\xa7\x93\x93\x3f\xf5\x40\xfa\x5c\x49\xe2\x96\x4f\xef\x26\x83\x97\x1b\xe3\xac\xfc\x7d\xd2\x9e\x99\x2c\xfa\xe9\x75\x7a\x95\x1d\x74\x06\xd8\xfc\x95\x90\xdd\xa7\x79\xf6\x6b\xef\x65\x2b\x9d\xc2\x81\x57\xbc\x81\x1a\xec\x03\x66\xf7\xc3\x0e\x49\x82\xdc\x95\x04\xf8\x21\xbc\x21\x64\x88\x30\x3d\xda\xc0\xff\x67\xd4\xfc\x78\x2c\x50\x18\xdd\x2b\x8c\x2a\x21\xc5\xf1\x94\x5d\x83\xd0\x31\xd4\xd9\x53\x0d\x21\x02\x9c\xc2\xa2\x31\xa0\xd1\xeb\xa2\xd9\xcb\x90\x7c\x7e\x4b\x01\xa3\x07\x86\x26\x69\x20\x23\x29\x5e\xa5\x1c\x4d\x28\xc4\xca\xae\x2c\x11\x5c\x3f\x8f\xbe\x4f\x44\x22\x52\xda\x16\x6d\x0d\xe2\x1d\x3b\x22\x74\x41\x47\xa3\x31\xe8\x53\xf3\xa3\xa4\xc5\x4d\x5c\x35\x44\xec\xc6\x4b\xbc\xb3\x80\x74\xca\xaf\x53\x20\xe3\x9d\x4f\xfd\xe7\xd5\xf5\xf9\xc2\xa9\x43\xbd\xaa\x0c\x92\xc8\xcc\x94\xbc\x76\xaf\x1c\xb8\xeb\xf5\x3f\xcc\xac\x9a\xfd\x0b\xb4\xa2\x82\xab\x25\x70\xdb\x69\x30\x53\xb6\xe8\xac\x1f\x81\x12\x7e\x87\x09\x16\x2c\xe3\x6a\x80\xbb\xad\x97\x5d\x9d\xec\x5e\x5f\x19\xe6\x64\x02\x05\x54\xa3\xcd\x8a\x0b\xa7\x70\xea\xa3\xe0\xa6\x80\x1c\x14\x6b\xf7\x0b\x37\xda\x8c\x64\xb2\xa5\xbc\xf6\x0b\x1b\xfa\x42\x31\xab\x30\xaa\x36\x5f\xb7\xbc\xc8\x1e\x2e\x3c\x01\x17\x15\x5c\xe7\x3e\xd2\xd5\x8e\xc7\xf2\xcd\x0e\x8b\x77\x8e\xa9\x43\x38\x21\x80\x53\xa9\xb2\x8b\xb5\xa1\x59\x54\xa4\x51\xd8\x0d\xe5\xf8\x23\x9a\x52\x63\xd8\x68\xc0\xea\xd0\xe4\xf1\x6b\xd1\x41\x6b\xdd\x86\x8f\xac\x7c\x34\x06\x4d\xa9\xd8\x4a\xb3\x79\xd9\x76\x73\xff\xe3\x3d\xcf\x1c\x4f\x1b\xbc\xe3\xbb\xcf\x4c\xb6\xcd\x5d\xbe\xda\x25\x78\x83\x04\xc5\x02\xd6\x03\xc7\x03\xf8\x8a\x29\xa5\x71\x6e\x40\x0b\xba\x74\xe0\xac\xd0\x61\x75\x36\x14\x4d\x8b\xc9\x8c\xb6\x6d\x34\x1d\xa6\xe2\xe8\x0b\x55\xed\x79\x50\xbf\xe2\xae\xcb\x6d\x84\x44\xa1\x00\xfb\xf8\xa2\x61\xc8\x82\x8c\xed\x6e\x17\x71\x7a\x5a\x72\x9d\x42\x45\x92\x33\x52\xe5\x06\x9b\x81\x32\x60\x46\xc6\x90\x3c\x35\xec\xe8\xc8\x49\xa0\xa3\xa3\x4c\x8f\x4c\x83\x90\xc1\xf5\xb7\x66\x79\x19\x14\x5f\x31\x8e\x52\xa9\x1b\x4c\xec\xb9\x65\x48\x24\x49\x65\x33\x2f\x2e\xc9\xe8\x2a\x9b\xb4\x80\xda\x7d\x0c\x97\x71\xd5\x31\xd2\xb9\x15\x97\xfc\xd3\x7e\xb8\x3c\x93\xac\x6b\x5b\xd0\x8c\xb2\x2f\xd1\x2e\x1c\x41\xab\xb7\xed\x75\x14\xf5\xcc\x29\xc9\xba\x86\x3a\xe3\xde\x21\x4e\x03\x41\xac\xb9\x61\x4e\xf6\x39\xdc\x94\xbc\xf5\xc9\x02\x5c\x97\x08\xcf\xa4\xd2\x45\x63\x79\x5d\xd3\xeb\x88\x90\x70\x5d\xfb\xf0\xd2\x2e\x2e\xba\xa7\x55\x72\x7b\x25\xf2\x50\x5d\x86\x8a\xe4\x10\x8f\x56\x92\xac\x54\xc3\xd6\xaa\xae\x4e\x8f\x7a\xd3\x6a\xd0\xa1\x8c\x45\x67\x7e\x25\xaf\xff\x8f\x50\x4d\xa4\xba\x66\xb6\xb3\xb0\x19\x15\x1b\x89\x9e\x58\x8c\xbc\x67\x89\x72\x70\xb4\xb7\x0b\x95\x87\x66\xcb\x97\x31\x57\xbc\x99\xd2\xc7\xaf\x8f\xae\x9a\xe0\xa8\xd0\x84\x9c\xf0\x4a\x2c\xa8\x40\x58\xb1\xf2\x99\xcc\x44\x6c\x04\x89\x96\x97\xde\xb6\x3c\xa8\x71\x6b\xd9\xd5\x75\x5c\xac\x1f\x4b\xf0\xe7\xa7\xf5\xb0\x16\x8e\x1a\x54\xce\x5e\xbf\x7c\xf5\xcb\x0f\x6f\xce\xde\x9f\xff\xf4\xf2\x97\xe7\x6f\xdf\x7c\x7b\xfe\xb7\x1f\xdf\x9d\xbd\x3f\x7f\xfb\xc6\x3d\xf2\xfd\xe5\xdb\x37\x8c\x88\xab\xc8\x46\x47\xe5\x6c\x1a\x1b\x2f\xa8\x1e\xd0\x3a\xba\xe8\x7c\x59\x00\xc2\xd3\x87\x63\x2b\xa6\x40\x37\x4f\xab\x23\xca\x08\xce\x3c\xe5\xdf\x4b\xf7\x8f\xd1\x50\xec\x63\x79\x0c\xce\xc2\xb6\x21\x7f\x87\x2e\xef\x03\x14\x1c\x87\xec\x9e\x9b\xb6\x06\xbb\x75\xe1\xfd\xdb\xcb\x01\x58\x73\x29\xa1\x9e\xe5\xb4\x76\xb7\x4b\xfb\xca\x7b\x05\xfe\x6d\x1f\x22\xe2\x26\xd4\x6e\xa9\x65\xdf\x79\xa3\x6b\x75\xc0\x7b\xef\x3f\x70\x34\x76\xc8\x84\x65\xbc\x73\xa1\x34\xd1\x0a\x91\xd7\x8f\xef\xce\xcd\x28\xc0\x42\x5e\xfd\x6a\x70\x2b\x30\x56\xc8\xd8\x9d\xf3\x50\x30\x07\xe3\xfb\x37\xc1\xf2\xe8\xbe\x9f\x81\xac\xf0\xf2\x17\xc1\x56\x0c\x99\xef\x85\xae\x6b\xf8\x6c\x5c\xe1\xbb\xf8\xbc\x49\x85\xff\x5b\x85\xca\x0b\x60\xa6\x5b\xb8\xd7\x17\xc8\x48\x0e\xf0\xa4\xbc\xa8\x33\xd4\x03\x9e\xad\xb7\x0d\x35\x3b\xf0\xd3\x19\x78\xea\xa8\x5b\x68\x75\x05\x3a\x0d\x3f\x0a\xc6\x81\xd3\x59\x13\x2f\xbc\x26\x87\x23\xe7\xfd\x9c\x3b\xda\xeb\xb4\xad\x56\x55\x57\xc2\x8e\xdb\xf9\xcc\x43\xf6\x4e\xb1\x14\xb5\x05\xed\xaf\x6d\x16\x68\xf6\x4e\x11\x1b\xaa\x86\xe9\x75\x3f\xac\x11\x01\x1a\xb4\x74\xac\x81\x57\xa0\xd9\xa4\x84\x99\x57\xcd\x6b\x61\xac\xd2\x9b\x49\x98\xda\x78\x29\x64\xe9\x05\xaf\x7f\xd8\x59\x5d\x0b\x70\xfe\x3f\x34\xea\x9a\x34\x9d\x84\x1b\xd0\xf9\x44\x43\x2f\x3b\xa7\x19\x08\xd1\x40\xb8\x65\xba\x70\xec\x05\x12\xf2\x6a\xb6\x10\xb2\x8a\xb1\x85\x9d\x63\x7c\x31\x48\xe1\x1f\x1f\x2b\x85\xe3\xb8\x20\xce\x02\x4b\x22\xfd\x52\xc8\xab\x6f\xb2\x2d\x58\xb4\x0c\x8a\xf7\xa8\x63\x32\x95\x10\x75\x62\x6f\x61\x74\x9a\x0c\xad\xbe\xaa\x01\x37\x29\xf2\x4a\xba\xe0\xd4\x8d\x28\xd7\x3b\x17\x3a\x80\x4f\x25\xb4\xe3\x6f\xa4\xb4\xa7\xba\x91\x84\xc4\x74\x2e\x3a\xc3\xe1\xbd\x8d\x54\x3f\xe2\x33\xda\x52\x29\x4b\x8d\xe1\x9a\xa0\x87\x33\xcd\x9f\x8a\x62\xfc\x3c\xd0\x07\x2c\x8a\x79\xe5\x27\x8e\xee\x48\x9e\x9c\x6f\x87\x35\x33\xc0\x58\x0c\x5c\x1d\x84\x8a\xb1\x52\xd5\xd8\xe5\x55\x79\xfd\x7d\x48\x06\x52\x18\x6e\xba\xe0\xe5\x15\x38\xf3\xd0\xa4\x9a\xe1\xc5\x86\xfd\x8f\x8e\xeb\xab\xce\x50\x73\xcb\x0d\x06\x8f\x86\x56\x60\xf4\x21\x68\xec\x42\x48\x60\xfd\x93\xde\x2c\x84\x3a\x5e\x75\xa2\x02\x73\xec\xb7\x7a\x14\x06\x55\xad\xf4\xdd\x60\xb8\xa7\x42\x27\x6d\xad\x56\x4c\x75\xb6\xc5\xe9\x32\x51\x9a\x21\xa6\xf7\xb0\xc8\x5e\xa9\x95\x61\x0d\x18\x2c\x1c\x88\x6f\x45\x82\x83\x6b\xd8\x27\xfb\x7b\x56\x7d\xec\x8c\x0d\xe0\xe0\xb5\x52\xa0\x22\x64\x23\x30\xb8\x79\xfe\xe6\xdb\xb7\x79\x4c\xf7\xa3\xd9\x23\xc9\xfa\x16\x8f\x16\x96\x36\xc1\x16\x1c\x2c\x33\x6b\x35\x58\xbb\xc1\xb2\x9b\xbb\xab\xde\x3c\x0f\x4e\xe8\x25\xca\x18\x09\xb9\x9a\x84\x16\x67\x34\x36\xdd\x6e\x4f\x92\x43\x6e\xec\xa0\xef\xe0\x0b\xcf\x4a\x79\x8d\x3b\xec\x08\x08\x8f\x09\xdc\xdc\x21\xc3\x63\x3a\xac\x6b\x77\x95\x59\xb0\xb7\xdf\xe5\x55\x29\xba\x1d\x54\x30\xd8\x70\x16\x6a\x38\xa3\x7f\x7a\x44\xa7\x3d\xc2\x15\xbd\x37\x8b\xb1\x5a\x25\x31\xc9\xed\xec\x0b\x74\xf3\x65\x09\x54\xd4\xfc\x34\xef\xbd\xef\xbb\x89\x37\xe4\x44\xe5\x8d\x65\xb4\x7c\x32\xaa\xb0\xac\x09\xf7\xa1\xfc\x22\x9b\x3b\x6b\xe3\x60\x42\xcf\x9d\xd6\xaa\xbc\xc2\x5b\xb0\x50\xbb\xd3\x37\xa7\x0b\x65\xcd\xe4\xb0\x28\x8a\x79\xc1\xde\xbc\x7d\xff\xf2\xd4\x07\xc6\x45\xc8\xd9\x60\x98\x1a\xb5\x3d\xc7\xee\xdc\x46\xd0\x4c\x8e\xb1\x42\xea\x58\xef\x4d\x05\x5f\x71\x6a\xc1\x13\x1f\xb4\xd0\xc0\xab\xe3\x1b\x2d\xa2\x57\xd2\xf0\xd6\xf8\x26\x6a\x8e\xe3\x95\x23\x0e\x34\x38\x06\xc7\xa2\x1c\x16\x8d\x8e\x34\x46\x32\x65\x10\x58\xdc\xcd\xae\xb9\x4c\x76\x55\x2f\xda\xbf\x15\x8c\x79\x04\x23\x34\xee\xa1\x02\x4d\xa6\x03\x07\xb5\x02\xc4\x85\x04\x49\xaf\xa6\xb5\xac\xbb\x0a\x66\x95\xa3\x03\x6e\xdd\x3f\x7a\xdd\xbe\x77\x56\x6b\x48\x3a\x05\x15\x51\x05\x37\x9b\x06\x3d\xb8\xa3\x70\x8b\x7a\x8a\xd7\x9b\x7f\xf9\x60\xb3\xf7\x54\x4a\x55\x41\xca\x85\xf3\xaa\xea\xb7\xee\xc6\xb6\x70\xb4\x40\x08\xb6\xe4\x7f\x14\x38\x6d\x22\x63\x83\xf9\x16\x5d\xd3\x04\x9b\x14\xd6\x94\x6c\x8e\x43\x22\xfc\x5f\x10\xd6\x61\x4d\x7a\xaa\xd8\xf6\x03\xe7\x73\x90\x76\x9b\x47\xdb\x1e\x7c\xc3\xdb\x3d\xa4\xfc\xd3\x37\xbc\x81\x6c\x0a\x32\xbd\x98\xf5\x57\x66\xa4\xe5\x4c\xdb\xa0\x9f\xca\xab\x34\xee\x2d\x05\x03\x27\xff\x2d\xa3\x6d\x9c\x36\xfa\xdf\x67\xee\xd9\x49\xf1\x02\x5a\x0d\x38\xba\xfe\x34\x0c\x2a\x40\xdc\x4e\x82\x24\xc3\xa7\x27\xbd\xda\xfe\xde\x9f\xf6\x38\xcb\xe8\x51\x8e\x6b\xe0\x06\xc6\xfa\x91\xc7\x4e\xe6\x8f\xd2\x3f\xdf\xee\x93\x8d\x01\x6c\x43\x7f\xcd\x1d\x75\x01\x9b\x16\x01\x1e\x11\xec\xf9\x6c\x6e\xb7\x0f\xa6\xe5\x26\x94\x37\x79\xcd\xdb\x89\x63\xf0\xc9\x2b\x77\x34\x72\xdc\xdc\xff\x7a\xf0\xd2\xdf\x7a\x43\x0b\xf9\x02\xea\xd9\x15\xec\x33\x69\xe3\x15\xd6\x7d\x8f\xe2\x4a\x54\x20\xad\x58\x6e\x68\x4a\x02\xce\x4e\x52\xd2\x42\xf2\x20\x10\x79\x63\x20\xd1\xb0\x14\x3f\x39\x45\xe9\xd5\x71\x86\xd2\x11\x48\x31\x1e\xbd\x37\xac\x59\xf4\xfa\xbe\x10\xdf\x7a\xe9\x43\xb5\x82\xc3\x66\x9f\xa4\x92\x0b\x90\xbc\x15\x0f\x57\xb4\xe0\xfe\x78\x76\x71\xce\x5e\x5c\xbe\xda\x3d\x91\xc0\x59\x16\xa9\x0b\x3c\x4f\xf8\x3e\x89\x7e\x3e\x8f\xcb\x39\x1d\x3a\x6c\xe5\xc8\xbb\xa0\x9d\x63\xf4\x80\xed\x98\x6f\x6f\xd2\x84\x76\x90\xc6\x27\x01\x39\xd5\x1a\x84\x46\xd3\x64\xdf\x2c\xa0\x56\x34\x6e\x66\xcc\x93\x5b\x00\xa6\x4e\xfd\x5b\x58\x95\xa0\xb9\x34\x4b\x0c\x61\x4b\xa9\x6c\xc8\x7b\xcb\x6a\xf0\x4d\x94\xfc\x5e\x95\x8f\x5c\xfb\xd9\xd9\xe4\x19\x46\x10\x1e\x81\x8b\x41\x6e\xf0\x2c\x3b\xf1\x9e\x51\x9b\xf7\x49\xd7\xe4\xe8\xa2\x5a\xcb\x80\x4a\xdd\xab\xc5\xf2\x7b\xdd\xeb\x4b\x2a\xd9\x36\xfe\x16\xb6\x77\x88\xb5\x5e\xd5\xe2\x01\x9d\xe1\x8b\x17\xdf\xdc\x61\x8f\x5f\xa8\xea\x85\x30\xba\xc3\x97\xbe\xe9\xaa\x15\xd8\x48\x0b\xc4\x4e\x3e\xa7\x76\xde\xff\x5c\xcb\x63\xa0\x93\x46\xc8\x19\xbf\xe6\xa2\xe6\x8b\xbd\x47\xa2\xa5\xbc\x23\x8a\xce\xb1\xd3\x23\xfb\x62\x5b\x83\xb1\x5e\xf6\xf6\x77\x09\x53\x2d\xb9\x64\x70\x2d\xd0\x3d\x29\xce\xd3\xd0\x1c\x2a\x29\xe6\x92\xf1\x85\x51\x75\x67\xd3\xa6\x9a\x86\x05\xf9\x8c\x78\xf1\x96\x3c\x96\xb0\xa8\x5a\xb2\x79\xef\x48\xbe\xf2\xbd\xe1\x9f\x66\x9d\xcc\x7e\xeb\x37\x8a\x83\xc3\x86\x79\xd9\xec\xe1\x2f\x8c\x95\x10\x0a\x4b\x1b\x10\x2a\x02\x5a\x7e\x1d\x42\xb2\xa2\xeb\xaf\x62\x45\xff\x36\x52\x9c\xad\x59\x1b\x15\x9a\xb4\x0e\x23\x1e\x09\x83\x43\x6c\x11\x0e\x7b\x4b\x84\x48\xf4\x16\x1e\x23\xd7\x7a\x7e\x7d\x38\xbd\x31\x28\xd7\xc3\x12\xbe\x85\x33\xed\xe8\x67\xc4\x76\x16\xdc\xe2\xc6\x88\x95\x1c\x8c\x0f\xc5\x63\xa4\x85\xd4\xe0\xcf\x05\x3b\x97\xac\xe4\x3e\x3b\x18\x9f\x13\x06\xc7\x1d\x61\x81\x6d\x74\x62\x08\xa9\x58\xcc\x11\xbc\x4a\x52\x43\x58\x7b\x4b\x97\x12\x56\x28\x18\x86\x45\x7d\xa1\x14\x26\x0f\xbd\x23\x4b\x5a\x7c\xd9\xd5\xcc\x4f\x99\x87\x4f\xd6\xd0\xf7\x47\xbc\xff\x0b\x1a\x9e\x1a\x26\x55\x9c\xca\xe7\x03\x6a\x8c\xfb\xd9\x75\x23\x1f\x1f\xe9\x41\x4f\x89\x66\x25\x7b\xd8\xed\x7f\xcc\xc5\x80\x75\x96\x83\xc1\x41\x7e\x53\x66\x7c\xd0\x9a\xb6\x76\x24\xda\x2c\x00\xbd\x93\xc1\x1c\x7c\xa6\x61\x25\x8c\xd5\x9b\xc7\xd0\x98\x4c\xb7\x33\xcb\x4b\x69\xef\xe8\x19\xde\xba\xcf\x03\x68\x5a\xbb\x39\x4c\xb8\x8d\x11\xe6\x11\x5a\xc9\xf7\x5e\xd5\x6a\xd1\x6b\x1b\x1b\xdf\xf3\x5c\x56\xbe\xd5\x40\x2c\xfb\xcb\x66\x1f\x3d\xf3\xb6\x0e\x2d\x89\x95\x9a\xe4\xf0\x70\x93\x89\x45\xfa\x6b\xf2\x80\xa3\x9c\x70\x2c\x79\xff\x00\xf7\x56\x03\x75\x05\x16\xca\x6c\xd6\x6b\x3e\x38\x45\x2c\x47\x58\xa0\x2f\x40\xc2\x21\x0e\x44\xb2\xd6\xb3\x19\x23\x91\x52\x31\x44\x95\x4d\x0c\x69\x71\xb2\xf5\x43\xd9\x06\x38\x50\xb8\x67\x1b\xac\xd3\x04\xcc\x5e\x18\x63\x4b\xf5\xb3\x73\xa2\x28\x1e\xa6\x34\xaf\x81\xcd\x2f\x54\x75\xd9\x42\xf9\x1e\x1a\x07\x31\xcc\x9d\x42\xe9\xca\x38\xe9\x35\x55\x39\xe4\xcb\xcd\x0b\x27\x1a\x8a\x56\x55\xf1\x3d\xb2\x3a\x04\xd4\xd5\x34\x15\x59\xe4\xef\x64\xbd\xb8\x54\x1b\xe4\xdf\x0c\x45\xfd\xfe\x03\x6c\xa2\x64\x0d\xe8\x15\xf6\x6f\x96\x6b\x72\xd1\xb6\xf2\x35\x5b\x83\x9c\x13\xcf\xd3\x67\x91\x28\x0b\xe7\x43\x88\x7e\x1c\xf0\xd4\xb9\xf2\xb8\x57\x94\x2d\xfd\xef\x70\x0c\x3e\xd8\x71\xbb\xf3\xd1\x6a\xd5\x80\x5d\x43\x77\xef\xe1\x10\xf7\x09\xcc\x5e\xc4\x5d\xc2\xe8\x88\xbc\x1d\x3c\xfd\x75\x56\xaa\xa6\xe5\x16\xe7\x53\x85\xe0\x4f\xf8\xd0\x27\xa9\x54\xa2\x5a\xf7\x96\xbb\xee\xd7\x4a\x0a\xab\xf4\x3c\x1a\x8c\xa9\x23\x83\xb8\x24\x0c\x0f\xf0\x7a\xb4\xd4\xbc\x1d\x46\x57\x43\x76\x24\x0f\xb1\xe6\x00\x07\x9e\xa6\x8c\x0b\xd5\xff\xf9\xca\x24\x3f\x2e\x81\x5e\x7b\x2d\x4a\xad\x2e\x08\x5f\xb8\xe4\x6b\x7a\xb4\x60\x7f\x3f\x7b\xf7\xe6\xfc\xcd\xdf\xfc\xb7\xc1\xd0\x6d\xcc\x46\x81\x8e\x1d\x23\x8d\xdd\xc6\xb4\xa7\x4f\xca\xac\x84\x5d\x77\x8b\xa2\x54\xcd\x71\xa9\x34\x28\x73\x9c\x6e\x6f\x16\xc0\xfc\x70\x91\xdf\x28\xf6\x82\xe1\xef\x7f\x0e\xea\x2b\xee\x81\x6d\x4b\x22\xc4\xc1\x17\xb1\xec\x0c\xaa\x82\xfd\x43\x75\x88\x34\x2c\xfe\x6c\x55\x35\x6b\x3c\x88\x41\xf7\xfa\xf6\xcd\xa8\xfe\xb6\x6e\x38\x8e\xa9\x15\x76\xad\x7c\xf2\x21\x7b\xe8\x6d\x8e\x55\x5c\x74\x6b\x05\x31\xfe\x65\xd7\x47\x10\xc1\xcd\x10\xb6\x4f\x48\x95\x8c\xcf\x5b\x28\xc1\xed\x17\xa4\xf7\x60\xea\xd4\x2d\x5b\xde\xdf\x55\x1c\xdf\x99\x96\xd9\xee\xaa\xec\xd1\x43\xca\x93\x13\x50\x99\xee\xe8\xea\x7a\x46\xed\xe1\x0f\xe9\x5f\x76\x75\xcd\x2e\x71\x17\x4f\x36\x86\xf2\xd3\xf8\xad\x1f\xda\x3e\x84\x20\x5a\x55\x4d\x53\xfc\x66\x30\xda\x1d\xb3\x14\x56\x0b\xb8\x1e\x8a\x61\x32\xbd\x28\xa8\x23\xe3\x5c\xe5\x68\x8b\x91\x5c\xc8\xb7\xcb\x66\x9b\xa7\xd1\xc9\x0d\x97\x1d\xaa\x72\xa5\x71\x3a\x3c\x9a\xbd\x1b\xd5\x3d\xcd\x4a\xf3\x48\x34\xe5\x0d\x8e\x34\xdb\x33\x6e\x8a\xcb\x26\xc8\x02\x08\xe1\x80\xf3\x4c\x49\x85\x2f\x02\xce\xc9\x86\xa6\x11\xd8\x04\x5f\x66\xb5\x3b\xb0\x71\x51\x3c\xe4\xf6\x74\x9d\xed\xc9\x3a\x1b\x27\x19\xd2\x17\xbe\x3e\x07\x5c\x14\xd2\x4e\xeb\x1b\xd3\x35\x21\x1a\x35\xc4\xab\xf0\xe5\x9f\xad\xc6\x94\x18\xf6\x28\x6f\x54\x47\x0c\x15\x0f\xde\x1f\x99\x3f\x02\x8d\x3b\x20\x06\xe9\xf0\x7c\x53\x02\x9f\xcb\xc8\xea\x8e\xa1\xe9\xfe\x43\xa6\xe4\x77\x2e\x5b\xe8\x0e\xf7\xfe\xb2\xd8\x80\x34\x71\xac\x98\x2f\xea\xcf\x87\xcb\x9d\x2f\x59\x0d\x4b\xcb\xd0\xe0\x26\x48\x86\x09\x93\x90\x75\xe0\x57\x20\x93\x21\x3a\x4a\x72\xe9\x7e\x7a\xbe\xd2\xd6\x27\xc1\xf0\x3b\x5e\xa0\x43\x32\x6a\xcf\x7e\x61\x19\x3f\x41\x30\xb4\xba\xfd\xd4\x28\x44\x67\x15\x45\xce\x94\xce\x43\x57\x11\xab\x7a\xe2\x96\x51\x11\xfb\xe9\x0a\x39\x64\xf3\x30\xc4\x92\x69\xe5\xae\x51\xf6\xf3\x5c\x32\x7c\x53\x38\x65\x64\xee\xc8\x8c\xfe\xca\x7a\xec\xc1\x4c\x95\xe8\xae\x44\x7c\x6f\x09\xbc\x14\xa4\x20\x8d\xea\x0e\xbb\x69\x81\xcd\xfb\x03\x3b\x2a\x55\x5e\x81\xa6\xe5\x3f\x1a\x25\x33\x39\xee\x4b\x41\x1e\x2e\xd0\xe0\xab\x54\xb6\x86\xc8\xd8\xec\x6f\xa1\xf7\xef\x36\xf9\xf4\x08\x18\x37\xab\x91\xde\xe9\xfa\x6d\x9f\x9a\x6e\xec\x40\x03\x8e\x5e\xa0\x0e\x85\x65\x87\xa1\x8d\xce\x40\x2a\x57\x47\x1f\x61\x0f\x5d\xbb\xdb\x56\x7f\xe7\x56\xb9\xeb\x8b\xae\x76\x60\xc9\xf6\x63\x1d\xde\x59\x19\xfd\xce\x2d\xda\xc0\xd9\x7c\x0e\x2e\x2b\x1c\xbb\x41\x29\x22\x6b\x58\xc3\x37\xa8\x39\xd1\x08\xa9\xf2\xf2\xff\x28\x74\x6a\x55\xf2\x1a\x47\xe3\x10\xcf\xba\x6b\xc2\x02\x08\x07\x86\x41\x47\x76\x4e\x9c\x30\x67\x6a\xf1\x11\x4a\x5f\xad\x8e\x73\x0d\xdc\xfa\x9d\x89\xe1\x1e\xec\xe0\x68\xc0\x82\x76\x74\x55\xf9\xb6\x8e\xf9\x2c\xbc\x7f\x00\x9f\x78\xd3\xd6\x70\xca\xe6\xb6\x36\xb3\x0c\xf4\xf0\xc8\x21\xd9\x0e\xbe\x69\x93\xdc\xd2\xde\x11\x31\xdb\x49\xb3\x1b\x23\x5c\x05\xbb\xd8\xbd\x2f\x4e\xfa\x5c\x8b\x55\x38\x7c\xab\x85\xd2\x02\xa7\x8d\x51\x23\x40\x0a\x9c\xa1\x6e\x47\x9c\xa7\xc3\xf8\x19\x17\x53\x6a\x54\xea\x1d\xe1\x0a\x36\x61\x17\x02\x56\x56\xf1\x0f\x64\x2d\xc8\xad\x07\x83\xcd\xe0\x3f\x08\x93\xd5\x68\xf0\xb6\xd5\x8a\x53\x67\x75\xfc\x50\xca\x1a\xf0\x4e\x71\x0c\x54\x3e\xd1\x81\xbe\xa6\x89\x7d\xca\x7e\x70\xd0\xbc\x97\x0e\x16\x3a\xd1\x81\x6f\x23\x8f\x09\xc3\xf8\x51\x99\xfc\xc6\x72\xcc\x63\x57\xc4\xed\xd7\x34\xdd\x3a\x14\x79\x7e\xf4\x3c\xdf\xf1\x4a\x56\xf4\x7c\xcb\x83\x38\xc5\x8a\xe6\xc9\x20\xa6\x49\xcb\x98\x50\x18\x14\xbd\x51\xd2\x35\xc2\xb0\xd6\x99\x94\x88\xb1\x30\x30\xd1\x76\x6d\x28\xfb\x7b\x0c\x2e\xce\xbe\x43\x69\xf6\x99\x33\x88\xa4\xdb\x4b\xaf\xd5\x66\x46\x5f\xb5\xdf\xb7\x29\xc2\x51\xe5\xfb\x57\x97\x2c\x7b\x0b\xdf\x98\xb2\x5a\x5c\x01\x9b\x43\xb5\x02\x77\x9d\x2d\x37\xc6\x0f\x7d\xa4\x61\x2a\x1a\x40\x96\x7a\xd3\xda\xf9\x58\xa3\x55\x0a\x8c\x11\x7b\x6d\x37\x5c\x65\x93\x41\x6e\x69\xbb\x1a\x90\xe3\x3d\x0e\x33\x1c\x63\x84\x83\x43\x7a\xfd\x71\x3b\xe1\xf3\x47\xf9\x2c\x28\x93\xe3\xb6\x0f\xb0\xb9\x71\x19\xe4\x79\xc6\x96\x04\xeb\xe0\x44\xbe\x43\x29\xd5\x58\x62\x91\xf0\x24\x33\x6f\x3f\x1c\x3b\x5e\x75\xff\xfa\x79\x42\x4e\x0c\xd5\x1c\x68\xf0\x9f\x89\xf1\xf5\x45\x69\xf3\xa9\x8f\xe3\xa6\x7e\xd2\x58\x74\x47\x02\xc9\xc7\xff\x82\x1f\x94\x82\xa1\x1a\x78\x35\xa5\xb1\xdc\x37\x82\x1c\xb3\x18\xff\xe0\xf8\x6a\x34\xb8\x59\xd6\x1a\xef\x0d\xce\xc9\xf1\xe4\x1e\xf7\x32\xb8\x91\x00\xea\xed\xf7\xb2\x5f\x09\xc9\x18\xd5\xe4\x8a\xf5\x21\x29\x27\x09\xd5\x07\xa4\x18\xf7\x50\x0a\x17\x31\x4f\x3b\x5f\x86\x6a\x02\xdb\x63\xc4\xf5\xcb\x50\x8d\x5f\x32\xd0\xce\x97\xa0\x9a\x90\xc4\xdc\x8f\x9b\xf9\x67\x8a\x9d\xde\x0c\xc2\xdf\x48\xf2\x8c\x69\xd5\x2f\x4d\x4a\xfd\x73\xfd\x07\x25\xed\x4d\x49\xb7\xdb\x3f\x7b\x5e\x51\xde\x35\x36\xa0\x2e\x9f\x5d\x35\x31\xe6\x86\x78\x0d\x45\x85\x3d\x3b\x3a\x65\xdb\xb0\x97\x54\xd0\x57\x74\xe2\xca\x05\xcb\x83\x03\x51\xaf\xf7\x2c\x02\xcc\x0a\x8b\x1a\x7c\x7e\xcf\xaf\xb8\xc8\x26\xad\xe7\xdf\x6d\x44\x13\x1c\x11\xa8\x69\x90\x86\xb0\x48\xd3\x6b\xe0\xb5\x5d\x33\x1c\x4f\x18\xeb\x9b\x0c\x94\x5d\xd4\x3b\xe1\x23\xbd\x4a\x16\xe7\xcb\xb0\x2d\xd4\xd8\xa0\x81\x45\x01\x21\x2c\x38\x4d\x06\x10\x79\x26\x21\xdb\x1c\x1a\xc5\xb3\x03\xfa\xb5\x9f\x9f\x21\x99\x87\x4f\xc8\x3a\x83\x0a\xa9\xe2\x9a\xd7\xa2\x0a\x63\x94\x85\x5c\x21\x50\x6b\xa5\x63\xcd\x34\x11\xcf\x81\xff\xa9\x88\xc1\x8b\xc2\x5c\x97\x87\xa1\x72\x96\xa6\x24\xf9\x7c\x9c\x90\x4b\xcd\x29\x89\xe6\xec\x37\xff\xb5\x10\x18\x18\xf5\xc3\x22\x7a\x9a\x4f\xfa\x90\xe6\xd4\x9d\x06\xf9\x97\x14\x1d\xb7\x13\x6f\x28\xba\x4c\x86\xcc\x17\x10\x21\x29\x60\xf3\xe5\x44\x48\xe0\xf6\xff\x77\x22\x44\x48\xe2\x8f\x99\x33\xc4\x73\xdb\x7e\xff\x8f\xd1\xf5\x5c\x09\xff\x39\xba\x0a\x78\x4d\x27\x08\x1b\x38\x5f\x66\xb9\x14\x65\xe8\x82\xc0\x8e\x3b\x67\xf9\xbf\x20\xc7\x27\x9f\xde\xf2\x0e\xc2\x34\x00\xff\xd2\x97\x35\xe2\x52\xc4\x96\xa6\xdf\xa6\x26\xc1\x07\xcb\xb3\x86\x91\x48\xdf\x84\x06\xc3\x3c\xbb\xde\x19\xef\x31\x7b\xe9\xe4\xfe\x79\xe1\xc4\x8d\x11\x4a\x42\x15\x07\x14\xc5\xa0\x80\xff\x85\x5f\x0c\xdb\x86\x12\x64\xa7\x63\x69\xc9\xab\xaf\xcd\x6c\x70\x5c\x73\xec\x84\xdd\xbf\x6d\x23\x81\xb1\x33\x4f\xfd\xbe\xa3\x34\x8d\x12\xc1\xa2\x36\xb8\x56\xf5\x35\xe5\x63\x29\x1a\x6d\xba\xc5\x47\x0f\x76\xb9\xe6\x72\x05\x8f\xc0\x4d\x1e\x22\x63\xcf\xa4\x5c\x68\xee\x1d\xbb\x9e\xdb\xae\xc6\x7a\x29\xc4\x3e\x7c\xe0\xad\x58\x69\xd5\xb5\xc7\x3f\xfb\x1e\xd7\xd3\x9f\xaf\x84\xac\x4e\x3f\x44\x99\x7f\xfc\x33\xfa\x33\x03\x30\xef\x4f\x9a\x3b\x03\xbb\xfd\x01\x5d\xe4\xf4\x6f\x8d\x89\x0c\x02\x28\x3c\x1c\xd3\x8f\x26\x4c\x81\xe3\x36\xfb\xe0\x1f\xcd\x65\xa6\xd8\x81\xa2\xc4\x69\xfa\x1e\x0a\x7d\xc4\x37\xaf\xc7\x3e\x8c\xf2\xd2\x49\xbd\xa4\xf2\x7c\x4d\xc1\x78\xae\xcb\x17\x03\x89\x7e\xc5\x47\x18\xd0\xc2\x87\x5f\x71\x8d\x85\x87\xb8\xa8\xff\x0a\xc6\x60\xe6\xd6\x23\x88\x4f\x7f\x99\xc2\x24\x6c\xf3\xc1\x8a\xa4\x70\xa1\x12\xa0\x1a\x7c\xd7\xa8\x17\x16\x57\x15\xcc\x06\xe3\x77\x77\x76\x1c\x46\xaa\xf2\xdf\xc7\xa6\x50\x12\x37\xec\x8d\xaa\xe0\xc2\x2d\x14\x96\xfe\x63\x18\xff\xf3\x50\xc9\x67\xda\x60\x3c\x56\xde\x47\x53\x28\x6d\xcb\x6b\xbe\xc3\xf7\x2f\x29\x1d\x1d\xd6\x52\xb1\x99\x19\xf1\x99\x6c\xae\x98\x49\x92\x15\x7d\x84\xcd\x49\xf6\x58\xe4\xea\xd4\xd1\xd9\xc5\x39\x6b\xb8\xe4\x2b\x48\x53\xe9\xb6\xc0\xbc\xa5\xaa\xe2\xff\x13\xfa\xfc\xdc\xb6\x38\x53\xae\x61\xef\x84\x2a\x3d\x1c\x22\xd9\xa4\x50\x2d\xf7\x5f\x1d\x0c\xd7\xd4\x1f\xcf\xdc\x9b\x1d\xba\xe7\xa0\x4f\x9a\x79\x6d\xd7\xbe\x0e\xcc\x2d\xee\x6e\x58\x18\xd6\x76\x8b\x9a\x3e\x5e\x9b\x4d\xe4\xef\x6f\xb1\xe7\x3c\x6b\x1c\x92\x9a\xd6\x37\xe9\xa3\x39\x81\xb1\xb2\xd9\xd6\x27\x83\xa1\xac\x71\xad\xd9\xe7\x9f\xc8\xf1\xd7\x2c\x74\xc9\xf4\xac\x80\xd1\x43\xfa\x1e\xa0\x02\x73\x94\x29\xf3\x65\x55\x0d\xb1\xe2\xf8\x81\xac\xab\xd8\x18\x8b\x05\x26\xef\xe3\x8e\x86\x21\xb3\x6e\x97\x28\xe6\x8f\xa4\x4f\x0b\x1c\x2c\x3a\xcb\x2a\xaa\x0d\xf7\x55\x5e\x87\x21\x59\x8b\x62\x32\x7e\xba\x16\xbb\x64\x9c\x78\x34\xa4\x23\x1b\x6e\xcb\x35\x1a\x44\x1c\x7b\x22\xd9\x25\x10\xc5\x06\x43\x6c\x2b\xa5\x6b\x8e\x4b\x25\x4b\x68\xad\x39\xf6\xab\x0a\xb9\x9a\x85\x02\xf8\x63\x5c\x67\xc6\x65\x35\x4b\xf8\x3b\x7e\xc2\xf2\x21\x84\x15\x58\x2e\xea\x30\x8e\x29\x3e\x95\xd5\xc7\xa6\xcf\xe9\x62\x7e\xcb\x88\x46\xd4\xdc\xf9\xb2\x12\xdb\x8e\x82\x90\x73\x8c\x87\x60\x4f\x99\x28\xa0\x98\xb2\xf9\x0f\xb0\xf9\xf0\xec\x27\xe7\x0e\xfd\x7c\xfa\x72\xb9\x84\xd2\x7e\x38\xbd\xa4\x0f\xe1\xfe\x3c\x9f\x7a\x12\xa1\x8f\x48\xe3\x37\x72\xff\xd9\x39\x59\xb1\xd0\xbc\xbc\x02\xdf\x03\xc9\xe3\x8c\x4f\x5e\x17\xec\xdb\x94\xe9\x32\xa7\x6c\xc6\xe6\xa8\x5a\xb4\xaa\xa1\xe8\x63\xc6\xf7\x8e\xbe\x51\x97\x1e\xd5\xf3\xf0\xf4\xe0\x41\x3f\xd3\x3e\xaf\xd6\x3f\x7d\xa3\x5e\x52\x0d\xe6\xe9\x1f\x4f\x4e\x4e\xc8\x9d\x98\xd1\x47\xb9\x1c\xf1\x3f\x33\xa6\x3a\xbd\x40\x27\x32\x5f\x9f\x7a\x9b\x1f\x69\x39\x1b\x5d\xdc\x9e\xa6\x2b\x8e\xa5\x08\x9f\xbc\xe7\xc2\x7f\x69\xd7\x93\x0e\x4c\x7b\x96\xea\x6e\x1a\x48\xdc\xad\x79\xf9\xb0\x23\x3b\xde\xd3\x0e\xfb\x68\x72\x2f\x96\x02\x50\xb9\xcb\xf7\xc4\x87\x3a\x38\x55\x54\x87\x45\xb3\x9a\x56\xff\xb9\xbc\x50\x4c\x9a\x1a\x1b\x16\xa4\xfa\xc7\xa7\xc3\xc5\x9c\x6a\xd8\x33\xd6\xb5\x26\xfd\xef\xd1\x1a\x2d\x5c\x76\xe0\x3f\xdd\x6d\xd8\xd1\xd1\xf7\x1c\x56\xa0\x8f\x8e\xfc\xd4\x90\xf7\x11\x9f\xec\x3f\x8c\x82\x81\x51\x30\xf5\x1d\xf2\x58\x60\x14\x9e\x0f\x35\x43\xf9\x94\x99\xb1\xfb\x18\xf3\xfc\xee\x51\xa8\x25\xb3\x7e\xea\xa0\x89\xd1\xb7\x08\xaa\xd0\xc4\x1d\x2b\x6e\x79\x6f\x30\x48\x0a\x3b\x6f\x75\xd0\x1e\x8e\x8c\x03\xdb\x13\x22\x3f\x48\x3e\xd2\x9b\x07\x2e\xa7\xee\x68\xef\x8c\xd3\xee\x48\xeb\x7c\x0e\x8f\x41\x71\xad\xf7\x6e\xe0\x26\x4f\xce\xbd\xe2\x8b\x62\x82\x69\x30\x29\x95\x34\x76\x32\xb6\x36\x96\x0b\xdc\x73\xf1\x38\xe5\x0a\x5f\xce\xb6\xf9\x6a\x72\xf8\xe4\xff\x06\x00\x00\xff\xff\xb5\xa4\x32\x0c\xd2\xa3\x00\x00"), }, } fs["/"].(*vfsgenÛ°DirInfo).entries = []os.FileInfo{ diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go index c4da97b443..8131ef481a 100644 --- a/pkg/trait/builder.go +++ b/pkg/trait/builder.go @@ -109,8 +109,7 @@ func (t *builderTrait) Apply(e *Environment) error { Image: getImageName(e), Registry: e.Platform.Status.Build.Registry, }, - HttpProxySecret: e.Platform.Status.Build.HTTPProxySecret, - Verbose: t.Verbose, + Verbose: t.Verbose, }}) case v1.IntegrationPlatformBuildPublishStrategyKaniko: @@ -126,8 +125,7 @@ func (t *builderTrait) Apply(e *Environment) error { Enabled: e.Platform.Status.Build.KanikoBuildCache, PersistentVolumeClaim: e.Platform.Status.Build.PersistentVolumeClaim, }, - HttpProxySecret: e.Platform.Status.Build.HTTPProxySecret, - Verbose: t.Verbose, + Verbose: t.Verbose, }}) } @@ -135,9 +133,10 @@ func (t *builderTrait) Apply(e *Environment) error { } func (t *builderTrait) builderTask(e *Environment) (*v1.BuilderTask, error) { - maven := e.Platform.Status.Build.Maven - - // Add Maven repositories defined in the IntergrationKit + maven := v1.MavenBuildSpec{ + MavenSpec: e.Platform.Status.Build.Maven, + } + // Add Maven repositories defined in the IntegrationKit for _, repo := range e.IntegrationKit.Spec.Repositories { maven.Repositories = append(maven.Repositories, mvn.NewRepository(repo)) } diff --git a/pkg/trait/environment.go b/pkg/trait/environment.go index ed5ee41e86..f8fcfb9163 100644 --- a/pkg/trait/environment.go +++ b/pkg/trait/environment.go @@ -18,8 +18,11 @@ limitations under the License. package trait import ( + "os" + "github.com/apache/camel-k/pkg/util/defaults" "github.com/apache/camel-k/pkg/util/envvar" + "github.com/apache/camel-k/pkg/util/property" ) // The environment trait is used internally to inject standard environment variables in the integration container, @@ -30,6 +33,10 @@ type environmentTrait struct { BaseTrait `property:",squash"` // Enables injection of `NAMESPACE` and `POD_NAME` environment variables (default `true`) ContainerMeta *bool `property:"container-meta" json:"containerMeta,omitempty"` + // Propagates the `HTTP_PROXY`, `HTTPS_PROXY` and `NO_PROXY` environment variables (default `true`) + HTTPProxy *bool `property:"http-proxy" json:"httpProxy,omitempty"` + // A list of variables to be created on the Pod. Must have KEY=VALUE syntax (ie, MY_VAR="my value"). + Vars []string `property:"vars" json:"vars,omitempty"` } const ( @@ -78,6 +85,25 @@ func (t *environmentTrait) Apply(e *Environment) error { envvar.SetValFrom(&e.EnvVars, envVarPodName, "metadata.name") } + if IsNilOrTrue(t.HTTPProxy) { + if HTTPProxy, ok := os.LookupEnv("HTTP_PROXY"); ok { + envvar.SetVal(&e.EnvVars, "HTTP_PROXY", HTTPProxy) + } + if HTTPSProxy, ok := os.LookupEnv("HTTPS_PROXY"); ok { + envvar.SetVal(&e.EnvVars, "HTTPS_PROXY", HTTPSProxy) + } + if noProxy, ok := os.LookupEnv("NO_PROXY"); ok { + envvar.SetVal(&e.EnvVars, "NO_PROXY", noProxy) + } + } + + if t.Vars != nil { + for _, env := range t.Vars { + k, v := property.SplitPropertyFileEntry(env) + envvar.SetVal(&e.EnvVars, k, v) + } + } + return nil } diff --git a/pkg/trait/environment_test.go b/pkg/trait/environment_test.go index ad0d3be01b..13cb070152 100644 --- a/pkg/trait/environment_test.go +++ b/pkg/trait/environment_test.go @@ -37,34 +37,7 @@ func TestDefaultEnvironment(t *testing.T) { catalog, err := camel.DefaultCatalog() assert.Nil(t, err) - env := Environment{ - CamelCatalog: catalog, - Catalog: NewCatalog(context.TODO(), nil), - Integration: &v1.Integration{ - Status: v1.IntegrationStatus{ - Phase: v1.IntegrationPhaseDeploying, - }, - Spec: v1.IntegrationSpec{ - Profile: v1.TraitProfileOpenShift, - }, - }, - IntegrationKit: &v1.IntegrationKit{ - Status: v1.IntegrationKitStatus{ - Phase: v1.IntegrationKitPhaseReady, - }, - }, - Platform: &v1.IntegrationPlatform{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: "ns", - }, - Spec: v1.IntegrationPlatformSpec{ - Cluster: v1.IntegrationPlatformClusterOpenShift, - }, - }, - EnvVars: make([]corev1.EnvVar, 0), - ExecutedTraits: make([]Trait, 0), - Resources: kubernetes.NewCollection(), - } + env := mockEnvironment(catalog) env.Platform.ResyncStatusFullConfig() err = NewEnvironmentTestCatalog().apply(&env) @@ -108,38 +81,11 @@ func TestEnabledContainerMetaDataEnvVars(t *testing.T) { c, err := camel.DefaultCatalog() assert.Nil(t, err) - env := Environment{ - CamelCatalog: c, - Catalog: NewCatalog(context.TODO(), nil), - Integration: &v1.Integration{ - Status: v1.IntegrationStatus{ - Phase: v1.IntegrationPhaseDeploying, - }, - Spec: v1.IntegrationSpec{ - Profile: v1.TraitProfileOpenShift, - Traits: map[string]v1.TraitSpec{ - "environment": test.TraitSpecFromMap(t, map[string]interface{}{ - "containerMeta": true, - }), - }, - }, - }, - IntegrationKit: &v1.IntegrationKit{ - Status: v1.IntegrationKitStatus{ - Phase: v1.IntegrationKitPhaseReady, - }, - }, - Platform: &v1.IntegrationPlatform{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: "ns", - }, - Spec: v1.IntegrationPlatformSpec{ - Cluster: v1.IntegrationPlatformClusterOpenShift, - }, - }, - EnvVars: make([]corev1.EnvVar, 0), - ExecutedTraits: make([]Trait, 0), - Resources: kubernetes.NewCollection(), + env := mockEnvironment(c) + env.Integration.Spec.Traits = map[string]v1.TraitSpec{ + "environment": test.TraitSpecFromMap(t, map[string]interface{}{ + "containerMeta": true, + }), } env.Platform.ResyncStatusFullConfig() @@ -174,39 +120,13 @@ func TestDisabledContainerMetaDataEnvVars(t *testing.T) { c, err := camel.DefaultCatalog() assert.Nil(t, err) - env := Environment{ - CamelCatalog: c, - Catalog: NewCatalog(context.TODO(), nil), - Integration: &v1.Integration{ - Status: v1.IntegrationStatus{ - Phase: v1.IntegrationPhaseDeploying, - }, - Spec: v1.IntegrationSpec{ - Profile: v1.TraitProfileOpenShift, - Traits: map[string]v1.TraitSpec{ - "environment": test.TraitSpecFromMap(t, map[string]interface{}{ - "containerMeta": false, - }), - }, - }, - }, - IntegrationKit: &v1.IntegrationKit{ - Status: v1.IntegrationKitStatus{ - Phase: v1.IntegrationKitPhaseReady, - }, - }, - Platform: &v1.IntegrationPlatform{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: "ns", - }, - Spec: v1.IntegrationPlatformSpec{ - Cluster: v1.IntegrationPlatformClusterOpenShift, - }, - }, - EnvVars: make([]corev1.EnvVar, 0), - ExecutedTraits: make([]Trait, 0), - Resources: kubernetes.NewCollection(), + env := mockEnvironment(c) + env.Integration.Spec.Traits = map[string]v1.TraitSpec{ + "environment": test.TraitSpecFromMap(t, map[string]interface{}{ + "containerMeta": false, + }), } + env.Platform.ResyncStatusFullConfig() err = NewEnvironmentTestCatalog().apply(&env) @@ -236,6 +156,71 @@ func TestDisabledContainerMetaDataEnvVars(t *testing.T) { assert.True(t, ck) } +func TestCustomEnvVars(t *testing.T) { + c, err := camel.DefaultCatalog() + assert.Nil(t, err) + + env := mockEnvironment(c) + env.Integration.Spec.Traits = map[string]v1.TraitSpec{ + "environment": test.TraitSpecFromMap(t, map[string]interface{}{ + "vars": []string{"key1=val1", "key2 = val2"}, + }), + } + env.Platform.ResyncStatusFullConfig() + + err = NewEnvironmentTestCatalog().apply(&env) + + assert.Nil(t, err) + + userK1 := false + userK2 := false + + env.Resources.VisitDeployment(func(deployment *appsv1.Deployment) { + for _, e := range deployment.Spec.Template.Spec.Containers[0].Env { + if e.Name == "key1" { + userK1 = e.Value == "val1" + } + if e.Name == "key2" { + userK2 = e.Value == "val2" + } + } + }) + + assert.True(t, userK1) + assert.True(t, userK2) +} + func NewEnvironmentTestCatalog() *Catalog { return NewCatalog(context.TODO(), nil) } + +func mockEnvironment(catalog *camel.RuntimeCatalog) Environment { + return Environment{ + CamelCatalog: catalog, + Catalog: NewCatalog(context.TODO(), nil), + Integration: &v1.Integration{ + Status: v1.IntegrationStatus{ + Phase: v1.IntegrationPhaseDeploying, + }, + Spec: v1.IntegrationSpec{ + Profile: v1.TraitProfileOpenShift, + }, + }, + IntegrationKit: &v1.IntegrationKit{ + Status: v1.IntegrationKitStatus{ + Phase: v1.IntegrationKitPhaseReady, + }, + }, + Platform: &v1.IntegrationPlatform{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "ns", + }, + Spec: v1.IntegrationPlatformSpec{ + Cluster: v1.IntegrationPlatformClusterOpenShift, + }, + }, + EnvVars: make([]corev1.EnvVar, 0), + ExecutedTraits: make([]Trait, 0), + Resources: kubernetes.NewCollection(), + } +} diff --git a/pkg/trait/jvm.go b/pkg/trait/jvm.go index a857e7d070..5cab6498b4 100644 --- a/pkg/trait/jvm.go +++ b/pkg/trait/jvm.go @@ -19,6 +19,7 @@ package trait import ( "fmt" + "net/url" "path" "sort" "strings" @@ -37,6 +38,7 @@ import ( v1 "github.com/apache/camel-k/pkg/apis/camel/v1" "github.com/apache/camel-k/pkg/builder" "github.com/apache/camel-k/pkg/util" + "github.com/apache/camel-k/pkg/util/envvar" ) // The JVM trait is used to configure the JVM that runs the integration. @@ -127,7 +129,7 @@ func (t *jvmTrait) Apply(e *Environment) error { container := e.getIntegrationContainer() if container == nil { - return nil + return fmt.Errorf("unable to find integration container") } // Build the container command @@ -161,6 +163,59 @@ func (t *jvmTrait) Apply(e *Environment) error { args = append(args, t.Options...) } + // Translate HTTP proxy environment variables, that are set by the environment trait, + // into corresponding JVM system properties. + if HTTPProxy := envvar.Get(container.Env, "HTTP_PROXY"); HTTPProxy != nil { + u, err := url.Parse(HTTPProxy.Value) + if err != nil { + return err + } + if !util.StringSliceContainsAnyOf(t.Options, "http.proxyHost") { + args = append(args, fmt.Sprintf("-Dhttp.proxyHost=%q", u.Hostname())) + } + if port := u.Port(); !util.StringSliceContainsAnyOf(t.Options, "http.proxyPort") && port != "" { + args = append(args, fmt.Sprintf("-Dhttp.proxyPort=%q", u.Port())) + } + if user := u.User; !util.StringSliceContainsAnyOf(t.Options, "http.proxyUser") && user != nil { + args = append(args, fmt.Sprintf("-Dhttp.proxyUser=%q", user.Username())) + if password, ok := user.Password(); !util.StringSliceContainsAnyOf(t.Options, "http.proxyUser") && ok { + args = append(args, fmt.Sprintf("-Dhttp.proxyPassword=%q", password)) + } + } + } + + if HTTPSProxy := envvar.Get(container.Env, "HTTPS_PROXY"); HTTPSProxy != nil { + u, err := url.Parse(HTTPSProxy.Value) + if err != nil { + return err + } + if !util.StringSliceContainsAnyOf(t.Options, "https.proxyHost") { + args = append(args, fmt.Sprintf("-Dhttps.proxyHost=%q", u.Hostname())) + } + if port := u.Port(); !util.StringSliceContainsAnyOf(t.Options, "https.proxyPort") && port != "" { + args = append(args, fmt.Sprintf("-Dhttps.proxyPort=%q", u.Port())) + } + if user := u.User; !util.StringSliceContainsAnyOf(t.Options, "https.proxyUser") && user != nil { + args = append(args, fmt.Sprintf("-Dhttps.proxyUser=%q", user.Username())) + if password, ok := user.Password(); !util.StringSliceContainsAnyOf(t.Options, "https.proxyUser") && ok { + args = append(args, fmt.Sprintf("-Dhttps.proxyPassword=%q", password)) + } + } + } + + if noProxy := envvar.Get(container.Env, "NO_PROXY"); noProxy != nil { + if !util.StringSliceContainsAnyOf(t.Options, "http.nonProxyHosts") { + // Convert to the format expected by the JVM http.nonProxyHosts system property + hosts := strings.Split(strings.ReplaceAll(noProxy.Value, " ", ""), ",") + for i, host := range hosts { + if strings.HasPrefix(host, ".") { + hosts[i] = strings.Replace(host, ".", "*.", 1) + } + } + args = append(args, fmt.Sprintf("-Dhttp.nonProxyHosts=%q", strings.Join(hosts, "|"))) + } + } + // Tune JVM maximum heap size based on the container memory limit, if any. // This is configured off-container, thus is limited to explicit user configuration. // We may want to inject a wrapper script into the container image, so that it can @@ -183,8 +238,8 @@ func (t *jvmTrait) Apply(e *Environment) error { items := classpath.List() // Keep class path sorted so that it's consistent over reconciliation cycles sort.Strings(items) - args = append(args, "-cp", strings.Join(items, ":")) + args = append(args, e.CamelCatalog.Runtime.ApplicationClass) if IsNilOrTrue(t.PrintCommand) { diff --git a/pkg/trait/openapi.go b/pkg/trait/openapi.go index 11d63d2627..d79cfd7b07 100644 --- a/pkg/trait/openapi.go +++ b/pkg/trait/openapi.go @@ -33,7 +33,7 @@ import ( k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/controller-runtime/pkg/client" + ctrl "sigs.k8s.io/controller-runtime/pkg/client" v1 "github.com/apache/camel-k/pkg/apis/camel/v1" "github.com/apache/camel-k/pkg/util" @@ -124,7 +124,7 @@ func (t *openAPITrait) Apply(e *Environment) error { } } - // Add an additional source that references the config map + // Add a source that references the config map generatedSources = append(generatedSources, v1.SourceSpec{ DataSpec: v1.DataSpec{ Name: generatedSourceName, @@ -142,7 +142,7 @@ func (t *openAPITrait) Apply(e *Environment) error { func (t *openAPITrait) generateOpenAPIConfigMap(e *Environment, resource v1.ResourceSpec, tmpDir, generatedContentName string) error { cm := corev1.ConfigMap{} - key := client.ObjectKey{ + key := ctrl.ObjectKey{ Namespace: e.Integration.Namespace, Name: generatedContentName, } @@ -207,13 +207,21 @@ func (t *openAPITrait) createNewOpenAPIConfigMap(e *Environment, resource v1.Res mc.AddArgument("-Dopenapi.spec=" + in) mc.AddArgument("-Ddsl.out=" + out) - settings, err := kubernetes.ResolveValueSource(e.C, e.Client, e.Platform.Namespace, &e.Platform.Status.Build.Maven.Settings) + if settings, err := kubernetes.ResolveValueSource(e.C, e.Client, e.Platform.Namespace, &e.Platform.Status.Build.Maven.Settings); err != nil { + return err + } else if settings != "" { + mc.UserSettings = []byte(settings) + } + + settings, err := maven.NewSettings(maven.DefaultRepositories, maven.ProxyFromEnvironment) if err != nil { return err } - if settings != "" { - mc.SettingsContent = []byte(settings) + data, err := settings.MarshalBytes() + if err != nil { + return err } + mc.GlobalSettings = data if e.Platform.Status.Build.Maven.CASecret != nil { certData, err := kubernetes.GetSecretRefData(e.C, e.Client, e.Platform.Namespace, e.Platform.Status.Build.Maven.CASecret) diff --git a/pkg/util/camel/catalog.go b/pkg/util/camel/catalog.go index 0aeae20bd8..f931c92609 100644 --- a/pkg/util/camel/catalog.go +++ b/pkg/util/camel/catalog.go @@ -25,7 +25,7 @@ import ( yaml2 "gopkg.in/yaml.v2" - k8sclient "sigs.k8s.io/controller-runtime/pkg/client" + ctrl "sigs.k8s.io/controller-runtime/pkg/client" v1 "github.com/apache/camel-k/pkg/apis/camel/v1" "github.com/apache/camel-k/pkg/resources" @@ -64,13 +64,21 @@ func catalogForRuntimeProvider(provider v1.RuntimeProvider) (*RuntimeCatalog, er func GenerateCatalog( ctx context.Context, - client k8sclient.Reader, + client ctrl.Reader, namespace string, mvn v1.MavenSpec, runtime v1.RuntimeSpec, providerDependencies []maven.Dependency) (*RuntimeCatalog, error) { - settings, err := kubernetes.ResolveValueSource(ctx, client, namespace, &mvn.Settings) + userSettings, err := kubernetes.ResolveValueSource(ctx, client, namespace, &mvn.Settings) + if err != nil { + return nil, err + } + settings, err := maven.NewSettings(maven.DefaultRepositories, maven.ProxyFromEnvironment) + if err != nil { + return nil, err + } + globalSettings, err := settings.MarshalBytes() if err != nil { return nil, err } @@ -83,12 +91,13 @@ func GenerateCatalog( } } - return GenerateCatalogCommon(ctx, settings, caCert, mvn, runtime, providerDependencies) + return GenerateCatalogCommon(ctx, globalSettings, []byte(userSettings), caCert, mvn, runtime, providerDependencies) } func GenerateCatalogCommon( ctx context.Context, - settings string, + globalSettings []byte, + userSettings []byte, caCert []byte, mvn v1.MavenSpec, runtime v1.RuntimeSpec, @@ -114,9 +123,11 @@ func GenerateCatalogCommon( mc.AddSystemProperty("catalog.file", "catalog.yaml") mc.AddSystemProperty("catalog.runtime", string(runtime.Provider)) - mc.SettingsContent = nil - if settings != "" { - mc.SettingsContent = []byte(settings) + if globalSettings != nil { + mc.GlobalSettings = globalSettings + } + if userSettings != nil { + mc.UserSettings = userSettings } if caCert != nil { diff --git a/pkg/util/maven/maven_command.go b/pkg/util/maven/maven_command.go index bca1a97f83..d168b73c8d 100644 --- a/pkg/util/maven/maven_command.go +++ b/pkg/util/maven/maven_command.go @@ -62,12 +62,16 @@ func (c *Command) Do(ctx context.Context) error { } settingsPath := path.Join(c.context.Path, "settings.xml") - settingsExists, err := util.FileExists(settingsPath) - if err != nil { + if settingsExists, err := util.FileExists(settingsPath); err != nil { return err + } else if settingsExists { + args = append(args, "--global-settings", settingsPath) } - if settingsExists { + settingsPath = path.Join(c.context.Path, "user-settings.xml") + if settingsExists, err := util.FileExists(settingsPath); err != nil { + return err + } else if settingsExists { args = append(args, "--settings", settingsPath) } @@ -162,7 +166,8 @@ type Context struct { Path string // Project Project ExtraMavenOpts []string - SettingsContent []byte + GlobalSettings []byte + UserSettings []byte AdditionalArguments []string AdditionalEntries map[string]interface{} // Timeout time.Duration @@ -199,8 +204,14 @@ func generateProjectStructure(context Context, project Project) error { return err } - if context.SettingsContent != nil { - if err := util.WriteFileWithContent(context.Path, "settings.xml", context.SettingsContent); err != nil { + if context.GlobalSettings != nil { + if err := util.WriteFileWithContent(context.Path, "settings.xml", context.GlobalSettings); err != nil { + return err + } + } + + if context.UserSettings != nil { + if err := util.WriteFileWithContent(context.Path, "user-settings.xml", context.UserSettings); err != nil { return err } } diff --git a/pkg/util/maven/maven_proxies.go b/pkg/util/maven/maven_proxies.go new file mode 100644 index 0000000000..e767800a79 --- /dev/null +++ b/pkg/util/maven/maven_proxies.go @@ -0,0 +1,89 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package maven + +import ( + "net/url" + "os" + "strings" +) + +var ProxyFromEnvironment = proxyFromEnvironment{} + +type proxyFromEnvironment struct{} + +func (proxyFromEnvironment) apply(settings *Settings) error { + if httpProxy := os.Getenv("HTTP_PROXY"); httpProxy != "" { + proxy, err := parseProxyFromEnvVar(httpProxy) + if err != nil { + return err + } + proxy.ID = "http-proxy" + settings.Proxies = append(settings.Proxies, proxy) + } + + if httpsProxy := os.Getenv("HTTPS_PROXY"); httpsProxy != "" { + proxy, err := parseProxyFromEnvVar(httpsProxy) + if err != nil { + return err + } + proxy.ID = "https-proxy" + settings.Proxies = append(settings.Proxies, proxy) + } + + return nil +} + +func parseProxyFromEnvVar(proxyEnvVar string) (Proxy, error) { + u, err := url.Parse(proxyEnvVar) + if err != nil { + return Proxy{}, err + } + proxy := Proxy{ + Active: true, + Protocol: u.Scheme, + Host: u.Hostname(), + Port: u.Port(), + } + if proxy.Port == "" { + switch proxy.Protocol { + case "http": + proxy.Port = "80" + case "https": + proxy.Port = "443" + } + } + if user := u.User; user != nil { + proxy.Username = user.Username() + if password, set := user.Password(); set { + proxy.Password = password + } + } + if noProxy := os.Getenv("NO_PROXY"); noProxy != "" { + // Convert to the format expected by the JVM http.nonProxyHosts system property + hosts := strings.Split(strings.ReplaceAll(noProxy, " ", ""), ",") + for i, host := range hosts { + if strings.HasPrefix(host, ".") { + hosts[i] = strings.Replace(host, ".", "*.", 1) + } + } + proxy.NonProxyHosts = strings.Join(hosts, "|") + } + + return proxy, nil +} diff --git a/pkg/util/maven/maven_repositories.go b/pkg/util/maven/maven_repositories.go new file mode 100644 index 0000000000..710dbada52 --- /dev/null +++ b/pkg/util/maven/maven_repositories.go @@ -0,0 +1,94 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package maven + +import ( + "fmt" + "strings" + + v1 "github.com/apache/camel-k/pkg/apis/camel/v1" +) + +var DefaultRepositories = defaultRepositories{} + +type defaultRepositories struct{} + +func (o defaultRepositories) apply(settings *Settings) error { + for _, repository := range defaultMavenRepositories() { + upsertRepository(repository, &settings.Profiles[0].Repositories) + upsertRepository(repository, &settings.Profiles[0].PluginRepositories) + } + return nil +} + +func defaultMavenRepositories() (repositories []v1.Repository) { + for _, repository := range strings.Split(DefaultMavenRepositories, ",") { + repositories = append(repositories, NewRepository(repository)) + } + return +} + +func Repositories(repositories ...string) SettingsOption { + return extraRepositories{ + repositories: repositories, + } +} + +type extraRepositories struct { + repositories []string +} + +func (o extraRepositories) apply(settings *Settings) error { + for i, r := range o.repositories { + if strings.Contains(r, "@mirrorOf=") { + mirror := NewMirror(r) + if mirror.ID == "" { + mirror.ID = fmt.Sprintf("mirror-%03d", i) + } + upsertMirror(mirror, &settings.Mirrors) + } else { + repository := NewRepository(r) + if repository.ID == "" { + repository.ID = fmt.Sprintf("repository-%03d", i) + } + upsertRepository(repository, &settings.Profiles[0].Repositories) + upsertRepository(repository, &settings.Profiles[0].PluginRepositories) + } + } + return nil +} + +func upsertRepository(repository v1.Repository, repositories *[]v1.Repository) { + for i, r := range *repositories { + if r.ID == repository.ID { + (*repositories)[i] = repository + return + } + } + *repositories = append(*repositories, repository) +} + +func upsertMirror(mirror Mirror, mirrors *[]Mirror) { + for i, r := range *mirrors { + if r.ID == mirror.ID { + (*mirrors)[i] = mirror + return + } + } + *mirrors = append(*mirrors, mirror) +} diff --git a/pkg/util/maven/maven_settings.go b/pkg/util/maven/maven_settings.go index 6fff121480..a2c3979026 100644 --- a/pkg/util/maven/maven_settings.go +++ b/pkg/util/maven/maven_settings.go @@ -18,14 +18,8 @@ limitations under the License. package maven import ( - "bytes" "encoding/xml" - "strings" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - v1 "github.com/apache/camel-k/pkg/apis/camel/v1" "github.com/apache/camel-k/pkg/util" ) @@ -34,96 +28,35 @@ import ( var DefaultMavenRepositories = "https://repo.maven.apache.org/maven2@id=central" func (s Settings) MarshalBytes() ([]byte, error) { - w := &bytes.Buffer{} - w.WriteString(xml.Header) - - e := xml.NewEncoder(w) - e.Indent("", " ") - - err := e.Encode(s) - if err != nil { - return []byte{}, err - } + return util.EncodeXML(s) +} - return w.Bytes(), nil +type SettingsOption interface { + apply(settings *Settings) error } -func NewSettings() Settings { - return Settings{ +func NewSettings(options ...SettingsOption) (Settings, error) { + settings := Settings{ XMLName: xml.Name{Local: "settings"}, XMLNs: "http://maven.apache.org/SETTINGS/1.0.0", XMLNsXsi: "http://www.w3.org/2001/XMLSchema-instance", XsiSchemaLocation: "http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd", - } -} - -func NewDefaultSettings(repositories []v1.Repository, mirrors []Mirror) Settings { - settings := NewSettings() - - var additionalRepos []v1.Repository - for _, defaultRepo := range defaultMavenRepositories() { - if !containsRepo(repositories, defaultRepo.ID) { - additionalRepos = append(additionalRepos, defaultRepo) - } - } - if len(additionalRepos) > 0 { - repositories = append(additionalRepos, repositories...) - } - - settings.Profiles = []Profile{ - { - ID: "maven-settings", - Activation: Activation{ - ActiveByDefault: true, - }, - Repositories: repositories, - PluginRepositories: repositories, - }, - } - - settings.Mirrors = mirrors - - return settings -} - -func SettingsConfigMap(namespace string, name string, settings Settings) (*corev1.ConfigMap, error) { - data, err := util.EncodeXML(settings) - if err != nil { - return nil, err - } - - cm := &corev1.ConfigMap{ - TypeMeta: metav1.TypeMeta{ - Kind: "ConfigMap", - APIVersion: corev1.SchemeGroupVersion.String(), - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name + "-maven-settings", - Namespace: namespace, - Labels: map[string]string{ - "app": "camel-k", + Profiles: []Profile{ + { + ID: "camel-k", + Activation: Activation{ + ActiveByDefault: true, + }, }, }, - Data: map[string]string{ - "settings.xml": string(data), - }, } - return cm, nil -} - -func defaultMavenRepositories() (repos []v1.Repository) { - for _, repoDesc := range strings.Split(DefaultMavenRepositories, ",") { - repos = append(repos, NewRepository(repoDesc)) - } - return -} - -func containsRepo(repositories []v1.Repository, id string) bool { - for _, r := range repositories { - if r.ID == id { - return true + for _, option := range options { + err := option.apply(&settings) + if err != nil { + return Settings{}, err } } - return false + + return settings, nil } diff --git a/pkg/util/maven/maven_settings_test.go b/pkg/util/maven/maven_settings_test.go index a6b6a6a451..3ad7ac194e 100644 --- a/pkg/util/maven/maven_settings_test.go +++ b/pkg/util/maven/maven_settings_test.go @@ -54,6 +54,7 @@ const expectedSettings = ` + ` @@ -63,7 +64,7 @@ const expectedDefaultSettings = ` - maven-settings + camel-k true @@ -97,6 +98,7 @@ const expectedDefaultSettings = ` + ` @@ -106,7 +108,7 @@ const expectedDefaultSettingsWithExtraRepo = ` - maven-settings + camel-k true @@ -164,6 +166,7 @@ const expectedDefaultSettingsWithExtraRepo = ` + foo @@ -174,7 +177,9 @@ const expectedDefaultSettingsWithExtraRepo = `` func TestSettingsGeneration(t *testing.T) { - settings := NewSettings() + settings, err := NewSettings() + assert.Nil(t, err) + settings.LocalRepository = "/tmp/artifacts/m2" settings.Profiles = []Profile{ { @@ -209,7 +214,8 @@ func TestSettingsGeneration(t *testing.T) { } func TestDefaultSettingsGeneration(t *testing.T) { - settings := NewDefaultSettings([]v1.Repository{}, []Mirror{}) + settings, err := NewSettings(DefaultRepositories) + assert.Nil(t, err) content, err := util.EncodeXML(settings) @@ -220,34 +226,18 @@ func TestDefaultSettingsGeneration(t *testing.T) { } func TestDefaultSettingsGenerationWithAdditionalRepo(t *testing.T) { - repositories := []v1.Repository{ - NewRepository("https://repo1.maven.org/maven2@id=central"), - NewRepository("https://foo.bar.org/repo@id=foo"), - } - mirrors := []Mirror{ - NewMirror("https://foo.bar.org/repo@id=foo@mirrorOf=*"), + repositories := []string{ + "https://repo1.maven.org/maven2@id=central", + "https://foo.bar.org/repo@id=foo", + "https://foo.bar.org/repo@id=foo@mirrorOf=*", } - settings := NewDefaultSettings(repositories, mirrors) - - content, err := util.EncodeXML(settings) - + settings, err := NewSettings(Repositories(repositories...)) assert.Nil(t, err) - assert.NotNil(t, settings) - - assert.Equal(t, expectedDefaultSettingsWithExtraRepo, string(content)) -} - -func TestCreateSettingsConfigMap(t *testing.T) { - settings := NewDefaultSettings([]v1.Repository{}, []Mirror{}) - - configMap, err := SettingsConfigMap("foo", "bar", settings) - assert.Nil(t, err) - assert.NotNil(t, configMap) content, err := util.EncodeXML(settings) assert.Nil(t, err) assert.NotNil(t, settings) - assert.Equal(t, string(content), configMap.Data["settings.xml"]) + assert.Equal(t, expectedDefaultSettingsWithExtraRepo, string(content)) } diff --git a/pkg/util/maven/maven_types.go b/pkg/util/maven/maven_types.go index e2ea0062c8..ed9fa8fb5c 100644 --- a/pkg/util/maven/maven_types.go +++ b/pkg/util/maven/maven_types.go @@ -60,6 +60,7 @@ type Settings struct { XsiSchemaLocation string `xml:"xsi:schemaLocation,attr"` LocalRepository string `xml:"localRepository"` Profiles []Profile `xml:"profiles>profile,omitempty"` + Proxies []Proxy `xml:"proxies>proxy,omitempty"` Mirrors []Mirror `xml:"mirrors>mirror,omitempty"` } @@ -120,3 +121,14 @@ type PropertyActivation struct { Name string `xml:"name"` Value string `xml:"value"` } + +type Proxy struct { + ID string `xml:"id"` + Active bool `xml:"active"` + Protocol string `xml:"protocol"` + Host string `xml:"host"` + Port string `xml:"port,omitempty"` + Username string `xml:"username,omitempty"` + Password string `xml:"password,omitempty"` + NonProxyHosts string `xml:"nonProxyHosts,omitempty"` +} diff --git a/pkg/util/olm/operator.go b/pkg/util/olm/operator.go index 2bba107061..7e699335f2 100644 --- a/pkg/util/olm/operator.go +++ b/pkg/util/olm/operator.go @@ -25,6 +25,7 @@ import ( "github.com/pkg/errors" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/kubectl/pkg/cmd/set/env" runtime "sigs.k8s.io/controller-runtime/pkg/client" @@ -139,7 +140,7 @@ func HasPermissionToInstall(ctx context.Context, client client.Client, namespace // Install creates a subscription for the OLM package func Install(ctx context.Context, client client.Client, namespace string, global bool, options Options, collection *kubernetes.Collection, - tolerations []string, nodeSelectors []string, resourcesRequirements []string) (bool, error) { + tolerations []string, nodeSelectors []string, resourcesRequirements []string, envVars []string) (bool, error) { options = fillDefaults(options) if installed, err := IsOperatorInstalled(ctx, client, namespace, global, options); err != nil { return false, err @@ -180,6 +181,10 @@ func Install(ctx context.Context, client client.Client, namespace string, global if err != nil { return false, errors.Wrap(err, fmt.Sprintf("could not set resources requirements")) } + err = maybeSetEnvVars(&sub, envVars) + if err != nil { + return false, errors.Wrap(err, fmt.Sprintf("could not set environment variables")) + } if collection != nil { collection.Add(&sub) @@ -247,6 +252,17 @@ func maybeSetResourcesRequirements(sub *operatorsv1alpha1.Subscription, reqArray return nil } +func maybeSetEnvVars(sub *operatorsv1alpha1.Subscription, envVars []string) error { + if envVars != nil { + vars, _, err := env.ParseEnv(envVars, nil) + if err != nil { + return err + } + sub.Spec.Config.Env = vars + } + return nil +} + // Uninstall removes CSV and subscription from the namespace func Uninstall(ctx context.Context, client client.Client, namespace string, global bool, options Options) error { sub, err := findSubscription(ctx, client, namespace, global, options) diff --git a/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/build_types.go b/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/build_types.go index 7345702439..8b8d35acba 100644 --- a/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/build_types.go +++ b/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/build_types.go @@ -62,10 +62,17 @@ type BuilderTask struct { Resources []ResourceSpec `json:"resources,omitempty"` Dependencies []string `json:"dependencies,omitempty"` Steps []string `json:"steps,omitempty"` - Maven MavenSpec `json:"maven,omitempty"` + Maven MavenBuildSpec `json:"maven,omitempty"` BuildDir string `json:"buildDir,omitempty"` } +// MavenBuildSpec -- +type MavenBuildSpec struct { + MavenSpec `json:",inline"` + // The Maven repositories. + Repositories []Repository `json:"repositories,omitempty"` +} + // PublishTask -- type PublishTask struct { ContextDir string `json:"contextDir,omitempty"` @@ -76,19 +83,17 @@ type PublishTask struct { // BuildahTask -- type BuildahTask struct { - BaseTask `json:",inline"` - PublishTask `json:",inline"` - Verbose *bool `json:"verbose,omitempty"` - HttpProxySecret string `json:"httpProxySecret,omitempty"` + BaseTask `json:",inline"` + PublishTask `json:",inline"` + Verbose *bool `json:"verbose,omitempty"` } // KanikoTask -- type KanikoTask struct { - BaseTask `json:",inline"` - PublishTask `json:",inline"` - Verbose *bool `json:"verbose,omitempty"` - HttpProxySecret string `json:"httpProxySecret,omitempty"` - Cache KanikoTaskCache `json:"cache,omitempty"` + BaseTask `json:",inline"` + PublishTask `json:",inline"` + Verbose *bool `json:"verbose,omitempty"` + Cache KanikoTaskCache `json:"cache,omitempty"` } // KanikoTaskCache -- diff --git a/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/common_types.go b/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/common_types.go index 34e4074b5c..9880081c50 100644 --- a/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/common_types.go +++ b/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/common_types.go @@ -98,29 +98,6 @@ type Configurable interface { Configurations() []ConfigurationSpec } -// MavenSpec -- -type MavenSpec struct { - // The path of the local Maven repository. - LocalRepository string `json:"localRepository,omitempty"` - // The Maven properties. - Properties map[string]string `json:"properties,omitempty"` - // A reference to the ConfigMap or Secret key that contains - // the Maven settings. - Settings ValueSource `json:"settings,omitempty"` - // The Secret name and key, containing the CA certificate(s) used to connect - // to remote Maven repositories. - // It can contain X.509 certificates, and PKCS#7 formatted certificate chains. - // A JKS formatted keystore is automatically created to store the CA certificate(s), - // and configured to be used as a trusted certificate(s) by the Maven commands. - // Note that the root CA certificates are also imported into the created keystore. - CASecret *corev1.SecretKeySelector `json:"caSecret,omitempty"` - // Deprecated: use IntegrationPlatform.Spec.Build.Timeout instead - Timeout *metav1.Duration `json:"timeout,omitempty"` - Repositories []Repository `json:"repositories,omitempty"` - // Maven build extensions https://maven.apache.org/guides/mini/guide-using-extensions.html - Extension []MavenArtifact `json:"extension,omitempty"` -} - // RegistrySpec provides the configuration for the container registry type RegistrySpec struct { Insecure bool `json:"insecure,omitempty"` @@ -138,13 +115,6 @@ type ValueSource struct { SecretKeyRef *corev1.SecretKeySelector `json:"secretKeyRef,omitempty"` } -// MavenArtifact -- -type MavenArtifact struct { - GroupID string `json:"groupId" yaml:"groupId" xml:"groupId"` - ArtifactID string `json:"artifactId" yaml:"artifactId" xml:"artifactId"` - Version string `json:"version,omitempty" yaml:"version,omitempty" xml:"version,omitempty"` -} - // RuntimeSpec -- type RuntimeSpec struct { Version string `json:"version" yaml:"version"` diff --git a/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/integrationplatform_types.go b/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/integrationplatform_types.go index 1468e4bba1..ba6fa32a0c 100644 --- a/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/integrationplatform_types.go +++ b/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/integrationplatform_types.go @@ -115,7 +115,6 @@ type IntegrationPlatformBuildSpec struct { Timeout *metav1.Duration `json:"timeout,omitempty"` PersistentVolumeClaim string `json:"persistentVolumeClaim,omitempty"` Maven MavenSpec `json:"maven,omitempty"` - HTTPProxySecret string `json:"httpProxySecret,omitempty"` KanikoBuildCache *bool `json:"kanikoBuildCache,omitempty"` } diff --git a/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/maven_types.go b/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/maven_types.go index 426f113d14..569336c5e1 100644 --- a/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/maven_types.go +++ b/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/maven_types.go @@ -17,7 +17,35 @@ limitations under the License. package v1 -// Repository -- +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// MavenSpec -- +type MavenSpec struct { + // The path of the local Maven repository. + LocalRepository string `json:"localRepository,omitempty"` + // The Maven properties. + Properties map[string]string `json:"properties,omitempty"` + // A reference to the ConfigMap or Secret key that contains + // the Maven settings. + Settings ValueSource `json:"settings,omitempty"` + // The Secret name and key, containing the CA certificate(s) used to connect + // to remote Maven repositories. + // It can contain X.509 certificates, and PKCS#7 formatted certificate chains. + // A JKS formatted keystore is automatically created to store the CA certificate(s), + // and configured to be used as a trusted certificate(s) by the Maven commands. + // Note that the root CA certificates are also imported into the created keystore. + CASecret *corev1.SecretKeySelector `json:"caSecret,omitempty"` + // Deprecated: use IntegrationPlatform.Spec.Build.Timeout instead + Timeout *metav1.Duration `json:"timeout,omitempty"` + // The Maven build extensions. + // See https://maven.apache.org/guides/mini/guide-using-extensions.html. + Extension []MavenArtifact `json:"extension,omitempty"` +} + +// Repository defines a Maven repository type Repository struct { ID string `xml:"id" json:"id"` Name string `xml:"name,omitempty" json:"name,omitempty"` @@ -26,9 +54,16 @@ type Repository struct { Releases RepositoryPolicy `xml:"releases,omitempty" json:"releases,omitempty"` } -// RepositoryPolicy -- +// RepositoryPolicy defines the policy associated to a Maven repository type RepositoryPolicy struct { Enabled bool `xml:"enabled" json:"enabled"` UpdatePolicy string `xml:"updatePolicy,omitempty" json:"updatePolicy,omitempty"` ChecksumPolicy string `xml:"checksumPolicy,omitempty" json:"checksumPolicy,omitempty"` } + +// MavenArtifact defines a Maven artifact +type MavenArtifact struct { + GroupID string `json:"groupId" yaml:"groupId" xml:"groupId"` + ArtifactID string `json:"artifactId" yaml:"artifactId" xml:"artifactId"` + Version string `json:"version,omitempty" yaml:"version,omitempty" xml:"version,omitempty"` +} diff --git a/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/zz_generated.deepcopy.go b/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/zz_generated.deepcopy.go index bc44413c51..7bfdcd44ea 100644 --- a/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/zz_generated.deepcopy.go +++ b/vendor/github.com/apache/camel-k/pkg/apis/camel/v1/zz_generated.deepcopy.go @@ -1231,6 +1231,27 @@ func (in *MavenArtifact) DeepCopy() *MavenArtifact { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MavenBuildSpec) DeepCopyInto(out *MavenBuildSpec) { + *out = *in + in.MavenSpec.DeepCopyInto(&out.MavenSpec) + if in.Repositories != nil { + in, out := &in.Repositories, &out.Repositories + *out = make([]Repository, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MavenBuildSpec. +func (in *MavenBuildSpec) DeepCopy() *MavenBuildSpec { + if in == nil { + return nil + } + out := new(MavenBuildSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MavenSpec) DeepCopyInto(out *MavenSpec) { *out = *in @@ -1252,11 +1273,6 @@ func (in *MavenSpec) DeepCopyInto(out *MavenSpec) { *out = new(metav1.Duration) **out = **in } - if in.Repositories != nil { - in, out := &in.Repositories, &out.Repositories - *out = make([]Repository, len(*in)) - copy(*out, *in) - } if in.Extension != nil { in, out := &in.Extension, &out.Extension *out = make([]MavenArtifact, len(*in)) diff --git a/vendor/k8s.io/kubectl/LICENSE b/vendor/k8s.io/kubectl/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/vendor/k8s.io/kubectl/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/k8s.io/kubectl/pkg/cmd/set/env/doc.go b/vendor/k8s.io/kubectl/pkg/cmd/set/env/doc.go new file mode 100644 index 0000000000..25e4c04a70 --- /dev/null +++ b/vendor/k8s.io/kubectl/pkg/cmd/set/env/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package env provides functions to incorporate environment variables into set env. +package env diff --git a/vendor/k8s.io/kubectl/pkg/cmd/set/env/env_parse.go b/vendor/k8s.io/kubectl/pkg/cmd/set/env/env_parse.go new file mode 100644 index 0000000000..d5b3ec7061 --- /dev/null +++ b/vendor/k8s.io/kubectl/pkg/cmd/set/env/env_parse.go @@ -0,0 +1,140 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package env + +import ( + "bufio" + "fmt" + "io" + "regexp" + "strings" + + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/util/sets" +) + +var argumentEnvironment = regexp.MustCompile("(?ms)^(.+)\\=(.*)$") +var validArgumentEnvironment = regexp.MustCompile("(?ms)^(\\w+)\\=(.*)$") + +// IsEnvironmentArgument checks whether a string is an environment argument, that is, whether it matches the "anycharacters=anycharacters" pattern. +func IsEnvironmentArgument(s string) bool { + return argumentEnvironment.MatchString(s) +} + +// IsValidEnvironmentArgument checks whether a string is a valid environment argument, that is, whether it matches the "wordcharacters=anycharacters" pattern. Word characters can be letters, numbers, and underscores. +func IsValidEnvironmentArgument(s string) bool { + return validArgumentEnvironment.MatchString(s) +} + +// SplitEnvironmentFromResources separates resources from environment arguments. +// Resources must come first. Arguments may have the "DASH-" syntax. +func SplitEnvironmentFromResources(args []string) (resources, envArgs []string, ok bool) { + first := true + for _, s := range args { + // this method also has to understand env removal syntax, i.e. KEY- + isEnv := IsEnvironmentArgument(s) || strings.HasSuffix(s, "-") + switch { + case first && isEnv: + first = false + fallthrough + case !first && isEnv: + envArgs = append(envArgs, s) + case first && !isEnv: + resources = append(resources, s) + case !first && !isEnv: + return nil, nil, false + } + } + return resources, envArgs, true +} + +// parseIntoEnvVar parses the list of key-value pairs into kubernetes EnvVar. +// envVarType is for making errors more specific to user intentions. +func parseIntoEnvVar(spec []string, defaultReader io.Reader, envVarType string) ([]v1.EnvVar, []string, error) { + env := []v1.EnvVar{} + exists := sets.NewString() + var remove []string + for _, envSpec := range spec { + switch { + case !IsValidEnvironmentArgument(envSpec) && !strings.HasSuffix(envSpec, "-"): + return nil, nil, fmt.Errorf("%ss must be of the form key=value and can only contain letters, numbers, and underscores", envVarType) + case envSpec == "-": + if defaultReader == nil { + return nil, nil, fmt.Errorf("when '-' is used, STDIN must be open") + } + fileEnv, err := readEnv(defaultReader, envVarType) + if err != nil { + return nil, nil, err + } + env = append(env, fileEnv...) + case strings.Contains(envSpec, "="): + parts := strings.SplitN(envSpec, "=", 2) + if len(parts) != 2 { + return nil, nil, fmt.Errorf("invalid %s: %v", envVarType, envSpec) + } + exists.Insert(parts[0]) + env = append(env, v1.EnvVar{ + Name: parts[0], + Value: parts[1], + }) + case strings.HasSuffix(envSpec, "-"): + remove = append(remove, envSpec[:len(envSpec)-1]) + default: + return nil, nil, fmt.Errorf("unknown %s: %v", envVarType, envSpec) + } + } + for _, removeLabel := range remove { + if _, found := exists[removeLabel]; found { + return nil, nil, fmt.Errorf("can not both modify and remove the same %s in the same command", envVarType) + } + } + return env, remove, nil +} + +// ParseEnv parses the elements of the first argument looking for environment variables in key=value form and, if one of those values is "-", it also scans the reader. +// The same environment variable cannot be both modified and removed in the same command. +func ParseEnv(spec []string, defaultReader io.Reader) ([]v1.EnvVar, []string, error) { + return parseIntoEnvVar(spec, defaultReader, "environment variable") +} + +func readEnv(r io.Reader, envVarType string) ([]v1.EnvVar, error) { + env := []v1.EnvVar{} + scanner := bufio.NewScanner(r) + for scanner.Scan() { + envSpec := scanner.Text() + if pos := strings.Index(envSpec, "#"); pos != -1 { + envSpec = envSpec[:pos] + } + + if strings.Contains(envSpec, "=") { + parts := strings.SplitN(envSpec, "=", 2) + if len(parts) != 2 { + return nil, fmt.Errorf("invalid %s: %v", envVarType, envSpec) + } + env = append(env, v1.EnvVar{ + Name: parts[0], + Value: parts[1], + }) + } + } + + if err := scanner.Err(); err != nil && err != io.EOF { + return nil, err + } + + return env, nil +} diff --git a/vendor/k8s.io/kubectl/pkg/cmd/set/env/env_resolve.go b/vendor/k8s.io/kubectl/pkg/cmd/set/env/env_resolve.go new file mode 100644 index 0000000000..e45b686b39 --- /dev/null +++ b/vendor/k8s.io/kubectl/pkg/cmd/set/env/env_resolve.go @@ -0,0 +1,297 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package env + +import ( + "context" + "fmt" + "math" + "strconv" + "strings" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/util/validation" + "k8s.io/client-go/kubernetes" +) + +// ResourceStore defines a new resource store data structure. +type ResourceStore struct { + SecretStore map[string]*corev1.Secret + ConfigMapStore map[string]*corev1.ConfigMap +} + +// NewResourceStore returns a pointer to a new resource store data structure. +func NewResourceStore() *ResourceStore { + return &ResourceStore{ + SecretStore: make(map[string]*corev1.Secret), + ConfigMapStore: make(map[string]*corev1.ConfigMap), + } +} + +// getSecretRefValue returns the value of a secret in the supplied namespace +func getSecretRefValue(client kubernetes.Interface, namespace string, store *ResourceStore, secretSelector *corev1.SecretKeySelector) (string, error) { + secret, ok := store.SecretStore[secretSelector.Name] + if !ok { + var err error + secret, err = client.CoreV1().Secrets(namespace).Get(context.TODO(), secretSelector.Name, metav1.GetOptions{}) + if err != nil { + return "", err + } + store.SecretStore[secretSelector.Name] = secret + } + if data, ok := secret.Data[secretSelector.Key]; ok { + return string(data), nil + } + return "", fmt.Errorf("key %s not found in secret %s", secretSelector.Key, secretSelector.Name) + +} + +// getConfigMapRefValue returns the value of a configmap in the supplied namespace +func getConfigMapRefValue(client kubernetes.Interface, namespace string, store *ResourceStore, configMapSelector *corev1.ConfigMapKeySelector) (string, error) { + configMap, ok := store.ConfigMapStore[configMapSelector.Name] + if !ok { + var err error + configMap, err = client.CoreV1().ConfigMaps(namespace).Get(context.TODO(), configMapSelector.Name, metav1.GetOptions{}) + if err != nil { + return "", err + } + store.ConfigMapStore[configMapSelector.Name] = configMap + } + if data, ok := configMap.Data[configMapSelector.Key]; ok { + return string(data), nil + } + return "", fmt.Errorf("key %s not found in config map %s", configMapSelector.Key, configMapSelector.Name) +} + +// getFieldRef returns the value of the supplied path in the given object +func getFieldRef(obj runtime.Object, from *corev1.EnvVarSource) (string, error) { + return extractFieldPathAsString(obj, from.FieldRef.FieldPath) +} + +// extractFieldPathAsString extracts the field from the given object +// and returns it as a string. The object must be a pointer to an +// API type. +func extractFieldPathAsString(obj interface{}, fieldPath string) (string, error) { + accessor, err := meta.Accessor(obj) + if err != nil { + return "", nil + } + + if path, subscript, ok := splitMaybeSubscriptedPath(fieldPath); ok { + switch path { + case "metadata.annotations": + if errs := validation.IsQualifiedName(strings.ToLower(subscript)); len(errs) != 0 { + return "", fmt.Errorf("invalid key subscript in %s: %s", fieldPath, strings.Join(errs, ";")) + } + return accessor.GetAnnotations()[subscript], nil + case "metadata.labels": + if errs := validation.IsQualifiedName(subscript); len(errs) != 0 { + return "", fmt.Errorf("invalid key subscript in %s: %s", fieldPath, strings.Join(errs, ";")) + } + return accessor.GetLabels()[subscript], nil + default: + return "", fmt.Errorf("fieldPath %q does not support subscript", fieldPath) + } + } + + switch fieldPath { + case "metadata.annotations": + return formatMap(accessor.GetAnnotations()), nil + case "metadata.labels": + return formatMap(accessor.GetLabels()), nil + case "metadata.name": + return accessor.GetName(), nil + case "metadata.namespace": + return accessor.GetNamespace(), nil + case "metadata.uid": + return string(accessor.GetUID()), nil + } + + return "", fmt.Errorf("unsupported fieldPath: %v", fieldPath) +} + +// splitMaybeSubscriptedPath checks whether the specified fieldPath is +// subscripted, and +// - if yes, this function splits the fieldPath into path and subscript, and +// returns (path, subscript, true). +// - if no, this function returns (fieldPath, "", false). +// +// Example inputs and outputs: +// - "metadata.annotations['myKey']" --> ("metadata.annotations", "myKey", true) +// - "metadata.annotations['a[b]c']" --> ("metadata.annotations", "a[b]c", true) +// - "metadata.labels['']" --> ("metadata.labels", "", true) +// - "metadata.labels" --> ("metadata.labels", "", false) +func splitMaybeSubscriptedPath(fieldPath string) (string, string, bool) { + if !strings.HasSuffix(fieldPath, "']") { + return fieldPath, "", false + } + s := strings.TrimSuffix(fieldPath, "']") + parts := strings.SplitN(s, "['", 2) + if len(parts) < 2 { + return fieldPath, "", false + } + if len(parts[0]) == 0 { + return fieldPath, "", false + } + return parts[0], parts[1], true +} + +// formatMap formats map[string]string to a string. +func formatMap(m map[string]string) (fmtStr string) { + // output with keys in sorted order to provide stable output + keys := sets.NewString() + for key := range m { + keys.Insert(key) + } + for _, key := range keys.List() { + fmtStr += fmt.Sprintf("%v=%q\n", key, m[key]) + } + fmtStr = strings.TrimSuffix(fmtStr, "\n") + + return +} + +// getResourceFieldRef returns the value of a resource in the given container +func getResourceFieldRef(from *corev1.EnvVarSource, container *corev1.Container) (string, error) { + return extractContainerResourceValue(from.ResourceFieldRef, container) +} + +// ExtractContainerResourceValue extracts the value of a resource +// in an already known container +func extractContainerResourceValue(fs *corev1.ResourceFieldSelector, container *corev1.Container) (string, error) { + divisor := resource.Quantity{} + if divisor.Cmp(fs.Divisor) == 0 { + divisor = resource.MustParse("1") + } else { + divisor = fs.Divisor + } + + switch fs.Resource { + case "limits.cpu": + return convertResourceCPUToString(container.Resources.Limits.Cpu(), divisor) + case "limits.memory": + return convertResourceMemoryToString(container.Resources.Limits.Memory(), divisor) + case "limits.ephemeral-storage": + return convertResourceEphemeralStorageToString(container.Resources.Limits.StorageEphemeral(), divisor) + case "requests.cpu": + return convertResourceCPUToString(container.Resources.Requests.Cpu(), divisor) + case "requests.memory": + return convertResourceMemoryToString(container.Resources.Requests.Memory(), divisor) + case "requests.ephemeral-storage": + return convertResourceEphemeralStorageToString(container.Resources.Requests.StorageEphemeral(), divisor) + } + // handle extended standard resources with dynamic names + // example: requests.hugepages- or limits.hugepages- + if strings.HasPrefix(fs.Resource, "requests.") { + resourceName := corev1.ResourceName(strings.TrimPrefix(fs.Resource, "requests.")) + if IsHugePageResourceName(resourceName) { + return convertResourceHugePagesToString(container.Resources.Requests.Name(resourceName, resource.BinarySI), divisor) + } + } + if strings.HasPrefix(fs.Resource, "limits.") { + resourceName := corev1.ResourceName(strings.TrimPrefix(fs.Resource, "limits.")) + if IsHugePageResourceName(resourceName) { + return convertResourceHugePagesToString(container.Resources.Limits.Name(resourceName, resource.BinarySI), divisor) + } + } + return "", fmt.Errorf("Unsupported container resource : %v", fs.Resource) +} + +// convertResourceCPUToString converts cpu value to the format of divisor and returns +// ceiling of the value. +func convertResourceCPUToString(cpu *resource.Quantity, divisor resource.Quantity) (string, error) { + c := int64(math.Ceil(float64(cpu.MilliValue()) / float64(divisor.MilliValue()))) + return strconv.FormatInt(c, 10), nil +} + +// convertResourceMemoryToString converts memory value to the format of divisor and returns +// ceiling of the value. +func convertResourceMemoryToString(memory *resource.Quantity, divisor resource.Quantity) (string, error) { + m := int64(math.Ceil(float64(memory.Value()) / float64(divisor.Value()))) + return strconv.FormatInt(m, 10), nil +} + +// convertResourceHugePagesToString converts hugepages value to the format of divisor and returns +// ceiling of the value. +func convertResourceHugePagesToString(hugePages *resource.Quantity, divisor resource.Quantity) (string, error) { + m := int64(math.Ceil(float64(hugePages.Value()) / float64(divisor.Value()))) + return strconv.FormatInt(m, 10), nil +} + +// convertResourceEphemeralStorageToString converts ephemeral storage value to the format of divisor and returns +// ceiling of the value. +func convertResourceEphemeralStorageToString(ephemeralStorage *resource.Quantity, divisor resource.Quantity) (string, error) { + m := int64(math.Ceil(float64(ephemeralStorage.Value()) / float64(divisor.Value()))) + return strconv.FormatInt(m, 10), nil +} + +// GetEnvVarRefValue returns the value referenced by the supplied EnvVarSource given the other supplied information. +func GetEnvVarRefValue(kc kubernetes.Interface, ns string, store *ResourceStore, from *corev1.EnvVarSource, obj runtime.Object, c *corev1.Container) (string, error) { + if from.SecretKeyRef != nil { + return getSecretRefValue(kc, ns, store, from.SecretKeyRef) + } + + if from.ConfigMapKeyRef != nil { + return getConfigMapRefValue(kc, ns, store, from.ConfigMapKeyRef) + } + + if from.FieldRef != nil { + return getFieldRef(obj, from) + } + + if from.ResourceFieldRef != nil { + return getResourceFieldRef(from, c) + } + + return "", fmt.Errorf("invalid valueFrom") +} + +// GetEnvVarRefString returns a text description of whichever field is set within the supplied EnvVarSource argument. +func GetEnvVarRefString(from *corev1.EnvVarSource) string { + if from.ConfigMapKeyRef != nil { + return fmt.Sprintf("configmap %s, key %s", from.ConfigMapKeyRef.Name, from.ConfigMapKeyRef.Key) + } + + if from.SecretKeyRef != nil { + return fmt.Sprintf("secret %s, key %s", from.SecretKeyRef.Name, from.SecretKeyRef.Key) + } + + if from.FieldRef != nil { + return fmt.Sprintf("field path %s", from.FieldRef.FieldPath) + } + + if from.ResourceFieldRef != nil { + containerPrefix := "" + if from.ResourceFieldRef.ContainerName != "" { + containerPrefix = fmt.Sprintf("%s/", from.ResourceFieldRef.ContainerName) + } + return fmt.Sprintf("resource field %s%s", containerPrefix, from.ResourceFieldRef.Resource) + } + + return "invalid valueFrom" +} + +// IsHugePageResourceName returns true if the resource name has the huge page +// resource prefix. +func IsHugePageResourceName(name corev1.ResourceName) bool { + return strings.HasPrefix(string(name), corev1.ResourceHugePagesPrefix) +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 3e7f0d6f43..1e564ed858 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -951,6 +951,9 @@ k8s.io/klog k8s.io/klog/v2 # k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 k8s.io/kube-openapi/pkg/util/proto +# k8s.io/kubectl v0.20.2 +## explicit +k8s.io/kubectl/pkg/cmd/set/env # k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 ## explicit k8s.io/utils/buffer