Files
automations/deployments/ergo/deploy.sh
T
57_WolveandClaude Opus 5 f916eb549a feat(ergo): ergoctl oper certfp, plus polish from the first live deploy
Adds client-certificate authentication for operators, so an oper can be
identified by the SHA-256 fingerprint of their TLS client certificate instead of
a typed password:

  ergoctl oper certfp <name> <fingerprint|nick> [--auto] [--clear]

The fingerprint can be given directly or read off a connected user over IRC
(276 RPL_WHOISCERTFP). Without --auto Ergo requires BOTH the certificate and the
password -- a second factor; with --auto the password is removed and the
certificate alone grants oper on connect.

It refuses to do this to the 'admin' oper, which matters: ergoctl authenticates
as admin over the loopback PLAINTEXT listener, which presents no client
certificate, and Ergo requires a configured certfp to match. Setting one there
would lock ergoctl -- and the scheduled jobs that use it -- out of the server
permanently.

Polish from the first real deploy on irc-1.srvno.de:

- deploy.sh no longer restarts Caddy on a first deploy. The Caddyfile compare
  treated "destination does not exist" as a change, so Caddy was recreated
  seconds after starting, while the initial ACME order was in flight.
- ergoctl status no longer prints the raw leading parameters of the 265/266
  LUSERS numerics ("1 1 Current local users 1, max 1"), which duplicate the
  counts already in the text. 252/254 keep theirs, where it is the only count.
- ergoctl oper list now shows which opers have a certfp and which are auto.

Verified: seven local suites pass, including new coverage for fingerprint
normalisation (colons and uppercase), insertion into the correct oper block
without touching siblings, replace-not-duplicate, the --auto and --clear paths,
276 parsing, and the admin guard.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 15:34:32 -05:00

1406 lines
90 KiB
Bash

#!/usr/bin/env bash
#
# deploy.sh -- deploy Ergo (IRC server) behind Caddy (Let's Encrypt) on Alpine,
# Debian or Alma. Single-node; runs as root.
#
# What this does:
# 1. Installs docker + compose (and openssl/jq/curl) if missing; creates the
# `ergo` system user the container runs as.
# 2. Lays down the stack in $STACK_DIR: docker-compose.yml, caddy/etc/Caddyfile,
# update.sh, ergoctl (+ /usr/local/bin/ergoctl wrapper), ergolib.sh.
# 3. Seeds .env on first run, pinning ERGO_TAG to the newest release.
# 4. Generates ircd/ircd.yaml ONCE from the pulled image's own default config
# (server name, network name, listeners, websocket origin, message-history
# backend, admin oper with a random password saved to secrets/admin.pass)
# and validates it with a throwaway `ergo run --smoke` before anything
# starts. Never rewritten.
# 5. Opens 80/443/6697 (+6667 with PLAINTEXT=1) on the host firewall. Both
# containers use host networking, so this firewall really applies.
# 6. Pulls images, validates the Caddyfile, brings the stack up, waits for
# health, copies Caddy's Let's Encrypt cert into ircd/ and rehashes Ergo.
# 7. Schedules update.sh: certsync every 15 min, update check daily.
#
# Idempotent: re-run to apply compose/Caddyfile changes or pull images. It never
# touches ircd/ircd.yaml, secrets/ or caddy/etc/conf.d/; in .env it only refreshes
# ERGO_UID/GID, re-pins a floating ERGO_TAG, and writes back settings you passed
# explicitly on this run (everything else is adopted FROM .env, not overwritten).
#
# Self-contained: docker-compose.yml, docker-compose.postgres.yml, Caddyfile,
# conf.d-readme.caddy, ergo.motd, .env.example, ergolib.sh, update.sh and ergoctl
# are embedded as a base64 tar.gz at the bottom of this file. Rebuild with
# build.sh after editing them.
#
# Usage:
# bash deploy.sh # interactive prompts
# ERGO_DOMAIN=irc.example.com ACME_EMAIL=me@x.com NETWORK_NAME=MyNet \
# SKIP_PROMPTS=1 bash deploy.sh # non-interactive
# HISTORY=postgres bash deploy.sh # FIRST deploy only: persistent history in
# # PostgreSQL (default sqlite; off = RAM only)
# HISTORY_EXPIRE=90d bash deploy.sh # how long messages are kept (default 30d)
# PLAINTEXT=1 bash deploy.sh # FIRST deploy only: also serve plaintext
# # :6667 publicly (+STS). Fixed thereafter.
# ERGO_TAG=v2.19.1 bash deploy.sh # pin a release on the FIRST deploy; after
# # that use: ergoctl update update
# UPDATE_POLICY=security bash deploy.sh # also latest | off
# ERGO_AUTOUPDATE=0 bash deploy.sh # install update.sh but don't schedule the
# # daily update (certsync is still scheduled)
# CERT_WAIT=0 bash deploy.sh # don't wait for the first LE cert
# SKIP_DOCKER_INSTALL=1 bash deploy.sh
set -euo pipefail
: "${STACK_DIR:=/srv/ergo}"
: "${SKIP_DOCKER_INSTALL:=0}"
: "${FORCE:=0}"
: "${SKIP_PROMPTS:=0}"
[[ "$SKIP_PROMPTS" == "1" ]] && FORCE=1
: "${ERGO_DOMAIN:=}"
: "${ACME_EMAIL:=}"
: "${NETWORK_NAME:=}"
: "${ERGO_IMAGE:=ghcr.io/ergochat/ergo}"
: "${ERGO_TAG:=}" # blank = pin the newest release
# Remember which settings the caller actually passed, BEFORE the defaults below
# hide that. On a re-run the rest come from the existing .env instead, so a
# plain `bash deploy.sh` never silently reverts a deployed stack's settings.
# (`|| true` on the trailing `&&`s below: a false test makes the whole list
# return 1, which aborts the script under `set -e` if it ever ends a block.)
EXPLICIT=""
for _k in ERGO_TAG PLAINTEXT HISTORY UPDATE_POLICY FORCE_UPDATE UPDATE_GRACE CADDY_AUTOUPDATE CADDY_TAG; do
[[ -n "${!_k:-}" ]] && EXPLICIT="${EXPLICIT} ${_k}" || true
done
: "${PLAINTEXT:=0}"
: "${HISTORY:=sqlite}" # sqlite | postgres | off (see the README)
# How long messages are kept. Upstream's 1w applies to PERSISTENT storage too --
# it deletes, it is not just a query cutoff -- so persistence with the shipped
# default buys only a week. Retention is a policy (and privacy) decision: raise
# or lower it here, or later with 'ergoctl edit'.
: "${HISTORY_EXPIRE:=30d}"
: "${POSTGRES_TAG:=17-alpine}" # major version is PINNED; update.sh never moves it
: "${POSTGRES_USER:=ergo}"
: "${POSTGRES_DB:=ergo_history}"
: "${POSTGRES_PORT:=5432}"
: "${UPDATE_POLICY:=latest}"
: "${FORCE_UPDATE:=0}"
: "${UPDATE_GRACE:=60}"
: "${CADDY_AUTOUPDATE:=0}"
: "${CADDY_TAG:=2-alpine}"
: "${ERGO_AUTOUPDATE:=1}" # 0 = install update.sh but don't schedule the daily update
: "${CERT_WAIT:=180}" # seconds to wait for Caddy's first Let's Encrypt cert
log() { printf '\033[1;32m[+]\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m[!]\033[0m %s\n' "$*" >&2; }
die() { printf '\033[1;31m[x]\033[0m %s\n' "$*" >&2; exit 1; }
[[ $EUID -eq 0 ]] || die "Run as root."
# ---------------------------------------------------------------------------
# Extract the embedded archive; ergolib.sh (shared helpers) comes from it.
# ---------------------------------------------------------------------------
SCRIPT_DIR=$(mktemp -d -t ergo-deploy.XXXXXX)
trap 'rm -rf "$SCRIPT_DIR"' EXIT
extract_archive() {
grep -a -A 9999999 '^__ARCHIVE_BELOW__$' "$0" \
| tail -n +2 \
| base64 -d \
| tar -xz -C "$SCRIPT_DIR"
}
if grep -q -a '^__ARCHIVE_BELOW__$' "$0"; then
log "Extracting embedded deployment files..."
extract_archive
else
die "No embedded archive found. Run build.sh to embed deployment files."
fi
EMBEDDED=(docker-compose.yml docker-compose.postgres.yml Caddyfile conf.d-readme.caddy ergo.motd .env.example ergolib.sh update.sh ergoctl)
for f in "${EMBEDDED[@]}"; do
[[ -f "$SCRIPT_DIR/$f" ]] || die "Embedded archive missing $f"
done
# shellcheck source=ergolib.sh
. "$SCRIPT_DIR/ergolib.sh"
ergo_set_paths
# ---------------------------------------------------------------------------
# Host packages + Docker (deploy-only helpers; ergolib has the rest)
# ---------------------------------------------------------------------------
pkg_install() { # best-effort install across the three families
case "$(osfam)" in
alpine) apk add -q "$@" || true ;;
debian) DEBIAN_FRONTEND=noninteractive apt-get install -y -qq "$@" || true ;;
rhel) dnf install -y -q "$@" || true ;;
esac
}
install_docker() {
if command -v docker >/dev/null 2>&1; then
log "Docker already installed: $(docker --version)"
else
log "Installing Docker (OS: $(osfam))..."
case "$(osfam)" in
alpine) apk add -q docker docker-cli-compose openrc ;;
debian|rhel) command -v curl >/dev/null 2>&1 || pkg_install curl
curl -fsSL https://get.docker.com | sh ;;
*) die "Unsupported OS for auto Docker install. Set SKIP_DOCKER_INSTALL=1 and install Docker yourself." ;;
esac
fi
if command -v rc-update >/dev/null 2>&1; then
rc-update add docker default >/dev/null 2>&1 || true
rc-service docker status >/dev/null 2>&1 || rc-service docker start
elif command -v systemctl >/dev/null 2>&1; then
systemctl enable --now docker >/dev/null 2>&1 || systemctl start docker || true
fi
# dockerd may return before its socket listens (esp. OpenRC); don't race it.
local i
for i in $(seq 1 30); do
docker info >/dev/null 2>&1 && return
sleep 1
done
warn "Docker daemon not ready after 30s; continuing (compose may fail -- check 'docker info')."
}
# The container runs as this host user (no login, no home). It owns ./ircd so
# the DB, config and the copied TLS key are never readable by other local users.
ensure_ergo_user() {
if ! getent passwd ergo >/dev/null 2>&1; then
log "Creating system user 'ergo' (owns $IRCD_DIR; the container runs as it)..."
case "$(osfam)" in
alpine) getent group ergo >/dev/null 2>&1 || addgroup -S ergo
adduser -S -D -H -G ergo -s /sbin/nologin -g "Ergo IRC server" ergo ;;
*) useradd -r -M -s /usr/sbin/nologin -d /nonexistent -c "Ergo IRC server" ergo 2>/dev/null \
|| useradd -r -M -s /sbin/nologin -c "Ergo IRC server" ergo ;;
esac
fi
ERGO_UID="$(id -u ergo)"; ERGO_GID="$(id -g ergo)"
}
open_ports() {
# Host networking: these ports are bound on the host itself, so the INPUT
# firewall genuinely governs them (unlike Docker-published ports).
local ports=(80/tcp 443/tcp 6697/tcp)
[[ "$PLAINTEXT" == "1" ]] && ports+=(6667/tcp)
# ufw and firewalld are additive: unlike the repo's declarative ports.d
# engine they never drop a port that left the list, so turning PLAINTEXT
# back off would leave 6667 open. Revoke it explicitly.
if [[ "$PLAINTEXT" != "1" ]]; then
if command -v ufw >/dev/null 2>&1 && ufw status 2>/dev/null | grep -q '^Status: active'; then
ufw status 2>/dev/null | grep -q '^6667/tcp' && { log "Closing 6667/tcp in ufw (PLAINTEXT=0)..."; ufw delete allow 6667/tcp >/dev/null 2>&1 || true; }
elif command -v firewall-cmd >/dev/null 2>&1 && firewall-cmd --state >/dev/null 2>&1; then
if firewall-cmd --query-port=6667/tcp --permanent >/dev/null 2>&1; then
log "Closing 6667/tcp in firewalld (PLAINTEXT=0)..."
firewall-cmd -q --remove-port=6667/tcp --permanent || true; firewall-cmd -q --reload || true
fi
fi
fi
if [[ -d /etc/firewall/ports.d && -x /usr/local/sbin/firewall-apply ]]; then
log "Registering ${ports[*]} with the host firewall..."
printf '%s\n' "${ports[@]}" > /etc/firewall/ports.d/ergo.rule
/usr/local/sbin/firewall-apply
elif command -v ufw >/dev/null 2>&1 && ufw status 2>/dev/null | grep -q '^Status: active'; then
log "ufw active -- allowing ${ports[*]}..."
local p; for p in "${ports[@]}"; do ufw allow "$p" >/dev/null; done
elif command -v firewall-cmd >/dev/null 2>&1 && firewall-cmd --state >/dev/null 2>&1; then
log "firewalld active -- allowing ${ports[*]}..."
local p; for p in "${ports[@]}"; do firewall-cmd -q --add-port="$p" --permanent; done
firewall-cmd -q --reload
else
warn "No managed host firewall found; make sure ${ports[*]} are reachable (and nothing else is)."
fi
}
# Anything already listening on our host ports (only checked while our own
# containers are not running -- on re-runs they hold the ports themselves).
check_ports_free() {
local listing p busy=""
listing="$(netstat -ltn 2>/dev/null || ss -ltn 2>/dev/null || true)"
[[ -n "$listing" ]] || return 0
for p in 80 443 6697 8097 6667; do
if printf '%s\n' "$listing" | grep -qE "[:.]${p}[[:space:]]"; then busy="${busy} ${p}"; fi
done
[[ -z "$busy" ]] || die "Ports already in use on this host:${busy}. Both containers use host networking, so this stack needs 80/443 (Caddy), 6697/6667/8097 (Ergo) to itself. Another Caddy stack on this box? Move it or this."
}
# ---------------------------------------------------------------------------
# Prompt for required vars, then normalise + validate them
# ---------------------------------------------------------------------------
prompt() { # <VAR> <message> [default]
local varname="$1" message="$2" def="${3:-}"
local -n ref="$varname"
if [[ -z "${ref:-}" ]]; then
if [[ "$SKIP_PROMPTS" == "1" ]]; then
[[ -n "$def" ]] && { ref="$def"; return 0; }
die "$varname required (set it in the environment; running with SKIP_PROMPTS=1)."
fi
if [[ -n "$def" ]]; then read -r -p "$message [$def]: " ref; ref="${ref:-$def}"
else read -r -p "$message: " ref; fi
[[ -n "$ref" ]] || die "$varname required."
fi
}
prompt ERGO_DOMAIN "Public hostname of the IRC server (e.g. irc.example.com)"
ERGO_DOMAIN="$(printf '%s' "$ERGO_DOMAIN" | tr 'A-Z' 'a-z' | sed -E 's#^https?://##; s#[/.]+$##')"
[[ "$ERGO_DOMAIN" =~ ^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$ ]] \
|| die "ERGO_DOMAIN '$ERGO_DOMAIN' is not a valid hostname."
prompt ACME_EMAIL "Let's Encrypt email"
prompt NETWORK_NAME "IRC network name (no spaces)" "$ERGO_DOMAIN"
[[ "$NETWORK_NAME" =~ ^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$ ]] \
|| die "NETWORK_NAME '$NETWORK_NAME' must be 1-64 chars of letters, digits, . _ - (no spaces: it is sent as an IRC parameter)."
[[ "$PLAINTEXT" == "0" || "$PLAINTEXT" == "1" ]] || die "PLAINTEXT must be 0 or 1."
case "$UPDATE_POLICY" in latest|security|off) ;; *) die "UPDATE_POLICY must be latest, security or off." ;; esac
case "$HISTORY" in sqlite|postgres|off) ;; *) die "HISTORY must be sqlite, postgres or off." ;; esac
# Re-run guard: server.name is immutable once Ergo has run with it, and the
# cert/websocket origin/Caddy site all derive from ERGO_DOMAIN.
if [[ -f "$IRCD_DIR/ircd.yaml" ]]; then
existing="$(yaml_server_name "$IRCD_DIR/ircd.yaml" || true)"
if [[ -n "$existing" && "$existing" != "$ERGO_DOMAIN" ]]; then
die "This stack is already deployed as '$existing' (ircd/ircd.yaml server.name) but ERGO_DOMAIN=$ERGO_DOMAIN. Ergo cannot rename a running server; re-run with ERGO_DOMAIN=$existing, or stop the stack, move $STACK_DIR away and deploy fresh."
fi
fi
# ---------------------------------------------------------------------------
# Re-run: adopt the deployed settings from .env
#
# Everything below (the firewall rule, the scheduled jobs, the summary) must
# describe the stack as deployed, not this shell's defaults. A setting the
# caller passed explicitly wins and is written back; PLAINTEXT is the exception,
# because the listener it selects lives in ircd.yaml, which is never rewritten.
# ---------------------------------------------------------------------------
if [[ -f "$ENV_FILE" ]]; then
for _k in PLAINTEXT HISTORY UPDATE_POLICY FORCE_UPDATE UPDATE_GRACE CADDY_AUTOUPDATE CADDY_TAG POSTGRES_TAG POSTGRES_USER POSTGRES_DB POSTGRES_PORT; do
_v="$(env_get "$_k")"
[[ -n "$_v" ]] || continue
if [[ " $EXPLICIT " == *" $_k "* ]]; then
[[ "${!_k}" == "$_v" ]] && continue
if [[ "$_k" == "HISTORY" ]]; then
die "This stack was deployed with HISTORY=${_v} and you passed HISTORY=${!_k}. The backend is recorded in ircd/ircd.yaml, which deploy.sh never rewrites, so re-running cannot switch it (and switching does not migrate existing messages). To change it: 'ergoctl history ${!_k}'."
fi
if [[ "$_k" == "PLAINTEXT" ]]; then
die "This stack was deployed with PLAINTEXT=${_v} and you passed PLAINTEXT=${!_k}. The listener is fixed in ircd/ircd.yaml, which deploy.sh never rewrites, so re-running cannot change it. To switch: edit the plaintext listener with 'ergoctl edit' ($( [[ "$_v" == 1 ]] && echo '":6667": -> "127.0.0.1:6667":' || echo '"127.0.0.1:6667": -> ":6667":' ) and server.sts.enabled), set PLAINTEXT=${!_k} in $ENV_FILE, run 'ergoctl restart', then re-run this script to fix the firewall."
fi
log "${_k}: ${_v} -> ${!_k} (updating $ENV_FILE)."
else
printf -v "$_k" '%s' "$_v"
fi
done
[[ "$PLAINTEXT" == "0" || "$PLAINTEXT" == "1" ]] || die "PLAINTEXT in $ENV_FILE must be 0 or 1 (found '$PLAINTEXT')."
case "$UPDATE_POLICY" in latest|security|off) ;; *) die "UPDATE_POLICY in $ENV_FILE must be latest, security or off (found '$UPDATE_POLICY')." ;; esac
fi
# ---------------------------------------------------------------------------
# Host prerequisites
# ---------------------------------------------------------------------------
[[ "$SKIP_DOCKER_INSTALL" == "1" ]] || install_docker
for tool in openssl jq curl; do
command -v "$tool" >/dev/null 2>&1 || { log "Installing $tool..."; pkg_install "$tool"; }
command -v "$tool" >/dev/null 2>&1 || die "$tool is required (certsync/updater); install it and re-run."
done
command -v docker >/dev/null 2>&1 || die "docker not found."
docker compose version >/dev/null 2>&1 || die "docker compose (v2 plugin) not found."
ensure_ergo_user
# Other host-network containers share Ergo's trust boundary (its loopback).
docker info >/dev/null 2>&1 || die "The Docker daemon is not running or not reachable (check 'docker info'). Start it and re-run."
others="$(docker ps -q 2>/dev/null | xargs -r docker inspect -f '{{.Name}} {{.HostConfig.NetworkMode}}' 2>/dev/null \
| awk '$2=="host" && $1!="/ergo" && $1!="/ergo-caddy" {print $1}' | tr '\n' ' ' || true)"
[[ -z "$others" ]] || warn "Other containers use host networking: ${others}-- they can reach Ergo's loopback listeners (see README: Security model)."
if [[ -z "$(dc ps -q 2>/dev/null || true)" ]]; then check_ports_free; fi
open_ports
# ---------------------------------------------------------------------------
# Stack directory + files
# ---------------------------------------------------------------------------
log "Setting up $STACK_DIR..."
install -d -m 0700 "$STACK_DIR" "$SECRETS_DIR" "$BACKUP_DIR" "$TEMPLATES_DIR" "$STATE_DIR"
install -d -m 0700 "$CADDY_DIR" "$CADDY_DIR/data" "$CADDY_DIR/config"
install -d -m 0755 "$CADDY_DIR/etc" "$CADDY_DIR/etc/conf.d"
install -m 0640 "$SCRIPT_DIR/docker-compose.yml" "$STACK_DIR/docker-compose.yml"
install -m 0640 "$SCRIPT_DIR/docker-compose.postgres.yml" "$STACK_DIR/docker-compose.postgres.yml"
# Caddy has no admin API here and bind-mounted file contents are not part of the
# compose config hash, so `up -d` alone would leave a changed Caddyfile unloaded.
# Only an ACTUAL change counts: on a first deploy the destination does not exist
# yet, and restarting Caddy seconds after it started would interrupt the very
# first ACME issuance for nothing.
CADDY_CHANGED=0
if [[ -f "$CADDY_DIR/etc/Caddyfile" ]] && ! cmp -s "$SCRIPT_DIR/Caddyfile" "$CADDY_DIR/etc/Caddyfile"; then
CADDY_CHANGED=1
fi
install -m 0644 "$SCRIPT_DIR/Caddyfile" "$CADDY_DIR/etc/Caddyfile"
[[ -e "$CADDY_DIR/etc/conf.d/00-readme.caddy" ]] || install -m 0644 "$SCRIPT_DIR/conf.d-readme.caddy" "$CADDY_DIR/etc/conf.d/00-readme.caddy"
install -m 0644 "$SCRIPT_DIR/ergolib.sh" "$STACK_DIR/ergolib.sh"
install -m 0750 "$SCRIPT_DIR/update.sh" "$STACK_DIR/update.sh"
install -m 0750 "$SCRIPT_DIR/ergoctl" "$STACK_DIR/ergoctl"
install -d -m 0755 /usr/local/bin
cat > /usr/local/bin/ergoctl <<EOF
#!/bin/sh
# Auto-generated by the Ergo deploy.sh -- runs the stack's admin CLI from anywhere.
exec bash "$STACK_DIR/ergoctl" "\$@"
EOF
chmod 0755 /usr/local/bin/ergoctl
install -d -m 0700 -o "$ERGO_UID" -g "$ERGO_GID" "$IRCD_DIR"
# Pin ERGO_TAG to the newest release so the running version is explicit.
if [[ -z "$ERGO_TAG" && -f "$ENV_FILE" ]]; then ERGO_TAG="$(env_get ERGO_TAG)"; fi
if [[ -z "$ERGO_TAG" || "$ERGO_TAG" == "latest" || "$ERGO_TAG" == "stable" ]]; then
if _t="$(ergo_latest_tag)"; then ERGO_TAG="$_t"; log "Pinned ERGO_TAG=${ERGO_TAG} (newest release)."
else warn "Could not resolve the newest release from GitHub; using tag 'stable' for now (update.sh will pin it)."; ERGO_TAG="stable"; fi
fi
[[ "$ERGO_TAG" == "stable" || "$ERGO_TAG" == v* ]] || ERGO_TAG="v${ERGO_TAG}" # ghcr tags carry the v
if [[ ! -f "$ENV_FILE" ]]; then
log "Seeding $ENV_FILE..."
install -m 0600 "$SCRIPT_DIR/.env.example" "$ENV_FILE"
env_set ERGO_DOMAIN "$ERGO_DOMAIN"
env_set ACME_EMAIL "$ACME_EMAIL"
env_set NETWORK_NAME "$NETWORK_NAME"
env_set ERGO_IMAGE "$ERGO_IMAGE"
env_set ERGO_TAG "$ERGO_TAG"
env_set PLAINTEXT "$PLAINTEXT"
env_set HISTORY "$HISTORY"
env_set UPDATE_POLICY "$UPDATE_POLICY"
env_set FORCE_UPDATE "$FORCE_UPDATE"
env_set UPDATE_GRACE "$UPDATE_GRACE"
env_set CADDY_AUTOUPDATE "$CADDY_AUTOUPDATE"
env_set CADDY_TAG "$CADDY_TAG"
else
log ".env exists; keeping its settings (ERGO_TAG=$(env_get ERGO_TAG))."
[[ "$(ergo_domain)" == "$ERGO_DOMAIN" ]] || die ".env has ERGO_DOMAIN=$(env_get ERGO_DOMAIN) but you passed $ERGO_DOMAIN -- the domain cannot change after the first deploy."
# Persist the settings the caller passed explicitly on this re-run.
for _k in PLAINTEXT UPDATE_POLICY FORCE_UPDATE UPDATE_GRACE CADDY_AUTOUPDATE CADDY_TAG; do
[[ " $EXPLICIT " == *" $_k "* ]] && env_set "$_k" "${!_k}" || true
done
# A floating tag ('stable', from a first deploy that could not reach GitHub)
# would let any pull change the running version with no pre-flight, snapshot
# or rollback. Pin it as soon as we can resolve a real release.
_envtag="$(env_get ERGO_TAG)"
if [[ "$ERGO_TAG" == v[0-9]* && "$ERGO_TAG" != "$_envtag" ]]; then
case "$_envtag" in
# Changing the version of a DEPLOYED stack here would swap the image
# with none of the updater's rails: no pre-flight against the live
# config, no database snapshot, no warning to connected users and no
# rollback if the new build never becomes healthy. Send them there.
v[0-9]*) die "This stack is pinned to ${_envtag} and you passed ERGO_TAG=${ERGO_TAG}. Re-running deploy.sh would swap the image with no pre-flight, no database snapshot and no rollback. Use: TARGET_VERSION=$(normver "$ERGO_TAG") ergoctl update update" ;;
*) env_set ERGO_TAG "$ERGO_TAG"; log "Pinned ERGO_TAG=${ERGO_TAG} (was '${_envtag}', which floats)." ;;
esac
fi
fi
env_set ERGO_UID "$ERGO_UID"
env_set ERGO_GID "$ERGO_GID"
ERGO_TAG="$(ergo_tag)"
IMAGE="$(ergo_image)"
# ---------------------------------------------------------------------------
# Persistent history backend
#
# Ergo's history is ON by default but lives in RAM, so it is lost on every
# restart -- including the ones this stack's updater performs. sqlite persists
# it in a file beside ircd.db with no extra moving parts; postgres adds a
# pinned container for people who want a real database.
# ---------------------------------------------------------------------------
if [[ "$HISTORY" != "off" ]]; then
# Both SQL history backends were added in Ergo 2.18.0.
_v="$(normver "$ERGO_TAG")"
if [[ -n "$_v" ]] && ! ver_ge "$_v" 2.18.0; then
die "HISTORY=$HISTORY needs Ergo 2.18.0 or newer (the SQL history backends were added there), but ERGO_TAG=$ERGO_TAG. Use HISTORY=off or a newer release."
fi
fi
if [[ "$HISTORY" == "postgres" ]]; then
env_set POSTGRES_TAG "$POSTGRES_TAG"
env_set POSTGRES_USER "$POSTGRES_USER"
env_set POSTGRES_DB "$POSTGRES_DB"
env_set POSTGRES_PORT "$POSTGRES_PORT"
# docker compose reads COMPOSE_FILE from .env, so every compose command in
# this stack picks up the overlay without needing extra flags.
env_set COMPOSE_FILE "docker-compose.yml:docker-compose.postgres.yml"
if [[ ! -f "$SECRETS_DIR/postgres.pass" ]]; then
log "Generating the PostgreSQL password (secrets/postgres.pass)..."
( umask 077; ergo_random_password 32 > "$SECRETS_DIR/postgres.pass" )
fi
chmod 0600 "$SECRETS_DIR/postgres.pass"
PG_PASS="$(cat "$SECRETS_DIR/postgres.pass")"
else
env_set COMPOSE_FILE "docker-compose.yml"
fi
missing=()
for var in ERGO_DOMAIN ACME_EMAIL NETWORK_NAME ERGO_TAG ERGO_UID ERGO_GID; do
grep -E "^${var}=.+$" "$ENV_FILE" >/dev/null || missing+=("$var")
done
(( ${#missing[@]} == 0 )) || die "Missing values in $ENV_FILE: ${missing[*]}"
# ---------------------------------------------------------------------------
# Pull images, validate the Caddyfile (static config -- no admin API needed)
# ---------------------------------------------------------------------------
cd "$STACK_DIR"
log "Pulling images ($IMAGE, caddy:$(env_get CADDY_TAG))..."
docker compose pull
log "Validating the Caddyfile..."
# A one-off `compose run` container gets a generated name (compose drops the
# service's container_name for these), so this is safe while ergo-caddy runs.
docker compose run --rm --no-deps -T caddy \
caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile >/dev/null \
|| die "Caddyfile validation failed. Check $CADDY_DIR/etc/Caddyfile and conf.d/*.caddy."
# ---------------------------------------------------------------------------
# First run: generate ircd.yaml from the image's own default config
# ---------------------------------------------------------------------------
render_ircd_yaml() { # <template> <dest>
local plain_listener sts_note netname="" listeners ws
# Cloaked hostnames end in this fake TLD (default "irc"). Use the network's
# first label when it is hostname-shaped; changing it later re-cloaks everyone.
netname="$(printf '%s' "$NETWORK_NAME" | tr 'A-Z' 'a-z' | cut -d. -f1)"
[[ "$netname" =~ ^[a-z0-9]([a-z0-9-]{0,30}[a-z0-9])?$ ]] || netname=""
if [[ "$PLAINTEXT" == "1" ]]; then
plain_listener=' # PLAINTEXT=1: plaintext IRC on ALL interfaces. STS is advertised (server.sts)
# so capable clients pin TLS after first contact. Anything sent here crosses
# the internet unencrypted. Loopback probes (ergoctl, healthcheck) use it too.
":6667":'
else
plain_listener=' # Loopback plaintext: the compose healthcheck and `ergoctl` use it (loopback is
# exempt from ip-limits/bans and treated as secure). To serve plaintext publicly
# instead (not recommended): change this to ":6667", enable server.sts above, set
# PLAINTEXT=1 in ../.env, `ergoctl restart`, then re-run deploy.sh for the firewall.
"127.0.0.1:6667":'
fi
listeners=" listeners:
${plain_listener}
# Public TLS port. fullchain.pem/privkey.pem are Caddy's Let's Encrypt cert,
# kept current by 'update.sh certsync' (self-signed from mkcerts until the
# first sync). Rehash (SIGHUP) reloads them without dropping anyone.
\":6697\":
tls:
cert: fullchain.pem
key: privkey.pem
proxy: false
min-tls-version: 1.2
# IRC over WebSocket for browser clients; TLS is terminated by Caddy on :443
# (wss://${ERGO_DOMAIN}/webirc), which proxies here over loopback with
# X-Forwarded-For -- trusted because 127.0.0.1 is in proxy-allowed-from.
\"127.0.0.1:8097\":
websocket: true
"
ws=" websockets:
# Only pages served from these origins may open a websocket (anchored,
# case-sensitive globs). Add the origin of any web client you host elsewhere.
# Non-browser clients should use :6697 directly.
allowed-origins:
- \"https://${ERGO_DOMAIN}\"
"
MARKER="# Generated by deployments/ergo/deploy.sh on $(date -u +%FT%TZ) from the ${IMAGE} default config.
# Edit freely; apply with 'ergoctl rehash' (or 'ergoctl edit', which validates first).
# server.name, datastore.path, casemapping and enforce-utf8 need 'ergoctl restart'.
# The pristine template is kept in ../templates/ for diffing after upgrades." \
DOMAIN="$ERGO_DOMAIN" NETWORK_NAME="$NETWORK_NAME" HASH="$ADMIN_HASH" PLAINTEXT="$PLAINTEXT" \
NETNAME="$netname" LISTENERS_BLOCK="$listeners" WS_BLOCK="$ws" \
awk '
BEGIN { print ENVIRON["MARKER"]; top=""; sub4=""; oper=""; skip=0 }
{
line=$0
# while replacing a 4-space block, drop its children (8+ spaces) and blanks
if (skip) { if (line ~ /^ / || line ~ /^[ \t]*$/) next; skip=0 }
if (line ~ /^[a-z][a-z-]*:/) { top=line; sub(/:.*/,"",top); sub4=""; oper="" }
if (top=="server") {
if (line ~ /^ [a-z"-]/) { sub4=line; sub(/^ /,"",sub4); sub(/:.*/,"",sub4) }
if (line ~ /^ name:/) { print " name: " ENVIRON["DOMAIN"]; next }
if (line ~ /^ listeners:/) { printf "%s", ENVIRON["LISTENERS_BLOCK"]; skip=1; next }
if (line ~ /^ websockets:/) { printf "%s", ENVIRON["WS_BLOCK"]; skip=1; next }
if (sub4=="sts" && ENVIRON["PLAINTEXT"]=="1" && line ~ /^ enabled: false/) { print " enabled: true"; next }
if (sub4=="ip-cloaking" && ENVIRON["NETNAME"]!="" && line ~ /^ netname:/) { print " netname: \"" ENVIRON["NETNAME"] "\""; next }
}
if (top=="network" && line ~ /^ name:/) { print " name: \"" ENVIRON["NETWORK_NAME"] "\""; next }
if (top=="opers") {
if (line ~ /^ [A-Za-z0-9_.-]+:/) { oper=line; sub(/^ /,"",oper); sub(/:.*/,"",oper) }
if (oper=="admin" && line ~ /^ password:/) { print " password: \"" ENVIRON["HASH"] "\""; next }
}
if (top=="languages" && line ~ /^ path: languages/) { print " path: /ircd-bin/languages"; next }
print line
}' "$1" > "$2"
}
assert_ircd_yaml() { # hard post-conditions -- a silent sed miss would be a public :6667 or a dead admin oper
local f="$1" fail=0
_chk() { if ! grep -qE -- "$1" "$f"; then warn "ircd.yaml check failed: expected $2"; fail=1; fi; }
_nochk() { if grep -qE -- "$1" "$f"; then warn "ircd.yaml check failed: unexpected $2"; fail=1; fi; }
_chk '^ name: '"$ERGO_DOMAIN"'$' "server.name = $ERGO_DOMAIN"
_chk '^ name: "'"$NETWORK_NAME"'"$' "network.name"
_chk '^ ":6697":' "TLS listener :6697"
_chk '^ "127.0.0.1:8097":' "websocket listener"
_chk '^ - "https://'"$ERGO_DOMAIN"'"$' "websocket allowed origin"
_chk '^ password: "\$2[ab]\$' "admin oper bcrypt hash"
_nochk '^ password: "\$2a\$04\$0123456789abcdef' "placeholder oper hash still active (the commented examples are fine)"
_nochk '"\[::1\]:6667"' "[::1] listener (fails on IPv6-less hosts)"
_chk '^ path: /ircd-bin/languages' "languages path"
_nochk '^ path: languages$' "unpatched languages path"
if [[ "$PLAINTEXT" == "1" ]]; then _chk '^ ":6667":' "public plaintext listener"; _nochk '^ "127.0.0.1:6667":' "loopback-only listener with PLAINTEXT=1"
else _chk '^ "127.0.0.1:6667":' "loopback plaintext listener"; _nochk '^ ":6667":' "PUBLIC plaintext listener with PLAINTEXT=0"; fi
# The history backend must be exactly the one asked for -- yaml_set_nested
# targets a specific block, so a wrong result means the template moved.
local got; got="$(history_backend "$f")"
if [[ "$got" != "$HISTORY" ]]; then warn "ircd.yaml check failed: history backend is '$got', expected '$HISTORY'"; fail=1; fi
(( fail == 0 ))
}
CONF="$IRCD_DIR/ircd.yaml"
FIRST_RUN=0
if [[ ! -f "$CONF" ]]; then
FIRST_RUN=1
log "Generating $CONF from the image's default config..."
TEMPLATE="$TEMPLATES_DIR/default.yaml.${ERGO_TAG}"
ergo_extract_template "$IMAGE" "$TEMPLATE" || die "Could not read /ircd-bin/default.yaml from $IMAGE."
chmod 0600 "$TEMPLATE"
# Admin oper: random password (plaintext 0600 on the host, hash in the yaml).
ADMIN_PW="$(ergo_random_password 24)"
ADMIN_HASH="$(ergo_genpasswd "$IMAGE" "$ADMIN_PW")" || die "ergo genpasswd did not return a bcrypt hash."
( umask 077; printf '%s\n' "$ADMIN_PW" > "$ADMIN_PASS_FILE" )
render_ircd_yaml "$TEMPLATE" "$CONF"
# Persistent history. Ergo keeps the in-memory limits (channel-length etc.)
# for the RAM backend; with persistence on, retention is governed by
# history.restrictions.expire-time (1w by default).
if [[ "$HISTORY" != "off" && -n "$HISTORY_EXPIRE" ]]; then
yaml_set_nested "$CONF" history restrictions expire-time "$HISTORY_EXPIRE" \
|| die "Could not set history.restrictions.expire-time."
log "Message retention: ${HISTORY_EXPIRE} (history.restrictions.expire-time)."
fi
case "$HISTORY" in
sqlite)
log "Enabling persistent history (SQLite: ircd/ergo_history.db)..."
yaml_set_nested "$CONF" datastore sqlite enabled true || die "Could not enable datastore.sqlite in the generated config."
yaml_set_nested "$CONF" history persistent enabled true || die "Could not enable history.persistent in the generated config." ;;
postgres)
log "Enabling persistent history (PostgreSQL on 127.0.0.1:${POSTGRES_PORT})..."
yaml_set_nested "$CONF" datastore postgresql enabled true || die "Could not enable datastore.postgresql."
yaml_set_nested "$CONF" datastore postgresql host "\"127.0.0.1\"" || die "Could not set the postgresql host."
yaml_set_nested "$CONF" datastore postgresql port "$POSTGRES_PORT" || die "Could not set the postgresql port."
yaml_set_nested "$CONF" datastore postgresql user "\"${POSTGRES_USER}\"" || die "Could not set the postgresql user."
yaml_set_nested "$CONF" datastore postgresql password "\"${PG_PASS}\"" || die "Could not set the postgresql password."
yaml_set_nested "$CONF" datastore postgresql history-database "\"${POSTGRES_DB}\"" || die "Could not set the postgresql database."
yaml_set_nested "$CONF" history persistent enabled true || die "Could not enable history.persistent." ;;
off)
log "Persistent history disabled (HISTORY=off): messages stay in RAM and are lost on restart." ;;
esac
assert_ircd_yaml "$CONF" || { rm -f "$CONF"; die "Generated ircd.yaml failed its checks (the upstream template layout changed?). Nothing started. Template kept at $TEMPLATE."; }
# MOTD: the bind mount hides the image's ergo.motd, and a missing MOTD is silently
# ignored (clients get ERR_NOMOTD) -- so always ship one.
sed -e "s|__NETWORK_NAME__|${NETWORK_NAME}|g" -e "s|__DOMAIN__|${ERGO_DOMAIN}|g" "$SCRIPT_DIR/ergo.motd" > "$IRCD_DIR/ergo.motd"
chmod 0600 "$CONF"; chmod 0644 "$IRCD_DIR/ergo.motd"
chown -R "$ERGO_UID:$ERGO_GID" "$IRCD_DIR"
log "Validating the generated config (ergo run --smoke in a throwaway container)..."
if ! ergo_validate_config "$IMAGE"; then
tail -n 20 "$VALIDATE_LOG" >&2 || true
rm -f "$CONF"
die "ircd.yaml did not load in $IMAGE. Nothing started; fix the cause above and re-run."
fi
rm -f "$VALIDATE_LOG"
else
log "$CONF exists; leaving it alone."
chown -R "$ERGO_UID:$ERGO_GID" "$IRCD_DIR"
fi
ADMIN_PW="$(head -n1 "$ADMIN_PASS_FILE" 2>/dev/null || echo '<not on file>')"
# Only put the password on screen for a human at a terminal, and only on the run
# that created it. Unattended paths (cloud-init) send stdout to the provider's
# serial console and /var/log/cloud-init-output.log, where a server-admin oper
# credential would sit indefinitely, readable by anyone with console access.
if [[ "$FIRST_RUN" == "1" && -t 1 ]]; then
ADMIN_PW_LINE="/OPER admin ${ADMIN_PW} (also in ${ADMIN_PASS_FILE})"
else
ADMIN_PW_LINE="see ${ADMIN_PASS_FILE}, or run: ergoctl passwd show"
fi
# ---------------------------------------------------------------------------
# Confirm
# ---------------------------------------------------------------------------
if [[ "$FORCE" != "1" ]]; then
cat <<EOF
About to start the Ergo stack from $STACK_DIR (host networking).
Caddy will request a Let's Encrypt cert for ${ERGO_DOMAIN}. DNS for that name must
already point at this host and ports 80/443 must be reachable from the internet.
IRC clients connect on 6697 (TLS)$( [[ "$PLAINTEXT" == "1" ]] && printf ' and 6667 (PLAINTEXT -- credentials in clear)' ).
Continue? [y/N]
EOF
read -r ans
[[ "${ans,,}" == "y" || "${ans,,}" == "yes" ]] || { warn "Aborted."; exit 0; }
fi
# ---------------------------------------------------------------------------
# Up + health
# ---------------------------------------------------------------------------
log "Starting stack..."
docker compose up -d --remove-orphans
if (( CADDY_CHANGED )) && [[ "$(svc_state caddy)" == running* ]]; then
log "Caddyfile changed; restarting Caddy to load it..."
docker compose restart caddy >/dev/null 2>&1 || warn "Could not restart Caddy; run 'ergoctl caddy-restart'."
fi
log "Waiting for services to become healthy..."
if [[ "$HISTORY" == "postgres" ]]; then
# Ergo refuses to start when its history backend is unreachable, and
# depends_on holds it back until this passes.
if wait_healthy postgres 120; then log "PostgreSQL is ready."
else docker compose logs --tail 20 postgres >&2 || true
die "PostgreSQL did not become healthy; Ergo cannot start without it. See the log above."; fi
fi
wait_healthy caddy 60 || warn "Caddy is not healthy yet (docker compose logs caddy)."
if ! wait_healthy ergo 120; then
docker compose logs --tail 30 ergo >&2 || true
die "Ergo did not become healthy. See the log above."
fi
log "Ergo is up ($(ergo_version_running))."
# ---------------------------------------------------------------------------
# TLS: wait for Caddy's cert, copy it into ircd/, rehash
# ---------------------------------------------------------------------------
log "Waiting up to ${CERT_WAIT}s for Caddy to obtain the Let's Encrypt certificate..."
deadline=$(( $(date +%s) + CERT_WAIT ))
have_cert=0
while (( $(date +%s) < deadline )); do
if ergo_cert_source >/dev/null 2>&1; then have_cert=1; break; fi
sleep 5
done
if [[ "$have_cert" == 1 ]]; then
sleep 2 # let certmagic finish writing the .json sidecar
bash "$STACK_DIR/update.sh" certsync || warn "Cert sync did not complete; the 15-minute job will retry."
else
warn "No certificate from Caddy yet (DNS not pointing here, or 80/443 unreachable?)."
warn "Ergo is serving a SELF-SIGNED cert on 6697 until certsync succeeds (every 15 min). Check: docker compose logs caddy"
fi
# ---------------------------------------------------------------------------
# Schedule certsync (15 min) + the daily update check
# ---------------------------------------------------------------------------
log "Installing scheduled jobs (certsync every 15 min; daily update check, policy=${UPDATE_POLICY})..."
STACK_DIR="$STACK_DIR" UPDATE_POLICY="$UPDATE_POLICY" FORCE_UPDATE="$FORCE_UPDATE" UPDATE_GRACE="$UPDATE_GRACE" \
CADDY_AUTOUPDATE="$CADDY_AUTOUPDATE" SCHEDULE_UPDATES="$ERGO_AUTOUPDATE" \
bash "$STACK_DIR/update.sh" install || warn "Scheduling failed (non-fatal): run '$STACK_DIR/update.sh install' by hand."
echo
log "Stack status:"
docker compose ps
echo
cat <<EOF
================================================================
DEPLOYED -- Ergo IRC server
Network: ${NETWORK_NAME}
Server: ${ERGO_DOMAIN} port 6697 (TLS)$( [[ "$PLAINTEXT" == "1" ]] && printf ', port 6667 (plaintext)' )
WebSocket: wss://${ERGO_DOMAIN}/webirc (landing page: https://${ERGO_DOMAIN})
Stack dir: ${STACK_DIR}
Oper login: ${ADMIN_PW_LINE}
(rotate with: ergoctl passwd rotate)
Config: ${IRCD_DIR}/ircd.yaml MOTD: ${IRCD_DIR}/ergo.motd
ergoctl edit / ergoctl motd (validates, then rehashes)
History: $( case "$HISTORY" in
sqlite) printf 'persistent, SQLite (%s/ergo_history.db)' "$IRCD_DIR" ;;
postgres) printf 'persistent, PostgreSQL (container ergo-postgres, db %s)' "$POSTGRES_DB" ;;
off) printf 'in RAM only -- lost on every restart, including updates' ;;
esac )
$( [[ "$HISTORY" == "off" ]] || printf 'Messages are kept for %s, then deleted (history.restrictions.expire-time).' "$HISTORY_EXPIRE" )
Switch backend: ergoctl history sqlite|postgres|off
Administer (from anywhere on this host):
ergoctl status versions, health, cert, user count
ergoctl users who is on
ergoctl oper add <name> add an operator (prints a generated password)
ergoctl announce <text> NOTICE to everyone
ergoctl kill|ban|defcon ... moderation (see: ergoctl help)
ergoctl cmd <raw IRC line> anything else, as the admin oper
ergoctl logs -f server log (health-probe noise filtered)
ergoctl backup stop-consistent backup of config + database
TLS: Caddy holds the Let's Encrypt cert; 'update.sh certsync' copies it to
Ergo and rehashes (every 15 min, silent when unchanged).
Check with 'ergoctl cert'. While it says SELF-SIGNED, IRC clients will
refuse to connect to 6697 with a certificate error -- that is a pending
issuance, not a broken install. Fix it in this order:
dig +short ${ERGO_DOMAIN} # must return this host's public IP
docker compose logs caddy # shows why ACME failed (80/443 blocked?)
ergoctl cert sync # apply now instead of waiting 15 min
Updates: ergoctl update check current vs latest (+ security advisories)
ergoctl update update update now (health-checked, DB snapshot, rollback)
$( [[ "$ERGO_AUTOUPDATE" == "1" ]] \
&& printf "Daily automatic run, policy '%s' (edit it in %s)." "$UPDATE_POLICY" "$ENV_FILE" \
|| printf "Daily run NOT scheduled (ERGO_AUTOUPDATE=0); enable it with 'ergoctl update install'." )
Restarting Ergo disconnects every user; the daily run warns them first.
Re-running this script is idempotent: it never touches ircd.yaml, secrets/ or
caddy/etc/conf.d/, and it adopts the settings above from .env rather than
resetting them to defaults.
================================================================
EOF
# IMPORTANT: do not put any code below this exit. Everything after the
# __ARCHIVE_BELOW__ marker is the embedded tar.gz payload (base64), appended by
# build.sh.
exit 0
__ARCHIVE_BELOW__
H4sIAAAAAAAAA+xbbXPbRpL2Z/6KPspVIhMCJC1LSujItYpEW6yTJUWkz8klexRIDElEIAADoGSu
z//9nu4ZvFGSnU2c7F6V4SqZBAeNmZ5+efpl3HB6rWJrGi6jMFH2euk/+uxXB9fe06ePOnud7v5u
V/7vdLpyH9f+ztPOo+7uk6d7nf29/e7+o053BwMeUefzT+XutUpSJyZ6tLs/fhP6N+qveOe/0bVF
/XgeEpgwvSbLoiPHddfUOFXpdkL9YBqvo5S+pjdqMmRJSWkWh0HaxC15bnB5RImKb1Rs17ZqWzQK
o9AP52sm9f356ER+9KYqoXgVkBdQulB0cj4cUaDS2zC+psBZqiRypooaQUjHIo50djhq9oQgySum
vqeCNME3y3pOvb29b/dpdDrEt/uu56R4bkSNROHN/MpYOT4NLm6etvFnrymEb9Vkk/DTpzs0FQ5Y
Vhu/e/GU73ef7Nsd/Ov2vungzUIdvyaaI40frRdhfOvErnL5k6Ze5aBQ/6bTLr2hcXj0qt98JtPz
kmSlXJqqOMVnmoaRh69ekIZktzEJl2ZhLGTvXrwPeJNmiu8lqQrAwcmarlaR66TKThZCOFkH0ytq
fE3DwcuT1xdgycJJFnqyfhhGE5YAuapL3tvb26fIdzAb9S7tkTEVtABL08V0ofDY13TFTJmm/hWd
n53+9MBUG/l7sEj1Ti0jkacleZHle0svTdoTJ0jICcCLcMUb4yQQoekqVk0RhzeLNS3CJM3Exwvm
PZEQfq4FXsZhmvq4KzQGF9jg0OFRdK3WFGr505u+nYAediJWCZ7k4Vr4wMsVpNbnO1EcvlvTbbjy
XVp4riIFSV+zIO0ZKjRRCw8jQRfkJrHnzhXNwfZbZ23TCU91GeJBx09CWipeHU+B14AXuSpYW5O1
5aqZs/JTGpxdvB7RzIvxuO+DIMutv6Z5iPfqR8H5KMRuUsNVkR+ueXtjNed9jxOCiEHC2iwLTZuO
wiBRb1cqgAJCnQgKdiUP967aV4aD+IytjKF+R2ZjY/WrmqbysiWr7CJbRLNlzANmhX1n/okR4MkV
AqN5WVpkedONsKYxzC5NsMWuE4uxgKYaHl72D49f9alRH/K+e+la3u3Xm3atxsaiJ/pXq2WWpVcj
2nrAEvyuS+gdGStA4SSF6CftGGp1qzevqtqsW5A8FS+9APue0MlodDFkhZUFMTEIqMVMsgozGjnp
Qhgl1hNyTqxdxFLH0ho5c2XTMHVSbwpVCGbeXK/TiSLIg8xu5vkQSBdaQ7ceqF252nhO831k15Zq
cwPNd1zMkA4vBrwR4WwGhn5+zsnLeKpE3hKL6Jk7j98fHR4f/zQeHb7sWU8sx4+8QH2QcVges1jF
42J7LXlKfjbL6NEq8KGqVpKGUaRc+c3I8JglpCfypik60diNw6hHPx+env49vweauHXWH42/H5wd
j4f9y/8aHPX/XhiorcJIN+IwhDEOrHx6eJtywbkAG5AuvKQpdBMjpeMwwhx/DkILcmJFsXeD7ZlD
PCHrSk/hJvRXSy2wYmZh22WZbZVOe/xHf6XyfIqd/lrkwHbb0HwYiGkaxqwasJItKHYKCeJhzTvE
4QOcnvzdsMZbxB6InKmYWqbPXuKZsNGCirvOBK9lOc7cxx3aRjLN//KzCm48QIQlbGO20P7ly/Px
8fmrw8FZj+qP35e+f6ibMTyVcR+3TmVI8TUfgW17c375n+Ozw1d9GVO+YUaVfFL28i06NfbHkp3T
QyjxUgXzO8PGuhkuKXjd4K/36gtfUHLe6vrRq2NreNI/Pa23qH47h1Zbb88tWqRp1Gu3c4PYpv+l
eawi/Erb/xNeb9f/bgixS41vHL9HO50kI+4tVbgC/d3sTqzS2IPY0I65IfowjlTshZDnLh79U0yg
2HZYQOZFCefR5SoQv1wy8eL9ryhZwwstxX2W3JMQm0Kg2Dh6qfbui/AWVDS4gV9hcdP7w2o3S1ik
WWWdied7KVZvU59dr9CSLfJSo4++x/YTO6WJ9Yj/2mtn6bf0R3fSEptiL8PUbdFs5fvTBTTajtSy
JQRZW4EP+IZNV17ggf2stlcUrdgR4g45KV0MjqlL8OOblvba832yYPlfX1wJwYYGVz2sC/jDTYwJ
b9Gr89GxMIDRq6hVM/Omwk+BlkAd8GvJn2GemX7FOhttHLw6fNnvWfPFNLa9sC1gbuGk8uFDzwwS
2w3hg1l42HL/XptdcF2+sgwVxuL14LhnIWbs5HN5md+pP2jy/wnTzPI3ZvkrTSFdRjNo3c9tfHjQ
gIvIyd+HDRC7fx/I0eednWDRolmAgrcM2RzcVZaGcDH8PUDqD68HI+3T6/3Ly/NL6v2w8tJ6TlA0
yIfkQS0OAX2B3kZHF7wdAfyCwauRkySMVwNNyUHEAmzq5uFaRmyyStaT8B0FU0ByBhMdcmawSwxJ
tC1qYVmAkCKgbMg+agfB3iCd0Tav4Zf4l2Ab1g+krVvaKTAiSVBRNouyzvss495dy7j3Gy3jEzz6
r46v/90vt5r/wZ8Um5J81kTQJ/I/uztPn2zkf57u7e5+yf/8FdcWXegtH/5wKoGc70jYA/vrSihP
t1B+OhkMR+eXPx3k8iHReBGBOtPUu8kc/AQhM+wu4hjJAxydv7o4H/bHLwan/QP3Tr6x9xERxPM6
CQJU2cJMvOmC7kQ57F/xSpgu5c8QNIUmSt/w0lcgho9LNp4C+IDqdNqrsYpaFAFzsJtqIV6d47N6
p6ZNyhNICRwcvqUAgnlOCwTFtAKqIHaLAcB9Z54I9wLfu1b5HGH2GbMkvAQOtZ2MBNxWQBMQxq9B
6q85IzFJOK0gaZEwUPmUdTpCyY+YvgPIv8iybmelZIjSvsU1WaY7abcs3dZiIIPba54Dxw/Ycc0h
nvJ2kk/x+Gxol4WEX6sQFSjm3prjIawnCOOl42f5D+Pia9pTRauJ7yWMcHToFN6XHHimnWKGhRgm
pqUk1O7TnScg1+AwBrsUF2Ly1rclQYFF5sCvadMZ2MOBtCSaeEUuQ3gLjs4kKjGFpfMrghvISsJO
FyMvBmdn/ePKam8Z2jF7dCwti5VYKo/BWAog7Sm0BFLIP8xm4BC2qUJf+F2k5K7AJE6bpOHKgD+8
XzAZ5kevo3nsSCLAk4QgqCrfmyjgA0Qtq2VkgbEWoyzehyJ9UiRPiiVI4qScLMk4V8GB+c3H76Gs
o5eX/aHGe939Twfr2cOfxH5FMCaywOhFJ92sTEhcyW6BkwxfVBFkbKTGWoaclmGacArO5PKYX3nK
lycTe1NBVSy3GrroHFiO4uqFnJVWf3F+OepZLHgfRPzqD4W3+ROvh/1LwazVO5aA6Prm6OPvq2Px
XUaOIQksVx8KvMfCyvyAUrm8PLZ52kLooJ/ZIPEQS9SCQ7NQwiKJijDjnFAjs0iCr6LQF5OtrasY
Gdp+vC3mpXifRpMTvPMaL8mD4IJPh8Mh4vBjse89asPitIG8gc2SdiYYVkYtn0l3X144QXx0S9cK
MFBnZjHOmxKcEJDeMzG4WBg02PemHgwkrxRrXqWrWOW0RIQpy6Eac7aEMxOaVW2FVLpg0irJ1/Hy
+HB0iHnfOHEbOtYuDIskTdrRnP+7H//n69NJlgdIlMKFTcbYzJjex3nWi8NPZrXyVxydnL85o8q1
JbGVO2lDZuN1FHrsXrx3hAgcpmnhRezTNBtyMseHR2O2JeNh//Dy6CS//wLU+5f512F/hEBs420S
xxav4iknWlolpWbsf7ZMifTKBBHr/bPR2z1R1/2xyXzsJaw8gDiv6ZcHNPWXOllu9dc7uslj3t4T
rXR3f0MeZ/feaGUny+OII1xygpzlGBqraBVBU8TnZhI9cViLE87eqYihVhb9wdLhFYxLdGqDvQ/X
hFIyc8fecATvsmLNHM8Xa6G9mzfT1hT2WQViaVaBeGR+QKcjAPnwUzLWDjOM2XllYSub9JaxRVJa
wOziMCmMeNvggwTqnNqVdERBN9vBqpsSYQ8D1+M39TJwMtY7v67VSqpZVcovEeBHrzzn+Se+41Px
X7fzdCP+63Z3977Ef3/FVa4wmJJVqSPAzgp+nPL9aPVeo+rL0NeVRqKuTedSOhM/L9WzB4pn3syb
Mq7l179/XC4O2KZemJWTN2rcsVppiOhoQgyE7y16Sz1dggqOJjNqprKup8fpWqXrk9SQ5eogsrtL
Sy9YpRy86ShNB8SrAFYxmCu3aQu9JzaNshJgqQJ4t/IH28wev11dqWk2IOt5NjtTKc0L76WGg5wB
sLnV1oRsv/AnZ9pGdwK1K3cu4jDV8aIsXQqzpvQrLjuLzzJqDSmJIyQAbsPjPKaHQVPHZwPfFPPP
jRXs1ZMc2Hlx1oGhYWasMnpLJ76WpCTX+Knx9X8bfu5wbCCLt+4URnXUXfg7OI9UHBnkoK0F8dB1
CRAyZpCjaz06A08NZc9tQMiXzvJXp9QC0pIQSodPTXISCYWl3PaVnXWElPIdXgD98H0Tt4n2TFbp
RkxnCPCCDqVsq0VGl2t7dDeTUarX1mrvdbyxxMqgFqWCWM3EPifVPogs7YtpVKtXYaG3EKhCYJ50
ut9mcVTu5TmG1ZIvm5rVIkxLhon9bIlIDEd1GiX1prz3hhzgecDqhpD7Wb5qTlNz+ZpbWybrbLk8
81RTM8SFhp4+ns9WexaKWrV3ehpeSFDCYd/KjbjnIVumBIuNQGq3ciMLGVmZEPcZcqxDTR2CxOGt
CKsbCuDijEmurYlubljsYOiaWzoMNOUUekLvc2gSsRpNQwjEokuLJ3L/Qw1b9UD5EVjHAHFjc+/r
quGGqGIbWU2Ta6jHZn3RTAP8jACQqB5e1+lJp8NvrxoZM1AFU+5I+UeSujT/hxdlHOYan6w2X722
v+TNgzDOG6nerrBx0r/wzFgbNgme/t2Q0vkLoNXYCeAeYklu6XaHlUhAsmmW2sYSmSyehvV4wFdj
aZUwBvKrEs9jltMEv0uTTtUQmg0w0zmPOHMCTmO6AiATapRVP1Y6PoSNt227adNQqUx7Ox2phS+V
NgO2SZpIlqJqIWqlSZemiR3liPMI8o2XWaN1pKjONq0t5k30A8tID1bpzPqmXlqe3s/vvhv9OMrv
8vX+caX0zZapqM/WKkOPspKQlICCdambrlcZmAl1T+iXpWZjGC+8J5/EGTdGp8PmxhCwtmc+fcTV
UeOetphML5rVZVyaBifONHrTa516ai+TOZ3h6xAzh+l+ORiO+pf0XRY3P6+QuIC/irXl0U6e1Yhn
J6VhLnbmqQ19geuiRiVJMltZ7O1QkkvWSMQcjLHynqX60nlnwVcd7HR3d/aAcp/BHk39lauGq8lx
uOSeomKvf7TK4mGdR1pIcdWDMAm82awYe6lmKo7BtYvQ96blbpG6znVZYezN4TcZp1gSgJk7BQ1r
qGWltDY/nJcWhsiVHQlMBD7ld2ec5RWxTwD0ciP3r8awX67ff2kTVjFxn/0dn4j/EPp1N+K/J/tf
4r+/5io5R07UWTBL98SBwE7a1QuUngAaXmucLU05m0hZ9+ckxkvC5g7OhoPjvtDcQCQFvZbuOqjp
/GHmJIqgJ4YhUiZnnGfC7umZvIvRhaTJmi8VcOJU07kXrJMz59YgA9gFqJs+9I+hdW0eG2GsCyLT
1Nf3LTNKNy/33znLyDf1mtikpzcDkcIxMUqbgJwdxvO2WuoyUnvO45sSnIFk1oh3e3urf6HGKoi4
vuJw75HiLCEmMAEfdOFOVs71Kq5CagRv/5qEukkEBN/XNQ6o9/BxFfv4v242gzOozioNf4WD5ttb
fjiZrOsfPuSt+jn2ydq/JeH7FRXTy39hGRkbxLIlfoRJAH05upJDV1Z5cT35E4dXWfpYsz2rUZrs
H7acq9J3Ssy25jKk+FwcYcHjqjgiIPB1ehhuznQ4m3aZXBATO4t9tVNNKpVH+/+bM8wb4/7Ed3zC
/nf29nfu5P/2v9j/v+R6PBmPy9HEePw45hMgRGOjFeNxrfZG+VyH+A/E/TCkWfJP0mQPg+laCbdL
LoahuwQGvwW5nwKPcgYgyBI9OqQYHg5P6eIU82oRJ7MqlOBkzkaDFz9VKZWCB05FBMovJnGEG9VJ
bJkxePBE+VGP7lzVd570Ty9IrOoGRf6hVvueu0P5PERInGIh3bWRO12dFZGEnnSltA+PXw3O7Fqj
j0C1lFzSGaPMt7C+Nj+PpeHar620Y/osBO+5Pq7/3W7n6R39393vftH/v+LaoqMwkqYclgSR4xm3
vDAG2kA8EUReNwtwPZKRwJLTfnxAya40gyXSl10IL3R45sWJTq0VyCtWgkN0sw9jP84Gmc6ys/NR
v0c3jr8yiUPcoLerkNWEKZTKo4EuMmC2vo+dTLx5kJ9l0v1j1U4HSe9Iqd3MQzolGBv1SonTEApa
6bkQaJHV6GWM1O6pAWnu6EyiJPi4g3aiixtcU9CPCkBol1BCTRq7aeAC8XG64I/3dm/RBbfQTCUB
ygkSPm13yzgIGBBr/l6xBc9PYBlYwwNbd+synP3mgkqymvBZsFZxPEIj9uyEl4FCJZiuQZFNg+Vy
JZ3iFVivxUBLCjVMx9dMV3FCU4UxZrpoVZYiE/xJCakdgJWZ1bKxLuZnXzLlHLtUS0yVzuo295J4
CFkgO9wPZdeKxPqB7OrfNshywqxc7aLGYPj6gpuDshMpBy2sX/wjRClgXmMCfBqvRS6YIVlFGhNv
kUgI9j1AXMVVs6Qcr5gGFtEHcKO0XLtWdtH3LV6ESdpg/rAkaWEyJwEQPMwRGzlxvJYNREQhsdb2
zTY1bp7Y3W/tbrO8iMgzJxwDdYvYR44w6jAktwJ68DMqKnWT1TIyBkOKa2CA/hH8ORMdjUT9tvXh
g+32tqhzuq1PLsoZFbZQbCgSFTnSJjdZeb6rCxfgrHI4hPR9zsQbUZIzDwf3HnmoZecdDswamccr
z+3NPVMoi80hGCyXz4VWKhh08PGzMdzIqM/DSDoyZ94zKh+KsekFDLGGBeVRZvavB8cHtewoxEEm
A6emNJj8YTkAwQ4f4hGZbPZKhUjp3S+XHrVYN6oHgg1WkXJet0eHp8NzE/UWlKTiEJA5YizmiztI
JFk9HA1him+4PszNm4k5DuSbymF2cBuCwWdpbDqKlRhTx2fjhjhaShlCuWhCEWcQKKkNTSGW3D8L
xAbZCbh4yENeDC6HI8NtKTUlkF8+DusUddc7Bt30Jle8YNXJ2TQKjV1joiy/cUtOb+r6dU7bxOHb
GdbjIdst6YTj6YlLFLFvFWNMlmFb7HRAfJxkFRRTqeV9klIcywpiWZBr1wRPj/o/jg46mSC9UknC
5iRrGvpDgiQaw7XgJKcHFl4evtKCLSKWNQ553BOcSKetrkNmiRahpHPoWc0wDExVSluLmLudOEcN
bl/oviepFeokDoQmeeuz96JCrrMGyokSNTbnxZ4VLd25UguBvGnNYcHjo4OlVuFC/xsfaWnXB+7D
2cxk88EE3Te1iuCllLPkE+XOjYeASTq7GUoJ/54fEGzRN1A4OglvwSQwYal3SUOkaxUJ+/RhcbEt
oGAYbpc6YRNbnKCyuEetkr6gRhe+TF2X9qXZEuylm2c3laVq0BNwGiGOyLZW4lxCs23/zvSWPd9m
I5g19GMB0rLpzcVyq3cY7ZWWByOSHUDQW8hSOlRpxS6y/Nzf+P9A23+lt99kegQT0CAlzgImtP2x
wwnbDx2N+L/23n2vjSRZF52/eYq0LI8kG0kI32Ykix4aY5s9bvAG3DO9MI0LSYCW0WVUkmkGWL/z
NOfBzpOc+CIiszKrSgJ73LPX2j9rpg2oqrLyGvf44paEB3vEvK1TZgqa21zlDkdP49l/Wv9fO7t+
PLvuUfpjPJvg9U3/pZ7klQpuBx1zAbOLgtv50CZ8fFFIO/Ti06+OaCca5UWlt11Q+lIQwNlm3u1F
bbb9oE0rInOUeYZ/1cIoa5dVmhuxi83Lcv+yDbpWOWRufLWGV/tKShhY7Y0QwmWbMx50p7wXYQiJ
KjrVd9kVc3eK1ctE3FJTekxr1p1B3vjP0bGGmAvcxAlsN5+G+BZW55blWj0YoJkumPL60AVp+yHy
xK4mfTBtNtZEyr10W7JIx2nvnESgY4NNepmZ94QoMnoY8YYBA+TOinciYm2ypvAlLA3Cr6mb0VqJ
RQh1IigOGC8XEmuYysQJKxAOYf23rqUkByoySZLC6/70zew4uZ0klX48YlcIR4YIlEXwoe4Osf9d
PgjPiO0a7bQJCwcI349M4f59UDhpvZBuKta4J5DuKdPOXhyylaruS5U4OHIjfD+JoJDU6lCETi75
CFSW3r97ub6/SRvw7dbGL22ZVoT1SSexGNjc/D6DMPsZfCkFKNukXnGq9qVs6LjALOmsd87QNYjV
6PcucAisFsTv7fe6y5onYl7t7G5sHkkP2o3aUvD3ChN8BAAjFd9cRBMeS5lY09bGJsfGkEDDQWcV
6yCKhnYNVYQQRlqzo3y9u76x2X6GphsqsndJhZScKcZrGc8Q4hXxNpqo/ivJBhI06CW1lyXMnRkQ
MoJ6x1X15yS6caSy3mCEs0EC/gq9VlpVdcd87kcOSsf2XvA7iK0wgMb6+/0dNymB5jeV5LN/6bPk
UDraFqTjf5pH4/vnSz7Ya8SHiaX8fu9gkLenT/Ptv42Vx6uNp2L/baysPn/K9t/Hq9/zf/8tn/v3
6rN4Uj/uD+uQUo4jqItEVpJ9wcLYWYTYKSLnyCfJDRTfIymhkzJomDLHEAszZH2qwwbcSeeMxKvK
sic6gqBauidPFff21zf+evRya1fSOZksi1jKBmcbfSB5nkxYE8kzYXci64s4x/KDqsLTs0kPUs+k
P56yRnApIb+aLdNUqa3TYXgwP0TzYhKNx9DeNZbzEdsxGNpBw0VlwA73yur2y/bFo4voIrr0kIU0
lJbEo34XbiEF2qqu8QzDFAv95HLYWRbDtKA++Zqb5O8NpyeWs3YiUfV4ojZGw88wjnBu0AlxbYkv
I8EWgbrD0bD6z95kxBETkPuIwwIKgjks7PscHdvr9AEBpkm9vWTq+xJYy8ZeYsQWT6K8zuwDkiqS
Bbf+bqKLT4zr8nr7vWHOVu0uCypZjGjK6s98VTAh3lkb+bf6cCTuKWsgZU4c0DACjK4UI/VJ0YAq
3/i91PI9zN45BKLqCQfardW7vc/1IYkXZnXtjw0GARzaMLxyxZgrY3E0Pqw8fnzQaD1eHRw8OuQ/
VgbmQQxgjULxYaFlJEATEhE9mH3u8eDgXs5zZu2Pq/bZbr+X/87G4OC3uc9ih5gG2jjpf/u12pAT
IWhMuUpCpWn+uvlL++f1t+83E9u5JU1OnaG2oNDUzKanllxAubdHlV+y7H6T72E9niIaqvaNh+aB
2ogYurGz/arZzh3iTWEJ8EFH+B2Ly6t1cGCqE2ok3UbBHB6a62t7qFd0OyGI/wh+CXP0yRxJKvDF
Gca59WqvLXoetSe30ONofkjN8xdos0VKq4sApavuUvu/zK8HB012ZDQPDx/ex+PVf2J8fEe97l2t
33D//vhHNpP1h7Oea/PoU9s+8uBB++EN7emjz+6r+w/b/I3c9CndaKpnn7Rb69X/iKr/PDrUX1aq
fz46fFjUGcr0wI756t7Rp2Z1QU+lW58ffCh4vfx8H396qQB8iKqftT+lBzGOzdFnuaUL3fNF3vpp
FL+uHucOvOxNiHF1Odo+RnIPEQwB53HM0bA2P4zOa0ts7CA9mSPmY7dheMe5+2mrxZPPdS8nfXP7
ZzFVFRKWWwf3k8vE3F7iq+Ay+I5cFoUhfZ11Frlhb3Njd3N/L3OLGlbkph/p2/fvMveAfc7Ges/+
5k/v3tJsZZua9gZjVlb1jfuY0/RNNWSp9OQOjrLgzHU38qSXnne3kEzg6zdHu5vvdprtEBvLuwO6
6Ktfmu2G/+Xe3psjueAf9Dg+q4ribc+5e+Dl7i9Hu++3m20gW9EmGMUn0cCtpZznfrddKBhAjNBP
SUg4UbrAzY/iqrUr4Pw65sJ30rPFci1z46rHk2jv9zpnI3QHMFs3hUqyveWtX9TC0dutv256zRC/
wA84pk3BFPtdU2S4lAJMQvY9xGZE/zSFhxVpTP9utfybur3jPmn6hYfX9MfseDaczpIn9GL4xITE
WL3/pNcdTSL9o0OcYRQnD/N9/qMVN6Z+t1mdDT8NRxdDohZ6Ty+OOnJsT3qwg0fm/e5bsa4iip5E
qdnkHFYfQAVWWmbSMQ32ikb98xms6/yYW2paUmu3JlrCz+aKDXKpehLvvTXVgVldoQ42Cv5qSO/O
wwYZrzC/wQTKsLq/oD0OgmVq1bDLevPtBYG/CZKQ4ACx183E0UkPWDnwB/EXyES/EI+HuIOGDibA
y1qDA3eZ0/RiSK8RImKpZUkgVRSXnkbJsgkoNrs7O/sCBtl4WpU8UA2MYFlc3A0u4ldEFsjm7PXU
/EXzsTP+uAxYQQ5H/ogd8HHtI0kqCJ6AeSm+HBCn+2SdKt0evB8svrN9HXHArD/1OjM1+7GzSnQD
SfrjXDJwltGJ+sI1tiaactoPAnGrMkeQcVSIv+gnOXM15OhGg155tWIRVLg9DlTrc3IdtUUk8O36
xuZe0mt2yjm1QQYlZv7lxCPDccAyv946no6AhiBGNAbAHYzhZmeAjoRwCxKrdn7l+crKsoAxMaIS
O9VJxVhj+zAgBesMa4FvBp+/teyGNUUvRU7kCYGR0d9ttMcsAslEAv4mjO8HrOvaEu2A097RdDBm
UX3wiRtLM6nTXu3v/GHhHoof7fcj0orOgZL+ArCE9LI1+i2a0EldMwcY96E5oHfTv6f075L/SIp5
0PNtPtHyOP2+WuCZgzDzuFmFX4OI2owZxdUTlodO5Y+n+ENo9xk9QT3HcwX6SY0GJAJilgNStOIV
NelEK+B/gpLSd8B0PAVFxQ03ea1xK4PP0J70Iv3g3heE5OyyK0tiiKIuo9eQYi47Sfaa2AeCKA0s
FYPlzCZDi7YesZ4tx7Ecyb6dSNaXuGs4fvOiH6Oh8SXypNhDwcZ20of4IOLUEQUQ/9qRNscrbu4j
NHV6RmuGpw7d9LwVIpsjwUOxw0St0vw0bsR1pk22xIXH5o+RGD84li6WfpeTjOamCcG0K7VA2mz8
HoTbs59847ap4SNae55RTB52hRVi7QYTK8KmKfxabLQLwQ3XnMdHW7JBvxJJNdVumxpZrdpNi2OH
d8T6DqwaqZp04th/tda0lnn60kIsiTtnPGbclBNFcfNO3afepZw6akKOXC/uqNjQaRev6Ot6/cMH
+v+HDzct/ZL+rdev6bvr8Ks/0ld/vLFSgoJo8liv6D03qfF6ByklCyKwpto3VZKx4mv7cO3htf7G
b7u5DlpzvD+t75Ca07YmAnoaD9GYCmZtLfO4CAqsrXQ5E5JnWVfVj3szWA9TIh2uZEqkxpX8FVKn
d+Jx/TwSm5cEh2q2ZYg1ZAEOnSPQxiUgnIs9U56D3A9rU27qe/ZvQybk0LcAm1DBlDnLWwypkfoz
OSGbSZRgGlPDEC5rS+PTI4XrCXZ7wjAWxCeERwEgq0FgQu2hvbk0f7vwNG/FftgAYn/hy3bAQ3AP
d5Loqx8g2K6Y0adlEm+JD9aW3r0+2nizSR3+ae81FBYaFPseHWNK36Ab+55Jhq+iaXinW1dN9ydy
W2g58tmyioYoR6SzxJ87R6wFuh1RKZh7bWsrfui0pdR7gj2UMJB+bAED8HTy5oZ7s5z97nECctU9
hvJk97oXqlCh53FX7mUEN1TcvHQ7LAxCOne9CqGtwFgBoKzQc8Czoq+6x2mEuQWGyOy6uHfJa8o5
DVa86fdVvTkN9WNnpmf0DKDY5+FZmcveNI9hIUBS/PwkEHZdsIGijTEDYs89w1zirPEbNMUr7lmI
CAjXiXGwZt7Hoko470TdivjqO5BgCG6fzt9swJGIWqpDsE2C6LRUaMXomHpT9qMk1vLDIOh7CVhn
bmRNnJYl+d+ZFz+v767VajWf4xgx9oG+fMJIC8W/FNLGPDV7LbR6ffa3JBF33xpgm/hsn/atX4nx
y7N9pa1cvH9IFIMFGjZo6fznVvhaG/KKDZYwHDR99dnigDPbRmund2rt9R1bI4H8Dq3tr7/Ob03x
0pP2OIBA7O1qzWmZfqY9Dk4OW2xqo/15OO3guWXb54rVHkKuRMoTCa69ro2QEfdYtz8hcdEWG1q2
mZcInIBPlAk+A0neZwF0Nh1VYZhm9KNuh3dk2XS6PmcqYDekMkiwA01F+/UtJcL75meNarGctTwG
nhDcmS3nkWIvEyT+4chUf/7Wfh5JWhEX3yTqcxGijyqvaIkdF4MoVoS68CLbZcbCbKqEIGQEaJin
WqHiIwhWtTcbmXF/3IPR6KN1Xya4wsNRlaN6hemLyhIdY9xC58Tf5Wvsl/3eOQfUFgpiYObwJURN
gXCQegvNlXcCEZraEoB+SXAKXE2yLxsFB+g+2jSlg5Xqnw8ffajJz7L9pfJDKRDAE3mOWj3qqGYM
iTsieft4DYo8vyc21Yapk2BRV3OTHJ7IHJu++c1IrRi4NGrOp1GN6PKLFzC2l7Xf3E+lX5mbj7M3
rzqbJU1GH8uwQlLNakBGf4NqHB0U+4ekPOOgQ9K/OnZfJKbXE1MuU1/XzKWpVFTSYJNiw7JNJzn4
97/I3F/NPuBoK98AyooJPXVaEg1LZ1jWSsZm2m1TaIibR5/o3fIEyUuFavDI+V0ecU9AXU+FokFj
7SlWgJrwjvtDVIYqcwRxVbMwSlCy5Bv54qCKjKHDUqUFqysDcrHH3WKMSqAhUUMnB4TiW3d0MVS/
ifblSAWSlNHksyeW8u16W0pgYr7giWcMxs00tcoRFlJRxQ47sJfMPTr2Z965CQ3qITOmW7g7yWb2
eIM+GJ7gz2pN2ZaoSYQFjCe9BEbgVOQqjX0UJLUkB4jN2TQ9AWQov1HiCJWRBqYo/h0mqLKYzAs2
jzga92un/enZ7BgZTnXsjrjunDA3de1UXJe2C+aDWwN/Jgv0TgaqLviOyqb/R+Hg18Lho0Iwu35j
rCNTU3G99vAuzZW5vUqh9rD+oVEv6UTbpZmmbDyNnGWwRq1vy5w23L5nrvPN2y+84HaJaEtYzFqB
aaZC2DP71wD7ZcM7p2BFf8VwBbwEYgpovgs1zucD38k5ty5fgCN4jTr8VdToRr2BBL8H+9Bpfm4H
0ikdx6D61arCGpWurmp70sWbG4M/8ID8+ob7eHNTSh3a6OITZN1YbDulYqPdjs0Vr6eBkadQfCyR
EjfOdmFlXo/QZNRT3CDEOVBNeVv8Leorb3bwF4i66WUnNHExKRhxzWzyBNcT7D0JepKZtQmxUg+s
nE7/jbkEooJDIr0Dxs9qRCLgBXXJQvE6/q2dWzMH+vZqLAG8hx4FoCHL1HXp7HEIgpYDsn+3i8QC
i2U2tz16EKPwKNtCG6srN8QUvXCG1H0vkibBOz1+HTPBSSa7UKTfU0oNfTcV5pieVNVzAi2XWz0H
1uXjXD3nd7Gv7kfnDPuI4DPld5mIM1MO63hWJC0HYrHhbTztjGsK3kJc6mgSXZiDahVOn0P88o9Z
n4TOvc2NvUMYr15gOlnNZLBXV3UySoLaGOQBUWpQ3FkhHrFwC6tRbErsWi+RdG7zLBTHppjyyONU
S4TEzrvNXf4e2KKAiBYcBfRk2UqGrMhwrjBjxcLvAYjBMnb2ZHTOCHsIPZwg0I8kZtJ/KkQfpv1z
71HWDI57RG5k1FJx1c6B7l3NsENxI+QJ7W4cvV3f2zdno/Ouhh3SDDLqIUvm4m50yT3isORZRpXX
iNM7bUgjJlg9e8UyYAg5+ZBLbKjOEM+OY1IWztmxNgZooFoaeBqQ1CKobSrdyypNOk22xhGxemww
mZr306UvnriSUVAn+KunYb60fL/k1W1YWLlVxnsSfeqdk7QQKdSjzDT2Qa+LRLztrY2/PoJJ6xH3
h1p8LH7Lnnla5RN7PJvE4j9kBFk40DQh/1LqqcVnJC1+a/eeXU7IevcZ229sNnbrb1/Vt9+/tVkF
J5NowIVWSDWKJqds/LEklOvOIluAB8ECEjXk4vmTjIliuRNNpV5j4WMl41pyxUQlh4pbY9QDmlhd
clBw5gDYltavv6xOYmTk45yHcAalmGvfmQRCv7Z0hP2IY5WSzOCjuGrU68XSh0mpDqWGvznnb4al
ukl9tVKysViJLCPVvwpFOAH++Djw593IizuDrhhCYM6C2qJhthgL3TjoTfodom2fekCCVX7HgA1K
XpO+NvwwGH4l0e6mZ9CVvt5/yB1XeTllrDl/8MA85KAbPaSpOcEctleEOrRXZVVoBEzxDEP701UQ
NgTn2JK8vS59KVsfv8ymVpEQpkW9LdImPp3SGU2F2kl4DHijFxWDj9BnmjfuEGmC8Vn/ZOpHqshd
3NGK9heamL1zNXtvRZkYrrc0Jy1100O9J3uVA18CvuefJH9d0GNemkY2MElmTmMjHdV3HmdfiubQ
LBWk9bGyE94LaV6S65jOsWH6rV6p33V7lIsHUu79Nu5xLHv6ZZVaYgJ/bANsEz/EPTi6oBw+frFm
GbBXKRQ8mh5a4LLTpp/47WIDtgtKZYq769svd36S4bnjTSMhomuKuDVzCaTYRbGsmIemqX/4OzWI
Fq1OAYxenRHhxjEI9i1LbThOiOdk+uGtoN0Yj+gOjiJlcpLs+QFHp1niYPQmb7H0VNDFzLl4t7X9
WvaoN7Z3O9uvjXTmPm4wSbyW/Tx+/uz6yepqxfiHtjHnFDx5/FjPwX05+OJ2AvMGPo6ty4VUTUhl
j1n0jtMIufYjVINEXP6FZNsGZFWSZOXvNXq+UoG4yX2Z00ju8rfmrH12PKvXT549of+eXnMNxutX
61tvK3c55PZQJ7PGlp6coy07fu2P1XBj615+mjojt1IKb2QsQMgJLSYBm/h84a7FZ+HOxeeW3YvP
7TuY75q/i/HRnfxl2xifx39qYHcqv5m3h3nd/9zgdec1z1nuYMmDZU+v0vxlT60VVzV1pKV1y654
7JrRnWF/jEQA8D1a/ltkvltJf/M3QqHIfLHw35SILV76lnPSpZdMl5PkjLBzOTshWN3MA+FRn7uK
YnHOW0i+cl/he857XF9wUlWNDLoG661Agekixl3hXFnuPW8yFq3x1bdY2yuzRMzZuazKxdyOWHDY
bXx8iUCNld9WVuv0z2P6p9Gt0j+2fLfl9jTilM9S5UC+wIEn1S5SYVZWqh9WGiv032P67wn994y+
ePz8Q+P581Lam+nUYtGfBPOfU8MYzZ8Ftya++Ky+YQ0aFW+aw9VywKgwvtDkMeII0FXjM1IB2Na6
Um/UWFDl1tnqYnVLq7M2wJUyHn7p5Oab9b03top3IuJwybVYL8NbL+8ybVPYFXQu26PCsuZNq1Bu
tcqygnYwwotrhpT3VbpXolUVtw2KZx0vrS0lN0Ji5HHw29ISOCmXE9m04RO6hXHskklgkc3OxWPM
hTzEQQqddvEHy3CI39IgiYatODeLOxj+e5LeS2inlHGORTYso8lJx4uAWPXJ1n2DjaWGAgtsA4hh
SecQpAtek4tIAYw47rhIU2D1foHQ0eac7YHV8FmcGAUCk0Bii9D9T+PN3e8aJdQ3pdRCl1oWVSgV
VuNPTbHs6X1Dr1kYSEvF1Xa78GRlpWCuaCzl+q8Hv5rDR4a+MfKbDr35Q325UKio09saTlMm9OS1
Vlj3O4Ky8ThSoAdswNAEVFfewO+pf9wBHkftP9aYMwyC/lf5/eMk37D717PCNo0FqWBjAkPPWZyR
JNJ42caoT23Z+Fm/+60tIhLcwx10YSfJV+ZAo8+oJ3TapnGtVhM7Icc4rJkX0eQUX64FWvQ0bpd9
w62vAxM1ZpWXnYxVm37GDz1ql9l527JaquNOLIpcNTiGpe0eRFt8p7IyNmZjzqrVyYD+caB+cFFU
q51oXGWus/72Lf1pkT0wLpOpPeh5iKpVMDbnXaNFqDT191P6HS6AK3T/4C+HHKDxF/XuIHaRp6nE
yQtJ+UqtU2TDlMYM0uXqVtDdUjEVxqOmgqbB/cL23QJn0B40m43DSo1TJwTf5wVyCtZazkc31Oq4
HQTSwzEgK60p2kc2n8rZ8u16cjPeYvL31oAfi5VBRAJvl1SrXjVI2L1ohxSK/GjBc47qBAgOFYJG
u+zYmxdUzsp0Etqox7uU91xaG5nXt4yjNummdk4X5/beKYm8W/9kQ/igoeLeScwN8bRL7BRZDpxK
tMxuNQWbtGvan7JnbFiaSu75J07VQoBE0rCu82lvyG13Mwsc1k6RRT7j38/yiPwqSGcwn/3bp5Q2
i+tAyp1mhS5YDhOyXyie8cH+UFyNPhQfYqK9r47x1a1O1TObKUBCFHGEwP9gvCzR6qElvyJd2jJs
dP/4bAK5nUNXY53JCTd3ZJvj+RRLVMesPn0mTpaZ3GXH1zGlI/fCauJ47igVW31yU/hdYqQ2ApQB
rqPJtmmlivFg9Kn3Uar/Jv6cxO/KlRHY6ryx8+4XREufaMAYENOEimXqAppBL1JE0Iv+ebcTMbaW
BankAl7Iul9WszZX6utaHL46CkNw4Ga3H49HsSBJCZIWIu0Z34HWYxCZmVac6sMB1J1cMgLiyLqO
x5dOjnX0FWZzVAissPDdSpwnpvjz+tstzst9u/O6ZvELNXBsdHIill9ph3cDJgdZdTKF9rWMK4zI
OjHv091nU2u9t+AUIjvbpPUTGa8qAVyl+ltzdH9okJwl9kV2RO9IBmWpwgFThcMceo9tqkyOv6oQ
a5sOxlY4lxSjsuY3VYO4wHrNvs1mORGPTJ/dsJe2pSQC+p7pjOG7LxRtdnKhXtPcoDrRlLVCsIYF
K8IS35/YHKKccG1c18uyr7EeBRW49wV9UwA67G6w+70s4JWa+cVLnewBb5V5TSu26p6kDcgJSZ4W
5SLyY+5tmoKtzNvrC4z8dm9GHJvOky28xjkEYA6kxmnaJPcDJ9al4wnv5wROIsjuNAq2CP34aWf/
pe0iHxE9c8NLd+pe/pg+ePBewr2KkGwNhbYL3a1pYwH4IMdmCGQYnKF8jroOvheAsshfsrkCbGd1
6HdOlZHACYgMCJ09GvYYSN9bQVwqMKihIAsmpbltHWQNggPrLmRtWNx0/JVNIyQt7gWCwZ3atMvt
FW+e36LNpuaMuuruQkkU+z4rn32WK03J6jfVC2HbKU4OJi5oQE4q8qRgYmopXj/4xHsna4Bgc1Hq
Zo8DlUzm+PKDckKd3h6cZV9JIyX891DTEoxUVve5ZpHi8JQdvE1FUCQl5EFu6SsyH75qOiC/F2CQ
a8nfvILnqAVvOLzC+9qVgTcFugTP9Cbogy5eAqI/NJIgCgi5yEtTxdGlUw+wPVvCUUJ5v+0M6aYG
peMQOWe6YQsAqfwk7xzWzdV0NG4jkRE/21psqMnB4vVfcTvX9qtbQ4H75sB8mB4+VPPAKV88KHxY
efL8MM9kwFImdgH3CnN/BDLnxF1JoCV5usCQ7jzzBRw3Xqek225/J/03MgCT1EWUkcgCewPxhMpa
9fARxsTGJrzxHrHeinTZCAR/5zxu8a/Udsvw+JpFDG2Z0e9buKFd+KGw6L225aQPybbC29FEcdVO
X4Fbp+8qXpub2y9v66bJnV7ihzy74YTbsHANkxtK5iOHyQ3N1Umb9gG/kbGE7p3clFjuTdoQMBNP
tk4WT06QeQG1xtdWiBy0QgFExQaGzuf3w1pEvz0u3LbILWArYEK/arHxbHox6bvKotbwTHtz++et
3Z3tgwK6XDgMl9ORg7qNwDeFLKn4QJ12zWC81EyBvhSrCTxDQ5jek57YttJbgVeGMWt+IPG5Saqm
Lj8rwZyLze5yT3QKJCtpL8hgdync1AiSzQOOleSwMM+yJnXkKgyR88+AotDZIhfUInS2TCMWmFZO
vSVKvDEaIDgHlbpQE1ltGlCO+8jMKt8HfzoZNyu28q/EPRKDY6t9JCWrVZCqebsSkgb3ZM6W/NS7
XEttOSBV/c/accUV81+m4Ladt51oLNhN9HhSL5QX2VFs7p/qt9S1HNpdyFJtn64Iunek661RcTvb
m6kllwVc5oSkZfMZMBbLnOAeSxnfXdlxsWpdrLfZAhPsRRIT21Tg9JP4K3ohiy62MI2K1WONL/wo
JPWjNCiSP4oQBtUgJqwDaKnEkKLdtndsnvldqBqR6pxdRtIT/fLk/+rtlqJ9OU/439GMFA5/B+qX
zqj/akJnW8hLn/3vvMLZqfsKpmZlFPryHk/3N1vq/44MLaEGk8HdGMmdRZv/S/nM/0ipZd3svVmv
wgosfArOOkXMHXH2+7Rpnj0xXKWLI0LOer+5ilHsxzxnAFckcEXn/X/2jqSdlFP8hDbFyTi0zrt8
TDWok0A4lXDcNKKGb2U/GSt6Ii12VD05vHr25KZ4u2mdHgt3ddSdt6H5nFuhHRg4o37MEd+Hd9nm
cplZKv/Nv7WZLBRXk3L2qkd/oHPwIaGrZ/1utzdshpaYpANNw/BG/TjxuSr21WiS7C5fwC4+odYV
vfDtzsZfqbvcoQVnD3pVfyjWAUvqvETaAtwqheXkBHC7Pi0z+nS7DBXKHq/F5DhR6bKvTl6c89p/
85nB04E+maSQpolm7u76MkJ5K32MP/XH7ZWvo4/DrBJf0RbLwwwVpEtYHVyupAlc5qW4Cz89SbuO
daERsJRdrGNu7tTKVXaMbvf821f+3qK1t+oA8UOjNlO65QUNa61Zf/GkKp4mmm/8+Sf9E8yzZnag
yjFmR+9SxXM439+s7zv7nNrQUOOGdD9nzyU1Y3AZ/+O8nth161pAit5U5aehQ5yjCkrEIAnmo5pp
P+J1HJETKQggQqPED3QmxVPMxQQVnOgY1ohToHdTqXTCiNhT5LxwFBAo0tD0JpMRxxiZhqs5E5mY
tv+QwxNG49pSyqycPiSYLfMCk/TlWsb+zjs5NnvvfxT5QgSNJ1YQfTrnROGf6uFDOhUm2WPTdnHF
Ho8a64XLwMMkCeEIO3Uqv9L1UEDR82abZeVSWqadnDTJd3GjcSX1lriSNB17Lds3JyeTBiziib09
uURT8H9MZXGt/Q8RgXYFjU/PLDY555CV4QpD8uUsrhNHZS9sS4EmPBuObunTO2/p2/bq9y36extx
kg3qG3P+xn7OxJtVTfszBfYUYGvW+c+elqgznbEnEXXK4CzRfE8lw9cJ/NU1/PI13m9+XO0yk1LB
aBM7jeBMSFkp69nvO/Cm7ohT+E6kWvgZFzroojaXdvhIO5x4yG1ffQH2xHrIrXM68e3dJLGMOHQn
Sb6RlalpHCUfw8zB/M1zdZ4s8hcq+Ebo3Jz7rjReWu7LvtiX6l7n8Ob+hXfq0t/pfXJv3tv8CUjC
8aSa4blWiWAGT0LAOTHbcwjPJyPzoroGTOnZKTFh0DCX2slfEjO/phY/eqyYGjviBtKki7+8E+99
u/nz5ts7Ca0ZiU+HIjKfGFYCswt3Is+RIBd8esG9+F0saP8GNvQt/Zz3UW62KfVZaHcwGjTtCgmE
ql8hw7ZzRhLfMqJFAaNZG/cGuGNv6/Wb9+9QfATa7++APiWoLS8EUnOt1pkATY9L3/bjeAZsjD6A
sYLq2MvmP3qT0d7eW0bPAXVbhgO6AmKLoQ2i037Hol/WWKjlI4bW7a//GaPAJAPqxLNoyAAfHMEy
HQ1seXheETR4FHOdoJQNo4sCrEiNNSf8LSfQeAChHgjTiST+bNiyA4U6iIPgldXxBql904vrD+uF
YrfA/6C7Gei7gABnUO8UUR/lLI45YJOjDun+Kg6KfudIjnSfLmfxmGzcun3iFmsK34Zty7N1Qse3
N+E7mIKQfjSM43Pz29OVP5sqz0QDXRoxFod3t6nGZxFsT2GApQd362Nv8buIr3Ul6FcO9OJ36d1f
0L4Wkz/qDCXpe3H7eneqfR+NZ2Pb/NA2P5QPfl3+UD98VFHEney4uNhtfISUeMWavXfLyyUaidPJ
VnNAMm98Sq7IEGvysn58BKhXgW3za7bQhl78Tj2kc+ezqszutnbyJy7V0OEhbTEOvuhm9hgHppEq
2nz27M/PIV2i3iunMbFGGrOrtS94DS4niZEiNM9Vz3Rr3jFWPBjTWHHLEB9ptcSqRaTwgUuoG1WJ
FOFwDZxo88JflOR3H7opnKd/5YyoEeJy2AkJv0AAS7SUhGBLwc1uzbyL+uJMfKSEsGmOR9Mzga1X
eD8Ny2EwRoHtK49nx0RlKxy1w1jwXRtOmgK9t3gU0wt69nMpRgQtibhSFCAaqo0AIXQQZM9PqrSK
xCFQSwZgjxJ6iNoxRD3PbekBZuoMDcQVDAQ7BLUO0I2JSxug7nZHNFOrbKbGRLBLXkpZXvamdKlh
IUW0gJit90lbZGNzd3/vl+0Nm7zleANelGIMMXIoUW+BfkJ9xE/mN914yhfwk40ng3EH/3wyFxGt
7CkAgRnhncQAbi/9VlaqknIYdq+kzroIJ+Gz9tYBnVjGP06KKOSJLjICdxI8Jlgp5DWvU6psLDWz
XnaZ/wJBF7/Sdz0Au7sBtwbkg85Y9jq+DdURbSpRSsKe8Q5CFDBE7BEkeaIFmHydCR/91/buvsoH
qDWsRrZzEuWbelxQueO8Kx52kSrq6DcHX+jLYmq+Wz05hz/dj/t0PeZxaMKPQmnpQC2zDu6SGlfe
YLP3UOdTft1bJ4JHPrnEfuD6595U+J5c3bbtJHC57iRGCIoI0JEd7d+ioiTfkJ4BbZFFfPeFXURY
BxCBHftzEj4TXFfgdtvEwkkQgAPIAHPGKhIkUzLeJEBlB8YpExDS8M400g4Htp3P1rx1FOot5DEt
FDAVj2cDR7yRu1c9aSi/IWLgtz9GC0n7sgeoYbzgyxr2ZEQMQmVE+RVqd5HenBNTHM4jI8HqKRIm
QF2TAw+VF6m05ZwN90PljltOCnl4GlJLy3mkTfCAPLK1jRl2icNYRqIWSGZGbHbe7+9tvdyUqhpN
sVknteL7NjsVZ50LQiqcZ6oID17hCuLUUSDHJklw/Rivuow0R4qfZLM6GF0pJmNLXTD8bVCCQy3/
HwefP/L0SWWbMPBeFUq/BM8kYvQOpkZ+LZuKqy3KA/dxtkks+kwzENYas+xM94mMFK7Y6oBr2NDe
0OdyeYCXJy3VcdzdWQYDztd2zYXkpEbbpsBmhU/eLR454RvsXr6XdHQgmnUV1a64bEv1FNsZvwWU
BC/nEXzJs0pl0Ks0ifHMAB3vnnmzwxKSSi4XItkwEkhmskK6JOxXKBKaYffNYIRKe1IzZiZMB4lD
yeTkUVJv/HmE9KuHqD1UadJ0ZxOBxB9f3vHU3ze7tH2r3tFdFtQEonIcoyb7WCz0LlOFZ5CjHx17
jrQ5DobkgPJq1TswciL7ceqUaw+JQfR+o4cAh9CTQ2OHn79f8W3B5G9VvpYsR1hex+dqBR5byFdl
jXKfkbXiZ3xG+zXLJrWG9t/uSQGi+cV6mDbkb88MY1c+TrtrHIxy0RRmWvIlAq8l3aeLp9urvNTx
xYeWf+WTLzjYVVoAldztmE/IFaIjA7MYZ4HkCN9huIZKCmnTiNcnZm8jh7LG82qhuxuksDw2T8xT
88w8N38yfyYNNAMCpMJCVjdOQfhYsw6zeE5b599YQxcJQGY7i9wkSKGNZCbykHW4sXt+YzngOuq/
+NQbTxX0ofe5PyLiNT2Pk0RHq4mJ4dGc9yILPjI657DqVJtRZ4rq3KTCzqbuNqYMTE20BkaiKto6
KKxJ1oLGPDl10Xm3ouvcbZg/fH9vLiYn2R07/1WpXex/vmbP8g7sB3+GNIOXsNvvBl5/y9JEgpaK
r2o/JpW+mS6scD46jQU0uJVsAl4y4ESOgNEU9CCgO14PU3mQ/wqNThFGEQ56XTUXAN61nLIK+qeY
EfZgtbO3WXOjd09FdGOn1t6/k1X4Jq/O7re1xO8NIAd5zjjBGcagu71qdzY+5+rsxAmCUu2mLCVq
6+zL/tYOAm7alU0DDAMLrFIot56q8OnbUOVBWwstV5R17aRgF3LgAtbSr01ewXFdnisoc9u3d5lw
CV6/HjwdpP6wqrYqZBpQ/y+dM5kBFbTmRp2roCQpqd96uWjDH6EfnQSFY9qfssWZpnUEbBIUyBh1
NexBQFC0BnG1ceOVdsjUFLQlxFPFiXPvJWkZ2EOShNvtcw5+e2+jsfJnuV7LaSfwe1xt79P373ff
2hpD6TfcUuV2Tk1zngyBHsF8iIMU0yExH7DG8d34hfFB6Sdbj2lvpXa6u5T6niFptcyvcn+uwVLl
arvY/09N9Y0p/L26j84ghJR7hYJb/PU7XShcQSdv8mZm86f1rbde/SV9BdfKkWY2B8TA0UZy/40f
ETsV9Ec6I2HLu5uvt3a2vaYxEVfTm+Xg+k0wMu+1+9FpzGO6CUFcXYlqFDfxC4iEKCtcKplubcqq
8kEqFzENFWoVK2WLCaqUkHR8f+evm7bfqWbFUy+YwKgfC7luNDQMkGID4/qMzPy5aYg1jTr1F+N+
d63eGQgYvJoopK2L0eS8W0UWUAItIeBcVrcfoX4lJByX2sNZ7hGHBhCJjKdec8cjUh9RtsRmFi0s
weketGTyTAqN0oSuz6ZntHP+qSgdP/aiCV14EBeEjiaT5Odg43Mtky2rWFURsKr13zDnN+ageIUN
f3NYsC3R2cw4uQI5Jqj36L3gX2vVChsJJ/7D98+/++MY2O/4jhX6PH/69A8rz1Yaz582+OfKSoO/
pyuPG8+e/KHxdPXJs5Xnz543nv9hpdFYXXn8B7PyO/bJfWbQYYz5w9PnR39DrbN/xzv/G33u36vP
4gmDO6CcISpDcNkAty/AFJw1WNNX2KgkfuGmb9rlZ2LBno8YI2QYjeOz0VTrjUsNjarF+rC25WUz
Pp+JRip27+qavAmGFN8XBqtJjYGMBuNoyEXJR0mR1pZJtAxYAZMK4qyrwhZFjZ73j2sAwsIg92bH
KnwoNINIOfIpK+ZXxQ7VfI6NlBsiRtH93I9HEzarSUF4iLAtNdjF1lPKjQLbwn4ubBnqLrH0S1cZ
kuvPNrlgwqV5/46BL97tvN3a+GU5qDcPnehSeslNax1i/ujvJKyYMo3V9pSUjv313deb+0c/b+7u
Eb9v/1a7rP2TFMWz0XA0m8Tm1c7uxuaRvFVmQY3XIpyNL3N83mLowpqqVSHwfpty42kVkKJ2fBVp
lxdXeR5YAtdKoI0jq86gItqmmr2pyXK4aaQlq4XwlLInIL+A5qNkhjHpKL8p8zZMWpj0YPkNCnXy
5nhHW6VDLDxYjorsE5ncYN6n1izCUVi2aJYrNIwIOK5XFCcbi5uyQINeUzvbb3/ROGgB+IsBAKhl
t9z9ugWhnXzmmn1c4C/8TMJCa1Kk2nXuuDe9QL0Tu78x9ToypGBEmeYK9+/fd2JMAV1hjM0+Eqp5
z/cU7OTkxD2jJYV4YwTYV7YKWplXtj4UXQzG54oczuikh8KDiCsBHCJJY1gRhBDIIjy0A0E0L6wg
3AGvygaTiWlfQYbYEBcXGE7szebblwDkxSt1lPxi2hjnkPf8I9FmGF0YVXoXssR4jQa/fdQlkx8f
tV/WeiM7mt0MwBgTG7lOtpygchr9RlA/ceqWtWPiq2LbveKaxQzFlIFgqriQkBTwFKzz7L3qav+A
WBmbU86pgd62sclrrzv99e46faFhTX6bWjVKG1GMNkZ9UjLvCo/YNEdU2jHl49lwKjdKgXRGRW7R
u9FJHSXTGcStIJZARhDFtuwOkOYkBrGiLxeiwHBuYgGTL4R+l7d2N6ocwopyUVFY0cZFLLVoqvXl
MJDOJr2UDTU6lchwMaAZrq+iYU9YXLt/j2eDsbgmtTW3MMtCVHRy0BgA5sDxeINvIiqdPbq9Dqpn
05YdTbrAqL1bbWBXvpVBCbgasXx5POufT+HgtpCa3DHHDtv1ePJZYJdCXtO2ZC3Y/ism2BjtZyvc
nJja1t/v7yT3GTEC0IkxKZNAmwcRx2diW7mUMRjVJNvSZIpPCf3Qkn/toNStMQCGq3+OJvXz0Wkw
OfS3DHfjzebL92/tMPbQKURxM9nnsCYl9nHC77AvOfVWuLO0KFuOOvXjzt5mO6CHZftkU84nvdsU
giCpAvxttEexc5cyBVyXlvY2375ijwZUqXK3bwPcrn4EovHezntaiIOVwxuA5AGp/KJbqRfLJKX1
5t/IjfJCB03iW1xdol6Koc3qnR9WHj8+aLQerw4OHh3yHysDY212D9n0hmooQc1X+8zjwcG9nGfM
2h85QKnb7+W/qzE4+G3ucxw0bqHKPfOTeEXbiRi3VNOBsZkw+b6wBHrLcIZLTcyS2/zNtrv/RkPP
BGRoeuZOkXozrZYPXDVFgYkTSK2k8LcU7OWa4JxlInIVsUTUJOUauoq4x0jN3tFGM/mH27oDvFrl
YRHw8OAGBzYk4+ljKtMRPN3Uc0/zwRf9xprtFfu132yTqID9Pv0G75HwQDfb9vv02Wy2G/YSnevm
3INNN31zG/CuCkOD3jSCz8CURdCq1Mz7YTQDl5+y9tFtmmcrxA7+MaO5iutnWGN2hYN7I0HJrFYf
f2tUtd3Nt5vre5t7R/9rjygi1yV7xZVShR9L1xlpa2ebVpuLFInNCkh0iJ2TqCtbbA5inWSk4mRB
Z8FOTAxnbOOKmECxtYz9NJWmVAngYtS8cyVY51zrWUNQdBj1iQkNNnW5cdKrotKuk4G4w4zAegzT
D756tsIzyoriaHg5AAdef7dFN3RJTqnU5EBbgc8PrFZQeG+ecms0pmbyqyvO/oAM5TFgUJ+uFFLV
pMJI/lSfrs1//oPIvylNL8e9drsQTSbRZaGUZyJL9fXgMM9n9eOoi4AsEo2kxLwnDUMEIznTvHBC
yos2cTOAJKl+wqlOEKML7XbbvCBZZ61g1P4o8FgS/eQVZB51L2tL+o4jloGPVIFwDgp655p5gRf5
mU2MNAI7PS6InR6y1We9xVvWJZV30/Va6PZM9gZX041O5+ZvpGof49aKZyH/PP9BLpsttxSK1PnC
3NvOe/Y2DC3/PrsnMM+Wz6EzmRsWbBoQmmhCDMSOuVQ7OORsiHNSwco1W5a43S5OK/R9DYtl6nVT
KJQy7/GLu9AOeVG+UwdSb0zqQrfbAkmK01zrTqKTqX7DHbE9C+rmVmQDv7tNtcX2ZuUWzJM3V828
kwzQwus3e+vVWq0GyHIGyF8rWGS3GkC+YYRJQNALtP+lUjWdWaJphTX5+2ltZRmnRIpYF2pLp2dx
dGTfGezrvA0tkc1E36h/Fqd/jIiI0diw0i+BHxp+/aUUx5UgSKZjMcGR8OUvoDMBgUzOXbH0YVpy
hy8cX+45pOtzj9PoUzsJM0DrpeWk7WrE8xWbFy9eaDtB2A5PJkfqXvF9XEQhE7KDS1n8G3zrQeC4
Wh6uYzmYOfaZpIL4r+UX7eu19nW7ff3ieu26XSk5z2CpnW6S1jykOtxeQHZQ1cxG19PUrGhhppaX
OImPVogajXPrg5VelCo+oUKjCalCs3klv0ovqMPyVO8LnloL3sW368MLnwredcenpMSkJEvhWYRU
Bh3VFKgVO4d5DQV1rfApl1H+tlLBA2E0VhB55W4LKkI5mi3hq8Ha8oGwdb3mkFP/TGaoKAtgdESd
ka/ARJOJUJ+FNXotfVOufZ6dD3sTwcsGWSTafnBY4cYOioioTm457x0p10d1App+5gMVuoXItvTZ
3hDrNZySEcppDU8raPIv0/hzHsX+lpLtffOy14G0KSZxKMs1wLzE5vR8dBzB5gcNCGjGUvRChG3U
Q1LpcyQxGwM1B4qyYcps3mYij0HvEjPb2V42b3Zg8WuoxYjeyDth2fhmR7G4be+QRmLKtJxSizie
DQbw6VqQfj9mh17w8seNN+vbrzdNeaXe+NZRIDKmNnBbZSD8K8YCysE95W9sJ9orJKHFcGMdTUlg
6E19FsZmR56dXGamxh8xomILEuUXiewresHtc4MhQZScA7lyBCnQ8bMwpQK0MtQec2IBbL/8F6Qe
qnh9lhkxYO4TrrKt+umNjUPwndxCfwM9OUOKRycnkitr38AG6ss2zN+o9qbOID8tKk2sLI/PFgjF
CmBogUTiyGDmdm/e8MSCiEm+uxvnlXORJ7Vo15WE1hYbN0CNG0fxtGeqMZGaak4NXf9z32y/Wmuv
SoVs66RgnWQ4cmKSVUwuAX8YK+IuhKlabpvJUi/sM7/Y2J6vcs+1slfjll6Hu84yGPde2bL5j9rl
n+uaKV7RhRvE0tDE32QbCUJg9E2qwzrGa79WZvohtyd4whZyg/By/5F5aHt17brnM5OSil7lXM0u
Yd36+ko6LD53kfTm5OglPqe4Dzu3TAidsgkL+VESG6M+pbw5insLZ582V3YBgDNkv7RdCBYlnT7h
f0766eMqA7t+mD2uOavHMp7tnV87kAm0+jimnrcwJ33ybtOrdMe+O6/Ip5dckN3lwQzwBmjfviO0
CZc89qpHx5o3n+BzG2SGVEWqEBwesSs1zUc9w67o4Ed4vcR9KG2dg1RrGhY7Zeg5czw7OaEvB9En
2jLaRLffgwVkb+v1u613mxLA5azr0pYWLxTYH+wSTrIrMD9n2QMFF0nHOIk66CJfdXmm3mHqZL2J
1xgV/DkX0aQbH1TNob3pvHcdfE+73l2xR44HnD5PzFWDfJCwFzBRHksZKjCXa/c3G6alDqplPNfi
hgrfl1AOYML4TSccyzqzNX7MbxoxzDmvXDgmJxcE41K5gTgcd0GmOP2+ZHxl/rbyQ/p7nYec1Zk3
bldwS6o9AlKiFAM/8WH18GG9bjFStQKkTf3sNKqPV1ZSTOT3jCJf52CQyJa9QdXYnqZBe05iqVPP
Dt1l9rguO4fjMj25LBgDly1k849I9Rf8NUhej/wAHQk3GNIR7nUraF5dot/ani3i9hH3N4lr7v02
XUMlRYZRMb0TWmOucXeucHAWpWs2ltzPHnuKXakOP8soQ87m1INlp35Bnd8fiqgh12RUojkBi7TA
HJ1zJKuRwDmB1olQDTw69yttQNL8fEEbd4qkba2gco/EK3OowBHv6GHvQqpq8eoYolqdCLZ0eKYh
M8uw3P2cyTv8jNB+s7n7eudo66f115tg1ME9V8lfzerpWWdS64/qgVNVBRP3+vChm+bn4tXU3iTp
hbKblFhgTymEZQLcNu4Ph4j04l07HF0g4ZBOOXGFWQcONW2sQG1jfm4Kqtxpei+9YEJy+Gct7ZAX
PoJtISHa2la5VzutiSNPqlFJzV08WxJLecmBHblaa0kQG7UHX4WG59o5d+nS9LtDIyZx/D12A7rD
W1QG0az+cIMQNp4uUy5eyTrfVLh8j5J0NnKo+/tOQdQcMFW8cqtz03L1tRJy0LLhHHzAWkwQWl4E
goRstGSf7K+/bsuatnCykNFRHY6q3d5YcokWY9LbAmyb2z8fvdp6u8mFTu0fN7Xj6FOtWObeVWfm
0YNfHgwedB+8efDTg71KftnMZFLf0deYU3+0/tzds+lPPCfVf4DG2xtz0HpCgP4kr8JI6pVG8Lxa
p36/pFGc0V6lH9w2iRZ+JzSTDvMaXSr0h9246clyvM4blyPgTfZ7WJ9wGBLEmlLw1nJONcZKOCF5
ZfyCaUlNA1MUbGpb9/ipydbcSlXmzOeInjrFrMgbpU4X6T38usLti4C4rGQJ5ABpVbxMAJUMsv7y
R+hV/IKbGhAMUgvTYv9syQL16Ys4nqBUm79q/J0mIgXzsmQnvVwOPe1rXD4cUtWCrFfeB3+jeZJ0
boY6QtY5B2SVQyf7TUzSWdTpJUvN5NnjoKawZ4uvc2QWGpWIA1eWbzqypAlzibDY8B0uzovY4eVo
hiKd5/AXd/tx0r1j0tJOzi+9XkgOqzOQcFuF7I7fQwiYI4+MaWRDxRhXQeiRG1+3wxTLVIk/P709
vXLKasocGiPLlJet9uP6xl/fv+N0Nb4JXWr7X9dtvyw9VwZzQ19MY8cBq+9sqdg0aoWtujjrd6v0
nGKa1iUdRKNUShIwWclA2oSgod3jxJudyl3P3ij55/bP9JGneX03zn+uiDkQOJizwahrYRX526xx
TCas4B8VScsZ9OIYcovFI5X8d63oKGUPfG4Es+9IQLIdzIhDEGF4B8a3Pkc2ThxfykypZa6cQmSt
BNY5Qf6EcS4zq1L5UB72Zjc7O5kbgy2Sujpvq+RxOl8/t5CoFez9NBN26LZ3yTGWD+0jWzFzgaGG
TxqXYazuJ2+hB7szgFi8N55I+W5nb//17ube0fu9zd2KJv1kr778sTLXKMWftXD+7NTRSt1p7hY1
HQCIftk7Wsq07Ngtgw+gby582w2j0KY2eq2QZ6/xDUhsh5HfaOZiK6qTCMayr5Orc3bBrWSQ1vwi
6k+PJAT2Uh5orK5gW0P7GU9Gx708PuQzhlgjaAMir2m5Oiser+yMJl1XJT4UvwpFTDQjZHgS5JjY
IdEuPfqx1w8u6QE0Ka4Ue5sInbRoLVlsRnBgC9BZjkkO2IbOzymTuHyTfWx/86d3b8G6cEPm8eJV
cP3mdtEF3kENzsPYj+cLz0rFVP6iBefk/WqVJbFnK7J8ofAlFpJNU9rwDCQ2RhCC0fVLaw5BfBrn
zUu3rjfc3mUBSiLCrxURYjq6ZtCGa2TTdDxjuVn1hLxVmD1CATAwgsgJ8jaT7dlxD5GvdmNhGXnY
zSoibPvR6ZAoT79jmSXi+4BpNRLh36qWyJwVHewmR0pYuf14ZA9c0bb4L525ezmn7s8ruemqANA4
7g/hRRQuHrvUFw3hLxfmrWChQv3y2htpQYshKUEK4+E4KvVA7DtJKTuXusUJAUSlE/+K53MQ9h9A
6FmjHSunDTUUp3brkwW79R+mNG9IpSy+XrKPds4T59CkB2gIGaQKtF1nfmwpNbZalJuF4hV+vfEI
2VfsGjdJeahWPtw0g1uFVZZlNnMErXSHvnjbJVOV3XmZG0NMjzwKjOjXQW9w3JuoBYcdpGzEUQqh
YC8SDw9FijedsMJxj3PZEsy3sxGTpXgyGwNBxnQuO/RFOcdCeRHRv84eWdGA0WEC8YjqWYNoOCPm
8DGlummqjRp3SN0RBDdGxZKHHWKFHUXCixzMfPy5cySwHAybIiYYa1vSmc0xyNzZfCCUcDbMEj/o
APPgWywBhM6VQ//Mni5fUzc5SOkQeu/fMBeyLFPkn8+mo0E0FfTtfA1Yj6KCy/SHn+kw9U/ZmFXL
k/kzA3+587dtfVqnWQmWKcxoHw2nbhYsEqybgh9uBODWG5tjGswyePBWIJk/6l1/XFJPpGTqpjRv
eq3CH2aeN8R6/1dLKVmQIfXMZs9wKQrYji1Z4vD//glnPEanEUhEmDqEsCJG43UiUnfSP5maMvKG
RmNGe1k2gkrI4Jgk/5ME9rkfwz9k6084Jb62FEgjUL1SIpgzR3Pf18QszQZp3wJtrbqNgjVGr6ox
+nGBU5rAp3hgUbfLgFGMicctZHoQEEdfvbZ37iUaNrXdTl2o+7Nb80VgJqW936aTqDP1ZUwnXwKy
MK1XJfK/IB6m/aiBWuswD2m8t/bLs+5ZXZIey/WcYuqy7dGXVdtOVQZam/42dfSIJ7w6s+3q+KAu
4UoKUUecmTpUvp5T3SIYbKaRgE/wQidOuA6CBj48Ovj10WHJPeukvZbdEakHqge/VvPuz9s4Or3W
tWgThmfjeEoy/sCUHxWvuFM39SrEfn7fjQT2Vpo2DbN4hVfduNOX2D2wbJ59PiXn46SnGKE9Oomg
hLzDpzD9chUDJ1Z86g8VufSpeBdApKjfvovHDNsrCHERKsMBrBy/WrIWpYclIVi+6QDf+arqw1IQ
4TpsJ5EJrgBCsXxOUlhjGpqz6ghKDOL2MrGyw3axXB6aR6ZRoYvlshnSVnuqhku7sU4SScWFSLpf
bH/y+uLSrAp1TBF7AR7O79CXdMa9P/S57nN0ADuZ4ICy6S4IJRoMZpIY8fnvtV9q/9FMkALY/xM7
FmvdQkv3xc2k4ejsWZpgEyTgMJE5IT2KjZd4nTNQOcd54qESfHdmGMwzLtldsZxEQjk7eeKyhXvd
mh1q5h0nVlMPlwSRv6fJvFZMiWLiMWg7ti5RgXt3mdX0FrUMW9dubYkm68iOAZz3CyIEre8x3x9m
dQkOD8mDeRLDHecv0MA+o8ro4cOKHxqXhKvkWkk4Xsdzp8iy+74sjioqI6CjRISWxIrSsuZP85Dj
Su13qQizYSEaaCsrRsMFwki+8Yu6c2HyJx3QHSKOCQd1Sa1Yh067+IPzZzK8pUWDc8mvuoq6SpNO
YE9dqWhYto/qJzKzBwOuq86Lk2TGhs8ExAgVBmjhOXc2QTEwefjqy2nYW+5pvJxqTxZbKxbYTNxq
1ZAiErGmGBlN57Y534zeP7KpaqnmIPXizEuGy/l5ldvRVAlJwROUKCIQA4v4F+diYA7V7sBW9vKt
U8lI4plbHMDJB163h6YyP87TWe/sUrRyhHggrECWpLlPmbAc7IgZfYLg7fclFcIYxsmtVjyEM02b
9jDI7r478mJmkSEgdoI7NWHVPZl4hlMN59QV8El0RndwUvfOmz6+N6P+pR5NIYBazSMwD/tjdgWA
hJyIRd+SatbGmzIPI4RTQjnpRpcWnUCwaxWtJUa2wUlVCtKAv3CLNvQiKVg3px4B7Ui0PIhPrdCf
KZ0UUHm+PXTLvUpCu7MlcowUTQp2ML/MxvxgMHJwkbdd3dt6vb35MkAFohPMJWLKAiMD6JIhwy3E
M66e0kPhjKZi+7zc3lP0Ub8ujcQNcoTgn1bqT548rjgd2PY6rCIk4yfppfHEPDR/evZkZQUiTP4w
SJe0SEbGwpoy4y5nwE1PAGuKzrhdaIejYPVdSARE0DRHXXB2ZlPGtrGCwQ/UMCYrTdtTMaDUvyRO
NaAWsumyWpScPH7QtpThJfKsrVXE2yE3Hzc8cMo17QNyR+5xi1BDhEOEk8PGHfo9+Do2lIbePEpQ
iVwskuK7MHB8uTsZjSGIHVe1lBH9GsMQMY2/dVoIBAF0zUkBRN9ElPQONeRTBW9hg0Iguqn7boNz
90l44rhuvgaxqVldrUbnJCn2lNJLO3ysxbRCjGiMKk3VqsaFlq6ualscrnJTYgGkKmhPoWlY4y7T
sfhB1A8/1xTxLYkMSAX8+DflBu1dWccevhQDVE7tBJ4Yf1i8oPmD62JkqRffaXSeACDzqHjh9g8+
KNwTjx/xlCguVuxiXsry4kotT+2fE1ImNn0vkixlHUsboXmEOSYU7tGunAGsk3SunLvhJYwEggWH
kFT8CI/c932Rg1OeeJb2tQT0QnqX+OaIShbC1XPnmc6urHs6G1TXxHrC/lRt/LnieSDzouLm9iEj
IQRdUQR1O0AxANr+tZR15Vk1ZbFyrJnfktwEQHnfuG1HuXxIh+Lm+62Xptr7Bwl/6njq03zC3KsV
X2qhLJJUXpFJquok1S4H5wW/iW0LX0in2gMILIMPuT8t8/eAiXXuc3YpN6uXGQUfGLDZBv7zH3Mf
pkuMM8U+sq6xeRcOkaTigA2J91sF9m+wIrzZ2tvf2f2lbUM4liXO6sI6AxSe/4Th2dI1lzXQ1fAC
IwjHRpondVHYYRa5balwYjNiv+fqFlIHX1/LDUwGbMurqWFGjXwal0hSl8byyX6G66jJNZkBaWbN
IsPe9GI0+QSpbjyb8CIujU+PTn0rt6Rt9BjKLeK6TZw/KkYLulmrA2eEUxsakxFGNHJRpnHvf7+1
B1JRfIvvXh9tvNmk3UHSPCp2f+pLWFuRw8hl0oMgEZr32jwpRmeZG2HapBTBe73/7iv/5XAQFa8a
N5y0wjk1U5jIiYjVslQAYoLVG+aKCcAJ0TQkTvo868EobkG1mWwiTk32M1uCRHJ2OcYic1pAgpR1
Se1B8r6vyQcVriPvaErOVhLEY8pq+vOMUUhmDtOq8Jh84z15LWiCDM0dZHmqxLMo/XI+f5+TeokJ
bBd+fv92e3N3/ce3m03z1bmXlUz6miwU7yEbzcQpLzlOPOkHbI8OeiM/VZFaEvN50lBQpzsx9KF0
x52zFtMldYJUZX+ruJVf1zAJSxMRUfiZpDmc76ZNI+RAIYdhZZ9Xxb8/ElmId7L0TmbMmjpSs1O8
ws+bVurF7gXJ+5MnrZkByVsuXkIFOTlPIBMIbm66BlNglTn5SzFYAdwdijWZAqUkcjrHp1tJNsIV
Xg+ObW5CK0Ru+JSKeF4HaY7ljgWOYKYxBTfZdgbl3TfB7rnV3ODvMWdkSG2b2+wIOnYu0z3fesDW
8aAWdl4l04oXRYKjJFPETefVLzkB5MDcyiUnqGsixhk8btXnnEpDWug3p87RSaFiV4tFek5XpJdZ
UJKXW69ebe7uCWQpI/OK5d9UKskGoB/CHoh4z2EOmRSVe3NSVEhLFq1YY7i8aoBJApeUEtMyoTVX
+k8cxx/ZAOw1OOlVAZGP02E2/04yztb266TZZU3aEWxOEBDOV7SYcdbgP/K7+LJ33I+G9fdAIp2Z
+KxPesfK8+dPWZZsxpcxOk4y0ER/LXsulo/y3ceK1x58LWoMkHq+UgaNJx19l6KB6BaAzxM3kZ5r
au4UExGcxhQCJHINKlZ2TTvanz7NvXmel5d3LyuAQKHyQPVMYKfbf7D/HxXaekSu1ta0VW/QewqY
2RWBjYvmETPlkaOkWY9LFjNUR/l4Fl8ej36jSQJ8q8hGCEyZ+uuMshYcQyFJWLHU0HUtm5/21yuM
qOh8sxJihHCWJGgwnMWpi1Xj+Oa1NRkGS9w+JeqGHhI3VRmja3DViUzfQByaz/3ERC4qf1tFnh8g
shSvJOP7JiN42Hxuy46tE87nxfaeXF6cBEY5a55YTSwx8t5QKPqsaD5pcGPZc/Kyhdxgud+iW2p8
UFLbk5U8FwVVM1suOqmnvHBRRFOZk/6nKX4ZUnKO31S1whQkvtDCeCe4IDnjaaIaqY2YVxWq5Vqy
IwIHEshgW/e6G748LS584awKhxOBwnXXCRNxrjSB1EuHYR1IITqni+Zz/lzO2Tzg/RV1uSRgAwtd
VbE+ljyRvfGWxDEvAtsTDe82Py3Rp8bjc1RkDyLo0vHkEsSnYQI6lTc1zdhmRXbOXKbmzZPHMvAW
ziCPKQmu+HnIJg3HYIDgty7QffnxoMGb+Hhuj7zdz63XcmR+W10tQXrN5K0aa5hO6oc5USPJm16k
it6RrubEGrApZUPsC1MAkYoY4KUJW55eTpJ92QCCU+qCCEqeKlmyZgAXUlHhDEOSErH3GE2fyJoX
gcCBJhwTYzNhBWmzdjs78GpJp4GPmDikoIgw86MTTzzOhfJuJaGO85hNPiKIzKYzaXR7095kADSs
yEYJuyATx5QqtQxb8tjQvXmMCBfnjTxDMUQpVCrLSZ4S8qEavzvrlZbz/gu02GKz7b9GkYUaB3qT
q62gHZRo1zQhyqVDeVkrNrN21CFhnrMjeoIJgJTNKEYxFZJZUB0BUmaZhWP6fymlFzLAWlqPxJlH
AAbXs5MKJPGMq2MLKGtIC27lmW73yEHxjFp8Ekw51/3g8uAsf+dobnnzbfTO7j9TlojxippId0T9
0IIrsZNe4SmFUsRqw6ut7ZcJ2jdnScQsidTYgilvpcYY3jtVDGQ5mMrlIB14OYO8XWFzJXYucMGh
Zfog44JXMFJFQhInaaFJ2mW3L1ev6fZ5KIOWhSPXQGN+BFxahWIPY7yiYfIW9ExfJFh2EZtea0sM
tsBJ4448oz4kVAAmbTouKRH44gV+wgItgn8wtcySUWWFFluRFWReyxJ7x4DpnDtZTyonWmuxrrDM
NKer0Hg+eNjtNxxUCC3LTYXMF7Fei7FOM2NnJBwzKxJc+1ZET8QFaLUPHKJBL+JqQqDnESzWs15t
KSmZ4EPI07nUOgeu4CJ9xbPCU8fRt8+ePMmbvkS+/9tkBP0rfYcpB9PA0fBa5jQ1D7LNibOqcvhV
DpRk6XXZJbl2FJ9EgzClVvzBIfBVjlrKePbj3qRPSnCn3niKKkDhdxy9EjRjTaH373Edqvjsw5CV
NxSjMoUHccEFMoiplCsZ2MIY4bsEMd7eHrxF1uXRb1/4mGUNacz6+aAddx8Wnb5FI+KZ8jHwM6+Y
M6bFD+YiqUm07Zc0kwppglUucXdNOtbCsBiOw73e3U/io1oNbKj4XbOfqQ0294GvcgOSEZILfJxz
6+Rub0oNW/RbSwCbt28ua/dbsJ98BNrl29bElBX97UFcKWXlRBLKwvi58ExErsBMfBlPe4Ou/gz7
XLOT9eLF5s6rpYP3w/70cOllT0rhkhTYBuFvSiicLRbmQp64YBhYwdbuhvoQl9Y58EJEAdv60tLB
nvx2uLQP7Goi0Vw8bpNODUsT7UytOhMGOi2he18zwGl/QDLJwuElhdg0Xa3x1EjsVUw930cDh0s7
w43ovIcioO2HzRVa/6V3rgx0W2BuDraEah4u/S0aTnvdHy/b/Pa4JpL1l47BMtK7LFGmWN83Xwki
aV85gFuW4CWnIPo6v5TBy5t6YTHpmd8l2jQa9P/Z677snUeXe71Ou3H2FeshfYdy3416g9GwSpLy
KOrOuUd80RzvcmHyNt2dslDvyoQWvjiY6Lu8lj0e3nCl+vOXNpmJfk3TzLxZKcvpqnwxucx2q8zb
YdnclU5yMK4aLYb/inCVx1NzOMKduG7IXpM1uQXtatHapWb8y7eIN76FxPWKm1tW4nJzKyVI3Z83
Gv/g3aXIsHo2JVRzns5S1niVT73xlAOE0sK5po+olHzVaEpVyhsnKPOfggltgy/sriLCWNFxiOPN
XtAqY3pBaZtecwG8nsGsFfgu7I1gusmL2Qanl3QHV+SSFdnty4fusr/d7eWHFdnb74F20vSKwh7w
2K5pGNcKNGF7dM0vv9aGrl2Th3y++Gz9n655+/2TfNRO/bu+Y2H950bj6dNnz6X+c2PlMf3vD3T1
+eqz7/Wf/x2fefWfrf8CRRe6xLIgSAlKBNNLFuXZsuMsWfDdSlnlLVeG+fjSS7pEOYskUNO+QItF
X0xQG3RCZJca4C6xT0A6JrfWzH50/il2kHaw76gTeDTmXE4ubAY0Wa4w1iMxlxorN1af11bof43m
s2fPnlfQDwYD5XGVGEZ22cxiiyMyjuL4YjThymYxQnCncZ1vreGKlJ/2cpdjNutZ6EWph2ZyABvn
lHql5gDcKUkf1vnEc7K7+WZ9703LA+MNQQYYBMgrUCpzDynEIWac9c7HH13hCis/YG5qc6tR2sKR
X1CR8ntNyQU1Jbn6aRoLRrLUf9rZf9lOIc7VBqNplyZ0Bo4bmGNFM7rLuZQw3TKfz6Z35iq0wmIS
4VAvZK6riSTv43ZuvGydPfSb1eqXGdGFbpqhfKArnG0UyjL38xYQcnu2oMqSkRD2g+rJoTnYPgzv
5cPCoTha/5tRzMxw1Bfg8SkSFlvORsRJ+8RUYN6wnqmcjwvrYZh4Dh11pbHDoNElEb7MAem9F9cQ
bPwO8iV6BUnVn1AWXjPu6JsmUtFapoQnSpyvEjuLCEneS0tCPGZajbjsCIc6Puypn8DGMJU29fhj
bGz4zv98KG6+3Nrf2U2BIdBD2FJ3eshtwCVjo8dyZ1HEbpGWlw22Mc+o3RtcusdDEI0r3J7Y2K4l
qvxaTW74sM8itE6U7e2SVeUKSk7QFEuYVXtH8BH/FU8408c697LWtcSanu72jmfwnFz7VcrlExPh
1dqa2HpcQho1g09G5kV1TZ5EB2wo/YHgTF5b7xWaPMzYJcNX0HZix7G8S0pEj52lopqK0s+vhuI+
e9wIdjTjMm3v7JPSfMpom1xsHlcUqxDRdN3FrYlTLHJLVWaSctL/TYENbOZApJkFs3GF+MgO9R7B
/ZhbhlgHf7G/w5r7AhxkjVQGOqQxnyL+DRmZ0ZQj/fh5+Ij4MFcYlB80rMokriWEPg65MxJf7Vv4
S/eiZDgXZsI2n+QpRcdV6Hh+GDv2ZGwffuGFW14P+51P1PFqFb7RWxbWLxUrvjVunSQgPhaSIeWl
rd6ysu+ox4hafbNeXX36zHi94t3Dhaiod4ApiRIg4cVtMsWejqT6Xn/qOSF5tmucVCKVtjBgXFrc
IJPBdXWgujmGPHQ8mp65lJaWCDTS6uIWQwEs5uM/1kgqunbJjWNihTLqwG+Zy6qm7QuaTIwsGgT0
IKGfK5xiU1hpsKwMdnGL6EEsAqgTPm0Ci7fGDLbH22Ay0A22ZOxuFc4yGSHOx/KWtFyazEU5K4oS
O/9JDg9zEhVr+To/DErlIg1skYXko0jx7P4/F7ZND3yCt/iFbnxB3cTGP+ZaTnTE+uPrTr874aNx
Dw/9BXL/ddRhSYCe6SprO3SP07sYkt+2sbryGNJ443Htz6bRNfE4Giye7bLWAWBJFInPmrYXcYTw
+sbGzvvtfQ5BncXjHlB6OGhncaMe+jYfJBKoEFBRQi+F4vMklNCuoOL1+hOz9U7CGCo6J11iEC/E
TrxGZAtfcXFj+VXa0cvMek7oreagUX2aEneYLxgNXMQyvtx8RZKjsCCwvAHNPcpYQMADGFKylK68
OKy1yzLVfP/2ntlb3918vbW3v7lLiwzvwBktUm+yest8I9e8r5oN0xycYTDnyegcVBvQXDgAKO6D
40k7EViPPCfARALJhAOf9gApEDpUmoba6T9BsJxssmwRwMVsy6KHK8mgfGtxVy27LO/977d9jcZm
AhlZOGMO2YIMwcxMkcwXN8pMAuNVpqylFWRMqCA4Icmomly/hfxoeoHV65BpykHxnjJM35E80+mP
wSViwIMJ/2YoEQs6/AKDC46wuxTpxDdZuIo1PA1h03EOZv7tkoBL7ItiC3NVf4iiv1V9Y+3FNF5b
lgzfjkbA9+Nb1ooIBUnBRMa6YJTRORQLFX9jF/fDkkV85ym1415/vXm09XJze39r/5d2HapXfTrC
vNY+9S6dNSOcyhq21xKX8KABlJOIlCVrlbV2TrVxwtx5q50TAL9SCj33QzK1llnPir3saiIFVRnn
EXwJrCHf0esA7dY+y9qfffgOSbKIHMddEuUTpsyKDafXvVvurOrYP9vqJP4GrLFiIgfBr+bCCdiB
rUMSXlyMv6ttMZoc4ZYgF3TNukjyymCkQPOCYg45WfSaONUI8JUF5oxb555WmuLhsXDJjWz5jLU/
rgaOiPxiEnKI/cRtLfsUAuQ13UHJVRN5mrCly3G6eFMRJU+7iR+1ZYqrtRp9Z/NWOJN20nNIfGVG
vQPqSGRqUKurp6NRV4xUNa2BJPemMKiwEIwT1kKCzYkf2HvCAFV2ke6Z9GLStODpdLy9Q5grFP/C
VZ+TtLCkZw7AP5qmL6xpUlhQ5pf3NL9O4YXB25xRLUEeVqNaOhD63q3VPaTtOGJQEItiwwm99hkS
vTlFm3fWaCjKlB9Tnx24A8PzxpcaWF5c6321lJJUJIwgnQS+s/32F0+fq5n3Qy6Y/tMlMdRlraPg
+EWS+vCPc5elUxC0gvOI5MwzB8bMGkXBnM6iSXdZazyIRQFbTltDhxkt1YySEn3xrNNBVJ7KAcMk
ewoWBRTUU3OACggWMHgjEt09mkr4H4mhZ7aG4LnGS6JrI9VXzXGPhBwJB0TGeU+V7czkuxlmR/SJ
5sNcgVAyrpWlnOlNmVcN3WVKpMpX2Mw+zpfIu+i1XVmYFLKP2F85oGpjUO1dpyttYbD5crJREDIL
9TD2N0Uh5zXrdjklt0sWL1i7ZNlGNhbbbQQFJkhQD+YklFzBA7ux//ZofW/v/U+bR78g92Llhuep
MT/yzpWXH8PpG7uIfVjgTNkzTPmGpR/MwWV9+9AUqPdZSUa6Q1eWl294B1w+dNhJi0gP82i15SUx
6Ups6bhB5XDmel2ZF7o0onyoUYp26XiCvXueU24iG4t3G5G9tdNfQCIzAR6Lau6VVO8souJetnzR
1BahzOxX/IvjXrpT6MoXoKvTrXZH3h0W/itqbrjdmUvLPd5h3UDCPbRvAO+cV6w2Nf0plP7HFu4+
JZHYz9ydEDbatylXuWA1klTGPW1Z2cXasFNA3XqbnwzlkjKVn903+9Gnno0fh4fC2ao6goOCzO+m
+Vj84WMCl/2xf/IRKaJc43fY7UPe0eY0xVB4CjgEw2dIgNPxJBrigMVmxRJDIWoD24e9rddv3r9z
TWlZGOIfRE48iFgt5YTNL7QxgN6UkmGTDogHKoXNlx3c+mszkNOJg/V+TxHB1qVg8yC/VXMMVEaE
KQCW4G4gLWwRUTqbRLGwmIE2iBWi+S3USNBcIBwwNxg4ri1WGwgDn6NJP7JqtWUFIvE6JMyHi8SO
hwKfmXlE4WeOE2k31Ujh4fzsHp4UmSak73uNp27dV2GcId1BhIUdQiBsqYOCJcDpWdOY1KGgRrL8
ieak8jusvL8hV7MbUgaT5IDJgMXoCStU2ZuCioBjYhnkrHDUEXFhb8cSVWLjYjU2uOFOpFbKzCXm
KsClO+ImpcQbT+MFRUhQVVj2c+1h2Z6jaxVTKqV5Ccv55/BzP9LhMSn+koXIIdxheY5vruuo5MEd
d3UYr5Ilu6mZd/NYunIejoOzGvpIcotQIkDIuwbDWejqI9Y/oZWjlBoqqTWQnNUIpoLuhwczuZdL
6LJZy1PkE5SQRsGqlahUMBirvpxYR1omsHeIUj5AOb/y4BOQkYB6odMlk0RXZU9CumTfZ7P6uX9T
8C8h2BKF0GJ5TK6k7Ajylc2fVfdiLi5fMEMJY5VeoRm3eH7bfI+vblv5TVqgmYRsdQSb+NHIGXp4
ytr/ZX49iKr/PMQ/K9U/H1UPrxrLjxs3RaZuiGAcdI+EsTolPjuPghixJ1EE9PFsPsjiA3BqCkZ1
2aF3JRCT25v7f9vZ/evR9vpPmxY9j84wyWPz0CrwXm8fxFMPo0omlEGkwgoufpWCBfnDaeDJr4Gk
smEnkvOAz4OYKI59A/+hwQX8uwYW2ICUK+BQMQqauDFubLY6QB4KJgBWxxULXfVDgPrg1+B7u761
vb/59/1KNhxc1jChbu/e//h2ayN5xLyFd2B7c1djF549N2V3sd3wMGNkMc6OW/RfO6/+om5qDo09
Ow5yx5Iqhw6BzcWG29l8I+3RhCbe8GU/fZR0BzuFPiJakN6S1H1c3Kx6C8oP4oq06GJwimU4JjCv
R0OadgYWEpMobOJiPVariDWSV2FtrhTSMNU69Ew/dtd/Ej2bBnROw8PMixqqMgB6lMaFxoGV/JOz
0UVg7cy3RGHdW/yUxOPkhES7Y2a7+E4B0XQ/25iepuFdG8TLN6vJ9gsuVEJokjsk26Frd4oil5h0
t7Ntr1073DZxdJbpM1d/2trb29p+XWqFKd+ZHmbzq27pXxAxn+ndsnUkcLsfMv1z1xG64WLS+b7g
3KGW9zzc/pZLn4+t3UmOfQKR/nZ9b58RSN/vAnwuljB2uztShtzRTMgs/cQrE2Xe0+IllKuSZHsn
cuI0Ov+UxGgOTRh+acpITXdixQ9Wp7lvCk0NXFt92hCXbHNfIGHov21xUANHFpgehdwr2tDqs6f1
1WfPkgplcNyyezq2GdLTCS0HKw0IFi0XGjSq5ob6KGQWrEMcLTaWSU/5zTQKAkeEoARt9rwnZbxR
4nYAkARaqNWnq/XVp0+IFk4mlyI04bhzD6zhU1K2CyumCVHahdDgzv6wV/Bgj/rTWnBKLQ2k1XFw
gcXVdrtA01a4vtZfV5Nfn7hfnz1Nfn1W0DXHZ9guJjJ2PDsu139tHvxqDh8ZLtJBP/iP+rIpFJIE
QugPQ20X+2CoDVe0iYNfm4cPm6mHtHX5tiV/Gv7TeHcp2lnCtwqmuGJuSnbbQgNYILmoAMlVmYFl
OWw3VhTokys3wJ1231RPp+xLC2y8ysAaXKOkenINDGg0U3HNVU9A6s1DW79kKHKqVi/xnR+eOWOT
nSpsMRH+J+GMrMlEprSh4UGi9jHUJVeW2HqXHJ8S+/2J/YrvkIFR+S2htadQHNJkaUVqVYygWalG
9JkVItf0h9oK/592OPXoN2g7dOHFsH++dk3qgQsis6F9rvanXQl8eftKLKgvIKGTvvCAvBqwuZuw
pDOnwYSyv2RSe45N58JNUsYXZL8KC7iXQRpU8skof3I+RjaTVQt5X/ameZK+1/DdKh3YT/qFPlhh
flmDSHp02eNqAC+39+pSuOAHkjwWARCGRr3cVPB0Z+YAHS5+D6kICZJi6q3Z2Vogybj1533SzgVM
TEn12TUW7sjPLRCOOXbXL0TI1gKaauz+M4Bfn0Wfetl3JIhe9hW3wTcu7AA3IgEVvMh5L6SDsvDh
SIEgN7f3ZaMAmnA2bHr2JlgGsqb7VMlqPeVQNTOnfJ7+rRLLjKsp01lGQBSdZWiq+GaVnWYcAoo/
HyOJzo8DpYvjC2z3M58oUHMBOUCjFcOyOuvBHHVlRfUARfcEk/SguroSs/5QWDZFonbF1ZtSblHx
a+UR1ockRLc7P24R9P8Kdz14YB4CM46/GN43N9mFc7PMFoqk91A3TvqCfSZDYDIuoak5u9p+otmd
2kHc5YJWEtEC/xPxgsWQhVXXYUEpO6Snk3E6Fddo95sP4v/v//l/WYegP1aajVVa4VuKxbu2C8Vo
JscJ5zv7CoysZOaMDfzXJ/86ncG99826H7irscHzw3atYRNxbIDcieJUcxc9tn5XkAV0idBVG8IZ
hjTZecOpCMJtNNXSntMvC1E22L9m0cMaCxtOWLKBwGW8rcOd8wKBuMESf1+y3FDqoxJVTveaj2jK
sZsklokLRyNpUbDNhr1msroSY4XN6sqv+sXJZjQ37PeBvzJGMB0z72z0tfV6aGHqKNViR7M0tIzS
CVfmYl/FsqA0EW0WJxFRu0+iU4xG51ptTEMXUm0GCFTqVkHIqRT0Qdz1yKvfNGGTMOymmY1jFwbB
AjxrwQbahYtCXakIzYrsCGhSdJLDhUJZ7jsl0yUhzpn55FnxcPDFb2zBXcW8Yd9p89B4AiTngPeL
PMnZIbAhMlLwT3DBRWy7GQ0j3Vh6BFPbjcOTL0eztSB5gIGS844D36mBznJ6wp0qXCyaoO4Vk5n2
ilSRo5/hbpFwUTbdX/2l+fimkMsulI9FARfzP9KJitC0dsMnXOFt3IuKdmbBfWqEEqoiuPdafJiO
cFQKgWH8j7Ne8ejR5ZwbnWnKfgJ/Ez5pu3cCgGU/4oGS4PyM/8l+EuI0GWSZGx8EXdN5wEB3aIHz
HczcFiy1vo3VcluW4At6cz6boxeJf80SU0SmsIjf63PYkju1Qwlm1jZbGW8tB5FZtmUPKDJPp6Mg
J0Ww/8ARxfMYHApNSZABZDoceiG0X5xMwVq24wiF3EXG5y5RC3aOadMlZcmsRwTNhk417OrXiMf+
4iSZ3DyYmvllNJsYnJF+bJ1dq8+fsfyHBup/e7Oztcd0Y8JUA69oSmhdfG5+e7ryZ+r/iNNnfJmf
VNkInasSgRC6yXpvOoJHFeWxrbJnP3RERFiEgyI67/+zd6QLIDNVmadSAqg48qeEYZVPacaGiqWe
CoPP1QXZv/V2NAI1BpvgCAxPGvLbp0kqoU8l5yN2RrmckaJMTkt+tFVXOhkfjU6OeMV0G8zX65zc
iQbuul+2R3M7L9sYvWfgx0tXSTjZNkh0Es4azcvpMm8QFMnAhLbGTbiLxGqIXSb7ScN5cf40iDfp
EtsI7VJlY774CM3bGjItYp+9bVb2E5FDzimNtSQtuPK5Dgg356zld413zis00jTQDhYd/YSqxnOp
qh3aB+gaHwp5+oMXjJcaKXtYub1W2lzNCIi2dQdVZsmyKAOQ8bKjFO7FnGMu87pvW36UpHIBajJO
yZ8/7uy/UcnSS4A7i7KBiPc5IWmkUsdwVCUtg6vijk77w2zaxB14n3vd7fxz/vJIwiA9PZ/hffna
sPiKhj0mc2vwYy63QgO+8pLPqpxL7EuW2NphnFrEid7mdMJoYkm4sQayBcDiXg6jzYmI8uw9+gqf
eJHKQIy+vvNuc3eZy4lbNVNKontbiKgYZ9Yw+FEOQdaA3iHijMzZ6Lwr0VS0Vnnqr4xOBQ4eGCLY
AUxUM3+1dRqQcxNHJ1o0vZQngPNsWWm2hFjB0SfJzbyziTKZc3QpOEvaf6/jNq3MzkzTyORpR17Y
79fmT/+rUZKQycCxbi1TekmuxmEHnFU1wvrJpMdUcgWjO5kKgoTrwK527atFh2EP/FCSjN4P7xRb
7+KmQcLshFUZhNQzNkS3f0q6/LI5MlVTXq0+XuUMwTit+S+2MZCWlrzLrqqtpqCpcGF7GuC1aQq/
4s8PhR+KV2xUvKFfm+58J5L2Bi5S23yTg3ZniwFkwiFNE89DlW/oxaF9g46bhLhK0Htfq4r6EMKY
+sz2HV+4UBTJRT9yR3P1SUquQdPu7tPeUKXyQpB5xIWWLgqe6zW5U+K8Uj24XQ1LlgZDSC9NQWYM
v7DJ+OtIOZ0Nm6i0iKeGxPsrKLY9q8FGKssQKlgihCO/JdmEVldDMAM6gLnNbbAMl5TU224Zydq+
TZMKY0Lkyr9wtAOUg29twPsfvW0FbUf7l92/X7xtg82joeKufRblWXtkZPYv2cOukfzNbL1I0u+2
b91Th1HZzAZR/Am1q1qZiACaXh7J+suftraP3q3v7XEFioKpZLw8c4/Ndu8iBMvQnucdE39zTwbX
ImBcd3vn/8IedzgJhXQbdzd6SkcyiA6GLSb9aaVmduX4oiqqh/aVDlj+XQ7Wl2xrmoycN3457dUJ
+TLaa+07o5N8wTkV7jZ3RWE8via6ey2H/VqkoevJIIO3et+sp4w0Hop0js6+zAHZ0K533709YnV6
Y3N3/9U75L1uDsbTS1epXXBDxKtrXzCSer1Wo89DaAmNEncNkwpynlYhORTEdlRsKP1zGb94/vbA
nucI1uHTWO63G63+i/b2q1b/0aMK6yfFvvkvU/8V4ShR9WS9+urw6tmTm2LdIauZYl/hz268EBpZ
jjs7dRfHZpwhQCYpx5yhQGE6efp6xjmtfEG47Dx5XMiRGPmLZVd7Pfv2kA1LoxVj3dr2ZdxQXvjA
omS2XPRdMX383Jtw3a+mmCGJrkpXHcGBj4MDxtmbn862QMHZk0v3bAJ75NIv+taGkETStVKqxJxz
mQdAkzmNHNwz6NoofcwAc74otuhJt2+aMM5qHuHPYpsUwmOWZI/f5awVH9pT5lKvdPNOOsGuXan4
c/VY54p3laaLlS8mIxCHYOF+MCj+lYXjafm+O47I6vYQkRWrbgFvsCmxw62UQuV/UgnKV1mLwHSU
Dp6k8aWXPZcQ7/ZOiewqMpADW7B+RR0c5mfSSQNf45f75qWGONJxmU2x7BO/xeMZKvlwVhPD1gSF
dqx7bzwZdWcdm1UtJV5+2nm5qeh9XONmSCcZPlYaqbW+J9CZbAhmkxi1zE8qLo02yBWQGGPUf636
lcuMg7O3zs/dB1Mzjwa2Go6YLRdR3yRYzkZClldWGLfnevUpR/5drz47ePrs8Prx84NV/Hyyunr9
+E+Nirm2T/CrdZNrHGUmfE7gS74wtAYwNO0VoDrgNPy4vvHX9+8Q/lYwSJ+fAmAGp+Yiim1MFd3N
8azWuzAvDDIV/siANxV5X4ODHiv2rZmIx5Yf7phX4PXWsq6x5p9LXkSVFpPv1ybt/lCQONRnxmZW
cYUT3OlmcfUkJWiDhH8IMBbIoOxAUhWyiOvHKtbNR7H+4yxyDiixzpXnKyuMslIJ0xK7XN6a4738
hXASe7pEDrWiD8mRA+231V+7toJ2TsXX5LlWkrmJJHwLGiQph2JbLvS0ovEUVVULUpcWHsMAFMEm
6GtjMISzKCRQXqzW9RwMgwhzbPzA3tI4ajbe+ROSAprJ4hol5eA8OHvs2MVA9pKSfgfAJKJNUxL9
T3vOwtO3aMTOvq4rLvEGxz3zfntze2P3l3f7my9rFrwYa16Oxp/YqoP+1Uk+do3pN93hif9NBTKl
E7XTSwOaFsKJTDmkPynA+8uDwYNu9cGbBz892FMdm09zks1G2yEpOr8gaNI/+g33rd2zOM8FSUPO
hVBQUrEw9D+VbhmGoRuJvOPi9SDRpbhee+hF89frpTmuPSkNMR1JuVjBn0yjcVkVCqUHuavNqiS5
zCTI4aaS8TveGZDgR+CDuWRcebVuF7qV42IY4PmEZLIY4Ffd+O6ABBzaggrFT++W/ZoxfYuQ+BZe
b4t7pQBq2Oyd0ZjBo5m2SywOfFscJYDdnIYtaxFxu+Si3BL4AwhdGVMlm5rvaE71nYTzcN3npsZD
IxqK3sUVJhw/dpVm+hYBJr4ckHz3SdIftL3Ez8q9Z9wh3LSsBF4i2S2f7wvUFYQLZPDWlGuCth3Z
1p3OHALhFnKNBbyk7NgmSef0LOmkTgGSWd+NPT2cT6SP4oy7LOULUZ67xy5h17aSvSFokb4I2gO0
bqYN+dI+54FGy4T+JLgZFk1EPbg8lxZPBk6e2GWWiFDhrkklOP3z1kw//TJUByULLzQSBjkAX59l
FzR63yby6UavXkTnddJPB8TbjhGMFyv0KJ8GHL9xz8MRVf9Cqkl23I9HjHoo/ivgtFv0P8s7iMYr
OsSAiwmehq5XL537jDOIz07QOf2NepgfJOZyvjOLfpKseLGM+VBY9kxIfzro1eVepk2NNhVzjluT
KfHL2WBssRW8VEwLyWLXJjfOA+IJMz5Ah4lcxjP47vXL9f11r7QuQyTIvLYsaiNdzvqyiYRyAb3q
flKC295ffW/8lNidvf3Xu5t7R+BVpA1Wu7lXX/44Nw55zU23DrZG+7GQzllOQiuy97aUXNseitrV
CiQQKCPI/FNiaTFv7ARnbXS53lCtDpusjwUcs8AkxCn9lNnKF3ZijrMySU7VYqEyBwPSeguKVu8q
I3tJzfLly52f1re222H++NIb0gp2dn9pW7KyxDVqfRnp1f6D/f+gG2kJ6XtASopb9SS9NPZSBQj8
e5zljCfKsgkVg8XV9rKikSc4+XWAcyQmYei3gQY5YV0sFxDgJW1UJr9avJrGNzWBRpV5Dkz8KE1S
7fzzxCqm1Q07zQVTM3KksQMnbgsG6bd3EcZTxx8LX9299bnqSLpU465Ytdk/EPaiWqPRrmolfUUo
tIchCTTGcPuxKulAmUQjwRnwWqfvZVLtm3w5RQpjrjxjtQk3Lzma9qNue2IZJAU1+SV0QMoXRFg6
5oXeXyF5g1hKpWY2QL76CG87EQGEC504Pq1jB74MeqHqmxzJ98OeBSptognhu7cpWDXzbgbrCq/F
eEaMrMMBFf3bIGPLbP9QfYR1oArXDVZl8GQ2BbCm6rg1lwOsqB9faIQAadcEn5uCWh3on0B8wT2L
XD4OjlX6pOfgAPN4uHa7AiR4fPwOb/pTG3qxmul6hmseHh1XDe/JvPErPCrIR4Qa7MMe7uPONn9A
wNJcJNo6LSIDPEiXr+V0/0anu+ofbGcXcC9099lH03frprfTnhZRHUJhKGkGQZMeBdETq+fknH7E
iTvLPp0cS3oG68MWs9KvjuKXUgwh1Bc7CJPttqlbqylN0KseT09bOcjVjveAOnCZ/coZ8A7GzshE
xsqZtMcfcOkkwQ09AREtsv3AawabQsE8OLEDADj0JimmKeZaDiOOYKanCw45Gdkeg6hmBF7YFj93
vki/MDvbDVB4OmGX9OqgZH2CZ7ihkJLA/b6ILgPUwtZCmML8ZV4/HjFGm1tPv2JeqInjGMmRxVdS
lZrPhhX/vlDHzbVxeVY0VWhcVNnG+11JaHQo1m66BTzsP6FL4k77dRPbyULTjZzOqbijMzaxH3Md
8FHUZUlJMvPh7JVLEcfSgz75ytI0hlZrTvvd+YYca8dp4VYXH0G/46tT76vTvqVp9gA7DGZfA7AK
aDJByREPoLmL0/gbaKXp19CRz30JwvyONBYij/bYjicf5co0E7hKo7+tIXTI5HZzTlMhIUw0ZB13
7pu8u6yKvSJF3P3WPV+Gis9AeegrxOrO7tbrre31tzlQ5zWza7HSRWkE2bHb0UoVpdjlLTgoLnXa
9GMfaZD3/mxoK0BNPPTBOQCzig1k9aaEJ+xtbuxu7u/xvNqr7M/KEQ61imaVtWOuOmO19ZoHDMx+
IDeihCK6CFVfW2Q7QLzIDuC1nMT4fEDKAIdBzO9/JRslngQDOkerUmIWRLNv0nwbGMo43E+yRhiO
Nc6qwWmw6AX+8MzMMrqSb6q9W0zVYsd3bnbILXFT4u0sFM/yVOM//tFtAhZfu8FSpzzcLprebWal
3I4NSoUCzfaDJzI3qH/BkiXVTlh0biWxxkEMQUkjNvu/hRGacyysyasUsbpn0wGDAbZyB5dUXRAK
4eZFZPutE+NczHTcJz4yatjnBUbYlI3PF8vlxsT8JMyeyduR1ei7xw/TwNae2SkXt9qy6oHQXNb/
PI5mqqcm4GfWZOWZ/PKsVs5n6J2WHLNLPiXas6DBnukjlFF8yHMYYQLSkwMR7MxKt5nm0/i/7sHG
6krOkcu1XIHOfL3Z6kX+TKU7vuBA7c6dJqeeixcBR0dMHVLAZGh6HF2VNRDNOU/e+lh0jWPihrQV
dP5aaaMTy+cwSqWA+LOHIc/84RWfOO6dsDFZt4o6Io4ja3GUwmkSdcExDRALHar8HCDtnGOfJrR2
M99JWvPksfGdn0nHDs57Y47gdsv78p7Ikb4WHaQ7+bdc9pkjlEpC3ZpALEe0tRSThauGOApHmmB/
sKiuC1xm/1Gstbtj4w/qYXo4lZBTf03/vwYAXDmn7Bs9XGCe0oS3w/lGh84qIJeuKLk3sKukkpIu
yk2+kB6cyxRg1OoCePA7gn7jXWaXVsm4SmhN7K477WTD+1j34x32osnsRD/Hnw+6W121cClRuRWn
6iIaThObFlBHxwK2qIii+Z4wD2IIDeRwKwlYfBMWXmiaIjWbLLo61PBdGiIggbXMwdP6Rr605JNx
QqWRhoonob30xFlLCwn4YHJ72WkAHuopkKsqGWCBHKDQvPeH+J85r5yPEIrP6OSk4i9MciWplTnR
E0cylAPs5OLJeYidwRsCYIT0CyY9eN77o2HTcU+0Mel38GVcE0itKtAkTdvMX1rLJv2HjfdwxTce
ZaG/fROv782V/YvC19nCphUbAJZjyF1YENVFiiUmc3kPFzvh/W5NVEz47DlBgKBmgIm7voSbSyHG
8o0y/Bqql7P926VsSQwXO767fervBAg1STnyoHYZKeRsz0Iz2iItMpS8IRwTJKWr5HAWnZ9ULTC4
luZQIJge451MAWbRlUhGOKZHw9NEzQekyW5v0Bscwxs/YmGqa8azqXSBqafbXK4SFh1W3/iEShxM
0uQ3reLFN7hLbU9uVKcadEH/Af+WjZ2fSLrcZLVRtw43cyQlHBzh9MlDOv/Ahyafm5sQtAL1xPXY
ERvqUpz0Orgl/2kdT7oBf0zpW/MPx03KFTicpo0mGcp+a201Z5LgImueK2TBfdj5CMvhuC4wv9nQ
27eI5nExap7QEKAZfolVR3YWHbzXAPmJpjkO/1zTDT6BtzI3XezxKq/+gg4lkQlellLgwJv/cEsz
1W61BWX3Tlav2l9/TSzJQujqNvKvmsbzanQ+7ntAN/NbUx1uTmu4yhN2h5ZY35vbr5c/Gl+5v0N7
73Z29+f3DFfN0yePE0TY/BOVLSLYXLT3ffYjWmFSvNrXP20c0u0FrVuuIIEIOXRqznsnzLI1M0/s
ynMzru6bfRx+obb2vXDzsrNGoTl6Q+sXYK4pbHg0VAXxdvOlil4yj2gK+Y6I+vVl7S+ygs5vJsXF
3QIm8uOd+2tfwpAOX5V1phOXmIil5Xy0kPk9s/sigW/P9I1/5oU8fd28fsMhJ61/6bBzewgzK2zf
LisEFu55qB1faltH/bYF1OIbvYaxl9h8n08wv+WIfG/B1fji5hu2rbuy6lSb/CER5f66l95x1+e0
OM8ymhuj968ZQZPPXFuonCNfltRDcweTYLqKGE6Qf8wTNe4rZjEgnpmItjl2vzSPEkqr8WA5g9yw
I7BF9Pyx+H723aQAHltbynkcsR9nKnC1vAKGuJ6UjkK5OLvi/wfL8f1OZfi+xvp23+xAiQdUTF/8
M6q+AQ49yT7CdZY9WKOUwdcyolCinfAW8IWueZqDL2zdJkl5Cko+dFdoKnyT3SkYRol7UsroCH4P
6RAtLCe6aaUue4a6oZFEYvVGwJSLP7W8VPMBMFEmnIvHMRjR1E47e4+z9vxFNspFJQz9c/dtTNKL
DZ6ya1p+FApvlaTa4QYbrpxXDwMphRZnq3bythQTxTlDtbrCFEKfuHCQ0kXBA5dotlIsCd2CKWXN
nN3e8ez0S3MJ6eXnvvCoxk94VYcVudzmhmHFYZIr3/WHJ6MFFiF5ZDS85g3mG4Dmy+OOjNOMHfFb
vLAX/vuLABC2R6bETzWldIKADdrUNXrHKSY6BYYQgiDgdElH7PttfzHlyYSd9c7HSUo8/rqunl1X
+fsKUWd4tpTHyJKBcSVFuOw1TmOq+IvHy+UX8tE7saeE+Wnypa2KYVA/zt6lxa8qmfZs1utda1bl
1tKqZItV5dXOYhNo6YdSYu0FrEKm84xS73ceheLkLlcyLtkOXoCR3o7QneztmisjP/ROwXCq3OGI
JB+LA9CTKIMkzX83LNFp8/lzZKS5hSw7HlBH1DnzalDaYvTJI2DZYaVFvDGntKLCCuRWAfR6kEGG
8QP8lR1XFk5U618RL4hL3TF9zvjyQRJf2JovB/DyZHxszv7GV/JFzyQ+hY9ZkiCP4EbZYwsnJCcM
Mjn8uvVvb8AKQv/eIXZQr6PqVv7uJwTLM0POOCQWx3Sr+9Ki/mtFauD+Cfvkulp8sc6lQvjcVqtR
NxqD4Xbcd2F2h8Il2Iv9oWQRAYVenuF23Q3LzK1r3XoalS7YVvxgarql38+S6ZZqLLnzLZfyJzyZ
YeaMlRT1E3bpkz+VsyvBbVb49m/EoctQUz6J/l2KPhbe5aLKkvvoa1WqfNo8CG9C3PNs2OlV7E13
A/qwj5kXyPZYK3iNK5n4UPwAQlF86F4FuhaMzr6qxwXg572KyaGiux8QWY1Hw0MtzdEotDJj++vW
27emOKQ3Xz1sVv/al3iDSx/m8sZ16TgahlOULnWi7c+hY3MKmiQfAECaO47zGGkigHzsj687/e6E
60Hcg6jwFxiLrjXXhCahO1PwDgbGaHQP3bxwYDu1BIQkhGcJhgA1vL6xsfN+e7/FVQpKeBULfTKt
pSQxO0Rs2no3v9LINJz/brtAf1jGqJInVy9luIyDy8FF9yw+LF7rF4NR0cu/ahdevt9d39/a2TZ+
oxmG5k29Xe/3P65vm/WXL01xaoqkx9OqP6JddzMHEh+YZl+yInQ/7fFoctoLdzm/9uXmWyPwGXlC
Ak1w5QveJAsy71Vb26925r+LkbkeVlLPoCBozgMQ3xMKdtJhqTJzjl5uvtrAcuhSugOD8J7U/Rp+
5ZMVDfIISZ7NEfJvtGkT7saF3JQj7xaVCpOtx+EGSadjkt3P78SquX1my/QKfTopAMrCv+JvcbEG
VoT+8P3z/fP98/3z/fP98/3z/fP98/3z/fP98/3z/fP98/3z/fP98/3z/fP98/3z/fP983t9/n+I
dPnSAAgCAA==