From d5b5adfc5cd6a319d5e7c381a30bbad1f96f177f Mon Sep 17 00:00:00 2001 From: Jingfang Liu Date: Tue, 10 Apr 2018 14:32:02 -0700 Subject: [PATCH] change kinflate to kustomize --- Makefile | 25 +++ README.md | 52 +++++ build/README.md | 16 ++ build/build.sh | 51 +++++ build/cloudbuild.yaml | 30 +++ build/cloudbuild_local.yaml | 31 +++ demos/README.md | 13 ++ demos/helloWorld.md | 432 ++++++++++++++++++++++++++++++++++++ demos/mySql.md | 239 ++++++++++++++++++++ demos/springboot.md | 350 +++++++++++++++++++++++++++++ demos/tree1.png | Bin 0 -> 8738 bytes demos/tree2.png | Bin 0 -> 14442 bytes docs/Kube-manifest.yaml | 22 ++ docs/base.jpg | Bin 0 -> 41948 bytes docs/glossary.md | 261 ++++++++++++++++++++++ docs/overlay.jpg | Bin 0 -> 50739 bytes docs/workflowBespoke.jpg | Bin 0 -> 37063 bytes docs/workflowOts.jpg | Bin 0 -> 44295 bytes docs/workflows.md | 127 +++++++++++ kustomize.go | 34 +++ test/main.sh | 49 ++++ version/version.go | 67 ++++++ 22 files changed, 1799 insertions(+) create mode 100644 Makefile create mode 100644 README.md create mode 100644 build/README.md create mode 100755 build/build.sh create mode 100644 build/cloudbuild.yaml create mode 100644 build/cloudbuild_local.yaml create mode 100644 demos/README.md create mode 100644 demos/helloWorld.md create mode 100644 demos/mySql.md create mode 100644 demos/springboot.md create mode 100644 demos/tree1.png create mode 100644 demos/tree2.png create mode 100644 docs/Kube-manifest.yaml create mode 100644 docs/base.jpg create mode 100644 docs/glossary.md create mode 100644 docs/overlay.jpg create mode 100644 docs/workflowBespoke.jpg create mode 100644 docs/workflowOts.jpg create mode 100644 docs/workflows.md create mode 100644 kustomize.go create mode 100755 test/main.sh create mode 100644 version/version.go diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..9b0d1685ee --- /dev/null +++ b/Makefile @@ -0,0 +1,25 @@ +SHELL := /bin/bash -euo pipefail + +config_file_name = Kube-manifest.yaml +example_config = docs/$(config_file_name) + +.PHONY: all +all: docs + +# In a branch, run 'make docs' to update docs with +# generated code, then merge it to master. +docs: $(example_config) + +# Use kustomize to create the standard kustomize configuration +# file that appears in the website's documentation. +$(example_config): /tmp/bin/kustomize + rm -f TMP + echo "# This is a generated example; do not edit. Rebuild with 'make docs'." >> TMP + echo " " >> TMP + /tmp/bin/kustomize init + cat $(config_file_name) >> TMP + mv TMP $(example_config) + rm $(config_file_name) + +/tmp/bin/kustomize: + go build -o /tmp/bin/kustomize kustomize.go diff --git a/README.md b/README.md new file mode 100644 index 0000000000..c3c474f3e6 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# kustomize + +[applied]: docs/glossary.md#apply +[base]: docs/glossary.md#base +[declarative configuration]: docs/glossary.md#declarative-application-management +[demo]: demos/README.md +[imageBase]: docs/base.jpg +[imageOverlay]: docs/overlay.jpg +[manifest]: docs/glossary.md#manifest +[overlay]: docs/glossary.md#overlay +[resources]: docs/glossary.md#resource +[workflows]: docs/workflows.md + +`kustomize` is a command line tool supporting +template-free customization of declarative +configuration targetted to kubernetes. + +## Installation + +Assumes [Go](https://golang.org/) is installed +and your `PATH` contains `$GOPATH/bin`: + + +``` +go get k8s.io/kubectl/cmd/kustomize +``` + +## Usage + +#### 1) Make a base + +A [base] configuration is a [manifest] listing a set of +k8s [resources] - deployments, services, configmaps, +secrets that serve some common purpose. + +![base image][imageBase] + +#### 2) Customize it with overlays + +An [overlay] customizes your base along different dimensions +for different purposes or different teams, e.g. for +_development, staging and production_. + +![overlay image][imageOverlay] + +#### 3) Run kustomize + +Run kustomize on your overlay. The result +is printed to `stdout` as a set of complete +resources, ready to be [applied] to a cluster. + +For more details, try a [demo]. diff --git a/build/README.md b/build/README.md new file mode 100644 index 0000000000..95ba60c790 --- /dev/null +++ b/build/README.md @@ -0,0 +1,16 @@ +## Steps to run build locally + +Install container-builder-local from github and define GOOS, GOARCH, OUTPUT env +variables and run following command + +```sh +container-builder-local --config=cmd/kustomize/build/cloudbuild_local.yaml --dryrun=false --substitutions=_GOOS=$GOOS,_GOARCH=$GOARCH --write-workspace=$OUTPUT . +``` + +## Steps to submit build to Google container builder + +You need to be at the repo level to be able to run the following command + +``` +gcloud container builds submit . --config=cmd/kustomize/build/cloudbuild.yaml --substitutions=_GOOS=$GOOS,_GOARCH=$GOARCH +``` diff --git a/build/build.sh b/build/build.sh new file mode 100755 index 0000000000..a557fcf2a8 --- /dev/null +++ b/build/build.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# +# Copyright 2018 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. + +set -e +set -x + +# Google Container Builder automatically checks out all the code under the /workspace directory, +# but we actually want it to under the correct expected package in the GOPATH (/go) +# - Create the directory to host the code that matches the expected GOPATH package locations +# - Use /go as the default GOPATH because this is what the image uses +# - Link our current directory (containing the source code) to the package location in the GOPATH +export PKG=k8s.io +export REPO=kubectl +export CMD=kustomize + +mkdir -p /go/src/$PKG +ln -s $(pwd) /go/src/$PKG/$REPO + +# Create the output directory for the binaries we will build +# Make sure CGO is 0 so the binaries are statically compiled and linux which is necessary for cross compiling go +export CGO=0 +export DEST=/workspace/_output/$CMD/bin +mkdir -p $DEST || echo "" + +go build -o $DEST/$CMD $PKG/$REPO/cmd/$CMD + +# Explicitly set the values of the variables in package "X" using ldflag so that they are statically compiled into +# the "version" command +export GITCOMMIT=$(git rev-parse HEAD) +export BUILDDATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') +export X=$PKG/$REPO/cmd/$CMD/version +go build -o $DEST/$CMD \ + -ldflags "-X $X.kustomizeVersion=$TAG -X $X.goos=$GOOS -X $X.goarch=$GOARCH -X $X.gitCommit=$GITCOMMIT -X $X.buildDate=$BUILDDATE" \ + $PKG/$REPO/cmd/$CMD + +# Generate the tar archive +cd /workspace/_output/ +tar -czvf /workspace/$CMD-$VERSION-$GOOS-$GOARCH.tar.gz $CMD diff --git a/build/cloudbuild.yaml b/build/cloudbuild.yaml new file mode 100644 index 0000000000..a0b63264a6 --- /dev/null +++ b/build/cloudbuild.yaml @@ -0,0 +1,30 @@ +# Copyright 2018 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. + +# TODO(droot): add instructions for running in production. +steps: +- name: "ubuntu" + args: ["mkdir", "-p", "/workspace/_output"] +- name: "golang:1.10-stretch" + args: ["bash", "cmd/kustomize/build/build.sh"] + env: + - 'GOOS=${_GOOS}' + - 'GOARCH=${_GOARCH}' + - 'VERSION=${TAG_NAME}' +- name: 'gcr.io/cloud-builders/gsutil' + args: ['-h', 'Content-Type:application/gzip', 'cp', '-a', 'public-read', 'kustomize-${TAG_NAME}-${_GOOS}-${_GOARCH}.tar.gz', 'gs://kustomize-release/kustomize-${TAG_NAME}-${_GOOS}-${_GOARCH}.tar.gz'] + env: + - 'GOOS=${_GOOS}' + - 'GOARCH=${_GOARCH}' + - 'VERSION=${TAG_NAME}' diff --git a/build/cloudbuild_local.yaml b/build/cloudbuild_local.yaml new file mode 100644 index 0000000000..66f9b87e52 --- /dev/null +++ b/build/cloudbuild_local.yaml @@ -0,0 +1,31 @@ +# Copyright 2018 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. + +# Instructions to run locally: +# Download google container builder: https://github.com/kubernetes-sigs/container-builder-local +# Set you GOOS and GOARCH vars to match your system +# Set OUTPUT to the location to write the directory containing the tar.gz +# $ container-builder-local --config=build/cloudbuild_local.yaml --dryrun=false \ +# --substitutions=_GOOS=$GOOS,_GOARCH=$GOARCH --write-workspace=$OUTPUT . +# Release tar will be in $OUTPUT + +steps: +- name: "ubuntu" + args: ["mkdir", "-p", "/workspace/_output"] +- name: "golang:1.10-stretch" + args: ["bash", "cmd/kustomize/build/build.sh"] + env: + - 'GOOS=${_GOOS}' + - 'GOARCH=${_GOARCH}' + - 'VERSION=${TAG_NAME}' diff --git a/demos/README.md b/demos/README.md new file mode 100644 index 0000000000..e3818f1b94 --- /dev/null +++ b/demos/README.md @@ -0,0 +1,13 @@ +# Demos + +These demos are covered by presubmit tests. + + * [hello world](helloWorld.md) - Deploy multiple + (differently configured) instances of a simple Hello + World server. + + * [mysql](mySql.md) - Create a mySql production + configuration from scratch. + + * [springboot](springboot.md) - Create a Spring Boot application production + configuration from scratch. diff --git a/demos/helloWorld.md b/demos/helloWorld.md new file mode 100644 index 0000000000..d6e9c5bf5c --- /dev/null +++ b/demos/helloWorld.md @@ -0,0 +1,432 @@ +[base]: ../docs/glossary.md#base +[config]: https://github.com/kinflate/example-hello +[hello]: https://github.com/monopole/hello +[instance]: ../docs/glossary.md#instance +[instances]: ../docs/glossary.md#instance +[manifest]: ../docs/glossary.md#manifest +[original]: https://github.com/kinflate/example-hello +[overlay]: ../docs/glossary.md#overlay +[overlays]: ../docs/glossary.md#overlay + +# Demo: hello world with instances + +Steps: + + 1. Clone an existing configuration as a [base]. + 1. Customize it. + 1. Create two different [overlays] (_staging_ and _production_) + from the customized base. + 1. Run kustomize and kubectl to deploy staging and production. + +First define a place to work: + + +``` +DEMO_HOME=$(mktemp -d) +``` + +Alternatively, use + +> ``` +> DEMO_HOME=~/hello +> ``` + +## Clone an example + +Let's run the [hello] service. +Here's an existing [config] for it. + +Clone this config to a directory called `base`: + + +``` +git clone \ + https://github.com/kinflate/example-hello \ + $DEMO_HOME/base +``` + + +``` +tree $DEMO_HOME +``` + +Expecting something like: + +> ``` +> /tmp/tmp.IyYQQlHaJP +> └── base +> ├── configMap.yaml +> ├── deployment.yaml +> ├── kustomize.yaml +> ├── LICENSE +> ├── README.md +> └── service.yaml +> ``` + + +One could immediately apply these resources to a +cluster: + +> ``` +> kubectl apply -f $DEMO_HOME/base +> ``` + +to instantiate the _hello_ service. `kubectl` +would only recognize the resource files. + +## The Base Manifest + +The `base` directory has a [manifest] file: + + +``` +BASE=$DEMO_HOME/base +more $BASE/kustomize.yaml +``` + +Run `kustomize` on the base to emit customized resources +to `stdout`: + + +``` +kustomize build $BASE +``` + +## Customize the base + +A first customization step could be to change the _app +label_ applied to all resources: + + +``` +sed -i 's/app: hello/app: my-hello/' \ + $BASE/kustomize.yaml +``` + +See the effect: + +``` +kustomize build $BASE | grep -C 3 app: +``` + +## Create Overlays + +Create a _staging_ and _production_ [overlay]: + + * _Staging_ enables a risky feature not enabled in production. + * _Production_ has a higher replica count. + * Web server greetings from these cluster + [instances] will differ from each other. + + +``` +OVERLAYS=$DEMO_HOME/overlays +mkdir -p $OVERLAYS/staging +mkdir -p $OVERLAYS/production +``` + +#### Staging Manifest + +In the `staging` directory, make a manifest +defining a new name prefix, and some different labels. + + +``` +cat <<'EOF' >$OVERLAYS/staging/kustomize.yaml +apiVersion: manifest.k8s.io/v1alpha1 +kind: Package +metadata: + name: makes-staging-hello +namePrefix: staging- +objectLabels: + instance: staging + org: acmeCorporation +objectAnnotations: + note: Hello, I am staging! +bases: +- ../../base +patches: +- map.yaml +EOF +``` + +#### Staging Patch + +Add a configMap customization to change the server +greeting from _Good Morning!_ to _Have a pineapple!_ + +Also, enable the _risky_ flag. + + +``` +cat <$OVERLAYS/staging/map.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: the-map +data: + altGreeting: "Have a pineapple!" + enableRisky: "true" +EOF +``` + +#### Production Manifest + +In the production directory, make a manifest +with a different name prefix and labels. + + +``` +cat <$OVERLAYS/production/kustomize.yaml +apiVersion: manifest.k8s.io/v1alpha1 +kind: Package +metadata: + name: makes-production-tuthello +namePrefix: production- +objectLabels: + instance: production + org: acmeCorporation +objectAnnotations: + note: Hello, I am production! +bases: +- ../../base +patches: +- deployment.yaml +EOF +``` + + +#### Production Patch + +Make a production patch that increases the replica +count (because production takes more traffic). + + +``` +cat <$OVERLAYS/production/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: the-deployment +spec: + replicas: 10 +EOF +``` + +## Compare overlays + + +`DEMO_HOME` now contains: + + - a _base_ directory - a slightly customized clone + of the original configuration, and + + - an _overlays_ directory, containing the manifests + and patches required to create distinct _staging_ + and _production_ instances in a cluster. + +Review the directory structure and differences: + + +``` +tree $DEMO_HOME +``` + +Expecting something like: + +> ``` +> /tmp/tmp.IyYQQlHaJP1 +> ├── base +> │   ├── configMap.yaml +> │   ├── deployment.yaml +> │   ├── kustomize.yaml +> │   ├── LICENSE +> │   ├── README.md +> │   └── service.yaml +> └── overlays +> ├── production +> │   ├── deployment.yaml +> │   └── kustomize.yaml +> └── staging +> ├── kustomize.yaml +> └── map.yaml +> ``` + +Compare the output directly +to see how _staging_ and _production_ differ: + + +``` +diff \ + <(kustomize build $OVERLAYS/staging) \ + <(kustomize build $OVERLAYS/production) |\ + more +``` + +The first part of the difference output should look +something like + +> ```diff +> < altGreeting: Have a pineapple! +> < enableRisky: "true" +> --- +> > altGreeting: Good Morning! +> > enableRisky: "false" +> 8c8 +> < note: Hello, I am staging! +> --- +> > note: Hello, I am production! +> 11c11 +> < instance: staging +> --- +> > instance: production +> 13c13 +> (...truncated) +> ``` + + +## Deploy + +The individual resource sets are: + + +``` +kustomize build $OVERLAYS/staging +``` + + +``` +kustomize build $OVERLAYS/production +``` + +To deploy, pipe the above commands to kubectl apply: + +> ``` +> kustomize build $OVERLAYS/staging |\ +> kubectl apply -f - +> ``` + +> ``` +> kustomize build $OVERLAYS/production |\ +> kubectl apply -f - +> ``` + +## Rolling updates + +### Review + +The _hello-world_ deployment running in this cluster is +configured with data from a configMap. + +The deployment refers to this map by name: + + + +``` +grep -C 2 configMapKeyRef $DEMO_HOME/base/deployment.yaml +``` + +Changing the data held by a live configMap in a cluster +is considered bad practice. Deployments have no means +to know that the configMaps they refer to have +changed, so such updates have no effect. + +The recommended way to change a deployment's +configuration is to + + 1. create a new configMap with a new name, + 1. patch the _deployment_, modifying the name value of + the appropriate `configMapKeyRef` field. + +This latter change initiates rolling update to the pods +in the deployment. The older configMap, when no longer +referenced by any other resource, is eventually garbage +collected. + +### How this works with kustomize + +[patch]: ../docs/glossary.md#patch + +The _staging_ instance here has a configMap [patch]: + + +``` +cat $OVERLAYS/staging/map.yaml +``` + +This patch is by definition a named but not necessarily +complete resource spec intended to modify a complete +resource spec. + +The resource it modifies is here: + + +``` +cat $DEMO_HOME/base/configMap.yaml +``` + +For a patch to work, the names in the `metadata/name` +fields must match. + +However, the name values specified in the file are +_not_ what gets used in the cluster. By design, +kustomize modifies these names. To see the names +ultimately used in the cluster, just run kustomize: + + +``` +kustomize build $OVERLAYS/staging |\ + grep -B 8 -A 1 staging-the-map +``` + +The configMap name is prefixed by _staging-_, per the +`namePrefix` field in +`$OVERLAYS/staging/kustomize.yaml`. + +The suffix to the configMap name is generated from a +hash of the maps content - in this case the name suffix +is _hhhhkfmgmk_: + + +``` +kustomize build $OVERLAYS/staging | grep hhhhkfmgmk +``` + +Now modify the map patch, to change the greeting +the server will use: + + +``` +sed -i 's/pineapple/kiwi/' $OVERLAYS/staging/map.yaml +``` + +Run kustomize again to see the new names: + + +``` +kustomize build $OVERLAYS/staging |\ + grep -B 8 -A 1 staging-the-map +``` + +Confirm that the change in configMap content resulted +in three new names ending in _khk45ktkd9_ - one in the +configMap name itself, and two in the deployment that +uses the map: + + +``` +test 3 == $(kustomize build $OVERLAYS/staging | grep khk45ktkd9 | wc -l) +``` + +Applying these resources to the cluster will result in +a rolling update of the deployments pods, retargetting +them from the _hhhhkfmgmk_ maps to the _khk45ktkd9_ +maps. The system will later garbage collect the +unused maps. + +## Rollback + +To rollback, one would undo whatever edits were made to +the configuation in source control, then rerun kustomize +on the reverted configuration and apply it to the +cluster. diff --git a/demos/mySql.md b/demos/mySql.md new file mode 100644 index 0000000000..e7faee9d20 --- /dev/null +++ b/demos/mySql.md @@ -0,0 +1,239 @@ +# Demo: MySql + +This example takes some off-the-shelf k8s resources +designed for MySQL, and customizes them to suit a +production scenario. + +In the production environment we want: + +- MySQL resource names to be prefixed by 'prod-'. +- MySQL resources to have 'env: prod' labels. +- MySQL to use persistent disk for storing data. + +### Download resources + +Download `deployment.yaml`, `service.yaml` and +`secret.yaml`. These are plain k8s resources files one +could add to a k8s cluster to run MySql. + + +``` +DEMO_HOME=$(mktemp -d) +cd $DEMO_HOME + +# Get MySQL configs +for f in service secret deployment ; do \ + wget https://raw.githubusercontent.com/kinflate/mysql/master/emptyDir/$f.yaml ; \ +done +``` + +### Initialize a manifest + +A _manifest_ groups these resources together. + +Create one: + + +``` +cd $DEMO_HOME +kustomize init +``` + +You should now have a file called `kustomize.yaml`: + + +``` +cat $DEMO_HOME/kustomize.yaml +``` + +containing something like: + + +> ``` +> apiVersion: manifest.k8s.io/v1alpha1 +> kind: Manifest +> metadata: +> name: helloworld +> # description: helloworld does useful stuff. +> namePrefix: some-prefix +> # Labels to add to all objects and selectors. +> # These labels would also be used to form the selector for apply --prune +> # Named differently than “labels” to avoid confusion with metadata for this object +> objectLabels: +> app: helloworld +> objectAnnotations: +> note: This is a example annotation +> resources: +> - deployment.yaml +> - service.yaml +> # There could also be configmaps in Base, which would make these overlays +> configmaps: [] +> # There could be secrets in Base, if just using a fork/rebase workflow +> secrets: [] +> recursive: true +> ``` + + +### Add the resources to the manifest + + +``` +cd $DEMO_HOME + +kustomize edit add resource secret.yaml +kustomize edit add resource service.yaml +kustomize edit add resource deployment.yaml + +cat kustomize.yaml +``` + +`kustomize.yaml`'s resources section should contain: + +> ``` +> apiVersion: manifest.k8s.io/v1alpha1 +> .... +> resources: +> - secret.yaml +> - service.yaml +> - deployment.yaml +> ``` + +### Name Customization + +Arrange for the MySQL resources to begin with prefix +_prod-_ (since they are meant for the _production_ +environment): + + +``` +cd $DEMO_HOME + +kustomize edit set nameprefix 'prod-' + +cat kustomize.yaml +``` + +`kustomize.yaml` should have updated value of namePrefix field: + +> ``` +> apiVersion: manifest.k8s.io/v1alpha1 +> .... +> namePrefix: prod- +> objectAnnotations: +> note: This is a example annotation +> ``` + +This `namePrefix` directive adds _prod-_ to all +resource names. + + +``` +kustomize build $DEMO_HOME +``` + +The output should contain: +> ``` +> apiVersion: v1 +> data: +> password: YWRtaW4= +> kind: Secret +> metadata: +> .... +> name: prod-mysql-pass-d2gtcm2t2k +> --- +> apiVersion: v1 +> kind: Service +> metadata: +> .... +> name: prod-mysql +> spec: +> .... +> --- +> apiVersion: apps/v1beta2 +> kind: Deployment +> metadata: +> .... +> name: prod-mysql +> spec: +> selector: +> .... +> ``` + +### Label Customization + +We want resources in production environment to have +certain labels so that we can query them by label +selector. + +`kustomize` does not have `set label` command to add +label, but we can edit `kustomize.yaml` file under +`prod` directory and add the production labels under +`objectLabels` fields as highlighted below. + + +``` +sed -i 's/app: helloworld/app: prod/' \ + $DEMO_HOME/kustomize.yaml +``` + +At this point, running `kustomize build` will +generate MySQL configs with name-prefix 'prod-' and +labels `env:prod`. + +### Storage customization + +Off the shelf MySQL uses `emptyDir` type volume, which +gets wiped away if the MySQL Pod is recreated, and that +is certainly not desirable for production +environment. So we want to use Persistent Disk in +production. kustomize lets you apply `patches` to the +resources. + + +``` +cat <<'EOF' > $DEMO_HOME/persistent-disk.yaml +apiVersion: apps/v1beta2 # for versions before 1.9.0 use apps/v1beta2 +kind: Deployment +metadata: + name: mysql +spec: + template: + spec: + volumes: + - name: mysql-persistent-storage + emptyDir: null + gcePersistentDisk: + pdName: mysql-persistent-storage +EOF +``` + +Specify the patch file in the manifest: + + +``` +cat <<'EOF' >> $DEMO_HOME/kustomize.yaml +patches: +- persistent-disk.yaml +EOF +``` + +Lets break this down: + +- In the first step, we created a YAML file named + `persistent-disk.yaml` to patch the resource defined + in deployment.yaml + +- Then we added `persistent-disk.yaml` to list of + `patches` in `kustomize.yaml`. `kustomize build` + will apply this patch to the deployment resource with + the name `mysql` as defined in the patch. + + +The output of the following command can now be applied +to the cluster (i.e. piped to `kubectl apply`) to +create the production environment. + + +``` +kustomize build $DEMO_HOME # | kubectl apply -f - +``` diff --git a/demos/springboot.md b/demos/springboot.md new file mode 100644 index 0000000000..a71e3e584b --- /dev/null +++ b/demos/springboot.md @@ -0,0 +1,350 @@ +# Demo: SpringBoot + +In this tutorial, you will learn - how to use `kustomize` to customize a basic Spring Boot application's +k8s configuration for production use cases. + +In the production environment we want to customize the following: + +- add application specific configuration for this Spring Boot application +- configure prod DB access configuration +- resource names to be prefixed by 'prod-'. +- resources to have 'env: prod' labels. +- JVM memory to be properly set. +- health check and readiness check. + +### Download resources + +Download `deployment.yaml`, `service.yaml`. These are plain k8s resources files one +could add to a k8s cluster to run sbdemo. + + +``` +DEMO_HOME=$(mktemp -d) +cd $DEMO_HOME + +# Get SpringBoot configs +for f in service deployment; do \ + wget https://raw.githubusercontent.com/kinflate/example-springboot/master/$f.yaml ; \ +done +``` + +### Initialize a manifest + +A _manifest_ groups these resources together. + +Create one: + + +``` +cd $DEMO_HOME +kustomize init +``` + +The above step will create a `kustomize` configuration file called `kustomize.yaml` in current directory. + + +``` +cat $DEMO_HOME/kustomize.yaml +``` + +containing something like: + + +> ``` +> apiVersion: manifest.k8s.io/v1alpha1 +> kind: Manifest +> metadata: +> name: helloworld +> # description: helloworld does useful stuff. +> namePrefix: some-prefix +> # Labels to add to all objects and selectors. +> # These labels would also be used to form the selector for apply --prune +> # Named differently than “labels” to avoid confusion with metadata for this object +> objectLabels: +> app: helloworld +> objectAnnotations: +> note: This is a example annotation +> resources: +> - deployment.yaml +> - service.yaml +> # There could also be configmaps in Base, which would make these overlays +> configMapGenerator: [] +> # There could be secrets in Base, if just using a fork/rebase workflow +> secretGenerator: [] +> ``` + + +### Add the resources to the manifest + + +``` +cd $DEMO_HOME + +kustomize edit add resource service.yaml +kustomize edit add resource deployment.yaml + +cat kustomize.yaml +``` + +`kustomize.yaml`'s resources section should contain: + +> ``` +> apiVersion: manifest.k8s.io/v1alpha1 +> .... +> resources: +> - service.yaml +> - deployment.yaml +> ``` + +### Add configmap to the manifest + +``` +cd $DEMO_HOME +wget https://raw.githubusercontent.com/kinflate/example-springboot/master/application.properties +kustomize edit add configmap demo-configmap --from-file application.properties + +cat kustomize.yaml +``` +`kustomize.yaml`'s configMapGenerator section should contain: +> ``` +> configMapGenerator: +> - files: +> - application.properties +> name: demo-configmap +> kind: Manifest +> ``` + +### Customize configmap +We want to add database credentials for the prod environment. In general, these credentials can be put into the file `application.properties`. +However, for some cases, we want to keep the credentials in a different file and keep application specific configs in `application.properties`. + With this clear separation, the credentials and application specific things can be managed and maintained flexibly by different teams. +For example, application developers only tune the application configs in `application.properties` and operation teams or SREs +only care about the credentials. + +For Spring Boot application, we can set an active profile through the environment variable `spring.profiles.active`. Then +the application will pick up an extra `application-.properties` file. With this, we can customize the configmap in two +steps. Add an environment variable through the patch and add a file to the configmap. + +``` +cat <$DEMO_HOME/patch.yaml +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: sbdemo +spec: + template: + spec: + containers: + - name: sbdemo + env: + - name: spring.profiles.active + value: prod +EOF + +cat <>$DEMO_HOME/kustomize.yaml +patches: +- patch.yaml +EOF + +cat <$DEMO_HOME/application-prod.properties +spring.jpa.hibernate.ddl-auto=update +spring.datasource.url=jdbc:mysql://:3306/db_example +spring.datasource.username=root +spring.datasource.password=admin +EOF + +kustomize edit add configmap demo-configmap --from-file application-prod.properties + +cat kustomize.yaml +``` +`kustomize.yaml`'s configMapGenerator section should contain: +> ``` +> configMapGenerator: +> - files: +> - application.properties +> - application-prod.properties +> name: demo-configmap +> kind: Manifest +> ``` + +### Name Customization + +Arrange for the resources to begin with prefix +_prod-_ (since they are meant for the _production_ +environment): + + +``` +cd $DEMO_HOME + +kustomize edit set nameprefix 'prod-' + +cat kustomize.yaml +``` + +`kustomize.yaml` should have updated value of namePrefix field: + +> ``` +> apiVersion: manifest.k8s.io/v1alpha1 +> .... +> namePrefix: prod- +> objectAnnotations: +> note: This is a example annotation +> ``` + +This `namePrefix` directive adds _prod-_ to all +resource names. + + +``` +kustomize build $DEMO_HOME +``` + +The output should contain: +> ``` +> apiVersion: v1 +> data: +> .... +> kind: ConfigMap +> metadata: +> .... +> name: prod-demo-configmap-7746248cmc +> --- +> apiVersion: v1 +> kind: Service +> metadata: +> .... +> name: prod-sbdemo +> spec: +> .... +> --- +> apiVersion: apps/v1beta2 +> kind: Deployment +> metadata: +> .... +> name: prod-sbdemo +> spec: +> selector: +> .... +> ``` + +### Label Customization + +We want resources in production environment to have +certain labels so that we can query them by label +selector. + +`kustomize` does not have `edit set label` command to add +label, but we can edit `kustomize.yaml` file under +`prod` directory and add the production labels under +`objectLabels` fields as highlighted below. + + +``` +sed -i 's/app: helloworld/app: prod/' \ + $DEMO_HOME/kustomize.yaml +``` + +At this point, running `kustomize build` will +generate MySQL configs with name-prefix 'prod-' and +labels `env:prod`. + + +### Download Patch for JVM memory +When a Spring Boot application is deployed in a k8s cluster, the JVM is running inside a container. We want to set memory limit for the container and make sure +the JVM is aware of that limit. In K8s deployment, we can set the resource limits for containers and inject these limits to +some environment variables by downward API. When the container starts to run, it can pick up the environment variables and +set JVM options accordingly. + +Download the patch `memorylimit_patch.yaml`. It contains the memory limits setup. + +``` +cd $DEMO_HOME +wget https://raw.githubusercontent.com/kinflate/example-springboot-instances/master/production/memorylimit_patch.yaml + +cat memorylimit_patch.yaml +``` +The output contains +> ``` +> apiVersion: apps/v1beta2 +> kind: Deployment +> metadata: +> name: sbdemo +> spec: +> template: +> spec: +> containers: +> - name: sbdemo +> resources: +> limits: +> memory: 1250Mi +> requests: +> memory: 1250Mi +> env: +> - name: MEM_TOTAL_MB +> valueFrom: +> resourceFieldRef: +> resource: limits.memory +> ``` + +### Download Patch for health check +We also want to add liveness check and readiness check in the production environment. Spring Boot application +has end points such as `/actuator/health` for this. We can customize the k8s deployment resource to talk to Spring Boot end point. + +Download the patch `healthcheck_patch.yaml`. It contains the liveness probes and readyness probes. + +``` +cd $DEMO_HOME +wget https://raw.githubusercontent.com/kinflate/example-springboot-instances/master/production/healthcheck_patch.yaml + +cat healthcheck_patch.yaml +``` +The output contains +> ``` +> apiVersion: apps/v1beta2 +> kind: Deployment +> metadata: +> name: sbdemo +> spec: +> template: +> spec: +> containers: +> - name: sbdemo +> livenessProbe: +> httpGet: +> path: /actuator/health +> port: 8080 +> initialDelaySeconds: 10 +> periodSeconds: 3 +> readinessProbe: +> initialDelaySeconds: 20 +> periodSeconds: 10 +> httpGet: +> path: /actuator/info +> port: 8080 +> ``` + +### Add patch to Manifest +Currently `kustomize` doesn't provide a command to add a file as a patch, but we can edit the file `kustomize.yaml` to +include this patch. + +``` +mv $DEMO_HOME/kustomize.yaml $DEMO_HOME/tmp.yaml +sed '/patches:$/{N;s/- patch.yaml/- patch.yaml\n- memorylimit_patch.yaml\n- healthcheck_patch.yaml/}' $DEMO_HOME/tmp.yaml >& $DEMO_HOME/kustomize.yaml +``` +`kustomize.yaml` should have patches field: +> ``` +> patches +> - patch.yaml +> - memorylimit_patch.yaml +> - healthcheck_patch.yaml +> ``` + +The output of the following command can now be applied +to the cluster (i.e. piped to `kubectl apply`) to +create the production environment. + + +``` +kustomize build $DEMO_HOME # | kubectl apply -f - +``` diff --git a/demos/tree1.png b/demos/tree1.png new file mode 100644 index 0000000000000000000000000000000000000000..a92235187c79e6fa3bb74842d5e15483b29e9333 GIT binary patch literal 8738 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 literal 0 HcmV?d00001 diff --git a/docs/Kube-manifest.yaml b/docs/Kube-manifest.yaml new file mode 100644 index 0000000000..98e59dfb85 --- /dev/null +++ b/docs/Kube-manifest.yaml @@ -0,0 +1,22 @@ +# This is a generated example; do not edit. Rebuild with 'make docs'. + +apiVersion: manifest.k8s.io/v1alpha1 +kind: Manifest +metadata: + name: helloworld +description: helloworld does useful stuff. +namePrefix: some-prefix +# Labels to add to all objects and selectors. +# These labels would also be used to form the selector for apply --prune +# Named differently than “labels” to avoid confusion with metadata for this object +objectLabels: + app: helloworld +objectAnnotations: + note: This is an example annotation +resources: [] +#- service.yaml +#- ../some-dir/ +# There could also be configmaps in Base, which would make these overlays +configMapGenerator: [] +# There could be secrets in Base, if just using a fork/rebase workflow +secretGenerator: [] diff --git a/docs/base.jpg b/docs/base.jpg new file mode 100644 index 0000000000000000000000000000000000000000..806d8478c959fcaa43fe27cdfb711bed1ee4cc23 GIT binary patch literal 41948 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 E.g., a _staging_ and _production_ overlay both modify some +> common base to create distinct instances. +> +> The _staging_ instance is the set of resources +> exposed to quality assurance testing, or to some +> external users who'd like to see what the next +> version of production will look like. +> +> The _production_ instance is the set of resources +> exposed to production traffic, and thus may employ +> deployments with a large number of replicas and higher +> cpu and memory requests. + + +## kustomize + +_kustomize_ is a command line tool supporting template-free +customization of declarative configuration targetted to +k8s. + +_Targetted to k8s means_ that kustomize may need some +limited understanding of API resources, k8s concepts +like names, labels, namespaces, etc. and the semantics +of resource patching. + +kustomize is an implementation of [DAM]. + +## manifest + +A _manifest_ is a file called `kustomize.yaml` that +describes a configuration consumable by [kustomize]. + +Here's an [example](Kube-manifest.yaml). + +A manifest contains fields falling into these categories: + + * Immediate customization instructions - + _nameprefix_, _labelprefix_, etc. + * Resource _generators_ for configmaps and secrets. + * References to _external files_ in these categories: + * [resources] - completely specified k8s API objects, + e.g. `deployment.yaml`, `configmap.yaml`, etc. + * [patches] - _partial_ resources that modify full + resources defined in a [base] + (only meaningful in an [overlay]). + * [bases] - path to a directory containing + a [manifest] (only meaningful in an [overlay]). + * (_TBD_) Standard k8s API kind-version fields. + +## off-the-shelf configuration + +An _off-the-shelf_ configuration is a manifest and +resources intentionally published somewhere for others +to use. + +E.g. one might create a github repository like this: + +> ``` +> github.com/username/someapp/ +> kustomize.yaml +> deployment.yaml +> configmap.yaml +> README.md +> ``` + +Someone could then _fork_ this repo (on github) and +_clone_ their fork to their local disk for +customization. + +This clone could act as a [base] for the user's +own [overlays] to do further customization. + +## overlay + +An _overlay_ is a [target] that modifies (and thus +depends on) another target. + +The [manifest] in an overlay refers to (via file path, +URI or other method) to _some other manifest_, known as +its [base]. + +An overlay is unusable without its base. + +An overlay supports the typical notion of a +_development_, _QA_, _staging_ and _production_ +environment instances. + +The configuration of these environments is specified in +individual overlays (one per environment) that all +refer to a common base that holds common configuration. +One configures the cluser like this: + +> ``` +> kustomize inflate someapp/overlays/staging |\ +> kubectl apply -f - +> +> kustomize inflate someapp/overlays/production |\ +> kubectl apply -f - +> ``` + +Usage of the base is implicit (the overlay's manifest +points to the base). + +An overlay may act as a base to another overlay. + +## package + +The word _package_ has no meaning in kustomize, as +kustomize is not to be confused with a package +management tool in the tradition of, say, [apt] or +[rpm]. + +## patch + +A _patch_ is a partially defined k8s resource with a +name that must match a resource already known per +traversal rules built into [kustomize]. + +_Patch_ is a field in the manifest, distinct from +resources, because a patch file looks like a resource +file, but has different semantics. A patch depends on +(modifies) a resource, whereas a resourse has no +dependencies. Since any resource file can be used as a +patch, one cannot reliably distinguish a resource from +a patch just by looking at the file's [YAML]. + +## resource + +A _resource_ is a path to a [YAML] or [JSON] file that +completely defines a functional k8s API object. + +## sub-target / sub-application / sub-package + +A _sub-whatever_ is not a thing. There are only [bases] and [overlays]. + +## target + +The _target_ is the argument to `build`, e.g.: + +> ``` +> kustomize build $target +> ``` + +`$target` must be a path to a directory that +immediately contains a file called +`kustomize.yaml` (i.e. a [manifest]). + +The target contains, or refers to, all the information +needed to create customized resources to send to the +[apply] operation. + +A target is a [base] or an [overlay]. diff --git a/docs/overlay.jpg b/docs/overlay.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8742c6406ed655109e16afc4d0a9afd9aaf6663 GIT binary patch literal 50739 zcmeFZ1yo$!wkBFg0t5>hTnl%1cL)$5xVxorCrBU=++Blf;qLD4?ykYTX#R8V?e25l zc(42RxP3>z(RbIFwQG!8d)4~(UN*mP&U#&V-2i-)m6VYLKtTflP;W25>oPzL0RR3y z-1~R%aBy%42=E_}Fp-fE5s`4wF;FoH@ra2C@dyY=fQ(cmWc1_&1k_wK^vo>m?Ciu; zJObRT{ETeutbbJkg@Ay7gouQLjEuudNg1TY;iP-FmTG$o7 zJ%*AY9GN{P>yPLxcyiIoPAuigKR`Ak2S0=l*q?B4@hB*%sA*`~IXJnvd3eRdB_yS! zWn@*ps;a4LXlfaon3|beSXwzcIlH*JxqJBk3<&%c6dV#08yBCDn3SB7os*lFUr<<7 zTvc6DTUX!E*woeC)7#fSFgP?dJu^Euzp%KpxwXBsySIOEcyw`jb$xStcmMGC7cM9O z%->)LR%Isw zIh*nyEF*`>57qfwamPAtC*xxkV*P4UH>090`Iij|BTh<3!61h?@Iqt$1xDh#RvfmW`h?j zU7J#Q7q$6MaaKBcf2dLevcazaGrc!^1z5Z!L;BO(T>tEIL!3_eq-QwHX^buDcfBu^ zIv!&?et-C?mXWi$sxKQl+FF@F{b;)x=OsOWr99NP|D_T8HmYX&qqM~F4`Hk$vzkV2 z)h28AfMx>vJd`dksKW(_YL@M0xYf~YnZb0vTU?ZMKljFlvrvGO>-wei_4?z3&?7+{ zRJW4aH>cxKSzF4XCC!~9QAYclYcNj>;T8@Vt6(C{7giT6;|FMYfZ?Rtw-d%%#LQ|f z;mc7!7bZR488$JBmP;{K%mhx_BM(2`5P&I`&HCrors|Y4L|0EYp*d+@CJ&A4)CZ^i z8S>g_@W;(OLb!)ffJ%1A+im#Ez!C*|ilz)ZYG=0>%<54nP~06a5*DcN$9v1C#EXt6 zefE9lPy0MCv~j>&Nrw^zAw;N+c7CkJi2 zY;fQ8ZE6bAv|bSW6f1oQwgr~{=^OZM-;cBJyAIZ`mL(YJKW0>YiDNKrYkF=)u?m^1 z{L@!kBurI1z3Uc9I)+J{FFmT#HeJp>_?)_INfLDl6K3K`bdwqu(<~)h0>`LI;Q+?6 z>Q`u)DY*Ow&dpHBCEJHtxhMlShmJ<^RED3hifGXkp?Agk3e7g?>q%ZT|14>#)qiPuIUeS%H7>5eFYyA#=11g1qe33z94k4uSyBeI>n)SnbJ!u zaQ#siQi@iLQELr2ExK~JqPuNOm2g={sR?YD&3N1zk+F(qj*$BDRT|gBbDLwtY6*0f z>Y{eJy2*+@fZs5#Ws|C;%oah$T71Ybe{+vX4YnpmI@XFKvz8ZB54v^?fIE=EEp~kb zoh35|-Y!WKg!yilPu%5h1Is3h|Nb0!7#IzIP$jH=4ODC-C;hN4ww6_Pr(2hC-mymL zw?>tqPC`qzlNmS9;kv2oFto6uSRh+TJPn{hC_>Z=0#gA)pn?lHzDS9bu;`8t(877;-9b>4C0-jKsdT1At zIYf=N=I+i6v*78VbSk5Jh7NMUn}V%WneQ^2qjVb6QDcT-xs!dY!yV&9J;dW2;Tx;a zw^u#b^-Q)vm$@kfJt^h)>QV1K(zbk=x+d>cwp1jD2QBG-l2=FpB0D&RX!|boqHc+3 z8)^d(G*@Ik{Fvc65F&`|O5S=AWsvLrl=zX^!XH)=&c6mK`rcpnHq{n2*l5D}FxhpH zj-k)9DgxmVt@+|Nifi9llS_K;z0J!0K$r}pP;ey7&5942cFI{M*wTX|B6@S#UEGk( zo*($$?C}PdM=0L?thQLNsBGm3SBO9P^Q}@>8X#?Te>{#z$Bmb z?K7k4!1BswgyVGyw00~0=4^bQKk>O4X&I&XN;l8oGb+(+>Zb7)gSmcPLvv$`H8=71 zaJr9aP5>uh+Lw2_9w!z)=w{6UE~P5Ku#y#48lQ2htDG(DjJn4o{citv*G3YC6BQef zRK;!8?;h|M=??-uCO+%6Wr<>Sk-cje6?IAeoas&>4@XAVuYfiMp$&GZ%+gmtkN@UN zV1l4_=cS7Ik^1Cxo=$@cRR%k_6x{^Z4Y?2-0bU&*6CH zFW(EU$`UCX(IK_`wX*29XR_xIsEPY!y|(K4yy;R#qA_^85r(m@vu=AMDJrmH$*N4r zcb4kbW?R-ho{K%S!A?_%#&Zd3zt1Jl5%KN#D?kElE%OQh#t=U~yaEOUL@3xlk(~hOa z&+XqZS-`C#I$4@}A2Q0BEM+An*|WRZ_3KMIYbBr%MwevP*EQh4>KzV6 z*@~o+^;cd2R+!fGgF8xVp+;YDOVxYp%(TWZJJo(aj+>ARu z7pME6(&R<2tC4#o%Nf&FbO2GjWckiiII_kX01nj_akfwN<07>m{NN=#O2pOP9NXhM zXY0(S4Gd96-ziSd`F*$oadyOxdj6_f^PvJU55OecgWL^y9Q}GR8n7Zr(c0u`DNz&A zY)0)u9A}@Aya7=~Z_1xft|6cZ4g*{F-#m{QHR%$6{xdq3O3;*0&QLo^_;a0sHBHhuOA*n>DJb6Q?l`WWc)Zl0>pd({{UmfN zm_@PovSxD;-q6Q~(kK+KHS3(p*A92c>!i@Pw-_9SMS{}$3c%Yt)~Z$%PZW!U`<2EK zmvOF`@$|i`6{8z3ddi#7>eEp1l$70?hGBHWPXGjVujQ;2uG`~VQ++o`a*W8-({F%n zrcknfJ4{LRd2D$xKFQ&U`|5P0%n@6VcJ}0kqs97g@1YuKvr`hWO(@h=$M0zjGTq|y zoDF5xB}ouhskevQdo(e=C}j}pZc2ybCdiqya-K+!{ede#2DJYBu?jEowm}Q4JzCu5Z4tPyFHzTKq)HEeHYoH3OcBBy`5wEtt#i$>3G%+ zvrIJGo~vc;^C!d_`|)vLG6|=1pWEdLoU!vqbeki6TfkVqViwYGytk}TO#QQyi0fjU z`^2r|x?~Nvau%aIrFX9ID%mEBj3YhRD@!|#NYd3izQ!kLy4mMPulmaxt1OMBO}Y2W zQ!+8qSs6;TKvssB4MTE|cErSTlsQptVlEIucHsrC%d%(au_i~Sa9F3^tsFNFQ#}tf zK}BCNxvBZ)vu^qIT1@EIvpI+}2exjqrYs;&^tXTf096IhQBz7o^yzJw)LN~yf1<5l z8GP2?0!hldY)#D_X2_YXM)0G7z!}zj=H(rY zr-CJxykR`8?bO`bD`0M4s?hoqo=|ry#VHO&&p>4`%McQ}^xejX;XjP+MdMrCCug>l z4S~+zOULwKp&i(!3y$Ts^dG1o#Lq(47@8T-Z*y7S@F5k%ch*Mvwo?7X81IXlR+Y8B z=MAGp6GQEOk6ejVxIDOKYH&BY^TPtnVGQjnAc*`TA*+&HO)9#1aq*9nTGBs&K<#HU{F?b%TtVcZ8@ALJFNpWO{HG6Fg>@MxLVxn_Ty?R&~G938Y z&CSZWtiz;Ek7xT>eG13)m(tNelSx&-`KhV$JmCCm+tF8#CYN+es~0yO%Guo(SYA$? z$GCaQgnBGN#6jg#Bh*q3Eimm^Ce+SiPBPwIyq}WP1K1xn#gV1eE;tu(cXBjadYzIX@DmqNhe+>KXDnW& zCKbE~_Un!=6&*EUtwlx2(21~P`0vWwQeJ;^2F#_Q4F6f$75j*<{6(s80reWoW-?n5 z@!qR|d{9@NDI?W^P0K;zbZK9xuH=);S=rp0I$O>k@7!U$L58$X=)RN7@^;v25Y6tOPtKzk~S{FejK@D+4eH8z5==ozeiNzW_<4f@Q}Q$c;l4S$#C8e zs~U8lBIMMk48H;dpvzwYS}6tCr;D-l5*nSdhpYP2w%sa`nO%=zyaBCY-V(h%8&MUq zIE=h!0+kZ;flMGUMPrC3U(K)NfYL27oEt+eZ#Wj>)1MX@np%T({rDhPo#)OsXFpS< zZ93*?^Sbr@;f}WJRsCvsHos$ zL5{pM^fd8#NBHOQJ1?u2CZZga(iCHD3};e&%#ULJ6aLdgH?#K%USur!0&}U3_86Ly zBr$y9!8IsJ{YozqoYr8mC++Tj`6(^j%^%?{j$@@$JyK#55nRq-U2d=dipG{z?I?)w zu4;Mz?!aJtQ+oltpFkH%mjj)U!e{M!jzcIzG^;N^Vaq}1+N9>UHj6UX&=@6|d_C@{ zi~N(9v(;Ik_2;K1!E9rP?~Se!{a;o)ZZ}j34cP99h25Yy52ooG4uA}OUKeS~b`dWh z!ac$Z1@OJpmbli&K}cXJvDRte&(Gv;`>z01b_F6H!7y6H7tU?@nT)Ot>U4Nmnt?$; zgb&^U`G`I$7&0B*u7Yga{FLQRzRdG%*+y5NqE9@IE;({Jh}{9V_Mo0eBcgRYe8HIR z&T~0jz_l^|kX*6}mbtM`XCaqtt_vGD0M8f@2`G|f3I*KYI3s%EJcot`caj>!ajrP8 zcp5eJxkUCu$enQsO7uGOxFv3lbtf5^#W zwRX6Mq2xwdt)?7*fz1B7n087CbTc%zCAcbKuZ*6!CJ$e=qJwt=d7N2$B6_Y8D_N{$ zGAd8n&v4lZG+^nCaaE#XC=V%GThEuQ>((6lbZix7hwKY{{I68tzfyw#_A`u_+&l*Z z?qVrp2I0E98}0fRx00q`VH~3hFzqZc;k_$K;daG&t#CMH!@{*Ke|&y9>ngu!A>^q> ztYMQ=GQPS;A-CdRI3=TgpJJkZwlb&k|ybXSK=Gd|lm0LB0?1r=B{v*!_U?A1I^A3+}S2C;=Ca2|mIx1~tFDOg0vm*Kqaz8s5n<6zn5@iO+_-ui#mE4xL9xm|VB!scV zV501Jua3V8Rok}2rJlGFeGS7R9^y8V6ow<%QDRK?dDo>qY-$(FJ=8b(aYP`HCnv?F zb~WJSfX7i&e@Di-RDbP=<>(W}c~e-CCMR{LN^}Pf2O%WOxmdS$_9S03383N2O~|XP zV>v$;iKnBvB6|4>DA6RR)jrIqWxAE0VZ%8)Jp(Ndxnr^;$JSs>Pe&+P>0Pblo#dE- zcMo^4Q(9lb<9pLMK_SWVc3DoK8OqWnL{rDnyGvd}y zT7|Va1}hscG2gSg%hy1&qS#Nv688mNw~A^T+7pHkcQ^)PQ_|YcrzxGod`&+Gd2xM` zpS5)g4Q!}L>!u?W?Gzc>A#gzbT^!b%R80`$VEIRcV`LZ!jlZgXRb06T0-f$`?r2IK zaOT`vsop-v&hPMqB&-qYQ_#M?q(kh||e55s8qQA<& z?0xhH%iGspAyd31Vhpj+FvZQp_w!jaVdbSH!ZX|bteeyDQ>a;E;Lw)zC!T0B3Q688 zwUyJMGgF)|iWxNeZT{D*Zz76x+Nhz!pK7~>PUIUnf2~A8?u&Obl$31?xdutmUo(4< zBD*T56DWWtw0;;qK-7}?>i>a;(!e97FSxttu?DGgnIinc#Ef2|V5n96&utvAHgznCcEo1J(O$MKHuDsc4fvzfcyr9Zy) zo_Qe&%v~ym1(m!HRueKF?=Y2=HB^(z&kQRwhInL`$G#3F5woa7k86P?K2@YBIt;Wo z>hhGr7My^oQj9yE7Wy3L^H6;pZqXKMa+f9d#3Nw>1r$7Ht!P$5V+6tr`L)ZmmvdRx z2@9K*QaH?%4sgOCwW8}Pt+g5MTMdTv2a`jmfsEjJo|~KEI2Fg(BiS5zy-BSH46Ri~ zQ-?(CsTLK|p(X+}E%i3)Ii}N$HP7}{8At`tDix9^JZd~CBa>&+Piq&e93%g`giHO7 zs|b2URu{C5CeHkRmJkk0D@2_pcXd=772T={R8d#g^wPoe<|Nt`EZcEE)7CtKU&gXI z5NvX-D@4%uVU6hg0p zgcK%ne16e`ciW~Y1%F7w=DaW+hwd8U@vQiZY1aZqrBvHy^EGX4@YIw7Z~)ZT06W_A zX9|zSYV39!TYAclWpy`w`GwWTISx$6VbAc%{3!+6;eiR>yz+7j=g*)9BE;1{c-6y1c2yM?jMJ^{c;bC;X(?U{7`)MbN*A}n(3PDx z@S_;}u$|8`RjzYit<_u~gJ3Ht^M3JzWYCxZ0syZ!JHp)+KSzG)LJRaZx;!JfZdsGec5lKrp|wO+Talg^Tx z{+VR~-a%#=KWV`+LK0!0Af(#T2V`tt&@;6lS~*JJP#?Xsm^3ixV)R~tn<&0-QnYwN z4)N1`Uc1m0FX)qUU43QMCoU*mCev?eu{aifzaHQ3|H)rWy1vhi*!~)#JfRB;;aUsP zB7<6;rnh4`9d&e4R>f6BN%c5?1;9OzWpPlWRKf^MJs{==p=kTAoA<3h9p98B7}{{S z*^;+N=ipf?R&#D_e}hE}^I8dCJRAqxJG(yVe|e%>^qzqzj586K+uk|O6Rpw|rw?S{ zD>`3S8Vhr7o!Q%SB_KEdRAEY}V(A|kT|mnmDz(1SmNCtjfLXQ)0IEl zS}3*t7303{1e-8K3(dV>1nVGgAE#PecVJ3S8)Nmx$+Yh|tEpp07HEeyhk8|Nw-{OM zTAY!NoyS^m+c_RiTv~Nmskzm(ge}l^n~>RZ>|9~~Tv8cEf-%{zd(v zvsWEW96%=ZG__X!`xRjN1=@#Ih<30Dm?4wE5k06eZ-g?$svyLwxUDn?T3JKeZFpPE zLjR8l^PoA!491h5Y|7a;M)O@b_Fs$tolGi|LZy)wRrWRDn+MVLhl7X^no9}bXKd+3 z1Sns_F#m}Ombib>LjJCasF7E;B^FleTJi*UvTV@>c z&V531v^L-2nOfi%LFPqip61Of;FI>@V+u!$)gF}Xry zt(mEfkz%b?EL!9}leM?WMT0h@MOsnSZNi!}b_mzs>{HfL7>B3#+>hclR>9hP^$Fne z_UEt{F2%s}&$Em`Mxr?^x2_BXdN`qUC%jTE_Q$+{+V!QDhf~nRFn*zigD+}aWa`W% zcj@@4JlV9u4Couf*_Atv?p4)ul7TS5<#>E5KT&(KjPaByzq*+VyHfH8)(kKY&}p+B zz05-t$M_Zed#_mb`<%<%y2Fdq(!EA6$XQ@CZ}&>VVQvsP6PIo_xx!9>yEvsjunb(b zp^eYCi0$@$6H)wg<&_@})WTiAy{L7C-jX7y1h^wGtdl#}^Ip=nh1rc{mTy&(sU~Y` z%369mOsaW=Z|6)i=*$a_K-mU+qLB9avHkM-6(G8s5N(Z;?B!Y_;Yv_f)t4cb>=$CDQ;8e>y;9JViU|(s}PO5jtkipowb$04om3IqEMRs%G+{xk^2m2b%j)oROOU*bjR-vr4RH^U(k;y#l5nO;|Sc zHN)vBo-YD6S)P{4Jm{|KDBv_SUuL&MUGz|0&ZnM3x^;P=QrThK1WXmS0$Y8V=c9ed z4(JBqJnL}}=nC0^jVhG?! zxrk~Q+`iEdLGTblmQ1*fv@bZSkJ0U`=AY}{4dNp4nr^Hd+)-h8rjM2@>ZfO0A2(+X z(_ZG5q!!^D6X8DWAUrC#txNPoPPO{7=6*X#PjzyZWv2SnI8L%17B<6d#cLAjU<0D8 zV`550ssmm1@P6Abe2%bac{i*#cKQlXoUgYXnVsC2206>Cu^?}X6v!@9bjjc>xE2i@ zANYvr^wuwGD+MV4wZ*7W1M&UL=LzjkwNJOK-JK2TCsqW?7qogR?aWL`o_8`39W^5A z9J(sCdhO=rc@P`?a8Xxrh8d!OKF?2EUAH0L?5tK0n61 z{mLyp-UU1@btGtkyGAf&yl@sVzjD&?(VwG!V@&X_7{D*rBqu{?5!qBY~nByF;l}#vD#yS@umJ77hJnOC-m1?P_ zTIMQx`rHQV(e2fub#01mI;KV0uV0s}FL->MV{qD-ADN%bjh1PYiXn9P9rk_gg^uV> zEoA?5#w59&NxSFo(a0usoX44My`R>PW;r{9Ra4YTiRAQ3cJ?yd*qfU9Z%+L)pj|oR z<8;)Gc4PlRyuX&KN17|1Kx<52=T<|4a(@Rz5 z@IR_fI#ELGOHYe3sM-h~5tFNOvY-msGP@BJR`_Q+!I~Sz2e^awo1OJXB@S~g3R9x? z9UW!YZ$cHeLi=^;uK<619|&XQ3I6!QX@Sp1-});cv~-BNR^j;U72x;jm-*c*po9Gt z@Sny1r|!&;EImK?Ohs5Ha^?D0z}7Kq2!l$~Q~O51=HkmM;19C;q;0OlxxK-NN5Twv zQ0V@J>*@U!#M5&9p5>p)FJHVxs9C-O4Ay+cL42=(_iq6j&$`45T$xwP3a^09@bI~OEQUUPgavix8;V(R)uDOmzj?I(t|w!ln2yIa(c7}NMK#z#Hg zsvsx6+k{Od`+~)xV9h-V)fEJlhBSli!rPnNsq)`dmLrpFxF2byv*aWlP=pPnNQ^JQ zmN#;QvdGGw0SWBUr=opjd1F1MR0Z_~_F9rG)+!mfN0M3$LL24xl%Td~QqSu~%^Bsi8^7TMtBER>skSpy*TAk?ThvZpz7XXSFWj-_4BKE! zdplz9tGc5(CVWs(R9O2p^&?v!U&L{jDq#{g4i}S+WK3FTXB&>gfx(S2)fUQfD`kx{ z9FHN%Kn^V}EV4z4u!Q&W?v%#rBP$L=4{*Pn-sjc|&v)yX%iJJSzM-y8W{-v1SqcRL(s=)$K&wYMh}9YJ_r9}Df+?INa?gR7Bv5|Vr)c~ zG;aSlbDV-#fVGy$OVVwn;@$$c^OXjcZKf-C_9Ti`ljST#!eyd-PQw_jpInYArcI}C zL+DNh&i|&6v1U0{h)J zC3!~)oixH2#=WZ8Nb&5_ox^HfyH0u_X0p$i)R;YSA#!INwDv7TINU7GN4 z^Oq+xE|=}y7ur*lJ)N6#Yae}g1!VTRbT3B|zS9mUHSwYJP8m}w7r}2PD79AoV(#q8 z90;dO6!M$o(vqyqGDgz;NGPk1(?&C;_C>ha4Xd6}F07kUNoBkd?ToZZtx7o@5#0?d z2=(S+@5qV4OwOoxRZYvPcV1hs0FyPZ$WuNHvvD@tq~=?5{JMSayIx?EX%CtdFdy@Z zGb)@F4k}QDF3neDoFj{~b>H$3`*15B)Z2(qZ(NA)&ONYQSXkyPO)>Q@Su;QC9sCuD z@*{5mi8*0~0<{&4GI-XRe3spky*E5%YfZv!5+V~-LEm_Q0Q9`((3h=|dr_O4k~Edc zg_pen%+%i{%vT6+@hI zyTo%ANYCsoOweMV=TfT}`W|f;PUd883dr~*puo%)mJ)L;9?keWa4|isA~|F%n=%O6 zv7HL$N7{ZC7SLmbO34r6>B>dM8DTC7LuE4??I5T|K>RuELLpH*LT*`8Y>lS=XaD}W z3f)d->p~cT@l^3dC5mcexlLw7`yV9tO>6fQN{fXup78FX^G*WQR>lr}dFpTR5ma79 zWOV45(Y`$<_G3J~G90G?V^#HRniVx2=u)`wW1<`NFo4)GK>i_DLLHYa|Ha5#Fkd#T z0k^3s&-h#(#psSDjr_EW)+bII5qVt#~xQmmj2}Xaq!&scl+hO zaV{Kk0;n5$;b*H6ynv8pDG>iBWWv^Nc?2mydZ&om_REifyZqH7I*#;iXu)YuhiL^s zhblpFWRZ~%lteb8Rd}uKF$DjDjxpKg9JT$895ex!`<>LAd(AA(prg!R(V;*zfF?r zy}R5%L&!3n!tl{1@Ami}YyESh9GmM?Vi1U7cO+~uBh{A&OJFV&1DSh~zOhB+XLKiN zeO#ZN0PX5pBZx6sAQyX_I4!ztvIb}>O@)KY)47vzE#_rNF&9Z7$L?bqul~KX*(Dhf z-HUfti;q%DKwG!$72w=H60+PqFYg0-HxwX~%YuO!va5r1%1s5gFe_7&T1XK9yp&2$ zkKE56NhD*X0AwZ8tQJTr?xOGH-`-+DOcbjlPdrurxey#i45!kT>W zZrI-3jtSp?2QB>XX*K_L4gLT1x_?~1;|q#?281Nu!cpHsQm2ATc%GGRUU2P~^fHV8 z1wxGznEwdjdoYF!uP_+B2trP8{hTz@jL$4%7(fLzS&L*m; z+t`BpdXOyOeJ|}q_}MLUVbRp8-k9dd1xCF@6sZn)lsdu^>L2t4lqa>q;oVy7Fbu{eGx)w97bx+~@1B33`ok;wMPpZy zVq5H{uNb=$AJO=>;vfmNpOKMVDod?mp%6yVL?yGW&11-UFvUls8O#@jw1cuT^Clr` zsj-{PQN}!8?z}ZL4*@EY%F339`)xZh9=z8;?>!Qtx5@+_%a7fp8z4q0)zzG>+r^`0rM zy~196TO~bS`s_xy;*x9dM-~E>aaadt`v+xY`FF2?rO&Ksj2JJZ^)xrD^K;dOImw}m zVwHu?jl{~$%?WE<+PN&lI6&wY*WmW7XIpU z|0XBo|F%9?l6{DF)MlRSVAvDg(;&ZS4n%ndNbRakcSpA;v+BrG6z584lHo5j0Kez? z0u1i1OG_9e_qv75O>v`vyN*|+Kp);10i)fIeZ!cQtYkPl!e37}6=zJY&aA~ZO`RMS zI2uz!rym=0h~o2?yNmnX`NtW`CaT1644@34h?xg@4m`f{Dg>q!k?I|C4H!o#l3?Dh zxOyAFM0(`d7RiC=Pole&?SsiIIz?IGx9i}s1j-s+%_@TuP*m!D{BXiQO)DCku8^k))4@DPz3+p@7?3?TBKne@sE)umsf z)1i?PcWU@a%J+jLjOF?~BD;t)hi#$X;t+%07_CvH_5JAr+%ynkme(>@cAlNWqlSec zO%azXBG)hugitNTZw)CGm&P97>y$VWwsT0U~~Kd_d4_O<<~1f3@cg7o8T>0 zI`b_drhLKYnniOKLePrq1mQR`dsCFN{(aSCtU3L*#4IbNLv+iJtD@0Tx52@-Jd05* z)Q$mtn?E9E(~cZ!Vwzt8WSc0aE+-KRAxFSO#i10_?Y&wtnT@nNK4Dq{R%H-_Ud4Rai2FMMfj7Up!G&caZ&`g#eylB~TC@&38;vbHzdH{V zH_3KBZA7zEm77%e00U^E#vy$OMG{CJ;dvtniKqLxOPxpf3K(pkunCcAK808k^kUWK zEomR&Q5K=b2`<}&I%C{X7ofC9!~Fq^Pl2;$PHJ|i1s5IPMW^h3PW?1$*x>#%I^fG! zA_<*Jv{1{p#4(1!@K3-@$LQ>4204YgL}BelhUxl}|AI6Zcg!=MF!$CRW6$JkB?%jo|Ixs}`lr1m>p!yKLLq|fIgEUA z(>Ic)m`Yk7|5lyaSgNTZMVR9%xVt9NXoX$@6Clj9LzH}|R&)A(%{m9ZMDXQF~6YNi;;SJ#0+ms@BF1@P$$_A0OZm;!=R*G-)4leg-kkr^{1@2O6VKcb4e` z4YEHwFL7Rsi^cZO2Romi9Mn1za4Po|e`&x#Vm*ZefF2av+0#HXd1|Mcwnf1bPFxB0 zy7zwi9Qn+7DLTwU=Om)wnva0nFGCLDWfi47t;2v+Qm7qi_ z0R&|k5_G}1M%@$j+DImrcnK%loWnUsdBTpSq_W?)7UXvA)cqrF{8!V@iDKE7$M)8i zEDbT%sf`S3(kt)eOECqR9p|~XL(0tt9!D4)Q?ld2(0R9Fs(GP9sDJ-Itmc{Ljgt_J zeFf-OyaEo4s_7KFGcVZ=g>IfuA%S$f?cIqvjG29{pNFWkYe?RUoPTl)xsCYH`95@HXFF{R1!Lh3@e!Il&Stw=ONQ*t%_~LWuFlEe z@P9KI7@I;t)gh`){}f!NkmK&?4Eu>?jU>VX2TMK&Uvy)~7zQg?!kmB~-Sya~cYQ}2 z%w>C=7rt1F;JolQ;Tcp``K@M1`^%DlL19JY*}2G2a4&4%BxrmEWUkV^$uG>WfD6?~ z3FZ9lT*AbgJt__cld{o+?^3%IMW!0gLmsKIQY1o zah~UrkxGXKP8=3!rC={5jFjXSR8C*qT^`_SGac>um0UPvY$^N@$P!SiYAcn=KVJOA z;lb(X9K~>pPMKSpTI*VRJ9c#Xf*aC1T!Ar;8cs?lG;6o0)`EMv9y=FD^^d+GY!pW$ zWi6ZENA`(7Po-OrOnp0{tn$;ZY_!NTT3ph$S7!4=C@rRKjpIXHl53p0w|R@u+9Zk9 zaILAX@vR<)GT(YEg*#U75pq_j}7+nqGwq_+;wUQ5w#oY2SUF!sZW58C?wPH z6Xm+9ZM5E;46s$cs70*#Gl+Lxv97N6D#jFEqi%PcA{e+YRDjvNh3H?Zf28+W&veH@ z@^}oByR)AoT7p9o@prmrTYh|gEk}A7XE4FHXg!7vDjxbAoJUo;;e^(1CS$_)aX`@{*` z4^yuIOFgeBt>lHS_Y(zaC=En@#nUZC{N-H6?w)n${kX?rkCQGaEJwjaNA3*9b?zFS zX!Jpf9~AX>KL=Ve?8{_1#7K6=Cl-=tNMa&$P7VW?^`KLbJ+*3jUmM~RW>Skh~C%Qa)JqG)<^px~I{fL9SZrvOs zea*D>w^5AbmUR|IAy*utUu)HcS)8>9qO5AxqLLZv0Y>J=cx>lwa zYJsziCK~YM1_F^vC#d$SRu&94jG>5b6iJ1{@Dp`#MZE}ZzB8aAuG_q~Y;B41rMye% zlf~xnwoC;t4KGxu%>s~e9`BzEm$+e*gJ?a zP-|bfrYjsZZg(k}w1l7G50lYKV={AY`Z1UhwT!Iw^oA3*r4p57LRHOpU;B8V*JhfDH_4<6 zqco%6Abae$D}uUS_{I}B5f!bYPcE{@AiE2=PJ@CXLew`GN_7@@g^b3`*cUKJnJLgR zHH(=7&ah6r!=Of}N1q!xtEfzb4-T zGWLkV5Y2@RYFyx>GHVr!8Z0w6NrcF6*ncGf|A{Lc`bR2pto+aJ!EnJvxe99tH5mSH zWaGcbKXFY>k=I|=;s>ARG(HJbM3YA+F>cdaj!mIT3LJCRT(>{K9qZrhv_C2#o2zd= zl#evn-a$lOip*aD!i0Q~r#IzgyT->#^Nmb`d(*qy&V=qy&6K37BQxKUNk@3r6Ia58 zPUVCi0f*~%tNpJ4!kj1NafmOk>&u<}n`mRr8X}PP9dZXT9D8otdDGGVu_ofB1fOfD z>Gt#HNC=;1+#$JJrb*C1HyjeP#jV`EcX9Zmf(E&OfvH}FY^W9bpCX<{R)Vf{6`?Q$qLeI^2=zc7Ap(5 z9XEnAo)r6c?N_K4Z*6;>pQT&0{)?gME*kueG99(wf`^d zy=7FKTe>b<2?Po5PLLuv1a}A!Jh;0%g*(9m1Of#V0fM``dw}3ha40mm2P=Z+)at%{ z?n?LW(`%n`_rLq2Mty@(V=zCP^L-zi7k6tn5klv8@h#>&;2f5@=H-=SzFY>P#K?aO2Ja<8uaq z;f#E2R~dR?%vn7$YNUkS!t|!PhTgcLjH8-oXwe|rgoL5X^01Z+zT-^s&QsHgv8$`X z0qz>d^DXz~SDrN__-<@HF!e{r{?;@!MW%kaazg87+(`1lu4r7OWpae833*Zy;E&HP zHiNV+#u;84-C85qN~>KKPjvbs0l2ah$OU4@cs>Ef881i89XF%>8Qt*rMNa2-<$TO- zF*+t6$8ig-Wyyeq?fwBOUI6j6^JI)>K#@!Ty9v5(d z&G7s+u>j(Bi@;r{UKd!G+W)ML7VEousFLoE#I~ge`}GGiK7W7P61vIA=>$;G4g8t3 zR>jOJl<~5)VTEk4IaxJbEJB3{g4CL+tkZW&#Ch@qa9u&W%Z{@;*n>Ta zP~|cgMiDJ?!OIZ#B{b%*2-=tPE!Jv0RHFQyvxPhYdch zvP<F zwH9njQvl5jk))>+X5wB+3(kv9kFFynE&u={c+u{KxC(?oh?1M!n7gEgHORt!Z4rjI z^0mz7%?SC)4;tBzY<g+lESY@-7+>61IpN35GPN0 z$=8spsnyn~=P#!xtgZ!rGlbf26e@M#;TeU1kgM`Bg7;(&0 zb+&>tpKz}XI4-AK^H2E7t0fL7rGZb5_K(Y1DaX5wm7dYpCh4Axhz)Ay1HhiqAfpaf zF;XvU<@)-@4-3q~Ff&QM&(QY~{8ZM&oAFWO%`^1P4ULUf%=kDrrW)ydqhk;e*MV~a zof-#=gy7)JSta{i8twwWp-1-7{ge7OO`^G-QSoQ3(xx4Bb<`|*=@~`Nbj=9Fx3fhx zU85UA&KLxE3<{{~vHj0H$jeHHFd!hkHE6~LvcBe&(9pv<|Cy%bwd6J|;^ zFfOp&8apzhg`c3nI0_NUf_+W}rs{s+96Wj5wcPtXS#U23#_6Tzm*#vE(fb3T04OsC z=+D)B6zjaMMY$U1FG71lF8`f=yaLbmElB|H+-Qix-02rZ(1bo;{rq3@<>{I!zuI~_pDAZoje@} ztR!V_Pxx)oUVE-OgeKhU4dO0<<7r8<848OmJ$+`;T)5e&ZY1zr?o?h)IY(oEnC*D& z)_8tYo*_4T;rHgB^IyP$vU>qv&i#A)nbF)RW{H0R6aFiJ;jjGdxBAdZD>L~IYR>+# z9sVs(U4HORjOQkIqjTu-?*JZC$SA%C{nOUPdIbyFBzqk-ohuYj{`tGfax%|#g-l;e z?fHF!7`+IUmZ%-nCGAgN4-P7OV?S*@Z2RADJ?d z8Dz1W4#DKqe&JjBHkX}{%!gnzMJdaujTO5IYN+7Z}$h=^b)GD z-7w}ju@=pkFG;n=%XHO=RCRK1-VA;Ka?+$*oG^zjUmvbkBThxOZ!kx?W!!;}9&9a| zQ?;xhx)kZAA35kEI>-;JnQ%M%9z5>GDn#6&BW2^d1XLzE_2xjaU5k9lk_;S zwBmF7>J>(N>xH#xZm8GCw{k2PUsq*EgttEv0~}mJgI?c&*L}ZXBxRb`H}XcE8|Wwt z88|tFEAu%b!HaN~epjpwgWF}L4|{d8xXNF0z+{JqinxOu5l){7$S;uvUMMN=N~9iP zMneOxcXuBHgDv2NJZ@OR5sO%W%+k4YfaY)<-1U{HW8#EVvB7``;xY5EsfULyar}9D@T0$-Y=iyht2dq2obu7~5oWK)y&vq2 zykP?VG5TWO(|0_Pf|h;#nLkjCG$AP0H5MwoUr@(6W%+4^lsHtD_w}#JY@TOmqTg`IQTiU4aowmCS$$Rtwe1sOHP4-<#>ms_ z=1p}>X&{P;{}>Zg?sJ##cD3%-Cx?`r-vc5Wi_A&#Q7u5D)hydWhwxqJR70;`_9F!7&Pv=yp5F*ipN6XI% zDH@60-8f5_FcLM&u+yBPAtgWNsb}WYV}*MglD$SXVtO;uLnq<>hD*0G+|~h>50$UF zb%J`<<~}Venc9GCZXGNZkFMW}vf*%a6oUTbVCa5|of=7D}5xk^_*% zD%`HPR+i;nBwgdy2d=Qm-j|Z52(_iEg}w(J{)8(S)NKBN82w&USBM}#O27ls<`d^1 z6NYpXQy*zBjZ2)?jjAr;J#anMzZBJ$zsXU@1M&R>r42ljiw>gyj)YbyzO*?$x?+ra zJq={u_9-UA*kKq%{(@TZVI%Sit?e`AN}z{hKQIapau%}XwDHi6G+8I=>oK8#UjEOp-)S%U>Uc98U-}-hCBIlko zO~VlP%y3Fp)HFI1)1}|LbYAMbWB9VYC?$4pF2j~sU;il;zG*MpP3F%>#;k>Hd@94~;( zq$RH^qmIjcil2*pyda}c&nvlNA|Y3#a#-H zOpeo3CBhb!3O}|T3IaDx+!(d3w{gI<@$II8B&<9BO@cu2nALeTZ`O^}4I0T8sZmg+ zAE;!_^^Jj@1(PuGGgO&J07*1%CV(LjEtdjBqF;DORIPI+ZDddQG%?|p(TOG zr-J4s<9?b9E4-G1>2<0nZf;OT2Xj1Wl_Ao>l#`;I;<8f6taMwxf(OW-C|<}5`?Qzy9Jhr0ewRX_0!PAM~IF-JH8;9QAoKFCe;XmpNN0eU-s5B8L$i{j6B zXR0l+nYa$3bGr!)CA_e`znavouNt6wRlyo&OBV z8L4$;{PK00bkDdPG38Y)W&e&}TbcLNfx1tmL=Sn`B-1&#pBEuCw`KURg(}U7f9q#~2>OP?(Qd5f3HAClL_CZ8n z2fOL=CMAf4S1sZ(o%ilTI5ppmX7$h{Q$5xMvTE;|6T)ftD1zEJAKuQzPE#$gVaW~& z4D0(Hv}p@xnxaODL#N!cH6p<&Mp{)o7aCEMHuQCtt%<~Gio4=6*sC;&0NWc_r>r9uv1xKS#oh(St%GgY?2p5KI0(=TZOA&l2D3SxQ%Lc0)X7S7@778|8PW(rOL7)u1t;$ zBqV@%r$MK~J5}UWC{R>N2+_ukV#rtd@2c~Dm-<=$F3Pgj{^@#YIsJ3KK5=tzB{yR~9;JfsE_p@d#9HvNmJFw@zJe+b&3FwINcKq#4O|(LJv`T- z^AkICy5PTM_7ovSaN^A=S$jxDYPK;y-&j3=b=S-G8erj7_zPgBE92!%KL-lS=g9xa zE$KH*maQ=;aD{lL=jR71RLgYEFd)4ocQ?Ln`+9)xBJk$V;APF9%IM4f8Pd>O85 zV?jeVa&azt)=c$mqLU|Uj`0^j?vY{y#`T!`YOewsi$3DuL2=D6Wb2sB(aNS};rcXw zfBv%A;gZYC($ozW)M@|aj&dahdL7`{{&12x^U%Rt6?iaDRGV?^bZAZ!wYU9aHXE*M z2I*RVsg{B0w1*UHDv{amLPS5=!}L5F!*WOL8MzctttgdNegU{FBPUc|6JM6-eBgx~ zZrvF;MngcC0>jJ_tgj|=4D3|LlA2P~bUYtsO`I1eiu;)sCTU`hwN6!|pkwuS25s}7 zXR;DsPmK1OY=Rpc%L$JXmEQK|Hd#-CQiqprzdpbNn)dXX(vXt|w=7&BDE)r3b3bB= zmQKsf=QjB~#q&RLqtoJ)+<=cVUkmh$)Tx|t&z=6TWWw_o!*{LMRyWPl>nXAEf@ya; z)F-Qgk=L-2G^0{n9i zIy?<0`nFzF1kOW#0rubUWGF}MbaET;-G~kTqZRJHgtO}^<)iqR$^iA6{){x?_72Kn0t$lqkDj6TP+9s%vVc-N{<}dalYYl zeEKFerf)ui>b)Jf0yW+;Y{$e*VW5v zo17Vt4sCd}9>k9V*d&J)RoLFx(hyIFDM|7?2xVZEyv&!hie>N%UAVrYYWx>O-LEUxg(Up@JM_zeC#)Zgz!;$QJ3lz=kK+QOyzH9gEP zk#cjxtFl=!3)gyi=f3cLnTg-Nqnnn`bTG$^dLTwvcD7xrtm~9%ZVJR%IdC1-pkb<& zF2$7d?@5>rzL{r~a(mDsA2zIj7F|t3p~GWdo!`A$2Vf!*(c>i|cQ=jwjCzw2eHmXF z4fs~NH>)}c(k!c%*kRnsxC9Ukd4-fN35hZS0m=>xH*Ib8)n%T((F&G|nDG@QB;>tk zlB(!TTk?*_%mIWC@=4Sed<64Xf|5Q(cC9MatsQq{(B%;p&ic1|dp`$-#HqG?HOnw0 z-_+i@^Ad@fr{^m?yZk}IhjTp+pyQ)Vr$n~fvMKYnX|Qkey!Q*RC_NThG}v#KE7v~| z6istzeLvsCJ0)+Kq`}z_%N3tkUC|KALf|^aEB`>>%}%0=ivM! zHT_oSh7xun-N>_|svBx~yS$x*`P&O_NBYUDk7b7Pw-4(UQQR#J*fqA#0ix36CP9Mn zQBevR^t#h5>!}xay!xDbIh(cwn^r8Zw9}*G;dg&$FTZ+UZ^{?cm=&=j=CE>-)OM2* z0Xs?Y^764bA96B(nMLu54~xW1xE94qbsQDBs6jdvoM395uP5$3on|O&Fh>7rxFEnt zgVLp6#CzW$1OH1IMS>^1tu?*#@qBC&L^ITyVl_5w_M#DL^ZUFZq)az4a+%-WJY97O zBINDhP;@}Y8`y$qDnJYx^fdj zl;F4)XPNZYvwzaRRA13^I1uN+Yn~(!lcfN&-R;c=Hw{&C7MfIKBgN%??ii!-X~n6H zR0+y89sL%7nhP-s*DWP8mP#TU4|7SLfZR(@b#OLBN;|h9hM`|cp(MRj00>`f{*5MA z&)4`q^s4Ii-1vbZ9A3iyQ^VyU`XcrIoAcTh99jHZRZ3s$0e)Or-q6wnX7~vl+z4-tI>Gxfpm5xTJymd2FQf6fXt+wY4DvRNjtW!d^(SC$w#B z2l*z!T}=6&1+A@oqA%~H`s+^}jBHsm*p$o>amy02*o86Ewb`Y_Y!=Zl@avD}S3NG) z^yOS*D30v?9x}}p!ap|-y_@oh3mzX03P``s_gkQwdE2AyCa5d*;&U%Iw9Zb^3M*e? zD0bX|XX?RMJ(`fe&{1Rj6DU*!&odg7fb*=aaFdb`GiRM~Z@|YZ)_b(szY($TpZ$gj z{RfNkAGI$LOZ`4ORZAK!N_KRMM`XH%J0dvcihF?@dRQD?t*6XlF5n&=KVW1x9?O%D zv|Z^)$_2#24U6?!HL$MGtDXfNt;tFP!-W*)Q{Q5i%9{iqhVkU8+8XSpAH2NLgloE@ zi;vh}Hu!x$F0jE9%17~x_SmUV$gxw||F*_c{zW0gt@=LOJYfK^8ScQ$3Ef z$~@@uha4Arqu(=5DEaR@!q0%eH<>r#Ygm*cgfq|icp?C6TW|V+RLz!13l^oh8&0Qr z4qhJ~)`$C;<6MGoRJ|&?c~(nADaBp<$;yM`b-YSUdudMm*XgfG_p1ULZLKUGtX_!$&i4=a`q!oyCh{9MQ_vdc_eL_SoG}O zFV33ct-^h*qnk!p^3YdzQ@?!+q2SWirGG^$ zNz8_ybz{?Rq9(^@R=`K><}rQ7P?!=3JbkJ=KGhF3M6_n|IS_IeOT@ADeSfY%uBDB6 zMlM@MLWh-eDLR|yQ!dHcaQUh}TR!QGn)cZo&ys@M8sIwwLmI7&KkrLhCSy(uR|)|i z$rDY=yd5(B+gaECyZB?KCD>!d15IIa-pWCfY9Bi1jpbM2T+ZPvy@|?P3Mb{%+d0@q zK~T3B%i~+y=2xD}0`PEg|DZ~vPY?x(l3~|`9j(W#d$>`L3FEK46z~rD{|087B@M{H zNX(y4o>v`mBl!g6Eu&JQNGOT-8OEFL;2WHTFJ-jFzX0n`1J4e4{*+Q;rNyBJ>Ev30 zo$lGbOiDUlyB`yym4rj!;5>N31u9(JQ+&=Xc8hW#_7jkG?_0-Ex|Mt()^i^=+QvTc zpMIMMF@{@ivCc6q7X!q0Y;QqaFez1DE|Ln;Q#9j?4(|&K(_W$Ku>4XWf(kE9k*A>$?5F8aA4Q}8@HJU zPoj-`Z+x|F4+pBwzQOg8gJODc91D(RO?|LqTVZJ0zR4~Bv}6?cH#}uW9G(q{kQcKZ zCqv5B=1d?hchA(b-}G&Q9Lv(VPM(Y0>gDq0f_Z9!OdEJWyP@?{Ts*&-hAY!{!PQ6T zLeD$HUS;QrIN1@VBYI?@BYChke(FrWTe=Z^YlOh_d-)fOdJ#*CO$(0iesG$fr+JFF zM2Q!!aUTNenz=Zgbnfe#t13lA4s#w?sy`0PrUz5ByWo*qN=prVc1EQq3mn{6t!%Pn zlEd%CV`LSRKdnU9qwT*rxVIl%ri>ALAoV!Y#;nlPH=p`~z+?cAX^-S&ES7MhvuF2h+ z@|G(ZLOlo13qg^3S0scWG$Fj$(m1ANv!p`#0y!bNd3fI1$QctETDLW<&R%S>)n`?A zaeux*DOGB5n!Xc4VjjYyrR_ba%h~1Z>s3KCb2L2UUMIIBXT~ZzQWqxl)LMl1tl4W~ zS0S)?K@lkrs6ITk3KTcvSeL0UVN%}c7kVyWzMN&NT3_+g7cP=R+-;qEf6KF75zU9! z&7#O%$Q`-KG}a|RayXBFr>Mr?K!&G|qc1EEW?O>LNYD`~V*F%Myj0~Y; zw4cv<7!0B_We=fQ;~)CjJvHSM@wB9Ysh~^s55T%+-4q3s(Kj3jCH;cVflLqzUhxts zOW)ch;rCB=-nb=nt#3xH)U<>3e`be##}6m7Z`2N_H)g4qp@%4&c$Yps89DYfu-a}< zBN%yWE+%k+wvO4n+u0$ibE4dkHnk$;`wNh?YGt>7&AB>a3qnuE?H@&nM5Dyy3RaZ^ zxje5^KrF_&Z)ACI+S%&=P-cA0%lc5{;5b|WEsx}nUN=do2RH9tJgqN3S?_4+Nd3-e zEDvVTE%4~yr`ANEFWe;|KD@Y7Q&BFKuiq@w3+xHhIv1Fk@*qJ&tZoIB6V#wNE1M4( zNpXsZ!gRJFLUJoKK-m!zYLvq)`T1Bw3{$2tmMoj(39Ei*-6gL3#L~?}m=k*jniTou z@)(PijcyaNSywb=#|PT#q7lsXgE?c1T_WWUKXcc{gwF(CByX&3Nc!ETNs!77Yy>kJ z-h0(9Dp5P@G<{m58s}U#v2HL3)oN0%E^9lAP|jRQCU*+tBM1S0fUR#p z@&5x*)!3Sg9P+=X(wTQ_2jgg1lS5o)=H3e;o;vyMfWUrUAKsmp7S5x4Inooan}m+r zebQfu)O_z{B|=b9wCAQ=lBN)ZKR^wZowJ#f2wX&$4t!o=o4;z*3k<^!H~T;;rA~{P zBQ9V*xPQQ~?H_h*x?CWoAFJ2`8C@~sj>ssK(?r{>oRnq#shM&qXF8SrR*6XXKyh*2nEuC z0#t`mmVoVr-Dq7NJ>t_R$cWKku2ccK1(60JqrKrg9$$Yp9j7lNyLw5x7_j%y-~+cH z@BO**rJue#enS=8Nhoifxx1r>BFNC#rZdF{fbIu2stKOeg4OcJDfn6$Nf7IfR8(DZ zDKZZ12@)1h2rtBW_2-0d_=H01m*{q8V#T{B5Y5+P58s-jQw4M$%7s1^S1@q1N_+R@ zGjSf1M#O8T%$Ei!$-#<=l$!0?8xnBeh%vm@eUdr)LR%3 zXtKQf@UH)OAwKvtwMeV{bh{RhCf`+tGYld?M716wrm9zFtj>7hde@e!Zu4q!#2?l+ z4;IpTZ%MU04pi%j=|Tt|oTw5l!%V|ySS_&!eguBgA2eS<+O|Y%^YnUJ5p5nim&$Vi zBpP!=geQDYg4ACOBHC$Z(~_G*E3`uOo5TGgSIK;KnwNn->hy>v!6C1h6?$?;6FpO% z&d=dlcY3u`$EVrTmMW^kyWk&NKZtf$j?b+hZ;JXhP8;+prs{fNVLqnflzX${4oI%9 zs7tTcVH0}ep_(lXjqOblW>Q|)^G+*=*Z%xKe+;UbtvgbE1#~sHt_pZ`K;m zTEz9W;{B%_!=8EM0%pVExoZ84LVm*x?~{db|A4*x)@J**5;hWA>A0KVD8dgkAMWf8DgJ+=O|*>pu_-d5w_SQh{1e%u0E=vf3(R4`lun>c$_h z8$lM1f)J-%CG3`AS*&1DN0YAxf7aX+T`@6b4w%I~zQdXdzoS?-XUaY=lR1AvT6>9T za{gt-E^h?%_Q21`e!%G`^CQa6Bh#Z$84uI}B=xzDMXtf!Q^ zmOiWn-l;-1@5A6&7v8(BFwtfa4Ad&YMFDrP{XiQZ*>)^-fPn>O%7lYiDb(&_sU?y2 z{c@5u5qgWWvU>XF1^&ZVwJPi4B$fUozT`S8ODXJLvYhy~$LGWkF6z87A7TcU#J+v$ zXM2+-2=P4X_dOlFMc-^tPdy#2X>5425O-p=E3^{Jdh_f>L!t?Z{*JPkudj3pMrCA5a{>$c&Z3HI1 z6CK=b=Pv8XOX0J@@)a%OLlo_vn$@9GCl)`rvpldJa0;VTi?R-iH<>ovW7M&NTX_AxTC?+UxOf253u1&5&L==Q~Rus zJB@CLbx}HMGWpF6wRe2>v+aaoO&RUKEow^BM=px~G*|Q?)VPDw5E>5I%5oXiM4-#s z6j*z~XbP*8;hPpzsTsbN5;EjM{+YB|F_=(N0D1CI{b(HNF85W zUG_uebLrW}=EiaTK^D^EB3e(*@&ftYd5pPS!Fv%fwz zBucS)ikYJ=FGQ$Jug`3^$iB4MmO&U@8Y9E&VUxxbbURd2sFY-@OqND{OEX(xsDRNY z&xwmdJTaD;7$GI<$!>~ta;Gyheagb(LD;FV$A(>>cX=kg;41`LQzMx}k(XWa2C$sG*fwPI#-o zG+d|LLXMKZWUeKQq$aHa#v&dfh=>1A%CCeComKk@CyjTQYi!C5J}GN$+l%1OR};P= zaL@|38vbme!&%M$Xg&U23-wpz%NW0@oHL%AkA^NR=Nf{Qe2Wol~HV=*U^E#cag#o;LJ(|d;#wfE$kMZ{M; zglXoctkGUXX4|O>IgW(%ngDD}SMmMKjEB+|Hp%j&!=~@%-wc%!3iTH4V3fXN!nG^y zF2^RNIb z7M>G3I(pc1ft<)aC(Gjo$7uxg5>A>hT2+aC(U=DYsQ&3{API^^U5A z#^wZqMCr>BhZj!$dKhQVZLZWh2fpeezAFOzf^D05T5zgJ z^!j-SCRdjVu0N1XSm9JeYvUgE@AS3S477+mT&NZ%SbD~Fv}AI5AXXqcZhVNxl5plk zK_GJpv-Uab%@WvSC*vOr+PKk93L7>ALYD--2)8r?%xUb3FfMJm7!lt^FGwl>6%R z21N?4deiE>Ri+^Q6GId8Z|DC?k9&suPHu-^fJpYNzlE?&nh|^}tgv_UD3X3R1XO7L zyu8fB%!Ck95Wylyp3u*no?FUkGhVPBLobeaV+Gx?6;f_8B z{NM8)SHMCeUh2Ygdvsbc-)OtyJsVf@DuwQzf6dLRkAI;Zp*BtStm8v=v!9C0XX0X4 zu5pg8@7bUFt=zCpDL1P*h7cP4_djVYFEYb>1zFQS^`3w3L;tJe|MA|GAsd64g1QPc z=h@a2Oltb{rl8g!NCxo2sQxE6Nj?K)xf`)|coMFmtD|M??gj*L^(zUKP99)At5-o( zqix0u@rwftOh+}R-e5vTtnq7mxD*k%UM=XHbOX+x?9>}%DEau=w;{u%ioa zjoFMkRQ2Oiw6m}7&f|AyFQ>hz_xbQ*=uRdfd}aG;+@-0Af80f-uefT#qM^A-cQ&81 zjF3rluv^%JLX0WN&~~?4!G{*KkNsY7boe zqtG<*R;*+ulOo$9yN4gMt^&$#2CZ39Iv2p@X2wYvWQ))2_>qQ-@H1XZcmI>)K0<9p z^FWYi6iIfX<#S)$eDZ)qrg`a!ls>4xqWMN!Y~72M+GUX?acnl;MCwTT7bmfErG~a+ zg*Qa(+lKmsqj?c3x-N0z&sVyC0bYI-vGb!eeX{~fY#y3WAvWKWBn6G<5x|3R^#x)$ z-#R%Tr{85JDnpit3v?A$7cx&)m!^Abp=cg{F1+1jT+Ud{0uQzjTf19uZW)Uwtg*H> z1vvDa4?8bNPHaQYrL@nj^r7QO-9;z`F(zcSerFEngq`Fl@6}4iRA0vznA|d!>dd3N zUv}b~WIz0>@~xVdS8cTSr3ZVimE}+1yT+1M>HV zbPttBB_&JR2#5e1c*x^C&4_~OM6Wnkw?dQvbk+U{4C0!yUrkf=E8od zpU4WT8|s7ShsSSt!4yX$b$8=Ik6SU>ihB7@#0wvh4FL6tAt)3lR9+ zKB2haSbf^K?Y47WNOg)fOnAf=CogJ_(J=fpy{2DU+BfrOac7OC+{=qf>TqH;ULSoI zl6Xm`peMjhkv7u!hBb~Y+(ii!Z(M}ubqr5rnM2cIxr*)+JVVWOVe8E}Ct>`4-BUxgYhqKYCyYsAe?gCh^k)tP6~f?;t(UVb(N_CzJTfHgKU7j~-F$Nfm*NLUn+FfV zgG-nc3=NZ2qF_JdTv&)-F*Qr6VM@QI;2K9_hEr^xGZ^&dSYwoa7$^vif0eVu6T&<} zrFtw(VpW6TdMY`qnlrs-()4|bg-oCnWiVPP3uEzb-KDz8H#6opc@l9|)Kjwh`hwdn z&RQrR@hS1u5OVZ+pkRp48tn0^RXF*kV-5P4ZK1 zld~Qr4lJkC>9m8WJ)yXTt_Fz|!FMhDaQC%YG_eOVO~WrhlZ4%XYRIG%OQv;Zu5{1o z3tpirb+C6?ENcTtajDUdqsOyv-gY~>iCQ}gZ@xtmTCw1V+;POTjBiGpUl#I36vkwY zw$;mSevm&;0%bcff{B19h|Z!Z1*8|i@v}Z!Bn{$Jb80dRteIbcwy0DJvsHcOhW7V- zCxqNF1|@-OM2BFG=0{DVjRcRm&Mg`1!U4iE*05z;UK3kf4NnA0RS(l?sa%k-Z8VmRjFJlO{# zj*l8>Z`5G}3|^Ie%o%_!(yVy^DK%X4$lI68$LypSzxaX^OIOQvUTr>619)KMmviKwFJjhB(a^Z&fDUXuWO^pM%THPI9t9kp z#_Ii%3S1WUS7G*lhT{MG#+|9q9q2~h~zwz^63oG#`9WE|gM?Xk-Bi>?Xp>WQE&GGKeT`<6rl?gw~sj^`!>HTE)?o$1kG3 zozuo0a#sjA`YzSg4PEd+KJ{l#Q)v6#gV>xX$@`sPaOmoGTI;)e?1)^x#<*uV+%mp@ znWMzCgjlSkecc4#&*tGBIBHEMtX?Jz)ur< zudoO&9!X32(sbZ1*cgvd8Si}Tgs#mykBVyZrda@^8TTG9PQZ9Os;^Tq%L*?4uveVh zTjQV~JG|@89DstENZ70sC5D8-*#HCqTJWcV_$_G1Vq;7mJwN5A0w7Fkx`^RkY11Y* zD%2$RujOtdDF2`20yguVThv4kK5+fOzOcLPpX^z?#$RJcE~F=ZLT(-lE%8+ik*NQ7 z^Jg&4qOHjZj{^@6`W9frr;(m!mTju|KGOcze8k5Roc(A42Jqpoff zsS@h7(B@Jy;)NoY8=PfVm9ZVOg_$Du8p-#YOUal>Nh3}-`rC~avuL&*K#=k@{Y9yU z#s%j?y0*lBnNf?c#t2M|`>V*?pNrT(j{j#1*}unl>Mv>3=VvB{F2 zJ@>)05rU)KA0;NC<c*RQ(^;>ANJrAF#p43d5Z{L@2FQ}HE0&Bn| zaP!b}wnQ?EH@x~7=T~S6(6fS}itsYOD8<0|7#H}K9KA^wIdbM^l|?lK6kc4cc?Wv= zXT42a8RFN)Q37%wqfI#0@!EiH)2S8a=rm*kwAGD-%3cgD5O*y`6y|R8X+Wloz`n-5 zeG8<|ugU%vUVv_ZjgPdE23HZ00Nn~mB_3Fxw1?civA@19Jo&5wnktjL0H7RNcRB?ra(Ru%t zlp%>V6sNZOLYAUM^PYUREVyutoLQJKUP4z-I*LaN4VI*omx&!9qGWp~#%c6&&0>>r zFow32CdreEsd$KfQri@$)wz_UI$;(ZF!S0ooI573`zAp00u!D(U9x1{pRkuaMv<=M zm?|I}48RGOz~tyA5#uxVH5!Lj>x9pJ{KJ206M~9p0?wY&0@t(ko!uF5NG~6s=e|L- zxHt!3&DE8X*42DNb(4Zmb&UA%#sTn;kL}^wIrhiL_KLvEOhN8HWv7u|-@m8%!{=!H zKo5>#hi{NH|KP*^_({^>@TclcfXyO2P{CO2Z|NM_z5jS8QQ56kSXC#i` z0g941J4hF#Zwoqv7`x-6CX)#Fx+*o7a;uK^EcV#r4S1f3yP$w+>Vk-CpK2qEF&@Kx zg>rI0_!%L<{q;fr>BD{b;symSc{kEFzE!4!t6Ba@3^NvpbIU%{^n+dd77kwOVgENX ze-%N1=48`U2Ji8GIfP536eb_nT4e1dmljO%TXlwPEidxo(>Aj@5E&TBS;R)eQwuIG z$zyrF?r*2y*Y;7BA;da%EV}RIbj+}C=nx>Mm`?`BL=bOUiCBUf zrX5c|zdI2f!}QmAxBJ6LY~8F5CYHPd0;NFP$gQV&Sen!nLC;#A(+2TQ=9SO`vjRf* zp3yIzhz`KS1RlqM7w_8d+iId8Tomi!60Ym}55xRYuF*KP2sqsXaC@Pu{X>Fn@Q#5p z#c1c-4dm@4xZ&dYkYCGIL)7B7RS1nPEqxe$CF49%oxvIp6dRI+&g+av0k}i}U=^U| zzujcCf$Q7W$+Y!A1xKfJpNO74uE9KG3RHJO6B7BqUW&LPNpWr}Ow%SPC2re*Dkd$9C=T8e9B*dnqi2boNN9{hMIS`i4Wk-b(LBYfAsi54Fk zJZV*yDiWQ@R0@v)h%BP~h?x2@B6hezLEX8zMH@E=>h1grNml;V?s#>O+`sP_@W0wS@35w_K97T-h#-u#0qG%1N9i3zr39q+D!qu5 z(2I0IfzX@uCRIX7LKi`h5;_EsCKj4>rAl=#GduGNt&|K#3c)2>Zau!fHXM1oq+iBPopMHd!kY25*y<8!*l z*?!U88XUHjmwo^hE;Z4(77wZ3awmbXGXNJx2^8@!t>K?PV;7Y9b=8C44X6KQNE|B8hHV$APdjUuoi=>myqb5Dc^ zU!A3P1e@&`o1Y5>p8ka?EKD(D&Qwi=n(r78DJhOZ$ zVN122bdqQ)K6Wt)sRu{JS(5KRLqRbUqbjr1*8EC&tNTYG-Fp{d)kxj3hGwzLFgHbT z_fvuOX(24Lv*Jq5<0*WGJhuBROzBBIwd>|mB61UcFRlyi(Tp(NH59$mBf6TR%J)bN z348ydk^5j#m)~~5D$*)#x1wsxF^hKUX#jc;GZ$s*lW=$L2!3SoI0w)(hN~zz<60zJ z@|25V2}IvKs1?QwihPc7;CNR#%mA^QQ_vnCjdYE#v%<~A!v5%YNrNFn!6wmK-?r3I z4zEh&a`F~+`}44s0tX2Y;eDa8pqPMuXZ7w98}t=Uy2Mo}u0G*|tY-0cYu}ocOfL%& z2%WAGgc4cH(d`{KlB#mA3h40zju*>7cYWgZ59jK$>&sM!>HFNY;W!%lbhC`c^S*f< zEd6;*pzR$SZi1yyl1`kQH<6*uiZ;70}W~ClmzhOY+p+{B!wVR5- z!)l5uG-W8$2CN9wRr5(sc)U}&KxkzMkXyI7zx-tM2@caGR_2|rSlsg&=R}}t(`Is- zY7_kh074<iN5>&WS;+@3jSdKA(Y=z%jJkZ^YgRyBU~L>8~-8iM+(>IjwK4zo^QSs@5F~i8^`uXeSNRRWn@*v7j-K2 zB?Yz>gcF!;8?RTV&v+K0oYR~H?M0O&cI0QYbSZueHGF6c+uH$FO~M8veDOEKSc>@nY+7@A|NoRf`Im{}PwyJr75bgaTwD)=ae`(O`({A=>WthvJnMvQWTpQoas!K;{|_chWGq}GREa`K86=+htH$e z;~2{l-ysn468ym50vfdxHlTjLS?5XH&RxJf>&&NZ$d#H;aFxI`M~d`lqua@ebHrd; zsCRm^eO|NDM^q7k%m7QxwZ))#iqT2TR2<6aKzt^;z(f! zaWKW!qqVq+IeDc8pK`@Al!`j8pZCbnd8A^k#175{FUfa6c18y|GoF3yoY*EFpxXXm zSj3L1mLQr8_zK6Jx?#T6m(MPc z{fyV6E7@oSxOrow087k2?ENRus@~9Tai(E*$OxbcVDP6Dq}J@)|R~MDq}*jDnghY26U#XDytXXoB@z2|7n`?YGul;%O$&G zZ!Bc+iT4KKuk)l5L!C+8$0;rfRZFC4di95WkK|EH&0=t{{7ecb-SdHD-trHDpGoafA#Ooq1PY1G8pcEr@R;dgDjWXc_rnG!+oR z4sZF_mgvag5b zodPhEpi3cm;*D@UEd(8{w_g=8imyvBX|~#eiE1Iky4IHI{l31(+O0l9guHr}N%{wF z*yglN5u)Or)0~3gzNcTZ^s)m}wZbD*x^c9BET1_$DF!b)uLiSbM@2C==%J@v1BMkj z=o7C4)D7acaPknlNm<|{Zp2g$+CX6{y?ydG44J*>DR7y<~{r%>6=S?5Pg#}HA`7zeGg%W9@H z>vE0{fx6J??`1TY#mKdU@k+gj&R`4N~%crH7ELRgnVBSGptMo99Gzn?s2pb{4qvVAUX0`)QbDt^7q z#SHIvuyyg`7iG>Dr?Li{Bn%(tZ3k~qvJj5a@<>TWT;$RZl{Xs5N3je@lV8pL)k;jJ zg8iM(=Q05LIOF-orB1-(2AR%1nX*3c`^yjh-o{}1q`8R9&sR1M?{u={)DZ&1=?QTX zJbbWWjT^P^DzS2&m_cuarvhIfcU(DlySPVTVa^8x{k#IqvkV}$)8FyqVr`pq^S@yg z-7F$wutFa!E&U?_WB2O&TcSVYUcm3gs{|n#J1f)!d5A=|p5_E3!W|T!FLA_hw!KYO zvoy`FdD+Aye)g8w`s5@;tQX+9)mN-4gNIzy>qj#*(%WS@qC3E$V>B)nLZFOlZG3il zWG6y$%6Nu!3xKhd3dGTX9kGa-02LiCdOa6+(wp4_iXaL~(-IlqN?NkBF)TIdrt1#} z&$s#BXs7w)k+-k;GQ4yD_6s9!q-UE%!bP%GnnGx-%$p>$`Ze>dy`czK$B&OUIy=&G zlEBw6gV{L=%^hkGa9pfc9ORog$bUB2mcOE!oAJ^U*Bmc_spw`yMng5%CqP znVqqD!wC`4;EZBA15Mj0skOIAVFAS;q8a7dM9#D}rd|$9O(Cop9XFibG6)1wHqc@Y)w`QE6uG zVorUdL(z1>$Be;zh3NI3P6Na_d=hTO2DkPJCfJD5M~!}CdUUcDkTl^brKX$nhOQb}Cprf$9GPcz5v0z0~g-AV+he`wRmJ#(Pw?NTH7 zn*M%B|6Kw#JC$~lBD?AGUC2Zu)h69A$M%4sH1tBd?P1mk6cv_A<{4-Njl>?SX7JvB z%`Ghf6(QPD{&a*|7YRojW2T3U-f(1C*z!kIf&G0KsuLE8nc~)#)Coc&rwtL9;C!*B zPco*k5b9kV#~JL2Y5+!(J5I3JIsW2paAVhJPR=w;yQi>q(()G`Rtq(V(5|en54&lP z-CgO+sqMtc7Sv508or+=4)rfhMs)kFJSlZ6QScEPsnA2R1o9@_zLAxw9)RBA%LRuQ zDXAeE54Z#6IrVJE9d5Ca`)5>S)zhY_X0;F*d{`0wE=o_RDx!e2? z%IGF9Z8?-Gn;2M-8(|c5`WB~lczx{c7Pk>CISW$Fb1ZKR@YFPtDI*^ZRX_HY}Bu8M5{9@>e2sP$s6$8~rrZOqohs zxwvkS>=uyT?q~kzAwDr}t>#_ENz6{uvkXM%x6q|pVU?nk@_{~H>7>nwFSd@MoDXUO zuDp+UIPb0*w-z#AkR{I6dY~ff;6+C*U9NG<48-POIoZ(OJ!Uw8?B9bLz{z$Gf|qI6 zfX6VhbiH|M%6s=Ry9rs{Q<=##1v}sl51gE6?TM&+#rDgkm7~k6c5o0%q2*D;8LVU` z8>U!dnz$u{Ei&Ql8-?yx5IeFc`0YA)1L|&lbaN<~e945;K!E?`G<6L><9Z0vp6JO6 zOSK6Dx6ISDG&!bO2o4QhO<#l4rfM%y@YEsa;XV6?=M^4#OhL=;PHES5&E%%hcUCO$ zteG0cW#J}tC{>j=Jtjnk`@kaiyEoK7>{G;+Rsqf#qk0ziaW@g$f zj8d6V;JoQ0>M! zj1tZ)3L_6~Qd8n>%3`PU&&(=Kd8-;|yR`JQA$H;-jic;5N@1pufkcBu4%=gg-+tPl z>fs`&b6EzV;0nU+KuZ|4>v;e|v2B=nh=*F+|1kX(D?;@!$qEQ|SP?z? za;({-`5SD;K3CsS(75~IX8;M_R(RBPEUB{%Na{Q=@cUf+8xY0G(lq=m01sBbw-TTL z#3lJ<_%u7?RB4h3fE)8s91!UFk^bNwAkcG?_VE?#WNGwcZho6|fC^A})Diz_e8yL- z6NN>cs+5zw55I3ql08vBzrkmmC@A+t?fjPaaiXYyS2ciE`KPKnq>_*K9>YX8QYP_} z^c)KVw_J>pAQm)1Tw3zvGUgQOSS^Z!%v*osR`~POt%G9}cqQ*?Bj53NPP7Tg2K@jW z`oU_wL(QGtOo)jtfuPB(D#U^3DoG+W`Fa=3=lz86hsp~wVw|%+#czA|mD6W;GX>r} zSy;*#zTa2ZC1V>Q!>Tv(4#^H=(es#%VVx1L07Q z-S^)`c=f+aQk6l?EDu*7RbBsuT8aLJTG@PFh+%%PPQT~oyDxcwy9C8pAKnx5Zo?j5 zr+*$Nvjz(D`azrxzFF+LFKoBP%=6%3kJyxTz>dq?s3%0kN?)>Hy3^P~#+UNCMcDLX zdt7`U7w!#dCf6N{oqd;8c`}gaPvPwv_b$7PXgN;lyn$Rn$uN9+!(kHO z<{Kg~KhIQluQMlKMQySW-EOAbcZ?yTJ;o4u`F&0iJ0v~|7>_!_EBJ~;QzBL;F0{yW$fXdJ$O3oO znU2Q>mFD;h(ej98c#VjYdGo&k6vST5O)UTtVjG*1dwBOGztCkKSVl?S0=js&T)-I( zxKG-Cm16tv*5knZN54%XfTAQW`K9Ny7Tn4IwEp&dP6@T0y!um>c0z6KWFw!tIldM1 zD){!y=uWo&DXq0{Pwe+9>SxWm|7w%{t$XwTxK1;=R0o!?!Ph_-2UxT`BFlS*Awihx z@U;>pDo!0G{P-#39Xx8ntvV`ca;LVJ*E|GAM%HTB zp61-tmq^vX$iHW0d4@S~i9EHgye9kPsV@qZX z^Q0P~1T#Mf_6qR7G0zmsBP{`O%69I4NbA)q%v_tb1obt|%x_&qS1(*U;PB%*L7QVxRTs18>A_l6Rkx>JS1&Ru-VFL|Y1S zz4Y4P%iDgY<*4dfPq9$2&6V}-!w=63`>HF|UYOf1q=<%c{ZI?CIY-rAv{SsPA?U2r zl2o?YT(+RCGCB!y+vSy}5?F#AefosIXP#L|elv^|Su;z1#nMGYtHR-2D(!P*Mu?PkmduW|5|jU5@O_QH=|gNkM2Xquuq`CGCef2lUb zy0*qb{;mPp%4i?0^i{y$Vd?V!{%&f>pL%J{HC-DB$*z6WX+o1DKZ01mYLWjQVE$;P^Y20X8&TYUU?OBhD=UxULE9Bf;ipiU hs&jroM11UkoMB8mC*EqVDy?ChTTB|~o%wa_KLCt`8PNa$ literal 0 HcmV?d00001 diff --git a/docs/workflowBespoke.jpg b/docs/workflowBespoke.jpg new file mode 100644 index 0000000000000000000000000000000000000000..99872857630c1acc54919490bcc9a79a951c0062 GIT binary patch literal 37063 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 G{rDe{b}zC3 literal 0 HcmV?d00001 diff --git a/docs/workflowOts.jpg b/docs/workflowOts.jpg new file mode 100644 index 0000000000000000000000000000000000000000..044b09aac9a5a536c667bcfd533bbd79b0406325 GIT binary patch literal 44295 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
  • 2O3)g?=J6itxzP4an+}ziu1^KU)Y%vA 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 literal 0 HcmV?d00001 diff --git a/docs/workflows.md b/docs/workflows.md new file mode 100644 index 0000000000..2c05249c21 --- /dev/null +++ b/docs/workflows.md @@ -0,0 +1,127 @@ +[OTS]: glossary.md#off-the-shelf +[apply]: glossary.md#apply +[applying]: glossary.md#apply +[base]: glossary.md#base +[fork]: https://guides.github.com/activities/forking/ +[instances]: glossary.md#instance +[manifest]: glossary.md#manifest +[off-the-shelf]: glossary.md#off-the-shelf +[overlays]: glossary.md#overlay +[patch]: glossary.md#patch +[patches]: glossary.md#patch +[rebase]: https://git-scm.com/docs/git-rebase +[resources]: glossary.md#resources +[workflowBespoke]: workflowBespoke.jpg +[workflowOts]: workflowOts.jpg + +# workflows + +A _workflow_ is the sequence of steps one takes to +use and maintain a configuration. + +## Bespoke configuration + +In this workflow, all configuration files are owned by +the user. No content is incorporated from version +control repositories owned by others. + +![bespoke config workflow image][workflowBespoke] + +#### 1) create a directory in version control + +> ``` +> git init ~/ldap +> ``` + +#### 2) create a [base] + +> ``` +> mkdir -p ~/ldap/base +> ``` + +In this directory, create and commit a [manifest] +and a set of [resources]. + +#### 3) create [overlays] + +> ``` +> mkdir -p ~/ldap/overlays/staging +> mkdir -p ~/ldap/overlays/production +> ``` + +Each of these directories needs a [manifest] +and one or more [patches]. + +The _staging_ directory might get a patch +that turns on an experiment flag in a configmap. + +The _production_ directory might get a patch +that increases the replica count in a deployment +specified in the base. + +#### 4) bring up [instances] + +Run kustomize, and pipe the output to [apply]. + +> ``` +> kustomize ~/ldap/overlays/staging | kubectl apply -f - +> kustomize ~/ldap/overlays/production | kubectl apply -f - +> ``` + + +## Off-the-shelf configuration + +In this workflow, all files are owned by the user and +maintained in a repository under their control, but +they are based on an [off-the-shelf] configuration that +is periodically consulted for updates. + + +![off-the-shelf config workflow image][workflowOts] + +#### 1) find and [fork] an [OTS] config + +#### 2) clone it as your [base] + +The [base] directory is maintained in a repo whose +upstream is an [OTS] configuration, in this case +https://github.com/kinflate/ldap. + +> ``` +> mkdir ~/ldap +> git clone https://github.com/$USER/ldap ~/ldap/base +> cd ~/ldap/base +> git remote add upstream git@github.com:kustomize/ldap +> ``` + +#### 3) create [overlays] + +As in the bespoke case above, create and populate +an _overlays_ directory. + +The [overlays] are siblings to each other and to the +[base] they depend on. + +> ``` +> mkdir -p ~/ldap/overlays/staging +> mkdir -p ~/ldap/overlays/production +> ``` + + +#### 4) bring up instances + +> ``` +> kustomize ~/ldap/overlays/staging | kubectl apply -f - +> kustomize ~/ldap/overlays/production | kubectl apply -f - +> ``` + +#### 5) (optionally) capture changes from upstream + +The user can optionally [rebase] their [base] to +capture changes made in the upstream repository. + +> ``` +> cd ~/ldap/base +> git fetch upstream +> git rebase upstream/master +> ``` diff --git a/kustomize.go b/kustomize.go new file mode 100644 index 0000000000..7940c4dd09 --- /dev/null +++ b/kustomize.go @@ -0,0 +1,34 @@ +/* +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 main + +import ( + "os" + + "github.com/golang/glog" + + "k8s.io/kubectl/pkg/kustomize/commands" +) + +func main() { + defer glog.Flush() + + if err := commands.NewDefaultCommand().Execute(); err != nil { + os.Exit(1) + } + os.Exit(0) +} diff --git a/test/main.sh b/test/main.sh new file mode 100755 index 0000000000..334ed80810 --- /dev/null +++ b/test/main.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +# Copyright 2018 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. + +function exit_with { + local msg=$1 + echo >&2 ${msg} + exit 1 +} + +base_dir="$( cd "$(dirname "$0")/../../.." && pwd )" +cd "$base_dir" || { + echo "Cannot cd to '$base_dir'. Aborting." >&2 + exit 1 +} + +# Install kustomize to $GOPATH/bin and export PATH +go install ./cmd/kustomize || { exit_with "Failed to install kustomize"; } +export PATH=$GOPATH/bin:$PATH + +home=`pwd` +example_dir="some/default/dir/for/examples" +if [ $# -eq 1 ]; then + example_dir=$1 +fi +if [ ! -d ${example_dir} ]; then + exit_with "directory ${example_dir} doesn't exist" +fi + +if [ -x "${example_dir}/tests/test.sh" ]; then + ${example_dir}/tests/test.sh ${example_dir} + if [ $? -eq 0 ]; then + echo "testing ${example_dir} passed." + else + exit_with "testing ${example_dir} failed." + fi +fi \ No newline at end of file diff --git a/version/version.go b/version/version.go new file mode 100644 index 0000000000..36aa6b52bd --- /dev/null +++ b/version/version.go @@ -0,0 +1,67 @@ +/* +Copyright 2018 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 version + +import ( + "fmt" + "io" + + "github.com/spf13/cobra" +) + +var ( + kustomizeVersion = "unknown" + goos = "unknown" + goarch = "unknown" + gitCommit = "$Format:%H$" // sha1 from git, output of $(git rev-parse HEAD) + + buildDate = "1970-01-01T00:00:00Z" // build date in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ') +) + +type Version struct { + KustomizeVersion string `json:"kustomizeVersion"` + GitCommit string `json:"gitCommit"` + BuildDate string `json:"buildDate"` + GoOs string `json:"goOs"` + GoArch string `json:"goArch"` +} + +func GetVersion() Version { + return Version{ + kustomizeVersion, + gitCommit, + buildDate, + goos, + goarch, + } +} + +func (v Version) Print(w io.Writer) { + fmt.Fprintf(w, "Version: %+v\n", v) +} + +// NewCmdVersion makes version command. +func NewCmdVersion(w io.Writer) *cobra.Command { + return &cobra.Command{ + Use: "version", + Short: "Prints the kustomize version", + Example: `kustomize version`, + Run: func(cmd *cobra.Command, args []string) { + GetVersion().Print(w) + }, + } +}