From a7a9cbd82dcaa4156c71438c112c517f914bf271 Mon Sep 17 00:00:00 2001 From: Vo Huu Luan <119402962+Soar06@users.noreply.github.com> Date: Mon, 5 May 2025 22:09:36 +0700 Subject: [PATCH 1/2] v0.1.0: Distributed KV Store with Sharding & Versioning v0.1.0: Distributed KV Store with Sharding & Versioning Implements core distributed systems concepts from Alex Xu's System Design Interview: - Hash-based sharding (hash(key) % 3) for data partitioning (Chap 5) - Timestamp versioning for last-write-wins conflict resolution - Multi-node architecture (ports 8080-8082) demonstrating horizontal scaling - Basic HTTP-based inter-node communication Future-ready for: replication (fault tolerance), consistent hashing (dynamic scaling), and eventual consistency models. --- eej_rate_limiter/Dockerfile | 2 +- eej_rate_limiter/docker-compose.yml | 2 +- .../core/RateLimiterRuleService.java | 3 +- .../com/enjoy/ds/ratelimiter/model/User.java | 5 +- .../ds/ratelimiter/utils/SearchingUtil.java | 8 +- .../ds/ratelimiter/PostControllerTest.java | 2 +- key_value/.gitignore | 42 ++++ key_value/New Text Document.txt | 0 key_value/README.md | 39 +++ key_value/build.gradle.kts | 34 +++ key_value/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 60756 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + key_value/gradlew | 234 ++++++++++++++++++ key_value/gradlew.bat | 89 +++++++ key_value/index.html | 85 +++++++ key_value/settings.gradle.kts | 1 + .../com/example/KeyValueStoreApplication.java | 99 ++++++++ .../keyvaluestore/config/NodeConfig.java | 68 +++++ .../controller/KeyValueController.java | 94 +++++++ .../keyvaluestore/model/KeyValueEntry.java | 33 +++ .../service/KeyValueService.java | 102 ++++++++ .../keyvaluestore/storage/NodeStorage.java | 28 +++ .../src/main/resources/application-node1.yml | 15 ++ .../src/main/resources/application-node2.yml | 15 ++ .../src/main/resources/application-node3.yml | 15 ++ 25 files changed, 1010 insertions(+), 11 deletions(-) create mode 100644 key_value/.gitignore create mode 100644 key_value/New Text Document.txt create mode 100644 key_value/README.md create mode 100644 key_value/build.gradle.kts create mode 100644 key_value/gradle/wrapper/gradle-wrapper.jar create mode 100644 key_value/gradle/wrapper/gradle-wrapper.properties create mode 100644 key_value/gradlew create mode 100644 key_value/gradlew.bat create mode 100644 key_value/index.html create mode 100644 key_value/settings.gradle.kts create mode 100644 key_value/src/main/java/com/example/KeyValueStoreApplication.java create mode 100644 key_value/src/main/java/com/example/keyvaluestore/config/NodeConfig.java create mode 100644 key_value/src/main/java/com/example/keyvaluestore/controller/KeyValueController.java create mode 100644 key_value/src/main/java/com/example/keyvaluestore/model/KeyValueEntry.java create mode 100644 key_value/src/main/java/com/example/keyvaluestore/service/KeyValueService.java create mode 100644 key_value/src/main/java/com/example/keyvaluestore/storage/NodeStorage.java create mode 100644 key_value/src/main/resources/application-node1.yml create mode 100644 key_value/src/main/resources/application-node2.yml create mode 100644 key_value/src/main/resources/application-node3.yml diff --git a/eej_rate_limiter/Dockerfile b/eej_rate_limiter/Dockerfile index f943e9f..efd2640 100644 --- a/eej_rate_limiter/Dockerfile +++ b/eej_rate_limiter/Dockerfile @@ -1,4 +1,4 @@ -FROM arm64v8/openjdk:17-ea-16-jdk +FROM openjdk:17-jdk ARG DEPENDENCY=build/dependency diff --git a/eej_rate_limiter/docker-compose.yml b/eej_rate_limiter/docker-compose.yml index dc11769..1262c78 100644 --- a/eej_rate_limiter/docker-compose.yml +++ b/eej_rate_limiter/docker-compose.yml @@ -2,7 +2,7 @@ version: '3.8' services: redis: - image: arm64v8/redis:7.4-bookworm # ARM64-compatible Redis + image: redis:7.4-bookworm container_name: redis ports: - "6379:6379" diff --git a/eej_rate_limiter/src/main/java/com/enjoy/ds/ratelimiter/core/RateLimiterRuleService.java b/eej_rate_limiter/src/main/java/com/enjoy/ds/ratelimiter/core/RateLimiterRuleService.java index bd7a251..bcb091f 100644 --- a/eej_rate_limiter/src/main/java/com/enjoy/ds/ratelimiter/core/RateLimiterRuleService.java +++ b/eej_rate_limiter/src/main/java/com/enjoy/ds/ratelimiter/core/RateLimiterRuleService.java @@ -1,9 +1,8 @@ package com.enjoy.ds.ratelimiter.core; +import com.enjoy.ds.ratelimiter.core.model.APIRule; import java.util.Map; import java.util.concurrent.TimeUnit; - -import com.enjoy.ds.ratelimiter.core.model.APIRule; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; diff --git a/eej_rate_limiter/src/main/java/com/enjoy/ds/ratelimiter/model/User.java b/eej_rate_limiter/src/main/java/com/enjoy/ds/ratelimiter/model/User.java index 69175a6..f6d28e0 100644 --- a/eej_rate_limiter/src/main/java/com/enjoy/ds/ratelimiter/model/User.java +++ b/eej_rate_limiter/src/main/java/com/enjoy/ds/ratelimiter/model/User.java @@ -14,7 +14,10 @@ public class User { private String password; // Store hashed passwords! private String role; // e.g., "ROLE_USER", "ROLE_ADMIN" - public static User copy(User original) { + public User(UUID uuid, String admin, String s, String admin1) { + } + + public static User copy(User original) { return new User(original.id, original.username, original.password, original.role); } } diff --git a/eej_rate_limiter/src/main/java/com/enjoy/ds/ratelimiter/utils/SearchingUtil.java b/eej_rate_limiter/src/main/java/com/enjoy/ds/ratelimiter/utils/SearchingUtil.java index ed1bf80..40c33d7 100644 --- a/eej_rate_limiter/src/main/java/com/enjoy/ds/ratelimiter/utils/SearchingUtil.java +++ b/eej_rate_limiter/src/main/java/com/enjoy/ds/ratelimiter/utils/SearchingUtil.java @@ -2,9 +2,7 @@ import java.util.List; import java.util.Objects; - import lombok.NonNull; -import org.springframework.security.core.parameters.P; public class SearchingUtil { public static int searchMaximumElementLowerThan( @@ -20,15 +18,15 @@ public static int searchMaximumElementLowerThan( while (left < right) { int mid = left + (right - left) / 2; - if(timestamps.get(mid) >= timestamp){ + if (timestamps.get(mid) >= timestamp) { right = mid; - } else if(timestamps.get(mid) < timestamp) { + } else if (timestamps.get(mid) < timestamp) { res = mid; left = mid + 1; } } - if(res != -1 && Objects.equals(timestamps.get(res), timestamp)){ + if (res != -1 && Objects.equals(timestamps.get(res), timestamp)) { return -1; } diff --git a/eej_rate_limiter/src/test/java/com/enjoy/ds/ratelimiter/PostControllerTest.java b/eej_rate_limiter/src/test/java/com/enjoy/ds/ratelimiter/PostControllerTest.java index a888e45..abbcbf5 100644 --- a/eej_rate_limiter/src/test/java/com/enjoy/ds/ratelimiter/PostControllerTest.java +++ b/eej_rate_limiter/src/test/java/com/enjoy/ds/ratelimiter/PostControllerTest.java @@ -4,8 +4,8 @@ import static org.mockito.Mockito.when; import com.enjoy.ds.ratelimiter.cache.RedisService; -import com.enjoy.ds.ratelimiter.core.model.APIRule; import com.enjoy.ds.ratelimiter.core.RateLimiterRuleService; +import com.enjoy.ds.ratelimiter.core.model.APIRule; import com.enjoy.ds.ratelimiter.model.Post; import java.time.Duration; import java.time.temporal.ChronoUnit; diff --git a/key_value/.gitignore b/key_value/.gitignore new file mode 100644 index 0000000..b63da45 --- /dev/null +++ b/key_value/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/key_value/New Text Document.txt b/key_value/New Text Document.txt new file mode 100644 index 0000000..e69de29 diff --git a/key_value/README.md b/key_value/README.md new file mode 100644 index 0000000..a78fe51 --- /dev/null +++ b/key_value/README.md @@ -0,0 +1,39 @@ +Distributed Key-Value Store Project +This project implements a distributed key-value store inspired by Chapters 5 (Sharding) and 6 (Data Partitioning and Replication) of System Design Interview: An Insider's Guide by Alex Xu. It is designed as a hands-on learning tool for system design concepts, particularly for junior-level interview preparation. The system runs three nodes on ports 8080, 8081, and 8082, using sharding to distribute data and timestamp-based versioning for conflict resolution. +Overview +The application is built with Java 17, Spring Boot, and Gradle, featuring a web-based interface to interact with the distributed store. Users can add and delete key-value pairs, with the data dynamically displayed across the nodes. The project emphasizes scalability, availability, and eventual consistency, aligning with distributed system design principles. +Current Implementation +Key Features + +Sharding: Data is partitioned across three nodes using a simple hash-based sharding function (hash(key) % 3). +Versioning: Timestamps ensure last-write-wins conflict resolution for concurrent updates. +Distributed Architecture: Nodes communicate via HTTP to forward requests to the appropriate shard. + +File Purposes + +build.gradle.kts: Configures the Gradle build with Java 17 and Spring Boot dependencies. Ensures the project compiles and runs with the defined version (0.0.1-SNAPSHOT). +KeyValueStoreApplication.java: The main entry point that launches three nodes in separate threads on ports 8080, 8081, and 8082 (will do the dynamic node set-up later). Includes port availability checks and error handling for robust startup. +KeyValueEntry.java: Defines the data model for key-value pairs, including a timestamp for versioning. +NodeStorage.java: Manages in-memory storage for each node, providing methods to put, get, delete, and list key-value entries. +NodeConfig.java: Holds configuration details for each node (ID, port, and list of all nodes) for distributed communication. +KeyValueService.java: Implements the business logic, computing shard IDs, handling PUT, GET, and DELETE operations, and forwarding requests to the correct node. +KeyValueController.java: Exposes REST endpoints (/api/kv/put, /api/kv/get, /api/kv/delete, /api/kv/list) to interact with the service, with CORS support and detailed error handling. +index.html: + +Build and Run: +Run gradle build to compile. +Access the interface at http://localhost:8080/. + + +Usage: +Add a key-value pair (e.g., key: user123, value: Alice) via the Computer section. +Delete a key and observe updates in the node tables and log. +Check the action log for results or errors. + + + +Future Directions + +Replication: Implement data replication across nodes for fault tolerance (Chapter 6), ensuring data availability if a node fails. +Consistent Hashing: Replace the current modulo-based sharding with consistent hashing to reduce rehashing costs during node additions/removals (Chapter 5). +ance learning and interview readiness. diff --git a/key_value/build.gradle.kts b/key_value/build.gradle.kts new file mode 100644 index 0000000..2cb0ef2 --- /dev/null +++ b/key_value/build.gradle.kts @@ -0,0 +1,34 @@ +plugins { + id("org.springframework.boot") version "3.2.5" + id("io.spring.dependency-management") version "1.1.4" + java + id("org.jetbrains.kotlin.jvm") version "1.9.22" apply false // Optional, for Kotlin compatibility +} + +group = "com.example" +version = "0.0.1-SNAPSHOT" + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +repositories { + mavenCentral() +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("com.fasterxml.jackson.core:jackson-databind:2.15.2") + testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation(platform("org.junit:junit-bom:5.10.0")) + testImplementation("org.junit.jupiter:junit-jupiter") +} + +tasks.withType { + useJUnitPlatform() +} + +tasks.bootJar { + archiveFileName.set("distributed-key-value-store.jar") +} \ No newline at end of file diff --git a/key_value/gradle/wrapper/gradle-wrapper.jar b/key_value/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..249e5832f090a2944b7473328c07c9755baa3196 GIT binary patch literal 60756 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +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 + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/key_value/gradlew.bat b/key_value/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/key_value/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/key_value/index.html b/key_value/index.html new file mode 100644 index 0000000..cc35674 --- /dev/null +++ b/key_value/index.html @@ -0,0 +1,85 @@ + + + + + + Key-Value Store Demo + + + +

Distributed Key-Value Store

+ +
+

Put Key-Value Pair

+
+
+
+ +
+ +
+

Get Value

+
+ +
+ +
+

Delete Key

+
+ +
+ +
Response will appear here
+ + + + \ No newline at end of file diff --git a/key_value/settings.gradle.kts b/key_value/settings.gradle.kts new file mode 100644 index 0000000..413f0e7 --- /dev/null +++ b/key_value/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "key_value" \ No newline at end of file diff --git a/key_value/src/main/java/com/example/KeyValueStoreApplication.java b/key_value/src/main/java/com/example/KeyValueStoreApplication.java new file mode 100644 index 0000000..14e27f7 --- /dev/null +++ b/key_value/src/main/java/com/example/KeyValueStoreApplication.java @@ -0,0 +1,99 @@ +package com.example; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.web.client.RestTemplate; + +import java.net.BindException; +import java.net.ServerSocket; +import java.util.Arrays; +import java.util.List; + +@SpringBootApplication +public class KeyValueStoreApplication { + private static final Logger logger = LoggerFactory.getLogger(KeyValueStoreApplication.class); + + public static void main(String[] args) { + // Define node configurations + List nodeConfigs = Arrays.asList( + new NodeConfig(0, 8080), + new NodeConfig(1, 8081), + new NodeConfig(2, 8082) + ); + + // Check port availability before starting nodes + for (NodeConfig config : nodeConfigs) { + if (!isPortAvailable(config.port)) { + logger.error("Port {} is already in use. Cannot start node {}. Please free the port or change the configuration.", config.port, config.id); + System.exit(1); + } + } + + // Start each node in a separate thread with a delay + for (NodeConfig config : nodeConfigs) { + new Thread(() -> { + try { + logger.info("Starting node {} on port {}", config.id, config.port); + new SpringApplicationBuilder(KeyValueStoreApplication.class) + .properties( + "server.port=" + config.port, + "node.id=" + config.id, + "node.port=" + config.port, + "node.nodes[0].id=0", + "node.nodes[0].host=localhost", + "node.nodes[0].port=8080", + "node.nodes[1].id=1", + "node.nodes[1].host=localhost", + "node.nodes[1].port=8081", + "node.nodes[2].id=2", + "node.nodes[2].host=localhost", + "node.nodes[2].port=8082" + ) + .run(args); + logger.info("Node {} started on port {}", config.id, config.port); + } catch (Exception e) { + logger.error("Failed to start node {} on port {}: {}", config.id, config.port, e.getMessage(), e); + System.exit(1); + } + }).start(); + try { + Thread.sleep(1000); // Delay to avoid race conditions + } catch (InterruptedException e) { + logger.error("Interrupted while starting node {}", config.id, e); + System.exit(1); + } + } + } + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + // Temporary class for node configuration + private static class NodeConfig { + int id; + int port; + + NodeConfig(int id, int port) { + this.id = id; + this.port = port; + } + } + + private static boolean isPortAvailable(int port) { + try (ServerSocket socket = new ServerSocket(port)) { + socket.setReuseAddress(true); + return true; + } catch (BindException e) { + return false; + } catch (Exception e) { + logger.error("Error checking port {} availability: {}", port, e.getMessage(), e); + return false; + } + } +} \ No newline at end of file diff --git a/key_value/src/main/java/com/example/keyvaluestore/config/NodeConfig.java b/key_value/src/main/java/com/example/keyvaluestore/config/NodeConfig.java new file mode 100644 index 0000000..5f628d6 --- /dev/null +++ b/key_value/src/main/java/com/example/keyvaluestore/config/NodeConfig.java @@ -0,0 +1,68 @@ +package com.example.keyvaluestore.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +@Configuration +@ConfigurationProperties(prefix = "node") +public class NodeConfig { + private int id; + private int port; + private List nodes; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public List getNodes() { + return nodes; + } + + public void setNodes(List nodes) { + this.nodes = nodes; + } + + public static class NodeInfo { + private int id; + private String host; + private int port; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + } +} \ No newline at end of file diff --git a/key_value/src/main/java/com/example/keyvaluestore/controller/KeyValueController.java b/key_value/src/main/java/com/example/keyvaluestore/controller/KeyValueController.java new file mode 100644 index 0000000..390e01a --- /dev/null +++ b/key_value/src/main/java/com/example/keyvaluestore/controller/KeyValueController.java @@ -0,0 +1,94 @@ +package com.example.keyvaluestore.controller; + +import com.example.keyvaluestore.model.KeyValueEntry; +import com.example.keyvaluestore.service.KeyValueService; +import com.example.keyvaluestore.storage.NodeStorage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/kv") +@CrossOrigin(origins = {"http://127.0.0.1:5500", "http://localhost:8080"}, methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.DELETE}) +public class KeyValueController { + + @Autowired + private KeyValueService keyValueService; + + @Autowired + private NodeStorage nodeStorage; + + @PostMapping("/put") + public ResponseEntity put(@RequestParam String key, @RequestParam String value, @RequestParam long timestamp) { + try { + return keyValueService.put(key, value, timestamp); + } catch (IllegalArgumentException e) { + Map errorResponse = new HashMap<>(); + errorResponse.put("timestamp", new java.util.Date().toString()); + errorResponse.put("status", 400); + errorResponse.put("error", "Bad Request"); + errorResponse.put("message", "Invalid timestamp value: " + e.getMessage()); + errorResponse.put("path", "/api/kv/put"); + return ResponseEntity.badRequest().body(errorResponse); + } + } + + @GetMapping("/get") + public ResponseEntity get(@RequestParam String key) { + try { + return keyValueService.get(key); + } catch (IllegalArgumentException e) { + Map errorResponse = new HashMap<>(); + errorResponse.put("timestamp", new java.util.Date().toString()); + errorResponse.put("status", 400); + errorResponse.put("error", "Bad Request"); + errorResponse.put("message", "Invalid key: " + e.getMessage()); + errorResponse.put("path", "/api/kv/get"); + return ResponseEntity.badRequest().body(errorResponse); + } + } + + @DeleteMapping("/delete") + public ResponseEntity delete(@RequestParam String key) { + try { + return keyValueService.delete(key); + } catch (IllegalArgumentException e) { + Map errorResponse = new HashMap<>(); + errorResponse.put("timestamp", new java.util.Date().toString()); + errorResponse.put("status", 400); + errorResponse.put("error", "Bad Request"); + errorResponse.put("message", "Invalid key: " + e.getMessage()); + errorResponse.put("path", "/api/kv/delete"); + return ResponseEntity.badRequest().body(errorResponse); + } + } + + @GetMapping("/list") + public ResponseEntity list() { + try { + List> entries = nodeStorage.getStore().values().stream() + .map(entry -> { + Map map = new HashMap<>(); + map.put("key", entry.getKey()); + map.put("value", entry.getValue()); + map.put("timestamp", entry.getTimestamp()); + return map; + }) + .collect(Collectors.toList()); + return ResponseEntity.ok(entries); + } catch (Exception e) { + Map errorResponse = new HashMap<>(); + errorResponse.put("timestamp", new java.util.Date().toString()); + errorResponse.put("status", 500); + errorResponse.put("error", "Internal Server Error"); + errorResponse.put("message", "Failed to list entries: " + e.getMessage()); + errorResponse.put("path", "/api/kv/list"); + return ResponseEntity.status(500).body(errorResponse); + } + } +} \ No newline at end of file diff --git a/key_value/src/main/java/com/example/keyvaluestore/model/KeyValueEntry.java b/key_value/src/main/java/com/example/keyvaluestore/model/KeyValueEntry.java new file mode 100644 index 0000000..a589b6e --- /dev/null +++ b/key_value/src/main/java/com/example/keyvaluestore/model/KeyValueEntry.java @@ -0,0 +1,33 @@ +package com.example.keyvaluestore.model; + +public class KeyValueEntry { + private String key; + private String value; + private long timestamp; + + public KeyValueEntry(String key, String value, long timestamp) { + this.key = key; + this.value = value; + this.timestamp = timestamp; + } + + public String getKey() { + return key; + } + + public String getValue() { + return value; + } + + public long getTimestamp() { + return timestamp; + } + + public void setValue(String value) { + this.value = value; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } +} \ No newline at end of file diff --git a/key_value/src/main/java/com/example/keyvaluestore/service/KeyValueService.java b/key_value/src/main/java/com/example/keyvaluestore/service/KeyValueService.java new file mode 100644 index 0000000..264025d --- /dev/null +++ b/key_value/src/main/java/com/example/keyvaluestore/service/KeyValueService.java @@ -0,0 +1,102 @@ +package com.example.keyvaluestore.service; + +import com.example.keyvaluestore.config.NodeConfig; +import com.example.keyvaluestore.model.KeyValueEntry; +import com.example.keyvaluestore.storage.NodeStorage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +@Service +public class KeyValueService { + private static final Logger logger = LoggerFactory.getLogger(KeyValueService.class); + + @Autowired + private NodeStorage nodeStorage; + + @Autowired + private NodeConfig nodeConfig; + + @Autowired + private RestTemplate restTemplate; + + public ResponseEntity put(String key, String value, long timestamp) { + int targetNodeId = computeShardId(key); + logger.info("Processing put for key {} on node {}", key, targetNodeId); + if (targetNodeId == nodeConfig.getId()) { + KeyValueEntry existing = nodeStorage.get(key); + if (existing == null || existing.getTimestamp() <= timestamp) { + nodeStorage.put(key, value, timestamp); + logger.info("Stored key {} on node {}", key, targetNodeId); + return ResponseEntity.ok("Stored successfully on node " + targetNodeId); + } + logger.warn("Rejected put for key {} due to older timestamp {}", key, timestamp); + return ResponseEntity.status(HttpStatus.CONFLICT).body("Older timestamp rejected"); + } else { + NodeConfig.NodeInfo targetNode = findNodeById(targetNodeId); + String url = String.format("http://%s:%d/api/kv/put?key=%s&value=%s×tamp=%d", + targetNode.getHost(), targetNode.getPort(), key, value, timestamp); + logger.info("Forwarding put for key {} to node {} at {}", key, targetNodeId, url); + return restTemplate.postForEntity(url, null, String.class); + } + } + + public ResponseEntity get(String key) { + int targetNodeId = computeShardId(key); + logger.info("Processing get for key {} on node {}", key, targetNodeId); + if (targetNodeId == nodeConfig.getId()) { + KeyValueEntry entry = nodeStorage.get(key); + if (entry != null) { + logger.info("Retrieved key {} from node {}", key, targetNodeId); + return ResponseEntity.ok(entry.getValue()); + } + logger.warn("Key {} not found on node {}", key, targetNodeId); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Key not found"); + } else { + NodeConfig.NodeInfo targetNode = findNodeById(targetNodeId); + String url = String.format("http://%s:%d/api/kv/get?key=%s", + targetNode.getHost(), targetNode.getPort(), key); + logger.info("Forwarding get for key {} to node {} at {}", key, targetNodeId, url); + return restTemplate.getForEntity(url, String.class); + } + } + + public ResponseEntity delete(String key) { + int targetNodeId = computeShardId(key); + logger.info("Processing delete for key {} on node {}", key, targetNodeId); + if (targetNodeId == nodeConfig.getId()) { + boolean deleted = nodeStorage.delete(key); + if (deleted) { + logger.info("Deleted key {} from node {}", key, targetNodeId); + return ResponseEntity.ok("Deleted successfully"); + } + logger.warn("Key {} not found on node {}", key, targetNodeId); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Key not found"); + } else { + NodeConfig.NodeInfo targetNode = findNodeById(targetNodeId); + String url = String.format("http://%s:%d/api/kv/delete?key=%s", + targetNode.getHost(), targetNode.getPort(), key); + logger.info("Forwarding delete for key {} to node {} at {}", key, targetNodeId, url); + restTemplate.delete(url); + return ResponseEntity.ok("Deleted successfully"); + } + } + + private int computeShardId(String key) { + return Math.abs(key.hashCode() % nodeConfig.getNodes().size()); + } + + private NodeConfig.NodeInfo findNodeById(int id) { + return nodeConfig.getNodes().stream() + .filter(node -> node.getId() == id) + .findFirst() + .orElseThrow(() -> { + logger.error("Node {} not found", id); + return new RuntimeException("Node not found"); + }); + } +} \ No newline at end of file diff --git a/key_value/src/main/java/com/example/keyvaluestore/storage/NodeStorage.java b/key_value/src/main/java/com/example/keyvaluestore/storage/NodeStorage.java new file mode 100644 index 0000000..731d153 --- /dev/null +++ b/key_value/src/main/java/com/example/keyvaluestore/storage/NodeStorage.java @@ -0,0 +1,28 @@ +package com.example.keyvaluestore.storage; + +import com.example.keyvaluestore.model.KeyValueEntry; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class NodeStorage { + private final Map store = new HashMap<>(); + + public void put(String key, String value, long timestamp) { + store.put(key, new KeyValueEntry(key, value, timestamp)); + } + + public KeyValueEntry get(String key) { + return store.get(key); + } + + public boolean delete(String key) { + return store.remove(key) != null; + } + + public Map getStore() { + return store; + } +} \ No newline at end of file diff --git a/key_value/src/main/resources/application-node1.yml b/key_value/src/main/resources/application-node1.yml new file mode 100644 index 0000000..d19d7b8 --- /dev/null +++ b/key_value/src/main/resources/application-node1.yml @@ -0,0 +1,15 @@ +server: + port: 8080 +node: + id: 0 + port: 8080 + nodes: + - id: 0 + host: localhost + port: 8080 + - id: 1 + host: localhost + port: 8081 + - id: 2 + host: localhost + port: 8082 \ No newline at end of file diff --git a/key_value/src/main/resources/application-node2.yml b/key_value/src/main/resources/application-node2.yml new file mode 100644 index 0000000..566568b --- /dev/null +++ b/key_value/src/main/resources/application-node2.yml @@ -0,0 +1,15 @@ +server: + port: 8081 +node: + id: 1 + port: 8081 + nodes: + - id: 0 + host: localhost + port: 8080 + - id: 1 + host: localhost + port: 8081 + - id: 2 + host: localhost + port: 8082 \ No newline at end of file diff --git a/key_value/src/main/resources/application-node3.yml b/key_value/src/main/resources/application-node3.yml new file mode 100644 index 0000000..a1d348e --- /dev/null +++ b/key_value/src/main/resources/application-node3.yml @@ -0,0 +1,15 @@ +server: + port: 8082 +node: + id: 2 + port: 8082 + nodes: + - id: 0 + host: localhost + port: 8080 + - id: 1 + host: localhost + port: 8081 + - id: 2 + host: localhost + port: 8082 \ No newline at end of file From e4381b7eb52864dbf081e2a3d785c128ae87510b Mon Sep 17 00:00:00 2001 From: Vo Huu Luan <119402962+Soar06@users.noreply.github.com> Date: Mon, 5 May 2025 22:15:09 +0700 Subject: [PATCH 2/2] README_update This shows how the index.html should appear when functioning correctly --- key_value/README.md | 1 + key_value/img.png | Bin 0 -> 64472 bytes 2 files changed, 1 insertion(+) create mode 100644 key_value/img.png diff --git a/key_value/README.md b/key_value/README.md index a78fe51..c071d78 100644 --- a/key_value/README.md +++ b/key_value/README.md @@ -37,3 +37,4 @@ Future Directions Replication: Implement data replication across nodes for fault tolerance (Chapter 6), ensuring data availability if a node fails. Consistent Hashing: Replace the current modulo-based sharding with consistent hashing to reduce rehashing costs during node additions/removals (Chapter 5). ance learning and interview readiness. +![img.png](img.png) \ No newline at end of file diff --git a/key_value/img.png b/key_value/img.png new file mode 100644 index 0000000000000000000000000000000000000000..e09d953dd71dbc2f45a1d7b8e8c04b6fdbb309ad GIT binary patch literal 64472 zcmeFZXH?VM);G%5jVK7H^coeF-ley#D5wZX57LBCL|W*bY&K2$Mg$ZBs0fJENUxzt zLJhr03!&H0TY%*LgPwiP^Njby{c_*?<&42#KvtV`u33I_&IOUrwA5*-*{LZgC}L*l1wfCY-4 zRFWoobjn#jg7LrNCds||OyoNOJd6j<;Sc6V2NR?srB!f zl3D+G-249?M;6roQJC-Bqj94}W|l@8i`-KT`-(MJ;_7|mO@mzIB(U|9w1EOI`=|KJ{ zxqV0GZA02+o^H$xDZ+z7O#7EZ3=aE4l0}*AhkxtL1>sXSD zIO+W%4;OQ|W!Z|P0zdiM#v1|0TaygP=3#wjHmt0$iZt)~5OXNOYhG7d%UD$JCA2oF zRL4!fZ{hIM$0^R{1tcSCmOoU6q>TUw!J}y49BS|*V&rSfhCwBAmyS+$7X5)hf)2_IK&Mqcd z|4EeQQ^xKb{b^J7vfLTlu{noVImtRO^>T-&O0$ZG7P3?9qEos`iiufV=H6uMeRxZ}(8T6o1A%(eXs71u+a1(#ZR zsQAuVS8>0um`OSu$n+bi8$=W+CC};asN7Xp z**X#6Q|A*lbDXCAO-*zd9rZkNZ^AKaezPfCFJzv!yp?RnePNq}oh&Wg+MPT3?32l^ zEIV10f4cp4rvY!TKJGI(Uvk)4ikrisTQVXRrD1xG4t-eB47wET>i*}=ZGV=Qyj+&% zsgFl^VtS$J&QD#FVA}vIGcQEB3T*-pnZ_)!HS{Rc>gCkgJj^Bw= zk4IL3(<^4IWCKeG<7O}quT`0c0Ri%g<{2)QllhNFG-Ecb?>SCy&+I`fnp~Hy5?#kW zH6BgxV?#~2M7d(|ytQ;;r5Z!_`Q|j}#SY}8!5GY)yLk9y*S6|#+a1?7eW<8XcOrr= z1ZNg<@g`%DS28$u(Wokp-PS2l6&4K9lTcM6Zyq0t2C>N-(ZcN67U8$Nul_0 z?MHwo6Fv)jfI}0-#|cU&$6AC=F~!v})xI8gd#^FloL781nU-b5tiAW>@mg4kk9QO$rdFmU?|g#2A?NPKs*K={<4S*z zb~aK+cIK5rfY@$qizY*B){>9Nd%pV%zJ;Eje4f|Y?%U1VtJj~bJ-Zs%qJ*0h%^#Sm zt!153ly~Ngt&z}LrFK^mhAyy)PM%CtA=Wv40855ve@I>SF{nDZSGBn|RZ_d1R^?6= z7eND3UyyVx=(%t_+FdhZ$bxMY>9G?t=O`YZKJi_#TfWH;IH78$v#|fZ{jhb?8X=CG zS*1zxWkh8Lyh3!1@s6Sn0avh6Z`-Lg{-N=x_#jvGZc4+XOvM)|Tcrc;KmkSbpeF^W zdR~!;?2bBzirX5&w*d9arwjocNrC-9=uSlQk0-Dc(;Ch=lI2|GC2vrG0H=Q$VS~P| z(b!}{Xg>+x+TB_i_c?ltpS0;y#mV1g26NT+9CL+y0Y{8FScBxRiQM(su8QnCqK7NE z7D}v#dyArJD*CK+0!f2@)B08K{q7e_~i8cNnSj(g(9s$7(96JAH8WEmC1OYKVZ|KZ z-(_Y8x=kPO?VnvS^b1Ks1wvsm^y)zatxHwTc78&G0V5Tgh*2MV+x0}$Yz))FHOlIh z21Un{OPy-iHpf>pm-@zB?C+RY*DkiMXtK*7LF3-3Cj5UCroHR||F+$SUM|x>I5b_#2s2wU6$_REEc^$48X5R;n3MU)&o)NSqQJq(&A4U3|q&N%ZKJsTy7z z5IA_J8oILlK!whCu8{6wMD0lP)~KEZ5Dp;4PRyanDh=>}+a5L`O-8|4h+p^1E!W-0 zi-l?6;=xthjcjvm4z~PE^Vcx&Y0(-SEGdGh1(gLWuevWKwp*H2@e$^UKHk;e)_ipGeK`t6 zc=xRJ3GGO?k5cu*d*dLN(g(q}@F2tUNW@)lMN^U3`uWN@{oMTJ*`+G~TifiT!tB_oL5I>b znD*V8`aEKlzp&!LBkP8|S@4W3`#AE`I(PstsCIxpJeggu+}rB^(L@|w*qg|bK9PP| z7PvC*!7t5y0RvmT4}Ri!+#k=NjiL)It`15chO1n|6tVCdal+lhE5-N5<_G0&xpqaT ztB{>@(OKRhk+^mLdG@F*=6l!?IQYYs1cb#)FDzK(AAvZ`^QX`t&Z)P*)X9Iy(HiZo zDpJn|t67W3gtzvWZ8_y(i9TtqG`E(Q2RdI@Xs>a+UcE#8C<*b_hrP<@jmTbXf3pwA zdTLOx`}9N~P5G+wE1i>K4A1jt#@@@0vicc8MxTorwC@@cKG-T*6$ej#>*Ias-5Q;z z63sF^8S?oCV_^7CxyFY&?8)rCnV*bi8=b(@&>lorl z+zRTDFt3;aoC(1slJ|O=EbLaDvG++#g|=CmIXy4wgW_q?5X7+HPuaP0hJ?SMYlqxs zxkGz?_7gG@S;$ESEuyFO*xsI>^0wLJlH3^>&iMx(wnj5Z-4W?Ri^fQsE{JM}DS*cW+vXy!m zv$UIM^F8xZw2EuxGC+n=bn-a=R_y4UUvV1y2!jw5Pa6ApIAC78(661DtjXvTUuRGW zYR&YEjon*XHG_mLzx2;RwHOxqYC7dLGH|IPtn{d6PbYTHEuQBVHQ66X!_9P}n`bS? z%#5eNs|^DjPMN9Fn!84IVpD6C$FSaMwan&iaS@rr%NA9?3lufbA7zR=t&(@@ zI%7LlaGwb^;#y(`l7<)A9?v>4^Zz}ll?hh+^hKA8B}=Umg7>MCR_vy~Iq+cY^Q*cg z`Mh(BQw%9B{q@;CeKk;Go-Gy~%`E(iQ0UAB2}@ea56chx{?dX=(JbAAM$v)85 zNI`NYtLCn&qXI`YXR>k~w@8DR1n2Sglo*R|P5A*OhDym?qNZ;5URBVthpey1jWs9m z=2K-?Ko%ZpY8FOy4jYHOf`DaUZ)#^6q1-&uFQCIW&=%wM_I1;oD%i_xTp{kb!=9T1 zPS()1^^l)IOh`hTA6j3n&^fj&i?uI3x^yAJuSlcO*r{FMn?+cedix zU&wq{l-RemJ#EVGlcBkn}#Y1Y!dBh^70K4h%D(f_j@9ynf z?RRVOgAT7`(CT$&4#N(uWR#wWYXjZ&w<>v6N2@o^IgXrx$Rk_|(^#pJj(BrcZLLgr zaV{d^voNrEra@*6<9p?r$z|!-gL^ycvE1i77DJZg9})_zW=4nl)E2qP<`MkUJm#3G z?N!x82k}n=OAA{h$Ur?MD%VZ7IN&MSAA&2-ok4S|FXVUSlx#x$>(!6zo>!OtMM1+%q-SI z&YWyPh4<4uvrc=59{k2jD4SaV7!Tasqgl??9*>DgB|fUp@$$5IQg^4!xgIYZ7OmZ5 z1S`ekt4j_5SKuy+WD~)HsaZaq!e6$0mqzaw11@C0(34^Ig9Pcj$K+E-2L>wiX?821 zH%9}wxq)8^Q%hEHCikiZ8adCYl&n^%FqyNZ{L;;of1-l{9&);pGJlk$$yqDU?j-sj z&VwwS)v0<;Qn=Z6^CokOFMwl++g7rtR<2F8O@cS{uzyCI%W4(we9fa7(-fUnkA6N+ zGbV@{e>pO+d>>P@j;a$j%E@1b>xQRFymk< zI~Ps7qLIlL(YmE&MJZDxzA)dVZFx!6>Xu8 zK|6PWrHD!+K(bs40Im3ZWc0rK%DaTo1+aor@2U6AS)018iZmK@v3{S+K6(nM#0}14!#SV=0@QxqXj`LcraW8cU#jHBu|;k% zujei`7)V~gmyg1D@0z3DD^`AXeje$2yJ2I4bZ@Ten$y7G){6NzBsZ+E>A-{mSr~9! zzAjJeyS2Q%;Uy)D`WtYJ^oGBXy7?oA=lahHN9`plx^D%Zs!*1f+YGY@e!Amo*+Awx z_&S+uVXp_Gvgq-bYX{6K^;hD)6L<{&j&>$}C=B9!zY&#pU*}U`V&|iB*ON<)KF4Ld z_zy~ub+^Orj!Kb;SXid3QJs>>Sb)&mr;46cgyWRv?w5UH#In(e7YhBwR_iZz?eR*u zUZebVR+92Yh`2FdwDCw~dCRZ`_?0T8*AgI)NMC-e``-zXNSx~m$s^{2U;&dw1w{3$l&!n%}2hFABiVC(K=C(gigP$O|^XTuyb z*X3@gwX?_?5Y0IK2|yqwx>Z$IF(wN_T;xm-{X835Yd95<`spqR5gGF*%o`5TFKC^V znZKf!K+1RP|BGB7z5(ry|ERRp+4;@T|{#N#dKeMsqpK6#b+$ayo%0}$sW z-X8koowSd$CR>x3nMfkJPB=(3foBSI){GE*3|Lio2Lm*`r~Bh)1Fs5SS0Bl?N!TuPzy}iUS5vcC6SZaWvl%npJ40O3a0>>p^a=8&Z2;bJrCJ^sBevdVC#1CsDrM|g3{LWzJsI>z9djT;e zu~ixyjyQiO=b53xR`HGA&XkrJ6wyZs9$2w(;qO85EY0AZdmG3^cG20VOm3Ax<@wsf zu?lp4GdVk3()$FYMe6bN7=vgI8PmbI=!m#b8Hh}gV|Jsj=qaP0-eQ>A;-&hO_x4Q^-We$uWklOhzBH>+uT#xmdZ)0=j5G(*Vk=|lXpDBm>G zIhiuDRSa(A{e`dJZ6ywC)i(ONbU7H&e_zx)PP=m_gN{?m;PX^jpA5C+xb^sAM!o6L zHGcWNk@IrS;7^%PdkIJG-UVa28Wz6_SF+Y9q;2 zM_p}{GosPh=uaoxQ*SfC)3#UqBDtE{K5Pfq>mZX~JetpHVO!m3?6b3{Y9ip(tzzab zUaNz!+P%N+K?C=1LAbOgXS(%*isSjEStyg3Sr!(No&t(2M>#LP{?VTuOT&Vd?=QqI z#)ryuVoNyo@m4-NtC6{Ht(41DI2CFt2^&g$(40&!Gf&(e_^K2awvbF#!qe6=wFdTTo!wWK`owXs?{Fxt}|Nz$^di}9A5 z2&g9V58lDR_8e!13Rb-o%$b<6S#c_@@~DXY@L8j4t=-Lq%(65pL6V%y`g3r4^{FT> zb@F}Te=(1^|J;9(j+35c%7q}%d?*2-#54m{9y&Dlq}lt1;Yt7IggdRn2U@Y!d`i!E z-#G`n?|s^T(&ufe138%5oXAd%UQm^;6+xZ4{s?BqoKYkZ{ z3BkbD^;`bx(5>3H3bAT$iD+Kt=-g7?Pz^3E!P}2SFgO2raKm*A4O9xol-a!Ym>QzX z!#=+8Z2jKi5{DH9y@r_UDFAtH{>dGDf6^j*8J3`|7a&>>WIz5>B z9i^d~0#p^_Kwm26!HfG5vx_P(rSbCI#fGLe?}I3vz9&J3U2g8MNvj8!LYJS*?v*pk zcwdf#@qDf!s<%Vt0DqfM zCrXL&*T8kRBpel(97OfjcH$PY^>EcK@exWbPGZo56vKm!#1KRoQ5fx&W0C1M7jWFr zVKXUcba3)xuVc4d1omu_$|z2?^_?Pf1ouKq5}`e zeJF^2}bw(jE!FO=%$ftZ^`Y_+@d}GtzE!A1pTVs>~6A-hM(!^n_K=4Wq%&`CO|FE zQHqhHrM1dgM+fMJ3}}mn@*qa|?0mM9fPq_bwf|ZIB*F-n)9$cYqpxQf*Dde3Gpv29 zJ+Jm8ExUVTj|m$dNZjg>xoUJ0l8E!0J0Ne+p8l&1>ee9=0o3=R-d~NcD`z|+_tPG` z@t!r*9>0Ot0L?vNTf>vAQcLk|6EaP67~P)@S~*XbAec+}2f4WuBkhQ^&LJ$hM{>(M z<6p-gH#tN!1I2r_s8o0QjZ5T24?`>;=_l`UOXe46XTSU(yN_f-fG^B{Te)O8wEwS0 zwX7s1hO})#qycWE%NTPvu(YlLm{bpcPk{Ki|az0q)j$ z(rv-_Z?^nGJz;1vhfP%nHy#63d+9Y_TOHlQjjfuxs!I1NRz$U;6seSPIly0Isk zhkM1adfltUnP|~-6cmkKpWEafPVu{GC%~dO-|}#FfGH?m@bW-@qo9~uyk}Fusa4om z%}pI0&d;9xg$S%zyA^e!H}~NteNv01oNBBd3iu5Cko>((8xxb%63Hyv`LV#y{N$};Zk`>$tB&fJAEbu2qFCa;F>m07zt;aV{Y%@! zhsrD0F53tJZ%}ls$=^@r+Q8LtaBykBh)Lf?(ylhCY&%#ND?nb8L_PvoV`jc}gS@wX z0s{DWyL2cfX&{eLc4Wivcyc3%g)FkS<5U2T>N;~DZ?bq+A8V3nfBlnVJ3%(VT;L9a z2+O&D-JqZt-C{i3^skRGloS+K)X&)LF_bXW;(b0XgdCnt)KTz``6cpEaWAItz8*x`7a^?#3e+@!?dM*J>@0}HYSDO+lwd}QK3|0I4u z3Nr8YiV`z({&S@Zmigc32yE-5z4+fV4S$~EK^rc?OhNGnI~xrJ#dQ@kNkeBQSzync zrz8Je@;_z!Ux|^`^1ll6|Bt;?+6V8v^0CA=l(@8o@D_(3&$p|6AufbD%-i4TF5EyOPOZN)KSwLY%$Qo(vDQ|O9j||CURXsv|jAuOcevhnS!ov`9 z@#`Jw^rB&sym8@S=Rx4`*vFJi;K=lr2e=5xRnFuuj8iMy`3`m%@`(XHlNC}9!-YRh=%4% zNmlI*_d!3Lq`jfa3{sf*O5+sm5@DC|h3MRJN)zJBY!S(URjCr6#EmG(+@W|HR@C$i zwelohVz{0Im(-%lqIyl_WH}pJi{~7pV9OUC=Yu3w?PXaj3{DdT}2!XV9l8^OFow=fuW6y1~_x_b4&J zuz;L}&-$m`yZ1-s1F6GRCrEs7f4`kua8KZU*;rkO{gnj^Kkwb1^bkv&%+!}CGvw7>?hHy-E|cpCDGuexM!N8`(kY%~`G}<| z&TkEiv(h2^ty)8H?{`3j4IOjQZIlK5`MQROGipBBI+m_OuQ-AjF_)1ujux&dlS5Fu z+ozNC-bMA-=wb_IKSCE~`-Lt{_*6f?t4%<=JRqL8F5#k*$(1{F^WCNR1Gdb5*`}aq zmj_bbBQ={b_XzmGn!~1mHY$xVQ&Uk`$LNe#F*2{}C;?29C~bNz%6CQu)nU~AH{$s> zGl}6snPyzux0M20K7iY`esUy7Gs#9X%w}(MNeb%2B$KX4-`D=jk`Lc6V6Ni&Wxt%p z#Jp0sEi!#nuu05I-1f?A{OP`$50BSxi}`jJ#B=E1qD{~*4hI(1D>oF3o_Hrs(i=5M zj$IIa>s5VB+WNkvxDTQ(Hmxm{&+Kst)4=jGaU-`^UUGJJT&j5rqQKG^k zS(LxRNi#<;g(M99D>P67tU{|R^xC1SRB9vM-@!0?0C~MLur7E!5D~*9N2Rj$RQ3S3 z^8SQasDXP>E$cO-yL+h~@CNHY?y#+94P-Zr0q=j1hdNc2hPUbuT&>{`si!5F|1{2a zKy|ER1fh71`sW`AY4)KdI)tm26TNRIQR|wRRVpm1TY#>mS!BJaYO04WKk%*3yzG+e z90cbB6hoLbd7Q_~&dxV=JKe!ZJFcRynSKg%uVtXW*9YarBK14w6kh)TUXw1c@jyqvxfThtPn8Dsc*gY;Sd zdUV6>SBesbzNuSp$05>^!|PByN7gFzOOw>sz~i`ZcVuCv8es8)XBMA8i8-YFyy9Zj zWSw}7+b@@C*1#%rGIMhfCLuJqrASF!KelL6?ryjO$egPE zW3@vbr`t-1<(DZoLzYH7md*&atLwA93FW}kP%+1aGpN)tPLa$sd6LJ!fQ$V@qy;kk z%+f}JdFdi}ElAOuc08*LrM6reZ;||cw^%a{+c&-5W^zX&3HTLn^$}NVIi#P>tr)3G z;qx=rN0`bb#g4$E^-5J62V@m{1}GzE7WSE<@$;GC-L3Bdx0+3c_=*JBOfyh@^7bfx zrc5eVu1u;lK)q`AY6lMyMW^1l^3-7~kU)AM85JYdMb{1vDXiMVWN)JA&7XHakAL`0 zyV_?6cj4Pgg<7)S)1iI1AjDv-00w9tbXh^&$o<5KF8q9?=a;!$utHKUfVjIZlEJdK z7LZ@0xXp*^oN7vh2DYC?4A!|g;&Y3)*fZ&BC? zHKGH(?t-+Pk7yA@J}P>ur25g$J+0%O2*O#DpDO=Bl~4rSv}to+JA+%+6F%jvRCxQ8j8WHb6+ckg0VdDbJ)$OO|uP0SWZVsc5F7`WR)yEh@vl5sM-*i!8sv9Zu;GA(3L7d@rKGrNy~vqGj3+IUFXa>2aH&+Tx?ld2^$x^h?<6T~}l*tdlKAy{0VSKuw= z80&K2#=)%=2$`K-t0b+2^~IOc-zP0CNO5Y=j(E-;QyyPy)umWsBiph;#^XKs+cJ7K z2O;m~YM4SzL7&1Xng>E#J0M}$R0ze7N3`rLj=(DSiy_Gzs(>X%w}J1W*zfGe?%a#3 z8ne7AFi1FA`hyb#^U-bMH9~zx&r~Uafkz;hoYuU zIzHw8y{pfsF3KpgrE2rDt|=VqR_V}5rN0Efef8+*_+nn-QPrQ{ny;5k9UZ=s-SJpX zGYBK?Pb@iTY7}Slnfg?Wh0oW{&>_vEq?7(MkY(%_0K!I^7-_x)o_pX!k-NTQb58wE)H>W+sN%n zNfw_d0;1cD@5if>nTY~&j+#v11nB!ww!PL?1Qiuf z;jgB~WrsTrzcl;pg9X`$hP}GL`4h)!MuOTVWtqsBq%IoG_scO!IsI5fbfFDRT4;XB?QUTw{xE7h*(q4drDO7%teL-oi3L%GAG;kIrUjHcPo0FD(STp3{*NbO1)&X3`1~Z`9CZFX`l@q}NJb0gqKc$} zZWSZ`_)6j5Tf(vZqm`s*KJ$~hYXI};7qS;!>>A`2j@bm6v2%PbF9#5VCEXpffh3xy zdKU_U7P(5WJ|52I0DT^KkkmI~wH`h9POS~xUe_D?z6WeCa60+9(U^OK>`VSYv7a7e zy1_$E;7Vd`7QeL+n_yFY)9B%Id+tb%bJBeA-ej!T`wRVK6)%FTqjOHubj40ibY&A# z?P9ju?Xf$!l@2re`70h`b=&#d@gw}&3N>2uBbImf1&a-pGbS@$J&R+>PJQNl>@n^| z8%_iB=BL4QD+!_i54hgmWQmiBNasLFuo z+}NOs8={X0vM}BdY1%ZL$FzoEs~MdOC+xjdCiu<0^`4{q6t1M5X@N%?#Rv5>SBl&3 z0DA`!?$0M#^^LeoeVW)`u1G>Wag09G1WjtVX5}RcztEVZcXlyO83;USr+(<>^682< z_kq&Zlg^Rp0?Bi(rr z*-?iw8_lCpPudc{D2C)By1ri+H&vgf>tsj~(Dv5PVG9ygv#FnjWK|SS1=@SSqUx=3 z6uX<6V8Fvv1P=VFswg)1{GZ%?WMgkx{hM&Wy0@5NZ&NU?BBx`IoUzh4nlW@wt$aLh znyHI=qCHRxu8F_?mZvr4S-xq57v3h9WsGQNg3=qLS>qgL7slZ^gzku?)dxZTBAi^t!`ELF!q6Wi zv;Y{WE)jTCgzR<+(%)z-2&f7Q^KPc$@tzirnF#jYtIgVZ9b}OeAY(6JT7jpbc&AJb z4N`SX&C3>h&|17!I$NG>jS!)bFhk zrFcPT0}IEEC%KR8w}JTuv{ftoXq|VYmpw3=Kj+flg$Os8`OfS#%JhUDq+K`~4*ZQ` zAonbw3Pb6tq-2eg%}EAcw^$9eJ|y_k>4~5m;c#W@;-G9>Ii5jn6T0wrm+OjGR#Y7n z*mp?ZZ41kMf4(Kkn{zb4)OCR6X@pW@2-S@%e_LZ7ykoT7u7Tc?~NvyF+LXUb# z7)EKGPX1yOvLM$5KrZj8OLoMQZ0Jl{D?+Vvqlzh6oUK{wM zJSqo{xT)=p-mkKeE$UOp#{`CFKl&Jq_P!e)5TbTh8SzH= zn&`|&Eu-hnMDiT5TnzuQ^@#7=Z({8jqDAJ z2_Rt_u$KEs0NF(J3||8kcF$>I8K!Nq+Lt(|flyhq^%BpdZoX-HhIluhtn zE-@K^hSw#Am$2RsP&GSVHe6q^+A)e($5$?Cu?b44t>(qGzsGoN*I|1+J$O8_1(r`Yd&U!zI+Dg}0-J zYSp{sZuf}!MWbPro653m7Dwh%js_!neiD-h4-m=@ADuRl2g(iC%n!$aO4w#1?g*4Y zvvIP%4i)V*maq#ht)g+=Wy)5^)|h2jhdsIYLsyKmtXK5wDROg-1Bc>W4Ri&tSD&Qi z$6fY!S@X3_CR8m=u(xkfjglnnSbYL1Kw-ijYWXVc$@CZtU44Mmgt6#l;t&n)nf;`o z_j42q5}Slo$M-58?pAO1bx2Rpdq)L+D#J2rWjinWz?H51sX%`Rxzn z61lKoi~$Sx1g;Ll&qLaP2V#)cT!ysWG zvwm1(TQGq?JZE>;w9xocc%0Os&f}?o`BJZ@e!%0r9W8+sku9yvxHrSv)VZ zw90%vDb9ZIjIiAOn~XWPQ~ZL{C5nM82eG$^4tIN3tu!xGlquNWy7OFajMS^_%tXhm z7^aUJuukBbud+E%*%mO3!O^u{DsAA~f~WA$n%K2fdsLL-?TNPkU_=1Qd`o#SL;m9g z>Cki!U-9~9LG1CBw27K$^;xfW4;Gt;`l*_-R?7~(vi5#d!fq(Ke=NE&_BZf0Bk18W zs*+o+9dwxn9}$lkIcWX*(`VC$Q5J?+o)p!3W?`>C+GUDPJW+9G;#xBA+7=LmN!E3tdYo1NlA@fi$&8@GYy z70NlrD;oJBu~iUB!^r(p@_lGp7Z`ZyqQ<79$8r6camqHvTaCEQj#?=W(})pt@m>@(B2u)%F|QC%B;DTU~Dy2rlv zt4>R`=8|#IZg`5zg6@91Cwpi}yhz3+-iGQcbadED-qSC@vM1I)%j!lg zg*nC1FCQ$Nvpdo%ISsjTt-fXD-tR3^cX#wstOp0ULr8(Prp^dE8H zv_7i{OdRo<5^#~wT|w3HGUXi6pg~9O1DA+=6+dN8uCciD+MIOS#G`5`#I)^rW@Slz znt>Gj8%5xm8ujaA?3FsfNgMQ1 z2#`2*^lhHJAXcV1La(toWFfttqXb}*rHF*n=Rm5KbyhUVq15WSnWZfuG}sW%_<9?c zZ)wS=sO)Pl^t%`b`68K9uR|<5$-an@jfVaj8;uFM;BvOsVEO^<@Z^cCxW`EUM-btQ z^q9Dt-5ikt_awYl>9-fx&X%*^fLH=aA%!gyupHRJfepL{g1yqMLu^~tJHiKU$+ zVQel0i`2=WpzzZm`_hm663jI~d-0u_wUFXVYatJyizrt6YaO!6+kOdOsfz1D&tLlU zcXAMr#{2pIkIE}eYyzSeIJEIH4+Iy?1NkUOjxRX?mMA>O>xbT)bfL2FI=Gg))wfJJ zd!ezbpN!;QhQx%4kf~*3qe=V&b)N-jN0vSXGFB5xt=)K0=TM^zaBax)v<42v0-Ss; zM0}^eX-|CTe$`4EC53Gaxx9T}&|0VrXzhy4wt?SWlwckMy0-6J$zDhR3iM2$z9&xt zegNvDKx1u=jBWsmfTr?Wavg`N~w(N9v(wy#BRnP2K;#V6Gjrg)?=4=P=(y&lJ+Lsf3Yw^)E_ZyL@Ht<(9$7 z0@-#?rN=bk<3onCYo%O_mu2?z28j>wmw&2ZnE|L1y!JBRb^m?LL;PKvf~^j4DX=yf zG1><#kYtOVu-^yXsTc-JvR#hQI&`4g-gc4W8sBpb>6PK+Hi=MZg4T{X!^`Qz=dnHE zEysy3+R~jYfJZT{@QPIkTlA!(48~f>Ef>H?MyOP!@jXOLt8)d1odk3Bz)vl!31cWvpzY039$#l6g-wAEpI&v@+SNlU>?AFNonK29$?z*m-vH&xZ5EbMZ z4*?2?JHWHCnHDw$%C$+#ap|iwkPmr4rLKHkHlGiYFh16BW`TzH@9{InDg2=4Ix*s^ zul*`d(y`m$BJz(_#IJ5RYGf{b@|G|l^4#FQJaEdM88nI8x@N+wg&CeLSbO(^m4hek z)MD3v8O)gOJT!{9Ep6tem}CKAOmneHP4HFA<=;4eRN-DmJFs&D6iU7|!;`~jtO}TK zQx$F8%Ey&*F|8aQWC&|fwjXz?24X@He3fKBl za8RG4Ri#{Y8b_BGAFwJXIPGd5{jTTsxp*d!RbhEVQ-zTBZQd7ptpa3syOQy;9x>?f z^!w=3h@5ZPTlz=w<1W5;o_I*kUwling` zcG|1bmz`p?wHNeJ?8Pxs{uS%MU79(nV4ie zz1p`o9{aG|cT-@}Q^MoArbqKpO@tmWp4&iDhJ;ixyjtMxUE1Cpx< zQhuorTWVR!dRaXv@uC_8y*Ijb*DuA+QAypYvgiATPKWFGicB?wpa{x~;#49sLea^);r|%ZtNKHBJtVMm@?{>vL8#h!37W z0?1ET1#GX7+rqk_VZ0*VCWcsR=1o~Seyo4X=jqKLG#5ptXSsnca_Xd0us$VC%u3MCQ;v%S@t6)})W) z*C;+2edoQ4zc&1%B3_2mSE;d~M6@p=i-ahV6Pe-tSixH`x{H9#maQvdhPfD?T0w64 zDn7voN_$z6hIt!E7PK z-zak5US#4>K)@Wn#5|NXM6tWLS&*KhR`LN30hl4YMn38%hg*Dd#iOHDc1*T4R5#0r273o89kT&tbt)s_b|WZ*8|H3zH>#>s>14e(CH;lW?$Wc7injj z-^sN*aIIK)_u?9dcKfW3n>k`D#ZHm7xN|{*VMnVF`~5FVUqWi&-(A*Z&u+j6ng0gR zEC4}NPojUMw%3)sa#Xw>uioz4in7Sqx&=wt1GGXDzZxcCC<>^5S_jzC892aJLbQPW zKTl`}Ti5?X@-U}zRm{XgiGYYlyMGwa#>^{xwHkod0W^d9vEk;yTXG|J%0yBO-k8+JofY?n=9a}!8Q zkzn~`gLwake{j;hyTs7sDL8Iymh!c4R{nhx8EXnE7mpsL&jQlrkzP8_79D27ZWjhn z^fjiOuwn88vr?lU%RSP5`R7FdR$5=`1d1R1KyNL?>}(Hby0g>#RbqGr>0+ahzp5+c zXUZ!%`qP;Y{w5%T=h8V@-2#Ih;NUra`{^4ylZeBfg3Pz{04{BWHeTt}E}?*gpBa zb64K4Bl#h&3jbR5UqYE=|KCbum*RJ~@ z=sv^UIHq?+6gw#Zwr{8SwjYsQd3RC+JI|uKei(uZ;!8|Qs?R~eg%T4J?|rC_h=>@6 zv7IeFUB}mRzFfR2cFyBgY)m-v+eDezHgL6Pe)!}(*z&}vthR#rY?ZZ%VlCasIG#ZH zqi@=ree~x;?Cmk+Y1;9MoG;+3JP%lk0o#&<4FKDr$icz;ynj1O;w+R0H)y*xhxy}{ z&f3t6`CRL*C*ymwaBB?;>?9XV+Ev2YMWfh&@XZov_t zy~!I~k+O~5Wc9L7&#L%v`4b%uid$+F_N#2Z{OU^hXZ_&h_7kRhLLO4m$-mC4-#-Qn zdv-=kKvae=N#>Km{yMvZ2RPl6&pfL*6Dp!uFJaVb>TJ-OWNY59B<36`+OOKPhSh9L zMk_T=*bZ2kRAYVes&k+CVEg7QSIj$%IW4gtV6%M#=Q=4)E>ACx0r@yC(At(EAFb5g zo&oO-6!V6K@d9`b@QNYVo*v}*$~yu{Jp(7aMESJn95QTt$ux1NJDF5h`-cPZ~bgtaE(z(RE&Sz5nPG zvV&32dPh%`^2xM140n}ZxTeR?6OGbKiw{ddsFrry9a%WUElP}X73`to4KTBJ9cpg$DZ z!5g;D`&)0=6^^Iy_@J(4onKcsF25z-=cqlo$S(he?yv#u>SY53Yykvs9{4O`km`oke?3A24| zNy0w$93VOLI01z~CFSch)2*<=Kx+8>>H%#1eDjeXrQYyf`*xSn5Z0g-8nE@9Qmw$FgrM()x+dT& zRSTVRAubzjjoe_QZ#Bkc@J_kt4waqnr8hfj&SceaBQIZ$2{unZyFdPXcfOy5Gw62U zVTZ=Anlg3T!~x;1SN*EFqL!lY4KLVW=D&d4UX!!-`v|Q}x%lDoPGa4MV-2&A2RWWz zzwV{ZzqKFM>ve)}5DHr;`a9k9eW?K(lWi1M?1%cR+}+D7f4x!ZJJB`&8QakGhbd3+ zTTEgI+0-8Bh~T?-0-Z9TnvX&@z#69PZQhN;o_TKY1dlu2fJ-+GpvNuRit}O7Ja$7` z6*5|t{);LKYowV}Gq!=kHW_Aq4@yF!>#e4+wG{zmV%_t&Yqy&}gw;(fDVjTK|PiWs-@_mKd zZzDc;IEQ=?Nm5yUpo5Is;>oX8Q#WmirXPN{uC6f}YR;-bTfJagI_&FpF)emmWCWc6 zS({-CC0|)AjMYK$**thXF*8y4YpWd3PH`L0N>NAwVd4AdJ}B{XnHo7wd=GWm`4De@ zE8s&wB zne`1%GV#Hx9M+Zc^=mPdF*Pk!Ah_|Z4ocF;*U5-iFrq(l$JCU9=*aG1CsT@`nCO#Z zK^-@jI;LJy!x=RXA5BcD3~x|rym*S^5-1_VQt6suaHW^^jfCLLV+ZOcy?i>itVoQ-v_gMJf_iuT z!__6HwaOi4M0};NI(DQ^q6NQeAd@gZG@V*^6Vs!d8tv#nzdXFLX$xkhHkKKZ%+khh zRrE81a_c*i+<4T`BDqDB6j*_0IQ9Fh{7>o{Fr-zr+U8>uW^xnVWyXyVdcvlD*r=Od zPJM2HDxO-m=$%)fpffmYUy#>UW5DG8tueZ-qz(5hch$QO6Flg-NC7z2^k_xwbo$-&x| z6f7q(QnX2Ya;vGW*!J~xh^4XY5zBIUDsTM@?6!oFt}1rDrGHI!<=e>o5J5Yho;srb zI-PfR4;9_!6Y9hj6JIISUq08M>aL+Z#~Y$DAXYMGw(Z zJAi)qH$G**^EIsg(4K$!U2drYJHiI-3^nI!N|)yUaD!gaIx_!wa{5e(YJUiWWvYItxvd; z<6`cV%qK^aapO&SF)6_nZw;Hzm$}4jU7I{SN4BCIhpDX=Y|^EIYMxLZht!(&Bo$Gr zRT^y537=)Pj8aE+*6DB712&ha9WD>V1N}t`5R<)y3tz_6i&;0DZ9fK{aW-IwHVbX? zhw0IC$lEC7Q2ersJiaR?IIVi$F6VoQl{~5M&}=A+5lq-exbzjo4y#Xe_H1ae4vlJV z%{NhyB4^^S@Lg&%8SfU?E|Szr-iPk8*Co|<$oF}3dD}DY9*ya+zpif;Q0l(LYo4Av z4&q<+Yn`%>n%2mUxpTcz0zzIo7c>ZCOB1}i{^%4yf3QA&!B_T)h2GLCH(R^~tQze9 z`dC$r6uNhKlK%mqM5Q(Q)uxW@VR}`9j?ucUrL{-ew>4~k`Kmp3diI{Wo-rS*tCT55 zI~0@eS{?MMhX(0opaW*yE;${nR@Z7jFN_^4&tXAN-zc!%81o*cVx`>NwweIlAq*HF z-G1#$PZ3?we4jkJ#t9d13r`d(J-bX@hsqsKaX zPV9m7w&r-jzL^a7#ofGfKN{mSk?{yc0i1I-!8ZPCVSGnvFKGN*aYd@-El*lQRVec$U-3 z%4|G^sD0Py2vreMsMmXvG(sdj{eHTt=Sf*>(neK?XZ3J{qX^^Z2}1jsEpw8G?4g)j z#lg$Lj}E(RF>Y(kVO-?7Vj5-_skeq{SF7fz`Z2*dKC@5KK0Ua#!7Fev7H`hD~aG#^Il)SJgUPZalv#6m%#ytA6Dg7kQ%K zMRI67tN>R|A#ox@>_c;>1nl)!?GIIoO>_R6+T9%<4R*?mer!8oa~Zwt__Ej6Afpbv z|FNe97rrMkRE2-&T)Xu02OxY-Rt}&|4Tn-LGeU_ zY>-8^QpwVaq0Jdff-j#Ksd&l$+#&tmdmzlY_iLa@rM3e#Q&fEUGVPN7uZA%JSkDi> zTBN1NON|Y~Q;ALINXXubC)SLIV&48++c@U0}LORvIbg59pYZR_+`39EUTVr{Uf)PaA@Q<_Ek|l`_cnA53Y7 z)uizJNjLJ3XbQ(THVKB9Xt7eerV;-JPCK`Dy)iA1OuRW189HcoWG;XimT-w`C`{JF z8x^oURqU&n7PGA!wvK^fbW&xd158FWo?}U~i$>0ez}6}K(g0(PU-0KcB%gRb8>`w+ zNUc9s-_UfHq6%Ird-Cu)My8imw{+YZ;Z}FOQek$rVh4W<)zeZ}XRx$s=H-G= zl>+VKt_b+8`}23FmkfP}dtW-q5E^YO-M73Og3{y0DicFIb4O-o?+&|%Qy+g@NQNCw zyqZQV_|R1CJ9h%kTGXWnM`_**&YFgcxcX1L?xLdR>*t5&;uz^Oi$BOf!1pKhGC7g9 zR%Tem^*Fdqx&0li0);m?sz6>ou!vH*X|E*W6@D*d`p|^!q#rkOa=PU@-ASX{O4cH` z)DByxbHbX1j%sGa*5u#l2y*2Q`Eb_aPSLo~%e;>HctWKdFSB9#rLHR{mb{pt2=);%(s* zV){!n7Y1)0w|@7l*3;(e_(CO417WqzLhn>q`-iayFXe72alg!3$b9hbOmLC%gA=Fm z$tJuZZ6UsB8LfrDX&4u?RMjWIy|=Tt7F!{4oPQNtXe?QPEA*NiDJ*qv?u!1P`!*cb z58xXE6x2snjd(QKrkjb(k&DmHz`^9X3q94W&ce;{v8wQnEK}o17c9i(K67eo7~R<& z@{2-gN^JjR4*_lankl9ggz%Ld$R4_IzeY;^o(!NRWNk;1yIB{iBE(`Mn*JDAfn^vq zDdpG>i7?Xq6jM&rJe;AI%mk6OVX_YhdD~Kskl5t<&c9!iHPEwd`WFV7`OY__)<+R# zp9mu~arrQ!N?Y>bZKPeG{Au%<4vCbgrxo4nt(zy!N|uPk)Z9OqWUA%qbbq63wGh0& zo^AW0F=CvUOfvfbY^R$B^+t|b*GDg2KNDHtuJO#XwKJEUHZAg`rg2M8HDp{N6KF+x zdi!W%x`haw*_H1gD>iV#%5SAhqC@!v8+{_v-orI-%N3N?W`%e!1cVd2L0zLne$2p< z^V(z!du3^&7DiT+<#K|#@M86rh$bqBOztM9ZIl#B4LCd^$9dWx>M%ox2!687N38E? zYnXd;pB{-`B*|>cwta9owmYA4x7f0sDc5Y!=f&Bne5Gmnn(KYx&_?SfX7z%KRMRQ$ z@B~8p+$kt)RoS8uVYl$*Gi`95K^DfTbxV=^?;Z?i? zn!k=}9yh&A%WCd*!!{B*ptspeGy(MjqneMjYyp0$*}-*uT@p()p=}ZQ%d?WyV%wXC z^*fK#HMzz8Dxk+8!)Pqp?tO?Yu}qq-Ws-5zWHO***gso3wPdjaYI1c_7I(~+xMkr^ zCfvBR<*c3^a$hT?7a`f*o3n9dz8H zyD_o7i-H?5Xg`#0eoyC)dQ`2bgYu5yr6ZaEWtkg!SOji+kj!_`z>se ziGLMH-{Z27TE>zP2*H;=xOJ`Ri}x0)D{)`qW8?cP9#m-QPz;VUH!kSh01aK@6#sQ) z&h4D&v@dQ%{8ssD zijx#B8S%uX9JUfu|Dph=Q50;ia-i;O{)ypFDiP*@0(VPXSlyy!Z!t=e;5p>1)%_*A zFmSe~22%2^F`CUf6hI>GPF21`?p_;mk9$?nig*0N;~5po+Ge%QBziWg8##BU7p^7- z!EX)g$(YAj1|oAvP|ruEJ!>16+nkIi>J0*E?9J>sKX30IEq6r*tX*l(MZ}H#X7l8W zJ01*&lR^7|LJqb@gorIp(-UFeDnjLY) zi;_AdFT6#S$(96p`YzvWR^6GW!&=YcCy#(2pBq;y%#aFNPAL!ee|a{)%oUHg!?)?^ z^0OGbA*>XNQf3Ty8tMBLlp^-bv+=M?rQb+7^Lv?P2>C65 zyIR$6kg_(FSU0;<>h~kt$2PIAr|k0oefNI_2g4%wi|sgX-r8X75DSOj9%LH7+BDL@WVw0x_xl z%=*z0sb6-F!SSmBC-TlsA&?&BFt3H*#ZfAMpml#Ha@W8WeLJ4^8k!Ah!8d)4SKNpC z1;tqKgz^dn=RoIM<;yaj!emu6Yhn{h$7@Ps1cS6%V=zJP*YDpcXI)#X|HGFOQ9qy= zfl*@YhVg|schanghI@HK)d`BzwG2Cj6-Rc1 z>$5pET)517 zrO(-~uZT)E_YIu7G^8B)v$TwlAb<1de*^fcZsU6IEw071xX2K~G3edA^_|wY5UI9|J^?H=xtqO>kxi zAQ=2g%c^3=e*`we#NnTxE0fsO_%~}I)g|{5m!8(EZGo+U^y+HvfaogC zVNKQ&c39ImP%SbtvNf5>ix5xRGj8n~N)ga}> z_dyjETC@FEWw_{BR=Zg5slOAyDyck$H+9|Y_4=C%hC+bQpkS}|@a(Wp9fcVqBNQ4I zrZ1`!xb~6z%8-ay&|CE-kD1koxd-5drD{Aitil$YiX9qOe1!_}Tc(fdldVMNTvJxm z9jF7tBSnnBl|{D@uBGnLO!V$vH=gjT=|fzkN>r9^0Rg}a%X&Ap8Lg_^VK)GZzoy#R z3gkOK6e$>4E9g=q7g$zwcQ(o6mIs@482ri*A9xVFeAJXTEQ_vih#yfTa9O%qaE>v( zFzpHVyMEuaJScFo&xld?@$_zF-bpAoLmzh$QnmdW$->gAw}!tgh!6LK0fOTJh~tDn zf2qLLUdUv33s7~xG&I`GhkeG0I{)U$%~P1WvyDxBA^N!U7(a7l`+9<@&E4uyL)@rCM7GOl&<0T7W&#-^E(* z!d&%9+3r9@UR#jfYS^(HqfF}~#1E&S=jV6#;Q#KZT8X_Qm-|viuc+GSuOLC+-R!S@ zH!5}A-q9y!hO^1(*MGdPok=1L8Wdm!M;$C)s{+(~MB$oMh>@*jr{Vn3B_i0(Nh++i zx%SvDOgdncT@%{|TdjSTw&|EqkF8^)Wm#r8UmO4gGiFLS(@s-!>rtx6*}nl(JCnGd zkl35r?5)P$@SXdD9sV|XXVSFJMbE5fbD3l;o%t3BW{$Ep%7>l*(QARSD>}70#rieu z`&YvJ-~zp)-~~ClxNyB$8g<<6Eiejc`cbD7ioQH#H?&)Cl$bWv_S&pYOd1>ISRY7= z4(xBOn@9md>Ly7!(wmN~rYKZa?9xyeDuh)zZm?h=x zsPXcI-~#89mUD;D8M3bM&4s4nZ}0C6XT<0nLa_Q@&bJK42!ZjZsndEooOEaHW6U9#|jsVS2kGr9O_%OdNQ}Qa~ac`wjL&dS}|+ zzR;`>%h53)+f05T4z@P638)&UYY8%4I~V2=oA`yoB?W*gJn1fpNIdDD;ABVXdb!`o z=a(D4ccHVKz#ER}#tzN}kg5PVDuCZ~qYhkpiAyeo3W zlNxJN*xwjvdiEAN^SP*0m`}G-*#(&(2!S;62|%1CMjez9)LcBr?K;5rid{pxc zR2Vlci+FzJr}f2g!7!^t&3q3eb=;BChZ9F`uG#f*n>P|ET9(_5r3peDnYrT)wSwA< zjYWzY8V@ugmcHeXuoDh{f%5*tGoZXNdx!8qSRIO9eZmOgAvGH+XFE6*Q+FqTV6czC zMpB}ZeUMJ%a6B@k#U_#NqnE2FLh?{QGCampVuOqDQ5J4KTJUG-3r3x_>x3_JiM4+7 z)t4RBoCVE(i@bHdv031(?Z?QH^Q3pZgs)#XyN7~P3hkPYzWHOB&OW`Dy(n6e;YON` zIrD?Ucz8m#s9I-&(TITL_D__B?MsM-prwb_@o>l5iNmId`@Y%Cxf){TW@d?JwxXixyq zJY98AO-GjxM1&ngve$xtS(y)4-wT0!SoX%F8pz9Guu#k@?I3w@K#T_bFQ#mA6lgNyQELeSnnw7s}z=StzWM2V#*8Tic3V zo*qh!MKz?vAl)Z>1yoKM7l<9R>t#-r7ij;?G1Nl^#001s-E*wv0@CI))0y-$NX)DPw=~7^jxbQxD)o zem%BJmDSFCQ-Ve-+)2gpK;S8Tpopc~*u8A+5fU4NT>qL94vs0F)inwd%Qy3p3MwxV z+9SQ!c$Yd&uI~8K>zLBlC`)*8`B({v;tO#CEq)4^>}I!cl@R#7^$|qpi9yYZ6_1wfP zOxC?n;hJADX#g>Rp_>zJffhr_8B?A5PoOmR6JRBvrh*2+qz?m?jJC!VkRDjX5GUrU z+3`j_{uU6taS|FGT#ZZTpJ+`vHZi!ysB@7^XIxA+x5oz8_EL7+0=;rkNF^vNwIRj& zgQ_kejp1XG-t1SSYrT&!+)golowAMe+`v5 ztk4vlX?=|Nx*hOr$&OEf`eU(acZB^h-@3|WwER8-bGNzP3KxaA!@nXM%+PmTbUYeU zkZx7gDl@{p{6^^-DR9fc!ENho*jv9YguQT8ry#0)%}WE};!oi#`Q42O^v~7dG{0(M zUKFOGH;o_e2`^`ir^(Uf_7U>HoYpRWAFm73Hu`$d?4^pc%hvkW*Vy_^H!DS^mSd}^hA)g1erFa@H#&{$HVf1)Q?L5uxdlZo{7P2+*5Uaduw<5iG_MlM@4DoC5ls3x zQ01gA?j^Q{{{-C}TUeeR_0-uo19fmOvPpOjN2z|Gn~)pxB?^Z>kEIFMRv#n{{g zf_iw1?xs>d3N~!SmmETBveYevPz+&Ah_~FZH{^chN%>qxR^eD#Kk*lWr_nABco!Bp zh~1+oMBHIAUY5#fn5831r#*l zwKlUv>?lZpI4_$Fi46Mrl!F>S$p8)qc!DX6X@^oIeLARtk$Gceymub~-L4{JeUDye zZgpm`QC%ELEjVk>!4VLD{mR9=e>qFOHQg15pe<&}^|au$FdvoE5Y<#5Kw~tL(A-m@ zUd2AVb(1Dqpyup9jR?bwZD6>`7&nyC)(Mbt&Gu?UK%5$KK(`n*%bu}xrt>2D?Z9+B zO)LPU1?~Q$aDFkOF2wq=yeK)hwzrBFV#BO<7wrFxz@ZmFp7L(o#Ypqrvr?V;ti*Dx z)jA$Xn23x8rnRMn5X!w=9A`x6dDcN#o5zpO%=8r5>MolNMV6>g%LrZl0~V)Yb5S_A zUf1vAY`Im_6Pc32RRedtU;f=Z$}FLp6Il?VS<}8Dl2x-1U#R3KLJ-|0@!wdrIJm>Y zk?yJxK6P^k&*(4$D5FFc=I{x)ks8KA56@yKu03T=roQZ z91)`}Z2@im1L`x!Y=wT18m2D{5(J4bKnPYj@^6^OX3AUD0p5xz^3< z*TA1ISsE^!Pvuv}2m{#$=-QFA!sdK<$|0@>Tc)VO~k-y2=;4ABSG2Mp=Jq;6RuhM>{I{c z%a_PWaxJIHZoF=tib5t_hFqU%JwW`vNP%O9zr>0Ib^o>k+mehz&TgX~&6S>lPqG%2 zXU!%Ie{awDXGv*pD;&7<4bK>>A5Qo8Vnu-V*9{Bf;9?oall%&esv*?7f zS4D#2e_MBdN^ERB|91!P*=NTHdv|gAQ`chMWOn%D(f?eP|4$sjzh-dXG~DHJ{$Um0 z{L_2P@xSN}!n?UJz+V@aeO%z2JEN&1BCZDwS%W~R%GY_;T(S>%#z2C6w-p@wl^z{oqd!E(CW#fxWgPzO; z8B&~f$_OZ%nP1D2SUMih zK>TBH1V?|S@8f77JB%%ktUo(IDaY4TOJWS!v1;zw_)(ZYGS9p|Y!rLXKcK*?FO1Wv zuBNS(?_)Kag5$ad)fVd?M3As&Rf zTC*4Bf?0p33&L3^?%&(Kn2Mc9#n_M5&o{=#DW=GczK$9-&kp_p@ zG3J5X1AFbm&ZyTI$73W5fYFJH{Tuhko65A#V8o~+v(<4s^iWjNAqh>S=!l7XW_Y9R z%!X#XP!p^1;()uF16{h?sSbW4Wl)U)be*TNxSLX>DtvHNDM$LB!!!|^>tKm>M}}7P zM%i~aw!#y+JQDI}Q+SbtbbV{n50)Y>+^-~KOhB$AE@a54MX_N) z<_=NMe0;UPwQ6BaO{v6V6Sriez#YyG(i+#11cFKwQy6BRz5VjBKvvJdh(iMP%#72k zn#RF@((IkPhutLgTlhu>$|WQcn?A)g>D$M6+MR!mCf5v{FU})c9{nZP3hcRAhHh+M z=vHLdJrSsihTtpzhM9aJL4&NQG&FHCBQq5|PdWs1c^s zc|i#^2)+YNsp<2~j8zMW9&yqz{|A?N-nemTC_Y|46HWL{_T>vXr9zcG6W*3WFs&gK z-F|rntp@OYQ7&_8Mc{a_%r;(LM=f**qJf|YMyJL;!WqE7 zBD&k1MMd{O$nBC)v?x1DQ2v4{IZg)`J%;;M>##eK@> z3e7$?HmFq&lNzu&VvFJW08#j%79d%dhn)9UD<6+mn0_6D2x+H3$*T#1XQ&-IzrrG7`oN^Yl^?y;3<`^Ssj_0B2X^`RF^X~ceABg2Lc*?#Ed*{(a>jGCGTl_e*__L zKwW=EA8=gwGY;YZ=(}$kQ05kpm0z^vhA70&|2zNhDE8sZi=t!M>}hn6g$`D(f>o?) z7t>@8DePqLaBzHADB^0=5zw?@qt~%<549yNS4d%qQn0~mGac&^!hdkbn&emx>)C6| z9~q>TS+{Rj>K5d#`V`aH0W}WaRZ0PjoWBF&UTpt{| zp(sK#v zFv!k$9MgUG(7d``rm&0vqWR|??ah?KKw_mn`dnAT!Y^J+iySH zeN}W;0(5qFCx5lk(sTSM^1ps{$lm!7r_nCZ{;G8-ZRxLe;?P+ z%Kz^SuR!wC`dIU^^%&L~@A|Yg>l`I;iTi&7-TH~+39LJQ7ZP}vJ%bBARCVm5E>Vf& z3>uEuQUW1nc2EDzoMjW~Q|kjeWmAvcUB3v1tQF&B451%htSvMFwnl&CA8nKJyiCU8 z^K;HO;yC-M zw&&!hzhHdm{NLTNk@CL@GP{bPmw8+U&Y4$xY#I|cq*W@U`WElNBimi1Jef+K8S2De&g>RrTd2+y?8&F8W$46aS?Cm3Oh3 zcDlLkW0ef5jX}np9)O&u=YYSw#k4_CF0DAJoOjUKrq8Eh@^He4Ca*FR6iO`bUU>H03hl>p_I(OOb4 z{dN;qQ>NjPcjlbT*#{uu*4+ZvuR-H>@en8B#sEU|&b4!M8xZY#C7=%_X2nH}WtobF zc6aqrD= zLeX4pi3OsXXIX(#C-hL$I@L0$H1!UOp1&L=tx5s|0OOf7Yux*S>c6DT8#c4<}8F7Yq5Jga5}Qzg?~__NY*onx0xJr#WJ%h=!y;_W_;5U{#^D!=rt%)nQ@@k zT;QdUj2r$f9uXxiwUs%#PF~!~(fbfX1Gs&;C*Z8+ zb%X9DV4}YyNhz(LJBs8Y>D2|@ePzjlNEsMxTyJ{TeA{wxs}#ZKv;=l~wT~L3Hg>J8 z(qSBfOG*K3rDd8_n$bk&He41enWvi>4^zuul{`_!nMhVI0Wvl z$U=p85^}v8V5g3M2^;UF=y1ln0{Z0)Vud6$GDss`*P#2od(Q>1Xxu4`-oOV8>6BDv zkYeT1SJo2jxP+*;AHB}fOfka@%Y_+lb*pxPSsvAHcia03!kscS)7C7B(+NN*s4-XL zy-fCCx)V@L*kw2^W^OZ#7|uC3PHreOGg-I3icxz)n(!5xbAbst5rfp>bZ++1Ebh7J!zpg7UlF)rDunWp* ziBz3x&8z}2;Q_={Cv`M!Xd%qf_jg_zZ70HXUO{}VJN=9#9wD0LF)0r-nFPDZML z$B;-%WTUHO^dGL1dUTJyy%^_| zJl2oD4uwIg+h4Jumq+xn2+9{<949exp4A0oyeGUrNUnW6MX+I@k&d@x z0N^E^CEi67RYRBLp7e7r;lmH|cIiOf%g;&Oj22<{-pni6#X*A2>VE2+1b+rJP}`(` z(D1h|o%|_{&fAQVbIOByX4QDB7*4&YU6O)LZbruC4t6EQ(L~auDqft#K zIc$^(2q&|&B|-Xn>8k2ty9AbkFel-8e!tEggKH}CSoszU)r9v)B)Vqq=Cpm&H{!Wg zVTfwfK=mduVNcz3E@x zA2L=UCY*YA#8~m3TImpkhE)%2dMxsL9;&(3&K+#;R2usCDT+S%GFiIp!{$lUW`6SL zzKu_olM^gj%K&dUi?X8UCS-2U1p4_jS*d$W#PzRrtFPO<#~qM-M^@w{l;)#E=cnT4 zAiV>h?=$^xus`YOzb&LRh4(dMi!(>xXms9WlziBlpTvgPQZ~q5;Pw~B)0^h>C3H&) zV%j?9Weu!E${weM5GS=)wx_DT&oAdT8sG^Endp`b0KD zA%H8x2-9)|@#@iR=ID?H_wm4cFGh^&$xNr;%lj+obdOOt@O4u|;r{6sV+8gTjxz1C z6f>#Q?-)Y%8ISaVqnV@9>*_P|tdkhxEcbMA!e7Q!?YnEx2QlE->JYncf)%q;XLH}R zCt01&RZMewGUuT+Y;rHUf4TVS#kg;0{f-tGop(2@!TC${>s@^ry?8h-+V=M$136Zc zw8v*-qk9S8zqekitN7@Py84&ed#Ee{imCwnlU}A*%o+eSuYoo^r@=v!hHls&`T)L1 z_RJG6D&6MNExs{4Vi}_{?t{uyxj7|u47*s5s=M{t=4@`nmAL59*rB_XOV*(o%Hrd* ztgVzlfVQusb{I+TTs~EPeG3;TiSnC<|BXAc)TH@+P8_@Cos(1c-0=xUEJ=ZXEAL9B zF)mIRAewX;7lg&ln!Di#DWYs;H<(D{m(js6;`^%uEd~eLSx5|BEN&Dq;G+1P)E*>7 zVNF9kCJ?j)OE)azVqdXZRa|s;?oA_vmGJd3 zh5y~0qUK4=nzFzK&_tj$PH9w)1--7hn8{wX$`U>Wu@D)hkVXzAU;CZZvHU ztowS7Rc9k>Onu$5eT?IxrZZO>91uyt^@Rxlf*kIy{wLW?Eu6>8H5iQrp#x^V#2BRvhj6{_$S7&}gq5 z61u4Qo6jEzVt3gp{<5QWx%xNvsU-p0i#v)8!L&Kp58a^g$5x) zIvIDi0uZBOjtXn$7vNP=d1|FD)sw}L-h@gbp%hmUbnk(ATZvo76cLXKGE9%prC7z= zVM<&&f%%{45q$X?shIj%3p(wW~dkOuBGy7Ro->4B!slu|gbL#M(JhhF*kQGyTx1|6+pOagZzNB!Gf5eB|4O@()-x(85(}o3QX^9EC=g za+=Zi(zUciDs*WsK+eTS0|WaYy?)(d*B29e0*Ob=sGnM4V5 z%d9vXB%*0NiC$Q#THbUy7sdCu0AP@G?RQq2(v#<&-{?sjEL0#HGSyrPq^(ph&Y`r+_^NTuLDQ!4f`6RZ-Ij+~dz(Hk9^x z^`Tb@O-x~@gB$FKqk(f}47)oyZ;zrA`0U3EYhZc$Q`nJ@Uhq}Sd)3>B8`eKK)=K;+ zQayF(@ZLNApZoshsHdx}D+x6FdVak`^sG(XCECD8Q4ylfQeK3Ea9@M-#V!d~?h7l?bMG2jPXK>aTqJwYq2Cbsj4*s>@z?S1$8sedKBR zK#blGX!BkqHY}N4hsW2z=l!=T-`_e!#Y_^X`8pak+ zo&zCcU?RU>a4ycPm*QoAEy}OsZj_=bzZx$Rm(^EE*3~k@UL(h9bjNB;5_zoY+#g2E z?{AGf)rr<*BBq4ozFKJ}Ged>XzLC$s;qI2W`V zm9M;-pOMbDf&`c8)+=wnvEc1De-92!(4F?l{WceGZT6gGK^#a5(?Q4nCqc6vOl^-1 z6uy|+%W+w#bKVk8)?yVFTB_gS$8ObmYyaY)eDKMhOush-iNVFOclA4;Kf(H*IWI-Vw)ECaFT` zmu|;>*$mK!@{sn2>vENL^JL?Obq~G6f2S#|JcyUKjm&KPT}T2%L!EPsh=q8^Q^%gy zz=|}2xBTL1{M^-D0WPI*%#B%{b@o8FXu)k!-%uSpnXVj9yMJTbg-0b?ldbF31j>5U zac>1IiZhR6wDf;fz}daE@kdFG#RHhw z!R|=lv)(a6RcTC$x31c3>=^dsD~0vyu>|JAyOqxD%rcTC%k_L77C6-$Xk`O%jk_qh zr6BUXfL7s{S}Nblr|UNU$*U|n=Yd{#G<;Cd3`}&RuKLnmdvDEX#6RI4j4KPWwwval zce6-ND}*lNjxTXu+0qPD+16v2(H}1TVmM1TMa=_~+5wA|UW>5~t5*MmyZ3Nwy6g75 zEeN6_Dz~B{ML|%iNUs44NS6-Mlnx>EfRrQxHdKgoDFKyULk&_w#D=s)X@LX?N+*OU zkVFVcCf=Us%z4h4ciuDe&NVaFdtLki*g^ob_g>amu2w66Dyl-JEo7kd!S2iysar~5Ims#kQD z=xT?2w{tNG6*~=KVkb78?UcF$ieN08Rc2sI_2ZqmOqT+$Gx2~=+vx8NHBj;-r(q+5 zv2Wu&>FJ+iMvZ&;Uq2T6L|_T=#`VylEMC1q)jI5Fe$gOTrQY*0mrBz2QZ0OTD;E_; zp{7U5fuyApFR@M4;tStxWwB;)jP}@KYgktuoXDT5rk5(+KAd5>3#r>(X8E%0R_z0i4 zQ;r84o$BZ%$Qz0SVG|V+dMi!xY0mWaklUhOjpSxSz9zWq2oU4;BF#Q-y48G1EpYU7 zxTBQ`Q3TQ6$*f?LYJse;9gE_d<+oA%JS|02ex;B&Bf?_c{P3?63Z{$nAVO;7yVtZd z_ar+c7$qeqzNEIi-m>lqB%I$^)~_S8zt@_eA1+2qFaOvnEX=-Dn-#mB=N`defntju zG5L8QV#7Ea;x>7`5_fq~VzxCxX zQ%ewh;CU?|zV@54aV}GmYTT$EoN7g3ZhYT(6)=@ZU-y6yXtUx$ zdbt6slRZ;25kh3-x3sxX^O>%L1`W!fgT^D|QGV&8m0TZE@pZx*zqWOi;t!5 zQ*_bSZ7G)FbsZ*aIh6=@LqK~$)HUr|i?!>22l2hU8=(uP#|qS6R`(eSWnyCcc+hrl z2Slth_C;^o!er&dxu)8L(g^7#v~|kNa!5W1nSKJCXs~rU#WM8b{<${OROQ?F;aiR; z1tvB%A37G!)R@22l60-PmE7DHaRT4rwWqZKj5|joL+kb=<)7c0-f>H74r&CMk18_? z_0v)OkCnvpdy`6o6NghrD9E!wl=AR!)iuir@P)W3;nds7$3p<>PGU7pfw;I>($-WW zqUx(v#b)+^Dmv|LO_Tbv#Dfjrn%s?YBdz06UR3F4>p(n0=SfX2l*h{eO-+QL1ukls|@1t z1`@Xj}TUW#7GM;Q2cZ2$Wa1%D;eq>F*a)dIg*&KKr@Cg4ev)U#QvP;Q}g9yP+U z8K=euxW(A5zV~EYRa|Fza`Tpb7<0mi5q*%xnckAw2u={%5 za@ezTCteQc@dX1bbp2il!*S1){_3Hqr4zM zAAJphSpRWfWJwLQ_@2)h-B)*Yg51@a`iNVI*VVXYAJ;e%h_t;F`#AvbzQ+)5M3H%V zFzDUV-eLD3X0j#bq_A1217dG}=ZXycy+PaRx_!sTqK3lsq)LUt6ZqeU$HGVa610(BDEQTv=T0jr*-49TJ4Q zq;*)v(*yJ!s?O<{6HATX*T=AC_ihQbC$snYBV#37-x(AFzbGr3EP9E4IAC+8|QXw7t8KHb#QXb zCIU;OHEQ{NTX=->_sxUv(p$p~a3|RWX-Lqqs1OA*#yOH}q=TRXa zR{@h&gWgUQGGUcn;fnt{HX-&@OI@cWq+v4inuX74izCj1D-N6&a@USoYISh9;}5;3 zcIfGqF&3pTc9I{|&pkcp{v8gVMi#3ckC~GcX8Cn(AGKG{c;8=m_Vu;-uKv+>OcI32 z3eJEMYi!ZX@E@#e{OQ#`iS)60x2z{Y_#e<`wDK%apV|+1`L>=v<;6pTL=}x|p;*gW z|D+5(z4boC82E@@dx`ju-aQ8PK<}u9QZ%VXnbuuXvz<_{4fNiZEb+B_ARf{Q91>8k zSP<{=|Gj2o1kbMq;SVH!oobC;%(SdCUrnRW#>(8_E0vLI^O)2>!M%upvhJimg3g2u z9_(763^lhl-uB~ex;rZ;dG9L#oG57bSgRhPqe+B>en7~UK3|sZtD}{1vpjyQzs@n9 zldy8Bcz_~@`dZs0Zv}W1_4E9)t35eFd(k|_6++FF>ai2QDcOB09~&`zzd6+{Qz~Cp z**#|ur{JQ`q5`T`QuC1yr7eilf^D+vBq6WT)P53g-h|~aa-)bVHltRmTu1R%U0-ZR zBiVXA=;CCC5;C|28Nl9~Fb+ReAnuY2*38$Hp;dIJ^V995g^)EhIW+w-Y2!pAY>r5h5B#OU|*7%QlZj5$?40`A6)7E=)qm! z5{9nW`f$Q$aQdVpELUP-d0f@Aa#2ufqB6<47B2qDIN2e!>~ew<3}V&tY2;4Eq^`29 za(L5P*fZHfU!1otymq=bz^g1G^+Lt)hsp@+-LskTa65;>ZH|H$apdJ|f_Vmrg}ZoK zI_4ygm_?&|>vdZV6}?)U6RYxZQyS)?@9)*m^Hn48`Oh9#?jOkJ$L0&HJF;%PlCWWD zD0e%nC933Brj-P!C#s0oqC!j^#FR{NTDk4WQw1}t1+5SQcv)WFM2X|7!*z2`>;68- zu*Bz*nn@A2P@MMO`XL4r>>mYFJ=NXjJ4ORe3NPl34szlhL#O*Q-2^{M?`yIS`17$p zGBTbqPH{z(Q3%QrbEnH=rHgxNJS2#j-o2eE;Llx9T3 zuGa#6JxSWt!?9DcIzGN9?lO#(#_!!$y^ysA5DB+^#|vOz z>g7;KR_a+7x#Qs6M5e^))XyUsQ6Hk&+z?-agGaWkinNI3@BA{0t*1_(iMYr)d4^4B zQ>y+Q=hIO7H9Q0>Z zCA_+FhO$+2xSr)ZBt;uwCe0u%*cLa!qbq+D74n-BAY_R!d4H7mo zKla@H;j#tF{-KH3r#V&8E)hnpVN2OWYiBUyXa{)F-gVx5Fn`Gdy&; zJxxBIi?x0$ZSh0QZiB@HDVLqNFC$YT0-3c5r#tYgcA3L#OVv)7^uh(VD4pN$zMs9E zEWqiq1w8+3Bw8y{P@-J4=<&2=3mEH0?3^0sdFN}guuZ(Emv2rRyEsMz3%yqF4ZH9r zq+{4O(jOu2{cF+uqFzV<+Ny%}5Ks9ynaMV9g~jCoj2K;#UB-V!Xp*&qItQ7maeVdZL)yJ(E%a6W%VRW6E)_6MC+t zoKWqdrtDlW^UnTVAh_zEDa3iUO^U0zWFL9LQ|(3{&yE%!rOc11nM4t-`z`OapS$ED z9Xq}L;okOuNdW0GNL3_(GL;l_S&3q%Z_&!cK3lbuL^Y|4w&4qQZII1E%ch>>CW2!; z^Q9d9wimw!NG5G^$4e>2cvR89hG@jRemgx|C8$%D3PU&3jaPh+Vftn2N{RY?+wXRo zqVjMyG(F8%xaF?UJmLjz$~wMS8#;xpY#-n%unBAedIO8%X0J#NQlfjgQ~d|~NI6v@ zVDFlrgTB&^lxH#l47@vFjT)@f4$=DpLwPemFPfpJ!2Lqt z=y|k~z7qRaWpBh~KsIIJO@He3N+#<{*s+AYAJ8Z-^d|6+hbiTWK$vlXcTbSXQ6614W5tX6ZaF(jeR`r|L8He*Kj3K#ZRapuu83E!38#T_K=q~!8q#1xz`dcfm{mDU8^k&?Lyhf$x;?AY4?6Wukx zcnI5ORe`tfgLGp-nXFP2}6vu%d z$#WKJA_qtaxQ6jGux~l;0mCWym- zSW4PFe-kBJFMSevPHBf?1GEyq5gz0MBPI(BX>%hS^ULLM*qN&<1y=A41aOGPxzp+N z!UFe^cVmL=6T@+Kc7BX_d^%R}{6u;ox!P)ndKW>I~){bf~2godta_O$EguB3;Bvkyg`VaIKNOgIr38W6ZIdy zOE;pmK_dC)5SeX8yc-asn@N9=e^se-iMCcv;2(@iO}3o+4lEcf;q zXE-{c0izg(##$OZ5wmZu2RIaal{l8K7?Q(H{o!^wGZJWZ) z13E+p-PzL+;mZC^t0dEKJj_eLkmOhBjGWoB!B{!q*E6LUEWB|myPOd^ zQb4KFpL-RO+l^RYF;sDFrlw{RDpkDzKm)`_4PQ%^OKC0UIC*+n6R5TQ$DrDp<7ru5 z%OsK3>(fQqO5!n8D@dHfG#f74J8U>Wkb3I{4KVf z0v3HXkZ8H_;NCo8M=hXI!l#Q;)2wvnOG1CLp8LByk7rL_f!3Vw?&-w32;R7iaIX%? zx_6Uiio+aU+gRmijhjj+9taMhZI;f`b{OGV}d0q1+) zzfS{hPOA%LDvnKAgk~e6DQQw6xs-Kn@IN-16S6J~9NAwQw*~oSl$Sr$)3A{lEaHJP z!;#8{{1fQg-I2*WTck6^(wfE)SfxksN|$f{S(D)7MF&HlkDMIRGqK}XZ}b?(0MKzZ zgepCEL}vE(9h?6E?Yic=$y}P%V zC)yJ0Ic74h3P>$;pcai9I@2b;&J?#|ZP{`MKKp~XE_!I9h#E`?{n z<0U>~_u?gz^J0}x&pj=Gf9m;apkBJB?uLQrm`iBbAbS>0>K{(3&_0TGPCqTF+gQnr zA_vI0FeAg2PCO^O-Zc4k_a#nxUp~(T(9ES?qs|WupxVTknr4i@(f2B;U#;6&J5Ksz zi+IH8iBWX3R)=tU`n3g;OJc+e^_!}>@14BU)huu6PhfnKac>t7#M~>41;?q1&|y+o1Ut#wmC}fZuov;^ zZsn1r2tlcso*E^T9;nD_kfy6AH>H%i(&DWV{Cup`cq^}I3aO+`?l1LOObE5OCG^5# zZNQBA!r3o!Sj?pBAXHZ3zlH3o2!A8H?*{*a$d0z@?hT~U{&UFgtJnW4vV;EzWQU&n zcgPN%Hm7{m6@QEI=xe^MZDBr0M%^r&_G;5K{q)vWD_O^w@I#_yMg4;^U(maYdW;9O z>QSyUQgWms7#g>=dY1z!`?ZLCOBdc6VHi;p)|wFFYHI()?8sP~o9xNDkJO^T3JCXN zq-Yj8w$xf%7)|PmP=}ltH47yydSL!ycHN@Lp5utkpIAJ}M}jv%k$2^*N!kq9>dqXb zd*{c$)g#jG7kUaklu;Dkd$rWiN+qRQCHxAX2;MBbm;X@Z+}k)?XM=(A^4Mx&J6EQW zjOfP8@>8X!ifqE%2_5)Rk(BKXFl5p)v}QR>^(&$Iy-suQGs*pbOA}!#e0XmA-L{ zF<<^|CuYCVzGdqopX329E)F9G|SEF>yetNL=F7Sv=La7(r8`qQB{y?m4;qTU};f|nQtA{2W2 z_+s7g@wJ`fc~QOb?Qn8C<}T0%`E3hfqOFT5FHf`smKJuF;oIV1`O}NvpzF>>J)2D< zD0X}NO4ESW=UJr3L(`_~C^OtR1C#Bh(i#^cjnBBTYD0hml%tnPC6i z%of<6nQ1jC`Lni6cIU5n|68pu(L4C!=2Y8l7+?7|r8+au#+?EH?QLBsE!Q_-?Vo`( zJ#4ncl;L`@` zR1IK6>$C==Eib{-i*O>f0$(juP)(vSPq0?+O1N!w)=t%(i`@|12KDLN4zzPevG+V- z+ZD9$Be!d_(zzqkz%%)i{{}o~Noj%%9J7+7FTiM-{IQkyay4E{A6(lkXWKdGU!q3u zHCr_Q5?6e>dzhq7bU&}K!jrJBb{a8bbL4YG))}w2b@;ZrOQ#!`!wzwgvvaONgwY$P zmSX`~i}H2RJv_l)ZfVs1F(x%LR1>|(F%J5|FtFgDLZUo@n@tmf0~TQ^S~pf1^BQEVk=bW|o)8xo)wvLV+a^ zW{KzZ=3lS&W`Ja8zyzr(S!3BZ-+P?6n(1*w^F?WDo>x% z(QEzWyT3A}7W?{qoWu6MqHFIf&Ok&_uFul^N1%;w-b!=b#FUSyqNPo2SObsWs8)S% zHFRC`P_rKepzTw#q+M0XHotTW=CJx}KyOZ}A&DCR_^D4z?h_8WydpdBn&rjR$*OcD zOL%0oj$Z`e*EP;M5?A{~Kg6E(@>`KgX$@lhD?4q&S<@*0MGLD8X4y|CRcjp&O(GMP z*!3_bEeqOln2-%X1b!L_KjI=o_*xMxklJQ9K|8YeYd{eCuqq#>r($ue0K5Mx(@Re0 z-OZGj5$P-TkejPo6RgQ+W6hGn8`eqWQrgzNfVBRur>Z_UPFHc7UxK0>Ho8`}nrbOEf_%oaVUJT$i-;^*rmI)rnnIwhD$JNW>W$141g#+DxsDaL zI&sZJhnyvZ32 ze&4dW^j%?=kJFfTq+!=h<5=7*zq06KSD9W2Er;K;Fx5gbJC<#bj?g|iy8Y`;eDk$= ze_5el>v)D8&|Fl#cTh;>xTFSItf%7LE<_gm+>?EugN`&ACTa=s0Ip6c4eU= zI6cTicZR*Dsy8J3ueq(`AKxs-p*DV?INyxm|28v>)!i z(=X`2;8rqrM_(ui6}GO>q?*zk@};G=hIsQN!L7aXpMQFjF9n;!m*>psk`MleaNP|K zpH%L;nr0H+6~$@v&OmOmzJWoJuyKr}trg)YY0HlQDh7;MF9IM7K}83OtW%A^z|eux z9k0+|z{Reb_R+4g80LhK8$-+LcJ9#vE->AKoMM{#2z9LO#}Y`_PgiMjUOi+)*N0$8 zDGWJ>1`>++$!PdfmvQ#vNzU&+jvFM>59lH0@Cx%nez#ZuVUw)C?Cmi;X5`_Q4CJXP+i#A0XC?^ERewbR*`&zars_Xm`T<+Z1pg!9V5435O?s5Gz-3s*}#f*nAQRvQ+_IbQ2MNSrXy^0|Wq4MFJr0+*&T2@ z7e4`=2Aj~y%aaETP3#xt8|n>jQH|-jS@|)L6|qNSf)xU$Q4c(Kw|8}lxzLxaQ-*Da zYJRl0>$w zvp;iN6#U3<;x%=PK8Cje0#Wj3|KfM(SZz?C>Q@o_Yk}#jsN!tIF7R)Fv)MVHyqlJr zG1TQl@K;~ywK_EJ?M}#v&kJTCPEAxAnfQRT!;xCM7w|bV<{igX_L0{=sGHPbH*v+o zM!d@&2P53qyX+{%q~P^y3Fsbs@hEdqPHX@LJ~Ai;&9QPdYlURe9&GthREtVi;zF+! z4MV=Ewpw#L9%QjD-`Wwj;M^?wgT1VlxJ3l0|8H<(m^d5*nqi%_B)JUnPU33f-G7;U zIMzZQ`|+YUDBl)59s80K)VoH!6u`Q?k}b0`6W7QBfHQb}T&y z!Kij{dnPK6ZIT-P1ErBO36({kUpBWg1wQ4!44UL}*D`OPSK`k`cE4IbYWTOr-mBMG zleiTqo{usizpIJdaC>3k=WW`iTVZFvGiT}N?l6h7HN+CFo(%U+%y{`+EQELW+!?i^ zKlr{|8~^mTJqT&kR*AcT>}NMUAm14^rSI#u>L2kkSf+NcmB~QuyE>(Rmj1(Dc+|B# zPHfC?NbgZNbH?eNM2knx-TL;5I6u={9SC|O)8H<^?)T2epEMf2kS&(OO5GJ?LZQE@fP zd-!b`i#}RB)VOE`8S5nvZIz0@wPGKmpW63l-51)HB{#_GX|P~J=QzbFPPIv>FB0Dd zc-B(hl-}uwYgvxNjDg;A24-UJAPrOI%IyC%m%GC^#Rk_pYOpK6q)YW2&4X_hk6A23 zR7OLJlgh+fNY_#AxUOa>NpT`>1A%@3z8b|Z38>Z8tL-zPGGljtLY6grtVC?xFk*qd`@%1<)MCp&W zXoRbWJEqNics`=-+;B1aC(vG_JK5uCM(6;Zv-gv=^SeJUr0seu!sY#`Jd6FPsd8;9o8ha^=kkAzK!2$%-(Ud2xB=7f=RAwZVWFlvZpW!;M+N>I3OHR^dB6(qEOPj6 zQrbT(^`8#>rYfO?cQ-6wigBjTc5hXejPamDUt$!?WYf5$uHoAMouuxchne`TB{!3t zW%@;eax;%JkyIsZB=h40_A9#mYBnswL3@FU?a7y7DM^K%l)3x z2#+0wM_dON7+c=6g;iVL=3H`@A1GV&OxjwdHFk2iD&hyrYXay;=|Ltq+Nca0);#?> zQc*N(EStu{5g~R2l45Tj24pcM7r-2^ze)gXbNJOJ9Gta8+tg7d_^23;_f19(IuB%u zOX3b8Kv}ZUDsO%xA+zfucU2-wbP%W%i?S{uR$NzIi-#Dutzqz0s%=rvUGcx(=;V%u zeW9_6UJ^+&QMOgBQiy8X#>=Zrxti&s6%tc~aU-sqv}b)*Edc!rM7GG$>#rMuM3r$L zd1x9U1QtR>>|yTgRp5GoD~p~d)qwz!^=F}77i%|lOv3RTNH3tm!Ha5auU z;wwoq)xa3jbS9fz?82NcjF=jpEeyWvkvjBG1|6()fZe%J2Zvxly8TAcbP;?-;%l01 zdclU7ymG?@3S-QNA0T>W^>d%{@n@4KVqmwr;^)u+8ilJxu=PZC@^3K0z|ys(XU$f@ z!$^>xoLut8^mJ!4qY{_@oSSEtQFySY>Ot*6;XT>F4SeH_H;m{U;Gy|4qe3XI^Zt9T zGxGk9lUX7>2GJ_^+*=#%Ff6)@_2lO^swqA%moBT4)c8YFG#Uel33Bd_j}%pIYq{6r#VPf!!kj{kMd{Z)6k5{qG5&RomXSqh>NeX3votrjo_#faQdVDh zMxs)=Brd&zUAzEKT8G9mN}BECI<+q<(B7APZbEXC7HpxN=!<*9Z?dL%Tq8;g*YoNa zT+!tb#Q6Q!mC>kFLT^3NkDSS#~qhnL*-+Kwy38^D(sUs$^s9)_NH${6st_bsOhE4wD z*y6dAl+eAYF?nM*_!Ns(+9;m4#1ub%Bk)kAVWRDMV$#>(9)McM)y95$ms@ zwLva^(oYgCx8t>IU}rXMw$~;2w`5bss1B7=GMGl5^0vYbB|%7#B&~dN-``kzMvdE< zA!inv_w|L3Vb|jp`OtZ(YoOcfJMZ5`&6~Te(huTkf4%rBQNjOwAwfIiZhuDc;r!-- zj8}qE*0xGUN%3hLUw>(y{#-UPRYqV>>P^Q>eT+d4p`3 zvby3GRUlE488^@%Y@nV6-JVL)~jJve=FQ9PTsi>se(6?vFN zA%-A0z2|eHOP29*B*?bS>2={=`X z4Ygl#If>5V8y?jz3>0_QDJdAQRwc~GbM~wZuQe^oHr3Sp}^9Yb0KZci8*8OIE()5AG!}c znQDu{H+5q4k$36Z?=S)3+`R1hX7}B9A#|?h7xP6N< z-!#i&>+y0*^)%ieC@a>=*Y;DR=^myqp|hr5Vq_L!|&oH2BTZBJV=2tjuc1O!Z$i55^fsA9@v8lz-m3*SU3SQ;cr> z7-8EJQs;701I@1PI-F0VwUE8p@xwJ%ZxqN)jS%zd4+;El%30UOVJ^OI6L9(x$ZCZV zy`VEn`QWb6Qr1uz-BtE8`|3xiT!&cx@CM*p4dm{aYsaS3H0f0aVr@H_t(FpS*9}M# ze@(b2cKrpOJa!#|NEPLdrkjAPHg1IAqoc-BrlV^e(wm~DPK!lkwgJ|mQoz}TUn5-r zC4KR{F|MbIL%UEro5?11S3;SxrDd6pOe^Bs+L+}^!JB|RcS$v8DI>_`h{lNS)!A9T z#;U59Wg!@E0-KM~34SoF4!y>zH{{so&NTl&06sYC|7U>jpkbhjO)KVM&BP~jtLkG~ zKKNJM+n;9Qd52Ec`0bc_Y?U5$8L}9CFsjN3@M_5A^6;k7o+d1zB zI(xyOaF|`oZk3g4SmD6P+DhJl4)Muwv^LquSnYq(l$U$c))R6&_-{)dpqSgX`I`lC zeJE?J>!e~fVKRm&_Dj@kUHdrJC4<|uOJ`M1uuhV#n1EQhy4`X(zs>!(nXb@N|F&h} z=N#!j@5oE&RX_ei8+6P*OY*quPcM0HJ^AFY(}|2|3%J)`4Z9Fyx}h#t=d})U+jX__ z^`l~DcL(@M(s^%6T8z-K;3vFCvZRUG694Uhpk;`*Og?4v~c zxb3=N-FWVZ3!nMMnl}kI;}D5odo4TYuYbm>1_GR2ZwncTzo2^(ts-L=-#CS0R?dvi z*#lzE@DiH1ow}E8B1K2-VA3aR0di6C3u58v+1oNMw+lSdswScx*GmIL)ya z&px;kh`*mwq~fs(eT;UvUesCz{qo1Zwd&9Lyd{68*kXVH9R`&9FsY*j2i|o5QEOS- zrWiLqP=Ar7nwPKE<60q#zg;VDk89Ox?Bj^|1wO#l(LqdMt~9@;-~CsthAh!L6-HmQ zOlVd57w846&|o7VA?@i_MK^6|yEFFIoRhfbUvX@PXo~K^NawIFpgsQ@bw>X%bE+!B zVYQWlK9f8D7DeHOJdK+^-BN9nMz#7I5mmwN9>-wixWh~u)$|rP*(-6%#E{;fe;RQQ zCGhywS*{~52*xh(3k&^v!V~p9=;c7Jsp3ITf&IHGtN6=ol9i*&BX#nn7jvML3M)clf90>ja8bpVE3|6ri=J!nJgvKy7_a-RKojO_puLc}L%f3O# z&}GR$<0BuD*8@bT^1UlwYLxHKnw3f@(U?5?r68|Ts#WcIvmw@6VWITT$&%*v7E0f? z;UgF}voXrki1~>Bu7bZ@14Pc3^9>p({XWnG@5?ZrZ%;*G=}rR;6P1vs^JP+jRh#~a zp939Qw|iXArib=Tu>5*U&yu<3fAc}0ENeqtcSC0*-COby6Y!>T^%0tVUc7AyurUg+ zXv{rRWh}r;iFNW}yx-OGug)-avK_UHYw@>EoD0l-iB=2ZigHA?&fh*JpZsuvPGOHL zE`OHmw^4@oJm=i%$P;zViD60PWPlsr*J88n-9_@d>{^U`{oD!6!PBUIH z{hseXCOR;H@9B`9x}6lr4tpkj?4?Rzt-=WbDMzln9#$P~xjfhRK`a1J7o8Y+Gxkb4 z^CQLU_lyXKQ_?X@d}8>{8Q`>{MV#EhD6Ta^q%8H0!T5U8=rp;M5vhArxkB{K&PFyh z;%2YV>9lqY%g|4$O8;ViVa={{6ss~yD!WeH5%EaJ+PCPJM_@-jk1{Mx!p&*B)s7W3 zEbD4;X9A61H)*UqHVeM^ds9VCdlI!1Bb>$x`{^EJU9*o&mbRUT5Jq4hEjp$sptV-f zo^`FMeXEFCRnyAN)8}#7@AS6TR~(pm3xFe!SueV`8nT=pHT6c=z)#DY?82W^b7Jls zzC6R`S8e-;|50bCRlASrZ57JV;C}6Ql)Pzp1G{;x30;N8G^73~Q@6R4Ba1J`UDxA) zQK!$&jEDNMb0>DK+@Qwjo-Ny(MwV(rvM(DB3^xRPu)&GnXtd=kz9kNL20vDN#=>Wh z2Yb6PFs1UnbX$yPndhAE)a*(7lP{art*@Mwf)VW3N)CKiB;kk|GKuq zmX_A6HVTziQA<}HGzwiP9;I9K_RU^j){?Phs3i#%AU04|9c&J{i~- zHn?$FFE`8_gc+qdIAUlH7I<%?^}{&6!lbYvw^28H(G{Ihdk~EAk^m~wa1Setn@S(T z%d2j-Q#KA@r-9m=zsQH*^Kzi=hlc6!i;kiC0c&K9EvHF!(8SOpbu4b`(dk&gm9Ps= z9$8VL{U~~z_Bu7AeNL+^-ZE9ZiQ(SW;z2_9QGk*b1WX(pAr@VJrnSE#F=B=NLZ>h_ zL@im3TrOMF_)Y4e-^rnp5jZL$gtVyK_XTC zyH3}f`fC%D*mP@hLuC>uHz`D3NAJ9CStAEVt+%nm?|(NywZXWL2nVOS9X*}jC}!ox z;c+8QePh0DVf^aIXBX+MAa-19(SV75YTdL@I1W{fuo^}txs11ektetOAQjo`G+hMb z>*E5Mr^FU4b;saBmcO8|mKCTTh{?Ik{P?A)oZ@$iDRbXzxp&1Uqt5cQma>i=2P}dq z@`jX-KJBTVfPGJ17-;PI7VZmKVP5LG#qhqZvP+Q0ZE;IA55vOecE-SCApX!c|yiWP{#m3uf0{E#I7O<7){5V#+D>jaYgY zjK!3Kst#}j^o#=b@7yVTv)nh^w6qd#1(}C)%F}M!xqAKsiB6zs3vCo zPh|(I=bz-1;>dU)i*|SWvdj`853kj^Ca443`LXSJA(9^G`=;I)ol(?Z_(3R1CVerk zj~g&4v03C%WiRB3 za6eJ>@u#yrMX^i@wq;@E3mAG<5;Axt2}z7^Bk{wDFcP$*so^em?Pq|0oLKyh+M_#3 zFu+Ea(b*-P`kClIBR-Q92Kv=unyM5 z9NM3w8)t6$gb8CjS$f4d*Xkyatwpz*6leAf#{lkoMD{7T>;(CG{1QUpI*Tf zR>*7Z7;2Gi4NgVxB^ofa zi~&kRXTKW&m53j}*b}X7^#e*p&QR0{69n^z9O)lBys}W_*0iPG4hdP!8^eap!Y}mPCeM> z6>hULU-?6A5)tC-6xVTDK4KMFMuE4@22@1vU@78~MCQ`JgibS@dsy)D7QC9`8>P2w zj4mWENDUwCsT$PKsOljpSQ#l=?icVlx;eK<936XruQvYX4ZZtJ*rQTiX{sWM@W|gX z(znZ|POnl`T68UlR4o==q*O4sGsj+WB!0?(7dv>s(RfJ|yB_Jm=5cE!twEgzEgw}+ zzKa+j@5%ZSY$4_Gb|6ukV1 zty?P^x>gBG*LKU^>0KF(3J$i*FV`maSE{gBcji8<-rT|~G`msaFT=3-@Bd}R=k}V_ zpPOy}b={S!qWpcj^K<%i6DuVDAOH6E)yJbh_kBzH{QdF1YnF%qR`Xdn?=C;2?``s0 zq_6q;x{%xPCh^HLEz6#+y5GHH-|^@Dg&*Cv{snG!*;oAe?;peR7pu3OHw|ChethMA zwz9fA`~H+|m5ks2Ax3;%*ll}#{|D#o-pLz>dBtzOaN>2?_YIbA+uq;)_^mQr>ef7V z`TqrMbH2`Bzq#JT_UAu0(`w^=*UoPIe)*``1iSS2pOyBpXY-gRXY1a!yS6jD#{Svw zjJ@}-o|d`xzGiD_dg%_y>RYMYZ|~iT$Xi@p`#0my_7kV?p5OQLQ|-qEh-_z{e@aELMzrNY;`)@vexhQ@=2lMrm->=_cBo;TeIk(au+C}bMf9Gmo?p?;^ zeF0|=Y~1^Qen^rt@Qx}_yFtbCdH%Hz6MXc+B#j_co3%=d0eKl>z zt>^jMtHX_Q|C`o?KK8!4=I^Ssl?Qk%RKc2;EHZkK)6IPDL+HAP^YTys=F7DI8v?vb z_i9#|_W!GOR$jT`*7MtHpShV@XCJ6E*?s@c_3uBkKHp*Qt`cgJr zf#D2sOi-X?!M3A}=})};GWTApJ>KxyL+l-A6)?N*n{jZ~_m`9B{Y18W3Z(G^Btv{) zMt}_JI@u5mF%U=w8A=v-!FgJ0%zjXx1I3P}9MFXGR?dK#4Kh}AGUIZ%@k^479t<(d zLf$ld{(RnkeOY<=<*yUrJ}GhG{(R6t-6y@B{pAI=Iq|h$L%*KZ-@oKFT!qTZ4zXv= ziGDNA@$p|;$ZPTb{{Hyd&u7hFTERog(`r%c&x9Gm%QhcwF3Dg%r?BS0_WO0S*G-2T zvP3y-26x-f1S?~kjCQLBH9tNi?iF&}A#>H%5|Va+Dwiw{p7FocGGPuULSfIL)D;hR zmmTJH&A+<~GFQVO!Z$->q9>_n&Tn-g)srK>{|le$)UqFW!}S0D1|A$YGd5 zjW$N;r5OP{%+UGg1rltqtKSWIpqFnnB#jyfniCogL-5SlXtDtZ1A(04`s3ko`PKiK X>muiJE&Oa$1=8c`>gTe~DWM4fbEn-{ literal 0 HcmV?d00001