From 496194ca07d6990e5af6675b473404778dea40b6 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Thu, 17 Jul 2025 15:34:26 +0200 Subject: [PATCH 01/18] Copy the docs from the superset-operator --- docs/antora.yml | 3 + .../getting_started/getting_started.sh | 114 +++++++++ .../getting_started/getting_started.sh.j2 | 114 +++++++++ .../getting_started/install_output.txt | 4 + .../getting_started/install_output.txt.j2 | 4 + .../getting_started/superset-credentials.yaml | 14 + .../superset-load-examples-job.yaml | 47 ++++ .../superset-load-examples-job.yaml.j2 | 47 ++++ .../examples/getting_started/superset.yaml | 18 ++ .../test_getting_started_helm.sh | 5 + .../test_getting_started_stackablectl.sh | 5 + .../getting_started/superset-dashboard.png | Bin 0 -> 75125 bytes .../getting_started/superset-databases.png | Bin 0 -> 46205 bytes .../images/getting_started/superset-login.png | Bin 0 -> 21493 bytes .../opensearch/images/superset-databases.png | Bin 0 -> 46205 bytes .../images/superset_overview.drawio.svg | 4 + .../pages/getting_started/first_steps.adoc | 107 ++++++++ .../pages/getting_started/index.adoc | 24 ++ .../pages/getting_started/installation.adoc | 55 ++++ docs/modules/opensearch/pages/index.adoc | 98 +++++++ .../reference/commandline-parameters.adoc | 31 +++ .../opensearch/pages/reference/crds.adoc | 3 + .../reference/environment-variables.adoc | 89 +++++++ .../opensearch/pages/reference/index.adoc | 6 + .../pages/required-external-components.adoc | 10 + .../configuration-environment-overrides.adoc | 120 +++++++++ .../pages/usage-guide/connecting-druid.adoc | 42 +++ .../opensearch/pages/usage-guide/index.adoc | 9 + .../pages/usage-guide/listenerclass.adoc | 15 ++ .../opensearch/pages/usage-guide/logging.adoc | 17 ++ .../pages/usage-guide/monitoring.adoc | 5 + .../operations/cluster-operations.adoc | 4 + .../operations/graceful-shutdown.adoc | 20 ++ .../pages/usage-guide/operations/index.adoc | 5 + .../operations/pod-disruptions.adoc | 8 + .../usage-guide/operations/pod-placement.adoc | 7 + .../pages/usage-guide/security.adoc | 241 ++++++++++++++++++ .../storage-resource-configuration.adoc | 31 +++ docs/modules/opensearch/partials/nav.adoc | 23 ++ .../partials/supported-versions.adoc | 7 + docs/templating_vars.yaml | 9 + 41 files changed, 1365 insertions(+) create mode 100644 docs/antora.yml create mode 100755 docs/modules/opensearch/examples/getting_started/getting_started.sh create mode 100755 docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 create mode 100644 docs/modules/opensearch/examples/getting_started/install_output.txt create mode 100644 docs/modules/opensearch/examples/getting_started/install_output.txt.j2 create mode 100644 docs/modules/opensearch/examples/getting_started/superset-credentials.yaml create mode 100644 docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml create mode 100644 docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml.j2 create mode 100644 docs/modules/opensearch/examples/getting_started/superset.yaml create mode 100755 docs/modules/opensearch/examples/getting_started/test_getting_started_helm.sh create mode 100755 docs/modules/opensearch/examples/getting_started/test_getting_started_stackablectl.sh create mode 100644 docs/modules/opensearch/images/getting_started/superset-dashboard.png create mode 100644 docs/modules/opensearch/images/getting_started/superset-databases.png create mode 100644 docs/modules/opensearch/images/getting_started/superset-login.png create mode 100644 docs/modules/opensearch/images/superset-databases.png create mode 100644 docs/modules/opensearch/images/superset_overview.drawio.svg create mode 100644 docs/modules/opensearch/pages/getting_started/first_steps.adoc create mode 100644 docs/modules/opensearch/pages/getting_started/index.adoc create mode 100644 docs/modules/opensearch/pages/getting_started/installation.adoc create mode 100644 docs/modules/opensearch/pages/index.adoc create mode 100644 docs/modules/opensearch/pages/reference/commandline-parameters.adoc create mode 100644 docs/modules/opensearch/pages/reference/crds.adoc create mode 100644 docs/modules/opensearch/pages/reference/environment-variables.adoc create mode 100644 docs/modules/opensearch/pages/reference/index.adoc create mode 100644 docs/modules/opensearch/pages/required-external-components.adoc create mode 100644 docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc create mode 100644 docs/modules/opensearch/pages/usage-guide/connecting-druid.adoc create mode 100644 docs/modules/opensearch/pages/usage-guide/index.adoc create mode 100644 docs/modules/opensearch/pages/usage-guide/listenerclass.adoc create mode 100644 docs/modules/opensearch/pages/usage-guide/logging.adoc create mode 100644 docs/modules/opensearch/pages/usage-guide/monitoring.adoc create mode 100644 docs/modules/opensearch/pages/usage-guide/operations/cluster-operations.adoc create mode 100644 docs/modules/opensearch/pages/usage-guide/operations/graceful-shutdown.adoc create mode 100644 docs/modules/opensearch/pages/usage-guide/operations/index.adoc create mode 100644 docs/modules/opensearch/pages/usage-guide/operations/pod-disruptions.adoc create mode 100644 docs/modules/opensearch/pages/usage-guide/operations/pod-placement.adoc create mode 100644 docs/modules/opensearch/pages/usage-guide/security.adoc create mode 100644 docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc create mode 100644 docs/modules/opensearch/partials/nav.adoc create mode 100644 docs/modules/opensearch/partials/supported-versions.adoc create mode 100644 docs/templating_vars.yaml diff --git a/docs/antora.yml b/docs/antora.yml new file mode 100644 index 0000000..d522680 --- /dev/null +++ b/docs/antora.yml @@ -0,0 +1,3 @@ +--- +name: home +version: "nightly" diff --git a/docs/modules/opensearch/examples/getting_started/getting_started.sh b/docs/modules/opensearch/examples/getting_started/getting_started.sh new file mode 100755 index 0000000..5e5bad0 --- /dev/null +++ b/docs/modules/opensearch/examples/getting_started/getting_started.sh @@ -0,0 +1,114 @@ +#! /usr/bin/env bash +set -euo pipefail + +# DO NOT EDIT THE SCRIPT +# Instead, update the j2 template, and regenerate it for dev with `make render-docs`. + +# TODO (@NickLarsenNZ): Use bitnami/postgres chart, and add version var to the above list +# See similar changes in: https://github.com/stackabletech/hive-operator/pull/489/commits/8189f196f018c009370ae9b07a3f9609ee2e8681 + +# This script contains all the code snippets from the guide, as well as some assert tests +# to test if the instructions in the guide work. The user *could* use it, but it is intended +# for testing only. +# The script will install the operators, create a superset instance and briefly open a port +# forward and connect to the superset instance to make sure it is up and running. +# No running processes are left behind (i.e. the port-forwarding is closed at the end) + +if [ $# -eq 0 ] +then + echo "Installation method argument ('helm' or 'stackablectl') required." + exit 1 +fi + +cd "$(dirname "$0")" + +case "$1" in +"helm") +echo "Installing Operators with Helm" +# tag::helm-install-operators[] +helm install --wait commons-operator oci://oci.stackable.tech/sdp-charts/commons-operator --version 0.0.0-dev +helm install --wait secret-operator oci://oci.stackable.tech/sdp-charts/secret-operator --version 0.0.0-dev +helm install --wait listener-operator oci://oci.stackable.tech/sdp-charts/listener-operator --version 0.0.0-dev +helm install --wait superset-operator oci://oci.stackable.tech/sdp-charts/superset-operator --version 0.0.0-dev +# end::helm-install-operators[] +;; +"stackablectl") +echo "installing Operators with stackablectl" +# tag::stackablectl-install-operators[] +stackablectl operator install \ + commons=0.0.0-dev \ + secret=0.0.0-dev \ + listener=0.0.0-dev \ + superset=0.0.0-dev +# end::stackablectl-install-operators[] +;; +*) +echo "Need to give 'helm' or 'stackablectl' as an argument for which installation method to use!" +exit 1 +;; +esac + +echo "Installing bitnami PostgreSQL" +# tag::install-bitnami-psql[] +helm install superset oci://registry-1.docker.io/bitnamicharts/postgresql \ + --version 16.5.0 \ + --set auth.username=superset \ + --set auth.password=superset \ + --set auth.database=superset \ + --wait +# end::install-bitnami-psql[] + +echo "Creating credentials secret" +# tag::apply-superset-credentials[] +kubectl apply -f superset-credentials.yaml +# end::apply-superset-credentials[] + +echo "Creating Superset cluster" +# tag::apply-superset-cluster[] +kubectl apply -f superset.yaml +# end::apply-superset-cluster[] + +sleep 5 + +for (( i=1; i<=15; i++ )) +do + echo "Waiting for SupersetCluster to appear ..." + if eval kubectl get statefulset simple-superset-node-default; then + break + fi + + sleep 1 +done + +echo "Waiting on superset StatefulSet ..." +# tag::wait-superset[] +kubectl rollout status --watch statefulset/simple-superset-node-default --timeout 300s +# end::wait-superset[] + +# wait a bit for the port to open +sleep 10 + +echo "Starting port-forwarding of port 8088" +# tag::port-forwarding[] +kubectl port-forward service/simple-superset-node 8088 > /dev/null 2>&1 & +# end::port-forwarding[] +PORT_FORWARD_PID=$! +# shellcheck disable=2064 # we want the PID evaluated now, not at the time the trap is +trap "kill $PORT_FORWARD_PID" EXIT +sleep 5 + +echo "Checking if web interface is reachable ..." +return_code=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8088/login/) +if [ "$return_code" == 200 ]; then + echo "Web interface reachable!" +else + echo "Could not reach web interface." + exit 1 +fi + +echo "Loading examples ..." +# tag::load-examples[] +kubectl apply -f superset-load-examples-job.yaml +sleep 5 +kubectl wait --for=condition=complete --timeout=1500s job/superset-load-examples +# end::load-examples[] diff --git a/docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 b/docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 new file mode 100755 index 0000000..513d705 --- /dev/null +++ b/docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 @@ -0,0 +1,114 @@ +#! /usr/bin/env bash +set -euo pipefail + +# DO NOT EDIT THE SCRIPT +# Instead, update the j2 template, and regenerate it for dev with `make render-docs`. + +# TODO (@NickLarsenNZ): Use bitnami/postgres chart, and add version var to the above list +# See similar changes in: https://github.com/stackabletech/hive-operator/pull/489/commits/8189f196f018c009370ae9b07a3f9609ee2e8681 + +# This script contains all the code snippets from the guide, as well as some assert tests +# to test if the instructions in the guide work. The user *could* use it, but it is intended +# for testing only. +# The script will install the operators, create a superset instance and briefly open a port +# forward and connect to the superset instance to make sure it is up and running. +# No running processes are left behind (i.e. the port-forwarding is closed at the end) + +if [ $# -eq 0 ] +then + echo "Installation method argument ('helm' or 'stackablectl') required." + exit 1 +fi + +cd "$(dirname "$0")" + +case "$1" in +"helm") +echo "Installing Operators with Helm" +# tag::helm-install-operators[] +helm install --wait commons-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/commons-operator --version {{ versions.commons }} +helm install --wait secret-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/secret-operator --version {{ versions.secret }} +helm install --wait listener-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/listener-operator --version {{ versions.listener }} +helm install --wait superset-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/superset-operator --version {{ versions.superset }} +# end::helm-install-operators[] +;; +"stackablectl") +echo "installing Operators with stackablectl" +# tag::stackablectl-install-operators[] +stackablectl operator install \ + commons={{ versions.commons }} \ + secret={{ versions.secret }} \ + listener={{ versions.listener }} \ + superset={{ versions.superset }} +# end::stackablectl-install-operators[] +;; +*) +echo "Need to give 'helm' or 'stackablectl' as an argument for which installation method to use!" +exit 1 +;; +esac + +echo "Installing bitnami PostgreSQL" +# tag::install-bitnami-psql[] +helm install superset oci://registry-1.docker.io/bitnamicharts/postgresql \ + --version 16.5.0 \ + --set auth.username=superset \ + --set auth.password=superset \ + --set auth.database=superset \ + --wait +# end::install-bitnami-psql[] + +echo "Creating credentials secret" +# tag::apply-superset-credentials[] +kubectl apply -f superset-credentials.yaml +# end::apply-superset-credentials[] + +echo "Creating Superset cluster" +# tag::apply-superset-cluster[] +kubectl apply -f superset.yaml +# end::apply-superset-cluster[] + +sleep 5 + +for (( i=1; i<=15; i++ )) +do + echo "Waiting for SupersetCluster to appear ..." + if eval kubectl get statefulset simple-superset-node-default; then + break + fi + + sleep 1 +done + +echo "Waiting on superset StatefulSet ..." +# tag::wait-superset[] +kubectl rollout status --watch statefulset/simple-superset-node-default --timeout 300s +# end::wait-superset[] + +# wait a bit for the port to open +sleep 10 + +echo "Starting port-forwarding of port 8088" +# tag::port-forwarding[] +kubectl port-forward service/simple-superset-node 8088 > /dev/null 2>&1 & +# end::port-forwarding[] +PORT_FORWARD_PID=$! +# shellcheck disable=2064 # we want the PID evaluated now, not at the time the trap is +trap "kill $PORT_FORWARD_PID" EXIT +sleep 5 + +echo "Checking if web interface is reachable ..." +return_code=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8088/login/) +if [ "$return_code" == 200 ]; then + echo "Web interface reachable!" +else + echo "Could not reach web interface." + exit 1 +fi + +echo "Loading examples ..." +# tag::load-examples[] +kubectl apply -f superset-load-examples-job.yaml +sleep 5 +kubectl wait --for=condition=complete --timeout=1500s job/superset-load-examples +# end::load-examples[] diff --git a/docs/modules/opensearch/examples/getting_started/install_output.txt b/docs/modules/opensearch/examples/getting_started/install_output.txt new file mode 100644 index 0000000..9e8201d --- /dev/null +++ b/docs/modules/opensearch/examples/getting_started/install_output.txt @@ -0,0 +1,4 @@ +Installed commons=0.0.0-dev operator +Installed secret=0.0.0-dev operator +Installed listener=0.0.0-dev operator +Installed superset=0.0.0-dev operator diff --git a/docs/modules/opensearch/examples/getting_started/install_output.txt.j2 b/docs/modules/opensearch/examples/getting_started/install_output.txt.j2 new file mode 100644 index 0000000..52b0408 --- /dev/null +++ b/docs/modules/opensearch/examples/getting_started/install_output.txt.j2 @@ -0,0 +1,4 @@ +Installed commons={{ versions.commons }} operator +Installed secret={{ versions.secret }} operator +Installed listener={{ versions.listener }} operator +Installed superset={{ versions.superset }} operator diff --git a/docs/modules/opensearch/examples/getting_started/superset-credentials.yaml b/docs/modules/opensearch/examples/getting_started/superset-credentials.yaml new file mode 100644 index 0000000..c7788b3 --- /dev/null +++ b/docs/modules/opensearch/examples/getting_started/superset-credentials.yaml @@ -0,0 +1,14 @@ +--- +apiVersion: v1 +kind: Secret +metadata: + name: simple-superset-credentials +type: Opaque +stringData: + adminUser.username: admin + adminUser.firstname: Superset + adminUser.lastname: Admin + adminUser.email: admin@superset.com + adminUser.password: admin + connections.secretKey: thisISaSECRET_1234 + connections.sqlalchemyDatabaseUri: postgresql://superset:superset@superset-postgresql.default.svc.cluster.local/superset diff --git a/docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml b/docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml new file mode 100644 index 0000000..a3e4743 --- /dev/null +++ b/docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml @@ -0,0 +1,47 @@ +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: superset-load-examples +spec: + template: + spec: + volumes: + - configMap: + defaultMode: 420 + name: simple-superset-node-default + name: config + containers: + - name: superset + image: oci.stackable.tech/sdp/superset:4.1.2-stackable0.0.0-dev + command: [ + "/bin/sh", + "-c", + "mkdir --parents /stackable/app/pythonpath && \ + cp /stackable/config/* /stackable/app/pythonpath && \ + echo 'SQLALCHEMY_EXAMPLES_URI = os.environ.get(\"SQLALCHEMY_DATABASE_URI\")' >> /stackable/app/pythonpath/superset_config.py && \ + superset load_examples" + ] + env: + - name: SECRET_KEY + valueFrom: + secretKeyRef: + key: connections.secretKey + name: simple-superset-credentials + - name: SQLALCHEMY_DATABASE_URI + valueFrom: + secretKeyRef: + key: connections.sqlalchemyDatabaseUri + name: simple-superset-credentials + volumeMounts: + - mountPath: /stackable/config + name: config + resources: + limits: + cpu: 1200m + memory: 1000Mi + requests: + cpu: 300m + memory: 1000Mi + restartPolicy: Never + backoffLimit: 4 diff --git a/docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml.j2 b/docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml.j2 new file mode 100644 index 0000000..966956a --- /dev/null +++ b/docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml.j2 @@ -0,0 +1,47 @@ +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: superset-load-examples +spec: + template: + spec: + volumes: + - configMap: + defaultMode: 420 + name: simple-superset-node-default + name: config + containers: + - name: superset + image: oci.stackable.tech/sdp/superset:4.1.2-stackable{{ versions.superset }} + command: [ + "/bin/sh", + "-c", + "mkdir --parents /stackable/app/pythonpath && \ + cp /stackable/config/* /stackable/app/pythonpath && \ + echo 'SQLALCHEMY_EXAMPLES_URI = os.environ.get(\"SQLALCHEMY_DATABASE_URI\")' >> /stackable/app/pythonpath/superset_config.py && \ + superset load_examples" + ] + env: + - name: SECRET_KEY + valueFrom: + secretKeyRef: + key: connections.secretKey + name: simple-superset-credentials + - name: SQLALCHEMY_DATABASE_URI + valueFrom: + secretKeyRef: + key: connections.sqlalchemyDatabaseUri + name: simple-superset-credentials + volumeMounts: + - mountPath: /stackable/config + name: config + resources: + limits: + cpu: 1200m + memory: 1000Mi + requests: + cpu: 300m + memory: 1000Mi + restartPolicy: Never + backoffLimit: 4 diff --git a/docs/modules/opensearch/examples/getting_started/superset.yaml b/docs/modules/opensearch/examples/getting_started/superset.yaml new file mode 100644 index 0000000..346121b --- /dev/null +++ b/docs/modules/opensearch/examples/getting_started/superset.yaml @@ -0,0 +1,18 @@ +--- +apiVersion: superset.stackable.tech/v1alpha1 +kind: SupersetCluster +metadata: + name: simple-superset +spec: + image: + productVersion: 4.1.2 + clusterConfig: + credentialsSecret: simple-superset-credentials + nodes: + roleConfig: + listenerClass: external-unstable + roleGroups: + default: + config: + rowLimit: 10000 + webserverTimeout: 300 diff --git a/docs/modules/opensearch/examples/getting_started/test_getting_started_helm.sh b/docs/modules/opensearch/examples/getting_started/test_getting_started_helm.sh new file mode 100755 index 0000000..046c986 --- /dev/null +++ b/docs/modules/opensearch/examples/getting_started/test_getting_started_helm.sh @@ -0,0 +1,5 @@ +#! /usr/bin/env bash +set -euo pipefail + +cd "$(dirname "$0")" +./getting_started.sh helm diff --git a/docs/modules/opensearch/examples/getting_started/test_getting_started_stackablectl.sh b/docs/modules/opensearch/examples/getting_started/test_getting_started_stackablectl.sh new file mode 100755 index 0000000..9bcbe91 --- /dev/null +++ b/docs/modules/opensearch/examples/getting_started/test_getting_started_stackablectl.sh @@ -0,0 +1,5 @@ +#! /usr/bin/env bash +set -euo pipefail + +cd "$(dirname "$0")" +./getting_started.sh stackablectl diff --git a/docs/modules/opensearch/images/getting_started/superset-dashboard.png b/docs/modules/opensearch/images/getting_started/superset-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..fa668ae6cb114ae9f783488496775aa08739b1e4 GIT binary patch literal 75125 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 LQIq`Tu;WWeJzuM)QfTxsz%GmDNIW$`g3 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 literal 0 HcmV?d00001 diff --git a/docs/modules/opensearch/images/superset-databases.png b/docs/modules/opensearch/images/superset-databases.png new file mode 100644 index 0000000000000000000000000000000000000000..0c67d67bd318165b1254706bf84317534c1f289f GIT binary patch literal 46205 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 + + +
Pod
<name>-node-<rg1>-1
Pod...
Superset
Operator
Superset...
StatefulSet
<name>-node-<rg1>
StatefulSet...
Service
<name>-node-<rg1>
Service...
Pod
<name>-node-<rg1>-0
Pod...
ConfigMap
<name>-node-<rg1>
ConfigMap...
SupersetCluster
<name>
SupersetCluster...
create
create
read
read
Legend
Legend
Operator
Operator
Resource
Resource
Custom
Resource
Custom...
role group
<rg1>
role group...
StatefulSet
<name>-node-<rg2>
StatefulSet...
Service
<name>-node-<rg2>
Service...
Pod
<name>-node-<rg2>-0
Pod...
ConfigMap
<name>-node-<rg2>
ConfigMap...
Service
<name>-external
Service...
role
node
role...
references
references
role group
<rg2>
role group...
Text is not SVG - cannot display
diff --git a/docs/modules/opensearch/pages/getting_started/first_steps.adoc b/docs/modules/opensearch/pages/getting_started/first_steps.adoc new file mode 100644 index 0000000..e23a3b1 --- /dev/null +++ b/docs/modules/opensearch/pages/getting_started/first_steps.adoc @@ -0,0 +1,107 @@ += First steps + +Once you have followed the steps in xref:getting_started/installation.adoc[] for the Operator and its dependencies, you will now go through the steps to set up and connect to a Superset instance. + +== Database for the Superset metadata + +Superset metadata (slices, connections, tables, dashboards etc.) is stored in an SQL database. + +For testing, you can set up a PostgreSQL database with these commands: + +[source,bash] +include::example$getting_started/getting_started.sh[tag=install-bitnami-psql] + +WARNING: This setup is not suitable for use in production. +Refer to the xref:required-external-components[supported databases] for production-ready database setup instructions. + +== Secret with Superset credentials + +You need to create a secret with the required credentials (database connection credentials and an admin account for Superset). +Create a file called `superset-credentials.yaml`: + +[source,yaml] +include::example$getting_started/superset-credentials.yaml[] + +Apply the Secret: + +[source,bash] +include::example$getting_started/getting_started.sh[tag=apply-superset-credentials] + +The `connections.secretKey` will be used for securely signing the session cookies and can be used by the extensions for any other security-related needs. +It should be a long, random string. + +`connections.sqlalchemyDatabaseUri` must contain the connection string to the SQL database storing the Superset metadata. + +The `adminUser` fields are used to create an admin user. +If using non-default authentication (e.g., LDAP), the admin user is disabled. + +== Creation of a Superset node + +A Superset node must be created as a custom resource, create a file called `superset.yaml`: + +[source,yaml] +include::example$getting_started/superset.yaml[] + +And apply it: + +[source,bash] +include::example$getting_started/getting_started.sh[tag=apply-superset-cluster] + + +`metadata.name` contains the name of the Superset cluster. + +The previously created secret must be referenced in `spec.clusterConfig.credentialsSecret`. + +The `rowLimit` configuration option defines the row limit when requesting chart data. + +The `webserverTimeout` configuration option defines the maximum number of seconds a Superset request can take before timing out. +These settings affect the maximum duration a query to an underlying datasource can take. +If you get timeout errors before your query returns the result you may need to increase this timeout. + +You need to wait for the Superset node to finish deploying. You can do so with this command: + +[source,bash] +include::example$getting_started/getting_started.sh[tag=wait-superset] + +== Connecting to the web interface + +Once the Superset node is created and the database is initialized, you can open Superset in your browser. + +To forward the Superset port (`8088`) to localhost, run: + +[source,bash] +include::example$getting_started/getting_started.sh[tag=port-forwarding] + +Then, open `http://localhost:8088` in your browser and log in with the admin credentials from the Kubernetes secret. + +image::getting_started/superset-login.png[Login screen of Superset] + +Superset is now ready for use. +If you want to load sample data and dashboards and explore Superset's functionality, proceed to the next step. + +== Loading examples and accessing example dashboards + +To have some data to play with and some dashboards to explore, Superset comes with some example data that you can load. +To do so, create a file `superset-load-examples-job.yaml` with this content: + +[source,bash] +include::example$getting_started/superset-load-examples-job.yaml[] + +This Kubernetes Job uses the same connection information and credentials as the Superset instance to load the example data. +Run the Job and wait for it to finish with the following command: + +[source,bash] +include::example$getting_started/getting_started.sh[tag=load-examples] + +The Job will take a few minutes to terminate. +Afterwards, check back again on the web interface. +New dashboards should be available: + +image::getting_started/superset-dashboard.png[Superset dashboard showing birth names] + +Great! +Now you can explore this sample data, run queries on it or create your own dashboards. + +== What's next + +Check the xref:usage-guide/index.adoc[] to find out more about configuring your Superset instance or have a look at the Superset documentation to https://superset.apache.org/docs/creating-charts-dashboards/creating-your-first-dashboard[create your first dashboard]. diff --git a/docs/modules/opensearch/pages/getting_started/index.adoc b/docs/modules/opensearch/pages/getting_started/index.adoc new file mode 100644 index 0000000..28314e8 --- /dev/null +++ b/docs/modules/opensearch/pages/getting_started/index.adoc @@ -0,0 +1,24 @@ += Getting started + +This guide helps you get started with Superset using the Stackable Operator. +It covers the installation of the Operator and its dependencies, setting up your first Superset instance, connecting to it, and exploring sample data. + +== Prerequisites + +You’ll need the following: + +* a Kubernetes cluster +* kubectl +* Helm + +Resource sizing depends on cluster type(s), usage and scope, but as a starting point we recommend a minimum of the following resources for this operator: + +* 0.2 cores (e.g. i5 or similar) +* 256MB RAM + +== What's next + +The guide is divided into two steps: + +* xref:getting_started/installation.adoc[Installing the Operators]. +* xref:getting_started/first_steps.adoc[Setting up the Superset instance and connecting to it]. diff --git a/docs/modules/opensearch/pages/getting_started/installation.adoc b/docs/modules/opensearch/pages/getting_started/installation.adoc new file mode 100644 index 0000000..b9a30aa --- /dev/null +++ b/docs/modules/opensearch/pages/getting_started/installation.adoc @@ -0,0 +1,55 @@ += Installation + +On this page you will install the Stackable Superset Operator as well as the commons, secret and listener operators which are required by all Stackable Operators. + +== Stackable Operators + +There are multiple ways to install the Stackable Operator for Apache Zookeeper. +`stackablectl` is the preferred way but Helm is also supported. +OpenShift users may prefer installing the operator from the RedHat Certified Operator catalog using the OpenShift web console. + +[tabs] +==== +stackablectl (recommended):: ++ +-- +`stackablectl` is the command line tool to interact with Stackable operators and our recommended way to install +Operators. Follow the xref:management:stackablectl:installation.adoc[installation steps] for your platform. + +After you have installed `stackablectl`, run the following command to install all Operators necessary for Superset: + +[source,bash] +---- +include::example$getting_started/getting_started.sh[tag=stackablectl-install-operators] +---- + +The tool will show + +[source] +include::example$getting_started/install_output.txt[] + +TIP: Consult the xref:management:stackablectl:quickstart.adoc[] to learn more about how to use `stackablectl`. +For example, you can use the `--cluster kind` flag to create a Kubernetes cluster with link:https://kind.sigs.k8s.io/[kind]. +-- + +Helm:: ++ +-- +You can also use Helm to install the Operators. + +NOTE: `helm repo` subcommands are not supported for OCI registries. The operators are installed directly, without adding the Helm Chart repository first. + +Install the Stackable Operators: +[source,bash] +---- +include::example$getting_started/getting_started.sh[tag=helm-install-operators] +---- + +Helm will deploy the operators in a Kubernetes Deployment and apply the CRDs for the Superset service (as well as the CRDs for the required operators). +You are now ready to deploy Superset in Kubernetes. +-- +==== + +== What's next + +xref:getting_started/first_steps.adoc[Deploy a Superset instance and connect to it]. diff --git a/docs/modules/opensearch/pages/index.adoc b/docs/modules/opensearch/pages/index.adoc new file mode 100644 index 0000000..7783e02 --- /dev/null +++ b/docs/modules/opensearch/pages/index.adoc @@ -0,0 +1,98 @@ += Stackable Operator for Apache Superset +:description: Stackable Operator for Apache Superset manages Superset clusters on Kubernetes for data exploration, SQL connections, and visualization. +:keywords: Stackable operator, Apache Superset, Kubernetes, operator, data science, data exploration +:superset: https://superset.apache.org/ +:crs: https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/ +:github: https://github.com/stackabletech/superset-operator/ +:crd: {crd-docs-base-url}/superset-operator/{crd-docs-version}/ +:crd-supersetcluster: {crd-docs}/superset.stackable.tech/supersetcluster/v1alpha1/ +:feature-tracker: https://features.stackable.tech/unified + +[.link-bar] +* {github}[GitHub {external-link-icon}^] +* {feature-tracker}[Feature Tracker {external-link-icon}^] +* {crd}[CRD documentation {external-link-icon}^] + +The Stackable operator for {superset}[Apache Superset] deploys and manages Superset clusters on Kubernetes. +Superset is a data exploration and visualization tool that connects to SQL-based data sources. +Store your data in Apache Druid or Trino, and manage your Druid and Trino instances with the Stackable operators for xref:druid:index.adoc[Apache Druid] or xref:trino:index.adoc[Trino]. +This operator helps you manage your Superset instances on Kubernetes efficiently. + +== Getting started + +Get started using Superset with Stackable operator by following the xref:getting_started/index.adoc[]. +It guides you through installing the operator alongside a PostgreSQL database, connecting to your Superset instance and analyzing some preloaded example data. + +== Operator model + +The operator manages two {crs}[custom resources]: The _SupersetCluster_ and _DruidConnection_. +It creates a number of different Kubernetes resources based on the custom resources. + +=== Custom resources + +The SupersetCluster is the main resource for the configuration of the Superset instance. +The resource defines only one xref:concepts:roles-and-role-groups.adoc[role], the `node`. +The various configuration options are explained in the xref:usage-guide/index.adoc[]. +It helps you tune your cluster to your needs by configuring xref:usage-guide/storage-resource-configuration.adoc[resource usage], xref:usage-guide/security.adoc[security], xref:usage-guide/logging.adoc[logging] and more. + +DruidConnection resources link a Superset and Druid instance. +It lets you define this connection in the familiar way of deploying a resource (instead of configuring the connection via the Superset UI or API). +The operator configures the connection between Druid and the Superset instance. + +=== Kubernetes resources + +Based on the custom resources you define, the operator creates ConfigMaps, StatefulSets and Services. + +image::superset_overview.drawio.svg[A diagram depicting the Kubernetes resources created by the operator] + +The diagram above depicts all the Kubernetes resources created by the operator, and how they relate to each other. +The Job created for the DruidConnnection resource is not shown. + +For every xref:concepts:roles-and-role-groups.adoc#_role_groups[role group] you define, the operator creates a StatefulSet with the amount of replicas defined in the RoleGroup. +Every Pod in the StatefulSet has two containers: the main container running Superset and a sidecar container gathering metrics for xref:operators:monitoring.adoc[]. +The operator creates a Service for the `node` role as well as a single service per role group. + +Additionally, a ConfigMap is created for each RoleGroup. +These ConfigMaps contains two files: `log_config.py` and `superset_config.py` which contain logging and general Superset configuration respectively. + +== Required external component: Metastore SQL database + +Superset requires an SQL database in which to store its metadata, dashboards and users. +The xref:getting_started/index.adoc[] guides you through installing an example database with a Superset instance that you can use to get started, but is not suitable for production use. +Follow the setup instructions for one of the xref:required-external-components.adoc[supported databases] for a production database. + +== Connecting to data sources + +Superset does not store its own data, instead it connects to other products where data is stored. +On the Stackable Platform the two commonly used choices are xref:druid:index.adoc[Apache Druid] and xref:trino:index.adoc[Trino]. +For Druid there is a way to xref:usage-guide/connecting-druid.adoc[connect a Druid instance declaratively] with a custom resource. +For Trino this is on the roadmap. +Have a look at the demos linked <> for examples of using Superset with Druid or Trino. + +== [[demos]]Demos + +Many of the Stackable xref:demos:index.adoc[demos] use Superset in the stack for data visualization and explaration. +The demos come in two main variants. + +=== With Druid + +The xref:demos:nifi-kafka-druid-earthquake-data.adoc[] and xref:demos:nifi-kafka-druid-water-level-data.adoc[] demos +show Superset connected to xref:druid:index.adoc[Druid], exploring earthquake and water level data respectively. + +=== With Trino + +The xref:demos:spark-k8s-anomaly-detection-taxi-data.adoc[], xref:demos:trino-taxi-data.adoc[], xref:demos:trino-iceberg.adoc[] and xref:demos:data-lakehouse-iceberg-trino-spark.adoc[] demos all use a xref:trino:index.adoc[Trino] instance on top of S3 storage that hold data to analyze. Superset is connected to Trino to analyze a variety of different datasets. + +== Supported versions + +The Stackable operator for Apache Superset currently supports the Superset versions listed below. +To use a specific Superset version in your SupersetCluster, you have to specify an image - this is explained in the xref:concepts:product-image-selection.adoc[] documentation. +The operator also supports running images from a custom registry or running entirely customized images; both of these cases are explained under xref:concepts:product-image-selection.adoc[] as well. + +include::partial$supported-versions.adoc[] + +== Useful links + +* The {github}[superset-operator {external-link-icon}^] GitHub repository +* The operator feature overview in the {feature-tracker}[feature tracker {external-link-icon}^] +* The {crd-supersetcluster}[SupersetCluster {external-link-icon}^] CRD documentation diff --git a/docs/modules/opensearch/pages/reference/commandline-parameters.adoc b/docs/modules/opensearch/pages/reference/commandline-parameters.adoc new file mode 100644 index 0000000..964229a --- /dev/null +++ b/docs/modules/opensearch/pages/reference/commandline-parameters.adoc @@ -0,0 +1,31 @@ += Command Line Parameters + +This operator accepts the following command line parameters: + +== product-config + +*Default value*: `/etc/stackable/superset-operator/config-spec/properties.yaml` + +*Required*: false + +*Multiple values:* false + +[source] +---- +stackable-superset-operator run --product-config /foo/bar/properties.yaml +---- + +== watch-namespace + +*Default value*: All namespaces + +*Required*: false + +*Multiple values:* false + +The operator will **only** watch for resources in the provided namespace `test`: + +[source] +---- +stackable-superset-operator run --watch-namespace test +---- diff --git a/docs/modules/opensearch/pages/reference/crds.adoc b/docs/modules/opensearch/pages/reference/crds.adoc new file mode 100644 index 0000000..b4dad8e --- /dev/null +++ b/docs/modules/opensearch/pages/reference/crds.adoc @@ -0,0 +1,3 @@ += CRD Reference + +Find all CRD reference for the Stackable Operator for Apache Superset at: {crd-docs-base-url}/superset-operator/{crd-docs-version}. diff --git a/docs/modules/opensearch/pages/reference/environment-variables.adoc b/docs/modules/opensearch/pages/reference/environment-variables.adoc new file mode 100644 index 0000000..7f46bf8 --- /dev/null +++ b/docs/modules/opensearch/pages/reference/environment-variables.adoc @@ -0,0 +1,89 @@ += Environment variables + +This operator accepts the following environment variables: + +== KUBERNETES_CLUSTER_DOMAIN + +*Default value*: cluster.local + +*Required*: false + +*Multiple values*: false + +This instructs the operator, which value it should use for the Kubernetes `clusterDomain` setting. +Make sure to keep this in sync with whatever setting your cluster uses. +Please see the documentation xref:guides:kubernetes-cluster-domain.adoc[on configuring the Kubernetes cluster domain] for more information on this feature. + +[source] +---- +export KUBERNETES_CLUSTER_DOMAIN=mycluster.local +cargo run -- run +---- + +or via docker: + +[source] +---- +docker run \ +--name superset-operator \ +--network host \ +--env KUBECONFIG=/home/stackable/.kube/config \ +--env KUBERNETES_CLUSTER_DOMAIN=mycluster.local \ +--mount type=bind,source="$HOME/.kube/config",target="/home/stackable/.kube/config" \ +oci.stackable.tech/sdp/superset-operator:0.0.0-dev +---- + +== PRODUCT_CONFIG + +*Default value*: `/etc/stackable/superset-operator/config-spec/properties.yaml` + +*Required*: false + +*Multiple values*: false + +[source] +---- +export PRODUCT_CONFIG=/foo/bar/properties.yaml +stackable-superset-operator run +---- + +or via docker: + +---- +docker run \ + --name superset-operator \ + --network host \ + --env KUBECONFIG=/home/stackable/.kube/config \ + --env PRODUCT_CONFIG=/my/product/config.yaml \ + --mount type=bind,source="$HOME/.kube/config",target="/home/stackable/.kube/config" \ + oci.stackable.tech/sdp/superset-operator:0.0.0-dev +---- + +== WATCH_NAMESPACE + +*Default value*: All namespaces + +*Required*: false + +*Multiple values*: false + +The operator will **only** watch for resources in the provided namespace `test`: + +[source] +---- +export WATCH_NAMESPACE=test +stackable-superset-operator run +---- + +or via docker: + +[source] +---- +docker run \ +--name superset-operator \ +--network host \ +--env KUBECONFIG=/home/stackable/.kube/config \ +--env WATCH_NAMESPACE=test \ +--mount type=bind,source="$HOME/.kube/config",target="/home/stackable/.kube/config" \ +oci.stackable.tech/sdp/superset-operator:0.0.0-dev +---- diff --git a/docs/modules/opensearch/pages/reference/index.adoc b/docs/modules/opensearch/pages/reference/index.adoc new file mode 100644 index 0000000..3cfa028 --- /dev/null +++ b/docs/modules/opensearch/pages/reference/index.adoc @@ -0,0 +1,6 @@ += Reference + +Consult the reference documentation section to find exhaustive information on: + +* Descriptions and default values of all properties in the CRDs used by this operator in the xref:reference/crds.adoc[]. +* The xref:reference/commandline-parameters.adoc[] and xref:reference/environment-variables.adoc[] accepted by the operator. diff --git a/docs/modules/opensearch/pages/required-external-components.adoc b/docs/modules/opensearch/pages/required-external-components.adoc new file mode 100644 index 0000000..d6841c2 --- /dev/null +++ b/docs/modules/opensearch/pages/required-external-components.adoc @@ -0,0 +1,10 @@ += Required external components +:description: Superset requires an SQL database for metadata storage. Supported databases include PostgreSQL and MySQL. + +Superset uses an SQL database to store metadata. +The supported databases and versions are: + +* PostgreSQL 10, 11, 12, 13, 14, 15 +* MySQL 5.7, 8.x + +Reference: https://superset.apache.org/docs/configuration/configuring-superset/#setting-up-a-production-metadata-database[Superset documentation] diff --git a/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc b/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc new file mode 100644 index 0000000..1bead95 --- /dev/null +++ b/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc @@ -0,0 +1,120 @@ += Configuration & Environment Overrides + +The cluster definition also supports overriding configuration properties and environment variables, +either per role or per role group, where the more specific override (role group) has precedence over +the less specific one (role). + +IMPORTANT: Overriding certain properties which are set by the operator (such as the `STATS_LOGGER`) can interfere with the operator and can lead to problems. + +== Configuration Properties + +For a role or role group, at the same level of `config`, you can specify `configOverrides` for the `superset_config.py`. +For example, if you want to set the CSV export encoding and the preferred databases adapt the `nodes` section of the cluster resource as follows: + +[source,yaml] +---- +nodes: + roleGroups: + default: + config: {} + configOverrides: + superset_config.py: + CSV_EXPORT: "{'encoding': 'utf-8'}" + PREFERRED_DATABASES: |- + [ + 'PostgreSQL', + 'Presto', + 'MySQL', + 'SQLite', + # etc. + ] +---- + +Just as for the `config`, it is possible to specify this at the role level as well: + +[source,yaml] +---- +nodes: + configOverrides: + superset_config.py: + CSV_EXPORT: "{'encoding': 'utf-8'}" + PREFERRED_DATABASES: |- + [ + 'PostgreSQL', + 'Presto', + 'MySQL', + 'SQLite', + # etc. + ] + roleGroups: + default: + config: {} +---- + +All override property values must be strings. +They are treated as Python expressions. +So care must be taken to produce a valid configuration. + +For a full list of configuration options we refer to the +https://github.com/apache/superset/blob/master/superset/config.py[main config file for Superset]. + +As Superset can be configured with python code too, arbitrary code can be added to the `superset_conf.py`. +You can use either `EXPERIMENTAL_FILE_HEADER` to add code to the top or `EXPERIMENTAL_FILE_FOOTER` to add to the bottom. + +IMPORTANT: This is an experimental feature + +[source,yaml] +---- +nodes: + configOverrides: + superset_config.py: + CSV_EXPORT: "{'encoding': 'utf-8'}" + EXPERIMENTAL_FILE_HEADER: | + from modules.my_module import my_class + EXPERIMENTAL_FILE_FOOTER: | + import logging + from superset.security import SupersetSecurityManager + + class myCustomSecurityManger(SupersetSecurityManager): + def __init__(): + init() + + CUSTOM_SECURITY_MANAGER = myCustomSecurityManger + roleGroups: + default: + config: {} +---- + +== Environment Variables + +In a similar fashion, environment variables can be (over)written. +For example per role group: + +[source,yaml] +---- +nodes: + roleGroups: + default: + config: {} + envOverrides: + FLASK_ENV: development +---- + +or per role: + +[source,yaml] +---- +nodes: + envOverrides: + FLASK_ENV: development + roleGroups: + default: + config: {} +---- + +// cliOverrides don't make sense for this operator, so the feature is omitted for now + +== Pod overrides + +The Superset operator also supports Pod overrides, allowing you to override any property that you can set on a Kubernetes Pod. +Read the xref:concepts:overrides.adoc#pod-overrides[Pod overrides documentation] to learn more about this feature. diff --git a/docs/modules/opensearch/pages/usage-guide/connecting-druid.adoc b/docs/modules/opensearch/pages/usage-guide/connecting-druid.adoc new file mode 100644 index 0000000..b930881 --- /dev/null +++ b/docs/modules/opensearch/pages/usage-guide/connecting-druid.adoc @@ -0,0 +1,42 @@ += Connecting Apache Druid clusters +:description: Connect Apache Superset to Apache Druid on the Stackable Data Platform using the DruidConnection CustomResource. +:keywords: Stackable, SDP, Druid, Superset, database, connection +:k8s-job: https://kubernetes.io/docs/concepts/workloads/controllers/job/ +:k8s-network-policies: https://kubernetes.io/docs/concepts/services-networking/network-policies/ + +The operator can automatically connect Superset clusters that it manages to Apache Druid clusters managed by the xref:druid:index.adoc[Stackable operator for Apache Druid]. + +To do so, create a _DruidConnection_ resource: + +[source,yaml] +---- +apiVersion: superset.stackable.tech/v1alpha1 +kind: DruidConnection +metadata: + name: superset-druid-connection +spec: + superset: # <1> + name: superset + namespace: default + druid: # <2> + name: druid + namespace: default + +---- + +<1> The `name` and `namespace` in `spec.superset` refer to the Superset cluster that you want to connect. Following our example above, the name is `superset`. +<2> In `spec.druid` you specify the `name` and `namespace` of your Druid cluster. Following our example above, the name is `druid`. + +The `namespace` part is optional in both cases; if it is omitted it will default to the namespace of the DruidConnection. + +Once Superset startup is complete and the database is initialized, the Superset operator will create a {k8s-job}[Job] that will connect to the Superset cluster to run an import command to add the Druid cluster as a datasource. + +IMPORTANT: The Job is connecting to the Superset Pods. If you are restricting network traffic in your Kubernetes cluster, make sure to configure a {k8s-network-policies}[NetworkPolicy] that allows the Job to connect to Superset. + +Once the Job is completed you can see the Druid cluster as a database in the user interface under Data > Databases: + +image::superset-databases.png[Superset databases showing the connected Druid cluster] + +== Further reading + +Read the CRD reference for the {crd-docs}/superset.stackable.tech/druidconnection/v1alpha1/[DruidConnection {external-link-icon}^] CustomResource. diff --git a/docs/modules/opensearch/pages/usage-guide/index.adoc b/docs/modules/opensearch/pages/usage-guide/index.adoc new file mode 100644 index 0000000..8d5d8be --- /dev/null +++ b/docs/modules/opensearch/pages/usage-guide/index.adoc @@ -0,0 +1,9 @@ += Usage guide +:page-aliases: usage.doc +:description: Superset usage guide: configure resources, connect to Apache Druid, set up authentication, logging, and monitoring. + +The usage guide covers various aspects of configuring Superset and interconnection with other tools. + +Learn about defining the amount of xref:usage-guide/storage-resource-configuration.adoc[resources] Superset uses or learn how to xref:usage-guide/connecting-druid.adoc[connect to Apache Druid] operated by the xref:druid:index.adoc[]. + +Configure xref:usage-guide/security.adoc#authentication[authentication] with LDAP and xref:usage-guide/security.adoc#authorization[authorization]. Observe your Superset instance with xref:usage-guide/logging.adoc[log aggregation] and xref:usage-guide/monitoring.adoc[monitoring]. diff --git a/docs/modules/opensearch/pages/usage-guide/listenerclass.adoc b/docs/modules/opensearch/pages/usage-guide/listenerclass.adoc new file mode 100644 index 0000000..97eabd4 --- /dev/null +++ b/docs/modules/opensearch/pages/usage-guide/listenerclass.adoc @@ -0,0 +1,15 @@ += Service exposition with ListenerClasses +:description: Configure the Superset service exposure with listener classes: cluster-internal, external-unstable, or external-stable. + +Apache Superset offers a web UI and an API. +The operator deploys a xref:listener-operator:listener.adoc[Listener] for the Nodes pod. +The listener defaults to only being accessible from within the Kubernetes cluster, but this can be changed by setting `.spec.nodes.roleConfig.listenerClass`: + +[source,yaml] +---- +spec: + nodes: + roleConfig: + listenerClass: external-stable # <1> +---- +<1> Specify one of `external-stable`, `external-unstable`, `cluster-internal` at role-level (the default setting is `cluster-internal`). diff --git a/docs/modules/opensearch/pages/usage-guide/logging.adoc b/docs/modules/opensearch/pages/usage-guide/logging.adoc new file mode 100644 index 0000000..bffb700 --- /dev/null +++ b/docs/modules/opensearch/pages/usage-guide/logging.adoc @@ -0,0 +1,17 @@ += Log aggregation +:description: The logs can be forwarded to a Vector log aggregator by providing a discovery ConfigMap for the aggregator and by enabling the log agent. + +The logs can be forwarded to a Vector log aggregator by providing a discovery ConfigMap for the aggregator and by enabling the log agent: + +[source,yaml] +---- +spec: + clusterConfig: + vectorAggregatorConfigMapName: vector-aggregator-discovery + nodes: + config: + logging: + enableVectorAgent: true +---- + +Further information on how to configure logging, can be found in xref:concepts:logging.adoc[]. diff --git a/docs/modules/opensearch/pages/usage-guide/monitoring.adoc b/docs/modules/opensearch/pages/usage-guide/monitoring.adoc new file mode 100644 index 0000000..9ffc16a --- /dev/null +++ b/docs/modules/opensearch/pages/usage-guide/monitoring.adoc @@ -0,0 +1,5 @@ += Monitoring +:description: The managed Superset instances are automatically configured to export Prometheus metrics. + +The managed Superset instances are automatically configured to export Prometheus metrics. +See xref:operators:monitoring.adoc[] for more details. diff --git a/docs/modules/opensearch/pages/usage-guide/operations/cluster-operations.adoc b/docs/modules/opensearch/pages/usage-guide/operations/cluster-operations.adoc new file mode 100644 index 0000000..4b869e6 --- /dev/null +++ b/docs/modules/opensearch/pages/usage-guide/operations/cluster-operations.adoc @@ -0,0 +1,4 @@ += Cluster Operation + +Superset installations can be configured with different cluster operations like pausing reconciliation or stopping the +cluster. See xref:concepts:operations/cluster_operations.adoc[cluster operations] for more details. diff --git a/docs/modules/opensearch/pages/usage-guide/operations/graceful-shutdown.adoc b/docs/modules/opensearch/pages/usage-guide/operations/graceful-shutdown.adoc new file mode 100644 index 0000000..9faefed --- /dev/null +++ b/docs/modules/opensearch/pages/usage-guide/operations/graceful-shutdown.adoc @@ -0,0 +1,20 @@ += Graceful shutdown + +You can configure the graceful shutdown as described in xref:concepts:operations/graceful_shutdown.adoc[]. + +== Nodes + +As a default, Superset nodes have `2 minutes` to shut down gracefully. + +The Superset node process will receive a `SIGTERM` signal when Kubernetes wants to terminate the Pod. +It will log the received signal as shown in the log below and initiate a graceful shutdown. +After the graceful shutdown timeout runs out, and the process still didn't exit, Kubernetes will issue a `SIGKILL` signal. + +[source,text] +---- +superset [2023-11-08 13:14:39 +0000] [206] [INFO] Handling signal: term +metrics ts=2023-11-08T13:14:39.818Z caller=main.go:553 level=info msg="Received os signal, exiting" signal=terminated +superset [2023-11-08 13:14:39 +0000] [207] [INFO] Worker exiting (pid: 207) +superset Loaded your LOCAL configuration at [/stackable/app/pythonpath/superset_config.py] +superset [2023-11-08 13:14:40 +0000] [206] [INFO] Shutting down: Master +---- diff --git a/docs/modules/opensearch/pages/usage-guide/operations/index.adoc b/docs/modules/opensearch/pages/usage-guide/operations/index.adoc new file mode 100644 index 0000000..21d170f --- /dev/null +++ b/docs/modules/opensearch/pages/usage-guide/operations/index.adoc @@ -0,0 +1,5 @@ += Operations + +This section of the documentation is intended for the operations teams that maintain a Stackable Data Platform installation. + +Please read the xref:concepts:operations/index.adoc[Concepts page on Operations] that contains the necessary details to operate the platform in a production environment. diff --git a/docs/modules/opensearch/pages/usage-guide/operations/pod-disruptions.adoc b/docs/modules/opensearch/pages/usage-guide/operations/pod-disruptions.adoc new file mode 100644 index 0000000..70e2139 --- /dev/null +++ b/docs/modules/opensearch/pages/usage-guide/operations/pod-disruptions.adoc @@ -0,0 +1,8 @@ += Allowed Pod disruptions + +You can configure the permitted Pod disruptions for Superset nodes as described in xref:concepts:operations/pod_disruptions.adoc[]. + +Unless you configure something else or disable the provided PodDisruptionBudgets (PDBs), the following PDBs are written: + +== Nodes +The provided PDBs only allow a single node to be offline at any given time, regardless of the number of replicas or `roleGroups`. diff --git a/docs/modules/opensearch/pages/usage-guide/operations/pod-placement.adoc b/docs/modules/opensearch/pages/usage-guide/operations/pod-placement.adoc new file mode 100644 index 0000000..83b6120 --- /dev/null +++ b/docs/modules/opensearch/pages/usage-guide/operations/pod-placement.adoc @@ -0,0 +1,7 @@ += Pod Placement + +You can configure the Pod placement of the Superset pods as described in xref:concepts:operations/pod_placement.adoc[]. + +The default affinities created by the operator are: + +1. Distribute all the Superset Pods (weight 70) diff --git a/docs/modules/opensearch/pages/usage-guide/security.adoc b/docs/modules/opensearch/pages/usage-guide/security.adoc new file mode 100644 index 0000000..07e93ec --- /dev/null +++ b/docs/modules/opensearch/pages/usage-guide/security.adoc @@ -0,0 +1,241 @@ += Security +:description: Superset security: configure authentication via database, LDAP, or OpenID Connect with roles-based authorization for user access control. +:superset-roles: https://superset.apache.org/docs/security/#roles +:superset-security: https://superset.apache.org/docs/security +:keycloak: https://www.keycloak.org/ + +== [[authentication]]Authentication + +Every user has to be authenticated before using Superset: +there are several ways in which this can be set up. + +[IMPORTANT] +.Multiple authentication methods +==== +Only one authentication method is supported at a time, and in case of LDAP, only one authentication class is allowed. +This means, it is not possible to configure both LDAP and OIDC authentication methods at the same time, but *it is* possible to configure multiple OIDC classes *or* one LDAP authentication class. +==== + +=== Superset database + +The default setting is to manually set up users via the web interface where they are stored in the database attached to Superset. + +=== LDAP + +Superset supports xref:concepts:authentication.adoc[authentication] of users against a single LDAP server. +This requires setting up an AuthenticationClass for the LDAP server. +The AuthenticationClass is then referenced in the SupersetCluster resource as follows: + +[source,yaml] +---- +apiVersion: superset.stackable.tech/v1alpha1 +kind: SupersetCluster +metadata: + name: superset-with-ldap-server +spec: + image: + productVersion: 4.1.2 + clusterConfig: + authentication: + - authenticationClass: ldap # <1> + userRegistrationRole: Admin # <2> +---- + +<1> The reference to an AuthenticationClass called `ldap` +<2> The default role to which all users are assigned + +Users that log in with LDAP are assigned to a default {superset-roles}[Role^{external-link-icon}^] which is specified with the `userRegistrationRole` property. + +You can follow the xref:tutorials:authentication_with_openldap.adoc[] tutorial to learn how to set up an AuthenticationClass for an LDAP server, as well as consulting the xref:concepts:authentication.adoc#_ldap[AuthenticationClass concepts page]. + +=== [[oidc]]OpenID Connect + +An OpenID Connect provider can be used for authentication. +Unfortunately, there is no generic support for OpenID Connect built into Superset. +This means that only specific OpenID Connect providers can be configured. + +IMPORTANT: Superset deployments on the Stackable Data Platform only support {keycloak}[Keycloak^{external-link-icon}^]. + +[source,yaml] +---- +apiVersion: superset.stackable.tech/v1alpha1 +kind: SupersetCluster +metadata: + name: superset-with-oidc +spec: + image: + productVersion: 4.1.2 + clusterConfig: + authentication: + - authenticationClass: keycloak # <1> + oidc: + clientCredentialsSecret: superset-keycloak-client # <2> + userRegistrationRole: Gamma # <3> +---- + +<1> The reference to an AuthenticationClass called `keycloak` +<2> The reference to the Secret containing the Superset client credentials +<3> The default role to which all users are assigned + +Users that log in with OpenID Connect are assigned to a default {superset-roles}[Role^{external-link-icon}^] which is specified with the `userRegistrationRole` property. + +The Secret containing the Superset client credentials: + +[source,yaml] +---- +apiVersion: v1 +kind: Secret +metadata: + name: superset-keycloak-client +stringData: + clientId: superset # <1> + clientSecret: superset_client_secret # <2> +---- + +<1> The client ID of Superset as defined in Keycloak +<2> The client secret as defined in Keycloak + +A minimum client configuration in Keycloak for this example looks like this: + +[source,json] +---- +{ + "clientId": "superset", + "enabled": true, + "clientAuthenticatorType": "client-secret", # <1> + "secret": "superset_client_secret", + "redirectUris": [ + "*" + ], + "webOrigins": [ + "*" + ], + "standardFlowEnabled": true, # <2> + "protocol": "openid-connect" # <3> +} +---- + +<1> Sets the OIDC type to confidential access type. +<2> Enables the OAuth2 "Authorization Code Flow". +<3> Enables OpenID Connect and OAuth2 support. + +Further information for specifying an AuthenticationClass for an OIDC provider can be found at the xref:concepts:authentication.adoc#_oidc[concepts page]. + +== [[authorization]]Authorization + +Superset has a concept called `Roles` which allows you to grant user permissions based on roles. +Have a look at the {superset-security}[Superset documentation on Security^{external-link-icon}^]. + +[opa] +=== OPA role mapping + +Stackable ships a custom security manager that makes it possible to assign roles to users via the Open Policy Agent integration. +The roles must exist in the Superset database before they can be assigned to users. +If a role is not present in the Superset database, an error will be logged by the security manager and the user login will proceed without it. +Also the role names must match exactly the output of the Rego rule named `user_roles`. +In the following example, a rego package is defined that assigns roles to the users `admin` and `guest`. + +[source,yaml] +---- +apiVersion: v1 +kind: ConfigMap +metadata: + name: superset-opa-regorules + labels: + opa.stackable.tech/bundle: "true" +data: + roles.rego: | + package superset + + default user_roles := [] + + user_roles := roles if { + some user in users + roles := user.roles + user.username == input.username + } + users := [ + {"username": "admin", "roles": ["Admin", "Test"]}, #<1> + {"username": "guest", "roles": ["Gamma"]} #<2> + ] +---- + +<1> Assign the roles `Admin` and `Test` to the `admin` user. The `Test` role is not a standard Superset role and must be created before the assignment. +<2> Assign the `Gamma` role to the `guest` user. + +OPA rules can make use of the xref:opa:usage-guide:user-info-fetcher[user-info-fetcher] integration. + +The following snippet shows how to use the OPA security manager in a Superset stacklet. + +[source,yaml] +---- +apiVersion: superset.stackable.tech/v1alpha1 +kind: SupersetCluster +metadata: + name: superset-with-opa-role-mapping +spec: + clusterConfig: + authorization: + roleMappingFromOpa: + configMapName: superset-opa-regorules # <1> + package: superset + cache: # <2> + entryTimeToLive: 10s # <3> + maxEntries: 5 # <4> +---- + +<1> ConfigMap name containing rego rules +<2> Mandatory Opa caching. If not set, default settings apply. +<3> Time for cached entries per user can live. Defaults to 30s. +<4> Number of maximum entries, defaults to 1000. Cache will be disabled for maxEntries: 0. + +IMPORTANT: Any role assignments done in the Superset UI are discarded and will be overridden by the OPA security manager. + +=== Superset database + +You can view all the available roles in the web interface of Superset and can also assign users to these roles. + +=== LDAP + +Superset supports assigning {superset-roles}[Roles^{external-link-icon}^] to users based on their LDAP group membership, though this is not yet supported by the Stackable operator. +All the users logging in via LDAP get assigned to the same role which you can configure via the attribute `authentication[*].userRegistrationRole` on the `SupersetCluster` object: + +[source,yaml] +---- +apiVersion: superset.stackable.tech/v1alpha1 +kind: SupersetCluster +metadata: + name: superset-with-ldap-server +spec: + clusterConfig: + authentication: + - authenticationClass: ldap + userRegistrationRole: Admin # <1> +---- + +<1> All users are assigned to the `Admin` role + +=== OpenID Connect + +The mechanism for assigning roles to users described in the LDAP section also applies to OpenID Connect. +Superset supports assigning {superset-roles}[Roles^{external-link-icon}^] to users based on their OpenID Connect scopes, though this is not yet supported by the Stackable operator. +All the users logging in via OpenID Connect get assigned to the same role which you can configure via the attribute `authentication[*].userRegistrationRole` on the `SupersetCluster` object: + +[source,yaml] +---- +apiVersion: superset.stackable.tech/v1alpha1 +kind: SupersetCluster +metadata: + name: superset-with-oidc +spec: + image: + productVersion: 4.1.2 + clusterConfig: + authentication: + - authenticationClass: keycloak + oidc: + clientCredentialsSecret: superset-keycloak-client + userRegistrationRole: Gamma # <1> +---- + +<1> All users are assigned to the `Gamma` role diff --git a/docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc b/docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc new file mode 100644 index 0000000..5e1e1d3 --- /dev/null +++ b/docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc @@ -0,0 +1,31 @@ += Storage and resource configuration +:description: Superset resource configuration: default CPU and memory requests for HA setup with guidance for adapting production resource needs. + +== Resource Requests + +include::concepts:stackable_resource_requests.adoc[] + +A minimal HA setup consisting of 2 Superset instances has the following +https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/[resource requirements]: + +* `1300m` CPU request +* `3800m` CPU limit +* `2384Mi` memory request and limit + +Corresponding to the values above, the operator uses the following resource defaults: + +[source,yaml] +---- +nodes: + roleGroups: + default: + config: + resources: + cpu: + min: '300m' + max: "1200m" + memory: + limit: '1000Mi' +---- + +WARNING: The default values are _most likely_ not sufficient to run a production cluster. Please adapt according to your requirements. diff --git a/docs/modules/opensearch/partials/nav.adoc b/docs/modules/opensearch/partials/nav.adoc new file mode 100644 index 0000000..4b41932 --- /dev/null +++ b/docs/modules/opensearch/partials/nav.adoc @@ -0,0 +1,23 @@ +* xref:superset:getting_started/index.adoc[] +** xref:superset:getting_started/installation.adoc[] +** xref:superset:getting_started/first_steps.adoc[] +* xref:superset:required-external-components.adoc[] +* xref:superset:usage-guide/index.adoc[] +** xref:superset:usage-guide/listenerclass.adoc[] +** xref:superset:usage-guide/storage-resource-configuration.adoc[] +** xref:superset:usage-guide/security.adoc[] +** xref:superset:usage-guide/connecting-druid.adoc[] +** xref:superset:usage-guide/monitoring.adoc[] +** xref:superset:usage-guide/logging.adoc[] +** xref:superset:usage-guide/configuration-environment-overrides.adoc[] +** xref:superset:usage-guide/operations/index.adoc[] +*** xref:superset:usage-guide/operations/cluster-operations.adoc[] +*** xref:superset:usage-guide/operations/pod-placement.adoc[] +*** xref:superset:usage-guide/operations/pod-disruptions.adoc[] +*** xref:superset:usage-guide/operations/graceful-shutdown.adoc[] +* xref:superset:reference/index.adoc[] +** xref:superset:reference/crds.adoc[] +*** {crd-docs}/superset.stackable.tech/supersetcluster/v1alpha1/[SupersetCluster {external-link-icon}^] +*** {crd-docs}/superset.stackable.tech/druidconnection/v1alpha1/[DruidConnection {external-link-icon}^] +** xref:superset:reference/commandline-parameters.adoc[] +** xref:superset:reference/environment-variables.adoc[] diff --git a/docs/modules/opensearch/partials/supported-versions.adoc b/docs/modules/opensearch/partials/supported-versions.adoc new file mode 100644 index 0000000..8fc31ec --- /dev/null +++ b/docs/modules/opensearch/partials/supported-versions.adoc @@ -0,0 +1,7 @@ +// The version ranges supported by Superset-Operator +// This is a separate file, since it is used by both the direct Superset documentation, and the overarching +// Stackable Platform documentation. + +- 4.1.2 +- 4.1.1 (deprecated) +- 4.0.2 (LTS) diff --git a/docs/templating_vars.yaml b/docs/templating_vars.yaml new file mode 100644 index 0000000..bc1c3b3 --- /dev/null +++ b/docs/templating_vars.yaml @@ -0,0 +1,9 @@ +--- +helm: + repo_name: sdp-charts + repo_url: oci.stackable.tech +versions: + commons: 0.0.0-dev + secret: 0.0.0-dev + listener: 0.0.0-dev + superset: 0.0.0-dev From d42cc250bdae5a26dd9ad123d52827bc1ed8c940 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Fri, 18 Jul 2025 11:34:41 +0200 Subject: [PATCH 02/18] Adapt docs/modules/opensearch/pages/index.adoc --- .../getting_started/superset-dashboard.png | Bin 75125 -> 0 bytes .../getting_started/superset-databases.png | Bin 46205 -> 0 bytes .../images/getting_started/superset-login.png | Bin 21493 -> 0 bytes .../images/opensearch_overview.drawio.svg | 4 + .../opensearch/images/superset-databases.png | Bin 46205 -> 0 bytes .../images/superset_overview.drawio.svg | 4 - docs/modules/opensearch/pages/index.adoc | 81 +++++------------- .../partials/supported-versions.adoc | 8 +- docs/templating_vars.yaml | 2 +- 9 files changed, 31 insertions(+), 68 deletions(-) delete mode 100644 docs/modules/opensearch/images/getting_started/superset-dashboard.png delete mode 100644 docs/modules/opensearch/images/getting_started/superset-databases.png delete mode 100644 docs/modules/opensearch/images/getting_started/superset-login.png create mode 100644 docs/modules/opensearch/images/opensearch_overview.drawio.svg delete mode 100644 docs/modules/opensearch/images/superset-databases.png delete mode 100644 docs/modules/opensearch/images/superset_overview.drawio.svg diff --git a/docs/modules/opensearch/images/getting_started/superset-dashboard.png b/docs/modules/opensearch/images/getting_started/superset-dashboard.png deleted file mode 100644 index fa668ae6cb114ae9f783488496775aa08739b1e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75125 zcmbrmWl$Vl)HOP|2Z9C&7Tg_zySuvv*WfNe6ExW1?hNh>mW1H$4hin=`gNYS?vJnP zt^4ENQ^gdur@K$j^f_DBT6?~!D$8J?5}|@XAPhNKNp%nijvNGn)kTH{EO@whv>*^n zn5~3_s+@!b`Da&WD_aLk5Qr`zAVEmBNA!KKiH6i<)K`+Ij}~Rh_>xlZn^2|7uQw_+4o+C4?*7pVV8V(0K?pv_*70W8T1x ztQ1o;11i4;LW=xh^QC@1U~P4EZMoYzRKNKOS>Xn{*p%YD!|k57(pjfIxDI@M06_hkK@EY~E>p0e&D;y+0rD zhr8YwOioTlVv+^koly+eS3F|FizQMG*DozCIW9LJ&sAl{#f`Odf)C`{xOefZlXw67 zU|k_dn53G}a0qW_cStXFnoK-tm2oFOFRxC%>StT&lo8zsGdfZ&ZEWKrL44+YBV3WH zg!BmAky<90AIu$Ir)z~W@vy<_<(ig-^Iq0^U`sSq)Uhl+93mqAz^6Mz3?j|cI$f~V z>X;CRlp5ZrmD^~vIHqA&gMVLZ{^`6QgRbFcpR2ve4xh`Rp&{fD)olXOltQ!Eh#RZ0AmAlGkD1fwC+O9*ydNk@=oYlLMjae*4 z?NSD5mbk92m!&5Arp87F1e$V9s98_MpFgIg@%_7(ZP#jaxFsben|-nN6L~*rEh?i> zPCvcsvxjO!hx>&~)XN1u4m4d{>O{%UZf|vTbo!0(|E=6WxH-RwBpmpD zv1{5yD*6y|S&mLe*77fW)Je5eDk!3IQHeG$XYH&zBk3eK&&k!_t2ODP3h1H=T65cE zb`Y&x5>Ed746U$BKPdM)S@C(iaRggReNa1`t7`W+)UGiW0$Xx&aNslPeoslcR@;yA z<99;H>xis2Khm%i_CC~K)RLx-Fw?};b%|Mu6r|~4>yIZBaoZXB0*6F}jdD`+-$FeW z`cykLH3ckD&k1;3DU`u{ z7d1Y?rAA>;$7E2dOk!_uA7O@#jcwfJe}DR!1#GDYF4@n^%X3$LKH(1L))aBsc4TRi_yUxyAuq6>9PR9j@U*Gd@&4h~Lr zsCtvf%If9i<+f{ESC?>nKO}i1&;M>7qEqAU?j9zdf53wMO;Slo$;6~v-I}gN)YuqU zQ(VA4{5Tg?VymPyIyI#Zyvo<1|64R7`aht4x7CU?o35AyxX2+BQ&SmiW+4y=W6KCz z#^NiNPq8FjAz`962bU7WeqW@^%=`5Nv${251Ql}glZ6BvTxh;TB(%L964Kk|w(EJc zkgrOY*KwIZ{^DSv;%K|w*`NLN%*sR6F><;xd;;au{sz(xknZeS8H|NRx%Uy{<&ZwNVx zlrnkF&(8s`5*HiG%)p?oqtnvdd~MW_mL`1%Ren{}} z->H25{tDM9RkpOU8rpV^FtZv-Gqbbf4|;jZ@Xyw}Klvl$)?nhC4b9O1#926r5otHbhg*}Vze+pj-fZ_0zPqTpL-n{)V*R+-c+X0E^}Td;sUh(2 zJX2*_;ZFJuGh84s@9$-G4A9;}6HK=tnTN9y($Cx5Z$H3-0_{G}>tb(N(d3K_=EvZq zF>mVB8DAk=QWI;;kK>Ud<61Up0?j8p7P30l0ob76xYeuS?`gu;^LK}u?J5BS9C%)h zI*}0`-TQv75<1VXpFbCGto<4*d>OO^A%|ewq%ZMa9&=W9$H%^lC*2e9QR(*eAKf*S zhe2NUxLKZ*eKHBK8!|Rt?FyW~e;mKGVIJ-~es~govi6Hr3A9%bPrb@Xc^baC7GmyR z^~qktsr^7n+2-GaSJ#>=6Zd}q;9w{v93-l!CPAz>KkLiQzyV1vCj0{38Mc{TrcD-S zXJe{mf)h=|6-xx;<2P831JNYn;tfY4)$`L65EqrRKK}Hm6Z6^qA z=$M#BhK3jz84aNB^q|kQQhmRFj{s)_dl3u^{}2t+(9)hRHtgPC?gEQ!Yb7O`5Cr``|lsq?zXt^7K=}b z8*X*Ba3S)q7uBn3VPvAY!GS*R4!H<*H{Ef%Y<dei#E z{U+0$54+BdGYQ{E&&fCugTvQ9)~R2YM^*!IjNU9rVq7rQ=BJa1tTBhBjg%`@Ja z`usq@AK~Q8xIAACd07rlG0{~YfknHR5hsLuRr+CmSujl6DqPtU+GhWv7JpV?kU zS>s4=c{b~5f_E~r8+Fu3;7)&j`ng2J4_GAX>go(}jn)ZOfcK28M>|o>A!xi zV;W9rrHe9u7tz0o0v|#l5%G?Ykc8izj)6g*CW++ZXVaxd+xz=_Vjc%oh7??>>;38e zu`#F9wNAkI+@7v?`&?QrH#@e;_dTv<@BIHFs;ttu_@9!w7Tl(M<5;b;5w(=`{X7&w@*Dx#y7?f?Sc>@ zfF@egbs$UKNYzW;ke-4$yY*8~OGAOn3A>4e$!xm>kf~97PJ;PGJ*|s6nHT%z#Xvnt zx-r_#*v*FUbXG>QgE@!!*@cpDbrAGU z@(*%}1$012BaPRwO=KVyqq8YdI@af8M!@HdyC|k+G7HD$BvQ#GYU=3BPfYv?)V5@5Gc-Snn`jZM59te0p>wX!Z-9o0}WtefH;zcs?>38Y2q}jaS+E)(j;W|w|HI0x zKy_*{5%sccP{A`?+V6e0$*pctkj)%Uug;*37_CICUn~mSV~f7j?1Sx7k`O*7QtWf_g06NPbp!7{Ue(_YLJko!$`>?f!=sd+q$lhwk6NnVx8Akm~u(@|^H zM8}Ejlm*c=$Aq8kbi&#jg1Y`L+_M|~_y>G0#^cH~$5#3LoXXMR?&{R&<*rx*rXWM* z*#lVmS*Wv*zgXZQWRs7sJb>5uKwxbfrpx|B?rNZ}yT zZ}iM$b4C|e14my(eA-$Z=KcEWmi;1|iGrHnfkYFCI(!vxJ(&$!n^2wtR;xx>uRQ%# z5EQuOpmr8sW@Z!}+`KS7Z2nQnLl)m6TcV9S^AJ9SXAue4N-83%^iOw?9$YUNL`M7#m3l(_zIy5?1%Lwd)p59T|{)<)o?}f&9dU z;}F^2o+!N_t-gVv`}h!+Q}!6^9?Tz7B7#&cw&4l&PY;=RaL@LB#k_54a3@}P&r2|L z(V!zZHfH6~mc1cu@vD!caQ684z3hJe<2Y@9S*~Nz*ke7j4DD~Kuh~J6ODpTViLPlZ zKM;rrgqx2v_EFI|$d&Z>`!u0|rKyNi9gi8Sjpq1F-$AR3`oiPNg}cz8nC!-}zfZZN z-XMqbrp>oWJ7ihv209vLgX`FK(7a2{`y&N6K}mnoOgGn?yH8Ij_T!DbsUmCK*YW9* zM92Hi*9bd>)JjX&7s71zBj0sa+dUjsr+Sr5bYFN9g@eF$8(W(D%O(17yS`DKb@c9; z{JE1^=YAz)P&;nVwKX36qsvcjrDH30K@P4sFrZ+Ln^Q-AI2vbS`wu>@7WY$iXupy0 zy~!m1P` zJybaLBVzW0KgwbYFg2Se6=}M*IWR5owWHY`dSX9BeJZJbEX>ij+B+$3ph?WUL5JM# zWPVlA3{>f?vrH#Yp?P6H9dPdnF@VsHdB}!dM(^siCe8 z6odyeBWW4y;bM61ZO^6 z!{Ya0#e$@)f`W$J$vJ5FE1$i~KHG{{2VsE1#La->2}nwkQd7O2AFe}@Fu^G);bCEh z-GQsi%k5JmZ(f^U4W+4r!C$n(zpSzb@5{0dG zdK~F7Xdz6)i16^ZxVVN;cR8A*RiLH=>Qn*GBb&*B-deMsn3$L%b^3X202neeGpp#3 zRm0^Cu|wUOYM{h%i3hz+`XuAFV52A4GG^TY^h$ZGhmU_~82a}JkX${{r< zlEhl}Z=zNm2q-sUC4%NWc`i|NV|=yQRzy|if9=%2g-{kDgK!iiPRs5h5fsVTQ9#My zpB6}t2C$%oiLeoZ67ce&?I9>Q;{GV{!}`L!^VpSoasC%&P9xoe& zknT|VYx0^>tZ{d~w>V5ZIpG)8AEltZrx^4$pS;q-bW(&W+9M3BnVGH$hu5Mn<5`_0 z*0-kubsj^__hEXR-C~7-kBefNrp467dHL6K-!=0~XjIf0?kl0#mb~7F={c|@%)+3( z>%A4z*KcL$CExIFjqN#1eQT`r;e!{$7Ht!rjq5fMp`d@kik?Q32yj(+-ShhjdTI7-9nqGu$K zOj_O_DyAm%Hk?crR42SK+Y$&cAr`0eAJ?r`vHyPiK8A?L;SR{FqTDdp(1C0&L*(_T zVdG=|-Q67qF%K0L)n^?-Dr8eVa=Iu6<}uriB!l&AR(iyc4oRDvPSTdVy0+{uJjp8R zSOf$u&g;TjT8h`*+1c3@zooDwWo2b`b>9uw132Qg^6m8W^yb*na)%FR?s(AMS$<1P z%K^V29&L6_bzX5snmo5$XGR85eE;UjLWLHipPyewNt;L=69gzfQLQWXD_hCJ#Qy@@ z1L|?;xjU9^J)RRD8A*VL_wN-Kw^Fw*1kDUIQKCc)jM+1v2s0qGGFFj#J?aeTRwlBT z)7g^(G{Mk7(UG4|;&1H5h9~tlU5PiKWbIS_j{KHFbHzrXn5IrrQ6!1y!NV_^z2;|ybBZ%cqYkbKW^~oh-nfW z^$=?67U!X!;g+P9>O~iA;)~?s;q>XG5p;CK&`U^00Ff^|$&|*0O9}ZUBw~|YOFA7~ zKsmt^b5%DZ{1u+1CPHtOy?Zar&tZ_ew!Nl_@k8l>hz`Ua>KAr21`EL%GHqE>k|B@gcSp_=-AAshD%xJi9u z+ho6sz7!@=vm%0mclYL}Z*K2}f;#v9?ktV;EDtYk4R;W(H=qDnSAQJIW<;)AU2w@h z0jsfM23I)%VQFh?TUuJGsi^_A$94p@%Ve0DZU~iJTjjtUePORkvf?ig3`kJUrB!|O z)ya;PW+j$ZOZ};JA?8`+9<0*XM5*BML7!Iy7_Ny+xCgQSmV2?qOo>SNV&_VF59r6ooB)KyK0P zZ6)u|U{J8vdsRkbtBU}V<)cgMaj49+anrSdzRm4~#dxIPc;!hN;!$QdSVqV#^D;a3 z!~%D9bR^w_dKRkIY2+bga`&6LB2FTEO5*LfZM-iYHkj$;sS7#am2~vlxI4qy(Q)$l zezkwS`RwpubGE5ascP5WkL12~x8VSK5@N75nn_{i^_tTW=$PaaRC58jw!D2SZnHP> zFt3L(W9-3)f7KE1NMhi3se?&s&H09g%HVGA>YH~%E^MZqv`EzU{QZ8zSe8Zf2@5gX zbG06APz^ZnxKh!?fz-WVg4a=LkP4ViRGpVShTG$!$oS#Wzsdb^Jxaw0nXcuU&_`GcG0Tb zeO}MI`sbS*7XzY_oW86_p{YpE!GYOM>rIVB+Ji)-kP}X1R9qx9)k;3SE7+(@rWz)| zUbtQL|Hb)X%V{Chubswe?V!Q?kt@DMS@!7((MRP+eM5trhX)24+9pS2#qY$-OuvgQ zxmoiS>MRqLdQi>y^E4M%;Qlk3m|Br|-*;RwEUqdG!i>O_x4yQ!0dnjL>hLgzI-hzw z#1o6!+uPIA33Uek0*P$u{A8gFu%IL)BmnOWd_D^NXaKywIbQC+zT$RRzyc{MDYYT- zx$k|4LZON@0=`#e6*EP?s1at>hHd6fPSu5lZU-~;PLjz$?O#%2b-6PNY!)MJZO`o? zJZ5HQUS3|XB@Qv9Y*AA$ZUiQJ|*L zZ*dCPo1lm=0}w{wUWj>}6sO%C930%;ufkApew(v<=~IhgVSl6g__0+i6tTIv+2oF# zLI^8cCT-F8Of)?`NUFT$ch68XEQp6*<^G}9bZ_fJI5^Ie!10*n+RkU~n_-$J|B~pY z5t4$QocG(qdhbjm(n@1Hse(nUXQ;?;0`oho<1p%f7wuTfe&|az< z!s&tDwdbXggd8p;a7Cf)k+2L?T@V;yX_il zJ;LG5b7XQy0r!fA(^E$Zl9#KA$@(d!9KL{@3zc0)f^W?VnGiR)ap72wlZROK({#p? zRy0ts+&B8l@53o5Z&jlFGVE|bqTSwiWdl>)(4W>O_N~|k@1T#LvjST5=BOs*TB>Q= zW7^mn3K2oI2-Zm8WT%w!L;PX*ux6#-r;`A??#4)-#u2n-G9TiR~l^j56J|wr3kauX+$z1 z->sb;X*JD4=~w{rPL|&W&`J*vk2a@iqP70*i$?Vji}aO(4bHlKBx)#RrEwOjM!8hK@qK|0wiaY62G@zZEpMC_ab~^e#KyfWFs5ee!CQOxZV6!KEBTxp-Oj$> z+86(i7C=Nf|5#5+fau+RO4b`xUxyw2dFjjZxwn**odlz&r$q^5E*G8=PH@DltZLmK z8Z%nlj5ysU(X;;wt=Jt-5MnAjtb(_=d~>)_K-xkj=ulzT2j^lqLX8*tI;} z;xO2~{_1XuY$~S?aJAY088XKykmi5g_EuLqF*PA)%sPd-X5-}jdb7aHUW?Kyvm9vd zM+g3?`^5g|NS=}?0-cs)R2`7cHO)1Ky8?@0`^(Hsaa@XVQ#8d@kk~|7cB;+Q(Eed@ zfZ#F4;0i5)mji0c5nm-t{MPfz^7X)h2(L}txpSW0-QB*vMribprEeoBMg6E>pda-I}l$KiDqBmffyn19q)rl;%G7p-!_Ho3%r1%*79l$`Q#nWK)l*^z0wtGB zV$atTs%-GDAZbVxx_C7H0#r$|b$=7_FZAMZ_@(INxYZb!`5BMHs5&6)@wkMFb)US} zeE9X0=XiLQCWdCdz=PQ8>KCO-nS9^R>;1B`wSV1k5}68y2eHyFi`^!b8q2Z%jb0Xb zhp<($rQMckm+5q6YAr>BC_TC48xi!8aA!>i1j5>&aGG1hoI=bBQj!NwgfyjEpAyk=kfEGJ^QSz`Xf4t zOOJ<=zw>J=uWjv}k-ouFbEd_UN(}X$#X>TZZ=kr`y zmk1A0kVAh>O6l85yL8fq7g?i5Tg7pyO0`Xv9w>Kg>xHv`z?=7*u0e|v81#*1aJep! z{+4G}8vJC#Ofqi_4=EtcwdrrGE|hYTb6zvVfFehzoPuaFA$ z!bh!IMkijmo?ZC}B5%}JF}!eHtnhhm*{##pX34fj#i6SQO4G9V1ab9Ce z8f<+~>aEx4MdL}LS}c-F0+O`D!^3GVrSG_MqLOwyS6^p7$}ewCIrWq+%h%!4;i*yx zx{UwYJpXNeK9E4!+0jw)e!B`Ypg=YUqE}#Gpq!i>dQVzL2EcViB_upjaC2+XBz=?o00##rc3 z2oj~jF5gL1U8M#D1cz5#931MaQcWPG>HYnE0AZ%W1~A4>Av`HpR}Q6VKqq8qLM6V= zCbyLVvq>r7w8&9g4KjeExT^ZAJQwurHWFdnlNf1ae4w$pu0kg0t-24UQOfuc>HgN0 z6728qUs+WJghMiX{1Q}MJZtY=8f|2B^r!pX+%~o=-)c{MqD*44>FK3_$G@X9Hsw(K z!Fo|Oywl<5KL-a(H6|h_A11WoF0?&HY;FDx&Bd^lMIYENd7j5h6&95E(Tu{#w=pXt z26JM~e*t zUMIi%`mC(2-87_K=A&$_yPk#R`KyZ1+{FaH-|!ui@><>i4f-zXE9A z#)f%>*>Cf@FJFL^7h`30watfcO-SO49S@ThS@8il${uZdSFi#$%kHag@42z6u;A-) zc_~B0Kud1%P&wIJKUkoarZonDW>x_dWv&YCAC0$i1pt=%E0!;L9aI{8K3MRe2_}0Bi@no-gEa*xG!^u~ zS{fSDGyVbef=(lMNMovJYsl*RE)1~~HLVNnmxd|h7bmtG>z(GO#-KtxK#F#Ck9^Ia zO4(wMXFsJa%~ia zViOh{44fR$;0>f~3#k9yP_8IB79e<2(Ed0;^6v)ABFz3rGWhF%RRI3~xBkCs2>*9w z;s0%&xQ&feQsqo5*!!bkMyQF;19rtPaRH?ryj0fe?i58|G9Y%5Bo)z z2|v2`4)sIWivb|ts4{4&4i85_td!rQJ@ma@$sRelcNP#C4K;ao9dAZ>f?g6964o9Z zO=*X;yclAU`0wl$FPo{D6z!xi(AQOe(~=;#9W#RE=b7+ZC*nL`MnrT7ETIZ>nvOd< zvbvh&h9*W+E{$S?~C?dN1i<7bm_mhf6_KdJ7K6u zztLRDIlWyTgdOsjnvFGz?bdEmds|;SyU=i7>DzF=>~&pN-SsmCQ~PSqj~ve7frL-6 zfa3aJGhN>tW+kV#JNg%6gx#T2@~EjUA2R%488pM*#9! z>cb?UbP5WNxgI5fvtVT%KbS8(yoyDt7E&HyVA0@^*OR*$E}d6)$P~=8Zb3*j9$3#l z#~w5BsRmfdm$RuR_mT+hXiGv%JvD9fyV)KzncHKYUDx`HSP_DqEpQ!($sjG8@ilD- zA=AsZHZ!x+zF$NfcYTiWCwOhW!`-<6d;RisnS0^s>1k!f5NruB=TaZu#`iz6OyPmP zQw?sOOMXZIaJu38wzf7vDX}ho91B6%SPP$cHGsl`043RqlHYjsBuLr5P^N57NiQSmz1!tTdGt6c&KL`kwVj7eT7b`aY{k6&MRKJO zZ*(P`Ov@}yVDcWhPh;TUzuK9P3+LyZCXUdd(b1Ga3&ZLUUr$e)cIVQ`k%7-e8c&-b zYm+fIKmUr^B9*VY(&_>S0wThl|H?hqLy(*fpu0Voh5Q2?>dbp@jr$+KUDgfM^So7^ zS-runYk3|)WF|azf5xkXGI_7h9Omr@wvHojYfx(6!e+bJ9z*@64usRmOi-0ezSP@I zt%OeP&Z=tV zem*U?5?(|-kS?I{)7%$Hgsw-3nyTuVQ7J@TE*fGrXi*Qu^w-Zy*f=;T0Et?zsHpfm z06qUT$sGZ7b8~}_j}M24{@Km#5#~U5UHwO*P{(J^c$f<18v4!5LoL#&9$rTgAN6>B zDz?R+V)2j@+GG(vf-Et(8spu%Ps{0Qc`=>-+&R^gDO(2a#BWU%U^JfSm`);3gejXG z?GH67xy+Y0j8NXyRgfph%FD|G<*i)ex*t^Ck|~iYT-;1fZZK$8qEwYmvyFkBT`m7d z0A@a!h!L>;K|tVH>Gb0Tp}%AM0f39cy6dMU0TM=Gie__+^k`vaU4?*b2lkhAz-yX5 zZ3>N&66DEmv4>HIgD^y=rZB!rL(YB}?$MaaScr_b*7!N&eXvrxo~|lZ4IK;Ji&q#y zlIPugHH2&;qLY^-cQx7Id0t}Xehuvxn9Il0^L6giJSmOU4m)$IiQYp4zk#=BegBcb zwp`txJDYJpK3=4?&b-^t?SB|w-v2J-I!7B^SrYb@bEhIQ`@ljODEIu zO*zi1A%@T0la>>GVaX@E-I@B~ngCc550L^2WTD)1i3WnPyWQF8ShP33j>p!o>`i?4 zkVxA2?9O)&A9?uNRh4burOmpzK9mhzEr%-PZ zn$9ph;yK5I>7cvdv1W7Fv|p{m0=HQm?@4pj%QUAO+%KMd?wpN`Fe+AvnyJorzJ!*t zu0|`5uvmsIH8~Lbcp~rZp4w?|FJ|XXYWMc``U}4zl^JOb=>l4}@m&G}f>&C&wYCeq zTTY$d^(`&^p@4AI6PoeS#av!~2vEGVs)JivZULzt=*QwBA)L07e|_`}w=AqEI3uG+ zw5r0+UJ!yGs68tj%yl(Y;=}z$@!sS$iT&sINZH^Fc{nV7 zUw$&}*H4!r1aGo^8Md$gc>Sb}p|EmuV##KER#d;gyHCs_Fxzcj@Ah>MB2FP0{8UeI1MCMJ(Y-ERpUsS{)^IMM;wvT0xbZCAm3BN`xzR23)5#9s|0o9?MQ zfbkuH1kosuzU$b$SZzW9{s1=jjf{`tf-NRGvs&~M!uFVs$C{@geAn{?Zz^|!^gCZi({sTYx*fF&D5tm&UtYlTgeV6nj2pWO( z_VQiK!DLr>cD`x`zRUL69FB@B)wn0?!j6Zxx!Y_bmf}U19$K78D)z=wHsYJ7UPxCs zqQQ6EK>x$JZZb<_BOX74XUFd4pu4)Lne%tt%cp<8YV5~*u`Hg{*={{TbRFdG`rf*Y z(=Y^2*}q$8k=dnb?lXsyZ%;0+3SbJ2p{;&&4xK(3R8FaoyBhw)$cvkCoz-Nn`}ojj zv6iGDu=C>aU^_Ui6ch(dBQx1p@EZM1T6OHc__W&+?`+(0>7*|`QGl_Q<0i!Yx~h4&q;6EJeRj7gMe@Vn%lp%E zBQ*@^BZJx5w*d*Nk6=!7GY_v`Dj;tC_6>zJ3+o|a3eT&sz1@v^fDsvE17RM4?g{@NxU6m0}$CX2VF=2i(rg6@1J(A5`sJ?s z$(Dqi-Gd|T;U1-xmTz*qoNjHbF<|#%hGisPNiI}q4f$VmhY}G*Mwe^NzsExynQ=Zf z_>MkXJKWiag<>s?EK`v2ox*FT(I_R~&mOphKYrgk9*M?%#ZSq8WIvGyX zWE+GoH8~y`3bv2xcbC=R^)e*Jzq-9vCE=!3x=#h2XDq&8C`nP#bA7(Z>@f4^R0>I< z?Wfs;uQcRdnKw3xrILE^JdR*7UY?JDr8%9ue!SpC4IkECAF+~axZ#XH$q>4r?_Y6cfNe_;|XWe?1ZLI^p;{R=#`cM}P0% zWytbcaC*10vhsL)+W#L&1>nFHQ~x|kYH=$+K8P-52zVFBU2Aj|$_DHFf~Kw^EJEJ{ub_0lUQyj`HmqJBa{WTJ zvjs3r8lQ9O&E{Q}F`Y6dBroC69EwVI%hnBrtxpieRfEoc2QN9}#>0EA1|H|hz-l~j zG05Q&rDYwx#}BqXRxf9jA2k~=@e2(ZBYki4S|_C--rifZFJhpoir?uqcd~G6p(PGE z&XsW{F==<46nsW0M25g zyzCXaS$d;n|E}BeHd{TozF%O6B=Me^&--9t=>;kl%^L}Zl_hn`4hq?8epp!S8TL0Z z!lbua*ZWyOC!gZog$2;TTFg=Xo3m90^Q)_?!^04l&AydbKy-X_apCIaRb$Y?65p@U z%L*JQC`oa(Sq#Br)Rrxt8duZ-v6=ry7Wy|jqv9|B^1h_OpaoA<&I7F)lrlT7_zNTQ znMhH;wjRY~bjEZ4tWS;y4S_Gm6(E8PwLUH55h?XyKZ*kwab|fE=8iiZeSU1McDR-{ zMreN@^mD!cUEMRkDRPI)I8P&+H6*v zo3DN};Ww9jLqi3^GEdD7te+2&VyN5~_!nSIcq`!H=@XrzpWwG1Q4PwSj*X`ANv+{HQz zVQ_;k%lJpOo%Us$kw(r5ETg^&X;&Ypg}8+%w|kQ^d2^;gxWgR*EBL4ol2s{HXKRuT zj{!9V?(OKbT`n|1PMpyvhR1kGXdf;W-BjXKimJicy`vNsd=J~{pzhVQ(zAdgC5*TJ z+$i*guR8qQo}EGvB4Q133Kz#5tH0Wh9|p9;QL7Q7vddl0KmRmgQgav)c zAZi(dkKdT&8cp8b#*=g)opO}9&ruL~92ibUkeAq;r?tW&LPRX^a;EEHGub_oWnn8W zDRISF)8x06%~uTz3&X|3GlPon$y{tt&GIH&c5SB=HZo;A=yF}}3ybMtxovKNnIBn% zRN8ATG6JiPIT<`@+4Xc-qz81#N110#1d)Bz>@P9VG?jSi3yfi+;3+p2)msMaFPL zBCww3jn7qDzC&~u;Isboi@4@P^XSU_#@Tm%lR^ZMCsCPj*f=x7VnpBJtMoTtJkyZ!;1os!$Ila8!zt?*unKwu-SrzcSn`z6$ zES!$AcrBq1p+bS}QdE-!=hB*iw&n>u9ox=~hVk$iVc>JuwSgL<#5RO{?RrBM$YbSCd@zSom(%lcs|`<2SD#Z$0-4rxxHdwBWm0C`PS|_fkQm1UYXkZUn450L z9dvu`i%SY2+aE2aIl58TF+~GaB2!b+`-4$Xe&AbL$}c>eR*VCEkq0S{8HB?CT567I zs;2g~gfT48RKyM%LUj7UKcKd}LQ?Ji^6~nDEDg@%eFswIQk$!)kuaTl+(~P)T7LXD zxo*#sZy^YIIB_aOd{(BtL51LKIcvaS_~}${&kp1p=`IHyTzT?SF~;)+yqvf2&eGXV zm`~01SkEgHzMYsFG)%%&)HB{#b@Q`&b4tRtsraijUY~}`D02MJ>L;AfQ5SV)PO_HH z-9T4erQi5D+DjLHg8J{W%#U0yr+f3qEeV^c)r-y6HqWf?zhC~0F@f`6nePIW4S;?W zl?=Eft~xgPuD8jm@(LQxS*_rT3LAQ|+!eAMh$)pEfv3s$Hb1S&%z>gO&i$5c-Ud8) z6*~1z4S(a=Q!=qa&zwctW~5TtchVOZQ}r$i)jJ%p{msm7$|qf5nonEl6pt$X9i_dv zsNte#*DMOA`oe8S#phZpSD_$43iK`VLs;ND>*43J{fa(D-7r}rMG#wJ$9ojC+4#ef zOV>+Xka#7WRb%iZc_KPFlHK%k55{m1F0*BHCA zZ;?vko%aK_0pk59O7aU$pLH^gBr0@Ew#H1*RC*P}Y}S0QX5Mz{>)O36Zz#G>r7oF^ zD;dbdg2I1T|7^qPIxxwv`fcu_tQ-fZ$z^T|6A+IhZ@RioUE>RhJOtbwjdyMD@!vf* z&I@tpFJ}qnYYhi-KJa377#&iM1|Z%E8Vl7QPI2Uj1+1Ur7<|neQds($6*;os+Y$c5^)nowrr$0Lgh>OHzK73clsH>be2c!86qPn6+XGoc<=0q3zP1VKjg52L-?4BZELR zUm%{apu6je)`r7JW)YwhKc_+22No2p-IL?id|P>EQ(*}TZrpFN9X_P3J7IIuigZbV zb?y8i(t=o#!&m#@PMtIe$S>!!ERzqB;Df(^$C_nA2l^O*@aQjWQm*-;lX@bCJX`se zQd+a)SDr2t0Diqtv@}MvBhMNN3N^}_qK0~>WIs@`ABKsENcu*79l#)F1M!gMom z{jZmb8)U}%G^crcin8|C=t+_Kf1Vhzl$0;|C&vU~p-u8xz4bO!%sNnJAQzy-H z`m|rAuOkniR#(j<^6U`aoamZez)Tf5M$#DMM#vkV$ov`5(4d5(Cs+ z!B_&^_6!e4_&8C&sbCxyFL(DFQ?GZcGM|1n5B?w0-ZChzuImi#%&4%Nkv*}Hnpz4o#_=NMy>E9{{c zFaY(qOQ%B1I%PHJ$Hy zoaKNn@N43VpOfvp@*a$(epKu%uJ3fmoh;)VFj(sP^e8M~jao#^?Z_03x5g^qx^B1{ zha@+fuSnBlkD9WCiwei>#yE9YB$?rb#15O{ zul6dEz)|g-w(Ct(TMZB6&P#vp3@OYD?@6k);8FQQs0He|z?JGqoc1{%&-~+y8#V|2 z-2oFv=$Q{?bw+Z@id}&762bH5x0&zg`5(RE8*5n6S;eesnu z3x#tpeY%cWHQKhh;UR>)&V3a+Or&$9*)q$4Ek=dGfeHogLICOQ`{jD8St_8%Xc7Z% z4FI;`xoWAT!}hEwoN)TK;lA5(``9lFlrE5D8Ykv&ZE_!+SIrM%&EdQavESz1TAK+qh>{-FIqzl3e;xaHw>=Tx9T zzQEVrbs{H!J|R-p zEX0!xd#1|AH(7s{;Ps(66avRo?)V|7<&oJX$8Ry#%5#L+la2%DP*wlfHKDaQnPiX; zIsg8E&=4UkWhp5{NbU(KSa5?SjDulxRJJYuD>m$9IaqSA|OaDL%kXgfb9W92@K`)k$ZB+K7H% z&czWq<$7GV8|BfTigCac%Ky_VHC3Yw(5X4uKeJI=sz4?1wr`FlEVm4n;b6rhaa-qR z_W^~Q{P3r{*w6D>q+nvwjUX}uZtifTlSoQaFMMq**_m4_w^@{Dutu~gsYP%rCT(+1 zaoBLaeF-{9HS;a{QhcjdY}iR_lc?Ig!XG#&ZF;lXIYC z*S@|3`vIv6d}!1fp@vs?MmMG5I?zr26Q}$2U|;j?%SUxn-PPe@nXWB8{De=OU^5R3 z;q_Y3Z&v%J4@8i4>(okETnLYJhWWSUQh`}x>0tuK%klbE%^;@FPJGG7H_P6;6(jV3lb#*tOrCHFCL;9^72RfXRV#FwP}0}nBj8Xg76(0SqKdl@`1ztPJ;0F^FIwp^nbtpe_iok1E%Ib z*OMUpPs1L;aypt5gyhL0tu)qQ@MTa`$uuhQUeLtE#Fh_MNIF=%ahfz=OPv1!(Rt@^U zw$AqeLZg3OpsxAHL!k|$Z+9djnG`IxqW?Jkiv>f|4=j99Twa5Y{*Ogp+0ZQfR44>L z9p#_9Dj0)RxBb~zZBXK%ir7ExG(Zg+cXW`(0~c#*K{;n_J7+>#?hQT;o5sEc2HeGc{_xQrptds z`lr!dtpu`nClDv*vHodr2$^QUJaobw3HV{&MjOwhob;dD;tf^Stf4o>{9jkac8v6N z5|#0!)BN{#Mq~|hh5mK0APNrqy2=^kKeRl$2*~jp-M_P$?|%2UK}UO9EKD90ni0r1 z3A7E$g$t-=e|_v}DOGI`#-`80_TID4NP+>N37b(aFwR>yYbBdiB!4~fSM(n6ob|8fg?!UdbAalY0Q8g)M@(!AXt zDlA+kk(7-$X@DZ|{zL?+kHG6K_UMt9@0KmJi!QUPv^8NZI{DZPbSi+rBs(3RgWGK1 zm&@TWAp`GYc*4a3@ldfr^FY0Z*7;NCU__Z#k1PKq6%i(?y`Y>Lwoz>cYwgc#Exx3j zTH8`R2NPLxP1Wamz*6BmMv+cibAx%_?Cy`Oc_N<%O_g+FR_0Hm?+k|M*qQ7YIjvOsje6L2{TJQbw$N`xz9&%h0fEw?Vv-%@=g8XqIjBlU{w!}0~{4= zRrq_(0PKo#HoH@EX-KZQA_X3l&(b~8pw57U+&&5!Z?9dK705C;L<;rRtakI&;I&)S z2Yv8!V-|<;bx%XU#YL-aj><;9b~-*fgz=)?;;HWRJE6;yaY$q&3K20{y7*_qahsyH z>4iZO5e`0nd|?gf(zStom@lC?SidD*GgqEY;hy?Z>340YhMoi$Adrz^+uzc+acnSO z-AzIzLsHQYE2vb0-D1m9cLoEIm&URel|G|k_pnbk90pA*SliFyg}*SL9BvBMHsdQ@ zPEnJ}+`P}xTJwoR@xgq@E$~*1!xiA@vs1r{RDJZEe8+*h#A&xbj{3@duVMoSsF^#l z@lR_zvTjde~StRdblS+MRGM-j)>PexK|Qsr~V<-VKa+&YU&)+xL=b`*Nh1S1zRI=LRX%Cx zG)9#narN-m6*CDCm+wR9sAc!5;Kh3R#EspKZ{-M(RSoI5oUNMkC~z*dF89m2tHijmgD@>*XiL))MM{Zs2*vRum3ZT`p61XA2B zi%~(NPs;^BP4=DQ_Z;!Agn^3X-hJ4NpAO9QCU(M|u#A>tPR2HUls>vSx}yQuJT&BW z963iCZ<@NQb({7tX!PiKS6JUJRPcB;HjCe_W3*0cH#+S^C`FsjHLgysz7nbHiC4Bw zY;>+36jwC{58^~_@STLRFV;7}PinT?E<0dwukx<&`8*X#C^N%N!x8gQx<7l3S9S2b zrf;lM&RHysoyDT$z!rLM2SoZc8}8@>?E-${c3vHu()Z`M^dbR*{}fp z6nNLFgch_g@$~$?=rycmbg|mtYk7>zTIXW`pJUcnVhl)3eR}LG(lPyvo5RY2(RkWPs;jus{(# zSMt_|#r1{E8`#7eH6Npm(R`op!Rz=44#;#hTJhEJI4|H0Y-b!J%^bQfuji$auJOT5 zQZNnFPjSLgoi(=-N6o~L*>K<3e#g;Oy;5U8Tri;y;sC!~BxYQ1AT~$T&>Mz($ba&1 zL=QY+AvRcT0=pKqfSRikX#(?By0vcj5*u25c$5GoCzw7@yTso-dJC$eA(D@x8;-Xx z;ly0~8_?Jv?5nWG5vb`}AplIQ(rVmho0DXSL}Jb#)`z{6)l z7a&FDD_@k-^m;UT#CL`OU~@2hH0`cnrR__=b#tsUD7*PH`j$E~hY4u!utr3L!MRv< zaZ?31K2aO>xC~9QzFU}@aEnOo>G33bWhBlP4NPhEN z_~KZaYO`8xF>$IF4h>*-ssQGS=uQR0_>*o;UpZ~Pg2cYeSYH3=46mz`3xDrIPx^%# zkr3Y1%F_BlRLN%OyBUORl@o>@+4|Kk?Vv2)i_Kxb#(fdI`FWu`yfa6&zu9>&B80p& zIpiwI}g(F z_I16g7@vMOo3P1ko9S_vhVJp5MM_L!Yq}8GC?wfaMxw>_O(^BVS{4V6B&eUq~C3CnFPUQ*U$!8=0YbimPlV3&F_m{3OoKB)j{5;Vv|mb;2g<((W`;jpHUQm735oRqu~?tY~+_gbzU0fm9T;#ZG~@+t^6K5<}xN)#YJY1>>4#j2p@c z0n94cmX^%;$nx@_N_zfhv+BM?E@|;`1{rK|`6#*QZ0)$P@NniW+Qin+g=Ff2ZjX5#2KS`p%{0LMbgAAoqAv zpz*d~kn;L6+NAhggL)T0Po*>T~vm)AG^c()D!mJD&F^U zgi&bYJ?$p_juA2TVBDI$3lVg6J%3&HLZ4_P=glMd&NFn!H?wLHyHi_OY2`52oVcVs*cM|489PcRrIkPB}CcKUr2MA=zLYRYo6O@uLJUTg0W{Vffy4M+khi zP3vmh>!gWxG9ZVnN^gs{TI1#64U=2>&-MY_E#Wi(<_1uOJ!-cx;}5w{I$(*pyazc|h-_|nrb>L>H4XsxV_gtu=jB?{D! zW+%iB(Qys~TnExOZXi4jaEfBpga56u1Vkx^@(ELcbYm`c_Y}C_x z1Y>Gm;wbKPh6pqs+5%5B;c_cFE3p>y3KowyuC@IX^=ljg55|5>5wv zX8XhSB~@?70R!iS?8QFDtA~|n`0vV*+5PO_bc%iwc6KubVFWk$#AgvVmCI^bk6@H$ zfP@~?(nm6tMAf_8T*_4rUJ1eAOmoK1SNF@2xm<+w+2z%?yu7xX_p!k{tOWJ=oOYJ^ z&<5(~pz-d$ohHUdjx~UK9agm<2mGmlCyf?+?EmpVtaQkFE1Vv^s{;j266iapag7H`u*2MSUDRNbf@o1b@e( zpnQy6a)0*T{Wd+C6u|Z1&EtStS1~ne;Xsw*VK316Af>B6jGY$*8plg?E=+85vi=1e zhTmkVQPK0_y7+$0&XLH2jNNeZx)V3tQD%KkxZLrFskikYYI=hSpC!WFfC(2^7=h`0 zK6b=Y8*GZfY{P5x*cJagXWCN?IujsP$=w?=&=@;4RLRKKE_r-p01@V}C#=<(aUpfmTIQAGE5e|vSQm4`WyJGXtj?Wr!|w;e894#H0t z&A3^2+f?=qPReG|d{kMCxW!{NYa)J2-KfTfCAwQ~1Sv;|6f;LA`z?-Pwq42ztJ2Qb zbw)-<`%N@?K}eaLJUjv?IwmGN9(lP1@O1A2I){%}`RGD9JDwR&f6MI`sh7*#J$smq zksw^}cOQ&BcfWbqdt*b`&WyKG5Ju(ZBV#WFZucWNxZ`pzD=Q0wQr1&|I~gi~>G;vV zip(@l6c$P@81g>I$ozc62(2 za}#C+A*DD`7V9HuN9j5ZY{B%@S?QOGN7DcTRdZfT!Wz$;P7U2xo4@ShHMv*t5R3+D zvVY>t3yQoPGoXb5RdA!zKruT!T$RXIU0jrrCOI1IG@g{UZyJ((@0}YP*_f|02Zyk~ zDG=0O$-WVtyckpD{IugI-d4*)1K3@5VoCIgk}Qmepg5d7{B)(8yal#QFo{DSPkAr> z+HY(geD7t^o%lu}TEgXi&``Vd!GT8^0(4$QEvU2bQ;5pcMoDF{Qza;VVRmlS(Rt;< z&gui4pS^l0RI8iVAW?LgR;A^-Gw>6w{QmV7gM9MhlB*a_TkDYbMGa2 z?`A>)v44SV2G#!P=?i$x#Yk-5*nF{8>QU~p<3q2g7?V1hz;$;oj){qxyeIdV&9>V7 z{39v%Ce{q7TWfg0>IQ>$>ylJ)kwV)81Wi`M$7nk*i>2D(7?nP9mfd}t#b*l3=4xBcAL<4Qx8$olLV8wl& z;47B9usYOYEUU}v4~EwR@%TL|wGL^CPc0A+9${B!oq_|FZf+>%K6)j?Vk2MzZ(>23 zhHe)de^EnIp^c4}qhcG|AY;0wknwgT?o;mD!*#29jeK=@8_mIiAd76*GmGT5vt+9V z{doV2JMLm7A?j6(>x@-8oKwr%mswgd2jlOQ6}=3``?}Ss8sFAdrfjB45RD{~ULICE z6)6^fT%^@CA2k|qt9s7Lfj*Lp`+M6QAs%?`?=W6v%O_O@f1hFY)N^@XKRSi@j zjMKJl%jOh3LNaK8WGqz@(?lsf0AYei+<#^%4%1I=u?W_n#gX;%S3Nn|vo#x^Ci`=v zyP4j|gEjq@?&5)n+)uxIpN`=$zNiest+%^fDA`IUsefs5DP73%s$2O$8T`RGmP-Bn zy{fZcV5fgi4l}8rz>kk(}<5_wCYw|OcH-l+=)uB3@J(op z*Jnc0Ual*p9#lINr%)}ZcgHgFaOdg3*YT^%Lys-@Umj*_^)qr zHx79t^N8P)nc#UNWHeM%ctG#$RyZncAz@OlYDmnqoiz!?L`DWK5MMBVxak=!!1-Y4 zLpA~;CIfHiU3qafvWq}LBeB;ULe}&1L=Iax41k(@;nT)^kah3m#cfNDA9sM5-Wo&) zlf*&OYP0)0bR=4tca6(&MZim5w*9hbiB)11a3XWMTKot$s6xBTC~?w(Grl(gsvO7G zrolKRw7meE-fpe%eE|K2H#0ZYTZAT==Hk=gYBrVMp;4Rz|Ie;YkLOM{%4X!dbqLhF z`PtumgL(AL{o?B$NUP(t&*SZBwu_1^D=YfNZr1WJ1J0!5EJ8N@ba-5@3*7i>Yx-(~ z5iGJ3)0O@xhod1j{X0vi!SL$d#_1SZtWwdUJL(bW?#h^6IA63^!H2EN<1v_MjGHSXxFtG>+;EK8?#fB*4bfkr(BP5Kr+Fh5Y1 z7+7b`yi<*dHK{jD>Y$nnb*kUm%cN~U-!ofq5?Bu}qVm|Vw5(B7onZY`jrE1KYo8@e3+(SCppSryYEva-i--60|)q{k&YU6bqR6i{fh zt$f@XG)E_Ji`H(=KGjeL{tK0*ZS1BLC6!o!{=C)i7-ynM?v}??kq*a#j?b=-D@^6c z0MRdu8M@(oh^SQG?ZEum9}efHDxnp8Je>~GDwB8WGYT^v9b^ncrQTywR3q#du6kYX zx_r19Hd*cDD*9#!a_J&ozM$pQl6H9#7kBs$p*ZE2J$<;U{4hr~r5zoiZ7NVha76w_h@xHJ37Wb`KSkrtwHRR$w9p>)Jleh4 zwPF@ynV`P5)Oy??-tAT^o70>taVn`^AA_vk+}$$9T%|x0wt8(R?h*Y1Dd15L)LZ;5 zCC?0L=GUgcp;LSi0e^{#p9L#3`|02oL%IU*n0eYIU)Rfm;cBnF!da;F+aBv{OWFu0 znn|)cOz54B-fWL3==14QE`yE&--tOE=L9z0;=}iLHA$sn4KS8joQ1Grp*Y-nGgea3jv(elX7R*pf5+~=j`h6rNZ9~b7o|yt zA}A_0HAM%om^yUF8b8+G+uOUXWzKB9ejGX<`P70>S*ZQKJzYKRVYxb)6)&>G@vEtD zkT*pa9@l}OEw_By+IYZ9?B^mR-8Ms)(M0lcx-8lX<6AZ7sUX!B!9Xpx%$n=!$uc}% zqjR+~jtWK@{Pxd+eacLF2r~^<`b)85nckDnKFTtXAYugVS*Lyq*1}uz%`#yi_k9-l zB$;6x5unM*LB#1JZ+%$99`iZL`&m6@S5F6s&wDmjcIS~u7?yY3JuuqkU=%i5s#WZi z&RCiB^U>TTOdJPt=qe?R^f@l}V%|L-r$Py&#{UWS=|QsqUz`zzOqAP~60*F-jp&92 zV2(MpIa`eRH>g0GT^U7ed;8W>~qUKU>fv2SCS=TwO;h! zUkUDT9#yULkNm*EI~b$qL={??rPsmGJPX@b)k#0%v3xEGnG%<{mw!fRHWog602&XM zMqFN&-p+SxcH>8zd}qFDd`WEGRtWAGGnv{}!${XWtX3M9GWf9sQ+_WNNf` zsIOmGEEcZ}sa#=yJsXwsA&yMx#`Btl?A!_Dn%m=k{2Y<~@|cXoW7_vFs0Yd@e#c8D zo=nLaZ5psKFK0%(A4`Lqv;8I~=*|^c>>WeLmHwSnsoDRPCi7BnOg`W-9d>-63+5Y_HFe;gjRf+Az z*7g~i=bpCg{sd^d-Vtfd$oCuKfS12&fO zF15o`SpUGV69%rhW?sr6+h}iA<_|PGWlqTQWQE8J?-If0BgcY}tD?DHM=z_B^b{B# z$@TV?2kx*8#7ZDDMh%Ie2{Up1mNCJ1)_a)NXbB^JsXm*tA(R|$^VsKP-wugcbWK2~ zl*ZPk@nkDeAfFc}v2^-dlkn|X&%CwURvem_8A!OLXV*EEpQ$`iF87zUv8gF6pxbSw zz5C1jI>9&m4eKoA_M4 z(xLMn3a}Kv3IY5jS3Ia}o$af$#cIkcc8kQqOd(aadEuxV2-0`7d8Y61{>Xtt78;ox zs=7O>j=!d0-)=qa4_%BozwRKcjGH;PeK9Ip4+#)(qSMOo!P_NbVW%@MOd88kL6SS6 zs5d-1sBZ+yfiD+!gRW%#0{UK}D;J~6N0?v=833TBqFu^LLTZ*iURw>Wo4TmfS}}s z6pga!8VIjLF3qdS*FNM&vgp{vf+K)LoN_RDMLzxMa(~YTswX$*6Cb1{IZ3r+qk{u&NXZcu3}sc}VHEP9y1d7y@XX?3H)cLrJsVYa(p;^K0kJO4u%8iyAp?g+gIxO)E;EG@9)(*^8$CpY3m>FL-jeR zh{8;cp9%IIEE~)rZzr@z6XrH=sJ>@wKy)H1aWn;K z>(g6J)7V^wuN*007|s8zx8ZtRZ0C;4m|>N9e7ax%p^(0utaq%QgoeT73?RWGy7oFr zFbYj()NOo|@1gLY{N&nO(G#6aL@Dr(w9Y86%ja|b0aGe zf-H_SR5}AaId{@pR|jA1?6tyz)oPPyjqQJ8)BlBnB={_wL8f?pu0;qv>O$>pISzEg znKt!^0RtzKAs>l)WhZzmp8x~&hj~0G8u@FzJ`V)igG7+;Ianw#D0dS*4UdV@B34K{ z&%3Udk)f+wu3DW`Ytd_fGgmFM(7TaIW*N!ppM`-T`wSqV{G_Ibf*(fl>GAQzV1m~O0Qf;&pzt>2Hc&WIo-m)u46Wj&-5Ol z@wlWb1O_d?bsQhJ-BkH-TaSg68OU5K7fu@COleAgs6@z zyIAaxDKmhi5z7vuncvXRME>iYE)hX|Z+EHXY`L+qGA=+dG6G9Zzjk{7)ES-mK3Ed5 zVCjz&3N3;dyt!=qk4cJMJy^Lq1m#a~>RVQ0zXv#GpE!|Wo4>l=yhM|>_ICXu6X_HC zASk;MmCc&hpaa!}A`>R%X%|n}P^pwp1_z)y9jv4pkei%D5W=Y2j=yHHL)w>b(7wlK zx7f=-rBenN(lj{;Fh;W6%(>8gT~~Gi7%#L-@aP1wsRau}836>(yk)caN~HK>p#Uon z&AZ!ohw0R;8o(C(9Qr4xr+FEWD1c;8&E_y48E!Fco`D(=Mw(n*ggHCJ)x-!_!Uc%c zs8&P8lcE%?vw7-g|Ca zCmz3V;nrj(Rqda7PCo+c!b0m3;9*l>X()pEm^6kYb5kGVE{+}+IfjR=8yw0Fjy?Tu zRtSRYLV|ERA4eJa1kx`@XF5D?wT8SFqUSL}{g+BzvYiONBe&*tkpUx(r|WP4CurtwS3-F>vZPD^{mn+9>LJaKGwLs5LpDwJMiNkh zDC>2vwz+IKymwUJl|J?`%Pb0f+^fIuo; zuC44rfG5o&Y-a*`esi3rXLR~T*Y66?X=>F{bun>(=fuGKaz?7Xs@emt*y3c_r@gy# z^*l>XM@JDAXx)ev9`I_H{Eq{<8G5?YAqUn)So6>P&AtzZ9k$?){KnQagCUf=lFGYP zKy_WY2@DG3k?4j<4>3syq`_v++2`?>Q;`&6N6ik1S!A%XC36@M*6VUvAA6VOeG$c1 zu3iM_h6IO}eW@5UU}~b^;rIQT9+WBRSU%|cq~5r7%>*p(K1%euV8y54*LV%yR-$u5 z&LM5@j}vS{VQ$p3{dLuZ0wa}p%w_dF_^NjbZ+&ehkL|M5=) zN)leP-F^;VK(m@#lX{5?aj00K6)rr$de(akr-hG9_2kX#q@ycC#$;quZpVkXOu4)) zA8#_s4;MeNY7Zb7W%J?F%1XtqH?1>huBRBqJMAa|k7oF&to`X@unj01JH{qMz^qL1 ztj|BX@y&@fw9vrd)l4CKL`~1mEG?nrGUayLKcH0`W|vI7@2|a@0S#C*8w^?N@T20q4o`z>xOy^n#CWthL-k68>SD^A z>(LSdaLyKpuib#UhzL{5j0gj%GgkaTiy8U~K{cg*F{wBFejEd(bR zqs3xyz!pD{kZWraMvF@EG|Vxk7Z<|`i@HS$>c3f zAg9RxG+e6|75c>i7&DB?#azk%@JH$Wl^F3q-Kv6+`+cqdcV3-EW|3X%9k@ge>xM;_ zm)hm*X7ychrVR&it0(9Rqq28{Fd@$c)|2E>YK)&M^Vgh7pjHvF1?P* zmJ4?vM)JA%=K|XBmLQ2BcjEWp7xH4(oyD$m{x9Wxmecp@$)F2v$Nl4V38zwNb5kRg z;kr(Z)pPK3y*pifVD=JQc8$5kGdYh3aTg{Uer8;*xw!hhJv)BG>579O=pEKx^%rbY z@gnR-`SbZ>Hml{WpsJ1Y$)Uc_s>d%ol#^fE+zEO8*bkkQL&VMZR4b+a`1gglV>P1c z>0~VU%b79y678gkye%KrdhP9#YY_Jr*_dK~ICtx4yCq=Bscf@y!jr5_kJ4`}2bb#c ze8_IYBTP*wEi`XTv|+Pex9iUN^!{|WTKDQ>m~g1O%A(yxjl*h{2@cGsfnuAImLQAx zi6HTS>Gj86OkZKri~at53#Rq3u$X>b9@|3JMF4<`ZAD z1BK3q2mnC}=&(HpD9RguWUYj7NdE=({!fJNfAO+t|83~M2FNz?5A>Aee;Od?qQ6bT z3jOzr|7G|V{Qt!b3;j>Sf4u+SM;8COj;_c^Og4M>{L1BV6dSrcmV>4jTDi`ZtG_%a zBHhw*2ZAeq$(vi7;=Su!Z*aHVn;BNDLJ?@R-NgpNBseP~BWU8K|^2beqHELd~Ayo4<4=5S~R@|*7`49!RYS}R&W zRvJ5j-{jTQgesHgeDS@G1>}Dp0#e0GN&ZAd+S~KjH_R(H+^XLqs9;uy;m+skq6pV; z4GwUt;rallTxw!$dDZi$@K?u_6T0Bx+UA{SMhh3h!+#zmG@Zhyf{o?ZKkaYw;?&vF zuz5Arriq`jEBwsnb7Y!-8*TO8CGT8kMx=17vB-zXFtiMZS_FT3u{e(dqq1a6vys)6 znwI}mQ022Ivi0nUj6M~U$4s?LQ%3$eBMf1 z^USmOiYo54ruw!LSJfl9e_w=LW69@q?)gwd_x;d$`=$>IVqf*IMW_SFONOBgb_?sxeVnpl?X=t}@C>hW3~D8t%hR5`s-wIwwbM!x z7s~Qm26?`~2W9AQ7tmk*xCoY=(-^WL)zEg5f|f?4Wq?3;oXKjOiFYXNGdt6`%p6U0 zw%9W=v{f(IjTV|ZY&zm-$&mhFXDej$=c!SMEn~`<8_UkqGQb0>TIw#k^Px=2l3O8! ztD5Qn`!T*)0s^OK?S4!80(vwtNtqpKirNN>{e1u+L!iN&`CW#~1R|**g5sEY6v@!@ zkj~2~Im_x`HpANQy~RoW&{i_%V)gvD`{hd$poX%>+;4TD)`{QiYgxq{7C>>#o_ZMqQ1YR!A z?9!G;N82^5Z_ia6o(-V1KfKcbE)``m$fzuxj&}apd4DdHS2Ew`VK>iCcs5ktm4ar7 z!ppmRvtJteUPVlTpi)268`)0C#R>%AlZH+L0QF&k+DDuL%aIZSAxG&b>q{w zz3uhky@pJ^OWWBNdQrn22pgdENq+sQLDTI(_bWUg$*Tuss{H4b!XRl#MgBQUZggIQ za{TGuHSuh)=XIl-%OVOZR{Te29-mYk3ZuY;S*7;3rlzAp8HHWvavzX$=R>dWo4=&Y ztZY`r{mra^IwvXqgdG2?=2s^&H}}CXPgtQ1x~agor29y@XMdtIl#agnrhB5F^j^)} zk=)xpB4&=L$|v`JJj+G`UBr@c1&hkU=(oqxkaW1gS4@SA>m9;d4Q3Xy42(?1c;!#H zDO|puD>*`AlT7I|D5Pg1f|D`g}zdcM6rw;Xkps5JRAjMs7jy>Lwul!ed$ zkTSRMkc2-fBBGSE^hdF2NPUa(@$rAl*9-fK~ZRXj=f9n%56tRDL0RDG6Ofe4dB zr0*c2$7Qoe5w8{MmD-TXL!Vg9Wd|a#?m`n30|BI`4^Es;!dUp$vA=S*GN3Nk5`&&p zXdsHXBU}d=P$^+~PU7z%#W{B_9NG<`JUuZrtsd^#GCwN`k$eXLv}mqqYGYG}ueckO zjf~BWG=?Vz)_WI}-YQ>{t1I>)T0wCayctki08D^h$={vNi+pN?@5#Fov9)9u&^-1M}?yHVUzki-0S`WGiYHfAi8-d6uR_n1=m_e8@KYqP@VjNt8 zR1blaZRvmr6hgGsV{n=C3UH?AilJZ*1ECr->P-Hq-WlfHhD$?pD+(5?2X4t`ra?sCwv>m96GD15`FlY*oUin3@GIEUu5>j}bfR{(eHnxmdH?|f zAj0+vG!UW2JnH?X--m^Q8v+zkGsJm|rVw3jet!PKODtt1+QepiqAo8L<1yLd(d`UH zq^P5Y9KL0-WQ@$jl~Z~OS`cLosa3F4tIUWMFKz|?f`^9M)U-u z96o47fuMEAn$-8gVnLOVfaWh#3SOn};;_-M+KBZZEep_?B=9I$q|FkB;EX>bsEbo0 zDjIeOP#@nNsktmh7!tvQ_a_&-N@izvwYt=SD;}I=OfO}}p?(DTMi`xa#}Ufjr%Sb0 zJAWW#(nKJyT4w}kafC_NXJ#4=d9{*3kM| zDlYr!>?j8D^abOOUyyQvkdeKgEGIUvrZoEgAj5?*B2Smm08(Q$JDa#LA#o~Ff`*wL zj+J$#DswpCO^b++)?rC8Yf@4iue=)dECL|u zUY6mU!!^mMJ-Znk;6s>l9^s6~oefRhlg@j&mIT^IxlE)M7_qTz&SU{^2M%ifiv{SS z`jOCmF${$ehKM$gn9%u)6kZ8H1{Kz=Wxwt7K^Jxkiu4x^{GLhJ`MXq~Km-UpR6hih zA_E~vEZK0zNzxqWu`XE${mrup86c!Y84NLWwJ>EE2 z>H`zt6~-=q-b^UKWb3XES?3AWfZglZM}-IdAr{_*Qn3?%V$M8Y|0cMFJh8~_ot-^r zuPlqp;4PuYfTA}@6_??^kg`&^NamnaTAJ|3$I`yO)Jlfp1euQj1c11_ytqmc0&xHe zAZPa5i&`VsCIB`JVBDJE1~-=*mm*dQy?Z}56rDB?mD;go(O!Ul>#eh{m2DOS!)VpA z;V6axm~?2Sy%$ShCP|RWduK|T9HS@DJW#%9!PNM2MHu#qP~SwV1C=wXC!uwy{kiEk z*`X=P5sCkop`Srk@S7+I8~u`qVG}=eoX}Dbu9nSww%HmO$^_8O4%G=y?DwKJJ)W)ApIe;HGaI4z)Y#D5wy8(S#pMMl zuJLq=^6TW4F4lH)=_lmjg2&mj{cH`cFk(35e90eLu*g%*a66T4phFCcnjN-{~ zvryiqEo3@*8o9_A?k2lbb?89~Kra_-2Ix^aMtK64G(jp3duaGB(x&OPd#!aFd4!nf zLjl1%2tp(Q5K6YV-NF(HBiT)DDH`?(TFoJ7Q!&n)^n!^D=FO9n05SHc`dL{!T+Ec3 zoF&0onzv%ydMRae%I87&8R2WsYK&4}C$W0s-aFb*;th|s!~MyXKtK3w`}5O{ItL6B z+h&h6$d*S%L9y5JBHd8Wz=W2iER6su4xEqz*+2x}sngxGwU zD)XJA`jp^!esyz-c0awUZza^`?+b56YZM_9#RyZw1ZBXxZajFUM7N!(uK>>wn?$JG zUw&u_1f(J#MA;B%2D9}fvvlCzapV1h4SU261Qf+dL{Nyle-<$uv|2*Dd^e}&?-~`# zJIs%tgqxN|zV#sbP3;_=*XPbE!6wNJk?LN5jGnEcj_G2wsl^4{*-@TvcTIF~xz+b1 z3In*DLB73x+PvNy#gE?iQVwFyQEm0tdmN@p+uURm+D!N;wauOBzh`*9WJ)L~CYeT3 z(%YLrE^fJ4s2Jq1_JWvz?CWnhw zt5Nw^)~VXNyLWb{DqPpMs(_cH1;GU6N|xvIWpZvr&PA%sJPMqmjDsSWJ>5T^-KpTX z5+ReEEEHjVTdLj2@_i_UX+^XcX~W(kMGyKXc0Y{l2B|PA2vc$EjAy>hhDpa z#gA}Nr6+jtlQ6TY`uT;vsdcsuUj=nm(xYS!urNMkNl&~@nGF};^RKThx2pl|<(FzN zxINC-rs)dec;Jyo;Y2dnMI|I4>%%Oo9ipCTW-^%*@OUL&J;>Gcz;Hoxbn>?)molb>@f1k1g3+lI$gU*;dYo z#FoIX0{v8tWw#xONM?Xz7S00)BS`@VDaI#=p~WvOpIL;?RV9Y23K6|0Z6|}iJgfCi zM`QiMhU99KPTQ3kxf}gTug5gb;w*$v`3rHv)(0~M5{rKtXXhammZm;zj-dE_OM7&U zz*sO#CQzz3jT9gwq|)`;`}=qHam}lh5NqeYS6L{{EFsY#l@Z zGc-h=@Wsey@S*pF_S4xI6e+OT^BD&h$E3s~t|&NRo@g(%Lc%g3V?DH=C?wz-&VmrU zUIYPwQnxipTXW84((bB6Ax*0nF4=+fMkY;bB%a$%6NANmv@*Mfv^?R8h;WWL#)@!q zj=u;JNXGTsTh6y2J8q%TKLh<)-8j=w7@bED8dvW9k;xtz4 zNFgDo&)>fda29(d=lFSN2wneh?tuC@!ErzmkTY#UucHxJDK;|n>xQwwPQ8d<$^7#P zuqgr&vMe97J_91Fm69}FsrOnXfe#XcI0H$NFdq@`R}Z@+mEqA+EPBgF7iiAhoq|h- zzJ#~5ija|pm+LuD-H$E^z>%+KYFKT?C*q*4*9l%cC`!D5o5((kz|ztH=98k5#=`EAAv= zUnIXzxlnyeC}}_UCZk|)E6J0)SZ~~2)VK)TW@Gzvk_tX0K0L+{1R)W*qMd4&dASve z;L3Rbu{w8)U6!Gg1O&cq_-ke;4+Nl$V4;#vU@Z(TU`}g%eadT&V@whabvZ_Zg$pWf z$;W~?1U}#jYe@afa1^ARrc0z_jW6QY0utOtsTDlWDSJ-ztah2o)RBnnW;po%aYcZL zbfyT`nW3Hy>>LYS&&&Xrl$&zJNyvoCqZ5tFkF-jaKtPn8!VPeKs#51;D6PRV@5Xj; zbu%-B#W06}kmCO~{Q)WiS1ZGLvxSWhA?LyABM)s*CIk`@p37$@`7H(iYC}AqkA}h! z674!@_f|Gq22K?BxG)t?3+iC+yoqH}Rio6e(>%*zv()?{Yj|aKsljuDAhA|{0~QYt z@0L;0m3HO0*h)wsCkQ2v{RQitQ~-L~AED((p||kE+Qx%Z6QlL69Rns5x(NaTf&z<1 z79+&e^J9vM=@HacP=FHYl9m;v9~{#Mk>OapJOd=GgA9iW2mwkIp#Y^X2gkN6M3W1J z$)af<6VL&D;5}eiv)IGr%%q7W2vdhFVCH-zf>4yw~xGLz_m$Uy#>6T#eGID{UH3kO0$Q1jhP<4Z;VLULH|vuDrpwy~ss z?NieYec<_GaKa!5J%2KzbC#%|d*vfW2M?+Gt%e2f?1Gw;OTz~nAd*s2_zV15MeD{eFi>MvE*Bc&&@2WeRYR;$sYST{0Vlf2)K~>o0x9oPd zh-k&3>FoQ1Y69L2<(q~q*1_{6y$l*JuKE&F=gTz%_lkB}(O!uztyb%@mP(b*()fHM z)^|~Ai$)rK{l<6NOsIW|RzSB+NhT=6wbxkV zHiT9e+6gqy65$^nnLfli_?Wvt;AF0SQ-*+!qgrdfX?I~`ix6a9!V-ieRazRC2W)Jy zj#mRmg$hQEI#y=>{1sU9jeNm-H^pvDe5?aSRw};TI#4FIn)l<9m7N_N4|}Y({rB7i zGiq{J)O$tgr9aB8G>H|=GljV9!3bw}#d{ghW_M9|km+VN!-|eAx`eO?)nS^XwpOjD z?{21Ys5Au*II^Z!A`-+bsG%64KO^pgEXWfvRaYSmbjpUvtO1-T`y(Raf_9R72o&dU zJ+>5+tp(vvkV=!dv``%KWKP}`mSH(H?&V+cT!3U@c>>UdEDY>IRdP&o`BTd>!VQ=Z z2Rh}m)Mzkaj@}Dp5CX8JN>zJhpL+$1%Tuy=B=f86tQ-Z3LWxBBTXg1HO6uBZn4hU+ z?6emF$+Skd5eS_At^Dk{cpTswob)VG5%^_}?gF<9T;!vgTbz+;rx}RmwNfe>(f*j&kkeU z!fT1V?iaq)b_P0S-(mRvtdrC~eVm7tGS+$WyiYSY0XVm?Z;ZA``=FjmB8W-cw&Z*U%rakBzm1k}eNL}~Zi zXHJ;oB#0~x+edazmDDbQOKgKC>6KP(LAO-zK+GTBJesU~JHZUIHkq8RZ}Y0+L%BpNFb8y*Ec&KT%oLt$~g8_LpeO@=W@7 zcxz@e8~M?=-vMK*J2Q;bSXZ{Zd3kwuolj=TgD2=ps=s3EmXGKwoxFU#WJ;Ed=IF%6 zOQ?Y*%SW6FXD;5pwC))E?@K7vfY&QQRh8z2l`7%l>4PW=5>>^MMI;_+c+HyQ(U~gE#iu63fUAkzN zzmAw&$Wxj1@E(ya|LMS_RRQq>H|w(!33YG`BZb5ryHv(W->HscpBUD-SU!>&bzT7r z<9_y)DGAenh(?8(E)%yg!7!Pz4pU-^)NVDa)WB|7ZYCdP5enl#O9B%KF+F3OvP+8X z>89Qmag$Zs?A|?!WMElr0w87q|JQ^L46$$P`PEa!*I>!5TMzUJrR{tMtf`KT7EYM_ zxz(zs(3IbUkZ-69ydru)5g8O^j%u^j!k4^Y21=TO!0DWCdc!Hb=-hEe)i~ZYn@{0+ z>?)JA6XBAk{V@b|K9%j8oXs8lJLumDn7<1}R}TODbbDM!B%$t_gr3m6Ort6I8g;7q z{se0Jbv)j2clzwKPvR}TL5IP5I@5y;zrjwxcnCC{9#XFiO}Jk7J`a1&IWn&RgEa35B@sHm1vUW+^7I)y0yVox#E`zQpx+3!(MINbCW}Nm*2kM86^Wt(J2)TyXc!^3!v~j~_oFt8nDr^Nu4?mdx-?o$oBIo(j;2by?wYb@pbBSM#Z)trfx?8o z1c7bE-s1}Sjv z&}faC{K!kwyhw%Ot;ZX&v6^+eI@)+EaI zC%@JcBz)r(RW6RoL|9y&LySDg%y50;hf*+YDI!MHgH9JS?0I5>-j2xmzk4~6X5l3CvM|&O&;ide;CVJ z@WP1+f4l|4UMe2FhcT@A*(5K^f(@^iEss*api=CLpEB>81Gkz}BbaVwJR=c_X4;&m zhEl2|6-=w@c3|#&aKY~&poo?YHT8vbdwwE3^`>h@zje*T1@&nZDwX9o0*NFSDM4U< zhbmP`(SthVUJ|q(me*wNfST=Wsj&)@h?MYP1cMF#O;l84 zzi8_6eO_%Q<6Bu`CaxnO7>m^^p*Zgsoqv;{axfCB-Nhl`DEW5mIs{Wp2IWZTS4ZpG z8EvH-hWhev`l5ssg_zi}QgstbkQ!%l%c@dr{g`H{niMd@BPYYds}%)XQjfv217mz^ zon=yzU_vwM_uE;$I}=HERfyJjh2DO=YBY$~Av2+_u0m-`=cm@V{>Eo0@oPiGYk_q^`gvg8)lh4a$Aq-{6D83zQf6!7;f)W(yw45_W z4?u>Vs7{+9Jy19$ZRL~9^E@|Q&C3F$PRe-srDXff)=lj}HNh%*Fg`1`#(iIAB4yzK zwqEPR-c?QMdOcPDkWb$K0eSyUKhGk8yGZ#oqSsHpJ`F+nYQQ z(i7gLOB#l`{n63>POzG+d4>BnEHx2fa{7JyEq{$^^`#Wmmq7? zh56|DS@nd2(28({)gJr#Yo#1vJvW}Oy?0UFeu?c|r7oEa{&mySwtf(4L{;rlA|!<_?ZYJ_LV$GM9s%B=9+E zTmaq85KE{dB@|0UIu1nsnTw#X`pVqmJB{2_{@h4O5?^Eiqt0;ydOWZ+r4&aPk#tL* zw>eH!ibW}E@%h16=Ya>!p?}H*##WS*cVPD;{-Y^S` z1-xc?L{=beYcWQm3}tLps05OEMjWqB+fpHwHpEF=y9fSCA{ z`3gF4v`C4v0_ZyUenx`brbJfBRx6qlsWPp}Aa^*r4-Gay$dD_;==44GwADkWeQWj! z^V{wxW!*eos{t;=Z~S_?1${xCcgcbjV%E=v7aZ(8hkqouGE%7L<_4!I^};acBtYSy zDi*n!WF<$v3xKI4^aOC`iqzZPW@Uh1r^MkLw3XrM>*b|%N^cCwiHKJb8K$|`{DMMr z4J0xe%+w_zXPl4<-)k5B$uqe}fB|SnM~v+1He&L0&Ak++B_YWM0I=tL6%OcTr`u#(I>D-vjHL5 z>5Q)#Y%03#-8_$)j(gnJAv%9;vb}GNN zXYX3!712bcj!?IoA_m>;lXcG=Q)yjY*PhPln}Pe}nE6w+9KC_5@>7G>+VdFFdHgV1 zqifj-lJOLo)958M;r-3eY<&m68J!2TXoth9-K+Jh82G4szoaVeq8g%4j800zv*V1E zWfH{58`H6ldAUA}nO9-wxJhU%au-sO&TL+zm`A3tE~o8FpO_y}N?ejo{CfQz>~>9G zNW$%@vkQ=wp6?)O&3o;&J8MSATU1n_LCpPt&%Dv~l6HtRT6KGi|K{zPB3Fa8@+;Bzg; zYf(oq;%d=V(UpaUb`?&Gsu0C2a2TP@E%pCaolfI=vmEPZX0C|nJl%boGVeVqU6$eM zUP)}EemCK9R0eR%^~2{fe+j?n0c5gnUNmO~Bo1yD;SliBFQMbq_;wm6jrIZlM;+sVRILbH$6AGml zt$hPCeO2a@BkmqL>--4&on6`qB~R-&DxMh|3&+8+VVHYPjVU+-gg>d$>X90qS)j@{ z?U-3%zFg=1`Cpa2=*`U}9m}MMe-e^cd`12&BK@H-@{TOz7%5{?>JV}oz+%>bFV#Ax zx}ge2a}&|Jh(k#UQdcXIf2 zt+t9NZ@$J!ro8Uw z&%S$QtSb*HOS-n(d0*Xz&tlgsV|ZEh-Q4RXKEdu%r$-qXms&66-|ISxjYb?cChoc+ zLmQE`_jN?pS*syDOhi>LHTbL*-Fb(Xr3o=wXNxzZq6#5N8Ub4>0n&B3ed_O{W&COvi+1j9D->kWhs%}D zQY&d6o7LUWfXF0eTnB}aG zX<;UB@#sF&3H)C8F{@fw@!Edu+_nPn>E%xvBs-#cppiN3&5{0O+?N^=7a|d_bfX@+ z9~sJVU~DvCLapgCmm!e2t0zW|;N&@cc2R98q6C#$&gB?5ihSZ0@@sAN1hveH9XkSE zta+&dsdPp>a=1GZU`gZ*h3&1_9-QzMpa1=}#-6ZJQ`l8p>TK0(ixl8eN0SIXfW%yF zR&Zicb{RzA@bhG~glU@$YsZzi&#G`p;&?g`i<>U#QN5KTTTfqB53^RFgTaUlJ1&q> zS1Ho(TRf)dFq7yrIO?ZBEw{)IUDk9m>;gc`HX+8YNO;slSWcTa(Cty{wOYG^W;f!V zbIpyI{E58}9It66SYd1o$B^t3*xgPkUOuU~Em1OsiPr%VZNDeeRt!i?^CiR#iFCtE zxb62BHk=utR&_yt!az0+(&icr{^H)DS4iv3GzCy7A~V8r+*jlY{3**+clJZ1VT?4i`K;DMXMDF% z#$=xz2UMvg4DGO+>bWZH{>1l6s7eqE0+DxwV)J4_&pd6JXu*Ff^PMNr(vU9yvloDO z?ruk3ePz^gSqf!+`N$wLR03*1BCU`pkA~c;G!li*0ljcwC`X}WihSn>wGxtg=x1mW zv*IY2j(Bm_a||#_#ddG+wX{+q&&T(s!+Yp?kRi9OK zmD}Pu5M^)|SY}wZSNRPy$sDP};#r&wl|J(0pvp*5x9|%%%6fuhD%;Rx%GS=++W~>r*ij z`7xv|8u6f1I_m$syERC(ll7_K<@IT%8?J0xa8mqSyUCEyhEoH76*n~C%aqcY^Tn*Lmw{2N;F;k`E;Y_U z2ALyFUrsBbSVc5HoWsOgc)Hbz9sxnkYvm_);IOz5X?!Z(8x?CtB!yYr_Xzm64?`QY z17VCt-(OB2LDi{CDAWz?g&Nc<!Ut;G}Byf$k=g_ zNalgil!QpKI1`y~Rm=eFdfWf`pMP$B^%c@oAQ zjo-vXq`Fi%&0~s06`WEGC1^ac@_EVD`p`fETXC4EH3Ep(s7f?23*%=AH@*F@yvuHc z)T@h>*dbmuPsnTP-)Af6A+1|k?qt9dKZHd|c4PLiv6BX#B^~`}${w+NC~?7vI=L%# zAx~Wp1S!QQcB+I(M(Tq24Dq7!XU1~a{zs8brx^yMaUPy$_h_>cscB3aQ(AnWC2n^TWBbv z)SmAOl6ir_Pj3h6ilQjU8r)YmRSu_o;Yh({*@(Ym0Xwy}I@ew|jWJdbH7$>ZFT2{% z1jeO%==n*9>VF!g1@nB3i*IYfa}BXem{SN;fTlr%(dkc#`o?FPWs{A@;G*d~NvSoG#pw1XjVb^Ug6wJp2!pwO!AG@|@=>6nf!q zuCXjB@ftgvj~D{d{a82hW(R$5@l|xaz3Ar*O9CQa%X_e_Sb|e!wkXESsK55xu%x#v zZKRUBY#CL@H0ww zTg&&h;@OMalg5*db}P>ymFqI?80v5mdGWJdpuNTV5pxI`-!?Yl=wb}xH=Y=v7uA|nM0fHnA7H>jHa_9iBO?IcJkL7%c z=?k^XzlKx#4Uhws6IMB{pQ?3Dl%R?nXlmQ|bf8@_!Z1AspR+?SC3Rs~}w{ zbY!A2VUE=#ub0Azl7UIJK3ID>Fqo!B%eDBc+%ZubE{Xll9501K890Jf z-Epa$r-`7&Ju;MU%#JsFKA+j6fdrdv60rG5=1c;^7<5RW3*60c4sI(6)(o0d5>DD@yeX{E^) zE<%bc+qjb&d=PL}SqKze?{;U|sYoje`-r-ZOIHEpVlpWxve?Z=WiUxB;ZhUfkP0fz zExU=lw*FsR(D0Om-}WmjH)T!5&Wv_4{z7*?6gAiny9%{YfM<)mJ$06 zlNQT%;Biwi@w0Kam8Ely$kTH5x;JRl)A~N)i4OYAI|kc-^zr-f&*z9=_Y>(?=Y#z8 zYdVJtq{`fg9j^np4ChF0b7V)_FEe}W*Cf zL)LC5UjXAxa{x2_yWTtZv7^iC7y?|h>GqZ1#&$(i@Ap~d*;+WxXWX+F9D^Q@Bop%t zkzIGQ$GP&p&$mMo4Nv1q{3BQ`(>C9@+YubT&LX9O(>z|Wo>Ldc7eY{_ zqfJFkgP|ggU(z_@4DJR#;6{1zeA7-pa-ms!|852KS|bE04%o@2P+f=-rQ}gK^p^@o z9u}xnbW4CK2^Y$U@BLVa&cPklIJd__UAPI9PCZT&5>SAK@ zywmg;MqcTm2lE!z^-Px$R9|eb*>uwHPH_)s+g^B&hMu4#F)?(*Ek18OG1p|-*fvnR zo9N%!Qh3v6ei639;yZE^)3^Wn(1e#5YBGM!UgUGmb&(4Fi8Rgknq%MW`WGXr{j=Yz zbauyW7wkGtwwirjnEeYSgKzER%t;S-2&rykfE?W?Y!vvgFS%b-`&BUl$ptACjGJ)^ zmMxDse`avdp9ku6lu`Je!jkQ3Qm zyj{ol_dmI7K8W$LDv1g;S*o60*U5E%8+>7inPfphJ|eHr{&kcK>bUNzowXmcIQ3CT zKtp>Jq?%;N_%A3z{^27kO9VjG3Abbmt zCQ23DasdYFz9&yL(t>^1GVtCEH00?Tyg<-{-5M1`4BS^K*}}`qc)F$T&``TmDf`M? zro^w5iXj$2c$#``l&+JIKvf zP1n}Fjdq@OJ9F_>NiGKV%Fp)K)pgP|xhD$y5D3_Lo|5GkY%AihqwWlkM4v=^r$`x} zOFjrax+t+mAtNiR2D|7Y4VM*G^S(9yayZWP6^>a!l6q;%UiUtk)mOJ;aK+7IYKv-r zzF?1@XksLJm?>s>8g#z`r97QKvbiz{B>B2OEDn2iQ2O7TmMCC6-mvpOxz0xi>PZX9 zZNR>}o#?+%JR=Hg-mL}QWN|sX;UbEHZjW!5PNaeMPrHF9%1^`gMY(JG7oFP+D}0_i z9=#j9rpNWxvxM>>-O7`f#Y>;z*d)@Xadot_p4l%o?}jN zdqan6?<-d>UMJ01>o+cGXU0^uF~yM9|+%)gufoEV9V!}%;##j zDNXvH+WGh!antL*z0-bZ+0bt9%C6Q+U&Rmq8rqMXUK$-$51ObCF5zS+&RO zKEXt=Jnv1Q*YIfb101KF^x@j=RsteB_^|2g`mW*?404>`+GNb??cr@PKi=!ciZlE{ zG!_b|AM<7(Q`a}jA5BgTkXql1&SfEzjU=|acH5JH*d!ADw2&VEbAVbzq&eFABD$;V z?zo{Pum}zjHer-c1LtA$Wm126zhnvYm@X;OC-k!JH#qerX3XcP9=7N%?e2QvNijdG zqc8-W@HJ^6M%8;|lll5}kf5u~_d{_m=Ki8#{(Hw4c~@-&({%oNFx!4l3=9Y`t8ex3 zaj>nSP=0$I8ci%0sna_{*FQ8|Y7}Bnv zF2i1=b((?-B!v54DYM>|9Gc4tJA`eZ;NiLQz{1$ETujl%R9UJ}ahOzxm z4jC>Uj}H3he~Z0HZ(Lsrs_RYdYw(s+)}@Mw&{_5I+r8N>F<r$` zr4u0wXSW3yOIk9{2YLr8FfvDB+FxZ&Hv@SRbAbd z*}cQN_o+5z1p(snfU{!}a_}ey2};8}4e0$ccw^6h&*ZgL9ZxBvTLkZW`o!JF$|Xa2 zcCy}akPAXL(*upfV>WY^R;nn8W&58uu%<8AK13bmvO@Vg>v{OO4XIXd0N)1_90}17 zd=B?Q5;n53uMefq`23wDNaM2$I+g*RDkgz;L>L6f6QZ7tx+rnWe!Deupox^W&F($* zzCU!C^{dFdMkegc$Z-{=WyqbG7ppE;+~Oidi#RXYGzrdg<0{O6j`qRyllMdCesb!+ z4-ydI%I4wvxq^an6hl7qvX7za9JQF&&rc~Ixx4~&E{W-T_x1w2@bdGP*C{qy(*}cr zmbQ$nf6gB}5nc6%wk?J~5A%)HY%m!U9<3SOW?bRTUE=t9N(4h)!|J1R3f<9^_K^^|D_-Hu!!I3l*(&2b}9FBncseeEz<0Xq!k_q@6RL0A@o^e{Gtp51eDjz zpVKOYhj4>7So6{20tfr-r>Tw$JL%TvrBZgc2DT&)k)`beN|~&^GqC3o6Dea+;4Q6I z1v(FmF*|dRAR!@Gp{TIgu_tWjF8?;=OIyCs0oulVnafZVo;_X&qYb*39yyxbPna`v?l8Hxo>f1gKG2(QaQnp<^VE$CanN_TB!FZNJ@Q@U>YlOJB+TerJid_=ueKPr#VJi;trOU+kTd;RPa!nRp1_(NOo+fnyUd0b-u zCogA-Y-?^jQ+b?;maVO;Q3@Xx%UAG`8t-Clytd?bF7tTilWO_bvkYNMBp%bl(2Qn1 z&8F~TJ@&kJ*0`U}_CAjcqm&aKn`yFdKktX5jrO!L-;p%7PgV2HWm>ah3OVOY+52D*65E$}aS$7%hi{rPlSU{gu*- z_P3>q3;whnHjzSi{D+|p`_`H_!}uG|>!~gLb&Y0#=VIu6NCzcd!%L=pSMpP~J6}5M z$*d>>0m??xU}L;}i=j!;m5JLrv<(IL5`)@+{^5B#z0k;S<0t4Fcso#tO|!oHE?G;* z<`nVJ*%fLNdrn&^;QO1`CV04#rSQiM#Vg;fLv-WDujaUV3*aTA>?Xk9AA28>ARxL^ zqY=lAB&uu-q;6!?MNFVtX&1n&I}i{PHHSrr8eT#}7YAajE4(K2KPsgg!9t*G4f~|lb9uXsRLOafi}be;f`iksi9)A^oz}?m z<ie@SW|8>;V;Q@4}RE316ENawIdQtJ={ha809xT%})>V{#Rz)hGVxtFc@@&Ojy zmYkp)TIO1AD=Vf67aaYj_Il2xLOza2JLH8WK8yIA+iz?zsO}aZujdpjjIelPJh->y1v}f-&p_h1GZaJlj)+&Hts3bcj^-g_o8KPYvE{-}gxLtbkp4^MdxZz? zo=A2nrTWvhqGg|k^b&Tdp;5Sc~hLfNl0VP+7!hcp3eiJ$X}jVa3$|%tRKXiRX%M@w|u`>Y})jT|Cf(d zt5_q^Tv3zFdq2i#gr%Q_Lu;%{%`c_)*j4Jaw_pptWMPOCGGAB1B1hZfB!0lP-PP%y(7gI+BXY ztuxVosDi^&!a7F*LRX`$*(6QJx)ZMmRi^Qr*#S-h8$)CcOyS~?VpV{k>-kV z@YWd|yE(04Z}8eS1jLk!n0e+hda!>+b`dT8ku=Y`*_aJ}VBkN@AMdVQqrTq-ieFvc z{`h7LyDU;(bSo2Tp?X2{SL6cmOrVCsK8ki8u*-a(%->c-N-H-<1pn!O zpKL^?`5^~2jOeTB*3cY=i@14k?FZ`V9$$65e*tJnf7l&5trp%#j!-c-r_}U@K2wPQ z#GY4s^dm6<-?YersEc}dF-WtzIT5Xuiahg!twi3*B(i^sYeVLr7R+{5Jz5L3cZ`GC ze!m*pYK^#Iq4TlObFEw1G+vPXL+H(@hWMh3pP4LdOTKfcAbt|Yte2D?@!#efK4)$p z#tEXim$(VbJ_N}^?_*po?^FyBmrheOHbTPvOC)8F7$Rapr){W&SjzsL6}G#J9iiz- zGTzcM4HJu0KRD(cghe!q+zz**+^tvkLO$EWP@dBtT1Jv8boo}He+0$ZO5QXdod1id zYkA&A-}uM)95q`5I!4>SwWTsJ7l~Mk8apGjRW8pW^lA?G4t z_Uns1m6UJ{OT~3lW!UI z-uAbcO+d=Wv6{-G`-v4n{A=)o{Cx^EFhF(7NtbD7)FJ+=*6=MRlk*xT0(9Sx=ow7@ z?%(OZlycJM#*?qDvgI_s(a2C;^EgE+r>e11Lhb<5JhYa|Zwk7NwgWGGYwY^`sH zVZ`r)8}o_>23%$~c3gPEPI?H4v$3OX^qG9v7(ly_hs)7?us9U3z^RBvXGdmdwZbV~ zu%8k2^}|V_=qTko#|r4>PM4dHtpOCLtBej<7>!Wp;qx{O9GnyxD066e)m6~9U)93g zmx~fr6*no486S>r{8H7msHpb7DSz{d9T7UP-{1?nX6#|n3H^x(F*O14QLP?I!!x)) zaO3IM%vqIpfwR!*=52z*O|JQi!Cq_Y1aU-JW;#;6iGGjeq{fZgxv$YguV>qRmWId7 zgly<=Xrx9RyT7@o=-Q4Wo3xmShnR^-c0%9SP$((LL0t1`wiztEM^z4j+WT zl8(;kfA#`!e}d8&Cow>t2J_3B@5ODn^K}QX#0c15|Io2xlSFC8aLeG|y3Z{8YWPPw zLY<{`!1;u?Wj@DLEJ!;_EAX411(WLb=AF=y)S`La^xJPM1 zOTa8R=C#KJ=t;**4gND!cM7?f?zr@zjlWoJV;kUxx_2}<^^=b&l;RwFl zN5??)eAt0eHwdV+mzp{2Xd76nFh8KLzVhJH>ew2E*FGiy>+Z|;({D)gf}E{S5CVUB z=6_F=)nPnI{W^a;e^OknCr-(!kfN@kbL51o2-d!xdd#`P@)d8_jt1ejdeDG9zsCLQ z4^!?D1lirRspc2s-_Ol`!xt8hVC{n=GGNUQV0AypQhxcJ-t}xLekQQx2-7grF>Q4XM|BNYt!xg0ehD5?qXX0nM|tfR)=6P`krdm%>CC$Ew>C8+)q4olcVWP-?{&)%|EI_WdIYQJ@m7Y52jmff; z7fwKVk*TOClH$tYP(?}Td+9KnFmo$&ckkMZo_1?p$$%cH2RugG%k3Zb^fjJ;xKJw!ql+P7ArB@zmdziM|8ntCP4%U{Q z`OXt*?VX?gi)Zwe9nC};IZti(?=_}_Wv_W(C28q-POl8#(#!rA;9D)>hZD4U4<6c^ z2tM6 z|8K}R{UFlK$?|&-KF#{8op$)BXk5LFm3tZaNul465KtQbK0w*W&lR)S^_?pXZ#%5G zFy)A}`QRqy4i|Q+I@cz3#{L`j*y|=_(`CtNbJJbB$-m7|TebtCl9`Ja_FonJs0J2@ zHH@^w=M3U`g2~lPa3Id6)|}QNzcHNj6*n8Z`<&YZ3ZBsEe`W-MZmvMct7VeU70l=9 zvMcYr{+8p&v-MRMf394jaPz=C25(mDwi5ebt$XzW?}NEu;~=x~-Om`cN^7M0*V%dk z+-1W5^n3Za0=~bHi$)4xLdPlLwLAJt|b zy>^xXjeFBP(o2-{E=LbK}C{$}q${_NVnGucOs zhNgf*wu7jH$SrW?g8Lbk857^_C=ba9E!`7%wuXN5GH3?d8x5xc!5;IwfbnsPJZfhQ z>WrB2@c{&|MPqUG0hU)|yk`%8`OY#v0f!(B1NmnMxMFJi6UMbFa~z(Ta4XoLg-Qwt z76c!lhX6CGfvb0L2An$zCiu6re+(lCi}U!^tFK_{{{jVT@BI%Dg2s?KI1BF8D;EK5i~gn9 z?EiEczxo&B!wHLU>Q`_^0PMg1?Z@KW`LE{yp+&HI4z^3c5P$ue|CRpZTKp9e`1f!6 zzpDR5`0r|@8U)gyZauqk2QWq&g+(xAH#VXMUpAt>iS6ovX?Y+f#1NAPcY0cc zPI&mcwGkmKa&lZd@5YW?jNJdSF+(h67Xkbq@Yg2)Un!XX;FAB9{yzczi}o+*lufBQ zX`f?N8O;HdGXzpY5E5UuJk)nF6e11&GRlV*KG>rXgKs%o5CNNRBewWBk^vZ3ineYa zq*YbhGa;s=GK3;R#87fXeN@tQyL&CMAsWi!jah&Yf=_>;{<1J<-jw6?FNeWH;Qvkq z{$c%pr~gkt{~`p;ih-@`05!X_BKjK)2GYF$kF~dss;ce!g*S?XAf|qB_@L%C~DM8#TSNAC2<-GLS z>{OL&w%B)~so32@*%5;AvNI={UkYt|?hJ=E<0*!Z3edGT2dVCGYax(iXLk;w&jgt6 zg*J>NO$wg;4cuqDUm~+q?{t;eNMhFgl?MX}c-Xdk&)o0e)xOKKH|}*7 zZ>cG>-kM_7U0!;&xrXv>&f}dH*=9{0x$oYbm8)Z1>aP6IXl=;nKI=Lj<>Pho<*#5h z!RpxQa8s(+#WE9q*+Jl1ZoY+dt~nTY4F z3;KMX!&&E-`BMM#N0+yL=ud4+Y+l|@0s(8W2_5@^pmG9 zj6&sDT5W%N&;EXscHi`*-O{g36G@N|;5}PS)9DFRq!BzEnc{bO_}vlXI-3Q_f;FfSgt?*%LaEM?MWNy=ru8Ty03E? z)ioyXHV>t`j0aE~{ako))bMv<3=?zlCUPQy3x1mMs;1zk*?2Xdo%L3lGJ`4a(diXQ z^<`oGdEp~U-q&~EmkG{zTkY;=1~5zi7-|ojr{VV=ZFUQ2uRhqL-8y?{Z`Two?s!!5 z2)F!YnD=>1P~gv#!8e}E)mI+Jt>mt17}DL*tZM^@LGlxJ+aRJ!8l1kc%w&H5>5<9G zmAt!?URca9XU$N09GC5mK-|Dq)s>HvaiH-$ZMeYx>Glb;wAfSv$6-Gq`GZ)y=#Ptf zSE;&&pCU9LQa?5JDqbh^+|443n5x-rKs97}aM8jQe#mvEyIjADJ$)wly>i=kf+zQn zc4;5&yWF)j{J)+9b^T~bIs)qhVxxx4vk=dW?9HRnOY$xd8W!|p;4>0$4=O?j~mlczxPdADLF zQJkX3q9A$w$R5Oy#w@{R&|Xh zqn3O5k8mRxwnI@6mJP>H<&H=52Myeg6R>6=>i*_#hul&m;#qr8Y4pdoi}ZEtNNrl< z(aU!NHwY#y-HMf#{e5Q-`>K8QYO*^e#WHkSsHjBclPUy`ymtHb`R}}3@$92b^*ucQ zs-{q8@dx9mfxVc|dgCTb<6dfY>RHoF=Nfj3muF34^pJg@@9t25y`FT_Za{phuY;@Y zCbA17q)ZXdl6UVujhw{N-(}hDYs2#tI5)S^9#|}Haxiqoz&+TCPrnzMczQr6YrDm+ z1PzxF>DxXlWm~3{G6`-M_2W^R#Z$lQ*hhYMoEa^lD4tecc`U_Zp-`?3Qw@4<8qSWZ zPrh5+o>^Bdlejo&X+%$YwkUw_yG3T1?KV`2@XO+FE#TH-j+r|CG?9xFHtowep`%Tr zU6E1r=9yT?LF$!j0K?f*bxIS@w03o|~YW^&H#yuKdk5^nU3^ zP4y)uS){Az)BgI^(scjTmv*6`{#)1r_SVJC?fN~9)8Z{dS93ed2bd;9rPFNhy=CTW z14vEeLgQ;MXZONC$S#NtmCHIUe)aTCIr+YYVIxK2W3W7$s?WZT-PZh#0OC8r@XNvn zl9+y}H{J8hUUTZBL-e*6=e_Aojp<{N&kjjF{;1ElIR&dh%An!k_$ktjlMfpYEnw8OP)P%A@?%=;x|P;TQp%9gA|@Kk1f3EqVS9?W_&L#6t0UHnWvbk` z5s}f6_wEnR;r2%)9Zn`kwpV-3oAUM%KcT3pil}tjnq^w(GQ2UZs=GT<7agrNQBqRX zdLaJOzAvn&Za;)FUhq#vu4eDIfm~O!E`N8`qO+z)qGtzdnDqViZM&GLku4)j{`N;fz$n zu<4(B$7}>VUIU4&C!2~s2FI(GP3LjZzg&#TPmeCB@Sgs{!g;APk|{0YrNVc#IbJg= z`IH!U=lE&3;x>bvsqrco_SB_tZWgX|(DXyG)|OXC%zX8&#kp0ow~x5o>J7Tu*K{PZ zzl-xd9P(K4bqE<&Ijb{JoxeBZ%mzG#dw<6JXivLbQ0MX@ zC_~)!q|3N(Y9@Qf0&mKqoK&aO0^=#$szVL+I3-Hx)?Uk()+VO>E#s8R&qG7=BQNaR zh?SoI9Geo3Tg0l}&@f!xt=?){{_bjUZn2;{O3ks$l|pJLS9=yvb3$f{87gZrNJB5+ zPs-OhNaoo_`TS2hu^bYR0`XUJ>u!^}*qCJ_S9Y)dyl?IOLe`17Z{itp z7>5>IzpR=EP zl0cSg@gq6(1Xu?4|{o;gY(a>%(R}#N@{(qmA$K^{PYWs(4#R~9C6{$ zpEe(Sh8Oy2A4+&L3Q|@5(31KPd$zVj{>1Jk!p|L)l6z?c?V zrj3_QrGIj4f9i4^>9wz6?hqS$vsO}EW#VL@G4?i4o!Q0_$)9ar720uR4hlv4diiXq zDkQRm9XT-$U^L~W)*%HShP{ai=rg(-;H}L_5YlS27A^6B$A_nKmnjQ(LbS2u^RPrJ z21AC(`j@%&<@9_*es~}f*F{re!{aB3*sPtHB%`Z$Q3ldVztkg1)=)_)&fA~v&4wdi z`cVIcpZfl|+Bdx_52Vwa8rzY59()`z{ONA(d~*YeNsv7i5v!0nwsS?~eAXjA%_mtY zA58Z*WRbEd+16)w^L2hMgrs4*x%01R5UI1XEDr>r&h>D-Jmc|6qwjqGzIf0?<<>ga zl;CAwfaIeaxvlRVn635rma~81;kM@yVI6m#G019{)z9#Jem3)bEzt@$5eB`5D~#`P*O8HgIPDX8F=uB>rMA!Vd=BOP zf05OlPj-b|@s-$V_~%opW-?PPxu~E|Pj7l^KmI*^==j5FqAd4?rN1lFr?}tGgvvQL zx2E;d<`}eT(hH0A;_o`HoSA5+qnhtw%u#L+<#K-w|MiWW9&KRoa~6%VuNM|64y!l6 z@5$=UZs_PCOM=(8pEEj&RWwKTGB$Ts!p>I(htA1~=3mWv8tS?`OzO?j5u#F^bPmFb3I#33w{BVn_Rr?seCgC?#aH3o7^NXC=hhx7clzm$PYT|&A**+`)z#Tm zkL!qOTOexCRA(gVlkeNVYzIRp@7pPmH=52~nPRK=Hn?x?pXj^Phn4koYaWH6%KI!()%AS7$;v-jMOtO3 z@*VH$9gpt~SDxI@4+wjnvLq}{T@|KUF{Jul&01pbzNIi`b*#JERX$a>kLxq6HME$! zNF8@6!`ntbs?=TLT_2^DoPMW}kK^rU95I8^KQ=a&NvNczCdNXAHjunJHH=ZC$1Ffy zhb%17JXIrk>==gPZT5!L;aL4*#Zdj9!7r(J_q3A3b5@qpn#au0aqaPM`tUXQdKhlV z3JF|l9_W8FM1mnAQq_S4p1a$vzsw^VzjIBVXQkDO2w*?)hq*7i^u7f1qIkjrA;oKT z{!Pf&!$AIjM#TI-oEh_9gKNs?1*<*cF%FLD$tUHxwg36zx%?=;4eU;wbnh zpl^2~M6-te6{5MTcYexOseWIOQp(R66&IY$O z(QSEmA&1usBC2HC?$T;552S3?H>e~&lvG!5yX|-$ZRvlt`(s95dGcjyjF3fDhU77^ z_zigenMIDdSA<>y$(hIx!iH2cHe*KM_9HTIwh{SU`KB?SK5D6=J zPh}-jOwV_Iz7`w(8AW)|bBu1dsIU4CTuK33mBzob^<`}v6AoD6ER;N6FL;8Ea=t!0 zG{H9%lM%p1_lM|GQ&AZh8ruK+x4pYt?Da4kZgfeP>$$W;B0O)`;wCk^&#`FK2S$ijgS%V2!;ni^@q z^7av5!`NzNIE9og#i5CbeAMqAR9b|PJ^#@Qd*_gDZEbCMcNW7&b~d)N%d>6e=Ld3~ zzPv&X#KLqp{1G67qTTRAL?ZjG%`YQAvg$a8iSUh$jayq=X=!O{osHgSOMR)^^Yd)a zoBh!5(!31{3Mb(TYc*2dR*R(8EH>zQ$to`|zuc2Zi-U#`QdQl9$2OCZku5DPO;%Z_ zcaArD*Oiu*HZ)wsF!baptksZXbw~$hc~PW|&u9>bEKtkRJm7V)TI!CUnVEr)R+EvD z32ta;NKH-6&(F`yG!YX+M%dNpk&~0(y?fWpY&j|E!Q@%(6OnnAPZoH{fO!aS`kg8H?&4SF#a zP7iT@Udf?8zpADtmq};z+0k}gUENK;q@<}>Cf)At?hhY6&^5gmqZAYrWVk-^$IHz| zM@D3v!It3a+#(0|Ed!R9tkIc3= ziHDJ(YiMX_bhNs(R5?%INN3d3Y#cHR*TaVTqAY2lDi6CBhER1imPgcS1qFQ86BTe9 z|Jpo^x!By;C@3h<)7MYs_aq=AvoSmJm}>d>P*g-zl!}T9zOwC$7cVR=JrC9(rA;Sf zwY?IGRLMXQMxaw?N33yWNXg1Z#l@Mi#+RG*5j5GFv+Ib7{dj#7H8L`iOwh+`bs*Dn zw1|}7!)bk_5P<_%j)*8eHumuRWG^FwdaXeuz5n*@+muvP>FMcQ))PPe*bNL0`krl8 zzkT~QBO_yf-zo29?y`%2vxSsT`et5o}LPL9&W&t zmBDPqgw>K z&4mTAlZ>xl$A0{v=HfbvGxSM2ciEb%fiFZuLj!O8fm%9myu#)o%%#XyOwD2@#lxG+ z-!#_#uU>%7%?lq+iMR}z%O6(CdvlnZV{RwAi?D2PIUoqVy)S8 z&D*-VFc7DQoB3b9sOabrlag-E&9yv#g698;%?v9hyUGf`vhW78ZW{}$qj(~8o~n{UR(v`U+ULqc@n_uxtPxlPkkQv%YS<^|Rky3SSIzwG;@ zC|Ot(hl|tGshsyaV;JCKJbwHbS-3lymy4BE#R4Oq$I(rl_bWwK}?tk$-QowEBqAk%w#As)Ik` zVUCNK`fC5ZqvJiXFCXxpw{MZLg60<&@$cP3Mi8{DHov}kb-K=SPm3QpP04L-DA##?1TKNOg#`ftfeKYzu4^85LS{jM+{MFt zw~;>A*L%UZo$rBn9G#pn@7%!;mrzkxw{~gx@Ii?Vq6iW~h6+r_NJz9IS$5&i$bfq& zu(KP{37Pe{ea^oQouMLfX%K!@Rh)>DaVzFHS!dUTgoLHV#h92FL}P78jv12I5x-2m%CV+ z7#}~5^umLS^q7GmE+*#W_!#-ttq5v*Ea%i`&N31bKOrbaMh<_5lB5QdHaNwjw7#w? z-WN-p7MW`$&MBH*A1ziTkBW?hs?ucIlW@rLXL%VF@$~6acH+WhX>~Zk;o+X|h}PGo zSSe?{?QEavub7Cyv#YIz0G@<1-`(9sP~f1!dbZyFOhuz4%=maiID2q!cULD#T~pKb z;`HFp_n^f1_{GJ==?2du)dTDsevt_xq9(??O)b$w_h!DcZKmhvGYFK{*Xt=N78fQ# z)WKY#%8H8fj{+QbYiG(6MDV2Og&F;kDdbi>HYdlj70FqykK(m83tQW5(I6~kW!>Bg z_3dP%>qSB)eRNXguQhb0t}k44@Q^r^)3p0OB#2L+?(6GM*ST)1tUkaB`u=BSb+uHB zF+%Dd0YNO}*kMgWW$bRj%j5ZQ!OO2Mn+es`uI}zNALLxaaSmqCVp|X-7GKr#C4_Gv zeJ;r0{v~m4=>su0H~$9ZPF_(_R&CH^8a#*9_v(_Jm zxj-cC?^vnvw$oOfNY0q+6Hz6lUpdO@IY$hL_Rh{QBDTQWV^yZdfB!(JFYKMbg3S>j zj9_Jfg*!7J)V*bGYi%`|ZS+>-imI$U5WG6yL%$Up7@-q_FbMfPlaIN*LUl3D2MJfn3{%7_&>JpeP1M#y1| zm7E+V$L1=GOfvL2$;``pEQ|yA0kGCZG`;G=!UFe$FgF~3_|D6$f(=Kv8I!LVQB59E zd~RjE^Y#NK!rX^VG&W84A^{r%<1RMSmru`}^W1Vgb(N@gt*opd&6We+{2qiI6cA9^ z%W3z!8J|G|lZjI5~Z6N%Z$mb@NG-9Z{t7O1W4Dh42s~YZA;J7n9ZfZEed? zd$Y2#x^ifjM@Y#J(CG`I#cq4_)AJzdSoV`#@KWG6UKPAxJQ@)dm^pP0z-_;Frd zUXf1a+Dd=AhK5F9U?8mZ(NL}`6BCoDsA%hJ6ms%ZIK#(7g#`umQ0kP^B_PGX9~>x2M14&xbaJss8BHdSMB9a%v<#0+zShFK2-dDRc*(TC|Mw4ETA>EBfXVgQ*xTc&q*F)>Chj0D|AN-I1;Kv7oC>Ty1 zWnsy1a*ju)D60^rkbXx+eK;~|eOzNya?0jieNR{CO@zCn>gjzhd~B|BR)mm?g1v@~ zy@@(M!u-`hPy8t(+Xa~^mA1YIo(BgOrA$^8?Qd@^C249C@B+yXD=BRzY2 z9Z^yAa8yK$mk&}LiH=6Bo+fSlCSX7S?hp-t_dPs3W_`}A*IU1zUtB=(8@rGv80LyD zn${}aLvTHkA8N+su=`5?Y7tIdzfM_g_U}*2Pt>lP697RnKYxC1ZvNF`I4>{|1u@p- zdj*?!vIaR>A-ih9D%3417i)LK(m88r34`)dzMeeQptERc@0M5N=V*OzL1zBBSuwJ! zgRS5jul*>{05ZYB#8mkHE-ei;b^TxfnShtMjm^x6@|`=ORrRCjX!+u=sKm$jIwmG5 z3Q%5fXnX2L^D9Pk;=LVCHaA}9{0Q73Y`8t!XrVn~h}>RW-SsxZvt7fdb@l68+4T=F z+FI(w|In2Pyz@x=Yhz*(;{87Nf<9_(Erqi_jq{TnOo{!u}`ah9vd+CO$qsm+cHN7pqdF zl6waFwF3*&U4W$w?>y-jNf80;w`1GqEZhmDS>XOn-0x4+Hb zzP)ZW8lRYu5En-h`VZ3ggLW_)w>pt58%g?xFak#ir$^$h(5r&ecT3eQi9Iv0Ho(PT zT%LUPU}0flUkX33^#nUK3ax%3Vl%ye|2|}EZb3nE1YoQx+u5SR!s%bXnqRWQ#&_eJ zN#b$TVvNnr%`GmrH8xJq&ZbT5sVXmLU}W^#U3d@hF*9?~59ub5JH&5Dl~q+$S4X~A z%NrY3W@fHuht{R07WRc7K45ZjaX|(~MGb;Nj{rbfQC$rzt*Wl>?982pH~W){rclLS z3?*U)-fS%khtgMk$7K3^;Z0uBSdrCxmM~8lm!y>>x_&|I!ty-s50OP>TF3!(^3ZozZ zV1S@9KF;&(na4l;&Gz!`jrBYDCxI2zhGvL&At7u}p4i#h;gD;ptLxV~_+k`fYGnVI~) zmwfc}^xWK^@-6`Ex3{;itgHZgwda1Y^BzPH$nIg`;fnI|-mnwXM1yK84#fxdRZ-b0 zjML-dMi;x{T4Mw}_RRsqtQi9jv2D7D{rK@C(7TkBFh$*KIq=}N^DXOqhBXe|j^z+l z2S-N^c6QLgLO*MHVkS|)=AQ`p)MZTQ=pe0s+ z>*{?|b&miY(QMm`0IUtk(>i8;VPUA)P!M6~R@OBTMQR4PR#sM)b9q28`k0OmRza)eIT8ZM z;81fj1*{kaT7(q)wW4(>XQH0`vOO>05E)@HR;LEc;;qOFfNwCcbAEmvauCobVEV0< z+l!005Z-5p>dMOWOiVHNv>cav0itL3n`00%W1^$4PORBV`RE2lAC=gTmAs&q&dSI@ z2uVq`e;{J}VJ0pqS@-qpllz$d6d(`1`PWLq^Z41=@{5X!a&!OKaT|K=v|a;RCu{3X z0v^C2z%SvGY2_2dLZ!d72=;8nMx1=K7ts&p_5%T9FbqdcRn^j30Yj6Umv?)*Zgh4w z_1kksgL*AihwrB4zyN+&$jQp)7ZhM3*xA{0?m>J$dIb0~Z)DV{d|Zz?ZtV*z2M5e} zP468Z8j6mHIH7BN)zKBl0;deW(Am`mQTxoZ9@ zJJRb{(^mWY`}JNY4zOl$wX=Xi>r`oIK;Q>k5|P8`>(9+=Cr=g@CwXKVPBNKCK4)Z9 zSdEtjVUw%u;CFnwb3m3L=<6dSB&4S|l_?unn>f77ILJAh{`Mux{ijCAi9H0^Z*L&r z-e7=Xfn05uP0EOV*7Ivx3&KiVTwH1@%lK7hem=ly`Vn$K{c05jWo41n(g+~3b9UT? ztuRRTKIXIJl%wFXGSO zoZN2v>Mdp<{Evy$ix4*P1 zRpR`@*^M&9>FwKvgNX?VfRcfNWHw&r=j8!Pj_SB~JD}<6vQCQHqT%y*+P4Bf3pan? zdKfP(DryX556Ih}KYw8J5fKrkq@+NCnR}>Vy9mPT>{oj#>BzOUH9)JB5mHc9DR7k1 ze}f#_m&9`u0W-7U^1{$wMDrgzX1%Wn#ByJ1b!BA?@!k`5_Lrqv!otD`B@Kd0jPi;L*8S-Y8ECL~60c|tBy1dY>vO@9$7;|}XHfUY}dma*K!@*A)=zZEJ}GkSwOV_yfY6_9AGXWR4ourk5WcQ#Ba#H@VlcFg(B_N@BrzfkRMP? z>04DG$));Uxxs3Swf0p=w-%Sd9)?L?k36kb`0QnVFfLo?U$B|8BIl zzG{IZ1l)ax_0Etazy2M9y*sZ>Y;1~ha?GDUzlJP#gLA_#iF67uXZ(iOKV#&#A$)y_R6 zJMd7j9(;x2!7#RY5-Jie@4RQjdQMT1f}Grf19(N%85wV7)HF1p@-8{l3`xEgvRfYk zV*SX8(BJF9yCSSoy2p=Qbm#YKrg#fuTW%mc)rW=i^7zXd#SiXm+~EbZQYoc*|9N`d zi6l{NXLfBVFwxb)Y%^0+pFEP^JGXjdUo^Z=Df%fDhqUX!Z`615MdjZUHTn>aoSK0G zW+eHWnYPW9Arr82^@ZWa{6w zU57Gb32YbQ5k*B!QH3xXTFJq|VLRdx+wPTb{9^h@2>Carj=F))_lERdXJN5BD>=rz zAk7?~l5jrIR@K*Uuo!;K&))!BB_!^_T{L6^1A}aZ!aRYUIPOI`v(V*)Oa3*y?-yQ zqmuwkDIh@H)HEwH5-+unP_hJ`fhx>2c36*#OnUa(I2X-<`|QDLZ2dY4o<8Zf$kxZg zwKoqB4|9re7Wh9#MDTd*(;XaTNJlju&xL?Y=H}^n)33h%917c;H*cUiOifSgGVp+` zx|Xc=>kqStyZZ*^j}}j#KgoO3Kicm4Q?xJ3LKT87aGWkgq4e<+(&qfURdMQvVA9NYS9Mro0&!au_$r=%Rih>oS6}C|6>P}5`Esbd zus75@p75wFuY>@>9y-(=c*Nnn5n_mf_-(ShQ?~myW*8wfIPj5+3*Xjn+L$|4*XLm| zV`1=31ZP60fvI=BoO8(C}yWERcurGx1){?@&2^yY)5A&9&*3^x`3e+S(CsV=kn!E;a5Z*%Td7lDn2+~ z348yrj%?c|O37WsFq6o<`tkcn@8P2L%Kk5RkM6MpnQJ4>O4 z!Z*9BG0VUIE?Jp=rbo+*!$o4T;rn|g)~l1{)CRLRGl4m0{sU#E)l$cjN;)Gr&P`@+ zrv1|&xLrumixYWGEFaX_>@<8}F6*C}5nyJ5Ku(u~GD+|Im?}N2MvI@Mc$6U5kbg^G7>7L{FYyLrVy+wosBbqf&(=ZsFuI z=XDKB%XOcN(?YFMIQ7fROAye(BZD!Pw6xiY>?j5<2IaM1l6JCukuy!|H|kw?_xFGM_E1pJFi#xd0Tcp2*oM9rfG!Sz zUc-v(##I6R0AFr$a?*CJ1Sz%a8pE7^=;-dImR3>G;b?L|^9N}s4jyZ~=lb~9_wQ8y zD93$$eZ?Tu+Su5Dge@D(SmUy(1JoQUCCHks+j$W3g!uT{T3S{U73c`l-lWy_^)sk= zPy`fG1(Mt5FF;rX=^IGvkY5Ry2H-3K?6Ly&^!uOs;%1MXtRj!^Tcbo74~GeeLkVzk z?V);tLkGH~A<(&rN=pdV%rJmL*P<1GCJv4Rpe{jJq>ouxW~;1q!8-+q1B6S^31;+> zH8fJVUk>A`P>Kfe&jWe*^Ctp^xJO5W;g$}9FCcmS1`m#>Pj{dyQ%eVvYJv0%2n-B9 zP<)Sy#=~%ubWyA|o5WD)0Tp$p@SlOL1w5UE-(%l()?0Gg%iMgWNWTs;9}KGm%r{Xg z1(qf^_ZaxM92_y!9V3}=3I0t>=Zev+a~Mvsq^!5 zC<)|(K6+47WMxBoOxfb)5O$7^cTug9l9SI4)=?4Vrai%-p-lgs+6Xz!V+3DQHVQOw zc%LO3=;)mKXlN3Gr1}9`-hBE^1FNj;9UKOJ{rcQ*4yq|wq=;st(wt9XZ~{{`ju0WQ z*e6;7FhoT}pglk;lFxZfOTK!F=p^~F8PYD2$Abp{uqXVY^ z2N_bnW|1BMEoEh8;BDYfs`=eT)YsP|KHJVVg2}S2Urze4FkvwEy_%7SbK)*D>^}(7 z-d-$3ETc9a0f9t-4+zRRmjWatBs)rl)jHIb?EVxe*kp1wxS+$K`eB5+pwUE)N4!}2 zM{#_<*ck)(?gk=4s={$u!2%-$)N^BFiCI00D$H+uWOmMc9)ia zLV`{?Wo*Q1i|}LXV&Sn^CirGU`E?sT=j0^RDc$QUb5Pr#c1W=zXL1e!3CrztX0S04^nE+;po zO6+O$JOYYGe-NRNt$M_AurzC-teg4%;tfcgxCMRqaH-rJSJW|*krCUaTHiq)h4u6~ zU8P-{hj@f5K}kso!_*&1#)2En5fq)556uEZm?+5#eV*dl+C=y_SDe^Cs7>-o)JHs| zre1*lit8Ltj}O3gv-$ZG2q?Pr+ZY(+0$ykcST2~s{2;N1jMHi?Pd&f3Ya5d(^ze~{ zV<48N1bA@3Lc+-f;VW-JK;zxL3+bZuOWr^3(l*tkd3qY==7B$_*+&biH{a}BT?x7R z;oBaf<~3EmkYXw<+@|_hY@=8gSZiCYc zN+kTYaa-8%=&0%{INg~N$f>-py^zL!{rcEy1n2}w2(AlA7T(?sNl8gU6yQ*b1f6A2bA1PH*r|p%(x)V=`^Y>0#+FWPfOcp_q-nD@KkX z?_I{V@n5|F<$rp*LQhXl09UZy{{YnQO#&X>aBTH$Mny$MR8&-&DEFN?act~xmd4{2 z&;=6gT)|ZXQM<4X4TQ!5gH+9w2(7Hw$cT@_>r@6d6>n0s%S}U}$pu!Uuy7Of4oHHq z?f<*40rJzYkMQS>2a1mgaPq;qY&f-dLU>gsjZ1}Hs%PXI}!fHNL6CA}OQ zNP#xM|B#r3q;CJlKW@wM!oo|7(m;aMyU;=e9$k2Wt$?K6(XaHf?mU83Z$|bey=P(y zHAi6`RPN`avM;15@<%02GVVTP8NF#$u!uo8-Sdvck|*Yc7Wr^fV})8&`k$Mns^%9` zt5w(?5mb`@2)NhuV=V1mS-_3l;z@PcE07u1SDydTI+lEVuHTfmEmKUkU}J0B1Zq%8 zNePHh-Q99<6``*L1lFV9g$@hRCX$6ju_R}#T!*(fa+SVI4O@Lp<8~SL^tEX3>Tmn1 zth=Zbb=$;qN`uG3p`twf6iPXEFH<@V{)9Q5XZ!(fThX--0u6m{K*s_r)wX=X%FR$s zO(nwYpt%QC_sO&zDn34Vi<(q#n1%k;sR#bbwP)gg75UnaLG$;b10D^?t z?eg-nViLD<66L+y$;rvzTUv6$LDCcr#Qd}4w!-l5SJsn~g;xVLvY1tTdgFC-SJygl z)}b~wvtH0D=Lff3-~XF5^aXBCR)b0kEl49w0|2K8$;l1X)ms-G(!YH98BQMFDDp8} z!qyNqzwxyv<%))jO~?F@UM!KQqNZbScLZaWPhZukh4{%qaIhQ}DuOXOrtQ`Gho~{a z98J|o`B+n7??(uPe#rArZ^-h4;7!rbR#6FSTqg7F&4Ba?IqneT1N|42seQhGe+!F?2XJQsScapd#BSwR znuCJ_xw&z;1$HVns7#PxAYmYsG&N}%7<84CO5FEM*K)$c``~>*{%gEAoE%vO^;Bs) z!yn5whKeOzck%fj{-(bQX-6)&u_gH~TXnz2+NqFon0%xur18*hC?HSQy76QkByL}u z*UceI3kzO4?=Ms}G*tAH-B^sJ;}0BNWd9s5!;M!dMAI+xwDcqJ>iBP}#YHNndjy(M z563K^ECUt6CgWS_sl0-;(vtvTd2Jd-MgmUVh6VtD>T~Hp7;9>308*t(hD#Ve1TYo; z`f4WRfx=ySJY0kj4nhbaj6*>QH}$`)< z9UVJRy^mri$CaqU^l_Q^)%0&a8sA=sudnALBqW53P7_rFnWbvtLtfq*TnmX%ViRlY z2D3i0$3Un5S2rJ^f@fVnT3SRp#_)yfm9Nwutbez*nkKu4k1s1DlaoHzBq(AjnLxh7 z$_mNS$<;Nx-;T`|_UVDL+c|qN&+`MCAv3J()t#uRs@^+y?(ln`I(d14Ww8blFgEl} z85lHLPgVgi-`Lm?4O_j(UFylVnx}jd&%E%+pcUxQ9cRG?9@p3t~f~sVxHyOlwh4g*`X1)7(c(4v4kqgkD3#R}uxZ3Mv zcZ7a!@LHhrI<^CFLmcV?-51cwW%=q=>9`d<(GCHWN$qR?V272J>bg=VW&S26m(7%& zg99rU7ph;4<1!evN-S!?8i7qBU90?V3m@a+2od|6lbYh3Vr6|Do0y&M;X@?E!s6m`cl=;WCOMY6;U@dB3#-$wpH&m07y=5G zl2AKdADnzMEr*sd2zfYwVGY#QJ_D}+^k2ZWT~kx%`NfT$Jw4XRlo_~6f#7@rHC3Xy zd98{s@H=ut=My-rqmIPL`s+-rc|4+${8S7Kb#S!+*UmP0x`HPP?w`seCgNS2IP^om za$PhcQhS@5jKb3UcZO4jDM=z-8JCqTTr!mJjJuHZTIL$be&JV0kA(a&V@N3=GVaB@QS`xl^%RM7_sx-E21)=MfmRIYD2C^rZ5e?raxykNsC$*Mizaae#3 zxqCsm9th;`^~rA{iJq;*Lq=9k--1?Rux7<5mDf2%@!jTrpkMP>X=!O90WY`F@#B%! zq8~&vlM=bDz?qIfGe+2LP4UQdcqd(7#obq{4e6x5$AW#27>-oC*m0=Qk%e!dBUq7z zBmai>nFrc9&h`KjgDrIggqVky7Zn9XbkN!ZIS#CL0kC_(AgCEcy$Ty0snIZa zm?9Tzf;jf`=T9T=U!u=TK2u{@ z$QZhdpZg*xg!HlR7r5?rCvaGTQBY+y&I&>%yaP8kH$o_clgb7Y+PsQ$bH{5Ov!NM% zL99uEP%H8-x^!f8l2lG%ArpbtwsrbYB{PVJWlpOq#>VqI^KI*^tLOnD(4QCnYXUS! zfgQyo_;lt5q4ml)b=XJq1HO|aQ)6QeM}y;RlD)|sd6FZp$x6piYaP7xL!3No*EsiL zF+vZSk@;9TWQqVQx|Vk!lHTqq>RjkU@V}wp zAVT6wrRD&M(!XRX$8|pHvoQwzhNB&&v$<4)DQLAZ$*SkaugC_YzZtRe(T1*kgI=Hk zb6+iO{X)7X4Fh5M#}!H{WZCIVVfqIKFBj3zo+<$_tFKYVO1G@;d?>w}9#2P0%VqQf zZR#;9D8t6}>K-*0PWY`R7@pH8IrEjyO3Knf-ze`Fq*zlve!L*6)Scrm;uBPMIC{%n zZ~ERfer=b`uB|0b_VY5Jd!&hIGN!u4R6+MTMp=8ddHa_?)ia?lLAd`Chj(4LyaDJYtej*3+%H{%c8E z)osMrq|=GcvJY+OnJf;E%BSny2dB;tOq(HXUN`hA(QW)zUvWAG(p3Atqn>6f^mmgH z6-#tu`y!Y9iTu<6Va?NsZ(ROYa~usb>_QYcV9wjl@O3!GF=~t8ycMGGuB{ZJ;C5cS zcTnw?EdrXbMbPgp?4a-CP!k~xK|=@j1qb{9Sft8wlo=~%P`HoJ>sYBQSE>wTK+q_f zW*avDrE`;y|5VS{c(2N=U&{{C5#sOBk?p#|Gp*5o+R6c^+1xIEpO|_QO&x$hP@@-D z9p3V%W9p`7VgBeba&>vs1a2~rgc0N9ylab+cd42*4B*7y_!$vP~SQGXirG9N?B0hEm&&y4>MOc~yG20bw#fJu|)<>V+SD?{Q1PzgO)(2oJWjE|2G zpjOD#xVX6FvkMy)k{fX~)Y2gBTd|q&Aw~b}RPdzk1=#=J$yI{r&i^TKmq4RqXEZ%@ zN<&}L(fyUHrQ zyqxXe2pZeJBFZVNFCrvOQ5L z>oo`L9(p7|l1oZW#YO;7hejFb)rYpCp_ID9i#=&8YU$lkLthY7oh{#2nf4GP+@OyI zZlr;mi^Xh^+_ESy^kSOu&v zI3lQtK&e_yS7bm%)y02yG#&eGp;1dihfa}RO&KVw06}1*X0+sQ6Tg+X zM$Fkc`FV%r+K69cO0<`tT{i+C1||h?(cb7k)n!185|J-uWNsti<{QukM9Y+*p#w0= z4ZqOP9$KOpb#)Euw1>L)RBIIoVPJC_{j<^Oia*}1R6+1d3m~zBJ@9_2ebgPfI14W|1mxNo&T?_ zGmoco>)ZHk$drmou_M#g$rK6|BHIv=3?)->vdK&x^OzKkXji6^IpI)9l2C^yNj)gr zc-mA-$XH}*d#_#ZdEaxM=l+k+{(Rhf-RoZK_q(p|wUAUl!C@I18e(niioJAmx~>uZ z=4uhfu!sseWCnu)6$HbMdJ35QGUERWbLoTqKiMXkH=F4?;(dlRvI~_ugINGCp{8{;2?4_lx@hfn4Wp7hx|jKI?LQ$`-6;v9}%>~jDV60@hhlzrZwqU0}>widEG|0 zw|skZSjJ$uwxfgqJg(t}4(8ke*N0VAD}&AwM<*X09;e4sh^={TdKF0VQ{~atVReo>(fFg11WtxncR@jV} zk&zKvi16@5Ol-!`Mq&O~h)4{1v>3wtTrzjZ7&RjU1FGS(6G*xB0fBYqQ-EX`thQK^ z&hI;Y5!s5vr76J>UV#aWXko>=@pmk$XA&>7AOWNpq%fT_Ff=@jk+Up3+xWgh*g=NQ z`y-NJu0!c5OP`cA^0Tv{A0N=uL(?}5@l^81$pFHQm$&Y9)w$GS>mhAVQF)z#HiRCxLMZ-6((c5~-&HOmF*7(}SVb+o4f zQxUTCo_Nu@sb-~r>FmtyVdA~UG-S??AVk9=vaX)g(|88f0=tw?U+pgUSGlvZvxu8g zxGBYGX;B1VS>!ntU%XmoHShH_4OP?H!d(3WO5DT>2e)AxmnpW}3qv~s_O-T`GKuI# z&Gk$(r?(l8CdRh?T35MTLHf7e!KPC3w7@UM9x2-=_eOl$P(C2E);3V{BZx&0aj*xFqM&gwk%7S@iGY`L`EnboO_nNk^yrD{ zVS2~6%>4WyymatNftjMygr}gl7|2?5;^S8m%Be3fLJ8fwR8i`C(9(B2)q7c-!-R6~ zrl_48YWU)w`)kO1Uf$luG=~ZgI!XocU7_t#3IE4^p+3XRhYAX01t_-?T_>Z#@O%a= zGH_uuSx#M~wiJ;kz(YfQr5L|Awts`)@m|>qwSgnnYYh(mQJ_2 zP~G_W#O!iopE#XNV<+yKc%FW=(tYdBotN2iS~OD~t&TK~c2RQ5RI{R^eb&=~*6f^~ z{o{`?!?)?|ZS>!=?3Y}JwcD+eJ{-G6D~{YeB9b;Fq7pVxp3>P+6EVk`S4wUh_57$F z5`SP{w@JU>4xr|lU*pKY3Lwpmi^N2S#$0;CHrY^<@Fg+#sqRh9ARk2kU@8S3KVF4l zhd+pXjaqH7V_hVtu2#hSRl^)XPGCANF4v>%5=3{>?4+ej>e)vww3-@3Hja5ck=W}b zliblBXzG;u?3^jX!YMDgGay(dC~Fy?g2Ez4ZK3d!Q1147^Ibc_ZS7KCcbRvZ+ZW$9 zJ!EMyn&aCZQ~CVzA@i>(wVO3ZEoNTpdst?t7e9)TC*#U zoLs?Iu8QdMg@Y=rul)XL%_KGXnvkc$q-AC6m;yKGob@99Y^=sk!swXpC_Vaz8v^tA zb-R#S5%2#7ON{ahiX`=7|LXmQOam~Pe;OzF=r+1g{F9$u;Se?8jPu=}4WfqaVGHNG zp$i%|`=qv(+`E6VIjXI-eUF9NzMCI!7j^8hC^=>yp}03;?l#7Gsr90tcRgn0#H9+)`5ql89{Bv{QNk&8DD2|K0TmB{4lUMw7s!jo zEbFfLQ+mk2SZG>_ltyG;Y;Gy}aP#@m#?lcos|&P(i7_bz0Uyqc@0VriH@tj&m?c51 z@Ue%>XvwW4r5hsGn9dY4(dv>UB{*O2y8?6?247sf9J#^^Xb>G^8 zqN0(e;%NI-jgco!n2E{ke{%J!?>@rk(8JppN%+)IpF(SaG^8wi5ydMo>aU1Ijz{bh z6H7<*Gr{#}1jo0yjHSt?T?5BGeDpXfv!WMvsC7p5{YyNOnP2;MI!Vy^>BY-<#jahG z;i1e3p^gxr^I_>4RsrmuMo$`r<-zqRVRrrEmsXhKJBHzn7h%{2HWu{C$U2g4J)vG;)*ca^uw} zPd64+ZKzCNckII1vjRMv?9nWc0Zn2K6EV`pI9WWaJ?#g5#bbmfvuVG`sxrv;a}Bp< zOE)2KVTk==plJ;e{2wWd+x(omzaOsd_#p?J>M;@`?)$v)@b-R#S_8?viC`_l+{&sK zM-8Bn!=?tA9|%1ar5d`{c{Qbv_p6Z6f%(XYjGk1%AVX%UIP0FLjDLQSNE7)UfQG` znTCJ}#FREK$;rZb@%)d5%n@;Hyn5wI%qkyDA5To5&L^SWkELZ8xwJ$=YxR-#?Z&%QkRZhr z1-6ZCA7#9}_3sD)@bK}a?FtLTYRrV5wpV{-veOql!ko z&xXSj98iuSB_JRIC%eJ@cT^F%~=x_qX3YrK{=;qbcNX#VdUB$~g zIWw~o4*JE50Pw?@iy`=&pPw?(>UQs+p^T-vh!JjgD)0Ng2d5Wpr>QYEv&Sw;@!ncv zAbCm3#+@Y1c}C5{R3K?o;q=;5`pdn&*1pc&D|34D>6DmcGZX3af^TK!?>%z~GXA&b zgHJ=QcT&Q%l}L`KgAzn5>pW7vyQa)VlyB2mWnl8xR+%dX$Iv1o&h(seY z;AiwRz$v2SOvabaCQsEa#ys)dOd6%ruQh+*J41m}%n}u@Tm_u;IKCMqfq_3M|iH{Tq@%pfxB>iWjNaS#-Ik)q<_6+~=YoFmme zG?XMsRVCqf7|N(4xpj`V*ZiWUrt0egEmeDL6kJPf{8}aJm3=A~K7QmP6xJ(=oU|+M z@TjPAh##Coe(vSVeMBO;AS;V)d)vsgklM@aZ#X&Q^^e%C^VZZGX8Cr-TtpFl_(YXu z!P?qd3J>ooWgVTUz`$66hmRgnZP#sY^xz=S49SsshIFzF^DIjhn#;U!RyS7+EERaU z`T55J0@O&C*mrM9hF>OoqIC0lrLqI|_V$trO?iywj7+zCS}i(e<~eQ1QRoT~C&|VR z#sa6!^6QsrRS#;pRbagCV=2FTw-pD1eVLQ9yC6TCK4G5dE6(@9#(K?^z2=gC&{F5V zTG3{^&5tU+d>)OUD99@s%bT1J4O`=u7J1b?@40Xv;a?yxpzXjbc52R8xR!fE|HY(PL(YPN=dhLgLDa~Al=>F2uL@4gZKOV z`o15}cO38jao^j`+H0?MT{GvLGjq=JmzR~qKqEmzK|#TIE+wvrf^t(E1?5^B>UH>} zh^*xe{O^W6;<+*^D(d*G+zkAa*g-2Mk#ZDf-u*;wb;Qbvov*_Q!LhHrc$P z>=QY?fQ%7zrW42BaP9bdkr>xWRXUW4h}-X!l!$yskymYj%;5N!e8;T zYE$|ATO<^Zbap@LSb;<#*SY28sJJ+-SFgG_?qNvmsrzC_w$JZ;IxY{gu9ZA9PUi3K z)mGBcX)C@*^|*ixZh3FDABkP0{&KfNx7jN%06Qfu&Ct;BvFC}yojZQri_{v8Cv6*- zVkRR78jhJ9>a$FyZjg7s0r~RJ^h)zd|DR_BZgfl9kp`k6*IIBmd z3-hxygxKM(0`ilb!AA;sU#tX*F5R(r#>Mn5SLE#mu};NlWb} z;C5|ceubOZjkdUU$6vPYHZ`Gjnqqby;+S7eS1D7ON!WhrrH#$sB7^25kBi}Y^ncfT z^h{UXlZ};?m4)Rcb*STNIDBt{R} zgk5o27nz>Z;tCAOMiQ6}7g$PD-s0k-!{i6F1cg#_X_4F>sb_DV$Hd0= z{d6yOmc;7r?k4mXhy4t88wP4Qf9_Qrbz#s8%qxD^Pb#>J* z8fj^f^4bg$r|#|RV`60;?CZR?OL}Y&#p=vjbe~EON0~+$=Gc^eT)_rYVS=l!U}>ZGbV-Nb)lg&cBz! zt5;T*mckYz90Dl8ubTQZ<+>9DqvGSWRaG+z3%9^+=I2w>(i%BBz(T~t#55ukIP?%w zQc@Nce^z=^!PrlC7Td$<8i3DSx0ST_3$7r}f2M-S~_i*QeTqLO;mNg_KWNvOw zv&<}zjK3IuuDEt50T+PrhO`XN6=j+c(+j%l_^3{R_2sbn|7SnaL0d4gepTCDb zlyushsFF((xjfnMsDb;IiRTNg8yXnMQ_AcLp%NP_HB}0X0+hMbTTZHtahqkMGSqTD zOvEh9S?5wzR4lieBq1hdjChd{ADT?cgFUbA^^-1+KJaqYHR$neR1X5^wP{oG`Da&HWTo2vq}^rzvYD+ z5&Ht%!wReq<)`|8q-dYDsdnC)0(cp-ekgd$ufcVD?pEz>lBSn3G7u3^sYXXf!G*fJ zx>QwE7H#;-%gaf5EYvHkCavqwpB)+-8+#r7efj{qr$Jg;TGZnxBqk;%B0>U{k%gtB zt?h-3j1C-{uT=pc3V5))+#SWD@#V`G#ElV%f`sg^$nf!1)YV&-cl-PLf+$7nj5|pL zW&#tbX=#nXix0P^mv@h!J$nX74c`s^__3wCTTMlUm4V@7aIkKX{_j9iUQ{YF%;mMg zTIhdHNfW1Ys z>72~{{^WIjvbel_`4Nxt{nxKw0T6kuCS1TMr6XBd+uBI@Y+lRCb{*!_tK_O;Q3xHq zD)X$ZvR`ic{Toc0<-vomu*shY*)h@4Q){kJ&Ev?%U%c3CFsCz)cQ{YOexlNL&@NOo z=F1mFo2%Ei`uh5~xbgS5&;h^eT$E1_HYkPN_VC!SP*5(UUoGOlP*?p`T)2alyG{a5 z{4AIvKRf%lnbP~ucts)XbgE=_+_OP-YCQ1-=ys1l_D3RC#aw~<&7K+(bF~`M=?Sc0&e(Q4v zH>dhEuly(n*tvb{mj7>kP15|c20yHY`7iervz0Y8TvvLMwaP8@G!9_3VIfTV(w?V2 z3ykHpmTkZleo>C%^JmA9`E7pz4OSO{A zADs+gzq=+Ug+)ZX_SXiPn3!Pg%)xtARfiIV-B(`bfcp()Da-?2Ffuag>FI5ZSHKUY z=I3v8B?#Kv+Yb&5fK!?2>+jTFe!WX2E-BeOF%gfgZ)CK%w8Z1E(gRd1U%P5YGJd_D zRaDgb7_cmg{cw9bSxZPr=vfe175v=qPlRe)WuBkl^6p?!Xjj>Nm})61E5k?oAeSh# z{rB$!Bt*<&U=(1&sUN@);rEL5e+Qrwvh~z!U#i?|=n?rr!fiH?uQfb1<#n>RYB^q> z?i~lg4je{qC8Iu){E z)}~5ZNlA$!SZ$UHA>_*#B{e=apl*?^y?bCv`}A&ZTE{mQG1T^1jyXI3>d39{$IpCy z_5H=Yynrvv+VGK(kO1x3uYu%!l$~M7`?@3as4R1Zq*Vw6uhUg`J%bk9U``$oRg& zw~!&N!1l>B1)rAEI zuoTsN&CW#O8sH>TQzG>AZyG=10K8`0*_^JQ?(EE0NPQ;ed+)i7%=y!;PZyKnmr4NF zMCWQO+}!&RuZ!Oq4nPdLdHt!lcq4COlvAmjn_IbQzw!3mZ(3T~VjV=X4MZiKX^7bu?Mv&XyiUNdS9c}HCgAL|Wo{LFOs{6hEPm1?P z(-ckh^r*5+aTAo8ROak%8W|PJZK|C9eU_5f)YD9igGj^u#gR=ed1Pb{HXGa?(MB#! z$cp{x_g+oj*@?x@sQ(u!8n{P*witf<42ToJq^M{BRslu8+tZ&)5%}e(`v+~pO+kpI z!6hao)zZ)?V$ssnj13LlKG@J2BMgs=a|g=Vs zp;kFgVUTzP9$N&Z7!!zEHQGLeR+qP`D8C1iOV6 z!05KA->}z;N=jfO?%-ep1Ipgsmq|SickkZq>gvMh5#ZyyN5t{uz~IS~A1C|k!IYwj zNlEo)gG>l1{0*R*1Ox<55N@WuFLkuEPQh|DH8p`UW;C$-`1oAmgXihN`f%ZJzLxXU zcURFB&(+n{{gqyWws1!8i{m$nieJtO8XLv!?RU{UqlG96!R5j2E+fN=Sp*H5?jc%$ zDgwQakBzN1A7&e!67$34wwmDM;IP?QXoaNWyX&s;A_-8e=GNo8VV&{u@hfjcn3>Jt zuaJxjK#YpzHkXB{MnaO4o{mpJQIMUzy1XpuGeQ699L*Z&o!2d(cSYLvBOd!yyMul_ z)1C-ktGZL96?}GdR>Hfp=)Jdv?(FRB>3I%UckA};zGN*fUh64sfE6I8*KgdYaaiTD z94l>XY=lV9bV-r-0DuNOb+}Ns5XdADh?OSTx~+*S`=LCIckkYDn-2*&tYA+jhK6#2 zhr+gNS38&<{hi%i>I|!QJs~Gu0OAPLZg*$L@ZpMjqzt@dWeap_csz-iS(_H^Ze9Ng z8tm|0v*DAfQBpM8Y*8Y(YIVypbh>I(gDDUH{w3lzyHC~l>lZaY zzlKvGfMG4*L+Par03J{r(d5;DfPl}RKj*MLf-DXKC8A}aH4KO}0`*v15D$^2xC$f| zc5*eCiIS0-84uCd*T=%jO3G~pSsGZfmx=MK?=H6e88Y4R{PSB|y1?2XP=LSqU@Iys zr=_Q>RDCZmcT!O3t%wiRiw57y&dTaBUhPZ&bSC;0{5eCRe`4Yc_$<9#;@-|qPW7*( zZ&|gGkwbC3)~HlXO-+Cs8R(Hj#Kd5Ne}J|)fC)TR#p}n0!|5Q9p|O84#8Vre-6mk#>NKo*<9{lgIhOl z-}{=H(iBWNU1mP~{{3|wok@UOpsSHXLT-B|ql8O&c`OjcczJncWI6$5U0hvzabBq$ zIb-a6kRSN^)CY{GwU8N#2mqATCcV_h?oI5vbrVGfl6H1n?ZtV@Z5&9WyA6wW(x2>O z%iHs}avIs`?k$s~a?`Nb8X0^N@D*5?e?Q>w?=KldMn#$Qp6OKdT%T3zXcOQBI1fuZ zgwsBwIoR^m02{z7RYk=BfB)^Bos=6JEzJ{%91oP-Jc9r_yliDCC$!CPue<{$0?`%M zAGxWoG4$idTMCBDN~#ltgoF{~4M1P2yf3{VEmT%kR!~rY|2}>C6Jn-`4K=b9Tny-d z!*k)WU1L2xh1s2zgQSp8kTTHV-o-#dR`lxwI#jxV#le5~u%h&$p)3YaJ2g2u`TKYJ zRrx^P(7@nf?p6KdU{*;*CH?tZ?39cQ<2P@j!ovq(a{xn+TX}%Lg{H@X3BG;%7HCba z*SP>YyBv>&Vk9;y6$B)>hhj<~8Vv5jK%v2SC7wO2hPtJ@dwbV~n5PVG2zO|5ax#l7 zP#MPKL#?Nfj9*;`WKlc-aBv?Ip9rSUFhxG;MZ>;1toG3g3Z6pE3Lu^k^(Jh5&(KgL zMozdSVfJZLSRXf0lCXOu5Z9292lbC-&QJD@3gPEn0G-?X1o`=acYU5xw6nDhWwkn< zzmJa(DMbG;btuDw2Qy$&dvoslYx}KYbr~bw-VcGUFn=2yp5^LTw!?|iv)FfBs5nDT z6PlTsfu8_PSGKd;0h6YG8T}1XWr$YvG&E33{LF^`3>615z2pnstF&zI);U4j@~)$! zBjlN+k4+vhE7f~>x?L6lx?^Hu*1GN6IXhdA7SkpyYyWgMy{c~l+kqHeee?P`6MLu> z1hPlwLo8TWSb%NG@$f>uHrHP5hjFw;Nwt+aBvu582|e&&3K5SHa67OoIPkA| z+{|>2Zv91)_l1VuJP>Zh5;s>~q&sswriM3+*;gU_JpGvpI(7n~=yVCTMA zln~He=NkR5-MBq6I+~uD`Nr57QZTTk1QE|_01~io@G6J7iTbAHT}T5huHb5Mu+H-o zVtBlWr)IfYomO4|8<(1z8rXzL(xv@-aSICzxXHUzz;=mvt>WRV5SdT+*PYh}vgIN# z+w>PQ>!IUtgumyIMXTlM-an}>@ZQSTJvC-iHc4A~$|1Vaw+bO=n; z)YK-jUrARz;-I$D9sn6Xi3BQ@w-E`V^z+LpR}8~SZCTfta40K3qsA#w^j{EbYA`>2 zc>J5iubl&l*$~!E1R37o;2>ns<(QUV!Ij~@t4mAwW*hv#XdLbBmDJR_TUz++7EsA= zNj9X%#1Q8%H2UK~n1!-Trd(2_<7$g6Rm2N11cHTy#lg|h=ly#q74eY;)z(6IQH81( zCWR2geKa_rw5$y1KX4XVSubGP5CT`96rzy}0^UI(=|1XBsM@HPTWEk;t+WUrJ{A{q z1vl^h{mW-NhlIMc^JY9C(tJ}OEp97RYjAOKjXR=~3kqbT<_(B^yO;fZeSwsotx#YU zsecC(15&i(@;y2_8ps5&D1WaDux%4!fAKHT(dyvXV9!u&kd1x3dUm|KQ~NjqUJ!hG z?>vX%M!nm9TUS?*UUaqN`ZICyo**?u3qbG6bT0gK5QVTCU^@~!R7yNbrm&-{i;auR z4sL0$xw4XPv;Ytms%Tf~8dMSe;O8OvkwcZ(7%S5PY6$u9YCI?6qcYRvH$9)TdYlMh z_k%xS8)y8*_4oPt`Spt`A%0)gJ;p28br?@2^UR5Had)766ff+q%9APw#X9dlSM-3# zq7rtARyxwe+&nWajRk7V0NoIm_AY+cAHZEf;{mRr-#9c-BYkD!5fjiIaG0cA$%ECC z-p#4nt3vPo`Y;~CYPxRn>(d(oLSL|VW*hE|zIk$?>(3ORa?n2ojkGhlQ`>rW9*dC> zp!jb4W}^h}p1juA|HbjSw${_hsT|r@lNSrEcmf~ZDOZzg|K7W3Bl0aOFPD{)3UMT$ zrK9U(zwIF+`sh&!P&~i@$TspSDh^>iMff8xNP*KPf5hg3zyoZm-}-px90h-Ktj+i) z=e-6!B4OckZsw?Fd&dm%w2u+WF1SVF)OxOMWY?y5#;(26ldTFMkz~>n4Qfk`==o{w zuy46j#J%bYC96!?1lT-Pz+o~nG9sd^loSMEmoZTWp!r@?K6tLYJk^TOlhbftv6)xLz5dLdjcQc@51}=2%+BL{2r@rZl;Y)fJB#5?- zjPTLWG~9xZtThVaEZ!v=x)1?)*!NXX<91e#6B@7p;=EYgKlU%$>=oS)voB>TI+ zpWZ;8pO*)jTWV@*XGaH{ZXFpRA-$*t*WUK7NcAaAcw~ggzClE9@VHE-z@RKnn!wWwP~uS}*5v&*lmDx2C;;KSB8VR#a34 zO9tp|`XnGI=;Hiv8WJNd*fu~70(^W=qYsw@gb3)Sloc0WHIN~~t#I(fQX49HwlqtL z;o)FNKm{K{P|3IA@&^mSJH;`as~)u6K~fBhHY|uBhGlQ;Y%@C=Txh0`RW))rjNTaI zURYl@H#Vjdoe3bYv9~WNE*9{<@UXC8@f^zr>;U9~XbelQ0*QrUc3IgzWT&ens({iM zB#$A}8GvXE2Qk)^$eIK3?P_iH=PP0p{U0qrP>`|4(8PqtkGI!=SM1d~{25UY6PpL$ zftn#JGc))X7bhn~UemrbsNX_1Bq`~qMR5KtAv-5xWJcF^nv*VK6i>zXGiaSvk2vxKiCe zNKOt8BJdW7Q|RdE5V;QijEYT5gEb)$vrCvUMn=gYN=1(96bWx$S@GF59ICPGtdgJ*eS9W|{P_jH!fXiP0d=J0UTMG#nr0+9OlV0wOlia%XQJh+UF$hwdP<%RM zkB!Rg{UnwWK*p=;xmHC1xHwcHtDpgx_XDa~52>laf~`zUDqsJ+E^xU+&&cD zZ)t5^?{)4rO3noi0apfQ6IYi}VVv~=o$%t~bn7ZjgTLed2B%r*J(k#$aMbZhO`V6z z0<5O}!5`E637_FB>6p!murq^%O8p^w8tVu zA*Z9`2{aP2oa2QTH;MxR-=Kc+I1T#FZQf7Q-bvEn)_PwiHqUElYT_cU=(j#7K2Bf( zfVC0(5<_JTE&)&vIw}Au0|NsK1{9v#06D;KxVgEZ13S7#Oda}>tsx)kmZU~Bf;0~w z`e33y=HZFdwecYck)nax7}rkPkX+`!Jngqj=!}Ylr3{px4n;DhycV z`*(C=V(O-<9l^yj&amq!H`*JPSMJ3_+}F_3x^wfUxVU%=BGf{Uw+*OzbF<%+V!Hna zY-*$D2Iyf=JU4s}^*6uEVVjuPt4G>Y?KJlhLeHC2z#$8OV0q|O7=~v5z(9DCF75Pt z2Nhme+0m8zkw(BF7nzgaq{%(|;`pOADO?rQD+^oi`)6$&uKBjLqqkuuhsBCG>w#>c zeCFAQ>yNp6@89_=`n23w0IvB*1s@c<(xsz-(CJxOUHlm>0Z8n}ArS41at~n8FqV4p zq8ds?K)s4fN>(3w0+R$KLM)FZWG65D3{=$3UbYpJ`GQ8r$jHx6)aC5R7J81hwnb1- zR#W4B{MZ4yc8-qe<~H7oW&_3B?n!aKCDeRFHX>wP(J(PHx(`9;;*uodY0^Br+;vn{ zqFmH*NXVYIc3oG93@#95M)VoO{gczvX~^)HncD{jO5t)u^;TJ2bx8xH(xVj=6%mwM z(4}IHGi9CLS9pgss-g^rf>?TbItVhLQjqbv|M`Ka6}K5l1rstQX;=Kg)p=2ljLv=j zk7()dw2v(AzYqU^YLx!3iJksGPLwFmkhf|6@2XI;cvcwykI<^=8;jQD@P8l6TlOgZ zr@8sRC%gLpxRU?3e#>Rh^FM9VlSHqU{hGstgLQ{wb;Zfy9Z|W6W=jL5hT;6s)a;+b z;cwI<&wGdeyGRw66RL{gS>}&o(@{*p?p7w5g{=}qB6qHCM!xfGQ}`+M$tF_Yf4Y`l zS4q*=fRTTewl*7qxq0?O!mGK5*nDg$v zZ;D+}Wi|V3ln>9p`}&>sH5qkMJR(`<>WC+tj3)m_=k~SEDft5+Jv6X;hwn9*n3+K( zWo&fRmhYp=zmxqH{bMes039Nzbue2z=Hw&>^9Bg2zwm$-EyP#r!JI(|SalZ+|BgRm zTO(Or%g)6`AQ$JHZ~b;XD@MDe%_8%~{!_8^EhM%Q>%Qj67(UwfHpUJnd~5`Z!{flm z%9NSQ$_3ig5p|vHT}(JFlv(L16F-ziPdv+|b}A%hA)#6$S_}W!rn_{%kJVUnZOB{H z+R!Xgo$1{7P$$B>oW>c53-B>iDhUY*C_+IL1F?Y)6l)-LsV}}ADi!`uUUDeMe*fQP zie$UW7~H`-k1qW~Ph6$TB9ti;hUvr&9%e*zxBa%T`=c#0m+X~7?uyuG(p#9DE;Mwu zQ-gj;Z0nj>W`WWNNKn)P(rF-CK7TsAG5-n&G301xs?*+a9Q>mL*Xu(YF#?rpoU$>$ z=3L!rO;6^}a)l+=?AZqTU27v!Nr7Rll~Lu0W?Cc-RAEH%V^x*M$`becoH}XjN~TDU z6FLZ$JFKVMMbRakoSdMf6?T3E>kni+iQm3yaIg$wYw-qk=n8b7p+op*6INQ14=3U|?bn_4h-cJB&O6I#X+dpdB)_wzdXTl(GJ&#d@NbcVMN_t-f_J z{@JU!z+2`RPwrJ$_1+Wzc2k9ZL;GRXb-^lGv}!TuW4@6z!U(7QH?=EnNOdOR`w1=# z0-@N&&CNc#YzG*1^tp}lVuQ7jqkj5cSa;TigK?RZyNse`9rMrJ%lNlxj&+`LP7db2 zlW|kX4)zITxj)F$qcN3y{5}^;uDObR%$=yUz4k zNMIla`7LMY$Bs5Z2@t9yrVA~h=mad$ATkpa&TaYfDxQ!MYL9&rv2sIJN zn5Xi!c!A;b+b`__MS#8tBKfaY!A6Z%ow07zt4Gx*9ecza&Px;dp}pO?Y~E}Pd8NvK zt7;3U(_{`N|JD|658KT-NJ$5CvRO7)SCCG7x1`KxB1V|hDr+3+=@|L<$GhXA_cjkE zn|0aLWT;c{d;@i6r>r~<>+CVfYj-@EyW6_9#@r7M^OdG*!m)%;I&o0F2V`O?XHPmm zPCsLDv=&W1v__XrtU4C!R*_flOOCVt5U9dCc6c&!1Lf`e)JeWehjQ;KaknkYrqUUA zVKTEA(`-D13t5Ji@OnBgHUGW-p#${V`@(C(ZlMwN>^oJ#J~E57xRJH{Yr@hWlYN;c z6}#07%ineVX~%-ZY&|=>Cva(uL@`nr@A8E_o0por(CS&j+vew&D>@#8)73BE$Hm3f z)m=aedh8)W1-($K-V_NSD(9z%y3m3Bi1QFshJ>t|phbL%3XJ3rvUGmBJsCx-{1t^^JSjSk379=T%7v-8<C1y(q zf4vZ)47e{|(PcGTae&kruX5;J3F-Mre(@%Ufy{}XZq=x*B56-Tv2DY>-h|;KB&OnZ z>n3M|`^5LN=JLS)LSLkA)y21J_BBe5N8Hgub%n7xFC2AShN~U+f0id?(g$r<*|?qm z;%|7*HZ@ryxiCO!=a%EiRfA2cbEflbq978+vwOrr1WG8ua}Y zCJ$j!J%-ms`Md0=mN&>pogQM8EpZ1;gB>gvAhirE8$gDNsI zmaSiCVH1!c&;)Pk<;_7-Sa4vZQG_IUURB6Ky#)5J*=i^oJm1Po4a=dwQFawso=x2^b*of(nsbz6t0nfW1HtsWY?yfYHjy< zey>-U@(e9m6$Bx%&6!KM+vx+u7m*>*yX^EP!}7l0y=Zs3XC`Q8GTi@0%pj>wyUc-% zN?e(3bHL!F^&vCHUfCgK-F+9faO}RS)b&PA5p6a}CL`xR{CKc{IRQIIy|qk9rQfm) ze~VdoJ=-PSDaa@LhwqZk1uYC96GzG1qaA zYWK=20o4m}9K>zR%gK_!-Q$_@hrSMhpS`AvtHcU7Em5hq?-oYo9qo2(bK`fp(=k{a zPT32wIj=R=B?wghy=7F|%TyuvAy~M*_!LX`o{)2{Hp}MB=!A0{iV$iSDwZh6gkzU}=-h zYFitYxUCD+Ot^-L2p@?gBpc?WQ}9(j%-=PAW;N^+b>XPx*<0aDjX;&*0!EI+78IcZ{}lvM~&dbm#~qt|y+mO0LUrb>;p(tb49s1Eud6)^Vau1TX~wXGn@ z4||otqFG%Nx&QK!Qo|4XWUGR}p@R7EGbYDgu1kYEQH1!r&L>HuMMjay$(vI*p32SZ z@;Ez<)UB6RSFaWMv_C4@Sz;a2)3dTrYqo1xdYkMcP*rL|Bv)5g9?LVWElAMBK`;?Au(0UV z(>{1Tt!VJD*0M%cqM4?;N}yoU0V;4CJI9^G#Qb=kyy_aUWrr3`%jijswP&6eQiztM zJ8aRhD}@?77aKL7$=$oko$OPl>2jsT?u>WjefPN*Rqf!w%{5R`{y2SH%t`|4@H0O! z5XmMZBlvLR-^T>Drrc#|nAB8N-R>WE6a=Lwzw0`l5j>=5q!6rpso~FS{__AYQ|vaz zUrZrF65{i-j-o*@+14D-2)SzG20c&V{B^=Ju96*(WedkFwRQU_LWgau#gn^KoJG$C z&y7h*R_@=A?D=9nl~Fk9V7TtP>S)1Qeww6FwK=m?rerJ2$saTs($ooj1!GZ+%_8#T|4sl8AyOy)#FO^u0D<`M3$Sf9$ z7HpoC9IL}5uQbQa(MylKiMf+eJiUP+IzU zbUM>=!fygxh?PYKl}ZG|!h_^&@S0I_>T%sSB(|cqYTd>~zvW?)=DMln%Ae{QwYXQ3 z1tCd-nJa?Gl!*y##K(88Q8r2|G(=HF<-+iqkx_b`NaDSQk#UWx8tyvE zi&8oE?$Q1`cu+M-7N^EXYlmgjX7e)|4Ig-U<34sXm=3htL(JK5)R%2 zt7)z?g?JruX(OYl(^8gX`GwJpIl?ksWMYAnf-NJJ;b=-PGNe!OojCO@dK=oO7yAxn z3(~4=KNjs!rKi42^YZlVCk!NEE2`2}pU$-IqkFZz5Mq|@-_)4^t6;grh{jII%L|W* ziHg!yZm(`?8VvIu6FetlmD%@kCrIG)G)UQcrh>odRa;x_==2b|w>kUN4O^j#kG)<> zQtQ#aXNJy3?Ed}RG@e^pORS7!!U^7|x}m%{e(5CV=SrVPXMvRA?LS7wc$ zC%H7DC2P=fj>Px(w?TVA zhpepP1J_1&6XxXRPSqW{{GQ{)XPUL+zj0c=yj|Iuuui&S>fO=-(==%{bt58C1tLVE zIrNs7t6`_XF{P2d)W-*h7V{pbQwDw~JXjP>+>XV=J@Tg&oi~7u?an>gbrSW+$Z4cS z?&ax9tI5!oAiZfhKVT~|;nsICpR~E12o6OSFDRI0ROoc#D!4YV(yzLWlGaqZjca(Z z-5-23q(w@w+w8-K_!txEwh&$?(-Ei-GgG(HSWagq{qAgWkw%kXBi#5$CcMHf#<#Jn z4=-*eCGMMBVg;|S%I6x%;8picj-Smb$%RFgSzi>6FX)~Q$ph()4-Zd+Vx@_R6e>UH z+o1Xg1Pq!RnvjZs3=9Sxeoar;2atfm9puiSt%8n`W~qrDsMgKR1zqj-y;E~y#i?1D zmHUhy1B>^1?D25y?uM8*9f)jGf(2s8qa&hc~)E?6^z-Thhi< zW72ah9bE1rv*Y40^wE7%lCj_X`HuqK{kuq`hGw?QTrdBD+6X)-R%aAGnMJy{EHLZD3u_1}IUcTOK-_Vpd&_77VQ)ypQ-s$ygJTEq} zU^)y`F0P=E{ozB=lLz51(vTsT8?k;7f& z1ODfzRC05#WcMbs3NvL;_3q{t=E|V9b~5Mb8A~zqKH|=@sebXigvQ0s?)`9=EH8CN*V73JN^$6>G|4ZN{WvN*~S}|(Q6!?NV)S!{ge{U z?cAzkt6cE~<3R)HD4G$DwuAmcJFFd-B>QHs8Y;hKDYHa|)K}E2X)XV5Kcf%Y@B~9H)ScPA zhk`PgRhj1@VRGMdL*FzfH)BVj&}FtvQrDg(;UKl3(Y}O-w0}ZxKYv9rbfo#`lAB`A zpSy^kcddi(nY>9$j?~F+&JK-vm;X-o?{39j^Jjgpmzw3lJ{TAhrFNJNBWvrG8gcpe z0u|@%s)x!n9ho&%#o)kNk`W86;8Xby%D%=|EJoI~vL!ve(VIgn2kZ5nj9AMQO3&5`>*5R;HV5^!?a;k)bi>oqdT7k zbXWBBl8d$rxoDTdD4sPAmvX48sR1RVz>BN2Unhe}khCa9((@oy2I6zR?XX+L#k(}P zj8W}W$h0>L(Zd|LsBKP1cQ(g(ng<%MS}*nI`+M}ubo=pf1M|Bdw4CFGyw*s&*C3|Y0W z==(*HANOa(p6*P+Lr0MLM0l#`-A0z)q!y2JNMV1^6M9zR@v*kg*k2+Ob!I<9end-q zeXIm#iY~V=FrwP=BQE#(u3t3MUW#g5(i4-cV3H1)&W%jrmt*}I_Ih1^Kul?u(Romk zt5f1eZ#!7bv%LG^F8kC_p}FUx+fi!E8@#5Y9xN&ZJCMD{$SKp?hVHK9vl1@-Fl}AD}(f8jQTt8IcWMAqg zIgw+B)c38K+IWhNCHm8dc z?~sGme(qSXUy~mbD5o-Ab$oR3nnB;AK}AvCw6H%Rsx@70N!zCL*{vEEwFx;Q4 zrK~YHT-Ecr)O`8=Tb?o#E8A?62q_bDMo!Avn&X)6p}(lg6DFfzvYL+KKf8?;&YQvj zL<~mIJHq)yOC5T&H!7bjFOKSZPG`B+A@iHo10UZAumH0mD~qARVrr)Q{3&&4Wmcub zXilwd_baH;D$J|Zy2e4j+o6;@#;jIM_o-_Y-{xp8@ostV-A%zXQH=+T{EjQp_>ej0ztn2}+o=HyI_M6A59eX!6 z(%~XNGd-2z@pV0!U3<-2`Fli->*Q$>*giG_AUfyAWSN3;$8MaS z!YhhPmiwN?o`#g}2&p&LYHMfB%5X$;FN&h3+zK2Z|ublyREq$GxDNwf7NV4Kuo zW7-<}oggdmE!$`+MZ;%XX$TjwHk{9`uMSeCf#>JWCwDMOwrg?%?8bRy$kztvZ1_@r zopsADUO(rYo|teMOS?AMCyswpx6XOH&66TntAAo7GgC4t5!BDIBxd#*Sg``;_Ay!C zt=ZW%hC6@MZ7j2o;wSyxNuBihA1%OIH~B6z;WvOs$J}R7!jMI^wRkP)>S2v&IU5z@ zwcsDC8U`8nV$g<`0RIpbv~zi??S#LVba&(~S3o_)bFtcI{QL$6hQk{fFwgu{2!Ws>gH$sxOA>Z%`Rd?C}`!7FJBLmugcgd{v-4*q8E9*Q88F!xn4RZc=s{4thsLE{Gt}%vAow2vyW?gxi z+1~E9+c{4Hc3*nx`njK+;9;yrVS%H2;nJS;G5z`_jTY%A*GGOV8pm&(tn^r!OZfZm z;2^49YD9u$)&|UdeXC=EXsEIU*4gi#+rwotF>XTw`rI=qJ3aeq9sa7(A524JP!5@F4zPjc*F0KjX-+LohON7 zXgO@(#g&gzz|Cm&SMTM@AJD;0^Xv@-dlF20Q|v~p6UPfUzTo*Dh@Ar57gP|SI)wc+V$Zzuvo4KwZ5)m#Yli;>8iKq^3`g^RGWvjfuX zba~+^l4Skn4X;sKIOvhgO-*&`w71I-55Jr~^jW%OyHUGFrg>ZRXT&-d<+H|qN0$5Y zYo{H5CAZJr+&vA1YYr2`UZh7zVqK5{Qu@b*7m6C3ord#T|Nvy=nj$fZ+hABE=HMK1I#FR_IG zJqlv*y0C<3*YMu`^V2~kMvJYFn~88qrdu z;51-EVXZt;U@OYwH5(lImin)wIkGEdOE#i;-|;jjvz2*e%^v;$N~7>hO1tw-;i_{1 z9fnBd!?Lq(rA6EEkpcL|f{EE*?nRvcc^n4g%3uC}-$6n9zxDKs|6Lmvk^HT?@V`#% z*Rije|CgS;@xS`*|IH&j{#Pe*xtxoJNf3~Lwt9gU00!iaL8uEL?md9LNpv8;x@wqWcK~C-oLQ0rzBqvXR+0F{neqXEU8s|dLt(TPS(vPPF z)Ph0_;uZz3mG+gmUabaHIGBE7S0yKNXt#kb$Iu$1?$eDsmxih$z-%|jj3|ZOO8xy?VRQ;) z(T_oL55uG&$OL@|e0jR9Z4IX9Kn@Add;l%+iF3X7^ibBVvvsDR^|!`4)S*9G%*S&WFMz%NkGz3p%&6#?}hw0kC?PXq&Ng3g#p1W3F$ugoW?7-Z5XFDs~K%K8|PRmMckCZ6#?E7IcE z3shvn*@a78?X>6hw3knJz0M=FHxu1AH>+xv&nI@ZSy-+f{_^-Sh~4ti(+8(I`1tsa zPEOE1{2DTD>FgvIa`^`0ewa=GyN88<*`yDMS?D9exRbt~-p|(@pw0&wBgm8OMUtkc z?qMSldM{sgfVIKJudlDib^kEr0-+RiECs)#^=L!&25h;k%u!kSej-fKgvZB!w;1ID z)4T1XXJ9Z79kKiO2TG1_;;umJ5;p5fJ6-4L4pVvXXotTJuy_VE;*~pKIiMnIY-$S7 z?g2Y=ghU0b-^A4P`1qI#X=8vF_-q{Z5!|V)tV}LJKt)IAJcbt=4E_k$QA3^voB}4E zp<4hlAed0W>D)C$Bx5_{!bAn0>(V1oF9T6ShSb%Gz%v-&F$PiX5~!vy)UdKr%KHe$ zM_>d9h6YS5ePMdj7ZjF~lEXto)W~}n7yu_AFkFQ3U`I#)(dd^MiHWaZ49We`la{tN z_!^A8ad2^+{GAosC5BZ21hExm>rqKb1-(&z>r(|7VgjkK|culK~`lW z_)l%oxc>UE3Z!;8N${iqsnp({`eX?=x07JeixH1d(3`+B6K2^ARa8_!7`mVv5gu;y zDdYS1GeAwSOjtkKhY#mr02&0ALcx&ify{jS4Gc@#S(h$d4Q$WPgSN9ED{JIT4R#7< zdg?(%3{C`Rh92l+4i3m-%tRiA76thS1yOJrq9ROMLZ|>Ypy}%3rlBzkKZJt-nKul@ ztie2`pV~EXWf(iXf1ikyR4H4Tm^daro(w!>Nh0V)df%#phmC*3J8U>K38ddx3#3vg zumJxa-ZKrR0aOMu(;3Y8eAqK7S=mHRgJIo(a@|WDygthEi5f@5P*x8^U>7Ekbr=;wC7w%*cytUS<7!(3Gr->)4kAz}8uHjRjpc&B!6KtlrT77*#`pR81Qq1Gb5B{c z*$%;|pFVvGltDuVj-4-rIeVCG)8`<9*4M)5&Fj~ay4B?6vkD98G4G&E zcEW=iSXlnRN`r~QfGv!H3Rx+eadOE?Nr8OjzbUC681V)Ce+i<*y)8%l?hZpPcxHx= zrkMrxLtZ8-B#f$8SW?4k{asvrEk6LyI_QTnM9_H@q^B>=&p(3a)SM;W0NFgm5r1)c zIyySA&_)A1q`ZT}V=Ka`5mxL%piS3JAdCO0M0J*f4tYh7ex3xP51tFmwR| zdxB3A$?`CS0@Jbm{rxa?Xl`!4?en3fr3L(eQ7Oal%^P;j(ySZilBnrvY4E(QJgo{$ zZ-^{r78ZFBR$VFJ84?h(URBxMdY@A8<-c)ec&rRk{`vD(u#sE;4{>h-m2=_v5-h5DWpNk91Vt&1`?W-A*rNLQIbpvNhMTLi6T)MG7lLNqNE~;2GOM9`TSk? z{XWn8uDzb=U3=};Ui)_Cbe`w`Hyp$F_#WS*%MP3l?5X$#kqSymTdNC|A?)BS`Q-SQ zO5?_PYdxC2bI#nkQ!$BCrf?bs$}Ou0?`8VwUHvbzVIu>AoaeZ>jCUO6*$va5V0 z3YEjBd5kv*%CEG&y73bPkYB%kahvhO75cj0HE46DnQ2mVN7c(QaB66uqU$LjAb_3} zxYTBf!n(AzR7S(T`uzDba5oWvtooYXzPmkp(8l{QXVXBhpk6fD(BNWbZJoU;NksmQ zizaet-h;sAXmg`J>Inbr*fET)%H+wfA3UhS{*v~}=RWPVJs*`cahbnZBQgxOp>WOT zh8AuNM^IPj0V=;oBUZ7G)u}^=7LhG;30tqE1-Dfb(?E*4=1p&($o5o|9???Y-(K3? ztc|N5IWn#?KU#8|9-e{LqJc6pLVzJH6LH`Gz3mI=D7bRv%JdOf%pX60=9POre)43@ zg5&PQOMCW+b@x{Th=RFadInGXxw<+;@7k7+E|Yj|Kkk&X30%*II}7lOY;#0!UrEL1&QcPQvnr%l6G(fLmx0S(3D_fo-z+3KS4v%t7AwrSkh zv2zzL^l*3oR<(C~N(79;XU|qRI=+25=&yqq^N|xKT!@Jg>36BE=2|Ugtf6ykQQE5A z(b3V|ofgN2W9nN}+{xv=2+bo@yY9D0fV zle>tB^iO_t_a8Ms*uW8@I|X~e&vrxqn19j@iBwO;~m@fv_Ho6jBzsFQhe@1R;olvZA$}alf+%7xj%eWzZggnXmg|hKh)cT6*oCRDFw2W|Y55p8dpY7hVnF{Vc7Q>jK;x8pb3| zIA$ara_7^=ty&!JI*siz$~^MgF8b4W(cpB7zoY&Sp7}q1X;sa9+Iv$WAYHzEWL6y4 zx=Oh0QfdvkUJZ1|bSW`^rv_yk*G7wmPSgR_?uYa9dp=yd7TS@Vpt)4#?rmJzjm2u# z+H7ue7)u`!vDU%i{)!2lJ?IjsjuFOXt+J-AOJ3gY=a=VYN*U{L9VS**+V=PNtIX~5 z)4)Xcrc5jltfuDWv@{7nLIoi>Jo+r*^yyJ*YH2O*97m$Fnun`j?6v}qPpchOOqHf=c(B460v8_#TNdVny=*nZv+#pwQ@LX@H{ zXaqvsi>`bw@4k0s|n{tV=;km-dNxrWJ7m}JFW8-PTGp% z0aB)k1zA~IWzO)x$?g30dIjF1P3qJs`5n^R-7}?AInMX*6P=uT?m&3->iKgy zIaZ z#>V-N9?cL9+_kGOdK&ZQjnmO7E-aMpBwrakjCR=O^>naFO0IHr#8go6lw1Vub_p3au*2(twYFc;mPzxKYGVcA3-!m6Zif(XKr$y z7B1|&#rTwoVwW8wG&I6*e=OCq!h*B6Q43R3Qlv$@(mz7CU;nrJ!Eo6^0>ke9rc0ML z(hbQ;>F%#@GoQDfHES1-%IV?(H*UO02Z!s+J2V{-AJJ32{>-6!<*#19PD)C8{puC6 zebrS};Pvhqw!Q$uG zVHX!d;1R||pL8LSR;^Q3bm|lN#8u7n?8_>oT|#xX7@A;1xm~X*4j}+eK$!?a7Ehl&6Yr6>F8C`BV7o_E%9VUvcwgB` z2_!H45JPcn6BB#N6>v{1EXa`(xw5LNdMj>-hy`-9^ldct^lXU-I7@6D$pq~dkhnd) zg}c*KtBUpEqgSrn;dUys$ncC=WY}Atf5pUO+&$bs|6tdyU01JOZ5~6L65$s&edCz3 zCW-}qrixNTl9&aKNt^TBxjkz(1uhbT&4`GIBS-FTj(G9HEP(CYmzI{s@gq$po7uHX zX!e+Mm#RMgF81u%U9(%*u6j@H174)6_p6s+F3`*ax6yDqOf-`cKJggxb`LKPIdJ(~ z%hL<#>BySE=xkQneVcW4c6;^x(hd&%rO6S-0fI3yNNA~(Bd6da8_&{WTU1bB=%Op3 zU7pGYqX0!C9FGQ0z#aPXq0|;zLmMDv1EB}8rA7WhS?MxcTR-d%HbYQsA;iv~-Zj5j zNkV&M0JnU*_(js@%a`d|N3zbT{BmhR$&DK;coTZTpoGl|ls*G=vw$G~dG4AGu}23E=E&z%!Waci9CSFa#L@X{pS z6%5|x;=B7skC#?bRu=k;Qd0KaD?gxQR?)b*yZ;U)N$p{(gl{@JLyZw~sBn?w5;rt7 zaKu}Dd}qw?pFTqTm_Dg8p{I{-^ul;#C&bs?<(f^Ne1#QZEAEx!fHGDq6}P?YdHDEoMZKr|+n3Lt-GB7x zc0Zq>(m`^Qh^B|UEB9Le$Y8m+sgA*%*|YKE=Q1-bDon?)uFq_W2THBPfU)4T)KXQ? zygZw_qE=H#df>F6B6DkYMy3 z^`^0Oklq_dKd2FH2xY%$hZqZMKOgzVirMB8)1hSYUV zPPdAE*YEDLWBT-;?-f;5Wm;-wx^)X|ZS_7S5s_b6-miCeOl+61%;};ZQ#8unl@IFO zefRC>m^Is}L-qkSgwDEcy{IV2AT}W>iA|s6*7&*JGqW?>M3JS>tPj7rqTuyw$tFjY zhjew?yq?3(V%AC9>U(pUDvFd95S4Wq@%-gk zd{6^%MoF$;nD|$V?C%ZR|8*yCfeqST2Qj$Q>pe&2BBG<0ZYKu!I~kl`QQD&C-`TfE zK4C3dcKjs=W4v?{htaye!Ee?tmSg(X&5yFXHjOkkGP1w)7Ii726gjyackJ+n#ETd_ zj{JtJ?>TmuQf#003ICY5xJ4i>Br1y*A-ubOSFK!W2q9)6F~d&c3p><1C&?yfWgRCw^6PiYE)7`6OZ()U>K}M?j#hNO z@!YvLhb|U3;9IjMd>cS1%7u8k%y<2dUBB+LY}p`Jn>!{7ncpIA1iThh66 zQ-&<$H1S53LoURgK27k(b*i7@sGTM(CwLqS!_T$Lp}EfbEdf8?Mm`#|V_|&Q;K>V@ zEYSe9!Iz@KSH}|f=;zznp`+G#{(DgAveUIg41%;*oWFRn|GmM6bzwcb?)+@LV||?q zDHkRco3G%hf@b5Tw}y2D{H!`L4v&A#XiZ46NJZ(g5#r*-^ENCtwm(mVmelbVyqoQ# zs#A{dxO&wK20cr&ZCf_~hAzmO$bI4yH8r1djOWe6g&~{6xxH}T&w=~gPj-?bUz0VT zIB_DE)pOZ_D%?rtIE9fT5t%(09*()EkFdnf4Ew-B$mIy(>!Rs@(*)%#jD?cYrL;7C(W)%;#lnHa6d#T(+1qAd z(Y5n>$r)qii!zPDkCCj#B}MH=Q^Z~xF}fr5J3l76fNPmZ*C$!^K~lF*5i?hvcdG^%@mcD z38~#290(hX6fPwsIN%H`HY!Pp(OM4(;k(Ta?TPzJS2rvc=-Se&+#Wm+{3J;V_EzTE z?$h_sC?HmdHJMW|K;(-~jL*CnWMYH;j7E(a^V)8X(HXOutxx3w941+Y_@BrASo$oS zN$@AH*Cy3)R^RUEApHt!8P81w*Fi3e6b~aKgT{i0-{`f=XUvFeS&9`AiTX?bxgU9M zoLM4`^=0FH!JX+z?zLy+FiU{IKyeX>o0#f?_vaX!*3wmG)m7 zus=sx@%b@64Vm?c1w4@zOLQ>@OA4N|5b$~d6yg?ZS-$0!2fu8{xdh=|GgFB|Hddr$#(ryI_6&l zch~=~c3w(j%v!a)eL_C_nyUT!xZ=8owq0B$!q)YET*}B}NM< zonrHcbVD+#Z#)6i@5kdOlJtlEI2J0*OrNTBoy`a^;%k5 zQetNg&6Nu{c<2yG*74!T^Mfn5+0MB=ioS3&xr3+_NRb#q#F<$8R5Hw9TfAX z?N3VqZ?#^s#npw?uawzB; z(27EgQ2VyIu;Q<@F#`R_#ALglQ%>|c7Z=p3J2qJtn+FJ+{q!+eG=&p1oo7A05Er+q zVbNCf0{`i0Gn8-Mbj`gwQ3$ZWKd)N@Yrf0%^CPXOuclZtJ5)B%53OA9y3!pcie#(k zF@7`FYd2g-ROfgrpeG8P-+Yd^mRxsSwTe^my5%&Y85Bj4)_Hzp>NPjL5UXsykzu1v z*l+MeQhDkG?__%R>a}UZhMSSn(iz;Jw0X4ez^PlT9A@?O7Fp%=Ud!;9Kf94 z3|RJCwhd_t9yH2$cYY<175aemCG4)6$173`O9sXlhi%ik`{Koq2wPtX zu|QHlmioh`wP7ZTuyW2dpFvNfh7hT$swKK=%lEi=4~jM8l$2(Of)+HM>s}xf$<)_A z9TIDD6p8>SIg&iJ|hQdR8ocfgpDpgz@H7kx7v#PopR31Fu zmHxtxjt(LK&tcc2gWbV}n+I&$CI9o0YA%Iu>^}{P)a6&P@08;WowrcunlmQ|U|-FT zU-0N-%!`uWp^lp4_)>wxOyx%X*kc+)S=2hu>(qqg0>JGTp46^FecS7Y{f_DDIWrtW z5JIA7#F9H3^7V*-Cdu|0GeAa$jvvjHw*pe0tgHl1$v6|9bnQ{U9B)Zmy#6(x0a0lb z`^gv@cMo*Y+)BX;O%Jp!hyYLGdVut;idE(c$WNn_9DcV)8MS5S^lzxnWdGWVJxM%0eBY`o#y-&tiU$HWVCR zdpF-mj}jo&R%B0d+8dWEDJ9kBc6LxK28Fxk(=t)5UrBz~jaxE4>l#Y{LU7165qR3P zi4u!Fm;ll{_tm>1TJJMps?qmX#qTyZ*R3SrW=E!=202XI^V7p{^v*>4_Psl^9@gb} zX=k+AsafH~5Nn;Ru0G$`c(!OLGQ|0nhr$3Cf|z*GaLvWivWQ|+P%2iJM9T9eGe$hM zZS?j3YB~4n6zfJj?_)kP3DhGj%y{0s{v@bXnNQ@wtU;2M<8QB3)NB5_;LFSSeg=vf z8Uyqu-w;x$kEu8(iqW3)tgMD?s8UG3EEHu>8$NXKAiH+|CHM$iMDl6qA$7B$z@20A z#V>3=@XYSpjvG24s}O^8MT_3NLA5po33`;F^L{0JT`fYij6z}ktj#vg=9XfC@={{J z@6^k;-cGKhOa$_WT-=5&Tdv^oJUn!f#XEQIE22L;=3L{tQ6W8UajxagaBe_oaB$1d zD#?zbqIPQ|F>Da|Fm*#cf111A^WZ8GA@S>{oZvbWCD@%rLmhkIQF|aY2V9t zw~jqw5(ZyDuc;Ntt4rPyQAJQ?w*XP@4GxC+Bz^2^hGgy?F_EZ+Th^}!lt@WV?$fIm zQ-~zNM=rgU5({jeJL=PCXBW3ur?xDuJgM!43ZI>uTPMZ8&$;N79-6<^!$Wh!_4TVQ zX3SVc|8zx7j;F+rPo{0*mom=%c>PsfXRLgji6U37uC9*ZBk7ke@y2@XKNqp~20`=A zs90QB!7u?IT|X4|L}SU=x!NVyy+D5$vf_jYZ}aI>FRNHJs&u^Vl zBAwcK2^lkiCD9r<6d4&JPCXnCP>t~yHy|!Sdg*3^(%7-QyEB!Jbsy4I6ONrrPe1Ir z^LddCCx)AWna$LiNJ$fT_25<)N(YqwsV#rSii^srL|jAW3y>jTKjMm~W`-O=E=)WN zTlWVTP_}_m_6mN$2IF@4BGk`5PAh~@47b?qn;ji1iVzXUN}F!QpL60%RCY|~9RAJaY;JB& zv2=XxYEC79>jxzzC|*Z2mTE9D)kpc$sMCMii1vN~K0iP_Y9XqB<4!)gdw157CBINq z%S#;EzkgY2>9e-K?sMZw#w2QL_&tUWd!jmiJQCQ+At8@Q(J7iEL<vIZm9lM@ z=TnLgj*qXz>GAj^L)zNfC!(Sd^JUJ%d^D)IAmz(54<3BME12%E|IN@J`~}#A&&%)3 zM-r|{j|y#2GeQc_*?7v~I^I&XiWAEwd@Q$fc7{8&9D5h{oNrd#_ScAE=HfCkv-i%I z8+P=HMG6F358N`}QIKmtG;P6S<=%4X&;}_m1nlP)BAeNxk8DBX;cIP~tlnaCb77c4 zo|INp4*L(%A0S?W=_~XMc*O=y3x*WG@4ZGuuO zxbV2}EGUSW@nOL_^~;k)N)IF0@f_yaM$@TV8^<4dkf-;ysA$h(Q-U`N@o$za2`Mp& zk`xQXKW6S&gW?%iEU%kMh0ijm322=oGTBZ%8So4SLsV206o57=(?rj^0|TEsq=T0U zC*OZ&-18&jmtFL%xBFRJ;#&Xkt>uyyr9$=D#S|{(0+x^EthBSuf>HvZ1tU4G`?PFC z>Lc`HN?NHB9wtNh`nS0&xq$91BVXPp-fFvE1-4dr%ywt ztQV0RwdMdsmh7CIlKlKykS~fsTHZeuYrHd8-tG=iPAT6y+xyk6TXyVGh4k6aq~U)3 z>+`#MTcNtm=WOV4j>07|n|#{V2OmCk62+qe2(hOKFjzn$p zX^(R}UN`cCs)rnVw!-_F0;-W&TG8{F);% zaq{GQ%A#+$e^jo9YkO|b1$vW~kug3t@r-)Xm%{J2G}I6LtsnmqmFW$ph>mJTEsVw! z6W_bT0N*Gn6FzS!@jm?0x(##Z%u!TPQ84c)QiO4V;xjxc8_pT$YQyTC-$2b#gA_bB z3js=lXJZIRu=v9#Pws3pg~d=?S^4_evpQn=@|j#ZYcsQrNa;ee<49#H>sR4_iDxQ) zSlQU@6TgTcJ5%l$n?R_+vJ$4OFYYEcN?i1fOCtvfX=7MQSwzIw=QvO6Du+s!FV+sR z$kL%3(WDMAadP@fD8%WbciG>(;K=JP0|pF0qfgK4M;_VpYg@koUNr&Y$c#}{!QKnH z^zg3)U@h8my!qmB5LOwbmK689wlgR89p(z|(ufgujN}F80OS-t!KT zwqLM89E90EpEh1a752{Lz(SP{n}Z5=8Kfvl-OjERr- z6<(6k?Q8cg%SUgVh(*AO~03+(HQ>|diD>w`uFu&SM8 zuH;X;JXLXVJ90{3$JEI(gf_bBy3Xt*>|e zp652dTMSBw6{jXrIr)*Ax#uDP8pTG6duYWFyrhJVo&362(k56)YcIWJECe4xo}4*f zPvA5Yv9~rizh^72)#gmwP-aNM6w^&e{wIX4(9M5?k%mmb3w?3Y*wH8s^Qch)%^7!; z)`l$klz*{G=j_^@@<0jW!uP1QvSMPQqSQZ@P-oA`m?=u-7;`v^AYLd*fNW}1i`iKSoX#M4^8L0zx z7~>0MLA+2X$ z*I{A1xB7z_J*#p@=C$$jN&+I15`YwhE7>Tux&;PFUhm>^W8A7qOm-j zSl6AzPMfY;QQrn?pj@LFsjMp~dQyuwH#KD_j6%etb-K9(BA6vccHa279`WAB?^iy+ zua=p8-)>>u(=9_K{Cdq0#RX9Xee?LS3vUn4&id8L)K$$sx@vPSYOo5}PV+^JBsbMZ zPh9;Fivtxc6&+jZ1PKX2^RL|(0&Tqc`i&cptF79_0yTZ`Q}vxdB0gV`Bu`5Ejn7ga z*!%r6(u0Es4(y2BLH-Qgq~X;SkC5j@5@1rXW{D&d)X165BItoVdlqAs*qk_4*GySq z%9a`{iZ{fq?Krvf=YCYR=c?P{BB%lw@W(pg!0mGz4E?a{?d82t*;!x8GO>3 z$fxD?P+KL24HGzs?}vS`eB{koPEt5h8Vbo9q~`B6AQzN>Doqt@$8;p7KLBkMN-s-y zI6#;~IE0BqGL-90Lc2lzBUJbYBsaEWUTEkVrP;`*2Y~!vTg`%gn>ABWEUDzkb3h5EV$|+EH>}2|el9v1J78oCYnuvkAX1hfEQ-YfR=) zV;IT%@bsOn)vD;dNr!y;_HC~?8qLf(@^1Wgj25mrbMC`sT7K@@XAR}g2G!;CP^GEzvw&gxdV_H>+9#~Q)I!#!zC_#{fmjU1_tdB8J&uBhnRy*mvha2;I9)RV)N4m6y(o%jA0(d)^R z!#dzF?Ywt4XzsadVbcyhkkYfDJ$7%k_@;VT227eDhQupodL`WXz14Ya>GG*9i5ZMe zL`!b@qZix%`n#?Ne+|*xXCYq_!URKK##?39VP%QwYL~eEYqj-t$jCG3>+@G0N=Ly*>>_Z(_W_?=FKOsD>C%? z)!68efPFHKFb_JyLTLC^#H9L8vsMi>&I(v8H61$kWuhlJ?p;kuzSXPvl`ly*5I z_C|I9HSvzuJ8{_G(eFhc7uW!Yrd%_6TsRYXtSNF>I$^+>ut(^5tGKSN z5kqM=1_T!T^sZcNX#(_zJl&ghHAau3f!Kn*p5^GnOnN!AT}s z(3m_q-YhZm)NT8T?>whD)~J8`3;vpfgubp35M5DG7OxS6f|(iP;=&N)jjugce=GWa z@xp}|6Gae}iuZ4En2tY=FetXO7aclc2M;2)+jDhz@=z7 zyx;G;YsFiF4GA%~b{e0b_Am_8$obQtE#rU~@X!_WriR_S-L!DWbQ72}AoOc?j|fZiBL}}W{Kyf_2@{%eD)*hgwRJxKSSW03!2Xn!8Ujf!3WSBU)sLh% zUVZrJ5t`~@n6{9R`93~v2*zt&wW+^y0pxGjuI}$2hNK33Z_SNT(W}AzvKJK*ljH*k z0i(jhH&@)3IB@KaRa<9sc^I~Mp)gXgHkS}AcTQxv-`VXUq4(#?DZG>4RCXbBVLWgU zR|AK3;jPQY>XTiaz6UXGx00|NehWX?K*CXmAg!tF%v$g`_`?G+k??tEOcXzCYZ`j> zMUZNdwOPgp+mBnj`YPC(m|URq#;%NOB>)(zeeKSzee!XUQN{GOwazOD*lb>S7BBE# z@eW1@-*z2We0UW|{z~8$=3ztKln-0YEC|!XXlG+$XergiTrk%p___uZqbSeLS)QJ> zK3PGwzB7I!ArPJ(Eowk*1hB{J=wzQh-L;3%vC}+yzGy5(hM-yv5|!X4&2fr~KTG}G zFU#mA1{lO1&9--S9VRO~Z^%w^Xs%INJ|r#lvUI*wiGwW|aWhiJ?-0C%J%Cae1 zF#Buw;IEdeoSgP3eQ9=Xh}`!Q!i~p9E7DECIEyIu6f0v6j(DtTF)6$l3es(=4LSui0Gfk!Eq8 z$7WJau+@#H(9fY6GVe3s8S%)Kb?;`mK!tatQRHfiAH|eEV;Gm4nxdB;7a>S(T#4uQ_VByv>}Oxi36valJFs*mX- zB<_$a=?P42?LuC9z1zcP|bPzA&lVqDnpsdyxe#eD*7seD>lAD5S<}z zJo|anyJKTl0xm>Zr8X}=I(@_lo8Vp3o=W8RUS3dqZyUignFx?_MceO|mW<{+qsMpj zR8*c86}6HMF$?H9)>_YG^oI|3PES~IV>{EE+e(jLkFYeh?IBQKPz6 zUR^bo{w~12UVfmJ8^_FkXC5VQuxhrjr%Kv#f0o0F-jKGbP%zY!g(_)mo0A9)t9^8Y;aaBLL zGjw_UFareRxELu2%BP&!NwVL$u!zBvB<0QcyC5HBbn?%!O1oSf{~Zt_#643tX;<|)%q z<)1eHTEtVL2)vbsRdQyMCI8`zxc_wO>|fQ}PHz>PSXMn5fRoCO{IqF<`<=d-Dm!Ml ztj}LjbW!p6kap`s3Xa<@*&yGn?s`fx_l0Y53IV+`!_!C)L5%3h@olQHMwx^(l+2G_ ztIv<8t}hkwb;>KRuZw(!0=fQpSHyFYlZOr;u7@mn;qeLrzhP2R>7;f<+(@g>uTb^x zXsH~|W^xqX>kZptGBK|wca?a2~)iHd@n3k6Zs*O>lI=+x1$vn~3p zarCf(1E=_P_)y**J2nw##-@JU(h$?BY>tiLm_a(VNVDtaHD&ekgN6w zG4e7*s3qLAZ{Kg)0_CvK%z_qQuvJah_YP~jb$b6}I0 zV`|~Twx{MIc>cNr#6A-Fqw3UDaF-`7(?d}i9OSJa| z3E+F?WN2suCpkPLF`*@dpXKl7!_4~8*r-b|$c$5q@r963jP{PW^~Jpv?3)gzOg@D- zV#Ma2n=6Dw0J8@IEqGqKr;oOoBo^?o!wH&LAb1&bM^;ge;Cy7NywFy>6})2cxLo}|Fvl5`5V!wb{N$H0(Vyl4?C6V+UMj=tG!vTQKD?mc>df%`C|qIsE;fdk+@ z**2CVH95H*`%Xe|CwJ%GXUU&>*k%W(66jK4V@3@fkyOIvnJ=%tcHxQ@0!_32jK4uF z^KgV%pJgL6%<~(5hiGPSVGD+DPRZ~3xz{u3t7xNDRd1=wr<1JSW`osy>45>lgSk` z4QpzX&y-eF2-+dyIqne{qMWD=Z|D!3T z5VhcS|CwX$J7!VM+YN>Rpa9HdDciS;yt19r3|352O>G&5Flu2xQBh!QuC>(QY~qx92Y}5b74Q96Q!Vm1Q*fsf#pc-MM>L7*hP| z+>+!zyZ^R@IJK9S#VDPv(z&@3`$3^O4M)G|HVw#xy1=_|okn~tPRVhH@Ph)xb)rh+ zwOvK(TGE{>27FDVbFA*wKw6`pZy7Xa-)Fz=e~Wh65i{96@OyvZOZjaO%`qXwC#k|d z)cyGJwd%Tvh_{A7q>Cx`eh}GzEA_RrsS1i+Y_l+h%<3i+JvUmfB6M$eN5b2eyk>=_fRe)%4B5B=a+gu&6xIQCB2(}|K959 znZ6})7~Hl|aKD z`h7{lzHNZ>L{TIwSdMj!gMp4Vbk6ldzjiR@h;cIRF3Uu+!bf$ViIcvPk@3CC%4a36 zfuz@Q5(oD57$OTVPtQ6&J*@KMM;dVyq{OyrEgJe$V_mPeud}SP2bH{n;k2!z%}eMy z+%9gQYMY}?W=JydK$6LU0$GZV=syD*@2t55ayV`Ol!6{NUVq)xbtdkHnV6KzCMYYEMo3<^5`$MwN!oVK|)CGK(9-Kfo>2( zpeq|R{>{}*V{F{uYjlJ^Swn$9YO=lS+l!xYX`bFlet|~Ps!!b87M;Hn!Zk^oCL_w$ zuB{}>4AQQ6aR2@Yz3r`J<^q(VCnF`r{OrU>h(u*#=}s+wr4&Kb$<7cjjyfp*^Dftvb}A!$FDVp zb$~J2#J(q=((Wo30G|tT_PB|{kuVIQJ8BZ)l!>BzgK&-!foN`qhk#qxB@RR|21sUu zyZie~Yx|`%?yvrv4FT=^NF{j%9s9yI7A)3|vU-mCcBG~Wa5~pc*Zt((LBT?%_P5#E>E1{&*YLfcklC|l(Fnk#Wuv1LVndy!Ol@t2G3z+h z>guf^j+B-U4nIx~Nlf^QYQ3~qLCJAGhc53S;A4bY%(MP38~O7S;wjpG9oi|IBs12{ zoO$QuQ}fyXzW%8fsdBfC@7wNX*!7z1_L3R!LLR3woABMc$UAn_-!wWkw6rW2Eo$Hs zP6D%YFu0dOb_nqTQv*#Qp{0!@ig>O!Ojn*2$DMbc@{8K|@q2HsfFL@alDynv3yVy< zJ7S=4etw-SakQS_uzNGfiGTe1B~<0vy#+=_>#Yy$eX<6Gvj{dMpOxG8L*O3rk>UpA zQn>7u69)2W)4*Jb6i_wtmqAD)n5mK!H2?0>h5QC|wzZ!>?&S>YZEbv9R3s}0;pP&Xdih8JyUphCU=9J#pzPe&S%jn! z7zxc9gEtKj7heI1>2^Q85drkLP%K7M?R^pRUviYkj=kz$)!*0NhngG|y36NhDoRma zfA{VkWI2Aw>WRhBoYA7@LUlzn7Q^mVl-_f4M%LAn!R^@$LFG2qiRky3Y?OCz0at0183(;z=QAy5t!)ule z-7l*?{r5%h51I^)@ROOUxDBkNoP3wkM;D!5odb|oIOIjvVbv}kOWWY@tB+A7;7pT{ zF9LO4y7cm;OCyV%9xx|4uzDQ#GIHW-vE8>N)ZYW5J$IPI8L{g2qp4{)E6kbu(-;L> z-_+1R7D{9Cw|7@kkY;0)>h0^bCyrH%AP$(c9 zHnc#TVD`ph(4eD7JpoMvOi&r(a0D9yW=#P7ab#e$*B2MB_;I4Ven7Ps`!ih*OfuDJibb`4>}GiONDWpEps$T<$pNi@{e zw^Yw^m73kT&w48R9AP2TcKmYSH|OFMn@<$*sRb^WKVMjM15tT-k(}`)I*7J#-UL<; ziT{S*3WH2P-PqincEeo4T1w!W#utddoBhG01ci_*?L&JLS`ZQv58kjPP=Nm-VE}i4 zs`}BXo6bUu0DA~gy>~7(wdvO{KJU?!Clqi5j){Syj?T6l+y9!v5Cw>o9}CrBCZ9a1 z3-`pXUf;iauw#!N2dmV(&Fpl9!$au46&NHIVG>e zCH|`G#;inshD@}dV`Ec-Wx<4X3|czw?87uB9BSvu-d4Vh2_zYS%t+HD6Xx&Xk7o|6 zf^s5w^0#jV`h}~jYu*YP@Dw&ireal0&E;M%7jZCk^ZI=P#1DeaP8ccv{=q3$q`Kat zJcVWpxfY$jSeWE9WcB$U*Vk1_&#ofy_&8Z-MMat#h+Urdh9q7v*T+W?{yF)PB>+RX za{sHiL7pt;wQe_O2$za%65Ae)mRM)Tmf8&(XMcCzOI-lo` z8Pkg|DW%ptT=OeYwe_oW?pLX*qSls{13}x(XRbTo>C>&oL?n`vLFiJ!oP@ z=;RVcC#R%;V01I2<|gI!w08c?PUZ|=x$=6r4s9OOrc5a?YpUOKPAPVds2Y9-Vg#%1 zcz5k;m=yw_)33eSRyK4EbuR*pbLUs%#B!R;Lf~#eN^^O0;bT>II1mK3?c}c-vQGrS zWysVYCmP0u3ymRE+bLi$nR@J~Q5C@%;}P=$B}yaV##526&+8{4CI_gYV0`lY(j+z> zSHT!wP;8|D2atB4pDQ1Hm6E+HtE-dD688<)OL^|_uc_F2%5}zOi9B|U6hNomyt6000+FzF04%h1bU110Mz_=nwkEm0XNqJ!5kjG@ z`Sf_OTsUk~JiZ;JP|uQl1|>Psz&LrI)~a}eAWBqEj;Y79TDZ%XZY%8V(_!qAxX}_h zj-CX9*%uvn&ScCnr7bv`qP=i?RWT+@TKVKuGy?}vBleT@9y+-xGEw{aq zbnooKs3M+Vn2vYB;wX~-yV#k;#ph7J+eR>q-N$wm5N)1*mF#qTYi)MrA1%F#S|BJ} zJqnh^%lT%=As#8zgCB|xTL&RD6`%;^<(fD{$LHOM;W(1OE4OLBK%5>5V6cWq&XE<`Wg=N6KWOkd47xf!BVZ^9W=tFpUdlSU3$BDKYAN<=u zG|)BemdxTy{j$CwsyJ}!M*Hd0MLORKf;8tKS{Oydun@vT-kRcfNd4Vj+Rfkd^NSJr zrsmR?_n$t6LFb8P1q{4cXJCvQO0$w)k+XQxC6<*%S%ee_sA}mI-C=b;n?Eglj$xvY zRk!ua$j^4XK1SA;=;6y32gl%UvuEEU@fT{a^j(p>w_?U>0hA72a~Y>~rqsxD0cLjG}SdVpiVXwZy5P z@E5A&x2EAm>f1=vM7E#*NB#A_>>tI~|BU}UZe?J~k!8+HZ|iOy=ZSfQl1!GEh{)G; zXe}+x&5GdY{R0|{$D53~KUyl5Nl596 z=wLltGVlfy>oKRxO-x2)k5^P22(1(hv(NG+zY5}Wz9gl#pZkpoq&eE%eAxDt)>k)< zW{@}n9i+wNgRn#}y$4GyFWS!~L?yrj$5ge-yucCv8g&cOBLpb#=ys@OcqPm1{4N>0 zO}bvE95)FvHI%-cJG<})8eV9Cm?5)d!M}ab#40m4vVG#;T`AqbBSwuHg@n%*A{#gp z0@rlJBR)$@F(>JlB)ETPLBp7#mE+0hW)`K3{B zn?Csh1LvO$eW%Z#o3?JE{ky%?zu$?dsNH=A9|6>Y-%D;HDu>Nw&^@s>0cF1-Q$_?J z^)V31RxTu!*^cD4wKk3LUW!+8s@!*L#E^V!-MZEBv2y5Tip!Yp|8f5xxqo~~4v((N zvri)820?gHfo<7z@%r`mlz>H_LxCp^rGIJeZ#4J_v`_Y(NwWw{npVEu>9<=jJ)Ayb zHBL-tTczISb*JBcd+|(3ORMO~6Tu`$`}_!Yzd;*o`|`OY%UB^v1A+erPzxLmiupl6P6VdNr(bKm0l#kTh=VsiSO#pPwI%tr?a&*lcPrV`YZw`gjU} z)9aMburRpNn>;<6=Vwk-T||=@SQ>-@a%M!3*E~J3%*twffRIn(Nub7L6Et)3DTTn7 zU$S_kKBo3Fv@yE=K;mJdv=L`eb>-0>aAnNTTSyEYn#?g@OXehu<_0sNpF#Ncw9f#` z`2BiiP8tEm2Og62Z9D`#$}UcY=idrp=6MT&Q`3H1b`L5NE-vRMeJ%{Wj4nYRYxB+j zHX(}$!_REpP}XT|Xyp`B1?OQfGJrny3)x>*eAG?*=Lp}4IMi4%=MoE z&@1;2*VCon7vKsI5gubbSSy50-Ij_&@wpn*!Op`=LP$-@F%fvCjzI?lr zQ#Y*v2|IPr^pv;wk{@oKsbgLpn?V1st}d9zFSnc) zA$FiN4U%&DodovEn{UCU$ji&KVJ(=$UUC>{-n8=TSEtphH6ZD{w%NKsHm;W(EJ8wz z*92U2MkOzuhA$-rg2_xH-rSKca)!&6y#@Vb_;wKV%ZEe(R`Ix~*cWG|Bmwh4%bQ8nbm%p5IqnuHUyjy#ATvA{C;A#@_&1hb|@ zOdU=aLxz4-@gM?fH6kU5ABXy`2Z`^qXSH9iLSFyvmY6KB=gV zA2Fiz*l>3bkB(~F&LSKfEB~+d3LGT>CaF1l=XYuYJ43=EEG3V}DH4iOQ%4UPJh-}h ze{6GjXn!nPO-Xh&twRVE7cO_>?%F=w+)8*nSW9LNVYC#W6mNqQbj$ zM|FB6Xg*DBr;J2DfKat&<{?LtR>L0zU&Q08K2uHej}_m<_qJ3;HIf@`Z9@nPXOl()ZbH^{*nk?IEz`dRS-rmC)C!%q_ zZ=b=MMxy%iUA}U{kHG7r5LXx6&NJX}t*PX@jw_ZV&KbLorabbGD&Jm!Df6yu_(@m5 zm&>G60wP^DV5#Q3#fnn6@!n!$WMk})$CfQ_B!-gF^wHvkq2fMx`t(T75Y@3`9WgEd z79^Huog42Cc0)c&Ob*gLM%FzpkE@do>Wh>ECPLL_!q+s*elrb3B_$8Bg4MNY7cT7A zLySSM=p#XZL!R>D>QA?^sOX^iqFcO%e1yz2E8>OTFKiJ)bxf#M z;49F&4R4C7dcupu>Krb`j4L$c$XhqEwrhQ3JLF|f6MgHYAhE1hd98(IB2dt8GHb0` z`gYmr-Fc$`<~M&_)*`H8e0=pu(*t({={d3WZ8;M=Kk4GXlgB-iW}9}J9SYi><%kC& zYs9I9%4)p$5KS!vRthno+>BiV&uMPs2EgtVvTsn{daMG$FF(fbYe@jE;UDPH^lqwI zw{oSLp^(<)a6T_kwZknsl(WFb%{f+=NOdY2u zu=aLyoe4JH{Bz5p5m@})o;n{ac>Fq+8j4ObaTwa@B_%eUe(TAlJl3xl=LFLi1UY;2 zUkd1|pqgFPFiuJgonK5(mCA48gEPY|^0nvx1EnYwca<@qL->qJfP8GznarBE;aX-E z8vl=XJMCNzIgQggzUn|Rdt$MCd3Eh;rwk;Y$!vc%HKo4la(dL+YtE;0uOEVh+isuY za@Yd>u;a&_nB_s^NBF!?|G+x!<)|6)+>^AmeK;iC%dFbG0b+q*6CGtnT!0s|IJUoL z%gBZTk<6BD5GflSa0>2DPE*NN5>Nh8Kt}il2X@pG55#et-&}|d3(Lo4(D(}v#azx1 zUMJf5hX~4!9UDaV`>Vee5Oe9Zeu)zRk*ga89FJJ7byH=4ICh$ATtX0m^Q7_p@4x?s zRU0TyqHq+218?uFS#c1!An+~0nmW}?Ea)i!5Cqs%zqr1#8cr2uW%2>z2U~&*HrLF50?qA=*-$-StGMUn z0biB|dwpJZc;1=7z?q0lz!srtPt&c$O6F`nbT`kCeFqN;t!~9}`u%C3XWif}l@R@7 z%d=Wq3`F4)VdsYXHtWYd|5lQ{yvZTUEHVA!MInb;v*t5_iEdlnZQ=;EEq%3ASGB&U zbMvyxTY#k>xJa^nRs~}GPdxF9ufy?De!t&+;3f``kVpgcKy(&;kl(GXEQt@)*DRmT zomw8>ni2VcstiXAnF?#ax$}ZULl?Na|AdBTw`vtFX}|CWG$76t{a9O@i}L{gAob-B zjBfZ^bER-FjG*~P#$TnEi6m2(?r%rS@37ejg_ew4!p)`T34!cQhO@b8OE=hCX4F`5 zbj+ZCp0;Xs_`D3vClL+68-%!r!&0%0sHsrfyEH2fd(pFBzgkYg>a_?~Elpg^?hl#l zdVfIwMG4Mf+jT?+x77_pyj^Np7;8;->Rd6BoWsOjYSz(k<~ z)eJgs_ISYJAXjjA@1RxGQ8_JCR85L%tE!e!L)-Z2A$e)Rc*z#To zHtoQo5QUDu${!pG6J|O6EiygYAnBECR(Fx<+cvfA@VM19$WOO#m9v9O`X%Gp8zlf3 z)z}o1hEt1b3ti;<8%TwR&yFuie!HrR$OyJ)dr{r0k~s4(7eqvk2?&{!P3Q-ObFXf9 z5wYL*Ki#$eU{C3o9C>HwuyyL!Kh)PW`}MZ&B{Dt7sJAs@WM_-6uaW*#Fjp=w^^V`b zENM`(4d{)p82C_nfnV0|-wCVCeLLeGKg$pi`Ey#DhXad}R8kwI3gp`}J|sUYx3w+# z#g9D^>s6w_@`WB&679~8rd-?4UVn*f9t7MrB0wBmTeuc#Y8a1PAgB3L%IEK!aZpg| z!GjUe6mcO4z-@g064|a5#50Q1nMUSEL?+agiPo-NyB4c-P8m>uOoj{HyKmopK|w&z zX|YOOLIkXYwam=)b?+KUsBP)D z5M7AHVEI9Q*$=!mXIs!ndk^dofb?Apz zjt(vrwa+fD3F|3vjACCo^|Ah2BxYDv+w{Rv-c9$e&z`yZliv@MKB1u}EGN}(acG%! zX_kiBU=fkle;b#oKU2B>7e?kkIIbMa|2+fsfAw$wocq!xO9<)q?_b~6yaDiV%ZF`O zF0O%~WJKE_fGKDuu`;1YTUk7EuODd3pdZ`c|27!suMZe=fO)D!CW=zTj6Sv5O)xu? zJ`57szE@bmSM`L-zV&xx41#DE){b8WH^<8AJ!gP8j1>3|CY&>5xolZ>=`x~UaK>+y zl}!K*di4TVgqWuC@v%jV7Yq3{%yw^3-dEM!+0RFHdx#|LBh!QbgHI$)*NI13dn1SS z@I10FWkd)71^qzeW%M4wK5<>Qt{4!8(_dAK(g@-Yf+_&{4pGLJ@^TV%LHhm4QxTDh z&}kT*uj?UkA+uo{Np_W=SJBy?LI*g{X*~HFWhjz&f{fKvn5lW7$NQ)HM4TBYPQXEN zXw#N0uQMR-3sn}rO|+kdh=@&BuBFLP)q_C+;;k=B$O(w$xx8(Lf-G1dhX(~9 zl&(v6w|3Aneka5xw7;KhJ}l*k5aoyfNLfQ@-R0}IHhy<@ad}^wdvenYfn!WmOz~W! zc(BNJD`7sG#@*uL?1Y3lMZi~S9m`3^Rs-R{9XZ)iz>9xIoW?D01t0>0AjIr^tzJS+ zg|wQ`J1fy$L}c**;c-`4UU6-I+zz(A(Ac;iDW%J+Z(pDI@DCZ^w3ogcs=!J08$?7# zofo#$nzWAAsS~=}ys3#rzl{Mxqdg@ng8zqc%D1grE^0~}mZaoM!UQ(7(Eh53NQ<1{ z7oLMB

m->+Xk8X-7K{0JdpuqG(M)eYsds0aMhLkwG5(EhCaFb%5vo6GBHk~)BX z3X_H0D}c3&zKMy%l-Ln4#7G0ooTn%cvkEZ5?X(V$4w31I?_eTA!ghf7|2E)FDrbPL zbl|W8aL4BPLSQciSio^A0(YPs0GuUipY@KBVZp!PjIB}5*Fntz2DZarz{g!~ nas%H^p^)7IzPe(>a{r6RG2WlG=hSu3HN^~`u6{1-oD!Mwk}GPCb$Q;;O-7d1HnDG1$TE(LgN;KC1~*Au8nKZ4(=`uH15t_*}rk# z+vnW($G&5{G2UZ9HN94KRjsO7-<zXGPcP$h2~IWv!$*sF)HI@Ts9ukg-W7{89cDtBHuf zK_ApN7V7y)g`InN_cb!lBAw|;ay`~`&G1)z-}g@Dd^}tHJ~xoOdn{>P*Bd|n!d$>quq`3CQL;|3dMXT zY_uregi7kxnd0#)BKddT*W%~zV_tmt`Of2hCGZHU$1ELwi9qz}P5tLcL{k3VlVsty8~tAuXA{5h1pASDiRU;D zJPoRU3rm^SbEPQ2e4ElFw}gZo+HUo^YTAEkadBzB%`)Zw9tn@${n1a51$iB-HnE29Oscx#Zye~Q<%~g=4|rF zARq!6&!v`Et--&&TJ}9$9Ex(Q(`(|&X9zKV9kR0|#eg=1L%n!&j)VrNq0iZEe+L=*{Ogc{2rxtO2VT6g%=)KqUeA1^PNu!q7nf#2i(<^A0qB$x)S{cITeEnUY=Uv)^I8z0RbJ$Da&A~BD>)P+hir_FtI?Ax#9;+>pr^? zvX7f|B7LKHJ)ZtEf9B?VF7{^Q;^KNgR(c*T;WKLjqVctCL^>k7MtA@E6u!Q`9?hGT zpHJ6f2s>?7E5sX1)GWpqnqXpLvPvO{?16lx2)J4uNMsg)v1?bf_w|KhxjfumQv}|r zzQGBGK!!3zg{i2F$MY3MV6g9;G=hJB8gp{GhKKEM&UV1`IZm&wt*z(l9btom<2!Ci zNl8I3(TT+anzdQ-8Ek-k3!se%O#JcgG!%nOPEj$P*LG^9Bgoa&mEU3Edt&0`!h)TN z$=cQypT*Gkqa&xW^LL+J;UoJql{vqD$&^pe&&+i9_QsG2C*|+l-(DUrG*%ZC$(2vL zl3rfSI~GswVv65kX#raKF2uH>#=8G9H8wA~KHT1qrf(!en6*>M4W`FD#{vI=?m$uE zOQU}bvn`J4)G^8vP$s%98>dLS3YQmc_0%mp-6iVi@NCSRPx~=3@qua?B*n4{Cp7e; zVqsBWK*a{*p>YfU9+uX)HnDLhfw|z|j%TBt_wTK%iXV!@E&;p`D`x#+pS zwbJr?6;beRXwp4UHb>wD&pK8P>M8#U&+pkv)@>laQ}~=qBz2q=#qgp|b*m4-V)Zd>esIpG5?JkJp~)pQS`mXZ(qp zSX_LJm-dlbe0(yLFxPLN_FK;Xk|GugYcep#(+7eNmBpdv!7e*iS*78cUox&FhBwf_Br33tamix=H_14?d>@1?cyGJMU~L- zI%HKq=?#wTn{PVR7PE764l@;hH<3`f!(x*=Dj}Plm6djtS$N0CkFU4F=`)TlE&wIw zZfLmF=n9Xa5GTjQrLp^L{2f?*;CkT)CVKh;jbcrd7j>4I{vPe0o&eB#eYGB&r?wM; z&%Cy_R#aS^%&JEhC6X%WnjaL@1#BpNef_lW-v!Kmf4#c$QdWi?wmr6%l_{|$!_tMd ze*Xl(#h{WJzLL@TM-Xb+Q^)`gD~5+!q-bdwGI2o8o9n3w%;#)RnhgWHl2%e|Ju(Mp z=ezA+<0hS1yrzO!&c~7q-px6uns$*LcpB#JiTJc0IL60 z%9I!#9i3}iA=u~a)6#ltA_D8{?PbD?0H6Vnkg&e4E(2oJ|j35H(-y2-6Kil~!saBwjAK~Y&*85K41$+MTu*ITLh`1opt z30U90e`iP-=#8Zi_c^m#Wd)G&?He32@c_Srg+@(HO=iuKpVleH-^KiI81P=*aXmr$ zOn84;%IAJ$CucSKBN?Qq&<> z*{m~{!v*5|ZE8|`T?H*m;;s)FKhK%-g+}%FXYn)rTUZN!#?_&O1+G3Ck{mEy{>Z5Z~cR|hI0BI1=XjW|~;cPRm{mpq~Obo%r_taEo z(m)-ZS-?O6Q2`R$Id5lUv*vA>GkRnI*wf}*M6K)~B&2|@tC*BA-#)_X4CXYE04p~y zc2CzzPVSlv1Ch(+ow#!UR=%0$>#< LQIq`Tu;WWeJzuM)QfTxsz%GmDNIW$`g3 zGkO**@^dp zKvaH?XW`n^Y}CCKXYt{F@^Mf3yHtqdfhF78IZ9|uv&QPtY7X|j znSH3T;a$;pSEoAzq4C7B#yL2mfX@4MQR|$?-sU0NVi>v#h*aSwTU+EuclSSk(W< z&BVmS&Th}0Tlj8@q0QFQc*M=P08CFKr3#2dCm~A}i!Wf)BqZP&ug1h+RBGFi64OQv zkL|dDu{OK|_GT)9#YM&>pV)CLP)Zl_*qZ@Bx3jA&)Bi$8PfsuUJx$GDcMAZQXzw`V z*Ty$f2hMW8@Ya$6tJJDzb@>aW+9(YhQTFrdhUQW9sMM-;m``Ovqfh)Qb z>E-#fQQPT=@M0gz=GGRQPSqQBcIB(2cM;Sg%7C*lr)wjzzUw0yF|P-bqR3UqR2X{r zRUcnpOSF@cO9|}X;S}E9qVLB>j*gC|;gQ+D#tW3`>FG~JC;-Liw*VU(Q@b)-jun4k zAc$l)Y<^8bVtW_Uc@RIcT=LUA?fZa$Y>NUNZn$J;#Iu)ZN9X6}I+|YLaBpU2W>W!f zB}>{n%0xL}^=1J-G(*T8(5~>i>(k-kVK^+)(a!GfWRN`=>ph4_#H#`dg*smWp01LT z(llAdkq8$75|X~W9ifo*yY1ZRIp(so8R$j9WoEyv(e0)cqO)XS>MT+j!*B^-Scr#A zv^Yh;g?~NHO5V13Tl5wimR-lt$6OZXjzK{F+7jm=J^~t}0^|HD&jtzFa-3#xh z&!)Z!Ij0b5h>bk+Ohv=M$N&QoCaHS1=im-4uPsUHteZc{!0_3_RRr1<}?#CVe-5FKJ_;hR@WGBUDYaLiY}ml&iC-lto2b#>g9BP>R(B1}wjSpd`Xp+u+p{q_zj8rmDk zuSpwY8WKJ`4!}&>aZBZQ2ktQdfrIG7_%k+njwzzt1%2{x69mE%!R zk0>-xWQjx}&XEHpRwz4R^}PrY7&K~@2PctvLj{?hBuH=`X)&R{h)5SO9l}%|T5xWr zd*FnUd_X?%UYO)HmLmIh^*-##ReJPC0HTW7dv287uj{qr>K{-b@@(k0>-pbe>}3wy zIe0JY_zAQu28Q5Fj3M6}ZBE%IT%SRxHKh&Y(3M3VW;mBU!mY>iff)jYXWh!=Bg6_V zN#98UbcrefK~kpQSqFaaUfzaDkT#PEI?Lb*HA<6ow)kEqvFhcj6>|J|Dy0g{Iw_YKhzg+IEZ`&QEQ5ec zHvgej*oDvO{9|jow2Fj8FVxWPbx%&(`{1tFu;P_Q7){O&hv2kap{e}^Zgp92amaf zy_8D~h0J-($#I2-{_WSsd!_wQ5rX@{Hu0NY^M~%Y=KHfoN%TA6qErw!{p;&V?_}hb z+mZFpbm-Q;-+qLrSI82p_SD>cjZIA> zfPz0>>j7(}f0b#1?K_Y@vVBNph)^q@1iU#n7k5|cjd_ekTf)Kl9v9v6O{=+`Kg6;U zd4~D9I!Of#t+p1b#=jd?s(dyRwI*!bFEN>3p-M_g0SzC_RMPPBYJC5pP8VM|xeM&0 zXfk0N_De+KyeiH(hooTzGeymm7cb8~aR zAdW;1x3>iV!fj>c<7!KHUtj9??{T6Om0yMh1{VebFTJd(MDm{TC@b_81r$vBkWs933gh$n5V% zG6Bh-oSMqd&D}n~Iatnq2CTeQpL6CN<<0Rey3vS{S^=(}_ZiXgK`acdG8;ry^iUpn zdofn7)yliS{(fM9-{&TK`u+SU1Z%)%J5A71{OY(zr~h#OS~;zs7ZZ6QpddkGZ{CQP z^=1z$m}q?GIJgARAn7*lGTzkLDb ziBq8nMWfI?lQP5mwS%q4O__7v_4cbe_xZX~?lRg-UEcb@lEmdI>1#}!Z}e$4^mLjM zohAgAyoA_bhU?#}oYA52;!73P5nM#Cm*6^~>%I>&&T4o2Ho@R+LBFdb!0z}pz5}^Y zysT2cWVg$=7UJPK%S$$_s;UC^PBu{rHDjKJV}61Kx5Wi=U}dAr*iRK~3FIAu3`k3u zBy}+OxD%Bfja1+$B&RuA8GvzsZF%(>wzSmhON!kYZ&=RG%8CydFGG6(Q`ote|0>u7 z*nj|2oyTAUuz3J!)arB2)aPtdtIL+`85`A!3GlVR8nYz>)~NiObZ)=xbDwl2X;9qY zW^d!0sA51hfYLL7j(RnsP%BvU3=PYs5t}ZJrKS6a1=$R2Y!*6GLqiJNk|I={I6t~)t{QyTHom($&Uqh=)2Ra2-xt~0H>>YaJ0I+i?33r_p<_ycqjb3$ zXe3(>`0VbKkf8G?roq`xII{1HCEtTgzxi=?9mQ21IDC> zfe*I>B;R_KCZM+kgm~p2GmSi1rU7~Pkzbf2#5gTI-Lc`**LH{`;CdYq%4kjA5{&5D z3Z0%8yljvmcEw;f$V3RPvLXUanrxPv?%UOLV6oI`B9cvKLlgLu1j-o6k8z$px38w$ zuW10oaH3FMM@NU3m$x%PwbQc)5)$(M{rjR1OeeS2GEfVG(y}sHIid7#-_%r90Y0MB zISrguQCEin0)<6I;cb~WbP>IZ@=xHu^~yii%Z9QmkDmc#b~2lR9LRgOumIr18Spk7 z>iSamHwo0m7cSZzTH5Wkkb!j=-w?>S?Q-$d!;^_R+ z(rCE%4+RSw8=D2Ootu+1WSnlngUctV+)95V6aJorPf!732AI&KdSW42mV`COw>5dVkzdo9V|%y`Uv!oMESp!NKXNK8wjudTlpVV`sV}xQPuyb z(*JMUYd1;*DIRgGduQYW@tkfBG~H)NE3F@Orap2wkxHxL>8@u5znYRrFJp-KCYL9p z1wl(MpnSazx(pyIZK11K#auxE2NbtKtN|*pyt_sJ$MI2 zPzSI?SG=hIugS!JlLlZQuugu<{TrK(n$b$txO-&rldHi@`_>OIl=7O42RFaH93#5= z<@$7Ijns_jr~rD^SPx{RPi=(QDM$xteD?)}nMRX%BG$VkFoAyFJVxKg+sRY7d@Eok zh|wj;Sg&tyf3*K%3)m=F6@Q*P_01_idirNfyOI!y?{s2;K}1;7%NLEZ@>68#L_%Zw z1U#qnlU4w4jpT;iX|PfoJuDR762yBtf4(koTr4WQ9I37fsn8Ku*nQj>0B7}m-Hwb6 zXj=)#envxMN|9bqEoi#9_e)mXtP+AXTwX4XetX%mG3h8G#=?{xxCar8#K2#!BRN`{ z0>Zy<+rPB&42bY#BYW=M#_}1KaM6*(b#|)JLLY?I5V+zQr&CG0pXeXYd$J!>_Y&@| zL!pC>4(0V}+D+MS{FX3D`0kE$m-ERETWaY-Tl_nr1+~DqAKbR7A<(e(GIg=*lKpk% zWD)*d-&=Bj>Ko}kv`7TP1Z>bonObi?TTbRo;eTooMI;46IYiuL_OlcG4v3U1nf zxG}z0^nSCF>0mCeVJ-nxD>1GsXQ(MVIone|!TmB)acu`Nns^{}f#H$cSQrf5KRC2! z1qS?_4g~x0U+fqh8tyzK<>WuUvo>6MU)~f0eHWremw9 z_6D$Ru9)<)PA@kkBrolcUxgPqt!EMn-$}RnB7RIs_etN*hUv<)lPxvhvv6N^Rc7!| zEuO?PIGv2g-HQ2KYFxXjBR7N<~`=29FpU35on=!uyXni(F0M_=s}5 z{Ep+aC#WvoA`0`eCRZ;4wy)hJ8%SMm`3^NqE*88VzofS>XciigzM&^A zqB6ZlhH6w3h^(DlK8}Yu${QXZ>l}KsW7O;h+*b(dJ+$bYb$3=~c>3@Ov6TiKhTTV& zqiL)kO8pCX80UB!orPlh z)13D)*&P>x`pytGQ$oRodxoK zg==4-k?-^`??tQ;vma_#!S%!6+aSoq{On5FoN&AhdV=qvxN4Eag1Ex5f2d5?e6%^H z%YV3=U3OH@Chk+aPXFwnk%kBk2yyWTRB7CGcODy3gU@yl;<^SCm%%S+42U}GGxV-A zaoJoAiA>a+4-uK=R|>x72?fs|bDpe-y`_D6fLeC4;BDVVgevamIigZsVy_3AI!&lL z9J6C&Q+WG?kbn-`ZmQN(D;79%bKFRk4yP` zZzGxr!|uNL3vrd>5kc~H%k|4DFb~WnTqo%@%SEQvgfAMWx7s*brRT#lwaCiX9Q>pF zy7ExZMd@L_z6UCBl1uFqMMje3Lsn1Hi?ilyc0~+RwlV|f3K?Y(6B6iG z(sFh?58-j1NoaIzx!=tZI}e?{*ZoKdDHd!DFip}~;6{BspE{Lb<>Eh7uwO+PH9s^= z|1)Mf#(a3UY#V!NC)muHm5@i~=bsxaDD@Hy(uz-=R%r1;dUvy(cRv znFt7?k3B0Bb1rIkLIe@s_C~#O=hI@!EMqKf zK%?fF3RBNxQ)iY3M+SOD?G}!ZcA~4En3IzVw=2?OGaKZ*d>Iz;YOs9JFF~q1D!5!! zaHg;KgY^ON(sU#%YtfcNYZ)KHtV+!7t{bE*%uG@*mJ^E1=y0(mDaJ_?w2zNd*a-i5 z9K^z%|D$Y6Tb5e5e)0K8}4?(IR0ME`L}zb>!oSwH&^U`ey=Kl+SWiMN?oIj2u{H7oEqX zeb}*>h#fO?YdDcufSC%SCvw`1$6%^I_rlPWBKoARzRClG_(40(e(88aPHA@sK9`nh z1j8<4Dt|l1Ki5W8{xgw2>)~7n-q&(r9rfysT-sG^1Uyl{097>O$tzsDrCq0-~zvlyvS| zJ>fe1DBcw_*h3?_m^#j`C4ek$EPKqFh;Q%lgq+TxFYD;Y;=Q@^ckkljq45HUm!+mfYQ(AU**I(5@5+Xx zunl@PPaA3RCwbi`H))0PGgr3|F6fCGC8i~=S_O%}M~7t-oV!dd?b1o#^rpf0N)&#T zY=zNE#MNb^_P@x(pR9G)$jf`_%KwZi%2qq@Hj~f)S|cK}JUKQ{1=G_N3^FI4X}df= z7Y{I8LBRL-NoK~U4HZCfURT~Vv|E!deCCalY#r)Pf1%Q&>YBXq_Ks%r7tQmVA07!# zp5?V4nfx#%V_<3*og7|WEUNCBa|!;@(BRJczF%K-&z-P1#rra1Y~W(gKJ#HYrVMr9 zC)|g}xqI~WR|GQ?x>C?$Ua!Z|S=F48W>&#o%RQ-QKD<`yc4O04bnQl%-!I+Z7i#rT zKU{>uxx?|@U-ROTSFWU{s!e#|U8QMJ(kR3bFz#%oL;Hbs@)#v=gvfhX- zpu2fbE>HgOEq4S~1{Qd+pY0kN5X8TP(TCeKk72#LWRcH-N1=bBUd8jvi2d;ECmBSN zy8Pwhr0i#{Z|y@oTiydB@?18(r-?SSz;5_w@AC zOxKO%ptg&Yn@)j1T65y7ZCgjl4YSP+c>40iegNVMZh>B5nVS(%rUyhd3+3haTl!L) zsz>z3QFkR96Jr9F=4iV<79VgDye@V-EOPVm49eV4F+Qk5ROEbXWz7wZ_2Bv5ithq~_4j{fheFgDoJ)0rER;Xn{r*frz zG~5(qbK*RI=4TTow;k`7$2*r|7>A)nhylyI;5;&Z!-P^MmR;iG9t}dgy7^!B)@3ZB z2828gy$v&AOQOxB-8UXtyaEQM-lZJ_+yYDiokNZ45^jVen>#4R^EOPWc`>3ly-_}Q z!Gc};WpqYGYoIKJ=6lkC>X-uj6mMTf>&AjuduJb$_uf8@gvQo7}EI$%GWc;U-WXO=WQsbNOzFcWXe{j)7J?9Uck8C@_vMs5P{L}DJw&dxGrs^ysW&@$Kmz??S7bv?}O^vmZ@Okd2J6P zl#k32HR{0ro$8h*K~twZqf{-rdtP$jqO;m-++Kvs#lzWs6V0rKqGGLuryrDQSCCj+ny2XQGho+rL{%6+(19bMct_`X$7sYDnAKA zTo^Hxm6kKg&DQP~ocBeXFAjcGYy0ISwR`^Ov-? zYb#g6W6DJaMsI=F#4`An+*_ zg%0udmU)#T>!MTm;+I=2`!GXO!wXGgpK#Mj{f$t>`7W4Ny6buRT@snEa<9Za9K0Yr zq(=I2p20I%;duG5SwO7Qn67*^QDCZ13&Em3CB8m`_|FI2dyn#sOt88rlo;u(i9TmB z|J}f-k$PETSd*+F6p9v&#vAEr9&=IL^)T5UO_&|G$i;ZZia8Ro!2Qqq6iR1XeaHDj^}K_l zrGMw{ILGi%?S76`wwevtE`agv^lZgE1Z5KAvTW$g4fOThyp0cyO`(JQ;aghT3at@q z^*Aeq^_(9Xj+*X`n_k*Ix?d*`C*&FJT?sgtpF}H5Y=_BQbno_%%+vBMVJnN_ueW1? z8LGeb!<>*W?ru&Ch0sk8=4>a%Y3?`ib~MLvp=ka-Ox1{$5XZ|J?k%>K5EwDG4Vyk! zRD5P^e}A!|;T9eh#QEg-E3L-$jR*dmfW4`^Vsvl_?eq18Co2Izd5F<s;ll%Zo!v&u*&YEbz)~ zKec_Gn$nB|1xJPADT&-oR%_VWn|sfFb|n)nxVk$WOQdr}@I!gy)A}9ra)&mq z24VvA^8;@kN%dnH*V6J6P5`Vf;z_>)B zK>1Z=kzl=xybYN$NQx6DZ?5|CD}#|9=dzpi<;kEXF5S6jyqiPoS@#yrN!Iv{Hi%>e z!S+za*>w=tPop1)OB1e2t&aWwxi+Qv9bOP!9j> zclEQ0t73rX1Q?>jPsM_@?1fX}7lp=kT>b{Vg*5X@44EW*sQ-tP1c{ zse|2NPb5Nazb|$8B*+-g4^Gz=)-AmSQ6((U{K-2zt27}C4D!=R)u2R)!cf!NAlwa@ z|1vh!OvPN@YWt#<^HMIpv8A7N3|GtD;dVMz-Nq{oh@AXobUEaTE-Fh!ywBv`rT4xC z(N?>8)_q-i$H84QoxAxVRW~J4sD53*>8I)O@dkMRJhCeBx{-^Yg2dA3c6W%H)iKJ- zrj6Y0VADnkq@1YZ{nAm~^0>6jTmG=3A%L9VZ@{GeSr8kzfgMF2U&JIq=Vo&vNBFXK zFwH;c=JKK<3CIDv7~~e1#)8Gsk~I$siukhTiE-sR!RqF=^!OQ-xFmXXQtL_G z?~eMMhrf4WxRA`e&otx|2Xc|a>Cc9pNB%|6J>0xjzx*i!{7UF4PF=^R##Siz`eK6_ z@75i8UNT=5_T9{>M_bnIHSKPj(C@TTh0C`+Wa!0Eu#zs0U!`S<WC)7rZhT%Yl~n~rj#uemC_dip?6Y9t(a7vTqc>P3nXez7ERic$c9bY_z^+p{qj zb7$2=yi;|2o=(pFi$OkWg8kkpi1%soq_=3U<mS;T2e%=@x->%?0nWOKyiIr?RQ4@2q2r?pQ=%0R zyFt#at<`t~rdl^HmHi3iO8y_Qz7NP8Ply*@lxoiZ`SWucF^Y$Dqyogdfpi6&@aKw8 zK-x}^;~GGo1UT!8dFTj6ebd*-mAn^1E{v z^hy*`uG7R>&Ji^pfat#C&ie8q5JPdGs$Oi?BdbKJ+>sI5a39Z~oPU=`zqd}}IUJqQ zSeF2;?wN=A2|3K5rbY;+0Te6%E#mUhKAod3&m5!JLn68%XEA{zxA8*3=wy6+4Zu{9vjJf;WF_D00xh^> z^V~be^joyBz=>}Y@Qm9-eyFbZ@yH&mHLx}LPFa+=*LQ2oApXr36DQT1y;1BZww}3K zE?G*op?svA>CJ1k*h^?sZ1DtQ>0%DX;m4TR1;*oa7d3g|`&Zba$ppfpLIZlV)J0dL ztIL52TAkSQwta@2E%c%!>lSihJ3kA0uNB3d8#69zJB|QA0|HdH!H$Y^bpl$zq$4MZ z7pUYMWqF0y`9aOsNn2Cmo}@`sw=1V&Q_X zrUnZeU*d$H0#?`MQ+yV$Kgr+23;Pujf(c_28?cs_M8fp$zPnjL);;)nKctfbS~;~| z4=Bx}rQ;OLo*ifVCr1vVj@aLs?bCk9`bX_#ON!Eq;36zK@7T&zqQdotN>D@}7nqp# zxpp3x(3tfePBu`~mlsN6GyfD+M}Ad9*FKuOYrivRSN1;p0b_qTePUe55{`wD8{mizNX80g(9fTN{|x{9@pEAdp+b^J0N&Xyf6i zY5vCo3YBhYT~^k+^68v&q?Ih{UZu@j*g*ALy&_rk!GED--E z@wAo9SK~bGWTx_$<#U<&R1lRK8H@EPZjX=bmOqZvuCr=yU$scXB5L*r_Wa~!ZNO?4 z@6tmUSVW)RqN6ygs6em`X7jkE*$qnV*3GssM7wS=owRnVFdh;PABJeeTmY^(t=WE@ zG5$N@nrJQrtCiDw@blDfSqV~WMUCELZY>ukJ#?JJAj_5ZfPf1%u#9wX>m>A*V1x=@ z4+9HX5KYbvl!0M=R1J^yo1U;&h!o_db~t02^go6c!5rIGzp61)#5k{6hDZ$}ceX@; zpOGr0>JHpk+rZJ*oLP!10i1+Tzd7ilRjLGzoToaWYble;&6K|uUoy(-7i^`G$L6<* zs3)>!Qk)Om_$_!k>Q6>i3j2^i;wK^nnbt^}z?P8r2I8T;Scd94V>X0#^3}D4dKVkt z&%^yhMs$mcWtGKRyfXs^zEj$!V0C)+DW7=dT2=r5y)%0#>wyO^e9>+mV{wlo|l->j3Qic95mfsZs$bB7E zbNI5lromV{HW)1tpO+6q$;AGmk@>^#KXEN-B?@M8^6&tO5QtlDI@`qQG-*7)5+ym0eUPF0%)R>L;=>kP(+xzJ z)RHPao)-i!*Q_J*0>9b9Am`(X_`~NgLbg*73;)2o;|;drt}PDwMqLwJ{7g@GbO5)k zsabb(EGN`d+S*%KxuK}a#+AM{t(38d=Wx~jV*Y$U`|OB|mAQ03BiBo5StTKT+QA~{ z=013M##mD`gu{{_`B)r;@Tfr2Ho6Rvl_{z01>ULXMMw0 zqlwiGTDpV<|8B4AO?e^|VI{r@yE~r{$*cL_jMUDr0!<_zf@@IqlqOF#9ah;f8fvsI7wT&IwY`-5ah@>A z1bwRU$!#D?S{MaoHB>!7H3M-Du8txm zsiH2wTI2fl%yo9-)6fhdz@4RXW!?Hhdq)TbOU=7O6xh@@9?6np&(*7^<}_ul9v)Jr}-Ixnq+iVmgV` zaZjL?nj0J&nVNwh7jFsxYT)RT!*{EvSI@4dzTC;xLZKz6mEoySMX7++q-@^2K8*Ax z?WJsU9mV@eTt<9?3r(EP*G%IVI?j82pjH8vp*bdFS8c9vU(87qg%WouJ8VHRoJ#v2! zv6eKDyhD|c7_aNoI?z+;x`J;?CgKd)nE4U^sA$6(rV(TKE*9gY+PF-dI!{Zby^*Fr zSX8AYBCRsg0>%TR&Pva1%8~#_h-_{BgFZ*6Z-oB-)l z`%@$=0E|F@_4fG%5+#ts^7rjiRHT*PTbhD?d|b!FZ2@-$v254&i%^P$DW$tP&+-(( zY)3OgBmpMDFFlr&_YWt+$G4k_Ugso$n1z0vLmbrQR#+-S|L+QtMSs^fl?K*|QlT48+AyqNA-3i(F80NWK zrw=OHD`-@}hEoVcH(0mwWc_IHZAWw(&vwDutwY0f`b2BYg zmi43V`gI70ji5YmlDr|9bLHu1Vaxfib^7bhZ(uDvD>cAYQmMVP$VJMKBUca@3YY3? zkVIgF&DG#+d8;uy3*v04+^TtmKslhVL(T??nvo=g`S#^VLqdFKhe`=5c1mj}8)X_BS zan|#kHAjT&p{509AuMXU@tW5>w-G^^!jjABXpV#9OPHhSPa_ok#(0hyoE~qiqJy>N z2=Ujl{aM_x&<9Kr=_>w(G%)bi=Mu&|!@g)Kgq;Av;cPHRrPUsdIDhHJ*l_^az^g#y zW5W8Lid(Exm>JOQ@Uc*seF?4p%#%ZddhQMPVuwa1+G+)?N=mP}Y2n-z=Z+;hKVMCI zkKy<)3TGgf)(d>sNAIkoHTTbJ_x$or4KpK|2{uA?f04pZy&RjG71dsWf?P^;a@K?i zx-Pp5wfdpe60#%rl^Wk9?|yC-W{dAnN*Z>TdP$>sfB*eW++a`nuGopXX7+93a%1YO zf__%?vj7$}=U_w8U4%}>=xhuMh3b`gIKz}~@moZepb@aj`>`*R28EOPnl7zCBO?Va zEawzeBg-%rdlyZ@r=!F24*2~TzF>1~PTLV@ysu(|97**Av`SB147cfOGC##i%E^gS z*N0~K5M%xP)JYLTw-G}2fb&CfrMT^fjEtg#ks06Zo15Fy**S1gb~c8l%PjIY^l)>d zEV2d%2Vrh*f%7_(LvLGY!AeapTnygKQ77`Et(@eH`iF+xy}Z_@&JYM1$~xNSo$+5| zCp#4t$4~gE-h`gtH!rtz#on+_d8cB#H%|0O`81o|SX~-;6d#I2)LMPRDwt9w8R|5KqnONz}s~nGgTW43YgRYD;^3I0SqE`6mH;!$BA;T zE-qEo)j_&yM(pB>iVA%6xcV3Mu2AkYw-iwHz=Y!9-~hN3W<*Q?6VzS6$?L^OZVSU^ zP~*m?l7T%5a&lDWL7@EST2>#}5LkJW4K0C(mzx~neklF2JUPs6^TO6 zFD*fxMVPmWM-xpnBykpX-7ad6I^%uF8{}kpLr98MdmP9_LxxIKAYcfPOLrhZ5h>2hvX_F$K+Zj5=Q>CLG)|?{l?yw~K_=QMx;HFOg-_DkMTSHY-_tn| z@gH>lK4Rbm@+F-dgd)Ntp{>QT9i@4*w`DsPRlSl~6?&Lc73m8$B*u`)@l)3f^i!wNBil%GYl04Ojrfy0BawN0Lt6C0 z%A1!3Fj(6Xr_@#(xeKr)45Pi%z7>hHrMHRv>~b*vM-n~P$Qw3D+iNv60IxkTyjBwL z*IhWEhgmHdz51=(Bx$^~yt$HKa7q4YFpuMzuN=>xoW|!d8ulw#Np)o|mtE-aX{-fy+0v()(N zKq>*3bj)rk48KU+ExeI+BzEL(BDX0P2vACQfbn}ri?$h-7H6F|loJtK_ z_nXM|lel)xdiZkF`!Mt~UN6&^sF_5;5BJSUrZv774%LQg>+P;a)Vl@_vLV$pY@|0$=Q?WXaodCWA)A%IZs}Cc!UD3}w2o_=;Gu-&FF1Pw#pZ`S4;WSdtMk*TxvMa60#* zm5Vk2;`}Yt$$YPoY`s>teI^zgDOl+c@?%7$rz}PfD5AN)Ag62}Ngt}MAS83=7|b%Mje1&Vb-vQN5t8zY!^h8vGgexKR+#p#}DE>TKkQi-qr zJmBBO@PX9caoqNFz$5tJ77Apn2-s>BttWusuD+&H9Yhnrx}sNS(7gFMV4nd%RFAoX zJOIlM@QOCDOA$b!_KMFwnB0$FCVyH#{S3A%&WLjcO7Oec8rFmD)T^LOgYN}h;M% i8e|}wOUD7<^a;g;;Mnzvh7g6#S=PoHdc4f)RO0W^ozcVq diff --git a/docs/modules/opensearch/images/opensearch_overview.drawio.svg b/docs/modules/opensearch/images/opensearch_overview.drawio.svg new file mode 100644 index 0000000..90da284 --- /dev/null +++ b/docs/modules/opensearch/images/opensearch_overview.drawio.svg @@ -0,0 +1,4 @@ + + + +
Pod
<name>-nodes-<rg1>-1
Pod...
OpenSearch
Operator
OpenSearch...
StatefulSet
<name>-nodes-<rg1>
StatefulSet...
Service
<name>-nodes-<rg1>-headless
Service...
Pod
<name>-nodes-<rg1>-0
Pod...
ConfigMap
<name>-nodes-<rg1>
ConfigMap...
OpenSearchCluster
<name>
OpenSearchCluster...
create
create
read
read
Legend
Legend
Operator
Operator
Resource
Resource
Custom
Resource
Custom...
role group
<rg1>
role group...
StatefulSet
<name>-nodes-<rg2>
StatefulSet...
Service
<name>-nodes-<rg2>-headless
Service...
ConfigMap
<name>-nodes-<rg2>
ConfigMap...
Service
<name>
Service...
role
nodes
role...
references
references
role group
<rg2>
role group...
Pod
<name>-nodes-<rg2>-0
Pod...
Text is not SVG - cannot display
diff --git a/docs/modules/opensearch/images/superset-databases.png b/docs/modules/opensearch/images/superset-databases.png deleted file mode 100644 index 0c67d67bd318165b1254706bf84317534c1f289f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46205 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 - - -
Pod
<name>-node-<rg1>-1
Pod...
Superset
Operator
Superset...
StatefulSet
<name>-node-<rg1>
StatefulSet...
Service
<name>-node-<rg1>
Service...
Pod
<name>-node-<rg1>-0
Pod...
ConfigMap
<name>-node-<rg1>
ConfigMap...
SupersetCluster
<name>
SupersetCluster...
create
create
read
read
Legend
Legend
Operator
Operator
Resource
Resource
Custom
Resource
Custom...
role group
<rg1>
role group...
StatefulSet
<name>-node-<rg2>
StatefulSet...
Service
<name>-node-<rg2>
Service...
Pod
<name>-node-<rg2>-0
Pod...
ConfigMap
<name>-node-<rg2>
ConfigMap...
Service
<name>-external
Service...
role
node
role...
references
references
role group
<rg2>
role group...
Text is not SVG - cannot display
diff --git a/docs/modules/opensearch/pages/index.adoc b/docs/modules/opensearch/pages/index.adoc index 7783e02..c241e84 100644 --- a/docs/modules/opensearch/pages/index.adoc +++ b/docs/modules/opensearch/pages/index.adoc @@ -1,11 +1,11 @@ -= Stackable Operator for Apache Superset -:description: Stackable Operator for Apache Superset manages Superset clusters on Kubernetes for data exploration, SQL connections, and visualization. -:keywords: Stackable operator, Apache Superset, Kubernetes, operator, data science, data exploration -:superset: https://superset.apache.org/ += Stackable Operator for OpenSearch +:description: Stackable Operator for OpenSearch manages OpenSearch clusters on Kubernetes for data ingestion and search +:keywords: Stackable operator, OpenSearch, Kubernetes, operator, data science, data exploration, search +:opensearch: https://opensearch.org/ :crs: https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/ -:github: https://github.com/stackabletech/superset-operator/ -:crd: {crd-docs-base-url}/superset-operator/{crd-docs-version}/ -:crd-supersetcluster: {crd-docs}/superset.stackable.tech/supersetcluster/v1alpha1/ +:github: https://github.com/stackabletech/opensearch-operator/ +:crd: {crd-docs-base-url}/opensearch-operator/{crd-docs-version}/ +:crd-opensearchcluster: {crd-docs}/opensearch.stackable.tech/opensearchcluster/v1alpha1/ :feature-tracker: https://features.stackable.tech/unified [.link-bar] @@ -13,86 +13,51 @@ * {feature-tracker}[Feature Tracker {external-link-icon}^] * {crd}[CRD documentation {external-link-icon}^] -The Stackable operator for {superset}[Apache Superset] deploys and manages Superset clusters on Kubernetes. -Superset is a data exploration and visualization tool that connects to SQL-based data sources. -Store your data in Apache Druid or Trino, and manage your Druid and Trino instances with the Stackable operators for xref:druid:index.adoc[Apache Druid] or xref:trino:index.adoc[Trino]. -This operator helps you manage your Superset instances on Kubernetes efficiently. +The Stackable operator for {opensearch}[OpenSearch] deploys and manages OpenSearch clusters on Kubernetes. +OpenSearch is a powerful search and analytics engine built on Apache Lucene. +This operator helps you manage your OpenSearch instances on Kubernetes efficiently. == Getting started -Get started using Superset with Stackable operator by following the xref:getting_started/index.adoc[]. -It guides you through installing the operator alongside a PostgreSQL database, connecting to your Superset instance and analyzing some preloaded example data. +Get started using OpenSearch with the Stackable operator by following the xref:getting_started/index.adoc[]. +It guides you through installing the operator, connecting to your OpenSearch instance and analyzing some preloaded example data. == Operator model -The operator manages two {crs}[custom resources]: The _SupersetCluster_ and _DruidConnection_. -It creates a number of different Kubernetes resources based on the custom resources. +The operator manages the _OpenSearchCluster_ resource. +It creates a number of different Kubernetes resources based on this {crs}[custom resource]. === Custom resources -The SupersetCluster is the main resource for the configuration of the Superset instance. -The resource defines only one xref:concepts:roles-and-role-groups.adoc[role], the `node`. +The OpenSearchCluster is the resource for the configuration of the OpenSearch instance. +The resource defines only one xref:concepts:roles-and-role-groups.adoc[role], the `nodes`. The various configuration options are explained in the xref:usage-guide/index.adoc[]. It helps you tune your cluster to your needs by configuring xref:usage-guide/storage-resource-configuration.adoc[resource usage], xref:usage-guide/security.adoc[security], xref:usage-guide/logging.adoc[logging] and more. -DruidConnection resources link a Superset and Druid instance. -It lets you define this connection in the familiar way of deploying a resource (instead of configuring the connection via the Superset UI or API). -The operator configures the connection between Druid and the Superset instance. - === Kubernetes resources Based on the custom resources you define, the operator creates ConfigMaps, StatefulSets and Services. -image::superset_overview.drawio.svg[A diagram depicting the Kubernetes resources created by the operator] +image::opensearch_overview.drawio.svg[A diagram depicting the Kubernetes resources created by the operator] The diagram above depicts all the Kubernetes resources created by the operator, and how they relate to each other. -The Job created for the DruidConnnection resource is not shown. For every xref:concepts:roles-and-role-groups.adoc#_role_groups[role group] you define, the operator creates a StatefulSet with the amount of replicas defined in the RoleGroup. -Every Pod in the StatefulSet has two containers: the main container running Superset and a sidecar container gathering metrics for xref:operators:monitoring.adoc[]. -The operator creates a Service for the `node` role as well as a single service per role group. +For every RoleGroup, a Service is created, as well as one for the whole cluster that references the cluster manager nodes. Additionally, a ConfigMap is created for each RoleGroup. -These ConfigMaps contains two files: `log_config.py` and `superset_config.py` which contain logging and general Superset configuration respectively. - -== Required external component: Metastore SQL database - -Superset requires an SQL database in which to store its metadata, dashboards and users. -The xref:getting_started/index.adoc[] guides you through installing an example database with a Superset instance that you can use to get started, but is not suitable for production use. -Follow the setup instructions for one of the xref:required-external-components.adoc[supported databases] for a production database. - -== Connecting to data sources - -Superset does not store its own data, instead it connects to other products where data is stored. -On the Stackable Platform the two commonly used choices are xref:druid:index.adoc[Apache Druid] and xref:trino:index.adoc[Trino]. -For Druid there is a way to xref:usage-guide/connecting-druid.adoc[connect a Druid instance declaratively] with a custom resource. -For Trino this is on the roadmap. -Have a look at the demos linked <> for examples of using Superset with Druid or Trino. - -== [[demos]]Demos - -Many of the Stackable xref:demos:index.adoc[demos] use Superset in the stack for data visualization and explaration. -The demos come in two main variants. - -=== With Druid - -The xref:demos:nifi-kafka-druid-earthquake-data.adoc[] and xref:demos:nifi-kafka-druid-water-level-data.adoc[] demos -show Superset connected to xref:druid:index.adoc[Druid], exploring earthquake and water level data respectively. - -=== With Trino - -The xref:demos:spark-k8s-anomaly-detection-taxi-data.adoc[], xref:demos:trino-taxi-data.adoc[], xref:demos:trino-iceberg.adoc[] and xref:demos:data-lakehouse-iceberg-trino-spark.adoc[] demos all use a xref:trino:index.adoc[Trino] instance on top of S3 storage that hold data to analyze. Superset is connected to Trino to analyze a variety of different datasets. +These ConfigMaps contain configuration files like `opensearch.yml`. == Supported versions -The Stackable operator for Apache Superset currently supports the Superset versions listed below. -To use a specific Superset version in your SupersetCluster, you have to specify an image - this is explained in the xref:concepts:product-image-selection.adoc[] documentation. +The Stackable operator for OpenSearch currently supports the OpenSearch versions listed below. +To use a specific OpenSearch version in your OpenSearchCluster, you have to specify an image - this is explained in the xref:concepts:product-image-selection.adoc[] documentation. The operator also supports running images from a custom registry or running entirely customized images; both of these cases are explained under xref:concepts:product-image-selection.adoc[] as well. include::partial$supported-versions.adoc[] == Useful links -* The {github}[superset-operator {external-link-icon}^] GitHub repository +* The {github}[opensearch-operator {external-link-icon}^] GitHub repository * The operator feature overview in the {feature-tracker}[feature tracker {external-link-icon}^] -* The {crd-supersetcluster}[SupersetCluster {external-link-icon}^] CRD documentation +* The {crd-opensearchcluster}[OpenSearchCluster {external-link-icon}^] CRD documentation diff --git a/docs/modules/opensearch/partials/supported-versions.adoc b/docs/modules/opensearch/partials/supported-versions.adoc index 8fc31ec..4286ea8 100644 --- a/docs/modules/opensearch/partials/supported-versions.adoc +++ b/docs/modules/opensearch/partials/supported-versions.adoc @@ -1,7 +1,5 @@ -// The version ranges supported by Superset-Operator -// This is a separate file, since it is used by both the direct Superset documentation, and the overarching +// The version ranges supported by OpenSearch-Operator +// This is a separate file, since it is used by both the direct OpenSearch documentation, and the overarching // Stackable Platform documentation. -- 4.1.2 -- 4.1.1 (deprecated) -- 4.0.2 (LTS) +- 3.1.0 (LTS) diff --git a/docs/templating_vars.yaml b/docs/templating_vars.yaml index bc1c3b3..91114a9 100644 --- a/docs/templating_vars.yaml +++ b/docs/templating_vars.yaml @@ -6,4 +6,4 @@ versions: commons: 0.0.0-dev secret: 0.0.0-dev listener: 0.0.0-dev - superset: 0.0.0-dev + opensearch: 0.0.0-dev From f8c2fea345e967e98ec51d4b8e2e20ff058f6b70 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Fri, 18 Jul 2025 11:38:23 +0200 Subject: [PATCH 03/18] Run pre-commit --- deploy/helm/opensearch-operator/configs/properties.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 deploy/helm/opensearch-operator/configs/properties.yaml diff --git a/deploy/helm/opensearch-operator/configs/properties.yaml b/deploy/helm/opensearch-operator/configs/properties.yaml new file mode 100644 index 0000000..9bd8c3b --- /dev/null +++ b/deploy/helm/opensearch-operator/configs/properties.yaml @@ -0,0 +1,5 @@ +--- +version: 0.1.0 +spec: + units: [] +properties: [] From 4abaa11b04de50312959d41c1d4ea5506163d315 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Fri, 18 Jul 2025 17:20:33 +0200 Subject: [PATCH 04/18] Adapt the getting started guide --- .../getting_started/getting_started.sh | 90 +++++++-------- .../getting_started/getting_started.sh.j2 | 90 +++++++-------- .../getting_started/install_output.txt | 2 +- .../getting_started/install_output.txt.j2 | 2 +- .../opensearch-security-config.yaml | 94 +++++++++++++++ .../examples/getting_started/opensearch.yaml | 58 ++++++++++ .../getting_started/superset-credentials.yaml | 14 --- .../superset-load-examples-job.yaml | 47 -------- .../superset-load-examples-job.yaml.j2 | 47 -------- .../examples/getting_started/superset.yaml | 18 --- .../pages/getting_started/first_steps.adoc | 108 +++++++----------- .../pages/getting_started/index.adoc | 6 +- .../pages/getting_started/installation.adoc | 12 +- .../pages/required-external-components.adoc | 10 -- docs/modules/opensearch/partials/nav.adoc | 44 ++++--- 15 files changed, 314 insertions(+), 328 deletions(-) create mode 100644 docs/modules/opensearch/examples/getting_started/opensearch-security-config.yaml create mode 100644 docs/modules/opensearch/examples/getting_started/opensearch.yaml delete mode 100644 docs/modules/opensearch/examples/getting_started/superset-credentials.yaml delete mode 100644 docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml delete mode 100644 docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml.j2 delete mode 100644 docs/modules/opensearch/examples/getting_started/superset.yaml delete mode 100644 docs/modules/opensearch/pages/required-external-components.adoc diff --git a/docs/modules/opensearch/examples/getting_started/getting_started.sh b/docs/modules/opensearch/examples/getting_started/getting_started.sh index 5e5bad0..bbba1b7 100755 --- a/docs/modules/opensearch/examples/getting_started/getting_started.sh +++ b/docs/modules/opensearch/examples/getting_started/getting_started.sh @@ -10,8 +10,8 @@ set -euo pipefail # This script contains all the code snippets from the guide, as well as some assert tests # to test if the instructions in the guide work. The user *could* use it, but it is intended # for testing only. -# The script will install the operators, create a superset instance and briefly open a port -# forward and connect to the superset instance to make sure it is up and running. +# The script will install the operators, create a OpenSearch instance and briefly open a port +# forward and connect to the OpenSearch instance to make sure it is up and running. # No running processes are left behind (i.e. the port-forwarding is closed at the end) if [ $# -eq 0 ] @@ -29,7 +29,7 @@ echo "Installing Operators with Helm" helm install --wait commons-operator oci://oci.stackable.tech/sdp-charts/commons-operator --version 0.0.0-dev helm install --wait secret-operator oci://oci.stackable.tech/sdp-charts/secret-operator --version 0.0.0-dev helm install --wait listener-operator oci://oci.stackable.tech/sdp-charts/listener-operator --version 0.0.0-dev -helm install --wait superset-operator oci://oci.stackable.tech/sdp-charts/superset-operator --version 0.0.0-dev +helm install --wait opensearch-operator oci://oci.stackable.tech/sdp-charts/opensearch-operator --version 0.0.0-dev # end::helm-install-operators[] ;; "stackablectl") @@ -39,7 +39,7 @@ stackablectl operator install \ commons=0.0.0-dev \ secret=0.0.0-dev \ listener=0.0.0-dev \ - superset=0.0.0-dev + opensearch=0.0.0-dev # end::stackablectl-install-operators[] ;; *) @@ -48,67 +48,65 @@ exit 1 ;; esac -echo "Installing bitnami PostgreSQL" -# tag::install-bitnami-psql[] -helm install superset oci://registry-1.docker.io/bitnamicharts/postgresql \ - --version 16.5.0 \ - --set auth.username=superset \ - --set auth.password=superset \ - --set auth.database=superset \ - --wait -# end::install-bitnami-psql[] - -echo "Creating credentials secret" -# tag::apply-superset-credentials[] -kubectl apply -f superset-credentials.yaml -# end::apply-superset-credentials[] - -echo "Creating Superset cluster" -# tag::apply-superset-cluster[] -kubectl apply -f superset.yaml -# end::apply-superset-cluster[] +echo "Creating OpenSearch security plugin configuration" +# tag::apply-security-config[] +kubectl apply -f opensearch-security-config.yaml +# end::apply-security-config[] + +echo "Creating OpenSearch cluster" +# tag::apply-cluster[] +kubectl apply -f opensearch.yaml +# end::apply-cluster[] sleep 5 for (( i=1; i<=15; i++ )) do - echo "Waiting for SupersetCluster to appear ..." - if eval kubectl get statefulset simple-superset-node-default; then + echo "Waiting for OpenSearchCluster to appear ..." + if eval kubectl get statefulset simple-opensearch-nodes-default; then break fi sleep 1 done -echo "Waiting on superset StatefulSet ..." -# tag::wait-superset[] -kubectl rollout status --watch statefulset/simple-superset-node-default --timeout 300s -# end::wait-superset[] +echo "Waiting on OpenSearch StatefulSet ..." +# tag::await-cluster[] +kubectl rollout status --watch statefulset/simple-opensearch-nodes-default --timeout 300s +# end::await-cluster[] # wait a bit for the port to open sleep 10 -echo "Starting port-forwarding of port 8088" +echo "Starting port-forwarding of port 9200" # tag::port-forwarding[] -kubectl port-forward service/simple-superset-node 8088 > /dev/null 2>&1 & +kubectl port-forward services/simple-opensearch 9200 > /dev/null 2>&1 & # end::port-forwarding[] PORT_FORWARD_PID=$! # shellcheck disable=2064 # we want the PID evaluated now, not at the time the trap is trap "kill $PORT_FORWARD_PID" EXIT sleep 5 -echo "Checking if web interface is reachable ..." -return_code=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8088/login/) -if [ "$return_code" == 200 ]; then - echo "Web interface reachable!" -else - echo "Could not reach web interface." - exit 1 -fi - -echo "Loading examples ..." -# tag::load-examples[] -kubectl apply -f superset-load-examples-job.yaml -sleep 5 -kubectl wait --for=condition=complete --timeout=1500s job/superset-load-examples -# end::load-examples[] +echo "Using the REST API" +# tag::rest-api[] +export CREDENTIALS=admin:AJVFsGJBbpT6mChn + +curl \ + --insecure \ + --user $CREDENTIALS \ + --request PUT \ + --json '{"name": "Stackable"}' \ + https://localhost:9200/sample_index/_doc/1 + +# Output: +# {"_index":"sample_index","_id":"1","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1} + +curl \ + --insecure \ + --user $CREDENTIALS \ + --request GET \ + https://localhost:9200/sample_index/_doc/1 + +# Output: +# {"_index":"sample_index","_id":"1","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"name": "Stackable"}} +# end::rest-api[] diff --git a/docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 b/docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 index 513d705..332bebc 100755 --- a/docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 +++ b/docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 @@ -10,8 +10,8 @@ set -euo pipefail # This script contains all the code snippets from the guide, as well as some assert tests # to test if the instructions in the guide work. The user *could* use it, but it is intended # for testing only. -# The script will install the operators, create a superset instance and briefly open a port -# forward and connect to the superset instance to make sure it is up and running. +# The script will install the operators, create a OpenSearch instance and briefly open a port +# forward and connect to the OpenSearch instance to make sure it is up and running. # No running processes are left behind (i.e. the port-forwarding is closed at the end) if [ $# -eq 0 ] @@ -29,7 +29,7 @@ echo "Installing Operators with Helm" helm install --wait commons-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/commons-operator --version {{ versions.commons }} helm install --wait secret-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/secret-operator --version {{ versions.secret }} helm install --wait listener-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/listener-operator --version {{ versions.listener }} -helm install --wait superset-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/superset-operator --version {{ versions.superset }} +helm install --wait opensearch-operator oci://{{ helm.repo_url }}/{{ helm.repo_name }}/opensearch-operator --version {{ versions.opensearch }} # end::helm-install-operators[] ;; "stackablectl") @@ -39,7 +39,7 @@ stackablectl operator install \ commons={{ versions.commons }} \ secret={{ versions.secret }} \ listener={{ versions.listener }} \ - superset={{ versions.superset }} + opensearch={{ versions.opensearch }} # end::stackablectl-install-operators[] ;; *) @@ -48,67 +48,65 @@ exit 1 ;; esac -echo "Installing bitnami PostgreSQL" -# tag::install-bitnami-psql[] -helm install superset oci://registry-1.docker.io/bitnamicharts/postgresql \ - --version 16.5.0 \ - --set auth.username=superset \ - --set auth.password=superset \ - --set auth.database=superset \ - --wait -# end::install-bitnami-psql[] - -echo "Creating credentials secret" -# tag::apply-superset-credentials[] -kubectl apply -f superset-credentials.yaml -# end::apply-superset-credentials[] - -echo "Creating Superset cluster" -# tag::apply-superset-cluster[] -kubectl apply -f superset.yaml -# end::apply-superset-cluster[] +echo "Creating OpenSearch security plugin configuration" +# tag::apply-security-config[] +kubectl apply -f opensearch-security-config.yaml +# end::apply-security-config[] + +echo "Creating OpenSearch cluster" +# tag::apply-cluster[] +kubectl apply -f opensearch.yaml +# end::apply-cluster[] sleep 5 for (( i=1; i<=15; i++ )) do - echo "Waiting for SupersetCluster to appear ..." - if eval kubectl get statefulset simple-superset-node-default; then + echo "Waiting for OpenSearchCluster to appear ..." + if eval kubectl get statefulset simple-opensearch-nodes-default; then break fi sleep 1 done -echo "Waiting on superset StatefulSet ..." -# tag::wait-superset[] -kubectl rollout status --watch statefulset/simple-superset-node-default --timeout 300s -# end::wait-superset[] +echo "Waiting on OpenSearch StatefulSet ..." +# tag::await-cluster[] +kubectl rollout status --watch statefulset/simple-opensearch-nodes-default --timeout 300s +# end::await-cluster[] # wait a bit for the port to open sleep 10 -echo "Starting port-forwarding of port 8088" +echo "Starting port-forwarding of port 9200" # tag::port-forwarding[] -kubectl port-forward service/simple-superset-node 8088 > /dev/null 2>&1 & +kubectl port-forward services/simple-opensearch 9200 > /dev/null 2>&1 & # end::port-forwarding[] PORT_FORWARD_PID=$! # shellcheck disable=2064 # we want the PID evaluated now, not at the time the trap is trap "kill $PORT_FORWARD_PID" EXIT sleep 5 -echo "Checking if web interface is reachable ..." -return_code=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8088/login/) -if [ "$return_code" == 200 ]; then - echo "Web interface reachable!" -else - echo "Could not reach web interface." - exit 1 -fi - -echo "Loading examples ..." -# tag::load-examples[] -kubectl apply -f superset-load-examples-job.yaml -sleep 5 -kubectl wait --for=condition=complete --timeout=1500s job/superset-load-examples -# end::load-examples[] +echo "Using the REST API" +# tag::rest-api[] +export CREDENTIALS=admin:AJVFsGJBbpT6mChn + +curl \ + --insecure \ + --user $CREDENTIALS \ + --request PUT \ + --json '{"name": "Stackable"}' \ + https://localhost:9200/sample_index/_doc/1 + +# Output: +# {"_index":"sample_index","_id":"1","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1} + +curl \ + --insecure \ + --user $CREDENTIALS \ + --request GET \ + https://localhost:9200/sample_index/_doc/1 + +# Output: +# {"_index":"sample_index","_id":"1","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"name": "Stackable"}} +# end::rest-api[] diff --git a/docs/modules/opensearch/examples/getting_started/install_output.txt b/docs/modules/opensearch/examples/getting_started/install_output.txt index 9e8201d..52cd670 100644 --- a/docs/modules/opensearch/examples/getting_started/install_output.txt +++ b/docs/modules/opensearch/examples/getting_started/install_output.txt @@ -1,4 +1,4 @@ Installed commons=0.0.0-dev operator Installed secret=0.0.0-dev operator Installed listener=0.0.0-dev operator -Installed superset=0.0.0-dev operator +Installed opensearch=0.0.0-dev operator diff --git a/docs/modules/opensearch/examples/getting_started/install_output.txt.j2 b/docs/modules/opensearch/examples/getting_started/install_output.txt.j2 index 52b0408..0ad2d93 100644 --- a/docs/modules/opensearch/examples/getting_started/install_output.txt.j2 +++ b/docs/modules/opensearch/examples/getting_started/install_output.txt.j2 @@ -1,4 +1,4 @@ Installed commons={{ versions.commons }} operator Installed secret={{ versions.secret }} operator Installed listener={{ versions.listener }} operator -Installed superset={{ versions.superset }} operator +Installed opensearch={{ versions.opensearch }} operator diff --git a/docs/modules/opensearch/examples/getting_started/opensearch-security-config.yaml b/docs/modules/opensearch/examples/getting_started/opensearch-security-config.yaml new file mode 100644 index 0000000..116ea90 --- /dev/null +++ b/docs/modules/opensearch/examples/getting_started/opensearch-security-config.yaml @@ -0,0 +1,94 @@ +--- +apiVersion: v1 +kind: Secret +metadata: + name: opensearch-security-config +stringData: + action_groups.yml: | + --- + _meta: + type: actiongroups + config_version: 2 + allowlist.yml: | + --- + _meta: + type: allowlist + config_version: 2 + + config: + enabled: false + audit.yml: | + --- + _meta: + type: audit + config_version: 2 + + config: + enabled: false + config.yml: | + --- + _meta: + type: config + config_version: 2 + + config: + dynamic: + authc: + basic_internal_auth_domain: + description: Authenticate via HTTP Basic against internal users database + http_enabled: true + transport_enabled: true + order: 1 + http_authenticator: + type: basic + challenge: true + authentication_backend: + type: intern + authz: {} + internal_users.yml: | + --- + _meta: + type: internalusers + config_version: 2 + + admin: + hash: $2y$10$xRtHZFJ9QhG9GcYhRpAGpufCZYsk//nxsuel5URh0GWEBgmiI4Q/e + reserved: true + backend_roles: + - admin + description: OpenSearch admin user + + kibanaserver: + hash: $2y$10$vPgQ/6ilKDM5utawBqxoR.7euhVQ0qeGl8mPTeKhmFT475WUDrfQS + reserved: true + description: OpenSearch Dashboards user + nodes_dn.yml: | + --- + _meta: + type: nodesdn + config_version: 2 + roles.yml: | + --- + _meta: + type: roles + config_version: 2 + roles_mapping.yml: | + --- + _meta: + type: rolesmapping + config_version: 2 + + all_access: + reserved: false + backend_roles: + - admin + + kibana_server: + reserved: true + users: + - kibanaserver + tenants.yml: | + --- + _meta: + type: tenants + config_version: 2 diff --git a/docs/modules/opensearch/examples/getting_started/opensearch.yaml b/docs/modules/opensearch/examples/getting_started/opensearch.yaml new file mode 100644 index 0000000..24c44f6 --- /dev/null +++ b/docs/modules/opensearch/examples/getting_started/opensearch.yaml @@ -0,0 +1,58 @@ +--- +apiVersion: opensearch.stackable.tech/v1alpha1 +kind: OpenSearchCluster +metadata: + name: simple-opensearch +spec: + image: + custom: opensearchproject/opensearch:3.1.0 + productVersion: 3.1.0 + nodes: + roleGroups: + default: + replicas: 3 + envOverrides: + DISABLE_INSTALL_DEMO_CONFIG: "true" + configOverrides: + opensearch.yml: + plugins.security.allow_default_init_securityindex: "true" + plugins.security.restapi.roles_enabled: all_access + plugins.security.ssl.transport.enabled: "true" + plugins.security.ssl.transport.pemcert_filepath: /usr/share/opensearch/config/tls/tls.crt + plugins.security.ssl.transport.pemkey_filepath: /usr/share/opensearch/config/tls/tls.key + plugins.security.ssl.transport.pemtrustedcas_filepath: /usr/share/opensearch/config/tls/ca.crt + plugins.security.ssl.http.enabled: "true" + plugins.security.ssl.http.pemcert_filepath: /usr/share/opensearch/config/tls/tls.crt + plugins.security.ssl.http.pemkey_filepath: /usr/share/opensearch/config/tls/tls.key + plugins.security.ssl.http.pemtrustedcas_filepath: /usr/share/opensearch/config/tls/ca.crt + podOverrides: + spec: + containers: + - name: opensearch + volumeMounts: + - name: security-config + mountPath: /usr/share/opensearch/config/opensearch-security + readOnly: true + - name: tls + mountPath: /usr/share/opensearch/config/tls + readOnly: true + securityContext: + fsGroup: 1000 + volumes: + - name: security-config + secret: + secretName: opensearch-security-config + - name: tls + ephemeral: + volumeClaimTemplate: + metadata: + annotations: + secrets.stackable.tech/class: tls + secrets.stackable.tech/scope: node,pod,service=simple-opensearch,service=simple-opensearch-nodes-default + spec: + storageClassName: secrets.stackable.tech + accessModes: + - ReadWriteOnce + resources: + requests: + storage: "1" diff --git a/docs/modules/opensearch/examples/getting_started/superset-credentials.yaml b/docs/modules/opensearch/examples/getting_started/superset-credentials.yaml deleted file mode 100644 index c7788b3..0000000 --- a/docs/modules/opensearch/examples/getting_started/superset-credentials.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: simple-superset-credentials -type: Opaque -stringData: - adminUser.username: admin - adminUser.firstname: Superset - adminUser.lastname: Admin - adminUser.email: admin@superset.com - adminUser.password: admin - connections.secretKey: thisISaSECRET_1234 - connections.sqlalchemyDatabaseUri: postgresql://superset:superset@superset-postgresql.default.svc.cluster.local/superset diff --git a/docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml b/docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml deleted file mode 100644 index a3e4743..0000000 --- a/docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml +++ /dev/null @@ -1,47 +0,0 @@ ---- -apiVersion: batch/v1 -kind: Job -metadata: - name: superset-load-examples -spec: - template: - spec: - volumes: - - configMap: - defaultMode: 420 - name: simple-superset-node-default - name: config - containers: - - name: superset - image: oci.stackable.tech/sdp/superset:4.1.2-stackable0.0.0-dev - command: [ - "/bin/sh", - "-c", - "mkdir --parents /stackable/app/pythonpath && \ - cp /stackable/config/* /stackable/app/pythonpath && \ - echo 'SQLALCHEMY_EXAMPLES_URI = os.environ.get(\"SQLALCHEMY_DATABASE_URI\")' >> /stackable/app/pythonpath/superset_config.py && \ - superset load_examples" - ] - env: - - name: SECRET_KEY - valueFrom: - secretKeyRef: - key: connections.secretKey - name: simple-superset-credentials - - name: SQLALCHEMY_DATABASE_URI - valueFrom: - secretKeyRef: - key: connections.sqlalchemyDatabaseUri - name: simple-superset-credentials - volumeMounts: - - mountPath: /stackable/config - name: config - resources: - limits: - cpu: 1200m - memory: 1000Mi - requests: - cpu: 300m - memory: 1000Mi - restartPolicy: Never - backoffLimit: 4 diff --git a/docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml.j2 b/docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml.j2 deleted file mode 100644 index 966956a..0000000 --- a/docs/modules/opensearch/examples/getting_started/superset-load-examples-job.yaml.j2 +++ /dev/null @@ -1,47 +0,0 @@ ---- -apiVersion: batch/v1 -kind: Job -metadata: - name: superset-load-examples -spec: - template: - spec: - volumes: - - configMap: - defaultMode: 420 - name: simple-superset-node-default - name: config - containers: - - name: superset - image: oci.stackable.tech/sdp/superset:4.1.2-stackable{{ versions.superset }} - command: [ - "/bin/sh", - "-c", - "mkdir --parents /stackable/app/pythonpath && \ - cp /stackable/config/* /stackable/app/pythonpath && \ - echo 'SQLALCHEMY_EXAMPLES_URI = os.environ.get(\"SQLALCHEMY_DATABASE_URI\")' >> /stackable/app/pythonpath/superset_config.py && \ - superset load_examples" - ] - env: - - name: SECRET_KEY - valueFrom: - secretKeyRef: - key: connections.secretKey - name: simple-superset-credentials - - name: SQLALCHEMY_DATABASE_URI - valueFrom: - secretKeyRef: - key: connections.sqlalchemyDatabaseUri - name: simple-superset-credentials - volumeMounts: - - mountPath: /stackable/config - name: config - resources: - limits: - cpu: 1200m - memory: 1000Mi - requests: - cpu: 300m - memory: 1000Mi - restartPolicy: Never - backoffLimit: 4 diff --git a/docs/modules/opensearch/examples/getting_started/superset.yaml b/docs/modules/opensearch/examples/getting_started/superset.yaml deleted file mode 100644 index 346121b..0000000 --- a/docs/modules/opensearch/examples/getting_started/superset.yaml +++ /dev/null @@ -1,18 +0,0 @@ ---- -apiVersion: superset.stackable.tech/v1alpha1 -kind: SupersetCluster -metadata: - name: simple-superset -spec: - image: - productVersion: 4.1.2 - clusterConfig: - credentialsSecret: simple-superset-credentials - nodes: - roleConfig: - listenerClass: external-unstable - roleGroups: - default: - config: - rowLimit: 10000 - webserverTimeout: 300 diff --git a/docs/modules/opensearch/pages/getting_started/first_steps.adoc b/docs/modules/opensearch/pages/getting_started/first_steps.adoc index e23a3b1..b10ed7b 100644 --- a/docs/modules/opensearch/pages/getting_started/first_steps.adoc +++ b/docs/modules/opensearch/pages/getting_started/first_steps.adoc @@ -1,107 +1,83 @@ = First steps -Once you have followed the steps in xref:getting_started/installation.adoc[] for the Operator and its dependencies, you will now go through the steps to set up and connect to a Superset instance. +Once you have followed the steps in xref:getting_started/installation.adoc[] for the Operator and its dependencies, you will now go through the steps to set up and connect to a OpenSearch instance. -== Database for the Superset metadata +== Security plugin configuration -Superset metadata (slices, connections, tables, dashboards etc.) is stored in an SQL database. - -For testing, you can set up a PostgreSQL database with these commands: - -[source,bash] -include::example$getting_started/getting_started.sh[tag=install-bitnami-psql] - -WARNING: This setup is not suitable for use in production. -Refer to the xref:required-external-components[supported databases] for production-ready database setup instructions. - -== Secret with Superset credentials - -You need to create a secret with the required credentials (database connection credentials and an admin account for Superset). -Create a file called `superset-credentials.yaml`: +The configuration for the OpenSearch security plugin must be provided in a separate resource, e.g. a Secret: [source,yaml] -include::example$getting_started/superset-credentials.yaml[] +---- +include::example$getting_started/opensearch-security-config.yaml[] +---- Apply the Secret: [source,bash] -include::example$getting_started/getting_started.sh[tag=apply-superset-credentials] - -The `connections.secretKey` will be used for securely signing the session cookies and can be used by the extensions for any other security-related needs. -It should be a long, random string. +---- +include::example$getting_started/getting_started.sh[tag=apply-security-config] +---- -`connections.sqlalchemyDatabaseUri` must contain the connection string to the SQL database storing the Superset metadata. +The passwords in `internal_users.yml` are hashes using the bcrypt algorithm. +Such a hash can be e.g. generated with `htpasswd`: -The `adminUser` fields are used to create an admin user. -If using non-default authentication (e.g., LDAP), the admin user is disabled. +[source,bash] +---- +$ htpasswd -nbBC 10 admin AJVFsGJBbpT6mChnq +admin:$2y$10$xRtHZFJ9QhG9GcYhRpAGpufCZYsk//nxsuel5URh0GWEBgmiI4Q/e +---- -== Creation of a Superset node +== Creation of OpenSearch nodes -A Superset node must be created as a custom resource, create a file called `superset.yaml`: +OpenSearch nodes must be created as a custom resource; Create a file called `opensearch.yaml`: [source,yaml] -include::example$getting_started/superset.yaml[] +---- +include::example$getting_started/opensearch.yaml[] +---- And apply it: [source,bash] -include::example$getting_started/getting_started.sh[tag=apply-superset-cluster] - +---- +include::example$getting_started/getting_started.sh[tag=apply-cluster] +---- `metadata.name` contains the name of the Superset cluster. -The previously created secret must be referenced in `spec.clusterConfig.credentialsSecret`. - -The `rowLimit` configuration option defines the row limit when requesting chart data. +The previously created security plugin configuration must be referenced via `podOverrides`. -The `webserverTimeout` configuration option defines the maximum number of seconds a Superset request can take before timing out. -These settings affect the maximum duration a query to an underlying datasource can take. -If you get timeout errors before your query returns the result you may need to increase this timeout. - -You need to wait for the Superset node to finish deploying. You can do so with this command: +You need to wait for the OpenSearch nodes to finish deploying. +You can do so with this command: [source,bash] -include::example$getting_started/getting_started.sh[tag=wait-superset] +---- +include::example$getting_started/getting_started.sh[tag=await-cluster] +---- -== Connecting to the web interface +== Connecting to the HTTP endpoint -Once the Superset node is created and the database is initialized, you can open Superset in your browser. +Once the OpenSearch nodes are created, you can use the REST API of OpenSearch. -To forward the Superset port (`8088`) to localhost, run: +To forward the HTTP port (`9200`) to localhost, run: [source,bash] +---- include::example$getting_started/getting_started.sh[tag=port-forwarding] +---- -Then, open `http://localhost:8088` in your browser and log in with the admin credentials from the Kubernetes secret. - -image::getting_started/superset-login.png[Login screen of Superset] - -Superset is now ready for use. -If you want to load sample data and dashboards and explore Superset's functionality, proceed to the next step. +== Using the REST API -== Loading examples and accessing example dashboards - -To have some data to play with and some dashboards to explore, Superset comes with some example data that you can load. -To do so, create a file `superset-load-examples-job.yaml` with this content: +You can use the REST API as follows: [source,bash] -include::example$getting_started/superset-load-examples-job.yaml[] - -This Kubernetes Job uses the same connection information and credentials as the Superset instance to load the example data. -Run the Job and wait for it to finish with the following command: - -[source,bash] -include::example$getting_started/getting_started.sh[tag=load-examples] - -The Job will take a few minutes to terminate. -Afterwards, check back again on the web interface. -New dashboards should be available: - -image::getting_started/superset-dashboard.png[Superset dashboard showing birth names] +---- +include::example$getting_started/getting_started.sh[tag=rest-api] +---- Great! -Now you can explore this sample data, run queries on it or create your own dashboards. +Now you can create your own indexes, populate them with data and search for it. == What's next -Check the xref:usage-guide/index.adoc[] to find out more about configuring your Superset instance or have a look at the Superset documentation to https://superset.apache.org/docs/creating-charts-dashboards/creating-your-first-dashboard[create your first dashboard]. +Check the xref:usage-guide/index.adoc[] to find out more about configuring your OpenSearch instance or have a look at the OpenSearch documentation to https://docs.opensearch.org/docs/latest/getting-started/[ingest, search or visualize your data with OpenSearch Dashboards]. diff --git a/docs/modules/opensearch/pages/getting_started/index.adoc b/docs/modules/opensearch/pages/getting_started/index.adoc index 28314e8..d2807bc 100644 --- a/docs/modules/opensearch/pages/getting_started/index.adoc +++ b/docs/modules/opensearch/pages/getting_started/index.adoc @@ -1,7 +1,7 @@ = Getting started -This guide helps you get started with Superset using the Stackable Operator. -It covers the installation of the Operator and its dependencies, setting up your first Superset instance, connecting to it, and exploring sample data. +This guide helps you get started with OpenSearch using the Stackable Operator. +It covers the installation of the operator and its dependencies, setting up your first OpenSearch instance, connecting to it, and exploring sample data. == Prerequisites @@ -21,4 +21,4 @@ Resource sizing depends on cluster type(s), usage and scope, but as a starting p The guide is divided into two steps: * xref:getting_started/installation.adoc[Installing the Operators]. -* xref:getting_started/first_steps.adoc[Setting up the Superset instance and connecting to it]. +* xref:getting_started/first_steps.adoc[Setting up the OpenSearch instance and connecting to it]. diff --git a/docs/modules/opensearch/pages/getting_started/installation.adoc b/docs/modules/opensearch/pages/getting_started/installation.adoc index b9a30aa..48131a3 100644 --- a/docs/modules/opensearch/pages/getting_started/installation.adoc +++ b/docs/modules/opensearch/pages/getting_started/installation.adoc @@ -1,10 +1,10 @@ = Installation -On this page you will install the Stackable Superset Operator as well as the commons, secret and listener operators which are required by all Stackable Operators. +On this page you will install the Stackable OpenSearch Operator as well as the commons, secret and listener operators which are required by all Stackable Operators. == Stackable Operators -There are multiple ways to install the Stackable Operator for Apache Zookeeper. +There are multiple ways to install the Stackable Operator for OpenSearch. `stackablectl` is the preferred way but Helm is also supported. OpenShift users may prefer installing the operator from the RedHat Certified Operator catalog using the OpenShift web console. @@ -16,7 +16,7 @@ stackablectl (recommended):: `stackablectl` is the command line tool to interact with Stackable operators and our recommended way to install Operators. Follow the xref:management:stackablectl:installation.adoc[installation steps] for your platform. -After you have installed `stackablectl`, run the following command to install all Operators necessary for Superset: +After you have installed `stackablectl`, run the following command to install all Operators necessary for OpenSearch: [source,bash] ---- @@ -45,11 +45,11 @@ Install the Stackable Operators: include::example$getting_started/getting_started.sh[tag=helm-install-operators] ---- -Helm will deploy the operators in a Kubernetes Deployment and apply the CRDs for the Superset service (as well as the CRDs for the required operators). -You are now ready to deploy Superset in Kubernetes. +Helm will deploy the operators in a Kubernetes Deployment and apply the CRDs for the OpenSearch service (as well as the CRDs for the required operators). +You are now ready to deploy OpenSearch in Kubernetes. -- ==== == What's next -xref:getting_started/first_steps.adoc[Deploy a Superset instance and connect to it]. +xref:getting_started/first_steps.adoc[Deploy an OpenSearch instance and connect to it]. diff --git a/docs/modules/opensearch/pages/required-external-components.adoc b/docs/modules/opensearch/pages/required-external-components.adoc deleted file mode 100644 index d6841c2..0000000 --- a/docs/modules/opensearch/pages/required-external-components.adoc +++ /dev/null @@ -1,10 +0,0 @@ -= Required external components -:description: Superset requires an SQL database for metadata storage. Supported databases include PostgreSQL and MySQL. - -Superset uses an SQL database to store metadata. -The supported databases and versions are: - -* PostgreSQL 10, 11, 12, 13, 14, 15 -* MySQL 5.7, 8.x - -Reference: https://superset.apache.org/docs/configuration/configuring-superset/#setting-up-a-production-metadata-database[Superset documentation] diff --git a/docs/modules/opensearch/partials/nav.adoc b/docs/modules/opensearch/partials/nav.adoc index 4b41932..400ee58 100644 --- a/docs/modules/opensearch/partials/nav.adoc +++ b/docs/modules/opensearch/partials/nav.adoc @@ -1,23 +1,21 @@ -* xref:superset:getting_started/index.adoc[] -** xref:superset:getting_started/installation.adoc[] -** xref:superset:getting_started/first_steps.adoc[] -* xref:superset:required-external-components.adoc[] -* xref:superset:usage-guide/index.adoc[] -** xref:superset:usage-guide/listenerclass.adoc[] -** xref:superset:usage-guide/storage-resource-configuration.adoc[] -** xref:superset:usage-guide/security.adoc[] -** xref:superset:usage-guide/connecting-druid.adoc[] -** xref:superset:usage-guide/monitoring.adoc[] -** xref:superset:usage-guide/logging.adoc[] -** xref:superset:usage-guide/configuration-environment-overrides.adoc[] -** xref:superset:usage-guide/operations/index.adoc[] -*** xref:superset:usage-guide/operations/cluster-operations.adoc[] -*** xref:superset:usage-guide/operations/pod-placement.adoc[] -*** xref:superset:usage-guide/operations/pod-disruptions.adoc[] -*** xref:superset:usage-guide/operations/graceful-shutdown.adoc[] -* xref:superset:reference/index.adoc[] -** xref:superset:reference/crds.adoc[] -*** {crd-docs}/superset.stackable.tech/supersetcluster/v1alpha1/[SupersetCluster {external-link-icon}^] -*** {crd-docs}/superset.stackable.tech/druidconnection/v1alpha1/[DruidConnection {external-link-icon}^] -** xref:superset:reference/commandline-parameters.adoc[] -** xref:superset:reference/environment-variables.adoc[] +* xref:opensearch:getting_started/index.adoc[] +** xref:opensearch:getting_started/installation.adoc[] +** xref:opensearch:getting_started/first_steps.adoc[] +* xref:opensearch:usage-guide/index.adoc[] +** xref:opensearch:usage-guide/listenerclass.adoc[] +** xref:opensearch:usage-guide/storage-resource-configuration.adoc[] +** xref:opensearch:usage-guide/security.adoc[] +** xref:opensearch:usage-guide/connecting-druid.adoc[] +** xref:opensearch:usage-guide/monitoring.adoc[] +** xref:opensearch:usage-guide/logging.adoc[] +** xref:opensearch:usage-guide/configuration-environment-overrides.adoc[] +** xref:opensearch:usage-guide/operations/index.adoc[] +*** xref:opensearch:usage-guide/operations/cluster-operations.adoc[] +*** xref:opensearch:usage-guide/operations/pod-placement.adoc[] +*** xref:opensearch:usage-guide/operations/pod-disruptions.adoc[] +*** xref:opensearch:usage-guide/operations/graceful-shutdown.adoc[] +* xref:opensearch:reference/index.adoc[] +** xref:opensearch:reference/crds.adoc[] +*** {crd-docs}/opensearch.stackable.tech/opensearchcluster/v1alpha1/[OpenSearchCluster {external-link-icon}^] +** xref:opensearch:reference/commandline-parameters.adoc[] +** xref:opensearch:reference/environment-variables.adoc[] From bddc7b08a293bf87671b35549e81317dbf2b550d Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Mon, 21 Jul 2025 13:10:08 +0200 Subject: [PATCH 05/18] doc: Remove usage guides with unimplemented features --- .../pages/usage-guide/connecting-druid.adoc | 42 --- .../pages/usage-guide/listenerclass.adoc | 15 -- .../opensearch/pages/usage-guide/logging.adoc | 17 -- .../pages/usage-guide/monitoring.adoc | 5 - .../pages/usage-guide/security.adoc | 241 ------------------ docs/modules/opensearch/partials/nav.adoc | 5 - 6 files changed, 325 deletions(-) delete mode 100644 docs/modules/opensearch/pages/usage-guide/connecting-druid.adoc delete mode 100644 docs/modules/opensearch/pages/usage-guide/listenerclass.adoc delete mode 100644 docs/modules/opensearch/pages/usage-guide/logging.adoc delete mode 100644 docs/modules/opensearch/pages/usage-guide/monitoring.adoc delete mode 100644 docs/modules/opensearch/pages/usage-guide/security.adoc diff --git a/docs/modules/opensearch/pages/usage-guide/connecting-druid.adoc b/docs/modules/opensearch/pages/usage-guide/connecting-druid.adoc deleted file mode 100644 index b930881..0000000 --- a/docs/modules/opensearch/pages/usage-guide/connecting-druid.adoc +++ /dev/null @@ -1,42 +0,0 @@ -= Connecting Apache Druid clusters -:description: Connect Apache Superset to Apache Druid on the Stackable Data Platform using the DruidConnection CustomResource. -:keywords: Stackable, SDP, Druid, Superset, database, connection -:k8s-job: https://kubernetes.io/docs/concepts/workloads/controllers/job/ -:k8s-network-policies: https://kubernetes.io/docs/concepts/services-networking/network-policies/ - -The operator can automatically connect Superset clusters that it manages to Apache Druid clusters managed by the xref:druid:index.adoc[Stackable operator for Apache Druid]. - -To do so, create a _DruidConnection_ resource: - -[source,yaml] ----- -apiVersion: superset.stackable.tech/v1alpha1 -kind: DruidConnection -metadata: - name: superset-druid-connection -spec: - superset: # <1> - name: superset - namespace: default - druid: # <2> - name: druid - namespace: default - ----- - -<1> The `name` and `namespace` in `spec.superset` refer to the Superset cluster that you want to connect. Following our example above, the name is `superset`. -<2> In `spec.druid` you specify the `name` and `namespace` of your Druid cluster. Following our example above, the name is `druid`. - -The `namespace` part is optional in both cases; if it is omitted it will default to the namespace of the DruidConnection. - -Once Superset startup is complete and the database is initialized, the Superset operator will create a {k8s-job}[Job] that will connect to the Superset cluster to run an import command to add the Druid cluster as a datasource. - -IMPORTANT: The Job is connecting to the Superset Pods. If you are restricting network traffic in your Kubernetes cluster, make sure to configure a {k8s-network-policies}[NetworkPolicy] that allows the Job to connect to Superset. - -Once the Job is completed you can see the Druid cluster as a database in the user interface under Data > Databases: - -image::superset-databases.png[Superset databases showing the connected Druid cluster] - -== Further reading - -Read the CRD reference for the {crd-docs}/superset.stackable.tech/druidconnection/v1alpha1/[DruidConnection {external-link-icon}^] CustomResource. diff --git a/docs/modules/opensearch/pages/usage-guide/listenerclass.adoc b/docs/modules/opensearch/pages/usage-guide/listenerclass.adoc deleted file mode 100644 index 97eabd4..0000000 --- a/docs/modules/opensearch/pages/usage-guide/listenerclass.adoc +++ /dev/null @@ -1,15 +0,0 @@ -= Service exposition with ListenerClasses -:description: Configure the Superset service exposure with listener classes: cluster-internal, external-unstable, or external-stable. - -Apache Superset offers a web UI and an API. -The operator deploys a xref:listener-operator:listener.adoc[Listener] for the Nodes pod. -The listener defaults to only being accessible from within the Kubernetes cluster, but this can be changed by setting `.spec.nodes.roleConfig.listenerClass`: - -[source,yaml] ----- -spec: - nodes: - roleConfig: - listenerClass: external-stable # <1> ----- -<1> Specify one of `external-stable`, `external-unstable`, `cluster-internal` at role-level (the default setting is `cluster-internal`). diff --git a/docs/modules/opensearch/pages/usage-guide/logging.adoc b/docs/modules/opensearch/pages/usage-guide/logging.adoc deleted file mode 100644 index bffb700..0000000 --- a/docs/modules/opensearch/pages/usage-guide/logging.adoc +++ /dev/null @@ -1,17 +0,0 @@ -= Log aggregation -:description: The logs can be forwarded to a Vector log aggregator by providing a discovery ConfigMap for the aggregator and by enabling the log agent. - -The logs can be forwarded to a Vector log aggregator by providing a discovery ConfigMap for the aggregator and by enabling the log agent: - -[source,yaml] ----- -spec: - clusterConfig: - vectorAggregatorConfigMapName: vector-aggregator-discovery - nodes: - config: - logging: - enableVectorAgent: true ----- - -Further information on how to configure logging, can be found in xref:concepts:logging.adoc[]. diff --git a/docs/modules/opensearch/pages/usage-guide/monitoring.adoc b/docs/modules/opensearch/pages/usage-guide/monitoring.adoc deleted file mode 100644 index 9ffc16a..0000000 --- a/docs/modules/opensearch/pages/usage-guide/monitoring.adoc +++ /dev/null @@ -1,5 +0,0 @@ -= Monitoring -:description: The managed Superset instances are automatically configured to export Prometheus metrics. - -The managed Superset instances are automatically configured to export Prometheus metrics. -See xref:operators:monitoring.adoc[] for more details. diff --git a/docs/modules/opensearch/pages/usage-guide/security.adoc b/docs/modules/opensearch/pages/usage-guide/security.adoc deleted file mode 100644 index 07e93ec..0000000 --- a/docs/modules/opensearch/pages/usage-guide/security.adoc +++ /dev/null @@ -1,241 +0,0 @@ -= Security -:description: Superset security: configure authentication via database, LDAP, or OpenID Connect with roles-based authorization for user access control. -:superset-roles: https://superset.apache.org/docs/security/#roles -:superset-security: https://superset.apache.org/docs/security -:keycloak: https://www.keycloak.org/ - -== [[authentication]]Authentication - -Every user has to be authenticated before using Superset: -there are several ways in which this can be set up. - -[IMPORTANT] -.Multiple authentication methods -==== -Only one authentication method is supported at a time, and in case of LDAP, only one authentication class is allowed. -This means, it is not possible to configure both LDAP and OIDC authentication methods at the same time, but *it is* possible to configure multiple OIDC classes *or* one LDAP authentication class. -==== - -=== Superset database - -The default setting is to manually set up users via the web interface where they are stored in the database attached to Superset. - -=== LDAP - -Superset supports xref:concepts:authentication.adoc[authentication] of users against a single LDAP server. -This requires setting up an AuthenticationClass for the LDAP server. -The AuthenticationClass is then referenced in the SupersetCluster resource as follows: - -[source,yaml] ----- -apiVersion: superset.stackable.tech/v1alpha1 -kind: SupersetCluster -metadata: - name: superset-with-ldap-server -spec: - image: - productVersion: 4.1.2 - clusterConfig: - authentication: - - authenticationClass: ldap # <1> - userRegistrationRole: Admin # <2> ----- - -<1> The reference to an AuthenticationClass called `ldap` -<2> The default role to which all users are assigned - -Users that log in with LDAP are assigned to a default {superset-roles}[Role^{external-link-icon}^] which is specified with the `userRegistrationRole` property. - -You can follow the xref:tutorials:authentication_with_openldap.adoc[] tutorial to learn how to set up an AuthenticationClass for an LDAP server, as well as consulting the xref:concepts:authentication.adoc#_ldap[AuthenticationClass concepts page]. - -=== [[oidc]]OpenID Connect - -An OpenID Connect provider can be used for authentication. -Unfortunately, there is no generic support for OpenID Connect built into Superset. -This means that only specific OpenID Connect providers can be configured. - -IMPORTANT: Superset deployments on the Stackable Data Platform only support {keycloak}[Keycloak^{external-link-icon}^]. - -[source,yaml] ----- -apiVersion: superset.stackable.tech/v1alpha1 -kind: SupersetCluster -metadata: - name: superset-with-oidc -spec: - image: - productVersion: 4.1.2 - clusterConfig: - authentication: - - authenticationClass: keycloak # <1> - oidc: - clientCredentialsSecret: superset-keycloak-client # <2> - userRegistrationRole: Gamma # <3> ----- - -<1> The reference to an AuthenticationClass called `keycloak` -<2> The reference to the Secret containing the Superset client credentials -<3> The default role to which all users are assigned - -Users that log in with OpenID Connect are assigned to a default {superset-roles}[Role^{external-link-icon}^] which is specified with the `userRegistrationRole` property. - -The Secret containing the Superset client credentials: - -[source,yaml] ----- -apiVersion: v1 -kind: Secret -metadata: - name: superset-keycloak-client -stringData: - clientId: superset # <1> - clientSecret: superset_client_secret # <2> ----- - -<1> The client ID of Superset as defined in Keycloak -<2> The client secret as defined in Keycloak - -A minimum client configuration in Keycloak for this example looks like this: - -[source,json] ----- -{ - "clientId": "superset", - "enabled": true, - "clientAuthenticatorType": "client-secret", # <1> - "secret": "superset_client_secret", - "redirectUris": [ - "*" - ], - "webOrigins": [ - "*" - ], - "standardFlowEnabled": true, # <2> - "protocol": "openid-connect" # <3> -} ----- - -<1> Sets the OIDC type to confidential access type. -<2> Enables the OAuth2 "Authorization Code Flow". -<3> Enables OpenID Connect and OAuth2 support. - -Further information for specifying an AuthenticationClass for an OIDC provider can be found at the xref:concepts:authentication.adoc#_oidc[concepts page]. - -== [[authorization]]Authorization - -Superset has a concept called `Roles` which allows you to grant user permissions based on roles. -Have a look at the {superset-security}[Superset documentation on Security^{external-link-icon}^]. - -[opa] -=== OPA role mapping - -Stackable ships a custom security manager that makes it possible to assign roles to users via the Open Policy Agent integration. -The roles must exist in the Superset database before they can be assigned to users. -If a role is not present in the Superset database, an error will be logged by the security manager and the user login will proceed without it. -Also the role names must match exactly the output of the Rego rule named `user_roles`. -In the following example, a rego package is defined that assigns roles to the users `admin` and `guest`. - -[source,yaml] ----- -apiVersion: v1 -kind: ConfigMap -metadata: - name: superset-opa-regorules - labels: - opa.stackable.tech/bundle: "true" -data: - roles.rego: | - package superset - - default user_roles := [] - - user_roles := roles if { - some user in users - roles := user.roles - user.username == input.username - } - users := [ - {"username": "admin", "roles": ["Admin", "Test"]}, #<1> - {"username": "guest", "roles": ["Gamma"]} #<2> - ] ----- - -<1> Assign the roles `Admin` and `Test` to the `admin` user. The `Test` role is not a standard Superset role and must be created before the assignment. -<2> Assign the `Gamma` role to the `guest` user. - -OPA rules can make use of the xref:opa:usage-guide:user-info-fetcher[user-info-fetcher] integration. - -The following snippet shows how to use the OPA security manager in a Superset stacklet. - -[source,yaml] ----- -apiVersion: superset.stackable.tech/v1alpha1 -kind: SupersetCluster -metadata: - name: superset-with-opa-role-mapping -spec: - clusterConfig: - authorization: - roleMappingFromOpa: - configMapName: superset-opa-regorules # <1> - package: superset - cache: # <2> - entryTimeToLive: 10s # <3> - maxEntries: 5 # <4> ----- - -<1> ConfigMap name containing rego rules -<2> Mandatory Opa caching. If not set, default settings apply. -<3> Time for cached entries per user can live. Defaults to 30s. -<4> Number of maximum entries, defaults to 1000. Cache will be disabled for maxEntries: 0. - -IMPORTANT: Any role assignments done in the Superset UI are discarded and will be overridden by the OPA security manager. - -=== Superset database - -You can view all the available roles in the web interface of Superset and can also assign users to these roles. - -=== LDAP - -Superset supports assigning {superset-roles}[Roles^{external-link-icon}^] to users based on their LDAP group membership, though this is not yet supported by the Stackable operator. -All the users logging in via LDAP get assigned to the same role which you can configure via the attribute `authentication[*].userRegistrationRole` on the `SupersetCluster` object: - -[source,yaml] ----- -apiVersion: superset.stackable.tech/v1alpha1 -kind: SupersetCluster -metadata: - name: superset-with-ldap-server -spec: - clusterConfig: - authentication: - - authenticationClass: ldap - userRegistrationRole: Admin # <1> ----- - -<1> All users are assigned to the `Admin` role - -=== OpenID Connect - -The mechanism for assigning roles to users described in the LDAP section also applies to OpenID Connect. -Superset supports assigning {superset-roles}[Roles^{external-link-icon}^] to users based on their OpenID Connect scopes, though this is not yet supported by the Stackable operator. -All the users logging in via OpenID Connect get assigned to the same role which you can configure via the attribute `authentication[*].userRegistrationRole` on the `SupersetCluster` object: - -[source,yaml] ----- -apiVersion: superset.stackable.tech/v1alpha1 -kind: SupersetCluster -metadata: - name: superset-with-oidc -spec: - image: - productVersion: 4.1.2 - clusterConfig: - authentication: - - authenticationClass: keycloak - oidc: - clientCredentialsSecret: superset-keycloak-client - userRegistrationRole: Gamma # <1> ----- - -<1> All users are assigned to the `Gamma` role diff --git a/docs/modules/opensearch/partials/nav.adoc b/docs/modules/opensearch/partials/nav.adoc index 400ee58..be4d1a5 100644 --- a/docs/modules/opensearch/partials/nav.adoc +++ b/docs/modules/opensearch/partials/nav.adoc @@ -2,12 +2,7 @@ ** xref:opensearch:getting_started/installation.adoc[] ** xref:opensearch:getting_started/first_steps.adoc[] * xref:opensearch:usage-guide/index.adoc[] -** xref:opensearch:usage-guide/listenerclass.adoc[] ** xref:opensearch:usage-guide/storage-resource-configuration.adoc[] -** xref:opensearch:usage-guide/security.adoc[] -** xref:opensearch:usage-guide/connecting-druid.adoc[] -** xref:opensearch:usage-guide/monitoring.adoc[] -** xref:opensearch:usage-guide/logging.adoc[] ** xref:opensearch:usage-guide/configuration-environment-overrides.adoc[] ** xref:opensearch:usage-guide/operations/index.adoc[] *** xref:opensearch:usage-guide/operations/cluster-operations.adoc[] From 3f63f6001f50f196d39b5a143fa1ac1f8dea98d9 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Mon, 21 Jul 2025 17:17:00 +0200 Subject: [PATCH 06/18] doc: Adapt resource page --- .../opensearch/pages/usage-guide/index.adoc | 8 ++-- .../storage-resource-configuration.adoc | 46 +++++++++++++++---- 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/docs/modules/opensearch/pages/usage-guide/index.adoc b/docs/modules/opensearch/pages/usage-guide/index.adoc index 8d5d8be..9e21104 100644 --- a/docs/modules/opensearch/pages/usage-guide/index.adoc +++ b/docs/modules/opensearch/pages/usage-guide/index.adoc @@ -1,9 +1,7 @@ = Usage guide :page-aliases: usage.doc -:description: Superset usage guide: configure resources, connect to Apache Druid, set up authentication, logging, and monitoring. +:description: OpenSearch usage guide: configure resources and override configurations. -The usage guide covers various aspects of configuring Superset and interconnection with other tools. +The usage guide covers various aspects of configuring OpenSearch and interconnection with other tools. -Learn about defining the amount of xref:usage-guide/storage-resource-configuration.adoc[resources] Superset uses or learn how to xref:usage-guide/connecting-druid.adoc[connect to Apache Druid] operated by the xref:druid:index.adoc[]. - -Configure xref:usage-guide/security.adoc#authentication[authentication] with LDAP and xref:usage-guide/security.adoc#authorization[authorization]. Observe your Superset instance with xref:usage-guide/logging.adoc[log aggregation] and xref:usage-guide/monitoring.adoc[monitoring]. +Learn about defining the amount of xref:usage-guide/storage-resource-configuration.adoc[resources] OpenSearch uses. diff --git a/docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc b/docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc index 5e1e1d3..7652bd3 100644 --- a/docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc +++ b/docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc @@ -1,16 +1,40 @@ = Storage and resource configuration -:description: Superset resource configuration: default CPU and memory requests for HA setup with guidance for adapting production resource needs. +:description: Configure storage and resource allocation for OpenSearch nodes using Stackable Operator, including PersistentVolumeClaims, CPU, memory, and storage defaults. + +== Storage for data volumes + +You can mount volumes where data is stored by specifying https://kubernetes.io/docs/concepts/storage/persistent-volumes[PersistentVolumeClaims] for each individual role group: + +[source,yaml] +---- +nodes: + roleGroups: + default: + config: + resources: + storage: + logDirs: + capacity: 50Gi +---- + +In the above example, all OpenSearch nodes in the default role group store data (the location of the property `path.data`) on a `50Gi` volume. + +If nothing is configured in the custom resource for a certain role group, then by default each Pod has a `8Gi` large local volume mount for the data location. + +On role groups with only the `cluster_manager` role, you probably want to decrease this value, but increase it on role groups with the `data` role. == Resource Requests -include::concepts:stackable_resource_requests.adoc[] +include::home:concepts:stackable_resource_requests.adoc[] + +A minimal HA setup consisting of 3 nodes has the following https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/[resource requirements]: -A minimal HA setup consisting of 2 Superset instances has the following -https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/[resource requirements]: +* `300m` CPU request +* `1200m` CPU limit +* `4800Mi` memory request and limit -* `1300m` CPU request -* `3800m` CPU limit -* `2384Mi` memory request and limit +Of course, additional services require additional resources. +For Stackable components, see the corresponding documentation on further resource requirements. Corresponding to the values above, the operator uses the following resource defaults: @@ -22,10 +46,12 @@ nodes: config: resources: cpu: - min: '300m' - max: "1200m" + min: "1" + max: "4" memory: - limit: '1000Mi' + limit: 2Gi + storage: + data: 8Gi ---- WARNING: The default values are _most likely_ not sufficient to run a production cluster. Please adapt according to your requirements. From e29da66947fc734dd3ee6134e5edceba8f7e9670 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Tue, 22 Jul 2025 12:29:44 +0200 Subject: [PATCH 07/18] doc: Adapt overrides page --- docs/modules/opensearch/pages/index.adoc | 2 +- .../configuration-environment-overrides.adoc | 162 ++++++++++++------ 2 files changed, 111 insertions(+), 53 deletions(-) diff --git a/docs/modules/opensearch/pages/index.adoc b/docs/modules/opensearch/pages/index.adoc index c241e84..c02a101 100644 --- a/docs/modules/opensearch/pages/index.adoc +++ b/docs/modules/opensearch/pages/index.adoc @@ -32,7 +32,7 @@ It creates a number of different Kubernetes resources based on this {crs}[custom The OpenSearchCluster is the resource for the configuration of the OpenSearch instance. The resource defines only one xref:concepts:roles-and-role-groups.adoc[role], the `nodes`. The various configuration options are explained in the xref:usage-guide/index.adoc[]. -It helps you tune your cluster to your needs by configuring xref:usage-guide/storage-resource-configuration.adoc[resource usage], xref:usage-guide/security.adoc[security], xref:usage-guide/logging.adoc[logging] and more. +It helps you tune your cluster to your needs by configuring xref:usage-guide/storage-resource-configuration.adoc[resource usage] and more. === Kubernetes resources diff --git a/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc b/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc index 1bead95..000c200 100644 --- a/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc +++ b/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc @@ -1,15 +1,15 @@ = Configuration & Environment Overrides -The cluster definition also supports overriding configuration properties and environment variables, +The cluster definition also supports overriding configuration properties, environment variables and CLI parameters, either per role or per role group, where the more specific override (role group) has precedence over the less specific one (role). -IMPORTANT: Overriding certain properties which are set by the operator (such as the `STATS_LOGGER`) can interfere with the operator and can lead to problems. +IMPORTANT: Overriding certain properties which are set by the operator (such as the `network.host`) can interfere with the operator and can lead to problems. == Configuration Properties -For a role or role group, at the same level of `config`, you can specify `configOverrides` for the `superset_config.py`. -For example, if you want to set the CSV export encoding and the preferred databases adapt the `nodes` section of the cluster resource as follows: +For a role or role group, at the same level of `config`, you can specify `configOverrides` for the `opensearch.yml`. +For example, if you want to enable role-based access to the REST management API for the role `all_access`, then adapt the `nodes` section of the cluster resource as follows: [source,yaml] ---- @@ -18,16 +18,8 @@ nodes: default: config: {} configOverrides: - superset_config.py: - CSV_EXPORT: "{'encoding': 'utf-8'}" - PREFERRED_DATABASES: |- - [ - 'PostgreSQL', - 'Presto', - 'MySQL', - 'SQLite', - # etc. - ] + opensearch.yml: + plugins.security.restapi.roles_enabled: all_access ---- Just as for the `config`, it is possible to specify this at the role level as well: @@ -36,53 +28,95 @@ Just as for the `config`, it is possible to specify this at the role level as we ---- nodes: configOverrides: - superset_config.py: - CSV_EXPORT: "{'encoding': 'utf-8'}" - PREFERRED_DATABASES: |- - [ - 'PostgreSQL', - 'Presto', - 'MySQL', - 'SQLite', - # etc. - ] + opensearch.yml: + plugins.security.restapi.roles_enabled: all_access roleGroups: default: config: {} ---- All override property values must be strings. -They are treated as Python expressions. +They are added unchanged to the configuration file. So care must be taken to produce a valid configuration. -For a full list of configuration options we refer to the -https://github.com/apache/superset/blob/master/superset/config.py[main config file for Superset]. +For a list of configuration options, we refer to the +https://docs.opensearch.org/docs/latest/install-and-configure/configuring-opensearch/index/[Configuring OpenSearch] section in the OpenSearch documentation. -As Superset can be configured with python code too, arbitrary code can be added to the `superset_conf.py`. -You can use either `EXPERIMENTAL_FILE_HEADER` to add code to the top or `EXPERIMENTAL_FILE_FOOTER` to add to the bottom. +The file `opensearch.yml` is a YAML file, where deep structures are possible. +On the other hand, `configOverrides` are only flat key-value pairs. +Fortunately, this is not a problem because the OpenSearch YAML parser allows both representations. +Keys can be flattened as follows: -IMPORTANT: This is an experimental feature +[source,yaml] +---- +# File: opensearch.yml + +plugins.security.restapi.roles_enabled: all_access + +# is equivalent to + +plugins: + security: + restapi: + roles_enabled: all_access +---- + +Lists can be flattened as follows: [source,yaml] ---- -nodes: - configOverrides: - superset_config.py: - CSV_EXPORT: "{'encoding': 'utf-8'}" - EXPERIMENTAL_FILE_HEADER: | - from modules.my_module import my_class - EXPERIMENTAL_FILE_FOOTER: | - import logging - from superset.security import SupersetSecurityManager - - class myCustomSecurityManger(SupersetSecurityManager): - def __init__(): - init() - - CUSTOM_SECURITY_MANAGER = myCustomSecurityManger - roleGroups: - default: - config: {} +# File: opensearch.yml + +# as a comma-separated list: <1> +plugins.security.restapi.roles_enabled: role1,role2,role3 + +# as a JSON list: <2> +plugins.security.restapi.roles_enabled: ["role1", "role2", "role3"] + +# as an indexed flat list: <3> +plugins.security.restapi.roles_enabled.0: role1 +plugins.security.restapi.roles_enabled.1: role2 +plugins.security.restapi.roles_enabled.2: role3 + +# All options above are equivalent to + +plugins: + security: + restapi: + roles_enabled: + - role1 + - role2 + - role3 +---- +<1> Commas in list entries cannot be escaped. +<2> The brackets must be escaped in `configOverrides` as follows: `"[\"role1\", \"role2\", \"role3\"]"` +<3> Indexed flat lists are considered "legacy" in the OpenSearch code. +// see https://github.com/opensearch-project/OpenSearch/blob/3.1.0/server/src/main/java/org/opensearch/common/settings/Settings.java#L1049 + +Other types can be set as strings in `configOverrides` because OpenSearch parses them: + +[source,yaml] +---- +# File: opensearch.yml + +# Boolean as string +cluster.blocks.read_only: "true" + +# Integer as string +cluster.max_shards_per_node: "10000" + +# Floating point as string +cluster.routing.allocation.balance.index: "0.6" + +# Time unit as string +cluster.info.update.interval: "10s" + +# The options above are equivalent to + +cluster.blocks.read_only: true +cluster.max_shards_per_node: 10000 +cluster.routing.allocation.balance.index: 0.6 +cluster.info.update.interval: 10s ---- == Environment Variables @@ -97,7 +131,7 @@ nodes: default: config: {} envOverrides: - FLASK_ENV: development + OPENSEARCH_PATH_CONF: /etc/opensearch ---- or per role: @@ -106,15 +140,39 @@ or per role: ---- nodes: envOverrides: - FLASK_ENV: development + OPENSEARCH_PATH_CONF: /etc/opensearch roleGroups: default: config: {} ---- -// cliOverrides don't make sense for this operator, so the feature is omitted for now +== CLI parameters + +CLI parameters can be set with `cliOverrides` per role group: + +[source,yaml] +---- +nodes: + roleGroups: + default: + config: {} + cliOverrides: + --pidfile: /tmp/mypidfile.pid +---- + +or per role: + +[source,yaml] +---- +nodes: + cliOverrides: + --pidfile: /tmp/mypidfile.pid + roleGroups: + default: + config: {} +---- == Pod overrides -The Superset operator also supports Pod overrides, allowing you to override any property that you can set on a Kubernetes Pod. +The OpenSearch operator also supports Pod overrides, allowing you to override any property that you can set on a Kubernetes Pod. Read the xref:concepts:overrides.adoc#pod-overrides[Pod overrides documentation] to learn more about this feature. From 516726340cc3bd53a678f9fd62a6be1bd39915c7 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Tue, 22 Jul 2025 16:35:52 +0200 Subject: [PATCH 08/18] doc: Adapt the operations pages --- .../operations/cluster-operations.adoc | 4 +-- .../operations/graceful-shutdown.adoc | 30 ++++++++++++++----- .../operations/pod-disruptions.adoc | 3 +- .../usage-guide/operations/pod-placement.adoc | 4 +-- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/docs/modules/opensearch/pages/usage-guide/operations/cluster-operations.adoc b/docs/modules/opensearch/pages/usage-guide/operations/cluster-operations.adoc index 4b869e6..29482a3 100644 --- a/docs/modules/opensearch/pages/usage-guide/operations/cluster-operations.adoc +++ b/docs/modules/opensearch/pages/usage-guide/operations/cluster-operations.adoc @@ -1,4 +1,4 @@ = Cluster Operation -Superset installations can be configured with different cluster operations like pausing reconciliation or stopping the -cluster. See xref:concepts:operations/cluster_operations.adoc[cluster operations] for more details. +OpenSearch installations can be configured with different cluster operations like pausing reconciliation or stopping the cluster. +See xref:concepts:operations/cluster_operations.adoc[cluster operations] for more details. diff --git a/docs/modules/opensearch/pages/usage-guide/operations/graceful-shutdown.adoc b/docs/modules/opensearch/pages/usage-guide/operations/graceful-shutdown.adoc index 9faefed..48ecd8a 100644 --- a/docs/modules/opensearch/pages/usage-guide/operations/graceful-shutdown.adoc +++ b/docs/modules/opensearch/pages/usage-guide/operations/graceful-shutdown.adoc @@ -4,17 +4,31 @@ You can configure the graceful shutdown as described in xref:concepts:operations == Nodes -As a default, Superset nodes have `2 minutes` to shut down gracefully. +As a default, OpenSearch nodes have 2 minutes to shut down gracefully. -The Superset node process will receive a `SIGTERM` signal when Kubernetes wants to terminate the Pod. +The OpenSearch node process will receive a `SIGTERM` signal when Kubernetes wants to terminate the Pod. It will log the received signal as shown in the log below and initiate a graceful shutdown. -After the graceful shutdown timeout runs out, and the process still didn't exit, Kubernetes will issue a `SIGKILL` signal. +After the graceful shutdown timeout runs out, and the process still did not exit, Kubernetes will issue a `SIGKILL` signal. [source,text] ---- -superset [2023-11-08 13:14:39 +0000] [206] [INFO] Handling signal: term -metrics ts=2023-11-08T13:14:39.818Z caller=main.go:553 level=info msg="Received os signal, exiting" signal=terminated -superset [2023-11-08 13:14:39 +0000] [207] [INFO] Worker exiting (pid: 207) -superset Loaded your LOCAL configuration at [/stackable/app/pythonpath/superset_config.py] -superset [2023-11-08 13:14:40 +0000] [206] [INFO] Shutting down: Master +[o.o.s.a.r.AuditMessageRouter] Closing AuditMessageRouter +[o.o.n.Node ] stopping ... +[o.o.s.a.s.SinkProvider ] Closing DebugSink +[o.o.c.c.FollowersChecker ] FollowerChecker{discoveryNode={simple-opensearch-nodes-default-3}{jcXCasAwSf6wTxND431bnw}{KFX1ua4GQpOZc1wdfY5RdA}{10.244.0.22}{10.244.0.22:9300}{dimr}{shard_indexing_pressure_enabled=true}, failureCountSinceLastSuccess=0, [cluster.fault_detection.follower_check.retry_count]=3} disconnected +[o.o.c.c.FollowersChecker ] FollowerChecker{discoveryNode={simple-opensearch-nodes-default-0}{_HWwfRHWSk-0l2FIYWZerw}{voEOdPrxRsifVO0fema60Q}{10.244.0.26}{10.244.0.26:9300}{dimr}{shard_indexing_pressure_enabled=true}, failureCountSinceLastSuccess=0, [cluster.fault_detection.follower_check.retry_count]=3} disconnected +[o.o.c.c.FollowersChecker ] FollowerChecker{discoveryNode={simple-opensearch-nodes-default-3}{jcXCasAwSf6wTxND431bnw}{KFX1ua4GQpOZc1wdfY5RdA}{10.244.0.22}{10.244.0.22:9300}{dimr}{shard_indexing_pressure_enabled=true}, failureCountSinceLastSuccess=0, [cluster.fault_detection.follower_check.retry_count]=3} marking + +[o.o.c.c.FollowersChecker ] FollowerChecker{discoveryNode={simple-opensearch-nodes-default-2}{NudYVGdNSbClz-e09TVElg}{MmWiswEsQo6MpuDG47a6Ag}{10.244.0.24}{10.244.0.24:9300}{dimr}{shard_indexing_pressure_enabled=true}, failureCountSinceLastSuccess=0, [cluster.fault_detection.follower_check.retry_count]=3} disconnected +[o.o.c.c.FollowersChecker ] FollowerChecker{discoveryNode={simple-opensearch-nodes-default-1}{NSxqrrevSIOtCIWz9Hd9vw}{qHNTBP4NTqe09_-9ZqnUJQ}{10.244.0.25}{10.244.0.25:9300}{dimr}{shard_indexing_pressure_enabled=true}, failureCountSinceLastSuccess=0, [cluster.fault_detection.follower_check.retry_count]=3} disconnected +[o.o.c.c.FollowersChecker ] FollowerChecker{discoveryNode={simple-opensearch-nodes-default-0}{_HWwfRHWSk-0l2FIYWZerw}{voEOdPrxRsifVO0fema60Q}{10.244.0.26}{10.244.0.26:9300}{dimr}{shard_indexing_pressure_enabled=true}, failureCountSinceLastSuccess=0, [cluster.fault_detection.follower_check.retry_count]=3} marking + +[o.o.c.c.FollowersChecker ] FollowerChecker{discoveryNode={simple-opensearch-nodes-default-1}{NSxqrrevSIOtCIWz9Hd9vw}{qHNTBP4NTqe09_-9ZqnUJQ}{10.244.0.25}{10.244.0.25:9300}{dimr}{shard_indexing_pressure_enabled=true}, failureCountSinceLastSuccess=0, [cluster.fault_detection.follower_check.retry_count]=3} marking + +[o.o.c.c.FollowersChecker ] FollowerChecker{discoveryNode={simple-opensearch-nodes-default-2}{NudYVGdNSbClz-e09TVElg}{MmWiswEsQo6MpuDG47a6Ag}{10.244.0.24}{10.244.0.24:9300}{dimr}{shard_indexing_pressure_enabled=true}, failureCountSinceLastSuccess=0, [cluster.fault_detection.follower_check.retry_count]=3} marking + +[o.o.n.Node ] stopped +[o.o.n.Node ] closing ... +[o.o.s.a.i.AuditLogImpl ] Closing AuditLogImpl +[o.o.n.Node ] closed ---- diff --git a/docs/modules/opensearch/pages/usage-guide/operations/pod-disruptions.adoc b/docs/modules/opensearch/pages/usage-guide/operations/pod-disruptions.adoc index 70e2139..dfa6daf 100644 --- a/docs/modules/opensearch/pages/usage-guide/operations/pod-disruptions.adoc +++ b/docs/modules/opensearch/pages/usage-guide/operations/pod-disruptions.adoc @@ -1,8 +1,9 @@ = Allowed Pod disruptions -You can configure the permitted Pod disruptions for Superset nodes as described in xref:concepts:operations/pod_disruptions.adoc[]. +You can configure the permitted Pod disruptions for OpenSearch nodes as described in xref:concepts:operations/pod_disruptions.adoc[]. Unless you configure something else or disable the provided PodDisruptionBudgets (PDBs), the following PDBs are written: == Nodes + The provided PDBs only allow a single node to be offline at any given time, regardless of the number of replicas or `roleGroups`. diff --git a/docs/modules/opensearch/pages/usage-guide/operations/pod-placement.adoc b/docs/modules/opensearch/pages/usage-guide/operations/pod-placement.adoc index 83b6120..d697db5 100644 --- a/docs/modules/opensearch/pages/usage-guide/operations/pod-placement.adoc +++ b/docs/modules/opensearch/pages/usage-guide/operations/pod-placement.adoc @@ -1,7 +1,7 @@ = Pod Placement -You can configure the Pod placement of the Superset pods as described in xref:concepts:operations/pod_placement.adoc[]. +You can configure the Pod placement of the OpenSearch pods as described in xref:concepts:operations/pod_placement.adoc[]. The default affinities created by the operator are: -1. Distribute all the Superset Pods (weight 70) +1. Distribute all the OpenSearch pods (weight 1) From 53340597a3c6c5498814063a3f26e55bdd5d872b Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Tue, 22 Jul 2025 17:07:07 +0200 Subject: [PATCH 09/18] doc: Adapt the reference pages --- .../reference/commandline-parameters.adoc | 15 +-------------- .../opensearch/pages/reference/crds.adoc | 2 +- .../pages/reference/environment-variables.adoc | 18 +++++++++--------- 3 files changed, 11 insertions(+), 24 deletions(-) diff --git a/docs/modules/opensearch/pages/reference/commandline-parameters.adoc b/docs/modules/opensearch/pages/reference/commandline-parameters.adoc index 964229a..465caa7 100644 --- a/docs/modules/opensearch/pages/reference/commandline-parameters.adoc +++ b/docs/modules/opensearch/pages/reference/commandline-parameters.adoc @@ -2,19 +2,6 @@ This operator accepts the following command line parameters: -== product-config - -*Default value*: `/etc/stackable/superset-operator/config-spec/properties.yaml` - -*Required*: false - -*Multiple values:* false - -[source] ----- -stackable-superset-operator run --product-config /foo/bar/properties.yaml ----- - == watch-namespace *Default value*: All namespaces @@ -27,5 +14,5 @@ The operator will **only** watch for resources in the provided namespace `test`: [source] ---- -stackable-superset-operator run --watch-namespace test +stackable-opensearch-operator run --watch-namespace test ---- diff --git a/docs/modules/opensearch/pages/reference/crds.adoc b/docs/modules/opensearch/pages/reference/crds.adoc index b4dad8e..1ee275c 100644 --- a/docs/modules/opensearch/pages/reference/crds.adoc +++ b/docs/modules/opensearch/pages/reference/crds.adoc @@ -1,3 +1,3 @@ = CRD Reference -Find all CRD reference for the Stackable Operator for Apache Superset at: {crd-docs-base-url}/superset-operator/{crd-docs-version}. +Find all CRD reference for the Stackable Operator for OpenSearch at: {crd-docs-base-url}/opensearch-operator/{crd-docs-version}. diff --git a/docs/modules/opensearch/pages/reference/environment-variables.adoc b/docs/modules/opensearch/pages/reference/environment-variables.adoc index 7f46bf8..8eed349 100644 --- a/docs/modules/opensearch/pages/reference/environment-variables.adoc +++ b/docs/modules/opensearch/pages/reference/environment-variables.adoc @@ -25,17 +25,17 @@ or via docker: [source] ---- docker run \ ---name superset-operator \ +--name opensearch-operator \ --network host \ --env KUBECONFIG=/home/stackable/.kube/config \ --env KUBERNETES_CLUSTER_DOMAIN=mycluster.local \ --mount type=bind,source="$HOME/.kube/config",target="/home/stackable/.kube/config" \ -oci.stackable.tech/sdp/superset-operator:0.0.0-dev +oci.stackable.tech/sdp/opensearch-operator:0.0.0-dev ---- == PRODUCT_CONFIG -*Default value*: `/etc/stackable/superset-operator/config-spec/properties.yaml` +*Default value*: `/etc/stackable/opensearch-operator/config-spec/properties.yaml` *Required*: false @@ -44,19 +44,19 @@ oci.stackable.tech/sdp/superset-operator:0.0.0-dev [source] ---- export PRODUCT_CONFIG=/foo/bar/properties.yaml -stackable-superset-operator run +stackable-opensearch-operator run ---- or via docker: ---- docker run \ - --name superset-operator \ + --name opensearch-operator \ --network host \ --env KUBECONFIG=/home/stackable/.kube/config \ --env PRODUCT_CONFIG=/my/product/config.yaml \ --mount type=bind,source="$HOME/.kube/config",target="/home/stackable/.kube/config" \ - oci.stackable.tech/sdp/superset-operator:0.0.0-dev + oci.stackable.tech/sdp/opensearch-operator:0.0.0-dev ---- == WATCH_NAMESPACE @@ -72,7 +72,7 @@ The operator will **only** watch for resources in the provided namespace `test`: [source] ---- export WATCH_NAMESPACE=test -stackable-superset-operator run +stackable-opensearch-operator run ---- or via docker: @@ -80,10 +80,10 @@ or via docker: [source] ---- docker run \ ---name superset-operator \ +--name opensearch-operator \ --network host \ --env KUBECONFIG=/home/stackable/.kube/config \ --env WATCH_NAMESPACE=test \ --mount type=bind,source="$HOME/.kube/config",target="/home/stackable/.kube/config" \ -oci.stackable.tech/sdp/superset-operator:0.0.0-dev +oci.stackable.tech/sdp/opensearch-operator:0.0.0-dev ---- From ca016a18bbc25ad577f2e5030fafb069a5102e00 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Tue, 22 Jul 2025 18:35:34 +0200 Subject: [PATCH 10/18] doc: Add the node roles page --- .../opensearch/pages/usage-guide/index.adoc | 2 +- .../pages/usage-guide/node-roles.adoc | 68 +++++++++++++++++++ docs/modules/opensearch/partials/nav.adoc | 1 + 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 docs/modules/opensearch/pages/usage-guide/node-roles.adoc diff --git a/docs/modules/opensearch/pages/usage-guide/index.adoc b/docs/modules/opensearch/pages/usage-guide/index.adoc index 9e21104..7f9816a 100644 --- a/docs/modules/opensearch/pages/usage-guide/index.adoc +++ b/docs/modules/opensearch/pages/usage-guide/index.adoc @@ -4,4 +4,4 @@ The usage guide covers various aspects of configuring OpenSearch and interconnection with other tools. -Learn about defining the amount of xref:usage-guide/storage-resource-configuration.adoc[resources] OpenSearch uses. +Learn about xref:usage-guide/node-roles.adoc[] or defining the amount of xref:usage-guide/storage-resource-configuration.adoc[resources] OpenSearch uses. diff --git a/docs/modules/opensearch/pages/usage-guide/node-roles.adoc b/docs/modules/opensearch/pages/usage-guide/node-roles.adoc new file mode 100644 index 0000000..d7c19ec --- /dev/null +++ b/docs/modules/opensearch/pages/usage-guide/node-roles.adoc @@ -0,0 +1,68 @@ += Assigning roles to nodes +:description: Configure OpenSearch node roles + +An OpenSearch node can fulfill different roles, e.g. it can manage the operation of a cluster or store and search data. + +All nodes are defined under the role `nodes`. +The role config already defaults to a set of node roles: + +[source,yaml] +---- +nodes: + config: + nodeRoles: + - cluster_manager + - data + - ingest + - remote_cluster_client +---- + +If you deploy a cluster with the following specification, then 3 replicas with the roles `cluster_manager`, `data`, `ingest` and `remote_cluster_client` are deployed: + +[source,yaml] +---- +nodes: + roleGroups: + default: + replicas: 3 +---- + +In a production cluster, you probably want to assign different roles to the nodes. +This can be achieved by creating multiple role groups and configuring their node roles. +The node roles configured at the role group level override the ones from the role level. + +For instance, if you want to deploy https://docs.opensearch.org/docs/latest/tuning-your-cluster/[the sample cluster from the OpenSearch documentation] that has one dedicated cluster manager node, one dedicated coordinating node and two data nodes, you could configure the role groups as follows: + +[source,yaml] +---- +nodes: + roleGroups: + cluster-manager: + config: + nodeRoles: + - cluster_manager + replicas: 1 + coordinating: + config: + nodeRoles: + - coordinating_only + replicas: 1 + data: + config: + nodeRoles: + - data + - ingest + replicas: 2 +---- + +The following roles are currently supported by the operator: + +* `cluster_manager` +* `coordinating_only` +* `data` +* `ingest` +* `remote_cluster_client` +* `search` +* `warm` + +We refer to https://docs.opensearch.org/docs/latest/install-and-configure/configuring-opensearch/configuration-system/[the OpenSearch documentation] for an exlanation of the roles. diff --git a/docs/modules/opensearch/partials/nav.adoc b/docs/modules/opensearch/partials/nav.adoc index be4d1a5..c21e7d5 100644 --- a/docs/modules/opensearch/partials/nav.adoc +++ b/docs/modules/opensearch/partials/nav.adoc @@ -2,6 +2,7 @@ ** xref:opensearch:getting_started/installation.adoc[] ** xref:opensearch:getting_started/first_steps.adoc[] * xref:opensearch:usage-guide/index.adoc[] +** xref:opensearch:usage-guide/node-roles.adoc[] ** xref:opensearch:usage-guide/storage-resource-configuration.adoc[] ** xref:opensearch:usage-guide/configuration-environment-overrides.adoc[] ** xref:opensearch:usage-guide/operations/index.adoc[] From 3327c559fa2b792a5e74de01f4c52f79eec52cd5 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Tue, 22 Jul 2025 18:37:25 +0200 Subject: [PATCH 11/18] feat: Add node role coordinating_only --- deploy/helm/opensearch-operator/crds/crds.yaml | 6 ++++-- rust/operator-binary/src/crd/mod.rs | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/deploy/helm/opensearch-operator/crds/crds.yaml b/deploy/helm/opensearch-operator/crds/crds.yaml index 6772c15..e67d288 100644 --- a/deploy/helm/opensearch-operator/crds/crds.yaml +++ b/deploy/helm/opensearch-operator/crds/crds.yaml @@ -136,9 +136,10 @@ spec: nodeRoles: items: enum: + - cluster_manager + - coordinating_only - data - ingest - - cluster_manager - remote_cluster_client - warm - search @@ -327,9 +328,10 @@ spec: nodeRoles: items: enum: + - cluster_manager + - coordinating_only - data - ingest - - cluster_manager - remote_cluster_client - warm - search diff --git a/rust/operator-binary/src/crd/mod.rs b/rust/operator-binary/src/crd/mod.rs index 1c5c69d..ce1eabb 100644 --- a/rust/operator-binary/src/crd/mod.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -84,12 +84,14 @@ pub mod versioned { // see https://github.com/opensearch-project/OpenSearch/blob/3.0.0/server/src/main/java/org/opensearch/cluster/node/DiscoveryNodeRole.java#L341-L346 // TODO https://github.com/Peternator7/strum/issues/113 + #[strum(serialize = "cluster_manager")] + ClusterManager, + #[strum(serialize = "coordinating_only")] + CoordinatingOnly, #[strum(serialize = "data")] Data, #[strum(serialize = "ingest")] Ingest, - #[strum(serialize = "cluster_manager")] - ClusterManager, #[strum(serialize = "remote_cluster_client")] RemoteClusterClient, #[strum(serialize = "warm")] From ce184d26ed9b603b2699b669912cdf0e79dc258a Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Wed, 23 Jul 2025 10:26:54 +0200 Subject: [PATCH 12/18] doc: Fix typos and improve style --- .../getting_started/getting_started.sh | 3 --- .../getting_started/getting_started.sh.j2 | 3 --- .../pages/getting_started/first_steps.adoc | 4 +-- .../pages/getting_started/index.adoc | 6 ++--- .../pages/getting_started/installation.adoc | 2 +- docs/modules/opensearch/pages/index.adoc | 10 +++---- .../opensearch/pages/reference/crds.adoc | 2 +- .../reference/environment-variables.adoc | 26 ------------------- .../configuration-environment-overrides.adoc | 2 +- .../opensearch/pages/usage-guide/index.adoc | 2 +- .../pages/usage-guide/node-roles.adoc | 4 +-- .../operations/pod-disruptions.adoc | 2 +- .../storage-resource-configuration.adoc | 6 ++--- 13 files changed, 20 insertions(+), 52 deletions(-) diff --git a/docs/modules/opensearch/examples/getting_started/getting_started.sh b/docs/modules/opensearch/examples/getting_started/getting_started.sh index bbba1b7..2742a07 100755 --- a/docs/modules/opensearch/examples/getting_started/getting_started.sh +++ b/docs/modules/opensearch/examples/getting_started/getting_started.sh @@ -4,9 +4,6 @@ set -euo pipefail # DO NOT EDIT THE SCRIPT # Instead, update the j2 template, and regenerate it for dev with `make render-docs`. -# TODO (@NickLarsenNZ): Use bitnami/postgres chart, and add version var to the above list -# See similar changes in: https://github.com/stackabletech/hive-operator/pull/489/commits/8189f196f018c009370ae9b07a3f9609ee2e8681 - # This script contains all the code snippets from the guide, as well as some assert tests # to test if the instructions in the guide work. The user *could* use it, but it is intended # for testing only. diff --git a/docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 b/docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 index 332bebc..5ae3630 100755 --- a/docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 +++ b/docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 @@ -4,9 +4,6 @@ set -euo pipefail # DO NOT EDIT THE SCRIPT # Instead, update the j2 template, and regenerate it for dev with `make render-docs`. -# TODO (@NickLarsenNZ): Use bitnami/postgres chart, and add version var to the above list -# See similar changes in: https://github.com/stackabletech/hive-operator/pull/489/commits/8189f196f018c009370ae9b07a3f9609ee2e8681 - # This script contains all the code snippets from the guide, as well as some assert tests # to test if the instructions in the guide work. The user *could* use it, but it is intended # for testing only. diff --git a/docs/modules/opensearch/pages/getting_started/first_steps.adoc b/docs/modules/opensearch/pages/getting_started/first_steps.adoc index b10ed7b..87d5e48 100644 --- a/docs/modules/opensearch/pages/getting_started/first_steps.adoc +++ b/docs/modules/opensearch/pages/getting_started/first_steps.adoc @@ -1,6 +1,6 @@ = First steps -Once you have followed the steps in xref:getting_started/installation.adoc[] for the Operator and its dependencies, you will now go through the steps to set up and connect to a OpenSearch instance. +Once you have followed the steps in xref:getting_started/installation.adoc[] for the operator and its dependencies, you will now go through the steps to set up and connect to a OpenSearch instance. == Security plugin configuration @@ -43,7 +43,7 @@ And apply it: include::example$getting_started/getting_started.sh[tag=apply-cluster] ---- -`metadata.name` contains the name of the Superset cluster. +`metadata.name` contains the name of the OpenSearch cluster. The previously created security plugin configuration must be referenced via `podOverrides`. diff --git a/docs/modules/opensearch/pages/getting_started/index.adoc b/docs/modules/opensearch/pages/getting_started/index.adoc index d2807bc..1787355 100644 --- a/docs/modules/opensearch/pages/getting_started/index.adoc +++ b/docs/modules/opensearch/pages/getting_started/index.adoc @@ -1,7 +1,7 @@ = Getting started This guide helps you get started with OpenSearch using the Stackable Operator. -It covers the installation of the operator and its dependencies, setting up your first OpenSearch instance, connecting to it, and exploring sample data. +It covers the installation of the operator and its dependencies, setting up your first OpenSearch instance, connecting to it, and ingest and search for data. == Prerequisites @@ -20,5 +20,5 @@ Resource sizing depends on cluster type(s), usage and scope, but as a starting p The guide is divided into two steps: -* xref:getting_started/installation.adoc[Installing the Operators]. -* xref:getting_started/first_steps.adoc[Setting up the OpenSearch instance and connecting to it]. +* xref:getting_started/installation.adoc[Installing the Operators] +* xref:getting_started/first_steps.adoc[Setting up the OpenSearch instance and connecting to it] diff --git a/docs/modules/opensearch/pages/getting_started/installation.adoc b/docs/modules/opensearch/pages/getting_started/installation.adoc index 48131a3..2dd6a3f 100644 --- a/docs/modules/opensearch/pages/getting_started/installation.adoc +++ b/docs/modules/opensearch/pages/getting_started/installation.adoc @@ -52,4 +52,4 @@ You are now ready to deploy OpenSearch in Kubernetes. == What's next -xref:getting_started/first_steps.adoc[Deploy an OpenSearch instance and connect to it]. +xref:getting_started/first_steps.adoc[Deploy an OpenSearch instance and connect to it] diff --git a/docs/modules/opensearch/pages/index.adoc b/docs/modules/opensearch/pages/index.adoc index c02a101..6999773 100644 --- a/docs/modules/opensearch/pages/index.adoc +++ b/docs/modules/opensearch/pages/index.adoc @@ -20,7 +20,7 @@ This operator helps you manage your OpenSearch instances on Kubernetes efficient == Getting started Get started using OpenSearch with the Stackable operator by following the xref:getting_started/index.adoc[]. -It guides you through installing the operator, connecting to your OpenSearch instance and analyzing some preloaded example data. +It guides you through installing the operator, connecting to your OpenSearch instance and using the REST API to ingest and search for data. == Operator model @@ -30,7 +30,7 @@ It creates a number of different Kubernetes resources based on this {crs}[custom === Custom resources The OpenSearchCluster is the resource for the configuration of the OpenSearch instance. -The resource defines only one xref:concepts:roles-and-role-groups.adoc[role], the `nodes`. +The resource defines only one xref:concepts:roles-and-role-groups.adoc#roles[role], the `nodes`. The various configuration options are explained in the xref:usage-guide/index.adoc[]. It helps you tune your cluster to your needs by configuring xref:usage-guide/storage-resource-configuration.adoc[resource usage] and more. @@ -42,10 +42,10 @@ image::opensearch_overview.drawio.svg[A diagram depicting the Kubernetes resourc The diagram above depicts all the Kubernetes resources created by the operator, and how they relate to each other. -For every xref:concepts:roles-and-role-groups.adoc#_role_groups[role group] you define, the operator creates a StatefulSet with the amount of replicas defined in the RoleGroup. -For every RoleGroup, a Service is created, as well as one for the whole cluster that references the cluster manager nodes. +For every xref:concepts:roles-and-role-groups.adoc#role-groups[role group] you define, the operator creates a StatefulSet with the amount of replicas defined in the role group. +For every role group, a Service is created, as well as one for the whole cluster that references the cluster manager nodes. -Additionally, a ConfigMap is created for each RoleGroup. +Additionally, a ConfigMap is created for each role group. These ConfigMaps contain configuration files like `opensearch.yml`. == Supported versions diff --git a/docs/modules/opensearch/pages/reference/crds.adoc b/docs/modules/opensearch/pages/reference/crds.adoc index 1ee275c..150f51b 100644 --- a/docs/modules/opensearch/pages/reference/crds.adoc +++ b/docs/modules/opensearch/pages/reference/crds.adoc @@ -1,3 +1,3 @@ = CRD Reference -Find all CRD reference for the Stackable Operator for OpenSearch at: {crd-docs-base-url}/opensearch-operator/{crd-docs-version}. +Find all CRD references for the Stackable Operator for OpenSearch at: {crd-docs-base-url}/opensearch-operator/{crd-docs-version} diff --git a/docs/modules/opensearch/pages/reference/environment-variables.adoc b/docs/modules/opensearch/pages/reference/environment-variables.adoc index 8eed349..60bca30 100644 --- a/docs/modules/opensearch/pages/reference/environment-variables.adoc +++ b/docs/modules/opensearch/pages/reference/environment-variables.adoc @@ -33,32 +33,6 @@ docker run \ oci.stackable.tech/sdp/opensearch-operator:0.0.0-dev ---- -== PRODUCT_CONFIG - -*Default value*: `/etc/stackable/opensearch-operator/config-spec/properties.yaml` - -*Required*: false - -*Multiple values*: false - -[source] ----- -export PRODUCT_CONFIG=/foo/bar/properties.yaml -stackable-opensearch-operator run ----- - -or via docker: - ----- -docker run \ - --name opensearch-operator \ - --network host \ - --env KUBECONFIG=/home/stackable/.kube/config \ - --env PRODUCT_CONFIG=/my/product/config.yaml \ - --mount type=bind,source="$HOME/.kube/config",target="/home/stackable/.kube/config" \ - oci.stackable.tech/sdp/opensearch-operator:0.0.0-dev ----- - == WATCH_NAMESPACE *Default value*: All namespaces diff --git a/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc b/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc index 000c200..942e69f 100644 --- a/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc +++ b/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc @@ -9,7 +9,7 @@ IMPORTANT: Overriding certain properties which are set by the operator (such as == Configuration Properties For a role or role group, at the same level of `config`, you can specify `configOverrides` for the `opensearch.yml`. -For example, if you want to enable role-based access to the REST management API for the role `all_access`, then adapt the `nodes` section of the cluster resource as follows: +For example, if you want to enable role-based access to the REST management API for the role `all_access`, then adapt the cluster resource as follows: [source,yaml] ---- diff --git a/docs/modules/opensearch/pages/usage-guide/index.adoc b/docs/modules/opensearch/pages/usage-guide/index.adoc index 7f9816a..bba2c8e 100644 --- a/docs/modules/opensearch/pages/usage-guide/index.adoc +++ b/docs/modules/opensearch/pages/usage-guide/index.adoc @@ -2,6 +2,6 @@ :page-aliases: usage.doc :description: OpenSearch usage guide: configure resources and override configurations. -The usage guide covers various aspects of configuring OpenSearch and interconnection with other tools. +The usage guide covers various aspects of configuring OpenSearch. Learn about xref:usage-guide/node-roles.adoc[] or defining the amount of xref:usage-guide/storage-resource-configuration.adoc[resources] OpenSearch uses. diff --git a/docs/modules/opensearch/pages/usage-guide/node-roles.adoc b/docs/modules/opensearch/pages/usage-guide/node-roles.adoc index d7c19ec..4734604 100644 --- a/docs/modules/opensearch/pages/usage-guide/node-roles.adoc +++ b/docs/modules/opensearch/pages/usage-guide/node-roles.adoc @@ -4,7 +4,7 @@ An OpenSearch node can fulfill different roles, e.g. it can manage the operation of a cluster or store and search data. All nodes are defined under the role `nodes`. -The role config already defaults to a set of node roles: +The role configuration already defaults to a set of node roles: [source,yaml] ---- @@ -65,4 +65,4 @@ The following roles are currently supported by the operator: * `search` * `warm` -We refer to https://docs.opensearch.org/docs/latest/install-and-configure/configuring-opensearch/configuration-system/[the OpenSearch documentation] for an exlanation of the roles. +We refer to https://docs.opensearch.org/docs/latest/install-and-configure/configuring-opensearch/configuration-system/[the OpenSearch documentation] for an explanation of the roles. diff --git a/docs/modules/opensearch/pages/usage-guide/operations/pod-disruptions.adoc b/docs/modules/opensearch/pages/usage-guide/operations/pod-disruptions.adoc index dfa6daf..82c059f 100644 --- a/docs/modules/opensearch/pages/usage-guide/operations/pod-disruptions.adoc +++ b/docs/modules/opensearch/pages/usage-guide/operations/pod-disruptions.adoc @@ -6,4 +6,4 @@ Unless you configure something else or disable the provided PodDisruptionBudgets == Nodes -The provided PDBs only allow a single node to be offline at any given time, regardless of the number of replicas or `roleGroups`. +The provided PDBs only allow a single node to be offline at any given time, regardless of the number of replicas or role groups. diff --git a/docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc b/docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc index 7652bd3..926756b 100644 --- a/docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc +++ b/docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc @@ -9,7 +9,7 @@ You can mount volumes where data is stored by specifying https://kubernetes.io/d ---- nodes: roleGroups: - default: + data: config: resources: storage: @@ -17,11 +17,11 @@ nodes: capacity: 50Gi ---- -In the above example, all OpenSearch nodes in the default role group store data (the location of the property `path.data`) on a `50Gi` volume. +In the example above, all OpenSearch nodes in the data role group store data (the location of the property `path.data`) on a `50Gi` volume. If nothing is configured in the custom resource for a certain role group, then by default each Pod has a `8Gi` large local volume mount for the data location. -On role groups with only the `cluster_manager` role, you probably want to decrease this value, but increase it on role groups with the `data` role. +On role groups with only the `cluster_manager` node role, you probably want to decrease this value, but increase it on role groups with the `data` node role. == Resource Requests From 7a6dbd551998b7c43f94ffa2a5b9be899f7912fb Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Wed, 23 Jul 2025 14:27:59 +0200 Subject: [PATCH 13/18] doc: Fix typo Co-authored-by: Andrew Kenworthy <1712947+adwk67@users.noreply.github.com> --- docs/modules/opensearch/pages/getting_started/first_steps.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/opensearch/pages/getting_started/first_steps.adoc b/docs/modules/opensearch/pages/getting_started/first_steps.adoc index 87d5e48..d0475af 100644 --- a/docs/modules/opensearch/pages/getting_started/first_steps.adoc +++ b/docs/modules/opensearch/pages/getting_started/first_steps.adoc @@ -1,6 +1,6 @@ = First steps -Once you have followed the steps in xref:getting_started/installation.adoc[] for the operator and its dependencies, you will now go through the steps to set up and connect to a OpenSearch instance. +Once you have followed the steps in xref:getting_started/installation.adoc[] for the operator and its dependencies, you will now go through the steps to set up and connect to an OpenSearch instance. == Security plugin configuration From 3254e23eb2b67236c6838084251646c3fb6cc342 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Wed, 23 Jul 2025 14:28:33 +0200 Subject: [PATCH 14/18] doc: Fix typo Co-authored-by: Andrew Kenworthy <1712947+adwk67@users.noreply.github.com> --- docs/modules/opensearch/pages/getting_started/index.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/opensearch/pages/getting_started/index.adoc b/docs/modules/opensearch/pages/getting_started/index.adoc index 1787355..f52430c 100644 --- a/docs/modules/opensearch/pages/getting_started/index.adoc +++ b/docs/modules/opensearch/pages/getting_started/index.adoc @@ -1,7 +1,7 @@ = Getting started This guide helps you get started with OpenSearch using the Stackable Operator. -It covers the installation of the operator and its dependencies, setting up your first OpenSearch instance, connecting to it, and ingest and search for data. +It covers the installation of the operator and its dependencies, setting up your first OpenSearch instance, connecting to it, and ingesting and searching for data. == Prerequisites From c63f5e512726173b2610f7269b7493d0b17e8939 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Wed, 23 Jul 2025 14:30:17 +0200 Subject: [PATCH 15/18] doc: Fix typo Co-authored-by: Andrew Kenworthy <1712947+adwk67@users.noreply.github.com> --- .../pages/usage-guide/configuration-environment-overrides.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc b/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc index 942e69f..9b373fc 100644 --- a/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc +++ b/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc @@ -37,7 +37,7 @@ nodes: All override property values must be strings. They are added unchanged to the configuration file. -So care must be taken to produce a valid configuration. +Care must be taken to produce a valid configuration. For a list of configuration options, we refer to the https://docs.opensearch.org/docs/latest/install-and-configure/configuring-opensearch/index/[Configuring OpenSearch] section in the OpenSearch documentation. From bf8004ed43fdbc492d5b13eef13e9817411bc5df Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Wed, 23 Jul 2025 14:30:38 +0200 Subject: [PATCH 16/18] doc: Fix typo Co-authored-by: Andrew Kenworthy <1712947+adwk67@users.noreply.github.com> --- .../pages/usage-guide/storage-resource-configuration.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc b/docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc index 926756b..5991474 100644 --- a/docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc +++ b/docs/modules/opensearch/pages/usage-guide/storage-resource-configuration.adoc @@ -19,7 +19,7 @@ nodes: In the example above, all OpenSearch nodes in the data role group store data (the location of the property `path.data`) on a `50Gi` volume. -If nothing is configured in the custom resource for a certain role group, then by default each Pod has a `8Gi` large local volume mount for the data location. +If nothing is configured in the custom resource for a certain role group, then by default each Pod has an `8Gi` large local volume mount for the data location. On role groups with only the `cluster_manager` node role, you probably want to decrease this value, but increase it on role groups with the `data` node role. From dcac90f66e2f042c5672b16cac1fbd6447b8a2c6 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Wed, 23 Jul 2025 14:31:58 +0200 Subject: [PATCH 17/18] doc: Increase timeout --- .../opensearch/examples/getting_started/getting_started.sh | 2 +- .../opensearch/examples/getting_started/getting_started.sh.j2 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/modules/opensearch/examples/getting_started/getting_started.sh b/docs/modules/opensearch/examples/getting_started/getting_started.sh index 2742a07..3bccc1f 100755 --- a/docs/modules/opensearch/examples/getting_started/getting_started.sh +++ b/docs/modules/opensearch/examples/getting_started/getting_started.sh @@ -69,7 +69,7 @@ done echo "Waiting on OpenSearch StatefulSet ..." # tag::await-cluster[] -kubectl rollout status --watch statefulset/simple-opensearch-nodes-default --timeout 300s +kubectl rollout status --watch statefulset/simple-opensearch-nodes-default --timeout 600s # end::await-cluster[] # wait a bit for the port to open diff --git a/docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 b/docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 index 5ae3630..8be395c 100755 --- a/docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 +++ b/docs/modules/opensearch/examples/getting_started/getting_started.sh.j2 @@ -69,7 +69,7 @@ done echo "Waiting on OpenSearch StatefulSet ..." # tag::await-cluster[] -kubectl rollout status --watch statefulset/simple-opensearch-nodes-default --timeout 300s +kubectl rollout status --watch statefulset/simple-opensearch-nodes-default --timeout 600s # end::await-cluster[] # wait a bit for the port to open From f0511ad5f3755a298828e4675a3b966209220dbe Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Wed, 23 Jul 2025 14:47:20 +0200 Subject: [PATCH 18/18] doc: Clarify the term "role" --- .../pages/usage-guide/configuration-environment-overrides.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc b/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc index 9b373fc..ec12a53 100644 --- a/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc +++ b/docs/modules/opensearch/pages/usage-guide/configuration-environment-overrides.adoc @@ -9,7 +9,7 @@ IMPORTANT: Overriding certain properties which are set by the operator (such as == Configuration Properties For a role or role group, at the same level of `config`, you can specify `configOverrides` for the `opensearch.yml`. -For example, if you want to enable role-based access to the REST management API for the role `all_access`, then adapt the cluster resource as follows: +For example, if you want to enable role-based access to the REST management API for the role `all_access` (not to be confused with the OpenSearch node role), then adapt the cluster resource as follows: [source,yaml] ----