From 25ba696825e3c6a3eb8293bf09948460ece7e2f5 Mon Sep 17 00:00:00 2001 From: luis cespedes Date: Wed, 23 Apr 2025 17:14:16 -0400 Subject: [PATCH] primer commit --- .dockerignore | 5 + .gitignore | 45 +++ .mvn/wrapper/.gitignore | 1 + .mvn/wrapper/MavenWrapperDownloader.java | 93 +++++ .mvn/wrapper/maven-wrapper.properties | 20 ++ README.md | 93 +++++ mvnw | 332 ++++++++++++++++++ mvnw.cmd | 206 +++++++++++ pom.xml | 134 +++++++ src/main/docker/Dockerfile.jvm | 98 ++++++ src/main/docker/Dockerfile.legacy-jar | 94 +++++ src/main/docker/Dockerfile.native | 29 ++ src/main/docker/Dockerfile.native-micro | 32 ++ .../java/com/valposystems/GymApplication.java | 18 + .../java/com/valposystems/dto/BookingDTO.java | 31 ++ .../com/valposystems/dto/GymClassDTO.java | 37 ++ .../java/com/valposystems/dto/UserDTO.java | 25 ++ .../java/com/valposystems/model/Booking.java | 34 ++ .../java/com/valposystems/model/GymClass.java | 49 +++ .../java/com/valposystems/model/User.java | 35 ++ .../resource/BookingResource.java | 75 ++++ .../resource/GymClassResource.java | 88 +++++ .../valposystems/resource/UploadResource.java | 102 ++++++ .../valposystems/resource/UserResource.java | 88 +++++ .../valposystems/service/BookingService.java | 79 +++++ .../valposystems/service/GymClassService.java | 76 ++++ .../com/valposystems/service/UserService.java | 60 ++++ .../com/valposystems/util/DataLoader.java | 109 ++++++ src/main/resources/META-INF/beans.xml | 6 + src/main/resources/application.properties | 41 +++ src/main/resources/import.sql | 6 + .../com/valposystems/GreetingResourceIT.java | 8 + .../valposystems/GreetingResourceTest.java | 20 ++ uploads/crossfit.png | Bin 0 -> 18789 bytes uploads/pilates.png | Bin 0 -> 38729 bytes uploads/spinning.png | Bin 0 -> 55793 bytes uploads/yoga.png | Bin 0 -> 30376 bytes uploads/zumba.png | Bin 0 -> 14678 bytes 38 files changed, 2169 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 .mvn/wrapper/.gitignore create mode 100644 .mvn/wrapper/MavenWrapperDownloader.java create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 README.md create mode 100755 mvnw create mode 100755 mvnw.cmd create mode 100644 pom.xml create mode 100644 src/main/docker/Dockerfile.jvm create mode 100644 src/main/docker/Dockerfile.legacy-jar create mode 100644 src/main/docker/Dockerfile.native create mode 100644 src/main/docker/Dockerfile.native-micro create mode 100644 src/main/java/com/valposystems/GymApplication.java create mode 100644 src/main/java/com/valposystems/dto/BookingDTO.java create mode 100644 src/main/java/com/valposystems/dto/GymClassDTO.java create mode 100644 src/main/java/com/valposystems/dto/UserDTO.java create mode 100644 src/main/java/com/valposystems/model/Booking.java create mode 100644 src/main/java/com/valposystems/model/GymClass.java create mode 100644 src/main/java/com/valposystems/model/User.java create mode 100644 src/main/java/com/valposystems/resource/BookingResource.java create mode 100644 src/main/java/com/valposystems/resource/GymClassResource.java create mode 100644 src/main/java/com/valposystems/resource/UploadResource.java create mode 100644 src/main/java/com/valposystems/resource/UserResource.java create mode 100644 src/main/java/com/valposystems/service/BookingService.java create mode 100644 src/main/java/com/valposystems/service/GymClassService.java create mode 100644 src/main/java/com/valposystems/service/UserService.java create mode 100644 src/main/java/com/valposystems/util/DataLoader.java create mode 100644 src/main/resources/META-INF/beans.xml create mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/import.sql create mode 100644 src/test/java/com/valposystems/GreetingResourceIT.java create mode 100644 src/test/java/com/valposystems/GreetingResourceTest.java create mode 100644 uploads/crossfit.png create mode 100644 uploads/pilates.png create mode 100644 uploads/spinning.png create mode 100644 uploads/yoga.png create mode 100644 uploads/zumba.png diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..94810d0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +* +!target/*-runner +!target/*-runner.jar +!target/lib/* +!target/quarkus-app/* \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..91a800a --- /dev/null +++ b/.gitignore @@ -0,0 +1,45 @@ +#Maven +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +release.properties +.flattened-pom.xml + +# Eclipse +.project +.classpath +.settings/ +bin/ + +# IntelliJ +.idea +*.ipr +*.iml +*.iws + +# NetBeans +nb-configuration.xml + +# Visual Studio Code +.vscode +.factorypath + +# OSX +.DS_Store + +# Vim +*.swp +*.swo + +# patch +*.orig +*.rej + +# Local environment +.env + +# Plugin directory +/.quarkus/cli/plugins/ +# TLS Certificates +.certs/ diff --git a/.mvn/wrapper/.gitignore b/.mvn/wrapper/.gitignore new file mode 100644 index 0000000..e72f5e8 --- /dev/null +++ b/.mvn/wrapper/.gitignore @@ -0,0 +1 @@ +maven-wrapper.jar diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..fe7d037 --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.io.IOException; +import java.io.InputStream; +import java.net.Authenticator; +import java.net.PasswordAuthentication; +import java.net.URI; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.concurrent.ThreadLocalRandom; + +public final class MavenWrapperDownloader { + private static final String WRAPPER_VERSION = "3.3.2"; + + private static final boolean VERBOSE = Boolean.parseBoolean(System.getenv("MVNW_VERBOSE")); + + public static void main(String[] args) { + log("Apache Maven Wrapper Downloader " + WRAPPER_VERSION); + + if (args.length != 2) { + System.err.println(" - ERROR wrapperUrl or wrapperJarPath parameter missing"); + System.exit(1); + } + + try { + log(" - Downloader started"); + final URL wrapperUrl = URI.create(args[0]).toURL(); + final String jarPath = args[1].replace("..", ""); // Sanitize path + final Path wrapperJarPath = Paths.get(jarPath).toAbsolutePath().normalize(); + downloadFileFromURL(wrapperUrl, wrapperJarPath); + log("Done"); + } catch (IOException e) { + System.err.println("- Error downloading: " + e.getMessage()); + if (VERBOSE) { + e.printStackTrace(); + } + System.exit(1); + } + } + + private static void downloadFileFromURL(URL wrapperUrl, Path wrapperJarPath) + throws IOException { + log(" - Downloading to: " + wrapperJarPath); + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + final String username = System.getenv("MVNW_USERNAME"); + final char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + Path temp = wrapperJarPath + .getParent() + .resolve(wrapperJarPath.getFileName() + "." + + Long.toUnsignedString(ThreadLocalRandom.current().nextLong()) + ".tmp"); + try (InputStream inStream = wrapperUrl.openStream()) { + Files.copy(inStream, temp, StandardCopyOption.REPLACE_EXISTING); + Files.move(temp, wrapperJarPath, StandardCopyOption.REPLACE_EXISTING); + } finally { + Files.deleteIfExists(temp); + } + log(" - Downloader complete"); + } + + private static void log(String msg) { + if (VERBOSE) { + System.out.println(msg); + } + } + +} diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..1a580be --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=source +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..79cd792 --- /dev/null +++ b/README.md @@ -0,0 +1,93 @@ +# gym-backend + +This project uses Quarkus, the Supersonic Subatomic Java Framework. + +If you want to learn more about Quarkus, please visit its website: . + +## Running the application in dev mode + +You can run your application in dev mode that enables live coding using: + +```shell script +./mvnw quarkus:dev +``` + +> **_NOTE:_** Quarkus now ships with a Dev UI, which is available in dev mode only at . + +## Packaging and running the application + +The application can be packaged using: + +```shell script +./mvnw package +``` + +It produces the `quarkus-run.jar` file in the `target/quarkus-app/` directory. +Be aware that it’s not an _über-jar_ as the dependencies are copied into the `target/quarkus-app/lib/` directory. + +The application is now runnable using `java -jar target/quarkus-app/quarkus-run.jar`. + +If you want to build an _über-jar_, execute the following command: + +```shell script +./mvnw package -Dquarkus.package.jar.type=uber-jar +``` + +The application, packaged as an _über-jar_, is now runnable using `java -jar target/*-runner.jar`. + +## Creating a native executable + +You can create a native executable using: + +```shell script +./mvnw package -Dnative +``` + +Or, if you don't have GraalVM installed, you can run the native executable build in a container using: + +```shell script +./mvnw package -Dnative -Dquarkus.native.container-build=true +``` + +You can then execute your native executable with: `./target/gym-backend-1.0.0-SNAPSHOT-runner` + +If you want to learn more about building native executables, please consult . + +## Related Guides + +- Picocli ([guide](https://quarkus.io/guides/picocli)): Develop command line applications with Picocli +- RESTEasy Classic Multipart ([guide](https://quarkus.io/guides/rest-json#multipart-support)): Multipart support for RESTEasy Classic +- Hibernate ORM with Panache ([guide](https://quarkus.io/guides/hibernate-orm-panache)): Simplify your persistence code for Hibernate ORM via the active record or the repository pattern +- SmallRye JWT ([guide](https://quarkus.io/guides/security-jwt)): Secure your applications with JSON Web Token +- JDBC Driver - PostgreSQL ([guide](https://quarkus.io/guides/datasource)): Connect to the PostgreSQL database via JDBC + +## Provided Code + +### Hibernate ORM + +Create your first JPA entity + +[Related guide section...](https://quarkus.io/guides/hibernate-orm) + +[Related Hibernate with Panache section...](https://quarkus.io/guides/hibernate-orm-panache) + + +### Picocli Example + +Hello and goodbye are civilization fundamentals. Let's not forget it with this example picocli application by changing the command and parameters. + +[Related guide section...](https://quarkus.io/guides/picocli#command-line-application-with-multiple-commands) + +Also for picocli applications the dev mode is supported. When running dev mode, the picocli application is executed and on press of the Enter key, is restarted. + +As picocli applications will often require arguments to be passed on the commandline, this is also possible in dev mode via: + +```shell script +./mvnw quarkus:dev -Dquarkus.args='Quarky' +``` + +### RESTEasy JAX-RS + +Easily start your RESTful Web Services + +[Related guide section...](https://quarkus.io/guides/getting-started#the-jax-rs-resources) diff --git a/mvnw b/mvnw new file mode 100755 index 0000000..5e9618c --- /dev/null +++ b/mvnw @@ -0,0 +1,332 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ]; then + + if [ -f /usr/local/etc/mavenrc ]; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ]; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ]; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false +darwin=false +mingw=false +case "$(uname)" in +CYGWIN*) cygwin=true ;; +MINGW*) mingw=true ;; +Darwin*) + darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="$(/usr/libexec/java_home)" + export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home" + export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ]; then + if [ -r /etc/gentoo-release ]; then + JAVA_HOME=$(java-config --jre-home) + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin; then + [ -n "$JAVA_HOME" ] \ + && JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] \ + && CLASSPATH=$(cygpath --path --unix "$CLASSPATH") +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw; then + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] \ + && JAVA_HOME="$( + cd "$JAVA_HOME" || ( + echo "cannot cd into $JAVA_HOME." >&2 + exit 1 + ) + pwd + )" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "$javaExecutable" : '\([^ ]*\)')" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then + if $darwin; then + javaHome="$(dirname "$javaExecutable")" + javaExecutable="$(cd "$javaHome" && pwd -P)/javac" + else + javaExecutable="$(readlink -f "$javaExecutable")" + fi + javaHome="$(dirname "$javaExecutable")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ]; then + if [ -n "$JAVA_HOME" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="$( + \unset -f command 2>/dev/null + \command -v java + )" + fi +fi + +if [ ! -x "$JAVACMD" ]; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ]; then + echo "Warning: JAVA_HOME environment variable is not set." >&2 +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ]; then + echo "Path not specified to find_maven_basedir" >&2 + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ]; do + if [ -d "$wdir"/.mvn ]; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$( + cd "$wdir/.." || exit 1 + pwd + ) + fi + # end of workaround + done + printf '%s' "$( + cd "$basedir" || exit 1 + pwd + )" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' <"$1" + fi +} + +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") +if [ -z "$BASE_DIR" ]; then + exit 1 +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" +else + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + fi + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in wrapperUrl) + wrapperUrl="$safeValue" + break + ;; + esac + done <"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget >/dev/null; then + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl >/dev/null; then + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + fi + else + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in wrapperSha256Sum) + wrapperSha256Sum=$value + break + ;; + esac +done <"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum >/dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c >/dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c >/dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi +fi + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] \ + && JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] \ + && CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] \ + && MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# shellcheck disable=SC2086 # safe args +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100755 index 0000000..4136715 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,206 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. >&2 +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. >&2 +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. >&2 +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. >&2 +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash;"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Error 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Error 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Error 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..32ca934 --- /dev/null +++ b/pom.xml @@ -0,0 +1,134 @@ + + + 4.0.0 + com.valposystems + gym-backend + 1.0.0-SNAPSHOT + + + 3.11.0 + 11 + UTF-8 + UTF-8 + quarkus-bom + io.quarkus.platform + 3.6.3 + true + 3.2.2 + + + + + + ${quarkus.platform.group-id} + ${quarkus.platform.artifact-id} + ${quarkus.platform.version} + pom + import + + + + + + + io.quarkus + quarkus-arc + + + io.quarkus + quarkus-resteasy + + + io.quarkus + quarkus-resteasy-jackson + + + io.quarkus + quarkus-hibernate-orm-panache + + + io.quarkus + quarkus-jdbc-postgresql + + + io.quarkus + quarkus-resteasy-multipart + + + io.quarkus + quarkus-picocli + + + io.quarkus + quarkus-resteasy-jaxb + + + io.quarkus + quarkus-undertow + + + io.quarkus + quarkus-junit5 + test + + + io.rest-assured + rest-assured + test + + + + + + + ${quarkus.platform.group-id} + quarkus-maven-plugin + ${quarkus.platform.version} + true + + + + build + generate-code + generate-code-tests + + + + + + maven-compiler-plugin + ${compiler-plugin.version} + + true + + + + maven-surefire-plugin + ${surefire-plugin.version} + + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + + + + + native + + + native + + + + false + native + + + + \ No newline at end of file diff --git a/src/main/docker/Dockerfile.jvm b/src/main/docker/Dockerfile.jvm new file mode 100644 index 0000000..b12475f --- /dev/null +++ b/src/main/docker/Dockerfile.jvm @@ -0,0 +1,98 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./mvnw package +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/gym-backend-jvm . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/gym-backend-jvm +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. +# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 +# when running the container +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/gym-backend-jvm +# +# This image uses the `run-java.sh` script to run the application. +# This scripts computes the command line to execute your Java application, and +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") - Be aware that this will override +# the default JVM options, use `JAVA_OPTS_APPEND` to append options +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi9/openjdk-21:1.21 + +ENV LANGUAGE='en_US:en' + + +# We make four distinct layers so if there are application changes the library layers can be re-used +COPY --chown=185 target/quarkus-app/lib/ /deployments/lib/ +COPY --chown=185 target/quarkus-app/*.jar /deployments/ +COPY --chown=185 target/quarkus-app/app/ /deployments/app/ +COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/ + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" + +ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] + diff --git a/src/main/docker/Dockerfile.legacy-jar b/src/main/docker/Dockerfile.legacy-jar new file mode 100644 index 0000000..c25dcff --- /dev/null +++ b/src/main/docker/Dockerfile.legacy-jar @@ -0,0 +1,94 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./mvnw package -Dquarkus.package.jar.type=legacy-jar +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.legacy-jar -t quarkus/gym-backend-legacy-jar . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/gym-backend-legacy-jar +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. +# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 +# when running the container +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/gym-backend-legacy-jar +# +# This image uses the `run-java.sh` script to run the application. +# This scripts computes the command line to execute your Java application, and +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") - Be aware that this will override +# the default JVM options, use `JAVA_OPTS_APPEND` to append options +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi9/openjdk-21:1.21 + +ENV LANGUAGE='en_US:en' + + +COPY target/lib/* /deployments/lib/ +COPY target/*-runner.jar /deployments/quarkus-run.jar + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" + +ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] diff --git a/src/main/docker/Dockerfile.native b/src/main/docker/Dockerfile.native new file mode 100644 index 0000000..21e034b --- /dev/null +++ b/src/main/docker/Dockerfile.native @@ -0,0 +1,29 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# +# Before building the container image run: +# +# ./mvnw package -Dnative +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native -t quarkus/gym-backend . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/gym-backend +# +# The ` registry.access.redhat.com/ubi8/ubi-minimal:8.10` base image is based on UBI 9. +# To use UBI 8, switch to `quay.io/ubi8/ubi-minimal:8.10`. +### +FROM registry.access.redhat.com/ubi8/ubi-minimal:8.10 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root --chmod=0755 target/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/src/main/docker/Dockerfile.native-micro b/src/main/docker/Dockerfile.native-micro new file mode 100644 index 0000000..d21bde5 --- /dev/null +++ b/src/main/docker/Dockerfile.native-micro @@ -0,0 +1,32 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# It uses a micro base image, tuned for Quarkus native executables. +# It reduces the size of the resulting container image. +# Check https://quarkus.io/guides/quarkus-runtime-base-image for further information about this image. +# +# Before building the container image run: +# +# ./mvnw package -Dnative +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native-micro -t quarkus/gym-backend . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/gym-backend +# +# The `quay.io/quarkus/quarkus-micro-image:2.0` base image is based on UBI 9. +# To use UBI 8, switch to `quay.io/quarkus/quarkus-micro-image:2.0`. +### +FROM quay.io/quarkus/quarkus-micro-image:2.0 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root --chmod=0755 target/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/src/main/java/com/valposystems/GymApplication.java b/src/main/java/com/valposystems/GymApplication.java new file mode 100644 index 0000000..083020d --- /dev/null +++ b/src/main/java/com/valposystems/GymApplication.java @@ -0,0 +1,18 @@ +package com.valposystems; + +import io.quarkus.runtime.Quarkus; +import io.quarkus.runtime.QuarkusApplication; +import io.quarkus.runtime.annotations.QuarkusMain; +import jakarta.enterprise.context.ApplicationScoped; +import org.jboss.logging.Logger; + +@QuarkusMain +public class GymApplication { + + private static final Logger LOG = Logger.getLogger(GymApplication.class); + + public static void main(String... args) { + LOG.info("Iniciando aplicación Gym Backend..."); + Quarkus.run(args); + } +} \ No newline at end of file diff --git a/src/main/java/com/valposystems/dto/BookingDTO.java b/src/main/java/com/valposystems/dto/BookingDTO.java new file mode 100644 index 0000000..c00b5c3 --- /dev/null +++ b/src/main/java/com/valposystems/dto/BookingDTO.java @@ -0,0 +1,31 @@ +package com.valposystems.dto; + +import com.valposystems.model.Booking; + +import java.time.LocalDateTime; + +public class BookingDTO { + + public Long id; + public Long userId; + public String userName; + public Long classId; + public String className; + public LocalDateTime bookingDate; + public String status; + + public BookingDTO() { + } + + public static BookingDTO from(Booking booking) { + BookingDTO dto = new BookingDTO(); + dto.id = booking.id; + dto.userId = booking.user.id; + dto.userName = booking.user.name; + dto.classId = booking.gymClass.id; + dto.className = booking.gymClass.name; + dto.bookingDate = booking.bookingDate; + dto.status = booking.status; + return dto; + } +} \ No newline at end of file diff --git a/src/main/java/com/valposystems/dto/GymClassDTO.java b/src/main/java/com/valposystems/dto/GymClassDTO.java new file mode 100644 index 0000000..3d45d88 --- /dev/null +++ b/src/main/java/com/valposystems/dto/GymClassDTO.java @@ -0,0 +1,37 @@ +package com.valposystems.dto; + + +import com.valposystems.model.GymClass; +import java.time.LocalDateTime; + +public class GymClassDTO { + + public Long id; + public String name; + public String description; + public String instructor; + public LocalDateTime startTime; + public LocalDateTime endTime; + public int maxCapacity; + public int currentBookings; + public String category; + public String imageUrl; + + public GymClassDTO() { + } + + public static GymClassDTO from(GymClass gymClass) { + GymClassDTO dto = new GymClassDTO(); + dto.id = gymClass.id; + dto.name = gymClass.name; + dto.description = gymClass.description; + dto.instructor = gymClass.instructor; + dto.startTime = gymClass.startTime; + dto.endTime = gymClass.endTime; + dto.maxCapacity = gymClass.maxCapacity; + dto.currentBookings = gymClass.currentBookings; + dto.category = gymClass.category; + dto.imageUrl = gymClass.imageUrl; + return dto; + } +} \ No newline at end of file diff --git a/src/main/java/com/valposystems/dto/UserDTO.java b/src/main/java/com/valposystems/dto/UserDTO.java new file mode 100644 index 0000000..de04bbb --- /dev/null +++ b/src/main/java/com/valposystems/dto/UserDTO.java @@ -0,0 +1,25 @@ +package com.valposystems.dto; + +import com.valposystems.model.User; + +public class UserDTO { + + public Long id; + public String name; + public String email; + public String profilePicUrl; + public boolean notificationsEnabled; + + public UserDTO() { + } + + public static UserDTO from(User user) { + UserDTO dto = new UserDTO(); + dto.id = user.id; + dto.name = user.name; + dto.email = user.email; + dto.profilePicUrl = user.profilePicUrl; + dto.notificationsEnabled = user.notificationsEnabled; + return dto; + } +} \ No newline at end of file diff --git a/src/main/java/com/valposystems/model/Booking.java b/src/main/java/com/valposystems/model/Booking.java new file mode 100644 index 0000000..a0ccc1e --- /dev/null +++ b/src/main/java/com/valposystems/model/Booking.java @@ -0,0 +1,34 @@ +package com.valposystems.model; + +import io.quarkus.hibernate.orm.panache.PanacheEntity; +import jakarta.persistence.Entity; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import java.time.LocalDateTime; + +@Entity +@Table(name = "bookings") +public class Booking extends PanacheEntity { + + @ManyToOne + public User user; + + @ManyToOne + public GymClass gymClass; + + public LocalDateTime bookingDate; + + public String status; // 'confirmed', 'cancelled', 'pending' + + // Constructor vacío requerido por JPA + public Booking() { + } + + // Constructor para inicialización más sencilla + public Booking(User user, GymClass gymClass, LocalDateTime bookingDate, String status) { + this.user = user; + this.gymClass = gymClass; + this.bookingDate = bookingDate; + this.status = status; + } +} \ No newline at end of file diff --git a/src/main/java/com/valposystems/model/GymClass.java b/src/main/java/com/valposystems/model/GymClass.java new file mode 100644 index 0000000..5060c05 --- /dev/null +++ b/src/main/java/com/valposystems/model/GymClass.java @@ -0,0 +1,49 @@ +package com.valposystems.model; +import io.quarkus.hibernate.orm.panache.PanacheEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import java.time.LocalDateTime; + +@Entity +@Table(name = "gym_classes") +public class GymClass extends PanacheEntity { + + public String name; + + public String description; + + public String instructor; + + public LocalDateTime startTime; + + public LocalDateTime endTime; + + public int maxCapacity; + + public int currentBookings; + + public String category; + + public String imageUrl; + + // Constructor vacío requerido por JPA + public GymClass() { + } + + // Constructor para inicialización más sencilla + public GymClass(String name, String description, String instructor, + LocalDateTime startTime, LocalDateTime endTime, + int maxCapacity, int currentBookings, + String category, String imageUrl) { + this.name = name; + this.description = description; + this.instructor = instructor; + this.startTime = startTime; + this.endTime = endTime; + this.maxCapacity = maxCapacity; + this.currentBookings = currentBookings; + this.category = category; + this.imageUrl = imageUrl; + } +} \ No newline at end of file diff --git a/src/main/java/com/valposystems/model/User.java b/src/main/java/com/valposystems/model/User.java new file mode 100644 index 0000000..13a5a50 --- /dev/null +++ b/src/main/java/com/valposystems/model/User.java @@ -0,0 +1,35 @@ +package com.valposystems.model; + +import io.quarkus.hibernate.orm.panache.PanacheEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; + +@Entity +@Table(name = "users") +public class User extends PanacheEntity { + + public String name; + + @Column(unique = true) + public String email; + + public String password; + + public String profilePicUrl; + + public boolean notificationsEnabled; + + // Constructor vacío requerido por JPA + public User() { + } + + // Constructor para inicialización más sencilla + public User(String name, String email, String password, String profilePicUrl, boolean notificationsEnabled) { + this.name = name; + this.email = email; + this.password = password; + this.profilePicUrl = profilePicUrl; + this.notificationsEnabled = notificationsEnabled; + } +} \ No newline at end of file diff --git a/src/main/java/com/valposystems/resource/BookingResource.java b/src/main/java/com/valposystems/resource/BookingResource.java new file mode 100644 index 0000000..1b11830 --- /dev/null +++ b/src/main/java/com/valposystems/resource/BookingResource.java @@ -0,0 +1,75 @@ +package com.valposystems.resource; + +import com.valposystems.dto.BookingDTO; +import com.valposystems.service.BookingService; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import java.util.List; + +@ApplicationScoped +@Path("/api/bookings") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class BookingResource { + + @Inject + BookingService bookingService; + + @GET + @Transactional + public Response getAllBookings() { + try { + List bookings = bookingService.getAllBookings(); + return Response.ok(bookings).build(); + } catch (Exception e) { + return Response.serverError().entity("Error: " + e.getMessage()).build(); + } + } + + @GET + @Path("/user/{userId}") + @Transactional + public Response getBookingsByUserId(@PathParam("userId") Long userId) { + try { + List bookings = bookingService.getBookingsByUserId(userId); + return Response.ok(bookings).build(); + } catch (Exception e) { + return Response.serverError().entity("Error: " + e.getMessage()).build(); + } + } + + @POST + @Transactional + public Response createBooking(BookingDTO dto) { + try { + BookingDTO created = bookingService.createBooking(dto); + if (created == null) { + return Response.status(Response.Status.CONFLICT) + .entity("{\"message\": \"No hay plazas disponibles o el usuario/clase no existe\"}").build(); + } + return Response.status(Response.Status.CREATED).entity(created).build(); + } catch (Exception e) { + return Response.serverError().entity("Error: " + e.getMessage()).build(); + } + } + + @PUT + @Path("/{id}/cancel") + @Transactional + public Response cancelBooking(@PathParam("id") Long id) { + try { + BookingDTO cancelled = bookingService.cancelBooking(id); + if (cancelled == null) { + return Response.status(Response.Status.NOT_FOUND) + .entity("{\"message\": \"La reserva no existe o no está en estado confirmado\"}").build(); + } + return Response.ok(cancelled).build(); + } catch (Exception e) { + return Response.serverError().entity("Error: " + e.getMessage()).build(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/valposystems/resource/GymClassResource.java b/src/main/java/com/valposystems/resource/GymClassResource.java new file mode 100644 index 0000000..3450bea --- /dev/null +++ b/src/main/java/com/valposystems/resource/GymClassResource.java @@ -0,0 +1,88 @@ +package com.valposystems.resource; + +import com.valposystems.dto.GymClassDTO; +import com.valposystems.service.GymClassService; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import java.util.List; + +@ApplicationScoped +@Path("/api/classes") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class GymClassResource { + + @Inject + GymClassService gymClassService; + + @GET + @Transactional + public Response getAllClasses() { + try { + List classes = gymClassService.getAllClasses(); + return Response.ok(classes).build(); + } catch (Exception e) { + return Response.serverError().entity("Error: " + e.getMessage()).build(); + } + } + + @GET + @Path("/{id}") + @Transactional + public Response getClassById(@PathParam("id") Long id) { + try { + GymClassDTO gymClass = gymClassService.getClassById(id); + if (gymClass == null) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + return Response.ok(gymClass).build(); + } catch (Exception e) { + return Response.serverError().entity("Error: " + e.getMessage()).build(); + } + } + + @POST + @Transactional + public Response createClass(GymClassDTO dto) { + try { + GymClassDTO created = gymClassService.createClass(dto); + return Response.status(Response.Status.CREATED).entity(created).build(); + } catch (Exception e) { + return Response.serverError().entity("Error: " + e.getMessage()).build(); + } + } + + @PUT + @Path("/{id}") + @Transactional + public Response updateClass(@PathParam("id") Long id, GymClassDTO dto) { + try { + GymClassDTO updated = gymClassService.updateClass(id, dto); + if (updated == null) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + return Response.ok(updated).build(); + } catch (Exception e) { + return Response.serverError().entity("Error: " + e.getMessage()).build(); + } + } + + @DELETE + @Path("/{id}") + @Transactional + public Response deleteClass(@PathParam("id") Long id) { + try { + boolean deleted = gymClassService.deleteClass(id); + if (!deleted) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + return Response.noContent().build(); + } catch (Exception e) { + return Response.serverError().entity("Error: " + e.getMessage()).build(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/valposystems/resource/UploadResource.java b/src/main/java/com/valposystems/resource/UploadResource.java new file mode 100644 index 0000000..df0e99d --- /dev/null +++ b/src/main/java/com/valposystems/resource/UploadResource.java @@ -0,0 +1,102 @@ +package com.valposystems.resource; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.core.Response; +import org.jboss.logging.Logger; +import org.jboss.resteasy.plugins.providers.multipart.InputPart; +import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +@ApplicationScoped +@Path("/api/upload") +public class UploadResource { + + private static final Logger LOG = Logger.getLogger(UploadResource.class); + private static final String UPLOAD_DIR = "uploads"; + + @POST + @Consumes(MediaType.MULTIPART_FORM_DATA) + @Produces(MediaType.APPLICATION_JSON) + public Response uploadFile(MultipartFormDataInput input) { + try { + LOG.info("Recibiendo solicitud de carga de archivo"); + + // Obtener los InputPart del mapa (no directamente InputStream) + Map> formDataMap = input.getFormDataMap(); + List inputParts = formDataMap.get("file"); + + if (inputParts == null || inputParts.isEmpty()) { + LOG.warn("No se ha proporcionado ningún archivo"); + return Response.status(Response.Status.BAD_REQUEST) + .entity("{\"error\":\"No file uploaded\"}").build(); + } + + // Obtener el InputPart y convertirlo a InputStream + InputPart inputPart = inputParts.get(0); + InputStream fileInputStream = inputPart.getBody(InputStream.class, null); + + // Crear directorio si no existe + File directory = new File(UPLOAD_DIR); + if (!directory.exists()) { + directory.mkdirs(); + LOG.info("Directorio de subida creado: " + directory.getAbsolutePath()); + } + + // Obtener información del archivo + MultivaluedMap headers = inputPart.getHeaders(); + String fileName = UUID.randomUUID().toString() + getFileExtension(headers); + String filePath = UPLOAD_DIR + "/" + fileName; + + LOG.info("Guardando archivo como: " + filePath); + + // Guardar archivo + Files.copy( + fileInputStream, + Paths.get(filePath), + StandardCopyOption.REPLACE_EXISTING + ); + + // Devolver URL del archivo subido + String fileUrl = "/uploads/" + fileName; + LOG.info("Archivo subido exitosamente. URL: " + fileUrl); + return Response.ok("{\"url\":\"" + fileUrl + "\"}").build(); + + } catch (IOException e) { + LOG.error("Error al subir archivo", e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity("{\"error\":\"" + e.getMessage() + "\"}").build(); + } + } + + private String getFileExtension(MultivaluedMap headers) { + String contentDisposition = headers.getFirst("Content-Disposition"); + if (contentDisposition != null) { + for (String part : contentDisposition.split(";")) { + if (part.trim().startsWith("filename")) { + String fileName = part.substring(part.indexOf('=') + 1).trim().replace("\"", ""); + int dot = fileName.lastIndexOf('.'); + if (dot > 0) { + return fileName.substring(dot); + } + break; + } + } + } + return ".jpg"; + } +} \ No newline at end of file diff --git a/src/main/java/com/valposystems/resource/UserResource.java b/src/main/java/com/valposystems/resource/UserResource.java new file mode 100644 index 0000000..3272e45 --- /dev/null +++ b/src/main/java/com/valposystems/resource/UserResource.java @@ -0,0 +1,88 @@ +package com.valposystems.resource; + +import com.valposystems.dto.UserDTO; +import com.valposystems.service.UserService; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import org.jboss.logging.Logger; +import java.util.List; + +@ApplicationScoped +@Path("/api/users") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class UserResource { + + private static final Logger LOG = Logger.getLogger(UserResource.class); + + @Inject + UserService userService; + + @GET + @Transactional + public Response getAllUsers() { + try { + LOG.info("Obteniendo todos los usuarios"); + List users = userService.getAllUsers(); + return Response.ok(users).build(); + } catch (Exception e) { + LOG.error("Error al obtener usuarios", e); + return Response.serverError().entity("Error: " + e.getMessage()).build(); + } + } + + @GET + @Path("/{id}") + @Transactional + public Response getUserById(@PathParam("id") Long id) { + try { + LOG.info("Obteniendo usuario con ID: " + id); + UserDTO user = userService.getUserById(id); + if (user == null) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + return Response.ok(user).build(); + } catch (Exception e) { + LOG.error("Error al obtener usuario con ID: " + id, e); + return Response.serverError().entity("Error: " + e.getMessage()).build(); + } + } + + @POST + @Transactional + public Response createUser(UserDTO dto) { + try { + LOG.info("Creando nuevo usuario: " + dto.email); + UserDTO created = userService.createUser(dto); + if (created == null) { + return Response.status(Response.Status.CONFLICT) + .entity("{\"message\": \"Ya existe un usuario con ese email\"}").build(); + } + return Response.status(Response.Status.CREATED).entity(created).build(); + } catch (Exception e) { + LOG.error("Error al crear usuario", e); + return Response.serverError().entity("Error: " + e.getMessage()).build(); + } + } + + @PUT + @Path("/{id}") + @Transactional + public Response updateUser(@PathParam("id") Long id, UserDTO dto) { + try { + LOG.info("Actualizando usuario con ID: " + id); + UserDTO updated = userService.updateUser(id, dto); + if (updated == null) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + return Response.ok(updated).build(); + } catch (Exception e) { + LOG.error("Error al actualizar usuario con ID: " + id, e); + return Response.serverError().entity("Error: " + e.getMessage()).build(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/valposystems/service/BookingService.java b/src/main/java/com/valposystems/service/BookingService.java new file mode 100644 index 0000000..0e405c5 --- /dev/null +++ b/src/main/java/com/valposystems/service/BookingService.java @@ -0,0 +1,79 @@ +package com.valposystems.service; + +import com.valposystems.dto.BookingDTO; +import com.valposystems.model.Booking; +import com.valposystems.model.GymClass; +import com.valposystems.model.User; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.transaction.Transactional; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@ApplicationScoped +public class BookingService { + + public List getAllBookings() { + return Booking.listAll().stream() + .map(b -> BookingDTO.from((Booking) b)) + .collect(Collectors.toList()); + } + + public List getBookingsByUserId(Long userId) { + List bookings = Booking.list("user.id", userId); + return bookings.stream() + .map(booking -> BookingDTO.from(booking)) + .collect(Collectors.toList()); + } + + @Transactional + public BookingDTO createBooking(BookingDTO dto) { + User user = User.findById(dto.userId); + GymClass gymClass = GymClass.findById(dto.classId); + + if (user == null || gymClass == null) { + return null; + } + + // Verificar disponibilidad + if (gymClass.currentBookings >= gymClass.maxCapacity) { + return null; + } + + // Crear la reserva + Booking booking = new Booking(); + booking.user = user; + booking.gymClass = gymClass; + booking.bookingDate = LocalDateTime.now(); + booking.status = "confirmed"; + + // Actualizar contador de la clase + gymClass.currentBookings++; + + booking.persist(); + + return BookingDTO.from(booking); + } + + @Transactional + public BookingDTO cancelBooking(Long id) { + Booking booking = Booking.findById(id); + if (booking == null) { + return null; + } + + // Solo se pueden cancelar reservas confirmadas + if (!booking.status.equals("confirmed")) { + return null; + } + + booking.status = "cancelled"; + + // Actualizar contador de la clase + GymClass gymClass = booking.gymClass; + gymClass.currentBookings--; + + return BookingDTO.from(booking); + } +} \ No newline at end of file diff --git a/src/main/java/com/valposystems/service/GymClassService.java b/src/main/java/com/valposystems/service/GymClassService.java new file mode 100644 index 0000000..b5e8ecb --- /dev/null +++ b/src/main/java/com/valposystems/service/GymClassService.java @@ -0,0 +1,76 @@ +package com.valposystems.service; + +import com.valposystems.dto.GymClassDTO; +import com.valposystems.model.GymClass; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.transaction.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@ApplicationScoped +public class GymClassService { + + public List getAllClasses() { + return GymClass.listAll().stream() + .map(c -> GymClassDTO.from((GymClass) c)) + .collect(Collectors.toList()); + } + + public GymClassDTO getClassById(Long id) { + GymClass gymClass = GymClass.findById(id); + if (gymClass == null) { + return null; + } + return GymClassDTO.from(gymClass); + } + + @Transactional + public GymClassDTO createClass(GymClassDTO dto) { + GymClass gymClass = new GymClass(); + gymClass.name = dto.name; + gymClass.description = dto.description; + gymClass.instructor = dto.instructor; + gymClass.startTime = dto.startTime; + gymClass.endTime = dto.endTime; + gymClass.maxCapacity = dto.maxCapacity; + gymClass.currentBookings = dto.currentBookings; + gymClass.category = dto.category; + gymClass.imageUrl = dto.imageUrl; + + gymClass.persist(); + + return GymClassDTO.from(gymClass); + } + + @Transactional + public GymClassDTO updateClass(Long id, GymClassDTO dto) { + GymClass gymClass = GymClass.findById(id); + if (gymClass == null) { + return null; + } + + gymClass.name = dto.name; + gymClass.description = dto.description; + gymClass.instructor = dto.instructor; + gymClass.startTime = dto.startTime; + gymClass.endTime = dto.endTime; + gymClass.maxCapacity = dto.maxCapacity; + gymClass.currentBookings = dto.currentBookings; + gymClass.category = dto.category; + gymClass.imageUrl = dto.imageUrl; + + return GymClassDTO.from(gymClass); + } + + @Transactional + public boolean deleteClass(Long id) { + GymClass gymClass = GymClass.findById(id); + if (gymClass == null) { + return false; + } + + gymClass.delete(); + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/valposystems/service/UserService.java b/src/main/java/com/valposystems/service/UserService.java new file mode 100644 index 0000000..4686682 --- /dev/null +++ b/src/main/java/com/valposystems/service/UserService.java @@ -0,0 +1,60 @@ +package com.valposystems.service; + +import com.valposystems.dto.UserDTO; +import com.valposystems.model.User; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.transaction.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@ApplicationScoped +public class UserService { + + public List getAllUsers() { + return User.listAll().stream() + .map(u -> UserDTO.from((User) u)) + .collect(Collectors.toList()); + } + + public UserDTO getUserById(Long id) { + User user = User.findById(id); + if (user == null) { + return null; + } + return UserDTO.from(user); + } + + @Transactional + public UserDTO createUser(UserDTO dto) { + // Verificar si ya existe un usuario con ese email + if (User.count("email", dto.email) > 0) { + return null; + } + + User user = new User(); + user.name = dto.name; + user.email = dto.email; + user.password = "password123"; // En una app real, esto se encriptaría + user.profilePicUrl = dto.profilePicUrl; + user.notificationsEnabled = dto.notificationsEnabled; + + user.persist(); + + return UserDTO.from(user); + } + + @Transactional + public UserDTO updateUser(Long id, UserDTO dto) { + User user = User.findById(id); + if (user == null) { + return null; + } + + user.name = dto.name; + user.profilePicUrl = dto.profilePicUrl; + user.notificationsEnabled = dto.notificationsEnabled; + + return UserDTO.from(user); + } +} \ No newline at end of file diff --git a/src/main/java/com/valposystems/util/DataLoader.java b/src/main/java/com/valposystems/util/DataLoader.java new file mode 100644 index 0000000..02ce684 --- /dev/null +++ b/src/main/java/com/valposystems/util/DataLoader.java @@ -0,0 +1,109 @@ +package com.valposystems.util; + +import com.valposystems.model.GymClass; +import com.valposystems.model.User; +import io.quarkus.runtime.StartupEvent; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Observes; +import jakarta.transaction.Transactional; +import org.jboss.logging.Logger; + +import java.time.LocalDateTime; + +@ApplicationScoped +public class DataLoader { + + private static final Logger LOG = Logger.getLogger(DataLoader.class); + + @Transactional + public void loadData(@Observes StartupEvent evt) { + LOG.info("Verificando si es necesario cargar datos iniciales..."); + + // Verificar si ya hay datos + if (GymClass.count() > 0 || User.count() > 0) { + LOG.info("Ya existen datos en la base de datos, no se cargarán datos iniciales"); + return; + } + + LOG.info("Cargando datos iniciales..."); + + // Crear usuario demo + User demoUser = new User( + "Usuario Demo", + "usuario@ejemplo.com", + "password123", + "/uploads/default-avatar.jpg", + true + ); + demoUser.persist(); + LOG.info("Usuario demo creado con ID: " + demoUser.id); + + // Crear clases de ejemplo + GymClass yoga = new GymClass( + "Yoga", + "Clase de yoga para todos los niveles", + "María López", + LocalDateTime.now().plusDays(1).withHour(8).withMinute(0), + LocalDateTime.now().plusDays(1).withHour(9).withMinute(0), + 15, + 8, + "Mente y Cuerpo", + "/uploads/yoga.png" + ); + yoga.persist(); + + GymClass spinning = new GymClass( + "Spinning", + "Clase de alta intensidad de ciclismo estático", + "Juan Pérez", + LocalDateTime.now().plusDays(1).withHour(10).withMinute(0), + LocalDateTime.now().plusDays(1).withHour(11).withMinute(0), + 20, + 15, + "Cardiovascular", + "/uploads/spinning.png" + ); + spinning.persist(); + + GymClass pilates = new GymClass( + "Pilates", + "Fortalecimiento de core y flexibilidad", + "Ana García", + LocalDateTime.now().plusDays(1).withHour(16).withMinute(0), + LocalDateTime.now().plusDays(1).withHour(17).withMinute(0), + 12, + 5, + "Mente y Cuerpo", + "/uploads/pilates.png" + ); + pilates.persist(); + + GymClass zumba = new GymClass( + "Zumba", + "Baile y ejercicio cardiovascular", + "Carlos Martínez", + LocalDateTime.now().plusDays(2).withHour(18).withMinute(0), + LocalDateTime.now().plusDays(2).withHour(19).withMinute(0), + 25, + 18, + "Baile", + "/uploads/zumba.png" + ); + zumba.persist(); + + GymClass crossfit = new GymClass( + "CrossFit", + "Entrenamiento funcional de alta intensidad", + "Roberto Sánchez", + LocalDateTime.now().plusDays(2).withHour(9).withMinute(0), + LocalDateTime.now().plusDays(2).withHour(10).withMinute(0), + 15, + 12, + "Fuerza", + "/uploads/crossfit.png" + ); + crossfit.persist(); + + LOG.info("Se han cargado " + GymClass.count() + " clases de ejemplo"); + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/beans.xml b/src/main/resources/META-INF/beans.xml new file mode 100644 index 0000000..f90fd8b --- /dev/null +++ b/src/main/resources/META-INF/beans.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..973f661 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,41 @@ +# Configuración de la base de datos +quarkus.datasource.db-kind=postgresql +quarkus.datasource.username=postgres +quarkus.datasource.password=postgres +quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/gymdb + +# Configuración de Hibernate ORM +quarkus.hibernate-orm.database.generation=update +quarkus.hibernate-orm.log.sql=true +quarkus.hibernate-orm.jdbc.statement-batch-size=20 + +# Configuración CORS para permitir peticiones desde nuestra app Ionic +quarkus.http.cors=true +quarkus.http.cors.origins=* +quarkus.http.cors.methods=GET,POST,PUT,DELETE,OPTIONS +quarkus.http.cors.headers=Content-Type,Authorization +quarkus.http.cors.exposed-headers=Content-Disposition +quarkus.http.cors.access-control-max-age=24H + +# Configuración para archivos estáticos +quarkus.http.body.uploads-directory=uploads +quarkus.http.body.handle-file-uploads=true +quarkus.http.static.path=/uploads +quarkus.http.static.dir=uploads + +# Configuración de logging +quarkus.log.console.enable=true +quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n +quarkus.log.console.level=INFO +quarkus.log.category."org.hibernate".level=INFO +quarkus.log.category."io.quarkus.arc".level=INFO + +# Configuración de JSON binding +quarkus.jackson.write-dates-as-timestamps=false +quarkus.jackson.fail-on-unknown-properties=false + +# Configuración CDI +quarkus.arc.remove-unused-beans=false + +# Server host +quarkus.http.host=0.0.0.0 \ No newline at end of file diff --git a/src/main/resources/import.sql b/src/main/resources/import.sql new file mode 100644 index 0000000..16aa523 --- /dev/null +++ b/src/main/resources/import.sql @@ -0,0 +1,6 @@ +-- This file allow to write SQL commands that will be emitted in test and dev. +-- The commands are commented as their support depends of the database +-- insert into myentity (id, field) values(1, 'field-1'); +-- insert into myentity (id, field) values(2, 'field-2'); +-- insert into myentity (id, field) values(3, 'field-3'); +-- alter sequence myentity_seq restart with 4; \ No newline at end of file diff --git a/src/test/java/com/valposystems/GreetingResourceIT.java b/src/test/java/com/valposystems/GreetingResourceIT.java new file mode 100644 index 0000000..9c86a97 --- /dev/null +++ b/src/test/java/com/valposystems/GreetingResourceIT.java @@ -0,0 +1,8 @@ +package com.valposystems; + +import io.quarkus.test.junit.QuarkusIntegrationTest; + +@QuarkusIntegrationTest +class GreetingResourceIT extends GreetingResourceTest { + // Execute the same tests but in packaged mode. +} diff --git a/src/test/java/com/valposystems/GreetingResourceTest.java b/src/test/java/com/valposystems/GreetingResourceTest.java new file mode 100644 index 0000000..564c692 --- /dev/null +++ b/src/test/java/com/valposystems/GreetingResourceTest.java @@ -0,0 +1,20 @@ +package com.valposystems; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.is; + +@QuarkusTest +class GreetingResourceTest { + @Test + void testHelloEndpoint() { + given() + .when().get("/hello") + .then() + .statusCode(200) + .body(is("Hello RESTEasy")); + } + +} \ No newline at end of file diff --git a/uploads/crossfit.png b/uploads/crossfit.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee5942d8e84733d5018837a7872f583daf834df GIT binary patch literal 18789 zcmeIaXH-R(k?S5N3HIvXsPj4bpnJofwi!@w) zi8TRwC?^+4+~TjTycEvSqWsj}f4h!n7k!i4aIkWP%GXEtYh|usrGMu7?9t~wvM}PS zg;U;Z(i$UyBVI2Pz4ykCg0h1?^A9WJfo`AxQhFHp!hIkF?iV=(5pBUNN{wS)y?oX3 zsxW)^RQAcs*t7R#mKXL24}7|qy427|RQ+7%ugPd1zfMTn$i=ovFJO`Dzp-Xb)I(IO z+v~6TU^q&_V|RFjsM*n29jW~NvWwr`sAsvebWL-fmoB|2j}F2^K@h6uA#=e8{fwdj ztxXlEv-Rz9Nx(bowtSmD(fkaI1%fnp2I6(ec9EUffry7lq4P)ClF?et+>jguVcOnhzpNj@x|!X|D5nmh&aB^qh#-_fn1$>dvK{ZG z1;rjW!N4Wlumr+G!;uox-c09D=MRdlxxMkhTa+f*sd$%l*CZk|qB-9%ZxStoV-^v# zVPH_QsS(b$z$5FVS!YBQLIl7g>fTr{4@j01>*Ya*ZnFaToU8*TgU~B0{p=c3)zRuxY3Mhiy(nZ<22~Pv~BB9`-6m zELD;F2`ZBVwmi6x8Lnmd-5wY%Gc(cF*3NStEfey<$fXIoz9=znH5Dy0vO$aR=-*Yg zdKtqktfc<&bISSE3FVeX-{~vxcpmyMmjK8pxk#jY7e!%*04uBfM4h`p*s$1sbF);M zutQvY1S!pjiDVu%LhMIFEn{xV?zrTb&zT__beEr@E^IG{Z7buzApa&ii#&F1f5a~( zW%@$InIq(I`>E5<$q*wVEdmQhO)|e%KawNI=2BR&_8P-Yy zq-98V8cW?zaOJ}rgYvbYW?8qXdXn1~!pIpZqZ;c7=SOW)B+2zY${Kqi1&}hzJbLiC z3@NVJPAitJsgp-kbY#!9?e*)W@OR}#C9QVuhAk7r-;l?)9q;f6?wXpKvRsv$EuPsn z14C?A-CtP^Zu3^za88ljFOz+&fRU`FAdrKgm`Ln3wEOhM#sE<+j zHrvTen-ZyMYnx|lXQvE)k~@&&iR`S5$M0XI3Y}k?G`Mo*%C7{J0M+!;JeVeO558p= z?SJ{X;q>*jRzvz;_?E3~RXWLX6_LwLt?OZ}=K)BU8BWc9iFX^U_gM_PpS+-EI)@e7 zzW9DdI%t9wmhJh11t_y7&FKzxROw7FCnsm&r+4KNzT-j~QP@h=tn2UM)WT=9zP?N;gjH*=C_A!VhlbZ+@!VHv8NkTHTcHeRy@2hd!A_6;{&X>ct95(lsPK+K?KIs+|@*??>?B(9PW7%%UYJx(sSYMb>?R8me|OzXQ@!f_3p zt%4$uadY^$h)g?v9}-j9Py%8{kJ^gotl)&E=oziI!Zy_4m2+p?-AzhXJpLbdq|*`v zNdd(JOuS~s?FzYsN|k;cD>6JdWXXGML%nyAgFJ64|FJzUc%$hHt4||;$nt}}TL_3k zj}#jlP8d$aLpKDl(B(ho-1oO0rP4mo5(1^Q zhKa{lpvdjSY%T+aw>sOB=NulvZ#`qC>Z4r&gs!hJH@_c_@s)$1Q?cWu(u{orSq^;y z4zU!8Rc*V_qc}Z#BVz}nJ>CG?WC$Q zu1R)KQcLjX=ojiG9NJo_OMC!fzh%-@+4>!w*H@NfvS9)&U`g6Tg%xYGOwToxt+VL7 zv*;GX?+Ryn)^nOc@ugnrTot?`Uho1D)ZW%9JA-_Te)-6lP3T_MWr>-@4W$1k-h-L| zek(%it% z{P`_Cht<5 zyFi*`(5+FW3x&Rrj`9e*x2gBe#e(?;7gQ(oFE4~KB<(#kr0o|JrC_K}oB0y3`po~( z7~w02p5sBVKzt868)kAShw_Cu%p<8Q32L*ZhIA9nqyxQ#SXdy41K+Y{@YY0bXkxSL zODMQQ2GS%By_Useq^xX@uq6J|R=;>;wzq(LvT?UU6`ILRTrrtf`|vJWyvm_=JQnqq z_TRCIcL^vxDVj;ysic_aO+u}cJSQTe{=K!}bdi$6isKlmsq63y=-P%maX@#k*qglP zh7E7~Ar%DX!*=ka^Pj%&vUcV@JeYro{pUGQKTI1u!M#hXILV~??Sd0j48!c>q3mnj zoQFNzb?ANrJdX{aS5)gpx|aEVJC4h<6;FGeQn`Om`j-fi-pu>>X`2kEdhqt2G5oD~ zeoV~5>aEwR&0FIZFCC<;W)2HCeHpE8_HHC|{i6F*;f@LQ@e3rd7H5RZ5xg}O1Gf?` zQZw;0H2Nhm^NuBNIausxbRCw}fu$Aue=7o82R9q&+vg}>$!3yEB(lBS&m0O+d2 zIe1PLp+_>F8rjVTMz8?8PdCKOuhVsp_$21eAsW_Ha&%1bG~e!f@2tzk_%#tJlyA(gA2yJb!okh)**cyRnpI++Gl zw>B}iEwa)Y72r+q8JXllnK0dmM+VTXjZ*?rK=u^}>N!DnB^D9!ESwywpZC8K``9wb{;&g)O8xrGHch0tNy`6(zVjVY3fbsWq)Pv_OH6=eDr*$pNtXoBL#RUp z^n7E*4!fxi{N}bV90ZK6BHKI}4cniHl_s(6tyb^?|8(Qw>i5%Ay$82@iR488b|Y6X z_^3t3KPTAZC{U$BvV!G$3E$=WO3)YDzjP;P`Np1b*qU%a_A^>xLCGJ;2Q_Gn}`O;Ee|VHh2fe>|CV<$(43{o8?6P~M^_Tz$m3%u*%T#nec5^tn4u$ePPyAq z%ke-C)coEM0o=L`_(tT@S7wr|BSNtKg&9|bV?r*c*T~~oQEo^;kOmk-qGm|S&WEX; z)PTQ60g{oaNG3n$watX!;DBU$|I+YC8|(<_Nl6s&c>Juv*^99Kga?p(PfVXnzKza4zWs(I?A;}xUY!LpxC91jjQrtqfP9My3KdD97Gs#tKu1QZ`y&^Rg z1LX-40MtCxp$;l$2EMsb*9`kUDM%DSa z*u^*UO5dKF+aoX+yP0t8leXW;jgTtxYqslw#WPK*RS*nrwcQk%?k4P>u`VoIR34ym%#htP1 zlJ8abohO9P2&5u{EvsMGIcfL59fHNnG)Lw5Udt{H8hWc`Cj1RcV{;DIp156Ic=lJB zsc_my6zk{YbceK)-L|w!0$?wW5IGTZV!2%{I`?ir;lO*#iDDSku-Dc}>XzcQNX>M(s?iMEZZ#VJB&AP!Lpa04Y7cwv}nZZc;6B{SKlj zR=t!VjT-eZMiAGW2l|Gt>!S)R7A3eDnD7zh_N{w}v@a6N+I$Nzb+Murn$BqRUcOItueTj0P2|Y5*p1gl?4!cej z9m5BDd2}0ICakkfIrr-O0Z&SWpk~7FPo)f3&8Jn8;2sh-B)}A5C{Q)hN0OoR7x z@+GfRpJnanICS+bXi?Y?S0fbmx-8yPgn^`#el&U1-SA_$TC^d#FPj$1V?1N%0CTrg;BIwSSnhG|h$4+Kz)rc68r{gx*87IU zv%$x;qeKOw+4K=zP7z^h?v%$kOXyBIrYkk|W&@eccQytyVp=yv!|({bB=1Y!v+uNu=`y(f2_Pf z0p3-iE2gIvKD;LQgpWz})i!Gy6u)7Uu4D?rfHv1%wG2~aolB>zV0BMuNQSvw^w9~NCi=8*cx68KESH^ z8mtoSP(qe6*dqDCM66tt7sh+x*g~e+Ju2o`lD+S~YjyiJaEF5i*zG_*@ zcrhoHMFr$j@m?wnUtb8E8jY= zc|1VQHgYSs-|^4pum~R;hh;NP@de#`ugo{hA&L)t8;L(5HTT5?=V7;p-=EHK8?DXg zY1UNXoz`EoO(C8MI)yKPZG39>PT=(5vd&TuP8bx#w7L85x)Tyxm-)WemR3m#3t-}e zf83qrFI^=I?ej-pKD-X1UrQzUAx~?qL`9xSQ@7VnE`E148L=C*!Mn5-{`4|7wPanUO zJqVLSv@Noo-vgm<`{YB$+`Bq4dQ{vr*G9N%c|L2I7L1uFW|3(=K5<}s8GZ6)p}S95 z{ifB%tOlN6qrLU4Yts|EFFE{vE(G+;}{IfE53Ux%O&!~V`o0#6ln4wVxdM>Ovr z&F@|eFxX6JD^ET=GDp}@076H2viF{@Vk7$HoSD$c@po` zw(T+SOeOP$r_d{hAS0O_ss@j7@rL!@@zw*pL)&*6YtxIQ&QRiT`*_K_A9m2ZV%~+<1ZBnI4G&f~@$xpsfVv%CGQ;}ioLUFoEwT`@O({iQ8%AKOums4EE~kga_X#m9*<7MLKLv47m;fO% zaSq%x;?)$}2*Cd79AfrJ+}mhyXk)bHj@|s1tgTPeXeeY*eIXXIsAeB`=h3G}3=4&sd1NDa^-t zbZlex<>ZIhy)v@tx~x`*#u9HW_*H>P*MW16H)8?O& zxI1&A5?y?|lLR)vd6LYycQiL+=d~K?zxg1w{_ zQT3$MuOi82vmKi)xAdX7AFB>ez8|mR**Uf?YD;tHXb_rfRp;#jVAZ3LgxJ%?TACJm zPc3cnn%rMa!7;(VyXSI9NOIzkR0ulg}ow@LpRCm9l#>Zy&=*it(o4 zMJ5{k<=K4fx7c)renl|=FrM{9a$LvUjFhQ&-^!PuUH+@2i+JBCk@^8Q5@i2U`2 zyW^-NwxZ&`&;#Ac1X4Uidk|c+y9ddg5Y0BZe^{$_apMJ3(pL^(&DJ(FbdNjZZlwt4 zL>%w58nM#BiBSIdIWcWhl0&2KT@xW`4ri@gpe;=uvZ|i(!(BYAt&LND<4Xzrr$i83 zGjeUEv44^U=D#9%uM~JczsN!2@KWh{*PkDXHNslhiXgdG&kTm{k+#3kAFK1 zD*;&uDSx&3=N7S{#yLC$NGKyYyZZI1a^qHie!3Jz6WG{3T5R)+!Q9XIcMb)V8wC@2 z&HQ7zRjYf@;L>3?S`ogH`--uKj2wD>e?N*RtL7EC$bItl<@Zf?w9@irzVnUpY|x>u z99wp!it$A_=FWO(T83^XH*r8l{zD*fkV{C@b3V>SUQg{PqaB$YTJe* z>OS3U{OU?nSFKYk^N6E zEh-1pZ=SPQn|iu#46C>6QPn9&%LF}uh2+6QC7VqP;+@?i5T^HHfh4#|u;))p70z8s z>pnOCJzb1Or=EvJvg+x#+SRlP-h~vb6Tz;V(yTafAhD}4`uDylH))!8*#Utu|X8RVk_g@wD`^?nBwqx&kbd7hG1dw=~s{z53xXf{S`pNEW zQxF@;j&i_i^er8H({*A@0sF&4V{Q60$>BKZE8JLamSUB+)EY2)t=}jmlnuURaazZ# zS=W`C9=8eoon4;p48M7Nj$`5X5Jr?_P@)bl$cAGoJA zZ+o9`8JPa~ zwd`a+dE(kK#94Cz1`WWke^Qk%GUHK_dEnHVtEi(K#3ZpNRB2SujM4lgz4Gyy{0BdYU@kRh!B===vRB~CQpLW)~HK^+Ap!3Oo z*FmD8@I(oMEO(a`f{dY4$Aae>Z6P`H_`&9GKkiwS&m>{r`=^Kpw*3D6MGYCG{)SQD zLWbVujg2P?Kzv;g<8viY`dGSJa_DT?+m8imw1T2syG^YcbsKa^JrTSo{EKSo) z<|ImTGwJQ%#dM!{{=Q#hQDKuXew3hb zP60TJaF6sf#;J_Zz4D?YTAQUqZ0Pm=!Ijgkfh$D@oFi{qX7as@Z5w=7czZgrz-`R4 z=^;olE6mC}Sd~>V6E2=vq8L@TXv!kB^y2@h_Eio6H8Y$(MGM5zBs>kvknPyX*60&8 zg?46+)h)0RCWj_8CD?JJa%X3W0QG40^}{2(Jj2kCORG%3UZi2|TNRl@-Qwm)vw^Ws z3)*Zjhbiy@Cez^q0%QIsK|j})Bg>KRCuHI*+OlHCYIG96vlcteN-3wPuCeXud)1&q zBPx*oFWp^{lLb324IC{``}+9}(MH{i-&@F#DL9fA$dZ#ds{s@anR_kATr^?N&jL0cAK#G3ky5P z#0*UO@lt^r@{t+T8tD4;pYG?zaSaj1k0F#8K1L!p;&yqI-)-0heAs|gNWV{XbX>Iv zDpNtD(Pv2g>B}q7i;uYzFB-%&v`8r+`ds50E=4iLXzQY$=Y>l}k1O|opSo0gOojA` zBigOEd6G5BkS$)A5tTblUdR(oa#Toayr4I-waVH+Zilk?gMP2S)d{b@&#*{*$!#cZ zy?%#klqZzzk@XwABYs6nQW<}T+|ic~Wli6u-MENR_GV7{ABfvilE=%WEjg(WasqZG z$(HvW+G{y3P)K5C4cb>jHVM1T6%F)bYQHw>hqsfPIzHdYxX7cZ zgJ@6x##|P_i)ghvxlQ3(agOQwVbBFrF&K!GM^CK+G}XzzQl7fC+CD3u6#a^jV-9hh z%bK>sgkV=#HD#FQ0y-(F%|5f5|ScsMw_yzLZdP671^A2~b=YOXXHR5>{foGr;A z!fIZGT8i_dk9O^;o!?iJzsaT}0%5kLCy_5^=v?sW_1q-CD_1%eI4`*_T>J^od4P5I zzAD`EaOKFl-0h>+Lc{}k%F~xup+JrElzVGO+#~T-w_b;)001aa&bMCU$y#E5j|v_h zy$~x}egj{_hjFDZhjbT&YB%Y}tQ_W;Q@^Ua;dl7hPJk3uAb%n*yeHU7vNK-^_(;8i zqj3aiv;i7*!p;4`>-I#bu*)I7FH17Am(dNdL$fyX+SeCENNWAa6k#7eyVx#<7U;eV zy-f1*@Bt?r1qG-M>4?T2gLha#GrG3sUFWQ4GNfriBt z_^txjLqxPQz_0V`-Wn=~d;D4`$3Iy9Qg79~8dB<%i!d_%s(8A2H*}!Rgo^}~*8hq& z3}S(ZP-2Ljv88qI$u0hJ()LOQqUEa99kv7DYZ;ET0UMljPUY=_z}{!Fv|189*!2fO z7#9QtV%BC>h&1-JRdzM~5rlw6F$p}AW;i-z8jhzO({9XTKTyBSyPo{;RQP0lyYe44 z!u+_?u_HVC#63Gs>?9{FIdfL+si4T!0=?-|6ahywtF2#<pXZD>AO&+M%Zn@Q?e@!iSr;Mfwcs8q0m6B$L_iA!a&U5OIOb~Gp@xrH zUcUpe6HHT{yE(z+es4U>xnEORQ6*{9Vx+$h;%SF;&rdcol zmlg^d`{2aN4*ldD#FpWK#^k`e1f$Ba4jrLfxUCEkM1Ja%2bnZTly{YVwxuDQ<&W6a zY@-sP65O)^NqeIC*2gDL7J6>yw|4pvDV%X(+CHaw5#^0jkv@3N!SVO5t(Bu5BE_@9 z40{JI;`Ro>1jY|Ga5=!brK4ni<& zE~trQA#8HAi6BJUj|i1Tepl`a#5wn{3T-Ar<2H!~TEco2l735YFIy+lM16H)2QY{U zhv!%sv4HmBwb0k1bX%2fTfg;q=s7j2Xz0>i`N4ZVPE+;lpgaTYt~v;v)vShYIFC%E z#H8J@JAcOdJ6>qE^_|ooX`KywBLfOPp$~$C>49SoH%opXFg*tUHF}_fpw1>Y4>*%> zHqNuJ|MvL$=K6H4y7^R-D$_})6fUQ+)!X%Cp=QP43WQOHiTg|!ZEY)(hSoX4+hbjiJ2o)Bc;|!_uu!-MUQWN#e!7&8IHL9 zCjSRTs&r#U9i1KUMvdA~J&%zNEw2D(IJ8EN+S@Dry`wxWh8HLrO&=so;PBzM0l)m8 zwiOnTn~ZA#Z+0O1AEi4IftHb30y&+`Fo+W$^O^DBOM~9qTpRf|FB9q9Hq$06`oHoG zfn$6&n6dYB?nD(3LE={+kfksars1Vc|EmHsAipCFC%67Do%mNZI^mjz&89RdZg0Uh zj|nS8C4~U2#FNVPJoBryRW+Bt2Dj9Q?k$!jviH;(tN*4crGQA7fbBrN$7jjc3o;Q> zLOwV%UjLemzdD7p9{*9V|MrL@|3~Ri2^UcX=kE8QdTWK)ICb=U>93~$h)H-rsqxhF zL{cR_j_>lgB@q}qf`z}J(Kf$kV<$wKVB2uO=2rYUX{8re*{}RjaYP+tTkU#{>H4Z*k34rG5SolG7wXtu;mIGS^!3E(!W>PB^s+ z{;O=`DO&5MTRx8oVk}(j95uOvjJT2s(#|LJap!CRJ)J$0+X~~*r zVE5WuMAc3Qd#xj^e(E><6Ghc5r2qY#Jk*{HuPCr|lzZQi zU2en5OOEs*Cu$ps0&v} zD^YDMP%TOOdxEu(x9v$IXDY4^bd|*vmfsu}8~pUk0eBC*Po6aDfA})z_BPPUpU5iE zU#zW}|B94p)^yXC%FTpni7paYz-!>1cq7{NVF44beodD>FLErdIss-hw3|!DXK42s z5lV9K+tEMNJ&Zg7^esgslXZ_6xGql*4OV(=ywWz&|7ds)j^SG8iNvadl`?#eTg;CZ z(ViKzIyyf1sPMt^;!cVbK6L%ItwMcst$Wh^JS(RpH2{aZv&&8c?-Rl@-vpeP#Hg1| zN%d?#DjakmBEN;X+A^eLDoDd`Cd-Jc+GCB}J(}6W;w*2nVtJQruw@euI%~!yf*j5{ z-fCIR)BR}XzW7biyA}sCV~W zfS${-4^kqE8NnindQ;(ePj-|_Dt5RD53c*&>3Mp0$D@xSKr%URr^@j$T)-;mMod3> z-|%K>yjtLj@ak0C?xkavzi$6xaXUUR4s0}7JEJ>?Pjuo!J#{+W-M%>yyLH+6$% zH!J1I8Rrhjnw1tVsMOg1x{vg5@tq)Z=rmy0)PTBW2%LjqGCv>0TetRN6}TslukUhK zm>sE`Q$v|2!;3*$P@vs~8$Qw>KdMOyK$l807vH=p)F8eZ(@xAmcGrK{P<;KXauziz zFVFV&=-0w^&2kdd=hOSc)X2RTP)xezFD;`&^=Z&_g(M0LA+yB=ZiOI1S^J)n_mjxo zzu)-M`Gt7Hz!Ug}zs2s67~ayG{Vo-Fh2HJuZ15c?}hiS{8IS^wJ7o63O#qeKUMxuKW0^|IjMAH$XLYrj8H!IyIg&PJcd zL+iL`Nxj_X{|aj4oA~9I<%VkC{@7;%JUy4+N%3p5*E|J>|A0L+yB=pIhz;Jkr{RuY zl9nu~@pHI11L3d7f}exH_ZfDlo$>rU;GQasHKy%?OgzZXkS zOwE6^l9I-Efd9m0wVneXqZhW#=FJI|HYz zyauHjKWn+!$;Q)rfIf{#ex2<-%?rIacrwznR4JTyM_<-yf>-foUV+MN>utNOXSXIL zOYq?vkKP@<{kRnJ(Q)!0YDIUjO;$A5Vx=r_u+XJQz13Cxx_{Tb*`qoXaxB5BAqJVrSAv)PD99URd=jS&CiHb~`+wg+uoEaysITg*NkY@$a5> z@AR5t-wz-E=meQr;381KHf9-gB<0r(#k-%r+QURV37%~RW-ttL+!k$CkHMEFP%}UB zCHP5jwnDSAK*D`g@wih%?f6gN#vA5sHdQy&?^WkHvO$)~(AN?Q$_)e9URImjt1E21 z=0{{_ixG$;2hnWyBzMCaMZOQXGT>=%$b@>Nf|ansC7KKl=@ZM1FO0=AjnO4kZfx-} zTrH|y&hKRYNsqHVL?}Z1b|g|ioiBLVmA=RMNOYX(l#xBGeXXd>n_B$MdNIRr#0}zax(2!ODpI2yk3q5+OGv zDXn<=;D=LfOvHPB6ONBN_l-O=?@)s?L14@QhS2ezV=8q-xspq@smrF*!@v%U+`}4P zfiFbR7(4U=xA3#2@>crrE>-5gf37%MKdjJl<|eR&BXVBO5f-B@_Tu`!V-)iXMh`S- zpId!&K_VbHAN0aw*uRi$nY(}1(#NtFtnTjRQve z0hBOkl&Bs1OOg2!pUt6PA~^mP9AXgRxA-Wj4P|@CPqSt&7T72rxmDMu;455xH{<1Xw%(vdF!+4hrZ!HWBlc&Z!!!| z>BCp2DrrvWG{}$mk6w1M(~J;~lD2;>Qv8B!_psn|AAD6>UVEW0?MlNz4?OW&QbDgg z^hh4^*%*CXZnU-@9~1M8$tZ-q&GP9ef@SKL1jvc7KxN;Ir3+eEphkTM``whskGJaX z#%a7}m*^}6D_8ry<*yRO+M|ONRyM#AV(7r!sUzxgC4yL^A%uw7a;1x>D{!k97W-23 z@;3 z7v2`x|LfgxH};oOuTW_i^5WguM!jB|E}(31W8XcZr z_(1v_PQSz~BWtkMe7|IU&tUOpUD;39Xz21N=OnkfL9>JBl5Bxt>0Qr&k~8ZGypw?b z6)yYzY_jIk{RWckAB0~62x-d$Hl;asmbO|={w}c2smw^w~c~9_;pt7Lm)0d8x zm~|!S5o%-Ox{>}DwNObH*A499sgRLj0;`qP=U;Cfa@t08eDujQRk!0GCZqAug6Oiq z%S(dubDJ?ZLka|pwho676qkO{+7>|>4Gr13lfMFedjDD+7D!VBxBHN;(O-M@_=2=K zSEb<7zbt_-=w18Ih-p3w6nmE$qpTw#P5@9kA}3Uv&1tNn=(}!w94`9vcnlj?1GUVj z6M+=kpFs+D-cKY7?yPXKfwibTgfb0hlzO#=Ya5RP53U@nlFT0mkKc-pM&sz|z%klq zMoSL5m9$VVeo$(gJA6nVo5myr0&AUW@^Ur+6#A(yq3=>PVX ztXlPMLOF@O2{`fi`$?X1Ed75QkQ;}pr^kY$N=I7^o&?*O&UjQp84q#oQFTtVmpJ{& z`YLZ6_te{MXcjS3;vCAC9kn2ZbLG#vb`aYZV*QHuu3D1DZxUBxtdPv7zElZD?R>LR zh1qrAPAfUkn`J`L%d5~bc)}>bKDZ9+uhBl&VcjF6W7UXbyg(3OKZQ8B()M9wKz48n zIyvI;&Ww+t@1X?Px#oo@LJHjH!QfGo2ut5W{;kgoM$}%mfvs#Xf`{`>uPy>UJSfZY zf5{M3bdsG}Q~)A)`8r{iD&&?rbey>ewr+u_&caxf*Er?C(URQzYx=>lXDIzqi}}}A z#4vk?D*%!U&e6$ZMV@39WQATw7jV|uQYx7>qE%4hvQV#-_}`|P?FLn zl7HvhU&)c9l3ZOb(s1;>sH=^5{NXMj1T4KRK8q0dr`kiDcxp*eDmY~U22TLu$3Ii0 zv+n+-fE&ZvD*Er&e=qp|6#lKiVt8}ol>BEq5`ciB+*H{#ec;k7KK^3dY|-a#@?f9I zUHg;6FI;7jSM}pl{Aw=dTX?ahjl8MhUHNKMwkE47)5n90NzmO>JgmC1d#upRO1ndp zCSfZK@DcYTh}y;f0t0{5q<=!**cf-6nu6hT4U*4m$$akW>9`TSk86;;{W^3F=uHF92dyav~a$UGtzD6)I103@jADWG*<%p%(2Rvw-| zPJVrix4rX#Qn`kd1_spg{(R1H$NoDTG(&@W$f_-g^!mxdglIodZ{|bX+^{omjUsAq zI}opvBM^1FToHPSnVMbf0{tT>Ko>fmUn?MgoxLJ$CMnHySquFmtp0av>0Q7dAJngr z!OM5?B76qhL6zQU|EZh^W$@mNvFjU4S$0476>`Wu>JDGm49l-(r0$K4!;{~Q&@Tod z)%&!v3ZE`=RI5I9CwW2vxyQ9Ap@SZk_?@bF3R+}=!vK<7TwT6s1M0Sh>Y>(`^+p<& z3t6mC>fY-55zSiUX@Di`>)i9ft?SbBbNx(Xc6D1V$lKLh0#} z&|JM3ksMuo9Mg~VgdYW0By04X5#Uy6jJMTE%;F3SZYgYmnx#WhUizLqv^255fWY0l zl!Ho?+MN4eoAlSL8|?5zPey?W0T2Zf>E4L{^5UVgeob!fcgIi)IG_N8qrY+5YZ~nx z(2cY+%1VjDy#f=BnySW``G!hq_3LJFEA%=!nCfT5$+q^Cb%LXQkCBhKb7yGnjw7&*FWftjjC?lQtvvlbgYE7dhw{Ke=W7oE3 zo|&@4Kn@saF_@<$hk}84&M7C-c^BTjQ3#6U(dP=iek9qyJUBTT7ge~}uO;>&ME| zRJ-S;*;I)Y_#b79N=u21>fIq?0|Wq4Wt1qks;$28Ax@gwP43)L!E&?rvo$NJ4OJ9> zNA|c)?YS*S##&89EFnWn9C4pc=xAA>6Gni4oEadB0HX(v##EAUhpM=1RYmLyZA+ZY zxx^mV$$kfFRv-$%tR@ps9(Rrm4&$lM>vRoqyEPX6bp}P> z3&IxYYZ()tijHJSA-)uLo(yEQoyn4~vv2S&J$X7|R9)jwBG% z9p)Lfor}&aXKXZ@@*;WA`ML>PS3&VQUgRz zjAZ|d`5^iPUCD=bKpNmZh8mpq!X2=WH>>US0@+%sZ4KxJ$8aLyXKoqRc=Naar0f=x zT`i# zaz+4G_+J&lAAfSz|Mw4PgwHzr!@(c%{dqp?@hmv{-*WRmv5iCf56}Pi4`&>l!TuMU zGoa3%K_CCJ{Vyc{6E}bd+_?T9h&UYncOZUMr~h{!3_7!FV1oZ^sBp&RY{s8CRdTqM z3KUwBf$Ly@p#2ZV|Hlvi6KfcJ*oRwZeF09^iRC17@q-7$e^HXQGmA-ZLk_%jz_t^Z zOnt^)_hRHrbk5d=WRM=IHm=9-S_;#h=2vLLfcV8ZAz~%c{bvs|HE30tXDZ)m!3>kd z{!tb8eOsS-fxaOwynZQ(q}}1dFOQN~Z0P(=Vb@?$8*(sS2X>4J8-B3ms6OX8PELFl zciWUSk2lVq3>MDY#xwO+!^D&OLq{6^C9%xS9#7LmWs)~>mxHU|8;wulStD=1eVo;h zZGK+#2yNk->+=eoso3KU(8EI>7b8g(a@Y6Dz; zd$4+#%o!?mf>D3pQ55ooKq+jQk71(ztE1+O&qNGm?dJPE7tfMd4U6j&G0^s(n@A#39N9 z<;K!%f_=ybKT&G0j zrk-WsTa;W}sK1{!vEuKNvh?$*eTNfDZT0xkpfh*o*b%^GP`VJ`6pGvtVmC?^K5H0- zn6j&WF7`T!1)OngobzautoWu2?pmZ--hA`8x+qpdIMA$eP-|=Idp_rbbL91$d?1C` zuFBxtEx3m3I0}09{Mu3>^?AQ8$)65;WzRl5_7HyOQyS}kLy7xDO=(oi9#ITuBSk{b`f~44<#GrTy%4@2&Nm z-A>t>ab4jKCb3L)YzgWYbpn?&$3;gp(q0J7;D(wCDe%mQFlaLTCe#b|n!Y`fZMp|G zg7QK7aoqAt46z(TRJzeQO{I4m?dXyB7uFKrb=T?3q^!_61G(1gz|p*1TiQ2XHQ`Pt zuiin-))pGx=lsWrLN%VCBG$XaabB=R=X+ne{v^L~`Re4=X-Uz#SFuR_yz8HFy%$0X zT<47_G&`#%l7sY7)K$YfHfuYI;PB)xi(SLUAk^f670-lti=J0Q4_=L<(Iz+MsY=RS zkPt0#wCThDbJ>dzro+p<-zp8~Hx>Q-<>P&1t9^1>(&?vpCBljNrZl}v@3mzsBY$Oy zna;HMmf9T&T$ZUY8=)dge!j$2JYmQzF^$>;SFun{_$;cM84)m^mM<@QPNyTVN6#D4 zocKR6*;4hz3gJ;Ebfx3b+^lA%~=}Q0`F?CA|xmFZ4}kIse$m{vB5}P zi13)LtcI^PxT!4q{@wV3EHC5~?JKIs7vVD}jeZSi4-hbLcV>so&4L1#VS*=8P z=A2Gl?_C4gOA(F?&Wl2EKypOt;P5@Z472siJPX%tPc4Q!*O-XkZ8(g`0@mdDVSFcr z3laCOe{TSOHuntKOHmoe(IPZhPvk7|?xW_?$%zUW`Q7H@(B-#tVzEW9JL|y>1{R;I zIZx&~S{MT+ZDkN#g#%$s1 zcj9M_*>h@VBxUd3T4qz6WyuVF;GIxiIWy?-WHP%9Ea%V&;+c%Z27M~wP!d{6e&#bn z$%N1tN2`viy((CQFwzvXb6*VLmzKW!vVQ57;CG#OprVVx11L1}zycYMyt)kdiSlKC zenhj5bss+Kw(hdJRJ~b@Cf*JKb#i#~=()Nb1OI@E&O?qH3~c`Kja-y%EOQL}ou z-k|@q_-;XLi0hPkrSWF9qJ~B2rn_3R>L6N_0QA}0+PU^a_GHZk+Z1@xw-rTlYsmzA zw1(t5&!x|Gb0~$=^@nW;6pux*PIn`B+-J5;BwUY+Ena8+uG_Rjrv;{Qx)P%xXpGU& z>NM89k=vN(XJu5gD|}=OtDv;LG?w6hfb$t49C#2|w{bsk@WJ?=GPA8GiR2d@I^*6c NE2=A$-Lic2zW`?xj=2B; literal 0 HcmV?d00001 diff --git a/uploads/pilates.png b/uploads/pilates.png new file mode 100644 index 0000000000000000000000000000000000000000..6960ef822f53eb6666bee6096f986297212ac02f GIT binary patch literal 38729 zcmce7WmFtr@a5n`u)zZa2qA>v5Zqx19^Bo62X~iX!8HUA?he7-g1bAx-JM~Z-+%Yx zp0l5p!1j3M%_^b#5!2=)RL11Ly?b3DX9(Y4^ zfJ!QZfj>|1*AU=4s;z{E191NA%L@+rF~t=)NaQH0?xYrrQStVb7YXFs7Z6wV*;5Lo)`2EmQJ9N}& zqvk3tK{L)KGs(u#pl-Mf0zSx0X30^5lJm@ye+D?h|279cNlN^`ANXeclnKc~9>d=S z*Jm%hyNCz*z&qr`9~dnWyj&#`OhJsW>^l>G@$HMyT{~32EZ+X6(uXFp1o2~l8PX#P z7mdYmScFWwjN(AK(K6)aH_ic&9r$uM48vuDxM2{oB#qje`|n*!AZUn|-<|Svuppw( zxE?CS3Iv+d-N*vWSJM%dLNNeh1JYA?B8Ndd|BPbsANY-dg+3zO(>fo87Ut*1-}E+O zznpprrbvem>S-ipu}_abw}kr&lJ;$6v6e4E^j%RLNUF3B0an69fZ{XLnp&(2#iQ!) zG^F~NO|M&#Q)E}JnTWBM1=}`=y;;ZVFoi`B_!pDKrNKCX!_s7pqruh${)~9=aQef=TC^f>(WDEE_imH2?X8G?WMK zWtuhbb8!E^A7C)}@z$keG1L6VUxNSECP5S&17Cy015fHpAhf_DDA4{cU=D#EMF6o^ znkLL}!c0c`?aO=_7{L_D@H=oVV1Y|59B=Xjq)W`FCF+2Bs1)~de2|4Ed*;jC7(&4Y zNV3QrngGe-wMDZPh&GroUTP19hU6&@Jblm+ znZ!xfMJzB+-V1~2sPEgfG}G*yK=lP|i4C2?hK3_@z@LEl zvzG!$vOM`^q+h$g0<5|f0MT93U9)b-@5-CPgVw|-GDaDY0CU&y9gb<8-pwH(nU*f%es13nzVS#3)O3Qn$3 ztTk4ftock8u!}+u&lu*UMJvyw{8eJIhEhEzp4Ts>_&iUHK`SO*r7P!yc{0HXbn!kN z*&A`cuaVziEE|;UjE?3Te~#;q=KPq@l4+gY%Vs$_a_9`4njZkM@||y&7wWF(UY|Gs zu^qh*J^)G3h$Ha(-Wj(r_v~dUm9NwsEg*!6CSr}%e0?9l6{b&-AzNuJjqeoka>FZc zR8WMZ8bG`60t!$Zi#76(+ZV1#bfc4F{1y+wWYE}U!qA{0mVTTPL-!OBFL)NlY3!Yl zsAwId2rCChSF+$VDQ}wc?XS-#-s+0t3a4 z{qQpKBguBtDV`2x;{Sfwc-22J(wp*ARzVnUvhA)@VlK#6;I+gg^kw^KCPA^DqkMfn z|8r-IN(@hCKg%^sP8v4F2V_uB?Q>=P$~5TU+NO{)Axd`hH*(cVVYMY(e^_IfSW5$PE^hh zocz?b7D0)A!Ia3~FBc0?W0vDJ4LSg3_PkiQVh+R9JyEsCf@;UgBFpm9uZoyck+F?-*E%J7+cM2^5tkA@3ez z-1q@g?7vJi_7^0J$;|ML~FK}aQ|K<}gFgVQ7{x<-&NC1}u$7HJv$ zFi>Pwv3F0q1jBngX=r4%v2AuHl|W~o!Rv?Y%ic&t8nq^ct6rXw54Dc(zIin0Oy6}}%$Z3>t zkgQDoMR}8x4j;lp5kR_&>Ihm0^wz{VjEW@fMFmq_!!`Now5#ePGh?W~&z+J~e>09M z^acX0foBBW<2;J}R1K`-_0`PGP>Q_0(1C{hXy;WN5LB*JDdrISy>?+!y=Xq(N;$$z z2J4XWQPH||DT&1q;V$*QRrY(qJ$75}4kn8A3Xn!-hH9o@6aD4t6EsB6Z?FA5%@%Fo z@btUixW2DZy(R?-U&E*R-M^z^7pV*eQ>a3g{yhQV{rkp&8LAj~9J#*REVT>knR)P{ zu|>B;)ksHHcyk8?!Xs&P#eqQC;LG0KuGy&c4;Iss-fHdc&`@;OwZC2?F}F1n4-3~t zd~FO3VWa3yLkvD_1C4Y)zA`TL?elelhL}S`{4%c)HSOIYNEuHbO69;!Y~{<=efYf} zg^khQAR_*bTm1y4D9IEsAg+ki*UP+L_gOObtM)7R1t6O@5TZhKH-$HbDujnhfedfy zx8rA0X$Id>i}Va<6144C`~F>k*$;pI=lQGse=^coH_5I_)0angZb3M{wNk_i5drtU zNr(>t0^NDq_N@M18=4f|zOS_f%@a~UU}ivFDwx9JvZLLaQW>p9}vmf@sW+j3XDlUBW-y_eXX9y_;$y;;Md|2 z9yEpudK<8d{N-(Zksw(bGCd9u!O{~He|9$tPfxGQ*_j!Pp|6?$=3Ik|_5*Q0+*I0K zNtwV-89ZE$Lu90J!y#Fi9htQX-8)^+5~RKw(2#uSgM01%o;Nz!gla6N+~fam2)D=kM(oc{xWiyo3M2hVT#PM zSau69#uYDGZoFvGLaZ4yWA6@8@ZXOb(Cue`Jz34ZMvCbeQAExy7z+47qAd3U)_yX} zYccRHfD88)zlXY5RKaphjiMX%B_*8N3lO_{r_yAQU7=@LJ#VXKkn{VKC=$}<*5+$e z79|xe9GTtfN4kzt=XVzHLl9^x@j;L>C&8N3Z#|V2Wo7yHWMk=0%#6;d3!$a=T<*09yWWN%%*FnKu zS9CRP>b^>pZvR?!nx_7|??9!vN3c=!3Z*lK0~~~>w~->5B{NHDhvbJslkn{-ERB(q zBW0ndGiA1vh4|ebj_;W14T^up)_yx&GhM(gE-*<#f_JI;BZJ%$=09{(QGJX-1kLUUDtS!omBf4A7lhmyftek|tM$*FD&V_~?RAL-Ui25pF z@(JDS&A+@~rMw+`7z`|;sUUTFf{D)52ViQ87d{fgx@5c@HlK*MMewa8-`d~^_IM3V zAl~w^wd9HxG!Cit4Ui&69kPp>GzR1HvgfPqY}c4+hn1i+Y3%7P$)YT}kbk|nZuvIf znmD|8bGEZ!^~mSJ?cHWhoes-@82*eu7p-ReT}ZefFwHh`^Dx2M2@^YUY)J5V(5rRC zMlO!AM)p>kO05S17Xngl`ryBc#og6n42G1cJl&%&`_luzy^p?F%t}y||Nh1Q;4oj! zl$dZ($7%_)Fk#Z}T6uCaVc&Vb#vybgi9LZT6c7Lz_Khj}w{WD&$W@Alz{DLGX+`|g z!?9@eAWQV0rufsmU#e&8t(`!IH*c^YK`E=dv%5w*HuRAq_e(NnEirS=6&*Wk^OaFY zgU`RC3dOPd@SV)WfJ0vdHNy6pYl)7QKQa`@O3VE}c6J9vovkP6|yXr$fO4 z{F-*l#$GXsRr>Q{u#0}j56@f~u{c|L@?^NsFH(Ql$%=Ln-@<1up#Fn1=1*U?-s&BE zuv>mklNuiSJ9CtCx1{Z~-v9FYw(uu0U-vn7v@NB$=m(@(PXGt%7^Ao!8~uY~!{!-e zPP9&{vu^Jp&rjTBe+I=jh&8+wtRdK=#Jkx`Or17(Ikrb6Ess7Dr z1%%sgOKDTZrI(MHjqRVkQf)g!xZrHvn&*^g%MBUm3AC+iS7EcI>SbBi&u?h9PG}c! zN1+)#KM(~|q^A01chYvOH*>MoL?2J<)DdOXUKQ@?e)^3=wKM8uK7p0+^)M}pPy8kVS31XW5 z-lbqCiARBmh29`WrJNuWK|oUVAqWuw>YK0c7yWfTeZ16i5M+W;;!W^Lk|YdBN8 z*|lo?nu2d+Hg_Ubl-5ll6bK1aWajPpP;f17dot}6vn^h2b}XV0*l#j7PeA#{>Prx^ zvt8B2U*|wLDFWk_Lo*uW6daHLww3Xe4(LgI}WL8D`2_QOQzP3zj(1_Q<}bGA9ke2>>dPihq|dWvvZORfFBAU?r;Zdoyh&v7Rxb?M~X{^}6 z;kZdsGEa*!vG^P-7virbj%7Gs#4x1SsM}-A8|+)O3b+F*l$KK>mv>L^+L z%U`i-TSCe9>d7o&*AYrd*7h(_p=VPGo|y1bx7z1~<7a=&7)ozT*0@k3L7jYmnH?xB z2lx5Mu!X@T|GLlEJA+Df+NW!u5Z0cN?n;rr5=vT)D#c_u@$|`ebUuu~2Ji6)=PTVP zQLYd33VwrVs0fPjo0biBiJSgd8PCYA7JA=W8VpEWFneFVJ-j|8+Xm_!8TVWA(C2{y zzqu0kV7r=KY~PPWu9D=MG%Ncq^!ddWr1t;r+1(BrQtD6dcZLgy3#jUa-U8l z#+%cTchxmE%f2b)+-WQ}-j@4LHE;RhAxNrWfh3G-s+(#N#!%sPA*RZtGjy2Ix|3+rx;Bb*F<0#%9vB?(9}klc`%MmGai0BMy|+l&Ogr9T z1JnI>z3ZvhY&6ELUV1-{hvAO+_SFbquFhPNa}GTL_F3?D2L<8TgFn0H^Ppi*=|rrk zfiPUkOqt2#!t~ssv&B@A%rMVY0Z?plG^K51y#ub^{qyR;aCs_c_N1F*3Hw;~EnF)b z*7ZmJN4Wjj{>>%twA+nfHy{jD0Z|A~+bd@80IhQV-Lr}&y?>oveG)E{Ye<9^?IJkS z93SAB=3Cux7ddU9>hxc~POq)Oyy9=4Dy=mqiuHKo)W{k>94?ax=xvF54cR^kJ{$nE zzvK$*FCjqV=XuQ&MMeLIneaTGnr?ZpTP-MhV~jg9FA^Q`1^m2k`{06?dk?ZvV$+Fr z=P~o?0`c-I1Jh&nm$UH+q-$4ti3lCx^{cics_aD9MZSJTT#GI{N@4!`+YKp{O(rZ2 zE-@9F&w=9$~&tp2d72pX3I z(BhCq{Zj2`q!meDBkFXzEa=NNb3GRmeQ4Nijk&IzIUhh*6?+vAw1sfJab8m4L!SHM z92bUZ&I8A+<1JjdH!H8xUGDs+fgKIF+cM&$)>qFf7PV_()m3W^Zh@87(As=lP@E_= zoO}x0RAC`dp%=?qe2vclDwWe*w}jNgf>>G5P(G*E^Olvq7q`z12pgugMMxmJkX}(J z3(8`KKV@JZJPhj&L953I$*7##&xE)VeFW0hFZS;sCT^`o#Tp%8-`O3GmR_It_Tf|@ zs`g!bSQ(3LY0TPmpezV>4x~&wRWK;n4g;HvB`L+m8~(Q@=>@JYW4k`h7C|)=o(wcZ zvz@T}u1gQ>H*L~oQB4u>R$f!e+?>X5V!~AbZvgcY0mhiSgniIk@E#z79tVdk;}b#M zRdaI2_VyTC?kPF(QSn!V&=93@R1i=;*_KjuBI?5?FtnXIBtugi_-JygD4N+aNGJl5 zu)Zg^_d!Ei6$dO7-pPW;32sBVxPn)XZ2@{^7Oh;pD(SA3lIGD=N!%VZRgMZq9N{79we99H&35}GTcIh6e{g(g zoJEa2Ils;0N7(qc`0ju)6RCj;m`>vsXaC~{L@m!cJY0JzFqPK8H$jZ)PK%c=LQO&sY{Qz2sB z-#B<%Ym`f7PE&y7YNFaAI$Z@pGehVtWUW1Y`Eaf(iByY2K^w1juZ(TYlA?Q9aey<+ zNnttwl87LZWmnom$1#~NUOW~^!9M(5)Zhs+4O6cP0`lgF0HA(<4J;v?Qeh`Nb8 z{2J3WuC|YfHXbg>mooqomJ>gi<))DR`Lyr>(blG>Y)^XhEdcEkRTi)Jn{}+Q$WG2g zI#rA-)&CYG$%qYq({wrXvlWEEm2<>;Y(=<7ovGy z<+_#Eh3Y$d&`Z$s&x?{}YbQ`l(wwJVHrwSIw2U0B z>5P!*$5#Ca{~2XTOMPe!6EP~qXAWlkIC2`G74hV*K%?H1lA{Sj4qfgRZFWZqrayij zAqE|aQ#@9lPT&7R4O&kz+#HT-egulE2DH3K(cWMk!Fzjx1CE}}YKKC|#)!H$mo_v6 zU7xsve=)CO{%Fc(Ar-gr`YmhI&vjQQxVfBWrfgbi8o3-&IkD z|Lgu|ea&4LygKMj{T`)w-$IQQli)Lq+D`RghfB1F3f*U4B-@}>Vf^P;0549x0KW5p zEuv3%(2V=6bTS5!N;8 z13=qb)kLhpU!3^`xA0lGzRbXO^JE2yI7~6M-Z3=YBykQiTcKmr@M&?9GeMfguR1}C9DRrBhtfMb% zyopYpV8^P8HtO;uId+$mnorsMKvTvuaq*y<#m+GT-`)P#Y=dj~YJ4_o8laZ@qBvl< zCPT?$fBwpCH*gfMw%}VJQXsbR9a3OVI2mhy0D+1I>6!?|=cTC+_)v5tYw+?&`v#*IG!GvUOpp zS%#A?W}m`{ts7>l*d#2%+9^nMzufb^4|QcS$PK-0ZMDV;OAXx($w$(YpK|qi75#%3Z=cyO z9Q|v_vcp2CAKudE!tO0N4;Pg%Q@inHaf9I^||EuXB3H|*mu zF%3xzIl%#@Hh3K0l`t>^_r)vO^F$va=SVH;jOGuWCq8}JXlx$@$X?!~rVNS2GJa(_ zHFaMXk+!a1sLNel%H0+-%qeocm>q^Je*`uM$#;5Ga4M{J1dfUCB17dfBxx|L$R#*_ zOe%Fp?Sv!GRSPDrk9wA5F>DPC7J5EARkj5T!me;upA8E(KY$RJcoUGFs&8!%t?H*p z8P9)0vI2|rRVV@qu)ZM2AEnsmaJ}%rwIl_CjP1v^(Ld9%uM%KIQ&v;Ia33;$^yNF| z`;z>6bFU+&v%BIYElOWE*g+zPo+omEoI2l>w(c6&mNBSO7nS?|k0~$6_5#7C>O?3# zRGz5-9Qy^Qx-Nu*X6uW8pdb3({Z8PQd+#!Tf`rnXocPXHk?&UiIFLWruOs2(*Hvhg zE^#os#+pCOV7MAjfx1{k6j2FKL-)6hDFTAm3ca0FdK@1-YmS%jqfk9Ij+{{n&G+nF z(mhlfT67z4j>zfROJsG{!p2V6ETA`s`G_Y5UFi)c_L>}p812JqVvh9vc7RcX2W^Oq zYBtL#YMKGsD9QL=n5xn`Is0VyY$^h28mv~HAWy&V1P8LwM*E@)QWs-|FB9Z6q!9xZbg!JVm{1dt~`pGM7VdZEXDphK$nrs|dZT zI#WQSIBS2};q$Bn-W#s7r*i4r+k;hnw)}4Z!rI$kG(7KNaqo2o-x*~th*Tl#IMb#r zatIucD!t+O(E2H$XP!(|PxEOYeYKtfB(5y;}NM%N=Tm$225N^mPBPWno;J?y+Th({skx;zf5fAxU$Z z(N-9hsqP)uqVus5@k2C5ii^X^Kk|ZCE=pN%;PIn?LIh~JisQX8bYQOY^+=b$_T&0? z5c!nKzD5L7&w-hJ14<@dCKy^>@kZ-$xYEK!dnsX2<2R8te%5XKK%kvRr_w!8q>=)J z_LS?>y2T^c>9U_umR3A2xz10>MV&fC_d0a=jnu1@u2IAsm-iRD%cUFRQ6-K{Onk1n zG&l3%4aK{5FcE+xRWsM7p_*OgOkeV(8a+hK6i^QXGz;NPXw1zwjzC`9Ea;Z!zx}vX zS@~=$kv4|}vJb8{#LoBqRz&v0dj>7nLrMz{2fnN-+SgpX zF63(+rUHt@7qu=v`U@pnv{0+}b2k>qKt=YJW=q)L*bsv$)9Z3;biPVtxMGn!Z05X; ze4FNnQwi&XqyAst(+3{FF4q^FlNISzM>>=NkiK%h@TDUmt!&{#OcWW-I(8?~Rwjm) z1%`XH;0pEKv5WUA;%IeLx4dfa9GN2Jv5OU!>3jJ+oz!olr!6`Xw+$}Gp0m9yjVa%Y z-|3%!+5Si@tleZsjm1~`J~O&~O@6hQDB6?%2Wn2dAgG)qA}&R*TPJ%}t%}riz|n!A z$JuH%pf0_wZ~&`e$Po)yj|dtn(oe`FTrr?!)a4gY5ay4KWKcPlBcpYQX)GEY`OmST zLTysiXB}u0JMKGG6$M6N1$*BF1sr#{psvIP(Z|Xt((`8b|o(8cN{qWnChEh*_XV9hV{C z8BIo-QfM}yF!OEBfUB3z#%HkHr$l~?cn15>k{t=?$A`p!B77aDnk_ zJ|*Ug9r3VP8M*c%ubq$aLkd|CPlUT*cQ?2Vk2dR69E^2w@t+2)OmjVw&X2ulXBR;g z)|0X#CwjHkyjc7Lt%z;VNY3fpg;!Ta#mhu8{TOP9G*WoFSeyWG?HdfvMoBu~uyH@W9F3KJ2&x>11aQ50_@fHK?E^p97?DB5t8+ zU2l-KEDCvKO9Wd+Rq#SFG$c~Rb5uo$gpv>+I`-R5dUEj8y(P%>V^Jk71 z9U=uaiGZ&QyHpS-U|G1Jo}Bo*cFtaWR9V2!O@l9`|Eq}T+QTFuKSktFSFS9r+T(nZo-q|XnA}cUe7#w^PWD&WGxps_vvP4?_m-<2sc4zJYB1>19o$Zfjw_= z`-bJbH}90wfDW7N?u3kJf$i}R4+Tg0DVk+1mdi#5fL5DKP~6UHv*kYI2wJs=dl{Jf zsZ((Cyk_MHp!5G0xe7eos}1RVb5+7ad>BIkOda{cNCoUG>7l)5Y=6G2FW0DT-Pf`^ zbfzP3zGW)oYf}ppIRcjSVx3Op7aNR`m`X2rw7wAbXk+A2r8gDK5#t7eWa3n z!T*z!J!0taFQHiAU?Cwakm^M%dsM$b6q7x4pJ;rp+zu zf}KfHlE#M+%7?II`d(JS&X!jHyq>p+uiU0i%k92(u;C2Y*B5s-^y;lKGK<$^71jjH zi=4S0!5=P_cC@%GY0K0ZVcJ8o_Y#H*Cr zkb1jy`<$FzD<74y!+<}B3x9h4jwG@9-}Gwr!GNAD*(qFy#~`F>d7yqAq5n&{=aEFk zVf8)x2g20(1Xdu?nM#sQVsXJ|-6{JDY#_EWz3*kD$@Y^8`Qy!YUk{KUsQ`Dm=jrjL z5_uk#pc&?+RT0tGUv)2zOp{^oR#dq#ee_5F+}`D_b%}6SQ>jl9(xb_J{ws(F9qMj>Y@0U87Op1vIyJn-=+PqC+^04*XOmE07yPO_Hgm5u)q=Oz_W+2*yhylCF)#)8#g5P zp%niPsmTJZ*DT?>XwDpPTh~Wx7hfiO=Y|yj%M;U8)VksN3nPDdevxep*Y>U&#b*z6 zMi?Cfjloms7JUY1@KY1zVx|I7@pKV64BKp>_mmr*I_Nltl0Pgf_*vA{8RKLf%eCb= zz~gpQuQ8pv4^RUY1+0y=od>tQs`MTy^gP~U>HQe3ID$aNN!)kBv=ymvqNr%$8f?&D zkF}jd!2710pGDnR=3+4bBCdMR+I)Kw4KRu`PYvOMJEL3ey0ylMS4%!$mvqZR(};pk zV#Zn=QpSBjrO8v@XWN5>O3d2yQTsq2Xrc!f8J|G6EX%~Jg?89PigI(ffi zvom(!snV8VG~!uG^rK)$rjJi<`BeOiut<`I5S2m2S9TE&O#&1g1hTUS#ukl)t>LzQdNPamg`1m?#nSG+Wvl1bR@@)L>U4jpGy1zV5yb5*cXS$OU80gO(mMiSyi;{l6 zp~=ARBV9y^L)ZCrF^&&jK zDz}dAJLo)?Xgca8ORR zb4UYp)6qS~T$QdQRb$9k)7{c%Uq|Y{xNY#6o_0v^Geg0cPvX=F z)0mT}Lg*4SiKrB0@adm$@^jeQNwZh}E!G7kt2T1(=nL#62~5g0)5)bBqOW-D>7{xN zD-{J1{R?WVf9-Roi+Q~0F_p1MO5>`eWY@^grTAu!v;)EKP3H50l48XoX@`~2Ctvix zYd*Q}A>g+NaG|fzX#Ngnzhz2%Y}S5te*ST2loH~WhCbOZ;G9oh&2a5Xf?n8aR!Pw@(Tc(wqj! zL+5k^#?H0Y%Y=hJ7elw@U1Sy|MH3T>z_vBw!5_;vB@tV3LdD{{P#9W($iOzT#y&jwE@4z~G*^AAmTa6OXn2cxs_FB}^Y7NTcciF(S)J<*w>sA^4)FwGwt0u2@ ze{#mpG{HVZt9>m|f=@ji5?>X+R@s3hX4G;GlN-{hS~2@&kH1N{p{BIJYUr|ROSY3S z&YovAmc?ZHEU^7}&WdLGB<5{>%Zm;0rb+C>g5~S#JC{cQU6f8RW9em1R)YFx7i%q1 zP?h=m=tMby_O0uX&0$d#RYP~vLlHL3)~hwRY&&?ke$uEGaf2AQCQ|_5dmLNU!2m<1 zCs!>telk@%x7gr>#_IE{bD#$eHQ=taRV zM%ZU@^xi`ByNd81S-fZikrGzJ*e%4F;B2``o6m0FdK#qWu1i$*T@GPT9{bq80~l^) z?0v$ldUiFs6j_kr7bzkTGJKHbsqC#8aW!EX%SwSg9s%AuQ{<7d(EqS;zQ6tmhn0SR zxc>Bze=^@@>JnJ)(7063CuMP`yx(t-7^u>@U{Sjvt>V+E$Mz+yGJbaTSyHrs4=938 zCJlkdNbCUlHu86IWD#51wUNFR>bCY~RyKPFLtcE4?X+l111#g|OIswFd5B(*XyDM@ zmMKShDcAZ{Zi?#TS%oERJVkosSac-Yvlh+VJ*QY6clN4ULs^()`&=Ibm24!?!A zUG;4x)xM6isO*z#iL4dzr}Jx{fGbVCB9vlwj;-2=#+$R7`TE=q>_lc6s<~NnJ0ak1 zpvX!G!a|Yb>NY;tbZx^r=FJLQU|FQ@KiV##UA-tq)>L%M%@ix!5fz=}K%X)J~XtUY4gZ>HGHtZ9=&)N7*vxX9gAWZ)-dse<&RV=sMiR+Ms zS7)*Sf%|TW%hSKe_9oz-i$NCH%OesreQ-gX^VWcHOTp*^jhVtcydTJo`!25sYnCX# zX2(y9NttZcqY*u1DlZ3WLC*a>Accj$daGG!eF3dvMWZdKPRP+fe8Qzg{`z7bc?GgiDt{a&WOe=XB) z;uK*e72H8!KzjVlLYyz_%%im0f|Vh;s>ncqMx;^5aU-z4N7hFBg?_8TLjA_<-xa^O!)93= zj-^&I*uHNS*L^fIzXRHLLcwG$pkJ(B`|Ak5!Y$;f<7jL!srYNp@1I(gv1m{mO}?JM z_;@mSQ;&FWiou)`Qg?ZwLbPBCS*lK?*-pdENy+>It7tekZWN6MTkr0ZSxS(d6mSw` z!?1nKtqmY6ch(aHcJ5HhKI%9nOtf>$q8$y8v0o*vYe)Le6hhVX@bwo`9lE z_y$vEZzYok3#%bIbqSt;e)aF8F-cO}H-5CAR^fx#{>e!KBfO=ogsI~ZlkRntqG#hZ zjQQV{8tXRVk4s-WPp;m%ZGY1B+VN<8v}>ga<~y2e{t=4Psek}(HlXA zH`BGc<^18Wi+pV)=2_+H^qDrD47M;1Ana-x%1`*94=RF>792ZQ2Y=0}YgHzTjPURY z;$k;K?r3)aA<5~Zh?>LT_udDRD6L_Ut{o>*?^Dt$<353HrsZ~EzUnOoD2vXd`d!=0 zo7?1Vq08uiL1u;z?4e=qfPN$DI4#*uF_A!_RNBX)9G9zh7WLa)a|-sT*HEzDkg|7# zN*H16&!j*d1$gHDvar3eM&aD@YTj=w{CtB2&t9B~KjIP|1+L*#$i*hJfJTMg7pVpr zFbksVtXYXi`mevECs@?OIoaY44(Aee`8}R(k4}j=75b*M2Hcqx;@= zbrJyaFG=o5*aryvD!V~zj&Cc&K@3eAZEl1qe~#DNJ3PbC&csPRLbm3v11hw7bq1>J8wIVdxqDv=&VkA8a$0Dp`gPYbj)wzt-Gubr=;U^Mok@Y-(-RPf`X*G=Lv{J)t`+lqeOp zcVYw#tFP_Qqj-607kaQ!l~fxO0g4)EAz(f{0R>X%6P2qrjopQO)aOyz;iT&`@XDhr zu}g$!qCb>FY@?vJ8?G1{S&}IM4H|Zvs!- zF8GTtF#=_%?S5ZYk^CjF+6x-<7AJQBqnpU0Lr2V~y-W^R90%OMm;c?s!WZ zf(ZL#_7f8bVGa}7sk3bkB`HuqEXzilP1aqRT85X3+PrH6G<%n>#}u%fB}S8fT52q(eHo94FK#BA#)_rGKGs~i0x-W3M!wBr z)9(&6uRee0Npduw4Tx*3-OSj@$oa~WI&HBI5SQXhRA$#s{@JH_F0FH*^r-grMemroF88HCOirf{Q8 zTM>>Gpa+x#&CBy=|kx=1X`Uv$GF1D#z^wY7nylM}MEItZH!3u_MS{%Vwo3D*%Tp)e_Y8m)N((g5YytZix==|L`4z&Q9$} zgB+)S(J~6G7wpK~)^Q2w7a=p24i{)de2#B=yxD*BugV^DvJ;BeVKy~|d;B%2-jF;M z^#RfeFOR8I_wVt>X*ur1xM}HtW6v0@gL=jM^mT-fo;wB=UB`dy!fIpK$}Tsd zGn1Wv?D2kumc^Ol9TIc513Y%1s9bUko)3*@hllhR9RixHX}OpTbk(GC?_~1vG9*#D zAvlSvM%RCZ2ieykYu7IrAiW|&X}r-d%v~h7`R85b(#in~Un;OBaFh*K`z2+i3J+6{ zf_3jxtt@1pX_a)X{b=%ARdOV|{^I%y2~}A;I1;dtKgctDq&K-M`YTm1s#T>c95&Uf z+iFo8|@9M?i8?jR;HiuO-lHU$gop9H3E%ut8MsLh5a zdcfF%+})L=<~R)~Txe!r-~S!0e%@^9XKgt5ba+*M8z%jc{$uFE{+@DqSc#)eH~z@X zH)d@I8v5M6r8+m{NF)x28~>O&F_>TikhBj1ZZl-61d}Jek=QHjz{R)Xu= zA%96U@H06;F2&$@v#)R4H|F=F$|B>@vm+%$(WyYWRNFSZ6SUO1L)cJscyAE8Ok||z zox}aLnds9(k_E9#c=HncA*RRFNV?4gGw%kX{&=WNsFufPvW8#pP9Q+QU8w?KzSp|D?v$RW9OjBBqaWvdQAmb z?2E8^%S#me<1>zT>Tf@~E5Vf}&-}P;VcjW@lqy^i5>nK}x%=VNzYp|+l@{A&qXyV4 z<0F`cacjR$(*r_g z!(o&g9T}$dK7oC|qu0ZoH*79atW^_8QZFSaYb>ZUKa)FLf)A$TnZ_Sx11jg+t0;V0 zXeq^9pV@SPEC{HajmelH%+0S2FN@>mE1aUv#1be4%cB($c4~qTK7V&QHyzT+Eug}` z5H}w*aB>(H9HK*a9Qa}NC5)7zc*e>!AbC;{p}k$6JX-~q2d=;*C%z5D1oTYxqu=^wU#rIAGc{;>@=53pX|s#XW1aYeC!dV4!+ojg z9fbF2o#A;TJ!8#g!>jGB>$iutCd*cV`IfrQm)zvzJdX+uKL#WzuBld;tlBg@QeD;f zZl9rOBnS*bfO<(eDOlaRe}^X!>fevH_^tWGD?wul4@f_h08Lb6-%#o+-#2kCNU0Oq zwV5|Q78|P7l%&bXf7xsUs$y=Ei57>P*=@9?@9M7Nnu_FTvvOefI8ObrlTz@{+WfRj$IjTAbt+W)qy;i)_Pd)jWdZ1iKy=NojRG? zt0!3=VU1=pkL@d_q-wL$Q29adHN~`4K{=;qkQ6)fEc_$Efoiv(#huODTzdF2By=Bq zSNEma679O>|Haf-M@990Z_fO#(|cY!b3oNdt$%Tkk)K& zl_Kluy)rNjHBh2CNDUCVvp7$iHq}IOc!a@mRI}BgODe{nT&-7dpD~+N)>(ElDSS=+ zL9dPR`#WMcd!2}Cx@xo{cZH(^+3bC(A%U#7_6EvJ%>j`PErkujd*z1n%Ig?*!;<(^ zlusj4c_n~|FNTl57-&}Jj(s_F;5yXWy7n<*HTqzpKCLQxFwuV5_52mtj>AhHXvs32 zQ`(Fc@qQ;?GixM~>QlTXfZP}UEa=kG9M~Q5@9ud-zJIc;#ZNHUNsf#4??HNOvD>vkBOH z<#X)u&gXdJ+E{Jlt_N58=bL}q9v<2TOD?h|ed{-XkEBlJwil(DyUaReOmdx#=j!?V zTi!I>NT=vO`76{C{XGxs0S?DlM=MX#yyFCE4ul}%CGZ@xRNf@uVFSDB#o#zR>4{aO z@`}snP_;Gn=Or6kJ49)`M62h*IHUV*HwCw008xzB3ci z5gC7kleGK%nno&4hyHh)CsTLOk3_8?T;%MS>IJiZwEhK|*-BXz!Sm0lsYG|`=(=wmf1Jeb_t{GtreGTt4%=O?qH zUJiJ&2CnTQO1&4s!hWq${OXMrjqV-#L$_x1&fNt!|aw)yIRe9FGBeS~+uG#Cq+y%qhX7 zf&?Z?6P(vG@HbC-ehr})Jpv-l;Haph?T zERmn6sGqEf%-3fv?SP$?Nb&kC2sj*r%IeXo5d)?pfk8L_Z1K*{Hnn=#eys$-SCt8T0_ZYe@qE45+Q7reJy!uqjKc;%(-TaZAiHiIjPf ziG2F@r5^VdMo1a&N`}0{p4;9VC1o705l+-5CDv~&w#mt~A6Zu!p5MWw%=y(6?O+S9 zTf_<(dX=xX0OaOVVldnoE(Ai^M8S-LF~QQZ^>86yrSSY0L4S|lMM=KKxdTy z&T9a}ux(J?V(sG+H=13+X}L&BN%Z>R1ce4`@I^YHqiOicVRV%ap$2)RUHv5tKPWsRIEaWJPu+z-;Q zdu^5dhq4P_RDAucZVpKHgXX}y4wwHAV~@}Ri`W-He6DTt4_wlK5(D4E+}Fe|Hgy*s zOI{-OlEvshD;hd+6VBBiWU$Wbs(;4oYII!!OI#W*1@+y5gCc;Vl6R1rrH#`9IQV)* zVBq&05i2bLqS(LgtP%pp3D76A^>5XQ-R#P*+C&)RpO05p1opqiM6?)y zot2!z(w5#9{tQ#+k*0VOBRa8%@6RaTx6`|OsbcgbG;AffebGNiDhEuPZxr@vvhqjb z;^nMw!ARuJCMg&G6kxvs(HN{8XMDTMLbHuKITH=9dCzOQi+IRY`RiuKx||P)Drt4_+3DXLE3a7jrhf)t$>@kUspE*hvLtaiZ#- z`@@5$=a{4SY3|WPt)Y3HgY)6)jp>r5)xb)!2aQyxPr9J-$KgL56-#D$#WN9sJs}_l zF#Zxl6N)-Y6ph7k;GOaEtxKD?M(ghGZtkENi`nKc@-LB5b+WtT2Pm}x%7%xY7p3cN5zm}A9*!iR0kz9Et5*@j`2 zdj}`isbRgnEbTU{0MeoSvNPZLUM!LOv->j7chL31@35E=ZYl9|CX=-IEGqlg*n8^o z`X0_+^RtUR6)#h5OBz=gB^PA;6bV3;L}ix}uv1=7_L-?d_l*oa4u#0y8Xe^plh>Qq z>r<&2zSE!W_RFCThdFr?{{8O+Z2>vl7cO=T+AVs%@4PvnLLeTe@!mEUEGuYnF-uO$ zI4Tf;#?vQZsFMoRKF;J&74;RRyi6+Nk0M6CW;6VrkCFnnvH_=I&67I#a}$dSHa0%j zFI<%UW!Yb6edL6;W-q_9udW51%l0B@-y&gekiN(H%CE}Q6(f)Avh5KyKaY^zBnFUq za}E3}NIk8ty1YC>8F3pN67EABX=jk8)f|NV^C+Rf)~BF$JNe#p>$T0wz&uX0&O(g5 z1@M?z1D=;JtcQ(%KS?!YG#_xdrN;*eq&_Y|M;pJbjQWVND@rEa3}IHP0{U(FNUjH+ z@0+af>r%GMfKN}86;!{t{SFHfI1)!uLwtM|mVM!w<#mfxa;Wg)ExC~3^Jwcp^^U{q z_JN>Y;}H_9rQ){~iSiO4^_B}s;A)F5fFs$=+rHV9R0PRs*1-28n87_S8=p>VJTB|_ z>lv4bB)R`cfR?5OYFv(z@IE}~3-NiL+B+O7(7z=Y6x5&NXQkTaG#DN)T<*Blm6R@w ze_4B8-{rxiW+lwNBi0`mh`Yz9RosEs3{~N(Q zr6-CIVuy$wiv{R`-E7LO-KXI)DkJyv$*B8nl*JD#mb%UNz7y>~7pKoF^k@Fb&a9-7 zk04u>E}jVk_9hj6C(>~#O7e)y z$hQ}ZgKrU6kUU~SW97hWZc|$YVM*8icpgaVf8uTAe?DoqL_H_>{#D=fIpS`@*QpHu zR(hR}RZi(_5m(v^F4FP6!z@98sa+zHnK`iUbY*T(P1|tyFXrU$W!}2dbu-GdSaFTyv(KEL@ExD7 zP99r2($Q#z+#WH4uBC44%BXO4pCLFf<9N67MgGt?v*gDhoA5dn=9Z=iQ8%Te1?=f3 zzGjurZreisWVmu5m02C-|Fvz%bwP@wXuE&J-SSK;k!E1y@x2~w|H$Bc*Nug~wJ zq`9RP6`!Gm+{SF^wK~5@C>YuNUbwQggtueUGO~&oKt1!SKA(G@t=bk-nTKi+#UfJc z@ON&bPin&USAvz$%Cv!c)p+a)%^ny(#;%N+HJ=Gmm{v0hECt7iD;B(mKT3ALb!y=J zLiL(&_3Ne)SfrAuh$b&|-;jaE0(VwbQ9g@B<27`ywo_Ivpt|^pQnKg^Qd`{%v;ZgU z`vXbd;$T|h=<&rVC0}1=#(eo;nT0mOnmW(3(;em8)k*oGl*Vwf?3Y!w@0&visrh&F7JJ?ykI zwv{a1bYlNH^#a7tZ)Lr|#>fsoeJ!?cY`dD+WuuDzZ%Q0$;95b3DhqZ_$D5vk{=!a^ z1Aulj6QlF8IxYZb8fc&hSKFdr>qhOYYItyn9H6Yc-0R(!z22(&Ii868Y2m>nff^Qi z$U$KB8J;$YaH%hopmtXE>k0lPLjZcez}O)(sjz(S1x9$EQDLoJaKw{h>eYJWZ3xy) zBaJQPNP~61#jKlJS&&i9ZQJYiKrBubq z71}xAf$WWEJY~VRfCFo>BnE1;z8DkC! zI9c`#b*ntAq!V}U%_)7JK9E5zK_@PuZD%7NqPdUxuoyb?SZvS#O*=Z5f7MSU9`e~P zBigPM++erPP!MP?PJntkI+ia;PGGJKLO**+ti#r_^fqg^q3M*mER zf77ore{`qp7pdYRj%RB}ST<+f_|#4Z5iqP=p${kocKNkO5H-{&nh56xUjm@u$AicA zJ&(^(8(pxk291_Q0#p#X#VBO_i+RvqXx1Q&B%GO0cjX}}x_}-SRT&30tsE3suwC?r&N!Ar6E70u_w2@qz)6EZ%RD-|I(ZKy z!qg7}F8tiTf5fG_eREqts`zlk)n-9C#%#*r=~vpR05O9jX}r@PAljk4-)a{Utm6e@ zsclY^;l=Kf)OIhN{lDq9&U-n4ry42Wgtu|^;l0(-e4}qiH|;-22At)yp@3_7&=(X% zArdP|WXd^we-wtL*Zh5acZZv2h!zaH(Yg=tjS`I6Xj;hLm=qa|S^!%^bmwf}gdfHs zOIrrRMN1P!$!_qu4N!Knuhq5}&<+RG^3ce-FW}fa)r2Jwx;)GaGwEl)G*DKIv%e5r ztyu8iUw@Fr3d`fK_ZVB8SJP5P7avs(ZeZj5jegAm(AB7MgTR8sCW1fA8E+T{8g(W5l%I3a zj^@NaW#a9KNqTsV9rU|RPPQj>Lj}iKkD3WFQT7b=WmX23g=Q2zv6oUG4wj+^xZZo% zROeaPP!K~rLSAI}tQiNt(5ZXZrs*It2{;J`S$mLNfw6K6Nk<=$M=oAu>r&FRo9!9E zOFfs}TiwPEn8=l)5W1uspAtrr4&vX{kKY>kBxJWXOJHTpNDV!hH;xbASJaDJI0*g@ z>yo07v5W##Irx*&jI=bTcXc9g9a{eQBV zG#I68lZ3^+;qUR*m3SkZarb=DFchOh4Y&%ZVFBJF&`)u;98M*3j226wOnLs~D*v_4 zpAJ4fU@!K3o(W)ta0(^0KwG3O}M=ZU$U>&bn-q*LHhFV-Nwt>!6(yAK z_{BiZ(4gQTfp?Q&CpNAZbzUC8vgdtNuz_gaOd_XR@qcQE^aN)x6aGsZ=R4mN0}^j} zTBhvn{fd#KmxhFYE$~?s1hZjc7Q!A|9`CjbY#4+SPX{Xbp$5AE4yw}$0a@m8vRtdG zHS*kvRP;X{gbwqH&OFgor>ojV5`pm8j`kbMLJI`5d~T8QyfVDZC$P!WGoghJXMES2 zzv2TFdZq4_K42XiUw!S>H?tA>>lxmD9pVxVwEfOtpY-%QXk&QpIKc6*M;JshwKZxK zCpnOch@+|vvKl1sA2r{+mZeyioTI7)c-#GBwX!2~L=j&QkuLNJYlYaS;gLN&eCwOSgT5c>;uIiRLRZ=QFO#uM;nXM4wjhTHyN# ztk=02-u-fh#t0I|<#U+^B_N&RbVgd{2Gl0^-QttR=mIJfzy)q+qy+2{tA6LqGn_(T zHeBSn>JCS}wWekh%e%t8_QIC?ala>#Q>#3|D~_TZVY9%-_mjx0L50iKa|1XMPwo51 zUccczub}vW6=u+gA{EU;;`VR!7p=5RPGWa~mm&xnOG;=@vV zy~$+Ya_+Q|?|n7Xcc%$RM(&bPt75n_ptbt44y}X@9W|LF<=iAD*Spqk&4%-$z(SSf ziyH6l(iU=rkRGLJq)EczHzD`5uwZA-aHBXsAS`yW285B}GUCL~pPFQ^jeK_Vc1~LP ztyzZ6Gsu$l3#fkVJ!VZ=ud{o=|S|8>WDIl7pRV~za<+?g z9C&-YK;yUMHQjQ&t(zJuZ<4c9`Lr$_o2`p2=p5Mn*C$3~L!m&$O;R4JT+wze@;ck~ zIe)L))|`E9rNw9>`j7=8^AM{Knp`*>jtKa399s)zo^5I6Hi8;dN%Cupm$qFX)8a5tCfqAmH-Nvw?HI!JLF) zXh>kSo8>kmm%nk?yT=DsrGOGq9Hn+WPq5Zw4Ztb}O@`7)*XB!reB3Su@NR3W`%h25 zx6qoZGzOV*cO0!WrW6ow)c#C^8P~vdJa7m)iRWrLSo}&r3jg2(8n{dg3K-0hdVmQmz0*6bYN1sP`d)+kJi34Dmn&c7f({Z2wtldS< zkC@EXoMc4njpVh|WBK%6NN+Oy$Ky8MN#qy0jQSC8yuJbh7=TkbEk1xp64KlI6ef^p ztCBVU60N#SdO*Nd7s!Us`*y~^7?&QHnra!SxCR_6ua-x8oR)1(+C|M}&q(=c5Uo7j zl^+P3g9P4fT~x3knfV*@IqawD{rZSg(IOCORr0qqyO|!?zwqa3@C^hX&U0maMNN@A zk{~&Gts<0A17E2fkHxQ3g#3H5{p)pEur>QJsc5w=w-hU-S$^58t$e~wCtvJ`{%wJb z`A!$X|HlP@o*<`3|4TnM1`k?7`)_O>37qF`>-6JLoI1Q%AD+)CeF4eCCk(hi<*t08 z5Tey0NVS!9^8y^dgQ@o$&gz)?`KLdQuC}i46rfM|T!Q@iM*Z>aeZ!`fe1NspH50oy z{YkXIywh@SxIAY1a-#<8Zzx9y58xD{Sbsi~rk=T^`F47)gLXbCxWuhk4GU}{gW)f{ zz<~AH8|=SaRS_C7EnHFbR00EE@4iQe>G^4QhQ!cj(bd*cm||3Gsie z`B#k~KgiUsjIaLHXM9{BxUR~A`>?qL7L48x<_0CQ`MSY<4Uuw$!iaTGEBNxt$_g7@&FM6O^!MZo7U+I!ua%UTV>1O({cfu+Q39KsG1@3hbM@4bb8b z&e>ug)l^EB8GRmsvoF9bY? z$p;#JlhDMcI1!YgWgU5G<=)v7IHVouj&*7IDCL%+J8iMCb z6ZTh%f3E&WcmWWY3zHf{Fb=RJkG?s`^;Kd zG%EAM56Fnvwi|!@x@xC+-0@x3KUuJ9+qEvbgWA=0FoJ)n5`flN4faJkF8AyaE$i>G zF@6-)#uH2BDeQScd;1Uh@ zc`vF?8|+j?kaI$ruT95IL26gM^ylpU1CS95rY{b`stCTwTovTEE;eQD|0S+uajcWC z(8@bkzL8ytql}a9@4L#Vy>c_L)wgM$^X_ntU@ejH3I&$HghWkd(ARl;s74MfVoU6; zqwD;N&dwWivQ=&QadCJ}8imly_f9`1?H5|fQgl0x?_xH?tdL4clnM;pI69xPOPR^f z4lqfjKS(<~mJXwa{BQbL^9i|;W(RA^#0l$@qOFWfe42lSX(v9zEU=j>lkN2?Do!p; zo8d007UA5PZOzHp7(hLlJbOj>!&6+MOmfe5{pKCbvr4x^UtI_P*yzyUK7K$cY*_Pg zQA~uKcA|2BKMYM+OD*u0s*C)_ES2IjhE}f(-Vr9r+pL3cQ7)N!ki)vmh-89+dsOnJBTPYv1Wdj`%+H%U-V` zf4)3XXQAjD1b!Cs58as>UdgrD+~#Ug0VdO(1c@gBHS4d@>y(SDV3foURyE?IIVH=R zvyQ}Yo+Ae%yLlDDhAtUlnFb~yskKg_8aQ82n9BStKGwO9ZfkzHPjYc#V5R?PU1{xG zZtn`XPkFRguuCKmyOJ28k{XZG?CUwOCT1x@VkM63_1@3RQMiP7GsrY30}uB$*thC9 zWOCw&spEUGXvvye*8eCa)-tCvYV@b`&8n%v{yV|-XPy6GXd_pNf>u!G-ad*;Aw=47 zuRL_CK(z*psKNh&U!H(0y@_0QX}>DPXuJf{1RK89)pyc zZG9xom<0ow4`2U|6SsbDmU?ctl|il!2%9&5_IH>kpqk)8YY4yGd$6)toW=SJH=3jW zrk;qS{gS{Q%I)1Jc@Y1?0)cOOy)tH0cBzf^9X-xHQLrS6h~9xU{|WtJdhb;BbBMT} zZrX> z@!y#96Uosz(9SaITy<~NqHxky8X{%ArxKG$>tDnRl~kwZ=>(Wf$dPc%IkYZozLBvc zB7@+IuvdzoU@+_UI6u*U1D4SbOG`{>?aS}fhh*@1_Us0WNauS7 z0>ApcK<{}ir4;X-t*#V(B z_xO+K84hfuH;`C;;wHqgYKv!ZACQ5eOEr*WTyM6|O-py(UO`|Cpj5)~v~LDcp+|Wg z{>h!s=pFub#Kat}{#z#X%8wUA=t5+@bc)i}Do!PNza3xqeyfGEJ9WSKZyIj8Tba-n zNKs>1>r+poysz8EAF)hh-9f=zEcr?>(T;JZYZSJQWpC?+4dT!<^oB;JU+OK>I_hEP zYxin70LEp{!$4OR5BO4{M9qXCXfstmxri!EXbm>7)dx^GI9b0Dyd3;*JMM zrlD)M_&7&{@z1A_m>AAsyl2>Nj+_Qt%83hVrc?RpBtV_t{*A=yqs4A{$erB<@em(pgU-UjZd}7;=UDG7&olk4e8~_E?AU>ejUe4rA5>tEQfnNzxuo&K~u zdGCj#fmK@huuN>;476(Z9Z(Kj6b~fS=k0UQJMum_$sfywGPG@^^Ke}NTkzwYGAQ)n z5jp^KH{Z%xq}7#k1KuOg?ACxx*6T z6bzMV17**+Uupn`tXiM`^c7~|8o;xd+}05gQE`;3RIJ~jy^6ESS?2!7WB!9XAl=4l zK-x$JilmAyXo;Fh9Wz0)Fes#XojYhLRNTyV-9ecmQBxi1D-!e#FRdehfdN?K1>Rao zdO(u$cjO?9h>CMqisoOf_5P0i4hI8ht#j%a*X3+{74CP9i2a z47@`Bw44QNzSMk#O+Gh`$3}Mm1QNrN&juTWB}AC!RH=ey`A*%zzf4#!SzOxTcYnIB zNf|-IqDqn8M4~103%gnejyA8_9r)8B=u68;O2w_P1Q-p{h=-3-J7+==0-|eIMzMsW z>=hR;&@a!HsQKka6(O24zvYr~2Wg;5QELg4zL}xx3QJIfczh5cE`)QV>4dr^<{Y?&76t9f&xCUDw<7>o?a1Hv6^X}D!s-NS(G zIR=z#bbvwDDYCkYx^V6l?~=&;crD>l3BPj&Zk+?9JD%62hmeZUox-AP*;81B6yxAa z0D^R6ui!m24q=jSE&TI{a{GcnJhkqbrvu&2VAw zAl_;uoeGEo+jN8AXBgM~jL zGUt3}s7UpU`#b(Bp}xER-efA`{Tmb#a+{c(1eD?gWOK+l0FYht{iFCZRt zqitS}5bJ0YT;OD7TU|5_NH?Vnbg2+}RQ;m-h2>>sGuAQ*mV>wVUlk_R%>HJYA!dT4 z;?d5=7BiT?2Tk|emHE$kZMA3sGbH1bG|gb%`zF=1@h;g$&veGJ`PQy$AH4Z_T^4vw zqUPVx4pYav+s}X6d$I$4u>~I4>h4>CDsE!Zw^{K=9i6hJzNN1!?}3`4ezS>(GEsj? zIopm+FJ;H*R}mQak$u+iygvY~*pUP1B@`^dx~6hTWkkk?X$onMD&6$HpdS!w*A#i;$F0e)lb)p;>A zQ`PMHxZqJdfFS*r;O^3JG9c@bDQbOl19!W5Wih&?g%+g5`twe=;Bm44&TknrAmHfG zuksgMC*i$W;GFzeAOrY>EMHra`#GsiUh5xR%2DIMM@E#}??2k4NU=4>3m*mt5Gwb! zaDta@S8tbn5Rn&|45aiYgUuRwSL!PwesWxC3I}a`wB%|FBDl-G9N(U{Z9T~NEK3mI zzLET>f_l%79LgEXV!h7(fJ75eH>;E27PM3gw__E=p945c*>9B|vAxC=414`;0G95B z&1U|XfWch-!yq%eQ0vKEuaVzj9*15PlLRvh3!O_3Qqe21!b1P-v65~4=6$(c6?OTC z-8BItk1HNZkJTHKcIM}Q-l+jq0GEdf=gr|gc>G+pLm5rgbjp7^6QyZSe(L`x`r#}L z&29R&H&1i7my3ffr)KCb7^xSimv~Bvhm=4A(wahv@0nT3=x_F4e?Qi^ce;P|h?$Fc z;;EU^hc>CpV~}L{Ffdd5u6jJ5{YY3cKQT_WZL_o3gH;jenAdn+14jeMDqcXmAeoyu zpKzm@qcC!JTYodD|GLn}`A+*?1N^d`^Ae}*VSB>Y`|lRsfsly+M;3D8MeT~mOCWSw zdDu@jgx(d&GM!vUs^wIPH(J(|<_3TI@8~^LthrT_equB;e%8wj@UJ5Bt!@{rO220lkEr*Y1N6k2~1A@hFk; z@M+?}VUCptP7kd>Q38A_t`rrF_&p?{|+LZjPI~KI=6>XZgo?P zE_O-i`Am0i*V8@w#e-+5U~})y+M-9dA~ww;*Oo;Ipria#TgmeRmj^yK@&M}~jeimo z8*VVzqE8b`4MGT`d`_3@NZO&vJ{zXVY2X*@RrlrnpeF!*IM#eAe(tNYFnzxAs@=PO zTF@;n%ct-%9WlpD-NWaZv9r5PgN-WgdX7dap2HO=zToAJAXv4;T0_T+MeYC=WboI1<4qwN8sy91s0e(# z(xmy;^SUJ4KQhc&(l8x$!=N~kvJ&i80)I^VH z^E?(!9=YBDz$K#Tfnn0Rhc&;=`2}^{Qp@ELu^N@xhm(3-($TS?k)N}z86Xg)XViNNUE+;)INLEUt!5+iE)$<=WDO=3@|HT|<=j->f-KNIazuoIjj!#YoMLy9PkrBUTebLor37l&jUX59V#@wuJ;wjpS-Ul`h4O+o5K0p zWWPR7Zm3IM(e}O@yA?UPSXm14jb4*N2v4fLH#_$+uUNEPj_K`YGKMlf!$c;mH*%%F zKR9ZbvSL?aHLo1@T$0c9L%dfJTQ;Q=8p3-Iv?)5Bn zDvN8A_|2hrzEWrLbvAt;aihiVw1-C>=I${=aYE2)k9#+{Q&!`CE7JR6O6c&)09pd# zjxWNob#`PloY53{*jK=ihTYW4ZgMMvK4fnkA#ywY6tMS>clGiKgQT6?T1TF`J%z6m zUkp)vk@q*oFJfK-5j$tuJZ$2t-H!`#$kjAj`m~9PHQN?JnaGFR=zq)NkwWJU8Qno5 zFNG?`a>aUS)?M>ZMcZJ=5`zA0?`Dk8p5qGaQq9SYW_~f@Uy_kq&fRJMY;u$3Du#9} zkt~(Y6)>4+xpF&hn;3d$-PANuZ(RA@pG|4jK{t=?8PH23XVZKX(hE=&jl}G!qFd#C zyI4Nqb3{OBQY!c^zunNA;0l{c)^PW>2+)fH<-p{+q&xn8gc?BM5U8;<4qC0po$uas zVMQKt{U=BALbRBbaa!=nET+90_RqaPPP*CVi!mkwXpjBX#PnyVkEhkU0_RZ+xA*eQ z+&O_E0CTaxVgZrGSzA-{Y&cf{=_i}ADz2yBA^tKghV+qJ%faF**q<_+-_Y}^`mo`} z)%H$rTA3gkzVDVPT<7zHYJM8t5lhyZZCs+RRitmlZ(*fML-9tXfmi+^i z%s@j9o<3$_zxkPI+-==9wwQVS-u$H)b}Voe@VP4SfDD)e-^Lo|i=w|H-G8_|4zOj- z%}Sm6B}e~u-k^G8*-lvY_i62aI^Q^YnpBiGnN!sN+G2hyUtSPy`dZz$PlkVPxM%cc z1}or=zM>Dnln&+7o1dSLP@syU)3Z(iS-vKIF`+;JTij8C#Fn|`O>Xr8>%ygf4_WQ^ zZ+@VCVuLR%SY?K!2r`_5_FmgIci8PgmLG1kNFi6mSzy6Zht zEDD*|0Q3V!GfLhVGh)awU_!yptso!68z_x zInSZ}E5|O!Ao@LU-#^We1T+`8fhv3IkQz4HrZ*BYBR&L_sAt)dmCOC3Hrku<0>$r1 zd!orLFI#jUpAcS0(_b@9y~GU1X`~|OkC}BgKBPb0=EX(&I9Q<&gS6w#cegIaMWzp#J==AM0nmSJ>&JDU$-*CH8K;x7 z(J?b6+tStNGm`uK6<-l5sA{4keq|v?I%Q6)g}|B|T5#B|o@OX^v*(T2PM8}k?TN*R z93lYq&fu;AfIlE@tF2lGAp%^n<~WD4`gtXR=jDx;`txG(TqdQ)TBFlKQceP)tsWG1 zf;wdaKFfwzkPoR@*U4|+_Pw+S<$hoIp7_P5z-6(B>HYYX&<1wOwVrz>!)Ustrp{*o zFOScTKCJKuIv9gSRe=P-oZvY6~=W4Kz+Hq>}K#(WX0km9GCjz`irKd2G zLjjWC9rCZ?Orf#4FD7^2TVY1I-vVs49}%CS$MTAAgSx|4H$+By&$Lu26F(diIHZ84 z7|W^X!xSN_crkq5TttvMa>s5_Xyx49g~aV|&nrPulTqJEO@f5<>*7sp6Ibn*EWWVHpY!{u3gA`!(+w?}$S6h4MyXi))DJ_OB{GfQ>yUD| z2>5uZDy=}PN^)5LAe#l13Cmr@BX`hHGK1K4XRaIGC{^+5qj6hrO855mn5Ts(AL@Dq z?(Cx)&yJ(}JevFdwoEZ;pDl_#O}|fdDxXSVWFKPN&{70_`VAWJ(xtPZA7>eKu)@rl z6;uR0{5}m6A&7qKaMG37FAC!k!{%;UEy%-N6!|U;r|6nlS??h&+=Ts)L>~R}1PP z$3_}5Y#A_TFrBkH(AYuyUlWDn9zu5WT@2tiTYEI(#-Q1pT0wHDf6Ejs@Wz}iN0H7< z)CUC0qe6R}N8+{)0~5cv{Q^`!e84%r7#)z$#W8)8?NDH{Xi)jU8P}jL^U5e^9LEVH z?!eQ(HC;`Uwl;?Skg*1GQNsh21lCN>(^)F==FjIV7SI|vhrv+`D(x0>N3$#lP#6G` zcv@4!16kIQm@TsG2*tp!)a+**Ye-cWg(r^=tnsdT$a^wksQ*=_?HoMYc4XNwV47c~ zJE}2YD&PwYK>U9IOwrFhb9|~;1rCm)vh%3U1k{cS){hT@9obe9DsHEAl_o0P+KG{c zvTyL%>#^~H7Mp7n@_3TT36JO{Ky3iV5-9wn5%%Y;{fuZJ?}#Npa6@3S4Sb=Z$&M+8 z0n5roF^lW6v~P8*8E-f3_LKi0%S&FpSCu487}D=w0WVCuV|aZ0Eq>jD&@C;0;dqq_ zOeixjp?EVMC_^9VR#W0en!iqtBY`wbk{>QA%WA~3I@YK^rzqoiyj>(tKsMVP`4Rwj$x{3i4crH3wIOZDlFh8Z6NR4)H6=Zi8bq6ayJ5I@VulBMHNk{S zCnu49*?OZEf|`VpY572MRX}%1bUjdly$E7i0m@?u+*!qY^x86!>;kmwam)x};vpd+ z(u-m!&o4_5*w4gM_HuYmn}_D52=W8UE`g`r+R_Qspf~DV()tm<@ufMcWm$Ac9Uf2KL2~F>%-d7E;fbx_uwnLM-YfO zSyAqlwgT@g68->I)gSI1ivAx!i?Ukj=bz7U3h|56kzT7(i_R8rMz=98#T%5j&?E)I-X_m=5TlLLPF*?PQIE%m~&kfX{HE z64>wxIDh<^4)U%C;RC`W0#q@d*u~FXAPpn-R5b{j0Oq(4W;ro~n8nuc3sSV`wDuhU zqsxTM{;X9S z{nMxO{myZ#wh;J(CuR;I=*uSH_<@ zO`U!}q%zh?0BxwkG>gD4=i7KysIWHxJ?m+s1uX~e!U@B^0$r4Gd=E6;5gPH1Je&sm zNkT)$Pk-7s+09obBYwIR4KR!BpAdmpYn%RejQt&Dtpx9qGkaNmf zBi-FcbiD@s=yJ|YVExeHbs&N<)F(PQzh%#)F)~1r?_YscDd-2XxGZCF&&c4ZC>t{K zS-;$l-ZK?;esM_#Ix^8zRwd4erv|O`yNQ9~Tzj;@THf@3N1}^i$9~+S(0; zbShJ1YcCw%D4LPr%&_X-n`Z}-0m6@W3@gniw~Jdb<{*tn4;R1E1#JY?7`u&#sK-d> zln>}Hg~6@glalqY=`)1evJ$|VGHXE#`GyIiYrCwGW_ zxlQ)cYf;fkc$zJLa;2;0Bx4XA^?7H$gB}2&er>;b`iAg7fwdj*1Ry_eVnmfiy*jLn z9^C;9?85WPz$WDB#qakJZchqX!1x6Hyz^E*R-3kt6zw9<;cOjBfU=QdZ>dM8X@`AfzechGKro6==Fe8rYWwp)R%o$G9U!kuGxW9eXz42PTM>i$p(OFY?Sm zO;IR|Yn|0B-q0&6;=!cIR8UI!L|qv^hroWD!Ny;paxeVAT(KHYZ$pzODq6>6IYN>r z(lCmEBm3ScUF~T*gooBYeF+{nE*o1$cZ#UEQuw&g!-b$mRD)ah zR;UI2T%^u4cPIYq003dBG$H8Ko&dhw%<~iK6ZW#&bGCPDc7S##0NM@g`T?Z!lPy#A zbl^t2BMwO-6NJC_Y5Q__yUf=_lX?pW`FX$elddAf&)bc8o(SQ~QQe;BxK#`3IQoKl ze!FtG!|OTDM(yuRjwku3_W0$UdkM_i49BGe?(=2vJtk1uT~!CvJ(CG!;9y=!8pMBa zyPTjh1GcQy<9{NmYhQAHd1e4MQwOq;E}|WpQQ$&cKfGl&+3^4-(o%hZjn|HK)oaov z!5BnDA59%6 zg9jTZr-M-g+@!kr>0`Y(o$^CWfLY#&rAY?qJ1YzXDiasd1R%r*SKW>wMvxU_2#`T1 zRGvpHj75!$QFt4f8cBU7;*3gIfjWp zMp6SqHI3oI1j-Nq`%OgBm7^e{dq~huF=PrHt{puPLfj(Fp)&u0~ZWkGI)T*bBL*> zehh-Kdj#TR#2VN_wvvbhGi`F~;tUlt~(NE3qt`s%c1Ln9}kW7J_gW!nBw%J)pT*C}QTPO4 zsx)wCEhfK{xLg%a3{sAl?tL3yZnxmlc#}628EO@gytuuiRvbNBebmc(nskxzK?{;t z8Puz}o(m<(5bQ9qDnA1c?B8!X;_^AC%hch6sfVQ`FuHdG2pP(syIDIl8hk&l6>wO7 z3w{p-J}Ji=>Ai^D8ZM^w=6WP4!qqdUG{ zrqj>M#wKt68+47ZLgt*2UfINJmBH3QKppv~`SqZna8@K!-KNB}YUrSk>XEc2c6SYD zV8fLikK|MC-#0ry8*8gz_1V3$go1eBJoheHe=M`wsmwY;$s8+=*{fnKsYfM7?QC=O zW;LEZy%R+$)j8dmra*J$nED~PO2<-qZ1-?kIs3{=%tYX)qz|R+AcSjxKPAe;wl;m# z$>dl61L-6YN+(b+^0;vVkG$onRaWDvW1?px7k(@qtYz@8>oSZpmg@<><9h-P^^JtN z%Uko7#nS-b3oRI0+Grkw`+@Ug7ljedYG0S5KYBxHf2Ks8w!vEPpL);5WEJm&;1I8Q z$&SY|;ovZ~kCvPCJy&~#l?nCFHiio&Bld46O)=VfT3N_SUY(~_D`;D59~Me z94%XTjud!}PFTkP$9iH8yvYylli)2&*@VLG%}hQR=7CK1B1+o6y!tb?2e|V+$0X3x z*7zcy0b4K(DO+g#-JL^(*F&@GCq05uL4Z^PbiAR<{!iZ(b}Y_HX(ErTz|f`Ckf`?$ zN0e!ok$kiENEb5v9E9S9tck zJ!3DD;Rm5p_RISTj86&XVHv=CI-bj&3KVDn@>*>vG7Axc6tVezQwcHXkgg5%^xv~! zC4z?i;9*5Vjv|z=emDf?Ba%5GM~MYA2f#M~URkexgd=GP0cDjUaGoOWpwz<}Eak>3 z(OA+(kb(ot7!;FOw|p)6YG~G_ZxU^buK2<%$jt^@IEOUjEjkgh0d0sdEK%-@i)xVpS_mA#G92!wZ3&P_+q1FIiX<{Fh+pxX%(J$8N%tWQcaH zFTy=Q$8%ws7DOCVz%+eroSPG&dZDU@Dh#kZ#s%U4ZQ@B2D1-NjVxRfR z5c$*5!iGyt^0k0`SrJbn!SKE-P%{vr=Yu*aD36G=5`kbqcJI%nLhkOom<%0QrwB!s z>f9ED*3v$SbweeQ!)qVuq!?UWqmQtNxCh-KS0MYVqpBc!&fs!8SQ6H{sEUAmW(_IPA74(*|4#Bjem3v z$Aj1MTJ3CBI>pX#2RYh2<{6&}m66+UDcw@M%=N|3rX(LBSS@?cGPj7Hw-_p6s9)sCEc|B5bj4H0sY}=KxL|S2Y^_ zHN>5$pnq_uZ4GlHCfWq5q&go|r*)sUk?M*S{|v$)jj5`+KNZPxj*B4%L_HUhQ5_5O z%NDz3i2KYkIIh7r&f{4^53QB{XI+^My|Lm*dyX==vwD<-(M2wss)#txv@jC}Z1-|Y zI^d%{L|hLj)zKHXthTueMV!Q5L$71WDk0w)G!%L@RLJ->I7FL4J4lws=>(Sw0Y4i) z1(2Vp&ZiOO(A#QR2Z8iezn#_}A8yS=p9ZPwwAsDXnOVu)1~zesmzf{e;~}}tnhk}F zfhittq{y`C!3Np6hVsOM2b>Nn_a8Xx6$I^G$vO(DZcdtu&A6j0l_h-S^dCKU7wJ2QsIWecMvMTcd+ z1izAUy!=Dw<>?~(B8p>*ov^?Pnlr{bM5q0DOLh2?NtxmX=pe7}xQJ}1qzw8COp~lD*H@MK{S39&EX7$&zKAoNo(q3tLhO&j(j)o++-i!fsKAe$HHdjDMQ{2P9VncvU;z zyF2bus9?gJW27UY;iY3*S5f8AqT}ImLle(%NEZ}n2%RH806RL|AG!JA4@QuI(v(+p|~F7Ov$n?jQ=p-Ezn&jM`2<4 zk?aDs##hgRKz>r?l8JJed3_8}(#j^`%}Wt^&YqsS30z!u1!sFd2v!t!*pr0^V|M}c=YjS zogyGxyJdrPM!d6FVQQ^kg(KI^Fn5d;TJZpxn^~>QeLoG!%&~{5*&aX@R9A%irKqO4 z1?o$ID>HR9xbgD_TF{YyWf!Q5Hb1YN-|9wo4(#(x5C8Gya5@xbd+z?~72C0zH~Z)m z>;rSeTj>jWdKxY;9njyUAIG{4Tc|_iYx{@wvX80+UlNg1_<&n8grhI?GoLiM{i=<4 zNh61}ET;C2yaY>SN}U*fKV^Sseqk=gu&TPfD$A*{+^*gf2qtgsk&LHA>&)n0NcnQS z_YS$nIiR4_-K1< zS=>|H+6W9k=d3u{>1<(&Ij&YOz7yClO{vbmqtE2ZP3ohk?}Xg2Vs%Z`p5*Dedsqo( zWztd}{DcQ*P~n_6GRi%NSR%c4>^&4uqOJoKr*?lM_4n-ZK_FhM z45U6P?OUf3S#}{?<1858{|N*nwu`AbT`XUFK||**t)knkl@2+iFJ$2EF=x zZ{x+iF1U&J6&^+pGFyf4A$;ZH&d5diJ)+nckVq^(YhXr2uWYJf-c3TW-OjtzE(gsO z5g;#Cp<5`Qsjjbq@$qB*n>!?um@PvrqN)uNu8$;GKD`eF?@j$HYOv2=U7+HUGgqpy zMLFvxOByIeuS-o{*0V5;+igOW>#ZZ%`amz*OdB4Oo+Zo)gSm7skg>$yk4QECHX0t| z`TRIQe`~3Ar-IOhRK6o)nPGM`X2108?=?^s<^8bFRk!cCcjH+P`8!JNg#6@9>T$aA0Ev|`Ja{bgjV#3~1*|fF49z)M zBYV%P9nL_sp7@p>ZhB^#pmZGI`k>uj7StG8+DnL<4i&0V-pFpB*8b#B<|GF+8OAS; zxEk3zBSksm0+@Skq@0O!jpa`D?4E>5w~kD4GG>I{g-h31(+2Ds&z?_veA&vg@Qx+0 zq!~qVu3kHas(6591`|k2PpmT46ND) zt|gsu@aNI7%wvR=xQ>k<>CS3`252+~AM*C9#jLcj*P->aq44;zI@AKtl}@7MBdh># r9DF$lAPq|X&bmBMssHPrPxiU==DfMuyjXuj;A3rWZ&r5F>-PTu$`r(>L0v8D_7gYxf7kA@t<^XqhcP49lTW3>aM{_2JZJtn6K=jz-!b`Bv%7uD+fs_eKCc& z36SWf*b$mEaX27F8tf?@u60+gCRqZMlRbQ&tv&ak`1FDuUP{n<8?S^DagVaoRYdf> za?gLRCrZMrjsu{@7Me*IvFe7rcRSw!PD0c>mLrkiEsd;;{CS-07;W9Lmu{rPPGEDq zlIV@z;ktP7nVtGr@_Zq&3^7*aECvYYT!v+;6=LxadYqh3Nfj_u2UP(iN z{PJyu7_0br=%?>md5u`uA}k)m{rq;TM|@MZ45P2#Mk|`$Y?ZmxBmP|&IF&HM0ILY4 z2)B;v0wq~2Nq655`?WjEf6#yMx9i|yh;4lCH2&LR0p7uN|0>!&A4O2T{F~``)B5`j z`DrQcKLBx>?H4e9tQAZ8iGG-uLYp1kKjk;RydFg(y%Kn! zdjLFiGWe9`#h6Md0(e=q0vW8Du0sfxe=!b6H^5>sH>L*sk> zxTi=fCBg~K0gs#o{+l`A@y{q$^NKNGnOi&pLHtN%9qUsKQH)6~;xEgS5e6%q>R=vO z@l@*nZiuJOYTyvEkwbO<%-&Poo2cv}M`o@2RoQmbQxuX}84;EgI#c-$YBnK9j`>Nw z#>&sAbO*n6Vbvt{?+PQZiXc%Q3?<=@4`0FAX_KGktQisUAv}Fk=*Fw{%mhTRNb#NN zed3XG&h2nU&V7cB6VLuA`Gu9fZ#Rz)@*> zweo3XudHJzb+(?tzPU?ve!^09G?tTOi`9HE$oL8%g|vt9Z7AnAz(R8lZbJ6kjlaM~ zya##+R#sZS^{^#1{{426y=bZ#4rYsM|8>+dLE!*U%7sY=-^8GU=k4d=qzqTV=VR1z z+i$-R;T>Sk^%qE#LhWLDphB2Bb`Sb<-!Qrc7F|J8F6mUMzD^IQUHi0f;HBDRX5Cxx z%SSOwaX2}x8D(k=D*73QM8r2xeSx<^XY2O)^&{X#U8?W7xAV0&XLt+O+UDNh-*)5zX^s@iUaJ4#L!Cp| zL;6-k<1Gl~k#*d5NUXNZI<0lP2nV5Ci?t5czi*!_tI?|ivWw|_+bLcalK(V;p{FS| z4FM@Bmy@Y-LZHYqJ3?LVfax%9Oq92j7NBG>U1?t1RSkL>V_C~7{7L*ZbIECuSp!b6 z2@F$?^IJ$c!Ti%#y@RUw!sOX%xi=_f$E^YpO%MzR7ixiLz={7$lIvhb>{-eJ&md_< z6r;Xpl)lURL?YYVI;kiY49WVs+kyTh3||%4oUxOt!~JdXMAv5&r_vIYnjVe3>9nNV zgSj^zg(bu___gYC{!Sq~(?TrM-#%tJXRV7ojn17Xvh;Rd_vAsXk2<7SgiMkU&V^7BCr9Wu2mWxg<)^2WJ}48rOUWeFEf*AORBSYt0m1R%4rfsR~ZfC3I(R!yZoE{TfZX zE(K_hLYIMH$TEzHR43bg*T2V2h`*Z9?G;q+nk~9ohJaLC;3@Qar-0L*t7pI)A0{v< zUUzAT>MTDacdnX+=bb!_`6`zaB_iX_3G$8)LyiX6fx zp8cA;7^Z;u${p1OYCF6CxN;@^XKJ%>{j>-Z*3g!%zrD2sNz6#K^%G9HvhuOUBmE{2 zY>5nPNyq%ulq|!L7F&}qdX=z|(ZCdcrM7YP;?=!tKoi2hhrP3l%eG$YRc;2|?>CDT z>T0H^nXP0kW7)Y(zpns{H_>A-pWr36*l&ZiBff7HJFTuC?bAWRv(TdOefACP6ynn} z4RU$(zP?Rl&ZS^qW$s%qw3@{6Xi!JT6n!`+uMQHdWu#wDRe8ua`MLo0AtR$|v@(i{ zX6Sk4jwmtc-0@D%;({{EF~t#3X$#M4U0Dy%vtTrI`n|~YZ+CM7myzu`SDb zgdCPwsFw?%1F+#N(H~JSGyeI{>L`SW962W6ax4C#V31S`en_=-=*SK=&mK@dM4*2bCr)-6-6Z9jNfJfZRj-zA@{Px{kO}kY= z0Xu%w5OYFtO6rw4!W8LEvWh+W&Yd`IFu{IJ-ksDbAS94AC2xy1Y(J1n^^Az%Y5t85 zA31{Z^e1CFi9YDzqNWAA)W?U$vvizBk_2OISd~#>t4txLu78Vbz=J9Q2sZeG~f;524}lhgjA`wCXOOE$c|e zTy(zqfr!F`&W`B*GbXDHb*?X;pMMveJ%ir&r(c=FU!by=Vlvev)3ES9)@^=H4!Tep zudVP&%c!aKBT z=w2SA>aD2iOt-)6y#^W=XQy}daN|O8Lrj9_aRI-KJ83<0SJc}GAw0_w|I=z}f^2iA zo4d3_%N&3Wc&+F5vY5ec`h>C{1R8b8-Rv0^V~TD?!TIBe=crEQO1|bg9W1ekQk79v zY1_A>QmC;BG=Cq_>D+FWW&R4$&2cbDRLdSu?cR{QeH**cJsaJQbRwzGcD$5Dsde4W z+15*-r^8dD=^e$4$-ZRYQ)PlXYq=2^IbX156mW((Yx7HJs3>@P49V{%~^joRA| zYEFjL(neB^pPtI1U+F~6_%A2Bufg1F^`SvE_;zIr_8qvl?V__*vU5Q<8@>3BNe$lp z&U*&gHh@A3Zu>EV^}o3&?Df{lQ}3VysVHoJYrIxPOMmTU z(w-lYP|;0?7g$IbSpzFI2Kd!v*=gjn1CdFB812J9c&~}QqMIw<49gnAGaWEZYA`^Jpj>)7Swai*Q;w;N++;2@|0>82Z8Uv2IMUYV-e8yg!GZCr z2H3q3hEa0dil}H9xQY_bJ499T1dzNf zwB28Wt5H(IYJk3F^xS;U$`lzw8nQB{nT$N95*r6NqEo*j7j%yODA~FZ7OrvN)<{*r zCa-7L?R4c2a&YC^8SQijc4Q9~%A&#Ug2V{w142(hPgSG&@J&sllB-2 z>JivIqJx34ay4qcxHm9xPH^!GaoQW-IazU{BgpILZyLZ%dI<9cYD!qINr=C!f14YW zk0K#Tk!ke-=;5ePEe4KO!V~hI?1EU#Tvc+yv zw$W_vMLx%h+!x~Y3@oACfHX3|_cJRCM@JAv0-ap0z;mDCTGV<3kt8McblA~TGXw?Q zJml#jw+Pr?a++t|DDJ1elZMk*5^b>0M3fM_GB#3I`r;g5h-KGuhD6z6yEyVK11S8S z@5a&V)nqZhxc<=zzuASTY0zotDGoLgyGK+<;uI*Q!+5n&4dTULt&Oj+xvNs&|g9#ya$dDCR-JK(#ft&%?5Cct0juyC;cA^!T- z`QN2mE3Vodj6FUTNghh$a>}OzZd?5#>Q6<=@>t>BzXKe=`d!m!=fZQ79&dMWz?WBj z!_00Z8@N8HHc&#fmGzBxMyJzcJd;@sHXHSEc;K{#-88qVB03!?ti#!&Nn40TeRWaw%sKuf*SA zR0f+EaW|Z-fAx004_;=y!ci@o{Gdq$DAN`)g1SM1C1X)wZ=%iS(?Wjd&yhdnxcsJlxO@AFN<(vLU$GC~ zaSzPVzgTaMgUrAGnjPF^!OxI`#s+jak#%R96NY|KW2!_Bj6&`PD1tpRD-K`|z6ms} z1NlB>^Ha5_v7eq8ff=>A*gaXahFi3?FCAn1p5`@P-yxj!!c1&Ezzby=E*gj5iJ(b?w0n< zZ~ps*$2M@s{%GKByGF7?rguf%WIsWQ#ol*e%2xsB=lYh7WW@$UC4mD;OPCdwu)Gn6 zNAvBJO8iVENGZo@jnv}mlAVFn7ZyOr@tlYBz2z;V{G2E42kwpeIvaX75Q+vI>67V# z17MgV9PtoPF{K%chTqO7rqLPL` zDQr;dE8j7QeHY3U(RUixp|S17|2Q)us6tF>5tBV?vP4bx>j$Z+`b$eY%T9ZB6CxKR zp0DpBngPMt1(^$Ca4Ob{QeW!NTbwBa5@EZC&Mx60yN0Byo9bzKMW&xr?ZwK4@nS~zbK{Tfk$|JU$JwM{6(|E;H08)KUxR%rLsP%)AZ2|AG9Zrl} zA+_~>GS-UuE)Uqypdzlgo?`=m+?P733!R9*I-pjq4+hC8i@RtgW0w=DWB6}(Tg@!n zR=sw69rfbdQ`jY(Wah#84!+j>_Hg`jupBSIR{cGp-gN4fo89BnD9dDmB1pU+&h?l6laGbe+^tXRvpVS6VeIwupz z$Bl`I`KL}F@3QZ7)G_Eo_qym-usi-N=1EA2^AjH*OWyQPzr*Ha?k+W1&;s{jF|x2Q zSpB@Tq^Ml!i2qvzC^anJ9@9GNJye5iw zem(;<3q7?}9dw6vNi^I7t&>++^cpo^ZJO1j1GP4B@w0qu?)%{wXg7Ybs|OV7laVuI zx3Mo{;l5y2DP^@n)bE$D#bjk41Tcz21bFXqzwv^K$;r+l!)ALL3zEVPtMj#4VnZvm zmjNmD&jo@_DKMsGR+FGy_NJfUadPjimMrK*sa1&o*&hMPbxu@s&fZ)d?0dzzffgLB zJPBxO6Hsa*h}0qcmB71XVXfJN!``u0lU_fdd!~DiP|UJRkkTp!{u(tBTP{FY<;R&= zKm~MoW&S4HSreJg&8jxvEl((#kfNo%>C!%}%`Y>jMWPfy6({G%mWQiB* z=xYkQdwI6G8J4tmcz{cV$^AYh)|QrWQ*aKNmLtor~OxkFp@Q@6NQK%Q(+*Wa=;Rq9610 z?dCc#mYjhk1q^qt_sX>{uj%Tz0NcZCW~Ak=t)@!V8g4h6HO2FZ4&zsIKzlAtB5%gb zNEdJ96FXNq!MBv(=q?iKOxc(m5D{t6X|vUN6RwE37KYoe3X4YOAv8Ww42lUpXu(Cq zs~>=>#`eEhHRM|hjsTrXF2y%INDHFMX(xQ}j4vQbDL)-_!O6(jS=Qfs#m{}Z!7NA( z_w0+6U|Lz}4X!fq5k5fkKciH8tI9R`bg_QxgUo#~tkodfk~C~Ke#cz;%K!%;AD5}N zAJ{D@EMTX5U(I@^_#*pYqn(W2cRa>T%6l*M&UGh)dn>5=ek{=e#8#h5-IzF9)sVN2 zOisHSBFv(FAhjudLG}kLZ&9%DA#jA-R4|W}+9g>^S5bPjnSy4Jo*M*VII(-TKghKo z++AcJ&|@9MeJ3(5{(&K}N4)9>be<_Gtx{@@%3-HC@k0`Z0nCGixi@SxLGkdNiJu}{ z>96}zN^9Xd?Nwcfv;K;hC)Cq|+_8;rV7Bo?3XjXvf^~$_SIMQj}lfw+B;M%2t zgQ~BBUow3#mwOtaSACvl)n7tDi^K)5;ya?Mf_Lh)U%N?;gv#PHU9_g@B!?ANj2gY> z^LLk+?HZCXm_)q<+M@rHf}0KWAk&Ri7E>%qji(R-ILu4@w;X~;C7ZP;F&TZOc}O*> z1iIq>b(F!V*HpBQ`zShoKLGL1uwszEq=>j2y?07e9BW|c z>qGntAMou0q6L(Fty0N+J#%rqFWK}DwRC(#=}}>6VKR;3(S(mAt>psft|e#Lv#!Ku zDcY>diI>ZS8(OxEhB<72z1r2MkBjQFV(h9+xY;8 zULg=U%bQeApl33(ktYbX{%nKYJ-0~3Yi{^8M!~PHv6c5l$0a5 zwI!Crid9w)(9l!pDesSdaC3KrgsFaaF44=Mr?2z=Gm+?5z987sMlA!83+W$N^HRLQ zX}rpcL)b8^fFAVLl$Pa{;>`6r^?{Q~FPFFz-YVQTHZuZ*Hf!}?I(U7FJPipSB#4-6 zoMqS_)#P_UbEs-!Sdjwwkjx|H3_*;U>unDH`LIq=pwANupfoLZ|3JOk)?i3{trvbc{41nD7a~zWB8H^@V6(ril6IkQ#Ed8B% zu(y$4^((zy{2sB&a`=$DrH#WdQfVf#kp-2eWE<5{bB%`}2ZEWSrNp$G&SG)BO_8~U zsjwQ4Ludeqt3n$e)gN$c7Qj{03oRn4`t&xOh5rB?+&vEJ}Ak5igf9IGfKr$g2K^sZNGN|`4aF}KF%3bIK z09R}3zv?`>2ZJKAnlZT|OV|V8L}j&r`ysi}{AHJXa&E5_)lc;cOMOxw$e^ye_3&7P zO%%Fq+~>9Zk(j!(2}0i7*7y<-NJ_(1KUOUsM%dqZ;fKy&#K%9K8^tp8f#9R7#@`Si z6$Fw)&j&4~Cl!zTzr_hV=)@zG3_S;Sd@%Fq`zmBN3{Zd6e1R<|5bwKG-0;J!--mxb zEi5g&mKf{9nIDz`Zur8AmVvm{hAc)e(4}QarhF$&rfiQNo)f^ipPLuox5$C7L`?(9B`g6E_#OYvR*+<y@zKCE@IxYjG8 z*<=Q1C!DDpzI!ZwS8e)ZdFq`hO07E0`Ar0Af**H5RAKz)S9IgWU_CMbT*adIuL=Q4 zB};=9MXkkB0W(dJ`fPSN6n|~}yciSzw=GzaI>Zwz(q+sgZyo3S@;qPg@BLsMLeebN zAsx-0x{n=PH+3J7p$pSdAA{2AWy0wtOKp$F+PN`^$C3g5#o!qZ%x?q~2l$#aS#Z&9 zU54(iDmx#$c{s^VR*nIM0YzS6PI-TXh*&#bf~k4S_BG}porD`*3z|~+SIsk=tSh7f z?zyz|5BOQ)t-9l^18VD*{K5Di0BUISU1eQCv&*x60sBuYd` zWyp+$0f`k*;5RSxEKZ{vhz}`TOxrAr&h8qyJdG%R*OWD;F){Z}&SxJiR?& zqUJ+H7>4ZXvZqB1J2S7FCE4KnepkT`ISq#Q3{_HdQo|Y`OIc9b!_}?r9OwNYtB*P+j=eUkGGs&R#Lr)!yC@2Wkl~ABj!|G z2*4%D=9w{3j`FFo;=Aju=o8xMS6{odJI5#pS`4u9nGl7S6KNkjj+JN347+MwN}|yzhw+v=q$; zQQ-N^~L0N_o;N2~ry zFM%bYU_8ulC4YBNNH5VBNr&Tupeog;U{-jYROLlm#bf{QVEg@JQEIzx#mD*Gs)zgM z!H+OcVu0{~)%JUT*4}HwMySc3*_w`l2GGFsi=2qRN{gIpOh(EySIleL65qXgp_}M9 z1XEp7)so6N3<|-&bA#}b-N<;Ukrw;q+v$)4RK@#4ZcEGpWzkV!Z4y-q{fM&p_aDRL`?h-h5M6|rp$)~? zDES5YmhOcl8|^J!PTU6EZsX23BrF!mTXKxAsq(M~X0YqDPrV_UtmqF6scTZs-hcMN z2P_;LQgWDQ?yfHBQX+ZmPSK-Fp2;p67Z7 z=Ra(Au+0GW`9QWbLy~*m@M+wQgKNklEwlV8huU`tB`62Ebhr7S+EB3OOY@%%*!azw zh~nJ`Mz=H%8U^d$y_JzQ0nVRi(PDR+4io48Sl?EaNM3Kan`eM3Q~hgTfF(oiL)7-^ z<5bDk5-t#^dvR@k`V+r~ulerM&%|<2s#ZGLD3QsAvQJ*$*~75ey;-u5}J9 z2Jk)597jbgo`B%-mDFradZ7Woo=INPBEHfV4xO&q2232tJo^z(x1420bN{W;N$9M6 z=gbQ70~l~AS;#||l`~-ousoQyH(v%?S)47xbf+l<)%Nx_(I~bZU-wySCKdp|g*X)e z6Wlw@k|zHW?E3^b;hb8sw18gp@1T?OSNgX}omeam7Ge2w2FrkXp93<(HuKdJ$eF|H zpMSsOIbmU3onSC~ta!&LnUbX^jysrww&B+s_Ha`}xPmOCcn^~rdc(wprk^_fo)iie z&({|}Y_>*59RQWtzqZyP)=aY<4Ya6ru!tde=@H!?MP-Oa@)f zq|LS7i(r?l|E+B%!f$!qF|$am2tRr&AN#r@M!&(ER3~D0DO)ik*Q=o~iYuPXk~xi@ z8t@AA;M_X1KA!iDVQ-^3+c6(h^-KGQ0=VQ@?|bwhS-4esAistnZ2NQsEq< z=bY%{l97z<&4re6Rp&3zGv&rWRg&6`Q+{g9&gGa*^ts=!$HN6-S6Y`@Vh+l@Zi?UqQM)!dk5~$1w?4zwU%K2JU}o?nqr7_vD2&^G2^e!QX@$Ql}C@9{I2+M>hJ~ z3*a+G>It6oZg`H|Ab1xtL4j2Owc-(vgwL;lFNB2SuHRq8nyPP0LNT78@CI9`Fd4f6 z!nh!S9F{1?Caxt2_p2+OpLU&UdsSB1)&YJ@OdQc1~ z|KJ^Hj7oR!?J~|Er5CPkLX6ZFBI3+!_e+JUd1A*WSwCETjFRnWe1-8CL9Dv=`yvf( zn;=!o^<;5r!mHg{npnlHK0Vh;*jk<+XY7Gxm7HDE?gWinWgu+0e1z5$=#hPRl8^Ygj=+KYto(2qF%p$EKN7%4FvDiZKYtkQ zagUbnaWS3aVbpHUO5WIShmMz`sW%c*aMks4AH*=pwtfg*)jyH$y`qhw zwE3w0Rd)DD0|NMZxkOnzv>#Vw6+2E^OVhT8ME#pGes#h^cru8(7=$|PaAS)aCBNew zJS|^yGp2qY7MTBCLlmYcD^zM-e0H_Jp zx6zs8-U#FZSzsrSH^?*FLCJ2Y{!os?!NwJT7NqC zWdo@SCXLOV{hd?>w^j0Ws&&LWjkqg35-|f{SHR>(EzWS{T!aOd^LtJ&rhx)F9LRct`wbH_DU{ zd0bR0hDcEu23z4I`{$4^07Bp{0mOdouGX6C+%6eMDMenYPxq4;YcP@Y&?NfDX zfyKW~x39GsVZ5573}EnmcLMhz3_`BM4n1eVpcg9IP0Mc_l;DjO^5iONepKPpu;h#&~j)Nk8Go?r=)+RvKbSYcil!a_W1R&>YLlIP&O_}Tt zb9>Z8W&$VKjyI@k4b1&)k)fJ>o0Q6UZP);SPCz<(BL*T&cRXI!rTJP9J#;I|W;9G4 zia+|NB>6ls{?zDtlcg)JZ;UtiM*{JkyhSrzkHkUxS&V**CsNZzjQ{2|fbh#(XI#aZ z{xnm~0^+jaAL;L>7MhluYW~&-;G$TVcUlq&_r0m+tp-lVcOTp2OmUyS=w(ttA5vFh z{NdWhE~mcMK;kWna&dvpi(`^BamJ4xH)Rnb(@cA0eg3&_UhOAkGP7*Ga`Ho{n9SDR5dNgeR%QgMF#bY8fzj4QzxYO zLae@(?@dP$hx6)n>M=i6uR*_qK|>xkU;YVBMJOS{|9mtDTG_`#L9+~IZ~olpAwRRi zFb1AZ_2?L>h-7iRG4eLwP_#hX>@*%pm$fe)iFWxJE@rTK)7r>``z+X5gN}AwA{TC* zWfxMNjjuQ|WV-LEHg^|TWM?wwolWKZ=ROiniF5M*SPQ?&|Bo)Ga;(Q2Hb~@MIyB$Z zSRerY#3Pig@d0BvX^S$(FXR({6v^QsS_8_Y+^S|03e-LGqrl^tPJ?l+BZwY1rxnWj zVbCVi)6Cwp7LeE(Rn^e%ttv?{WpS0NQYUc|)$I-z1_|K4DkvLxUn3i80H6|D@xOD= z@LI($L*e~%7%|9y$6+>8usIK=9+f*8Qd|L@-y4E|@qkuqe79VKEzWHQJX{|8hU1}W z+yJk=oBapM=3=81fYC4UJhduadU)~elNrB1A;Lcq^67H?Kiz0Dnj^*Pp6LF?AB%!p zH*EP2G(h?%f4Y?I19x2wTp8y`mf{=D!jS`tStkptS%8?k(9!Cnj$HXK#;X98=>eM? zY{LPK(|&HS%HRi2f3SxuUn3gA7eV=~51Uiw_>tY)>kty20-c^J3_t|k(yRS(Ure)k z`dV=ajlCH(wA^Mdx+L_LnJR31rDV7@xzN%)x9fB#X^Q(f3y&}7zo?3GldQKv$sA*_mEeGIcf8g9JNr_KQ6 zQd}ciO&yizIT?FHMY{Dt@FEAq_3LG;l4s%UrRaCx2=x5H!rlK7>~0ZroydA2!G+oi zTn=4GIi!x6KZJGP0m(##7&#UIwQ;T( zwE%geS#7pS?I(VyG-j*lv#yP%ng;3*op;NeoMJ1XDkBPQ4=td3Sy)^;u#b-TlH)pn zq$1!BbO4=^(`LdV3Z~_#&Z$DxChA$A4BCzbJ5Rp=)>{@qNPuy2vc*wdp#p0$ z2ZNPO=)RkoDjY}C@6KrILN5CbDt#fharHho&pdm)C>`-~gv_rO!{lJKze^*WwHg_g z5-|RdHnaym6mgckeQP;xun#((88-$N4;mg9?i?DN5Fey~d!tLn6#i5?oF=Z{vME3b zawu&I;2ygGvIGQrq32H{PZv=qCJx>NZ4Wr7@8j5mA#vvc{o?Yol$bTud*@{S*c3Alvg9OZ%J3Kmjy}%Ac->Y-dt& zNP!Vtwu`4HKX!*bRhD2cT1?iTlGNJYvogiFU^MfKT&bsY-uNv$nVFLcDTm=8zz!+k+< z5Rb^SOHcf1207KwGS~cETS?#7MmZEH-I zjU$-}0eLJ3Q97d-DMK74$Ox;BVgRTz3t2aCVMki*l-n=AUQLalQz5`7PHwl3k)lz; z0>J*m;<}79ui8~mG36jA7+p&vNQ)u7a?#`SsF}-{2on$FJ}IoH^P>_<)qU z>q!07?#WtDVKz)MPn>eP1n)X{ys{!pU)Oj(kHr$<+ZM)@5WiiS_tt!#(jNF}{=PDw z?zy4xsR_h%!Z+v?_f;`-S=*EnS6iB3tmL2Tu=+_!`A2|opSQ{>=#9fRG66DWQf}g} zQ-{NZVRGvvqu<8C>XPv^;o6b5Vb~!)Bkm#u8IsLJHyfB*@{n3^E--Ay(#?TByIHMS zYmHInXGa%*SdhVAhlrEjDRqK~wWEiD3~euPnaLJ8T3a7Y>3U@a5g7uD6T zE3v&-(Wa}MUBBX?@;0~aWJf0^NePJ%O*+Zh0a+-h4XiD<(`*X=9l zr1|CvN9F-ojIu0$%`6F0HwI!)c`;Z>eoMy9%C64T-AjPw+cm63M=d5b?|j_kDjX`{ znWJ7FnHyJLBztVRnd-aY>O?dRU8slGl@MveF*tGCER?Y_!|A8{t`oI*y@=k~AOnvr zC+5KVgm9TdzK`??3al$QpiTnZHfWIWz5agrHYq4-Y?hsS5`^Bj1Ocp^Zic@mb_@N}bxzrfcl^bYQ}VI>Eo|eBRm*w(8ptW-prI_EpLFd32;J5 zh5QQt3o~E5FA!mbLr=#X2&NTO$|MrkrhVq!(|&Ji>cMqR0JYc%VDgeDi*)W|6b z3+Q%>)2*$&VGr&5BFCsHjqX>YGz~woQ8O&)iP!7?R&8=nWz9D}&d9;ZNq6AK68^m} zwFted4d$6U7!*|{;J*LF@NwNB;B;g;+~jJsirTUkpqa4!pMUv?SdxnitDKHUlfs++70P2mpp63DGI`aVTjCm;L$S^GarPk4X#v)F z1R3$i8gmJ7#SUBysof6zBElRvifymy^x z)+DD?q=Man&ua`bw?)t1l(*UnVP=kZ1Ti{z*T2+XC^>J~ZNCqm0M{>GoScL3+t8mz zGVyeru`5Q&tapEeIf7m{hJOxp#I)*iV7h)uVZ-1J?K!64?gVRU-L04^PC(2Vg8}qw zq65}rB!6?@7!;7=W(5fc&(JzmQdJde+De}HqlBdvspiU@g>s6ox2a=V$EewqnmOZ| z$@4diqP%DVX0(q2ylA8889Ui2Cxs`ypLoxG03?WeBe|lN<@!Dy1##(>BsSyL_cr!O)@fRD3u_1?@jw;`-a`Le`XAXil ztCq3+Dm=V558thcvCJhvP_aY5Ypc!WNxHCPbIsn7WIjDJ6Ta?$uxOh^LWJJcg%k1x7_F^zx`)dVwOupFa{u5bwI3d1 zIx2=?@A$IIrY~#($@c@^r6rBG@NuwvpZ@o(`$B0wO6k#??QEiv9hN zzukg((4T7*j8I~fDP~iEiNA#^L%Y4t!tV-~E;hi&;m%Sf7TTmPd&a`(n} z-a;~LgGa%kcXig6Nh? zu(sAWuDh|^Y`l83vc0czM>@M7`(oqFRIt~U`Ci1Peb3>%rfsffix zgFKxp9?>*!5^D3HTtTwcl;Fw-)5A7e*APCIS)aQuW^E#_NEzt(W{4zeaLXr>an)#( zi^|NWY7UXL-c_nn)3KAg@K6$Re7QfVW7(@{Yp!GC-F%lo; z@24pE37Y)VXlZiDKYf=0&+5cwBAnJ=Ch6!(aTf$V!<7%Uj2)XySfBhun^mL_YH`{u zyz5Udpu3I{9NSu8I96)zd=CdDbiRbDetTzR9C=#Aal^RU6|4qb$tT|awe1ry&Yk%gYQ5?m12S)W1%+faMW)m7lZ2Ph*K;2q5%Cu0XKOPf zl00m<+{2!U_T4?>-<@l7fzd%CgOgn58+!rP{!N^KEb3+<^Szzc$hT`a^@fXJ?u@SE zZOzbT)a?|woQJ(?#*$Q7hvKnZCB+IV{ov*{wg7WtfFi9xBz$u|{Z=IA@ae6$UT*T-R>fc?+fayy3YH6wWd zBlpFwu1gb!s^K*+lHjdloiFqU8{ou@$GiJo8IE#}U#w^3w&)}-Jlvp@ToEK>Pqwrk ztk=v=a=@UEb-P(o$~%zdN5OK%(!E_~&HCR<&yTwaE0yc(SpLrqJ83uPe-te^h!-?Amu{fpR+g87nOqFlx@k!n^zKYWQJ~;Ws8uK_?MXpO$GE>5^%^m?n zk#uY-tYberGI$EnS77k7p+n<8h{L*xz{2@|FMzSE{fnxLRusB+OEF`>b2hiW{tl&r za8I^n>5UTIzx*eM?ED93K!^S3qXW{CXV1}E=}*5J{dyBf=t(fj1KoO55deC5FkbHj znakgl?eN@L`1g!q*)YyMjWOKYtHbn7skaLT1z0NYFWCY9+)dD^bZYCZS{TR@cp+sB z@bdWEf^9yI^YRUddw;us&_!<{d~=Dd0lt@(M*9LyTPIU)oE`P_Ht=}OSf}T~GBpIVf zrG&4$?y_EA_-^u7K67I&fPOGoXmvrvkl7{puK21bIX8LoWu4>m7iVvyTcOMdlEJKP zn$X(dTpkuN7^||}LZC6abxat208v?nS1Cj{j%xclk>2l`7l%IAQrovrLD?lGB|iG^uhMK=_0ZNw=JOW+6U*d^#TsqqKw81I|HkoID>xwc%;8l=K)z z-t|Z&uJOk6Kbo#FI(;5-wfDZKGfzwYY-R};=m)SemF^5NUGVofP_OR&Nu+EzOC0qyfQI=w`G7DISA5uw zQmD6HmO1Y2MtI#vSl|zOQRjkx<(_%C`NJ25cEGfnwt{oi?)!^m87d&kMsor*9wVMW zhy-$(2fnd2b}v4iC{U+}k#lrh)#b378jS6FPKBrAZN+LThW#7Z@etdlKDi1n5-^++ zSq8s7cp9u0H_rJ+COgS!DHd7IuW)g$!&0)z{qrDc`KaFYeCMfv z|BRjcoSS8$Dk^peTQn;`;C;S2`V>&vOrO_DNq8)X zW&wHRNuk(_>U~LLGzN!i|1)Gvq_zZYrVtMqFmhJxd1M_tNrQlVIr9k>?5%r@Qa5=t zOp~E;@D5gw5Vff2WoG zccQ1xef3A|?Kjv0H8nSo9Up1=#a72!-2ZVzrs~7T^-~F6*ODa0Z$wh2SJYN>1zR5O z<}VvZYxk~sOJwMjsjJ}bZWK&^8h7XSdt~bN)6>Bhcbl!$Ji#EX2df>1qj>v~XWoEs zIaF-y2mc5$8Z2dZ*r^CH@s}_?jopHyPW)Q3ZL9Kl7w&tTUKZ)b-p@J|_=!zkeU``% zR!Jm@1DV;ONFLq>s>Mf}n8ow`1ezf=7Y^ur4?+;YYJQIQjRSbLd{{C+m*BDHPUk#?U_k}++Nz-}AY;VMS(;;6o$x;$ zQ$CFTgF#x*=P6Y}iZXeZ@I|(nRPjZ~x+NDDSR`#U!3*iVB>B^khbWFWRdp&Mym6Y4 z@@e92Bsn$H&?=;5h_mO#j|-*tf^t6;I@s$)F&Lhw-Ksj@JN@boWO0?cT088Nnh~1- zwleG%qFOzW16WUV8tC}y=KfWV0rUW28k_}zds}p+pG@QM2FHe6KP7WR_}@%fUGdLb z;J{)N#q<4nCIr~+Z0XCN%yBo+fLKATGy+eQldZb3s|(&;o)C$qLX^(|XHEf)HpD!g z_g>C~k#-(u@WH+yq_(8S@}iG4-BKV89Q&&2Fkv3CG9*#xf7^nG5w(Ydlx?Du@=`ix zk|7zV@2<@TkT&1<@^!^dR84F8ccYR&F9gcc+!B!l4=UPO4Yk8XQzg;lY5w(s^mDVV zj7kf%I#C6Cn)n2t8^q7-GIkzW5`CVwL@|F``P{c?!qcnMY$4F-A7yqN;fH-h}R=7Pi!X$hWw}*R9WHvIM>x307zAK8cZ+ktf8V_&=y&nUvCo44>_#I^< zDzD}^oaVB(ix)LlwN76`1H`tjN{3c@>r(+PK^T;(LyQJz zg2h}0f9lX6OZuNizu~DvCp!W*d?dg1#xbJ(D8Cr6?vF3atL{+7&dc|n>GspZ0HU&T zOJ2FB1433@L>E%n5Myb^_K8ltH~@i9ZfKl(#Iy&q35 zu_z_5ay%vvg7Oc3vm_90$+{hJq>984hwoUF0TUv^`q3l=?-u11&; zaTm$U4x5o$=IfqJCf%PyF4L~ZqUx3fI}r9|6ldJPs+C!lf|W;YMiq%{wWj>p%P8G3Y~)4ED5Bd3 z-7t&mL)W<(HY)*3f*c{Z`-2ss{1Yc&F~c+Vrc#P-QxS@rb8nyu6vNP}r2Tg%!&4P- z4{A|6zpgmCV3g;*4V35w6>tV}$Y*t{8-&MYy7L+gafZ)B8G$CSTWPRdC>g%k`NqtT zsU~i5ua5l0*G+f3(CHKwu=HrJf9)Y$tI0ES(SAFwJU`e;33*#E^>wl}CdHhsiwjz% z25>&1OsM%D6qZ_lZrs7F1S12c@_PT=v9x2rX_MpENX~CC)u*EP)t>7RP$|NNi9r6E zor{C(4P8_L7iMB`+Se4uDK3=uT#P9T(iqkmYZE`eTmRq*KXY*bK|{Zc(^I@<1NnKk;@RJ}k3n`er(<;)Kk!=vcL~d3K9Q^E zFlj0~6n;0L4Vg#MYfeEcI8i?X+#_Tpf4h}$;(JmA2e)l}Md}A%J`m^p8@ZR3>3T8M zrL4m;c!t?|@}*sAu&24rPxQ46Y%0QAo!6~*p-LWVX=?rGHfZ2B{`2hT6jK*Y?bX-X z2dvzD2g4*}>e@R(xo%hdacHxfWo|B2uAhDvKRpmXupYiyOh^|T9u4>1fr0sG^yZ$5 zm<@WBsKWm9Pyzs!7Wi}A)b-=HO#YW*@7;K@$d?H06GME)%3M0ubH&4RXRKhD-?eMn zIytvn{LuvA(+l>qi&Zj9I5p2M(G_&WrZZ|C~=H``Ic<$ec5bVQF z-%kRGY{gVceiow0=X*DgLM1qLMoUpXuik&2+EH$4=Nz`x@rs9R?fed#n0=rc0nZAS z>R^|*&-#?{h29x;txbx0E%C^OIwtd`aYo&OmPst$bt6g}Jo?uMmTU#+j-b!Cc5-e- zr52Nr3_r}y_P+hKE0{9Yc6{%3t82d<+4W@YX^-9C6OPgzxC28a3uhG}T;DM3x?7l~ zgp;u@@bA=iVU$Fd+;VR2=^>#n+ptY9p}w5%@Ce1Mwo8BE2!%NO3k%A7o5nV$cbVN` zTmgd-qq1^l7MLeV!asBsaN6W|gpufK^_4H*`vQR*F%??ANko|{N8Mn*uAYPFVcE$= zA9gv~kX#1IIB#a`mn-+Tb9O2HY+qu0gult~my=rX&+Ev4KbUb~3J-n-PBMh!e1e^H zBow!iBQ&GVg)#Mj~u9c*O`0o zjhi-}!s6N;PYD)W_q1&JuuVnu-jn__!A;q%jBx+vcW$+>K2Rx49xQ1{QyO}1RJ|vF2zVR)Rr#z z^qQIa?6K3NDuN3)M$2R>Z@s7N zR@0|UvhgCAIqyKEACO06?{;Bjy1v9@o}{`->-PjBSn6mr!{J+5sbY9l`@O^g_x$}n zBTH>Sj?YJ&?t54bPe9d^;y3hCJZnbGa3xcUYy_ARPfvdW)p2`RwfNf|sgvljqc0Op zqs6VW2hK+rSFgCLOn=Q7pB`h}TEm6I*%6zZz;>$*WZx^MzhceI12=;(UPtqaw=LT* zOvGJRkn6hHwmE@G{CB72dU@xT>zvXV>nq>OqFr7P4PoVPCa-Y|kQH3#aDK_N&5C<( z25aG|fH#aus~`-CFJQl~gT5WB5EjjC%o6IG?xsn&dGx*Nv|!7U+qrwutJ!V$sfmQ} z^_*Q$Qp~ZLE6Wz*^!~PQ6}JX$3hd9U!ElvfAyvCg?R)3f;FSjzCgr|2exj|z{z@CK z;M!~5zJh9xFCSzfY1xMPV?&m+7ZF%b_b+uM?`rBhT@N)R?|ZaA>w<<4WFoLYPA+q< zj|7c@T^(l?I&k{W#oa$T zPjxyF_1vGH$h7iTDdykrGN#G%1_B)f3Z^#^Mv5Yh>N=SeIp8I`ZYVNwwLUwGX`3C^ zWh^Bb@`!36yU+tF8>p8ZA8$ensxNb~MD+DB^*ud1wlGi%ES{!_ynl=&hrmf1#-X3Y zt@D=Mb27Z%B=wfM--af;vqBat`|WOsz8-t}WkChTMlw|HVyB1lbM50+#lsjdfIFd- zuDu6Ow4lVSy@MeR4qXS5>Q%kgu^u#x%ou(UU#w@Jo>~3+<vX=Qq$Gn6vCm8PPdiO{AWIn%X$~i@ zZX9adDl`IfIg-J~XX#LC-;-=Iy42L9ap^oH0lte2oLQ=ltzAnYT~vCI7xZ&~%v0UX zM)J{DP0zUay3^es(x-g-H=!haZNCBI$n>%*ytUqY9yRlQoGWcuXeJVY-3{Oirl=>i zkc5T5Pl1z_GF$U+Y9^Zq3yx47vG{kk0`HiwC&3Rag(QV{^mOwinNq#9I|a%VKc~;{ zPn)jIw0uZ0;-MzaMmH`gsefIN`ZMiWPes-W`CL+W{rP0l(ML;E7~>K#Z0yAJX{ZYM z=(r!daAqAe83b1IwfqndRpldh$DpNso zKBJt1g(`T_qOFzNc%Dxperdmwmr=_bJvlfjjzvuEr{~jspyS28A@mt$jsnvV=vtEh zZbUIc+rcs_FxO!l>`q$0NPl6Ka?oeLF}8^_In_C4g(l+}R_uq5#xW^X+B#u~wCafYMB_dhhO1A2@pf; z70v|k_4*vAbEIAR5~y^s^~1d zYPW15|BqXDkL72_wuQ&I@;d#&A8z4TBb>EI0REF*9fv{Ui=l=XgpZE&FUQMKY`_vN zK9Y2f#awCWN>S;JeTe)vn1o$ukDSN6qSppXK1=Bdy`hsD_P_bETNWbF zzLTCWSE>vbm$0bm*CI!b1BNX$yK@eCAsPBV1BPh{N7EK$(2m&_91}Zm&zDG#Rsj+HC^{r=Vz zA}TvyT6&^1-+CCyMGv%Rmf38pd=o2Jo z;)?)laLuc5WiGN$BT4?Wy>lMD%gqA2oB%3xPY+msCH9H$eSyY?pJW=<&riNTCcFsO z*`rrDCEt3dAM6#A*f%_bY}+DH`Gre)02-Ct%5a*TfkF=YE$WRO&UUP-I|xCv{QUZL zTIUNYZZ_6HyJX@IEk=c_KGbfA!8k>^8vO;%V|n7GN&FUC+*ilj{PsE~KI}i6s*52M$Qdu|n_n{M^a z8m`3j8{<6X#!0>J(bxWqfnaop!aI`uvxxD%kdyb!Pjbk=_{;XiM(k!Q*GobSMo+YAgFnpP;z5X-w ziV{!s$Jh6o2H_555>rX7pj3g3w-F~l&E`!z zFg+1iVOCV9O@~s_2PJD&@UpQg980en62^5fXiYyocAdoZL9yX_l>C*NnMGLZ-TlR3 zK{xLqPl}+Q$PW>P{iwJEqhzd@3xU3DtB;14@QjXKo&oSwlV5yn`=HXkKR{YF3-%M; z`DOB4T0qfF|JN^fzC1piQ>)E{S{8pK&dVdmbxu(V(|csZc|lgWwfjN<^pg4D7_$FUuAp-9MdQ_z6%B&ifk>Ur3f!{&Lq=F z!EAj(#cfTz&;=AE5?!pHZp=!o1F_ZIA=-geKgY~YNbpPR0;7U=m8;32%9lz*{sCkT z0VM{n%t!Cd|2*__9-I+eXFUS4t-9p|+u|(B~l&>mwkP)?kH_)Z0X&_NanBiq6Kr0-x#0BPRth z5ocCsC6*I7f%cnwXF_Q*R9Q0fg4}YBU#Nq>_VY0lYa*hi+k0kX=;zc&^?XvquFMtf ze9^$1@O5xokR#z#j4ak6vtoLW}w8Uc7_?N_9y#K5wc=0!5 zF;G9oF;L|}3(8(Zw87#rXV|rn*=aEr^#2$3;aHjpw0Ay~|7|Peu&rMoFXBvjKSBkj zj_M(ZtNz_Bd`kDL=ls8(Qv{&G@JO%ln&srogZLRk!Q9hxwi#1=eG*!}(&Q=$hoeqx zK@?9su2^trI=6(T832WF8JT}aE^yT`X7d~DXBK;d;ivd4Q+E~Gb+J-i5mmWQe5%?> zlixj)qEM=xGLw#4ioH!lO{H`p{yg+JT`-Bs5d7Qbgr(XR$=KDlK{LhEXY9;Ey1D}s zM7MLKs4`Tk3*wec?W!tcwy!>i42Zp( z3y*nVhwby6buHTfbDi>p{Wae5;w@ zqrX!KvW>NdC~#Wwku^4M$`-ELX%7CcEI;U*bp)ol${0}=v7wC%-tJ1sC!FvkZn#(5 zEnnWGmh}IgQVRkUcX(xD5e6kI3?zl$*K7yVimZ9y{o;iO42{OyJ$%92ZO)D6>*q0S zY1*&AMlgnMf$CZ9{DT>-PQWbTso7WCO?NeT^}pjN&%m85fBofeh#BHOpn>&-EY6na z{C{2mPx~!l9ePA90qFF3=ozewphKd-SUWmw_WWsNbvjRZ@#s!k{qHT_ z5!VF1HwH~F{zetXSqGo&makH=1>~;6nbdu)K#XgLp@xYVFJJuaezL$~m5mbR^ye`C zr>E7$2OtX@*3)CHIs|w0EP=$dLs((<8BUoV zS@leNf?tZ<#3lUcu;BxjRbTejk^ZHQ6uQw+lIHzzPX6EQjbO)?bO}RhWT53!Y3xZo z1fuJDTo+S?u0nvn?=u9`59d6oIdeW#%N7b!>whMR#h={)+zx*Y2E5pS@^`$hV-L{g zrE>?5S0Gxw7w>3oBUF+6`I-4^&i3V`={;^OqSI2cRK!ES{5wM5hF={<@3ZT7X0dCH z!Kw}e9GBJR*C|?nwOTXz!&wLsV&YhT=v>EozkD1R{7Q+x&{vE{Gd!b3BjCB8O|aIjGqk2 z0(Rwb7;EB+X+e4&C{0Wg>-b(f@S}L>zeyfSP_JWGAdG34kCBbSW1SM0AYIDA{i)gO zNj-IoQKHpyLu-{98DG;?X6|k zBbHQh^HTl6iV0I;U zM(Tb}4$)uPbk8L;52$Ai+oF7L1$52OM$u;9gN<>AuzY-2N$E-A;CWmzLv}o13abtf zoJyZ-M`LSJ7iU|Ew0=xGYI838zH&DQD#GD3^9t`et+n>SQ4Al-{Y0>cGE3-w7dP%u zR^0>d=oBwaLj{xSxhDGl?dpi|*-zj-Ami??2XK3DNl)`#je1X|bVTK}q0t&bUMf4S z+GKZWh+LFHQ68KEH@IC)`Cqb1V?C>)zrX0N#C!h($v&BJ4SGOcco8h}fTVa3RU)8m zx4RuZ!L8kK9V2A6`mv?mrR{5Ok$`Zeb37-Q4$1^}%$Z^ejY8Oyx-Zfq3W`M)A`4zR zT+K??x~LcPZi9gmrmnLiU3Zp!@}pRgtP$&r>hh@$nvo8-0ZHOKvDO>uuVfPvsK<@+ zT8F+`5e-rdRSB*Egn593xrgLp3z*6>F6*X6oKTbcRx*w(#50Zi zXvK2V)O$10gBs$*z4w}F<9$+OHys$Co9WDMK^V^vitr4R{ zcQ!mPw?{c|AJNari7QdVj&xuuL;7jgE}mjE-Q)j$JCvc%04rabyaE*G&h`i~r0V9>uj98;CUAiHY zBo2O%crIHYF+%-Oc{D88rJZPlZiMApFf)E*?u_46qZdf{(e zpB+1X;>K}@{D^aAL4m2UasCAFRJq;u)$6}w5lJZ{HRsDfIC)sX)LAek{7tkYT91y@ z-`FsK#@$K60fW=#v2{zqgSxLvo~@4^@G&*0+=S&qg9a~U(0!X_blynBeVcS_I(Gi-g6P3yAo>F}`DzyR&h7CfpH zf41M-Ep1UnP@@;x4em#J-i&ll39>i|BAh^?HUD10vGW&UqJY=h$Mh|>-8yxa94i;s z$ixJ@s%px_)RfT`p<7Pcr`Lq zc7!iGC}fI(&^K!+F4(;d_BrF5Tx~8F)SbM1+#X(n@kq*vI6B+{yH0aB`0=bwz*zuVKqP3 zTxFfTxNeD(%kA?MA*1d)f8%Y53Ja?auhN=Kx%ZqAEXYcszH!@24sLZD?QiZ5NEL#O zaRcOy zw4pM6`T4S}=1S{0_c>?7x4h|F$Ip8fsWj3_t1$9s!5gG$LrFB$MJRcJN|z1CTC0%m z!+1bgv65LslKzg~*?J~^1n{q2fo>X;{pd(f+<&_C?RMzkFAxpX*wP-oANkbutDB#R zqrDK|`#=f0{Qs*UnK!!B2r=!^w@jBB{Hp zZfm9ZGvOub^7FM>%@x*Xx4A@x*7*M|^ClzkPLy%Hv)EL85!U|*1sYXoEEB6+6D@(bBmnS@Bd(eg20)4_E^wm`g3l)bTy<7` z==%+rz1aw;HI932Ed7@zRX0D%RAuKYO7R+yrm~7aav0pz@cfZ@-Wzg|?sC!Ml=IT$ z9c694`>Fb+gfgaM%x6MiHT{|=0}>cJND;v1`mk7Je0}O^@kZ$VT4cG+yZRuqp8r@< z{((wr{^g#uOm@OL1p=!)B(c7?yXO0L+TfAn^AJGl=&9`>lbAs@Lb*Uv2 zn(n%GQ`zjGr4QSvtGagEdV9xg&A1ZZA-!NpJ#{(M`~CH_q^PRG1G|zf&c70STh#mS1Qi zkIZ%ih!HdF8Ri8!KnfJWz1m463C?QAxw2Ag)p@Z^e7G*;BBiL_ubR5MBfcxwqr4`w z@8ODxYVLVEHzPBNKeF#!A!qP0n<2%-5oasGix1ra_&TV?&nddprn`4or*%sO`^=boY7kvf)h@nJ8>z$S2YX_|785A`+LiLX?DiMe|Qi(+#0|T`qa!nvO=; z&R~BDPzJt&EXjfn?gAC4(Lh5TNJPAOi^X~CKnjHQ-Yzc+i7-$H4>_m3EZys_VGetU z-3@-b+}*;E^nQ70ZS%Q+27#+%+pZ%N^p!xA*B>O)|6Da7&+AlSHD2{H{*tR`zyO3E zU>cH#9?Eq!pbP5S<~woE4Yt^A{lciAKu1bsfKHWopd5+kevmn&M}&S4P{`v3sjP49 z8~!P=nzcz%K7uqtK5BpyaipM^Ed)x*SG`6*u2r}|W}FW?_}d=E;JPjfBZlyLllijj zW?O3=^`^aIw~pGI1q_rs(1%Un+ZfC-3mfM*X+~_Cv?&inS`pA*wBe4K?}D(uf=eB~ zfa*5TRa)TudXKg;8_FAx*jfouHzPCpR#av_{8}l9v_ppM#DuY{Bt;dD!;Y(h(E?$H7_AJ5I{Oy;itn>;SJ_&F!h5`9L`s=rE9G;HJ1I_zEyS zwXrQW!F2H2{e)j{L5C9pRE7k`M>rP`+R(~HtMn?2)z!J{J#pTi&P!SYqg-+7SUE0& zpHn2UP8}owW+uTavfFpfTHgzz9eC!Q0UpHe%NF4jLDU?gZzjyWr4z;NI;Xu3 zXZ5y5FzAO%I7n%M@3u|kkUpyv0CH5}yO-E>NMQ9I5uhxB>>Emd$KJW!_cEe*!}2rl zVPa(hyre=FbV-uSQ6c&RbN29hj)te>cCu~m`2OhQQuX~;es4KHN zq`~7)C)~kA{ts(fp?6S4zJ&d!>0%$Bfq6&dxIsGT{Wlm;a}GKHM`JsVLnAjcmcbnm z)aH!r&Hl8Mf=|-0^Sdjla{t3Eb5J5g)Mp?i-?Y`r!DeSa@yF=KJNSRM{E+_{(tLfm zL_}OY^<&HDityvdkNnkXg=d6LTQ%5&Zbe6KOTXA`ZRRaoWj0!@b6QPaW2UMt&0nlx zs5+~v0D#UvX4*Nhdd8|}UO-TfZ2eb{-L_wRh?GpY=e+S$7H9{*RS|f1~Oo%J{lc>YAvpkU?pqMtwf$pznK{HR9=iV)Ez^Qh-KqL zcWkJIKq_@cIw%z_WuaP8UlBtwBvD-MX9Q{uu6Ex`9ZYWi{6%?uPSu$>w5LuVxQ0pU zyZrHXa(1>Cj$>frWHp-B0tMc`_s`*yawCZUCAE|DN161PS>!2W#KWSFRxjlOIADlO z%p;P)7aq{JvZl~D>H+%eqfKduOuCa!*v@XC64SY?`bJ>pr^*`6251%^&eSbM!bHO1u} z=iNh%X3Uj|2Rb7K}oh$hJdpyw|I7QL(*cQfdN>N1(lj1 z0NONtX|#Qdo65fR3z`w7Bmvt+UF;S^MzkJbE)lHg41IxkCHfd$LkUU>|f9d`jg#FeAP z_%p9Pr&Up{LHa-g$QjCnJZHT;$8I-g^C3f_dIyLRL5qrU1}r@K|BgUeXH-xdu3-mQ zz&jr@nWY_(SA|RK9uJxQP^MZJY135HaD#Q1T=(#3wzsr1i9s1Lx%d7KIHAyRjVUX$ zJSD&__B471p4!fKz$yy79K2o?DtSHcO7eIdzzTk>PD@iJx7SF*k|#y|6AwK90aw!r z$}Y(Gn6!(L$FlpEhJI!Q_DbCopP=3D&XT^?$@>Gme28~I|&JV_-4WN@sVGOGgtqBgWBFcD5ya-jG*gAX}~cBVahT&jyGv%5iA==axk z*eAcnm$>BX^`wk|HmiP(%d#dT>9Z2=5<6hceWozwJ>oNTe^J!Uly+(*{=fPg~yQ_+A1(6T*1)jTTY?2%773N6j8ema#}HJRw?W0gw*yig^5CU_+iJ4ldE ziHc3C@d^GR0I6Ud>zLUDRys2MC@4wZc!C?>qai`aB=}Ec-Ob~=rFK+}{~E9N9_=L4 z5Yo6ZM_wol^4tpQp@rg={gZXJ0_9#KZDKJwi4U}hvgbvu$S;!yNkx}BwBw>a{>O%6mjM#+wPqoDtf8%Wxh}pg__H6(8}F=qB{oEBYdSps+y1o{6-0c4vMe9jJ)dBh z;$-+Wp8lhWUB}XjziefVKY&B^0aUTdY3MMS_3jajB%!Tg4|he%4bOQqB@F*w+ZgGb-5&E5o#<_8lD|Dx){Ye!MIEamk)gu&cnHY0_Lr>yjI`*76-Ro=qH*dwdrR z2Te=oaxsLk;UWAV(d9ph4@GE(CA==;*Fv)VW-75tVV?qLUW?6T!;WajHXCBYt84soz^l&jmge5ACKRj`F_hh z_KG~$Uxp>umdN_P^5eKcwOyU6E@FS>*)QO!GELPv%-$Z>d#XATp&;D@an24eJPicy&L6EnfV730!LhvF-1(YuBZMaK< zow!Q{?i3v2oE%xLa5$-~o)v_$glD{FYu@o~O%zL4RqQrwy#DVw5A;wp^Bn4%t_Z6T!|Ig!u ziO9+;5N(gs(EbWO8rci*F|O$d*qx~;2LUPX(cV613WZJ!mGTwZw3pcoNNLXMz(x35 z2i}34Q(gzH0BRy4)sF2-9cg5MnJw6y0+7~;EfD3lAB@i69mmkqY?0F_n6|W`fDIv4NO$3j+9s3lS$h+mBs23|nZ3$I zq$IBwT}O7btq~9EO~q6tvXdddzMH+_HX}yZ52nNiaBRqdb>+sm)I?$S)ttb)ML^AF zD_nPIq3eD;s*ZeBG}q*AGbJU=&pc7D!x#)9v!mACSy&|$(`JS)$2O9cim9u6azTtp z#61fABc5SsrSG=M!k6f}i#=B=;~z6)jF1>^oAbvQZ?v}hUG-npwX5y@v^|QvBbb|S zY{|l)>2mE053&*x)$Vs*a*xl;yRfsiF|zZculu%fJ32Vi98Bg z6Gs0ExU1Oz3gagXq7vg3{^(n8e(a9BNJLHS$RW_oSqHtpf-%CZ;4u%he-H5N8aHRe z`1b8*cjh8AboA@XW!uoB(b@!r)#HE{NWYSOu z6})$QWF+5ktDuZ%xwp14AO$ zgGs&_d&zQO=@b~!m4WO^O>`K6Wi&7=opIgVi|)V+@Mq=)$Wq#6N=YZj%CpCy{`Pup zs^GPYrZVt*%t@CUimfX^Tx4^5zC*n7n+q>B|F-R$w9>8_3&e;PV?{*4Ow7?~BAe8) z6uS9yj9M2!GRKUSy%|Cd+39h)vr_cIzR*&8OHkz?a4Bi0t}?ZPd(_M>WQ;|^MJKp=YvY^2apZ};j-N@ z7?vV3-`HuICbspEd*b7;_Yd=}*zZdEhX-OLJnK`jt*28R%0gU~oAaXr(|@|(K<;YL z90_A(%`C4uE)y58c-w?y(63#(<7i9XPt#dfSguhJOU54m2S-5hc1yLkW_$*d{Bs~z zTT+Hu@9gM2GNb-Nw;92WVhdLDa4qMp^487ue~Kk1F(1o zSZIsSSakg1e;Y`d;&BCQnw$cN$flj<82MW96dp%{2AV{@~yCmpFOiaMIev4X41BSC=D_+Oq7?P!E^R&2M zoxmo#d;Y5Bs$6!SVbLGp;*&p{*)3i!r4Qll)wn*Df)yTLVmd!NGx7)s&~Cq;8BDyp z(GYxk-g5&%@Z~XPJ1ff7z3I+@SC5y$*B7M<4gkk(vF^tb&DF<9Cf(Df0)wd6J^96Q zVDPS4ru~*8St!B6g?=W^wivb&rpLMqBSNp>j(m>R_Xymp(2GvlT5E&Fi8ynvFSF_c z7NSI&wpl(QkbfegR@JZ=djQ9fXK>>D@6=R95}CsN(_v|FXZ_VI)pHg_BrITb^#6u=u@UY5U=!&*WRY#@(R@}x zAVkL2EbJBw+_3mdnIlm{bs{_FjU?`Vtf~iNU1rts%m#Gp?YqCEY4g6f<(6>>hS|?g zEb=U1(!n83li7QE+sr|8qG{0nGrldp_2wr3&56lpiejo)M7T3g@{fu0RM#EYRYC8> z?uRdTTVU(I!N@Hh-+-ZYMbMa3(%ZW;Ur0zm^W6VN32%jjhzlQaba_M)J0wl1np*d_ zxLL~R?-E`!5(ws)0(Zx(PE;sxEb2#Ioy#N}j;WnZnpVbefmsn&kUcN%ng)`30SM0B zH2(l%_+)cY)wW?$7z-RCg)V6VRk>|PupFgAV=}+Yhf8+~w*M$Zxh?TUjhWn^_6(!n-2N~u z(xr1PSx+C-+dBjHavfubahZ0&#i8Pmc(hS1lG z<7$#rbl!-n;Qzs~02Q#}s0nWVMXxd1c47b+Gl-S^giAg46ZE1nf=^)j4Q59hbqm#E8 z)@s)TBel=Z)Nq$Ktt93@4zwk$j;x|2$A$=KzyVCMOI654;Qg(}P{%5s8*UvYV zA{ZDL9v&TF+9#h3$-VX#>D|@``FZ=|ya8!`)M3NG=E?x3Q`gguL+ju!9LT*nwpqVC zweuNN(+RL)t;$~mnEn9x72x0P;?0>u@X}Y(MFnjU_g;Cq6jo^SC~1lL+u}0yq+;cr z3P4`G{nZhyFbJldob?|}U+#!-w-@`ka+%(KqtJ_Yz1VM+g%P5ozRmrabsy`dGrFs% zGIzoeX6jvp+JN?9jCE6RoK zb@T8yFH~6fzl5$hI0TeQg$u5}rzcp2g?)Vlm|wg$Sj z#@9vOj>Kfj_;PS68HrKE3HXB{_-6?TMT{x)Pn{ss1UP%Ye4!{SId`^B-)%Y#PpCY7z4Ip-ztKgS52rgV zYlw~X$e5(TsjT$07A|qxN$*ApaN+w6`GHH~J7uWiR2Caz5BBh8N{S{@jr# zAbgQ7)_ZjM*e6a{S&}@yh8T!afRf2ngz{d)szXPZ2h~}DB|`6atIxF5wiAMlhvXqd zWFL`ere&#lsc7s+Qr~?t91{MAt^DT;4n(-gC^N`!JR(^T0&D*0UiP>YS@bbyk=eYQ z#LF0TO`Ma*Cw_Ne)H(EG{0~Sq$55}_%vUJE&Cf8i%PdaEP%|C5Wjs4`N~!z2keP6+ zO=^Fp(xU4b`Mq^TjS8#fkSjG+yz6`+IPlOo(~ke=O6d1GLu^GQTZtu^{uc8SovWx^ zq|-f}^v}<&WXH|H$>c36cK_gecb6B-c@Eh!^=E&}5iG_DlFc_P10R?_PZUiT)l8Is z-O2Pr=KZ>TmET)Q;)V1UBuQzpHf5!GtiwQ9(F(nFLv~S$fXklms5^?gAtmlem~-%Q zJDkzk(CPWW=3?l^Y~aRb7=swEbL1KKTbujCP<#9tJ^@oEgb68bvk?5*w0%L{r=bq^ ziC2K^=^D(6&*!K61_>s-Pg$f|xeT26GMf0Zuq$Mt{#aLqD=TGj%KK}6fMg9+KgV2cg~*89$1cx#gjvi#_g@G@?Q1Y~J}6H~7U{;?vJQ z&E&CO%l%axpDIwFDtQT9=vliIOM-ZGWyNlY_y|b!;xUlPo&HQlF70q|R^y^&X5}4F zPk+5W{uQoNF~-@6o^E3yu*WJT`0>Zv$sHo>;Yy-3xp>PzPUGspL;vX#6hn#qQkiv_ z*>R4j{rNdBxvH}}!GCqMFXKD(XgKomjEQlwM5^l*5md>PilrgrkS}NJsrhC;12b=R&f+qz3n^qTF;~d$B4)nd+&q zu!3YRLf|Ik%<5pD3I zDu=Aj>#@unt^nZb3zS+p$Il-AP)iWR@=NldYd;L}tTx8yQ4;-Vdf#BOC!~-D5?u8C zQ&02VFy@~`%)bx^{zl2Q?0&Qi@DWh8*JT20B^S1Z4xG{{99tj&Cpk6-Ya5m)ZnCcr zeAXruGh)E1A@x3e$^t4MV#;C!Y&O#)0p7sT=bL@ zZ}0D4u;RUs#{j#PEky~2u+P7|_b3e?ODEJsM?Os*?nq1Ic?#I)fR$*|56be5lURZ! zV<^AlZ;{#o5>$y_+f^bYA|$Bpt+~^S?pmQag3^Ad=3O%$m_EmWRp2{A2jnm!6=6s> z6&`@JnQ98^d(tXk{&+cb*!;_6MoSf9y-rLW!i%c5?4aqkE!R0RYQ^}eh4i-sdEeEY zu&OjqAsM)G+<~J8bDupo7H+utqSd}`MWDb9q{O#Q*1V{BA;G=a3;hw^b7O|M;Hwhj zI~A6J>2=S#1ZiB}M48!?;dOxvoAE)vqNO2}v)V8PriAy0Cz;sCqYnd3O}KD!o3%r? z40tKI;}=v`S8{!fCKsrGjxGRqWAqi4%Q&kNo{CuKk*hu1_QXJq%Qz9fTro{e@WA(+ z@Fev7=})|iKl<$YPl1jWP%Q4oEj7I^4SefyAF~1MR$6IZMf=wXzs_W|7zW7KhQn3a zUdo{lm+J@5J+k!ucU;Id_E2u0psV1=A1r)_Cd|!YC;ch zACSSn#&B-RHPmh-!CI$4AG%kR&om7KDB*jUty&;vwsrYS?>lliIYGp0n-$kg_5`DQ zp3H!%=3>X}UnA2@Pz@cZ&5tg2{Zj4C4QqXOW+cJu5lm5C0PgK5XshMr+=Q8!i{s|D zMT?>SG3-Z~5-=9jCkYZ3DkKoU*jZ)HL$5F?JWFZdcbp*&pIWj-)PK#M5K2o zFFLILAfxB+WIYa*gy~)K4~BP7b>lQD)cO8MUvyr{-j-K>WaavS8UQNuGBj+$7Fv&3 z;3Oq}CZHj*>QZAZq`eYgRn&xo9&dcv8mrHwT|;-tv%9jejn!I{U>l7oVpN{SZ$_+A z{I+C_aCaU(Fx?fG^5SLr;{Q|Z*IN0OhdqMJ2@-B+7U6>toaE}@JVXJ2r^2PV(~cIY zk88Cu=FWWs;1_I%GjG8UaadQ?N7cLdTSd%c1SWs9RJxM_k2>M8R9{RL@^3+{S<7^( zd(>8!Pizr;B?7pieuBSncWCPz8Z@J^!(9)=_fnbn=Pk6i?Zr;+08+>u=MZNegTBcC z2yC#L;djj4)T_U}sjjsHNWP|^<^!5R*;7rtzNtF-n7h$-Fl0z=r(iu-@N)ruM_Ub= zZj#%-)9F@eZSFGyu0#-E#)F}XoF~@{BP98R=Yy?ceg%dOeB_h^MD0WGTkm#i$uD-2 zG*O^F(x#@hkG75vZLF41o;UE_;Pi^FpA|4^QGgxl14H@DI(GLcS-vwXyr#21xIG;+ z;&P+^47A7#&c#GQ&8knNAVA9=Mw0eAJfZJLs++j>?84Zj_+@T>5oPAS^#wmJ+`nC$ z)V`Anu{o#rkb%WUsPAW>2bn0;T5l}<=@Yx?Y zHsG!29$^9V!+%N~X6eej`R0ZruMwl3kM%EkIH?QhR5kWbrc;dcbh$x2aEOMLS*Mr^oAytSChX4k0^F{{$D`lB!CG7im6BY>`f>n{hpPKJiBN-8`0by;=QlnNs z+C--3z8LrcYAA(Q&;=7%KFLRp{;zFWW~AjlJU{WZN}n zMWx!t(sI%QLswhJR!93bf6~>^cre5#zBYPB{cN|;6J-oTZBjHQt+c<@ z-7|emH$ZGZi-rCv!pA*X;TXrugMV_NV~b_lZ@@6g!dE~EDB3|GC4M2Z|IWOQF4fx9 zW+e}+I{W9V8FmHR_<3>b`Z+ovxIGfV_M)49;_H0+Ht!$I>a;L=c_pqxlHv+PolyTW z+Ly4O7ZJ6#=3)Go8|WffTlDkddy{)iKusW&=qp6s8~I&y{F`R#eaNAmjW4dK=%*+_ zuPThBghm2ba$Oh|L&Hc`LUW_%+*>zuGxJm47ICUb+GfRNb^DW6?$cQ+4(SQslkA-4 z)1M=OBi<_k1esNb&ypZFYXC*#hBE@*A2CZjAsUcLG$URVsZBWMXWn}xsoz(&~n zIc1w}<5rhaUk3@v*<(&VOgqo+2>nlQ7=iw=xNEM$fgLZ_$K~NUp)M32k2|l^!^7J4 z&QZ|N(bnM37YfvPrH|&d@4OGmPZ+@B)n@r*6~vG+w$59cnz~lgE;|6nHxU-xk>3&F zqv*zz$CSh{RcrZ2GrUf`7Rh{ss}g^Y;Y8$gmFYis{t}zr{Pk)=rnKJW_aeDgGL*{4 zD0BRji@(w&d>hGLab_ODUkA#(!f+pq{9y;cS)U-R4VVd}j5*7jw@oaCaULR51dAuE z3Rz!hPRTnwjC&^MpU~yUhN*d^fq4fjeZ@=14A<>sZtbjD6Nh9R$$y{a&Xc${v2xH- zQhYnR1d-*R16MZ#0)L9zEAStw}$g-7l-u}%04Fge;BH2_X#mUEsvB2^?K zoQ>6`+{~SD(#B)=Ndw>Y)NU#ep8M*({Q0vt>9zGHbL$JWr0XQ#-5T=7kRR1?C4JUT zxb4NdwJhLpAsc+8-{~U7nIsi5=Cq=d34Hs5``=r>LN=GZLZ1bv1YFUkikxXWxK5%# zNXeY)%CEDB{CBb}(PcxJ_IoqKpGh*BZuK2jrG>1wH-`aHUcXVYiMn8>L>}W6r%EI~ z@L`v%H%&NkU|wndY5_`VvB7-aP8LQhU!864$kyNH7p(=dWUTy1o^JM02LRG!P?v>Y@SS}cV$$qa zg17yct>1k+Hu8F)0zzr9p?%))x-g-Mcs>HA6hNF?`ZttRMiWXa6c(E3Ta^;ut0<-? zonj0NhMj}rdn46*y1qCM)hV- zTN&WmbLpGZADiZXVJ@6QX2f#>tPzldJ3BywUGdK;;D9!M+^zNd!lXpK?<1sDNhtl| z?)q4^1lat?lEe^(otr$$LyHIr+dl7GQCKor^UC1xmdT?pSC_s2_THM2$<5W25x{HT zDT|8y!9*}6c?j07j7%FWe&bs_A?Wq|I#d42XGaIXU(Ws;Qsa5{M!h2ouh$cTBzA8k zvS6@e7iI2|oIe!GEV$E#D8yqm>Ma`ACbL(r6)#{IhiY8BPttC&B@~m|-!XzT^2T)y z%iZ?Q3!l#{3a-!)Svk;wT5)k-?vtl1xRP$FGl z;(quP($J6b_!S?l5v){tnkq{arwRr*8M5{o~tjjoQjQs>3RtBHr202G{rRlP@-m^bn;kh5Br| zJoxU|L|j_R4I>BvVr)r1x$*rw98;=$1SsC)fu~TXu_u*~W7c3?dlNt!$+*sLJ00Blu`nAe*Od~?Z@B= zUBnvU)V#>d(|Hh%OAH1JtAQ_qT_hL+l5%Q4HAa+&`^fokh7P#x2#1;mo_gYBybhb^ zv7;rou)cy|y~jm=q?Y41w=#HiawUTOUYPsS1ijEm@o;AWj(ZM%Vh8cM9@v|}w>(4I z@MNi?{GF*IZ7Kf);fM-={UnOK!2mYWEP=TgDWwrjc#KUqD=Xg=Cxh?FecT`qY|zz{ zF6_pO1`hq`UD?L#VZcCk(pcV(J^fa7dD%C2=?HtnjuIm)$7Uh-7w>x(kN9OGSc(^C zQJHJY(k}(MODAcYt4h3{yd$3#dp-dwT^6uZH&JT_NPkUT<`zM7cTt7K*Oc7zTr?!G z9}XlNiXu+*38sN1Oq6CM9bUknHs&?(S!H=(GAq$}sDYJkXh`gF5{OulRvNIm$5`|; zN{jreO3PKqGk+?9tMU(vlgf%Az?x3BMQZ;bvwA_S)D?Br$k1R2o%LB{b&6)M47Dh4 z0k~-0o=MY%eZtFmFYts2^5;JC0(f5>9s;G0sy8?PQ(6BZu>$|cl&ilvsQ{gGkx8?e ztif`Nf)8Aobu^L;>haRx4U%EcAf|Q_9PMmAun4Tl*P>j%BW=0vdOR$OJsSCzLW5(m ze3d}0{gdLDMjA~@<7N{*yPdEjMtMpwKck%c@wk^LmkI5dOmlOcttD_jmJrak8f9mu z70IJ{E}rC->E7SPWroba3u1Y+)u(U1j=wt!XQ=fxw-4NUkE4cn8pWid3f}pOyR|RlnipVw~ zmH2Z*D_Gk6N_|lU>T4wWlBb_N(=zK@F+hR`_udGq|NLG#9=cRAuKEpmZ+FQmA`-XC z$CYi{!kds9aI?Woy0(>ib0(=8vRHBBh#f8HF`wVe!Fk}sA&FHWiPhWJOoG$_M24US zPYF8z33eaV1EY{;Z+LKgDB1G7+QZ`rPq!){PJzxarA46tdfpt!JQrxz4I^$wo23f1 z8i8*!Ze8a1E{O$_J=*qXv4mdKnR&MA+N;LZI)@vdI?7}nE`bP5afrIpXR2~c<`cJN z2qZ*ujW4aCTI!JAotZknlF=mFLd`~?Cb z<~AXHZQLi5C>M~4U+j>V7!I?S?6ZiIll3lP!o2CiMU$V6pc|Qav54(Q(CZ>;_MkDY zcuggPbf4rTsdbXAoa1GH^=>Uj?D#>c!^alF8T{c)IVF3Jq+BZx*y#}}wb|IRY7Cw? zE00DsSz?aL2{d}1)rh~I z{cHkFy5~8kryByRML`&rs`D&B5rVRt^Tnt?sikymFhwy77W_{cp>!B@vv+edYSG zEAwoImLTo~xENj_=FhfbhBEy5CyV^i-pB&qYto~yBgEcC3YCD%WNWcc!V-_j2lng_ z8sfOpIq{9yAtNdzT2OEBk&m;jQ|+E)!Eb`5HnwKt75%gx{pW^A9Fb)s1duqma@^gu zW#uq&@EZPx5C4y2jln|#ZiQv8Y2A*W0J7Q-$=S&*3$}yD!>ikp?lOYSe}?Shx_$~Q z`sxp02aTeSpI9>AEXu16P+9Ie7i0@hai30zGbq4h^fstNwy)Wm$xK{>$JhjL2M?B5 zV_cQa5qwy&l{Qk~NVj>A1*Utxg7>_y1z^P5%3ISTt$MXx8t8SfwrRm4;?f9X9C!3o z(wUnjSu%a3FO{+hb2%G#q9yA=y96C?FWzsKitjbuLZ17ZS`zEu*nSFx4Bz5(dPRC}ff~bTGtvqp4uIV7$w4I%^61T{t7kAf2)6zkk?Q zWY-z!@Q;vMzPzpY`;`|>(tbX1L=Yep8zE2t*eEsBgSRE5cUwGjf!Iqsp!F^ zY@@GEK>K08$l$+o<8hnwyoI;ZUb}KJ{x1Aeu(kNo_HerNPeed!@fY;9A!p5$O}H9- z8D=l#5=mbnemDyP=_c|uI4mT5LG6l}?f~)%hrTR^Tb%gu^0nod^=(6^OKBY-uPcW)CL91n_C!8g>>dg(C&+ z9_Azc&lC9*VO9GQm1QPXZ zvkNF&9VZME`7jyXYC%fS;aa$rbAQOR8r|Neld(a03tNI&+Kr*px#uVIY*py;Pz~#S zWJ8F}jwS}gix#Oogs2V|<%=(SXRMya#Ba-_&jCbI}%k($guaq_@|9a3pI2=eJJ+r7z;rMm&` zr(@p<*VynPQ3-A_cTnh=2iVVQ#FW1`M}d_&U1iZH%%~=3$$S*&=c+g8Fsur;{?&)} zy_wAV_r91buxvxu-2{DK7=Kd3I)`TgSNy#v3609&3#K#!ETV%xz>M^*r>YnbHY;rU zoAA!~la<1WQcvqAw0MbpGje2R%qsi>16Z{#xC~rDEun=wAR<(ax>Qn3gdykE<+O`F zLrobCdwuk4O|)96z#V$~dY1>d2e4`)8eH?r8?Gu9=lvk3lwg0%6W&p^VWk_SVEcC=KS$fy)ier<+Dz`Fl68g232|Nt$4Z350X-#7lMc7uSss@dT)V_T6 zS3`zbIlKfX>lmMDzg5SjF)s0-i9t^Rzmcgh4o=u4x}V$Rs`~Nf!@$#yPXWUZ^H|jd zUu*P3eyNt-&^(}9T@~D`n%!!p`1s@xWAqbD-mYCb~&_3z`r;{*4Q_p`zGM| zznb+vk@kHulh0ESqUZ(+mWq!MmH$NY@6b5PK2^ljyA*Y0e5?ubeEo4MY%(uf+F{8g zqu>fa!FZ*{lMgCcx3g9BWDt=;=I*LNU0?c&!L_c!+ z!bxeR)km?6`97c@lwR|JNYwU$eBS8{VP^HN%rI zSR3-(i9Hvow$JU4(1Qk#dTVkk?+`Z88Q)q9<^KoD@xk9pjj|&0^L0LwHH( zZu+l0v1Rn?3P@Mlb#o=OZP}J>Yua>%m>xgHBWG9Y*RH;9j z)_GdcR&_&pA%Ok=T7YxB>LODPk{fX3s!q(Fo(pO3$I|tgbkQdvIi60p8zkKbCUy=q zb@zYF!1MDrFJDn@qngjQiDwCn<19OOpDDQSxsR7Q-vxguo+;zDzWij_sALNbmJ+8~ zf5NHqyXBe?>clEHq*fsP6;fb&^Wyz{x7EL--yPVJIe%sNxl}?d?({OjAeEjs@VP8% zX}Q&3K@9*!IG*CR)ZuaahG^TXQDYCfC^K7mYn%MM@Fv6VVcA;X*R#|9cbsMob;@2= z1{~O;E+6VTPXpR4PupLCH1DXEG36eQ==LuQt=C8TJ<)pz+QCXIkm1|C730^JlK8IQ zwlvIQVKBRlFeROH+LdG7ch(k24SW=wBTN!DH;~cEyAEQkOO{KX23j0m!$$rCD<)^dE_rER#Jb4hqE+iqvYuS14PNy(R zZ(kZowpYIR2mR7BZO?nhO!`F+#DTNDb+rUe20t5@Ocmtqw<@ECRs3G_Yudn7e56Df zeR?3Bqxumhbm4MViaaQYaWA37ijo~*G=;$uBCiR>MlPxtoj-S>z=CK*P`#Z6P~why z-Ta5#+^N3(z3oRSD!o%A$m~HgS90*1WS@}O&7H5QAxa;$P;0&Vnz#cHUc}K@xbNsC z#F>|OJ^Rki0vHVVH?LyAyzSci75KY4cZhqqW)fLj z^uId(3l@DwR7Emxp}Xv_6M>>hot`(x9Itbi>!ioBDb|UTq)8Z3S^;d`#j=1|NZ(D# z)7W7e@`!??A2Me&QzCrds9vkn|5JlEmEfksbo3hdCFH4IZ&Bc)W9ax6{#(Fz>Y1>P_nJZ+TS7l^joRf203sSaU!fVBnz3q>}y( zbLO=bn-usjk879(L-x^w##eBd(@H+JUbwZf9jFxL7@ji5LABqmV{+KoEO^NoxrQV3D)s)Ry zgCf{U`V-jAj_Xn{P2d0xMnDyEb&*V>r3t7OUs$#H&nJpS0^r|$q;`SfnMwwD3huYo1lu+5JQ&q-Yk}N95~(g347)r(7Htqc^Ivs0 zKw)DOzpmwdF20v$XU6Cm?gMNgz$+1kE1dBR>wR@-RF*;bo%&kM;J?Mlp1f!_Kg-tc zdpaPUaVpudlMNRU0J;8$Nhqg)xx7ypHU)s$WyN~z&v{llG1znJr^_?HSYg3OXJKrv zQo-Os7Cd=^tx9jiW^@3bTRq+0zM3c#$XE{|KfAk1^{Oz79Iybb*?oMZ;CdDFpIxav zFcp0$(2AHuF}ELmOj-`DQ?FyDxK-J_CC*qfz)63w{K#U>(>DFc-wQkq9UC@v4bx(t z;S0f}1-ozV>GDZrEUIR}V>TKz#G1e4o}jU2%ig|k(-3x0a7rWa%VC6K;U$HdUt{HD z0xg1Fll%N+pF?OIL=0d5{@na| zQa2#QQuaVu-ERUf!d6<9rke_yV6UfDG{&QV9BEacLH*_Uaq*~NoOMI^UaGvgDSokO zQd({^)erQzWT#28d<(=U%J1!|uoW=?&P$5kQ0*^VnTR9a{ zgn52M;Wfvoi^I`%!{TmS$aaGjC z&w0+)1IY~YG2tq_Lw7ZeRb+rz#O+i0Xkj|-{z(xg&pp*h9?q{dOc8AiR9r3VDg*k8 z8NML(rc98C>CDDB*v6ip%LUdx96N2NVs*b?t^J&V?J-9cWb0lss19N0N zREljG!6?j00{jSYHM<#--8|!$&~ge5!BKCfUcu2c_|Pgv;0ghiUDtGpa3kKs0&CpPm_006cM0_}^MyIJLc4_Py>MygA^x;n;y zdA8aY-iXMUsZNuOr`d>G=+X)Xunc!r4}s=VUlP|#)jM4~NcVd~5xEKuU*r`JR)~aI zMTy1Xsf^Y`JkDWy$RL^^>j#W^GOE6et@|9%ZlKGgz) z8B`ngDF#6EvDtdd$rOJ;*5il4A|#0#+m~C;H$QU(8B(veaS4y7b!RBPCgfmNmT#Iy zHl2bx#J^@IwFq z-2YykoYb^$BG&c}@x@>#u+sn*wxWCUsKpr|E=U!NK?!TNYbpxQ4<+N5Jzu5R=R?aB zLi0Kp34f)nO#=WT3+i_l_A%MY63MWIQlzSZY{L*4>kZ;(EV$%qrej(z;3grTPoq2u z8Q$jFY~@NNKmCKse{$M#x{3+I0Uy}`0O$Uro;&`PjdOpXEG*U1t#*0lMQuOPW1fg-~^;0|sGJ zm9Qb%6uxq?Za~+6av&ygu=q5V4zT!W?Zi^(r9h#ZtR6#v#E7Jj z8Xl@;FR<#^y>SE4BC^)(rF$WaPoH;Z!8OcH=ee8Tj-BU?o&%Qm8}|nZoqdmb4gfIp z8=_9hUrJV58wHv=t2@6`5C&QC-Rrw0oJiK3kUDQAoXBt2molE&syhzur7Rmrx!Z%9WJP9#c);ee2dn7jZ+*DygC14+tLj`+?^kSsqklOR2rX93gaI z2564rcX72x{$PZ=(pTH*xq_Y5!9)zP?;xp#6 zpImu8J?_PNJrxT&3gq=}ZT@uX>ybXKgya+{q5zP*$^h81qDEhHX*3$Pt(J(M6$In~ z8pGpo3<7^a4aenZsy<&xy0IsI5EKBKnjF`meQ$FFBR@Nw-J27S%d_Lt!4_-djLwKU z*V_Sc?Y^=2bS+USWntYO42RB>#*N6`Or+KBxI||HeejX6hEIrVq(&!BE7yVYcU&X6 z@?BkkSqLQ1xi^SY{pV_Ash0f@E0}Le9OS43J-9#I8GziItFeRuANXQBvR0MVo&{F2 zrD#W+D+x;`9Wu4BLNpqSwreH?fs%;>;!nQY9Lm&H*`Zz!i9T4oUa0E4DnI3eW z^QrnT(FW0h5byq$nGVJlyX1?n8dCb9AzQo$4geT9FIirP;g3_#(jBzvHsSs{&t7kU zFtoHo^!*}2L?M*$TWc&|>hhnnPT=3uo z_nA9v_HlgXhb1olhKlS#lDRNQWU@$sjt1h}(DjUI4$mhELmF9|puDPk#aHmX`wWRi=+Uu1e-ey#%%*$b02V$iMGU*_>a|YdWKm>1KP(x_J*sR(Y zm~pAFiO&~P6A=%Lj4;K-oQrWR<<8?30zv!<*^eu zW#HaDODaF7nOE?h&j|ckV$x{HZc&%)k&6mB6`)KfxA$LaftxnC8aOPBsF~@E4y*)A zV3q@LFz@x(FAKJa+1U+TqSa7m9Usyn_FWZHI!%kFPZXOJfc^W5HJOL_#bDyNB&Ul4NR_rqO%@ zhvqL6@QKe9lA}aK>Iv=c=A%GAd2*NppNZ%g z>5qe4>J7XTioTrFj2I4|S$PHt%Tu70cM2`LVBu)oZ4^CA`%jeaYz+w`FnJo5w%lHF?IU&!fcb~Ew; z2WCIYNBSrTB}f1zoQw%~Z_YiB?m`SQRx7htvxHwh zn)4??zst`+r_FnN>C}0XgP>=c52GaNy$$sAyjvDw!xML#H}`(ZW&TxrrCHt28!6)6 zh83TrP%-mPiw3h6PfJ|3t@59E_umi~cJ0OMf(FgBXMYB$jz)7T100`ozF1cc(^iEL zgXO4JeH*oyN4aPr~SuW0+`tYO#ual(z#63{;pn;GCuQz#9uqD|Lq?(RLKTgd{riLQ;5|_g%9Wm z@`ZbzKP-yPMsxLs6Y1^oMD&GVpHUYT>6M|&gCpVyJ}Hrxz5t^ZJl4yclZG|kh>K}p zfCTcZ-)u@kGE~DebFRdEd_-Xk(wx!#IV^uMW)|lI2zt-tU}hCTl~v1Iuen#fhI}t* z3O+$t;I>z6t6(@QE%aS@L_$IR(mxZDqZ|P&xn5|ns-LRA*BE+LxMyn4i~Iap_}X!h zh66(CMTUMjYN)enRJ4|TrGI?t4eB=3fZQ}#ErxX+Sg1gIXc0duRQrTnz3{&|gSL$j zumwBM$}9po!DXhikm`xIyG+fe005A{SN=t{1DaA6t*KQwWT|C~EECa|5ZS;K<{#+> z7V?)-tf;$J*~bcX&#PLY{ijj&-Uyc#L;=e9Z>&aIyRl*%t_}z)w+a#UG;^D)XL7xD zA|QpOmuxRbK=UrE+Bo3U9!`P*(bYa31h2`kcw-_Be<6U3Vly%npjS1hA}|L3!g8Dh zShj#G;{`fPNUJK{Y29<5AK}F*VrlTDhpNkt1&%+u(coc8Aw9z}3Qzu7*t@%n z{i`CrRKv`qhoBV7aO5!xvTLOO26oD_*2Z<=I5+K7S6I5o)#1xdD935Z! zu<@@$@gkQd-6%&ZNHbuoJ4M$r1fTn$jobxS^d)K$2;Z0^B6q`IOryL5DIKLoe=DD{ z4BZvzL7cFG?p^%P9pkIiu0@|NVyWs1Q>j0dmN4h9Klt}KD>sluGp5wBB?GP3$1lcA-yR&rj#`06bXs>49T7>nDjLlkHPponQg9MlbXtTHGxmj#F% z!SzZDf5dL;oV;(@5=yto$ig+GY|Z;gHH59HNP4txrnf3ku`?`9AcMyazB(7)FiDU( zR18^Ub}0Pkl9acT0{|nN>A>HwjYN7UCqD4GhVi1x>YrtpPy)XE*GDP1K;cT>f*K3} zVCA}mcvFgSv-1L}*9z=D7|@p3e%Ey`f%6}(T~l>QmPsHEx)5L?kt;E=OpLs$=>~xn z)8GR|BprF&{(^uKwl)6Gi0)59y>K=r`F~Zz6<_Kt&mYYdTA`;xp!2YqJs+3N%S)a_ z2mB~6CDWRn$dk)FAr0xZ(ms;l)Q$U9@({o(P&KDYRtT4tiGYQYtU$F;dxLihz4}pT zs*IR&z@w*kHLmCsjtH9sTq(-?uzZ6XPGmVp}}#1L-*z0loN{OE9v{E6(`crtU{qqHMP)|qMGl)MG^p;)Hxcug<`{jy zc?KwPY=$})YyS5iRpdrLtKM&|HiTmmG(ci2bCZ4w008y3kp~tvtX}vpz81s+;j?nW zl98S(PDV5_%-T0)OPgb)rj}3WhN>#^{FlBn4PGi9f+?jPBHsH_(kX-pi8YtP8*5(v zWm3Zs^oi5zFhSdSzLZh>n>V{gHV?DkklUro{s*}-i?_lygyC!GHzB^0;<%d5fSPoV z<*)S_2Ci&6^)q!mgoUE&3ouD`u$&IaL$iZHlN)b>$Pl@Uz-h6^&XhH>-|B(eXdGM{ zu@dmNl z=PCR3^q`vu`ntOd71|(yBvtEzl87*0(60L%prmfO$}yy#-eoXDWe1@eW6*%P z(vw1)c)RiG`svd$(Zter80a4)D)sif)@( z2!a{LBcvMZ7_Z$0CrN4rp<`^-ou$8{GgkM^8XAA8`-3qbdQ66q;1#xcVfMB*{6Omm z`Ddtfx@}21gg$P|79d(A0R9G^{Z{9#(Nq$%kVc`@HkLGN>t8^VYaOXtuIeu6Ld}=U zP|ytGk38aEtO?7l0LDLCPFtHdEMmVfczZ52yfgbJHf=SYw2zxdr@gz+o|Ydi-pIl} zB|82C!FO&cxiPS^qikr2tl@x0ynpwoR;xkKVsf?M*9qT)`?ts@>wDkzL1J}M=qMAG z-`+X2qv#`_+G>UndvvW7c_JWP!o^$7OtvfO$8Ize9X9Y53tO9QMCkqTr!8UUDu>&@ z#nZ3TzMGG+mqW@j3KDeq)szcC509_;13aL6`F-xHb|bkm z`alxoteCSeF&s=__j4~=e*o^U=vGJdpp-*VHx$0|8HtER%=e~C>x~rA;-Abd+_~HR z@Dr}IAVy7E0ax*u3LpLh5``O+Yp2)V_eM?Sb+Nv48+jLBx|EQN~P z=X6D-VY4;^dXsvMz&S|tNHmF}Tv+Kf)YvBRr0FhQEn-Fp@UgGOYe_0M00{Mxl@Qf% z;Nq{+LQ=}xmo%AT169ZZ+^m+Bse*ZCz0;ZW-t~5^QsS`tG2HQPBEQ_T-#^!?|8$xd zQG#NLf5F19mt5z)2ueUB1Z z6Go1d8jFZe0u~g!cy>^Dqh)kqx^L3;=1gfRMh%tvanwGyN;}XH-u%Uyie7Dl0sV~m z;I+^v9dx+SJ+D^u+%sB59t4@Y-pEAx+Mul2_b8E}`F}L0vT;!zh`k3l6|Na^Mytd2 zG`7xkj+f-H;08>sEdkmDC@It6pc8_Tt}yNA=LsEpMZ68NOQCvSb zIa(vs+t))B0I4=^oErUrk)`t0s0I386I7+LFy;CNNKgpx&Izss!(z^AGfCF_^Ri{x zyOUV3OZkXHKnyMi4W?6++kg~?CyTqpPNZUInu^i!QzUN+MDTpTXZ~W`Ve3}WXb7or zBm)<{eO%|LGlCR4=9>(plPl@HIPswBAFFyj(-xb$mg+#f@G;T;F$|&XN$AQULX7F1 zYXBv?h`b$emrewAcH!O)QXEOQr-_!fkEs4HT5~^^r&vOhBULIVH;C*^Vx3v~>WrUSx7B=F8Yx_fvwsFI%%tRp$M!mT85EYu2h1C!1Y4t3HFQq{Z4%Z5J#9IDg6 z_B}vqH2rnRUmGQel>VJix*eAEIt}wXA#_oYC`EmIw25$}3C(mg6db9u4}9g%LC$kv z$81d-5fBwTeH=-YWopjYK!(IBigZ*yp=}|af?D*@LM8`MOkL3jmh$Q=J)JiLgDL}^ zDkGW7+0{t#M0t4&U~uxZY|E#Z@dWa#JKe9Ap+{|McP>lq`At5*Q@Wg!qY+T3O5E0I z0dXLCa>8soDxwOFQ0yJX@;5;hZtE9d>C_jKnJy2Y!A?)ho_2&XqW6*lCep!2 zwP*n1+5Smlngl!m!22*>xa;3$%MlhG-chM-L&lEtNlzwxkpd*!sqBA;?f_kjQ>Wv= zqJO^(&ZA9-FaH;bmRK4SgeK+s^kf(IhJYFDJuP>adytf2DuB4VPW&2RT;FolHBFNX z&YKrLd^8J6afXMHm=fa*2?Z}9tPm<05(0`tPstBNR9>tR<-u>|z3gkZE~j6 zcVN<0^nafy`@WAcK+fIaotMyu!66*W^iW9X8s(ut*96n)Bk@HtWnJHXuOz=5?|?EF z7P=5N3y;MJ#!kayHGXXTrhZg3-{d=b~Y2KEPA(#vLrpPs+ZD92_O zNF*$oa}sS=a0E^+P!I*@48_ z@9z{*M|SeVii$pX%FJUm!(%GTeLg%g_+t3+eVPc=5~}Mlf5s!TvL`6R**n4S&OC_} zrJ~gxyB3SPJ!VEt@ZXVP$(hpy;;>1r$OFkO1G$3q_n zRCI3-*7gVU?41+xE8R9(1%+>_+}kpY(}Fu8Tl7ppbP$vkuo`-<`t=k_sx!CdXxrY3 zD($Im4pyt&0EH%ta(DY-#Wp~bHfikcLb=Jb>U4U;Ge__Hb)fG zX|n!7@VH$k^OlFI=t}VhUMSAfeWX;NtVeaUr8QWd>_#yU&HJoPnnA0!fpF;wEyVw&lHh=NB&*%sH?g7j~P zit`UN&p9NG#0Q{sVS#$^or`hBamTb^)Tg!GusDNlFNgaJ&-G!yX=Hj|F;SpE@y_)? z=>8%|OI!qWYs_Ju$%}~n0eUIx=##rLp)yibcBMC9o*CLD_woX$Dw%~;-lsDD>Wnj) z5bN4f=4TVnXYQ&$qzd{;E_#6#&=oU>A@Mb&<3)$}{Sl!bqC+kNfG5HMX7%b~q=N!> z^#calOMJj-^5wJooT5iuOr4QVau=Y6)xEKk8!PJn+A%iKEF<<$%HH>DjkyZY>qDvc z&qqZbi?7hq{U|tRmkG%m4=+a5_r3iliF+&2GUJJxW7=};;P*S<^Z_^xPa*Z)I8lh; zcM?XfzvP3cHt2zy!$TaFWWQltwaFZ9-Pj$c_c9X{q^BKp3#zT*5H3qV*$B z<-pC}GveI;R-Dm-&zhvMBGU|jT&J0iaAIe-q5XK0?P2L?*vD8=Xy{MNF-fV-_nOrA z*~z-5R_ivVeE4xp_^eQDyp@cdGpmaUh84V}WcBVZZ4FI^0<+6fJeP@*iK@I!5zt8= zxkz9T1+OTfv3qTE^rG?Q%ER8jGa7I8B8OUc&EyZB`qbmvT_Pr0-e-;&{rL4Pk4SUr zG9_a{kxe08z)9W}@y{(XY~LBw<|(6Lj?DVdk3X|TuIbfN?=7n9#9V26;Wxzfrg0oP z1Y_+~hwRHPoZPT)e8KAKnT^K42&=A-8}zjuKu70sq{HJ1|Kk_ET)2PgJxPs-xx?4z z=9dF_($6Z;uWYx&qgiq$F3u%dXy)pnU-hB#TU6#FYx}<3d?}RZBIH;$G5#owT^9iuc)4rQG`PvJJBM z*<#VF^2oNb0fD@_;75wJg^6>^7h%ADTq-or-1;2v3~}KKq4n)U*FCI2JdZgnr)g_1 z)HixOc=ffLP3tdjEe>Xsyz}Or1og*VQZpYdoOWPL{)g6{J`;cqaIO)To<;j+37i`A zwTE2fK8%82DWOq+16*PHuGeC-Rq4*&(iKU2E8o;QQEIG`g^XwT2(!d2uV?d!Lj?a_ zaZb>PCr03PDpRserbko#M?YA|U$YGjSCX_gdPQ6KI5HO|T z$={Ssb$W{m#2a|MJtHnI%YS>3GK&pZv{6dC^FTTOCtZH#8f3?0MeYs=yKstB*Va0= z7WJTuM#+#WNp(*N9}Q}M%HY>up4V`li8a3)KRggZH*-NrD#xLXHO&*7yT(tXKJRBv zKfNyen)$s*3P!AbnRd8YU-^Cn+c;WkT1&g)0c?6TQoU=JMT4se0Tl^XydZh`Qc!Z}KXPn+4s7-Aix<-7awZfUh5=C#T955H<<~Oi5zllHC zXL<{zj1~Hrvk-h?AR@7q1W=ipYw?&z@T9hiL`tx8QDcqj`NEAEW||)JGk~!Xn5ODJ zRhW9^oj-FK>%&s z1t&)LxA7ri;eD(hJNXn^`HGv)a5i@;al}%;q!JOXP`yBHk|lIkh-Q8`lo4mF=BLgh zd9f_=>kZBScyz`Q&!mj@wIJ?2gKA>#}a#6hILMnJ1#hd6ioh=ePEW{;$Udc zsE$|OJER;4>gyb<-TrV7>h$`vU#AokhhggBxGnq5m_{iMqNk}gR{Oy4#IBa*A29~D z<;yjzyMfY&ZABIMJdR=-q3A6C`E@G+_gcY!=SuXlwR+8%R}BNdwAjNJE;6dewy``Q3r{Ehms_L70cw}{f z*G)#{5Hx!JITL6>35}9fnSM*F&W7t)xgCBxUleFUT$9aUX?0XbyXegvPehb4@lw;J-$JJMaM=vhSgki~ z&k@Vt1E$fH?xCxbpgrXFqzH8Z9EXAbL|sky>{z7=U67{lu9uj; z(lGl?u*kX-zcj)NNDe306h6o*8NC*y)w%FcfVmZEAjW4c8f?^k@F2TxAxgE-0n^{k z1!V>xb3%)%JI+A`1K(cd;OmZ%{;$DKi7Fsyd!T~MzM(e$C@MD}Jfl#WYP# zSs@1rYM02wLl1kAUQ2p87J_lTSQz57`Oc7s^AdWR&}PVJ_E!=x6#IsF3O+5Z~w zXq@RG4Wf9^O3Bdt%fbQowBJnSWC;YSGBH!U2^s$yUmFyx_3K>W-*2YZinW3^X#n1! zG00GNKyRm71v*+AC<5Lw9U>LygNo}>H&SJ7&!Vvhu?Hg(Lw!a9JBPn?;B&q?9Y`u zxp1&j_rtlBpJA1qaZw3l*i#!i5Z(}bnv`ivvTkr1az7{KK8QkyT{DN>!DR(4ye!&} zIv=tC2%Jh2?!I%_e|}lo>bM7F5~@FcW*`prQ4tj6ed9EQoD z>24bM&UN6up7{Y}+v# z{}~b`G~WsTP=GyGAQ?hJICr98;8d0(ziz^hTj4PKHJDqK-`~l$=hK>wyYW7A}4!f6`+qX7KB2c@M zUT!8pLQ$Ca;!aQWw5I$Mq6;~!zt;P>;lVmXMYE+mSxG)e3*__^SD zDa#<@IT_2dz$`jWlk|7)z-^4I9H-v^w;7A;X7~=sNSaXTn3h&KPUNnc3f3H__uQP| zRwIBONF*=OvMTQz&pO3;W3Z%$Hkkow&>#QRSv2sbnd&5Jt~7MAuB&5rQ=S*Y2<46g zCV7B(Q5>32%?VRW2N!dVQr;4&7wsW?*rnxx6~Om@FHm zcV3jAu6~P1U(ej=)pK>Mj7~Lv8C;{|Nab2W@Hppk!`QVTdq(lHxprQsOL8-^^O>QJ zy;tY5RU0rvwx_Oads;c!uXtJUjEfvMO7p3P@Deqr zi)nD*djT6;m**@;ZSs@lS>A9*COu%=@ZH{EfABhot-_QLY~$z#@)@XJ;unCe$ft2N zQ#|Qv8X#F+qZOe{9{PQ zZi%i!A{|Q-!T|aOTkWFqkX305rDAIlJa6Z2&1eD3Qvf`7n>M!W!heT1_RL*bW!f!1 zXmlV&l12P;u;1TMk>1uG#HFaT;AbCf#{fR-?w^R3j&byqKE!%$yUM6#U)fq@JX?1L z4zrh0d3UUrRAp*?G~`hr!G8KD1|W*YzX7VXbiva%II!=9w5W`lb$9C(YS}ZT8u-x& zBn5*pa(Tw)1Ho%k+kd4C9qdyfk`~iVVC~(=qu?@te!%)Ya!{8Bd2z zhY%(Em7>~*nb}`=-y=@<7y!X`Gh3}x_98nwPFi_*zxMMkedKrt&*!x>(L^p3yh3MQ zWuM5V?TPf#uJbLQXX z^X^yVEKgDUNw(U2P8^eV1L}|J76XP$`v9DO8oFqYiZ=8~Gh*Eeh-G}@;j?G4TnLB$ z<&vEGqfA`=tZ$*bG_j>}MfNmtGSE2nyPLY&s?K=&FW^W>p43vYsq90liTX3MPTbV7 zcN%*cX%{Hz^q551U`W7AYq# zge}sIENrMu?cOo$T@86Mc%AYIkae68Xw7H?yVF{Lty*JlMn015?2xXwLGNU7A%e%p zCM@Jmi!fFuSJ>*WZky#(3AZaDn8DiVjZh1VV1t!$IC=oc2l;Rkq;e6a2byxI+q&q_?T+Kl_!mkBv5;*{Er-Mm zXN4cf)oT041h0$2lL1`eg-XIGJi6~oaKzLza{Dd3lUdRLa-tPT<@+FzDVw2T!LMI! zmNs#jzH%BL&%C-@CDbmZDd)mP;GDviG04qu%GVNP%P#ZDS9i?5br2GswB&kwjBPV2 z_W+`*e`ojb0cdLZzf&om>WH$IS;7d$v$XdH*5lA`g&4va%e@XshCc47mBTHWrino#W9oDevp%~1j zS9_&_TMFqUPABc?+N8-zvRBJF<2h* iFZ;Q(QvYEw;V(2ZWSL`R>GK-`KfN1<+Fvy7!v6;#d}>hu literal 0 HcmV?d00001 diff --git a/uploads/yoga.png b/uploads/yoga.png new file mode 100644 index 0000000000000000000000000000000000000000..4a3229128f63af4510294deea02f8039a56e91e9 GIT binary patch literal 30376 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 literal 0 HcmV?d00001 diff --git a/uploads/zumba.png b/uploads/zumba.png new file mode 100644 index 0000000000000000000000000000000000000000..8d48623735a328da0d0d34743ab42be1135f60d7 GIT binary patch literal 14678 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 MtEp6a$Ljh20}%FvZU6uP literal 0 HcmV?d00001