From dd0fc2bceb817cd56a901c36de65d4187b026ca5 Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Sat, 31 May 2025 15:21:38 -0500 Subject: [PATCH 01/18] need to fix one test case shouldGraduallyIncreaseLimitWhenHealthy failing for AdaptiveRateLimiter.java --- pom.xml | 2 + rate-limiting-pattern/pom.xml | 52 ++++++ .../limiting/pattern/AdaptiveRateLimiter.java | 46 +++++ .../iluwatar/rate/limiting/pattern/App.java | 164 ++++++++++++++++++ .../limiting/pattern/FindCustomerRequest.java | 38 ++++ .../pattern/FixedWindowRateLimiter.java | 46 +++++ .../limiting/pattern/RateLimitException.java | 17 ++ .../limiting/pattern/RateLimitOperation.java | 10 ++ .../rate/limiting/pattern/RateLimiter.java | 14 ++ .../pattern/ServiceUnavailableException.java | 17 ++ .../limiting/pattern/ThrottlingException.java | 23 +++ .../pattern/TokenBucketRateLimiter.java | 60 +++++++ .../pattern/AdaptiveRateLimiterTest.java | 48 +++++ .../limiting/pattern/ConcurrencyTests.java | 65 +++++++ .../rate/limiting/pattern/ExceptionTests.java | 27 +++ .../pattern/FindCustomerRequestTest.java | 45 +++++ .../pattern/FixedWindowRateLimiterTest.java | 31 ++++ .../pattern/RateLimitOperationTest.java | 21 +++ .../limiting/pattern/RateLimiterTest.java | 25 +++ .../pattern/TokenBucketRateLimiterTest.java | 38 ++++ 20 files changed, 789 insertions(+) create mode 100644 rate-limiting-pattern/pom.xml create mode 100644 rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiter.java create mode 100644 rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java create mode 100644 rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequest.java create mode 100644 rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiter.java create mode 100644 rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitException.java create mode 100644 rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitOperation.java create mode 100644 rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimiter.java create mode 100644 rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ServiceUnavailableException.java create mode 100644 rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ThrottlingException.java create mode 100644 rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java create mode 100644 rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiterTest.java create mode 100644 rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ConcurrencyTests.java create mode 100644 rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ExceptionTests.java create mode 100644 rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java create mode 100644 rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java create mode 100644 rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimitOperationTest.java create mode 100644 rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimiterTest.java create mode 100644 rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiterTest.java diff --git a/pom.xml b/pom.xml index 8337c97966da..4cc69639b071 100644 --- a/pom.xml +++ b/pom.xml @@ -246,6 +246,8 @@ visitor backpressure actor-model + rate-limiting-pattern + rate-limiting-pattern diff --git a/rate-limiting-pattern/pom.xml b/rate-limiting-pattern/pom.xml new file mode 100644 index 000000000000..cde9591fd1b5 --- /dev/null +++ b/rate-limiting-pattern/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + + com.iluwatar + java-design-patterns + 1.26.0-SNAPSHOT + + + rate-limiter + + + 22 + 22 + UTF-8 + 5.11.1 + 1.11.1 + + + + + + org.junit.jupiter + junit-jupiter + ${junit.jupiter.version} + test + + + + org.assertj + assertj-core + 3.24.2 + test + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.1.2 + + false + + + + + diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiter.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiter.java new file mode 100644 index 000000000000..a7c565a85c9e --- /dev/null +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiter.java @@ -0,0 +1,46 @@ +package com.iluwatar.rate.limiting.pattern; + +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Adaptive rate limiter that adjusts limits based on system health. + */ +public class AdaptiveRateLimiter implements RateLimiter { + private final int initialLimit; + private final int maxLimit; + private final AtomicInteger currentLimit; + private final ConcurrentHashMap limiters = new ConcurrentHashMap<>(); + private final ScheduledExecutorService healthChecker = Executors.newScheduledThreadPool(1); + + public AdaptiveRateLimiter(int initialLimit, int maxLimit) { + this.initialLimit = initialLimit; + this.maxLimit = maxLimit; + this.currentLimit = new AtomicInteger(initialLimit); + healthChecker.scheduleAtFixedRate(this::adjustLimits, 10, 10, TimeUnit.SECONDS); + } + + @Override + public void check(String serviceName, String operationName) throws RateLimitException { + String key = serviceName + ":" + operationName; + int current = currentLimit.get(); + + RateLimiter limiter = limiters.computeIfAbsent(key, + k -> new TokenBucketRateLimiter(current, current)); + + try { + limiter.check(serviceName, operationName); + System.out.printf("[Adaptive] Allowed %s.%s - CurrentLimit: %d%n", serviceName, operationName, current); + } catch (RateLimitException e) { + currentLimit.updateAndGet(curr -> Math.max(initialLimit, curr / 2)); + System.out.printf("[Adaptive] Throttled %s.%s - Decreasing limit to %d%n", + serviceName, operationName, currentLimit.get()); + throw e; + } + } + + private void adjustLimits() { + int updated = currentLimit.updateAndGet(curr -> Math.min(maxLimit, curr + (initialLimit / 2))); + System.out.printf("[Adaptive] Health check passed - Increasing limit to %d%n", updated); + } +} \ No newline at end of file diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java new file mode 100644 index 000000000000..1774a9301cec --- /dev/null +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java @@ -0,0 +1,164 @@ +package com.iluwatar.rate.limiting.pattern; + +import java.util.Random; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * The Rate Limiter pattern is a key defensive strategy used to prevent system overload + * and ensure fair usage of shared services. This demo showcases how different rate limiting techniques + * can regulate traffic in distributed systems. + * + *

Specifically, this simulation implements three rate limiter strategies: + * + *

+ * + *

Each simulated service (e.g., S3, DynamoDB, Lambda) is governed by one of these limiters. Multiple + * concurrent client threads issue randomized requests to these services over a fixed duration. Each + * request is either: + * + *

+ * + *

Statistics are printed every few seconds, and the simulation exits gracefully after a fixed runtime, + * offering a clear view into how each limiter behaves under pressure. + * + *

Relation to AWS API Gateway:
+ * This implementation mirrors the throttling behavior described in the + * + * AWS API Gateway Request Throttling documentation, where limits are applied per second and over + * longer durations (burst and rate limits). The TokenBucketRateLimiter mimics burst capacity, + * the FixedWindowRateLimiter models steady rate enforcement, and the AdaptiveRateLimiter + * reflects elasticity in real-world systems like AWS Lambda under variable load. + * + * */ +public final class App { + private static final int RUN_DURATION_SECONDS = 10; + private static final int SHUTDOWN_TIMEOUT_SECONDS = 5; + + private static final AtomicInteger successfulRequests = new AtomicInteger(); + private static final AtomicInteger throttledRequests = new AtomicInteger(); + private static final AtomicInteger failedRequests = new AtomicInteger(); + private static final AtomicBoolean running = new AtomicBoolean(true); + + public static void main(String[] args) { + System.out.println("\nStarting Rate Limiter Demo"); + System.out.println("===================================="); + + ExecutorService executor = Executors.newFixedThreadPool(3); + ScheduledExecutorService statsPrinter = Executors.newSingleThreadScheduledExecutor(); + + try { + // Explicit limiter setup for demonstration clarity + TokenBucketRateLimiter tb = new TokenBucketRateLimiter(2, 1); // capacity 2, refill 1/sec + FixedWindowRateLimiter fw = new FixedWindowRateLimiter(3, 1); // max 3 req/sec + AdaptiveRateLimiter ar = new AdaptiveRateLimiter(2, 6); // adaptive from 2 to 6 req/sec + + // Print statistics every 2 seconds + statsPrinter.scheduleAtFixedRate(App::printStats, 2, 2, TimeUnit.SECONDS); + + // Launch 3 simulated clients + for (int i = 1; i <= 3; i++) { + executor.submit(createClientTask(i, tb, fw, ar)); + } + + // Run simulation for N seconds + Thread.sleep(RUN_DURATION_SECONDS * 1000L); + System.out.println("\nShutting down the demo..."); + + running.set(false); + executor.shutdown(); + statsPrinter.shutdown(); + + if (!executor.awaitTermination(SHUTDOWN_TIMEOUT_SECONDS, TimeUnit.SECONDS)) { + executor.shutdownNow(); + } + if (!statsPrinter.awaitTermination(SHUTDOWN_TIMEOUT_SECONDS, TimeUnit.SECONDS)) { + statsPrinter.shutdownNow(); + } + + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } finally { + printFinalStats(); + System.out.println("Demo completed."); + } + } + + private static Runnable createClientTask(int clientId, + RateLimiter s3Limiter, + RateLimiter dynamoDbLimiter, + RateLimiter lambdaLimiter) { + return () -> { + String[] services = {"s3", "dynamodb", "lambda"}; + String[] operations = { + "GetObject", "PutObject", "Query", "Scan", "PutItem", "Invoke", "ListFunctions" + }; + Random random = new Random(); + + while (running.get() && !Thread.currentThread().isInterrupted()) { + try { + String service = services[random.nextInt(services.length)]; + String operation = operations[random.nextInt(operations.length)]; + + switch (service) { + case "s3" -> makeRequest(clientId, s3Limiter, service, operation); + case "dynamodb" -> makeRequest(clientId, dynamoDbLimiter, service, operation); + case "lambda" -> makeRequest(clientId, lambdaLimiter, service, operation); + } + + Thread.sleep(30 + random.nextInt(50)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + }; + } + + private static void makeRequest(int clientId, RateLimiter limiter, + String service, String operation) { + try { + limiter.check(service, operation); + successfulRequests.incrementAndGet(); + System.out.printf("Client %d: %s.%s - ALLOWED%n", clientId, service, operation); + } catch (ThrottlingException e) { + throttledRequests.incrementAndGet(); + System.out.printf("Client %d: %s.%s - THROTTLED (Retry in %dms)%n", + clientId, service, operation, e.getRetryAfterMillis()); + } catch (ServiceUnavailableException e) { + failedRequests.incrementAndGet(); + System.out.printf("Client %d: %s.%s - SERVICE UNAVAILABLE%n", + clientId, service, operation); + } catch (Exception e) { + failedRequests.incrementAndGet(); + System.out.printf("Client %d: %s.%s - ERROR: %s%n", + clientId, service, operation, e.getMessage()); + } + } + + private static void printStats() { + if (!running.get()) return; + System.out.println("\n=== Current Statistics ==="); + System.out.printf("Successful Requests: %d%n", successfulRequests.get()); + System.out.printf("Throttled Requests : %d%n", throttledRequests.get()); + System.out.printf("Failed Requests : %d%n", failedRequests.get()); + System.out.println("==========================\n"); + } + + private static void printFinalStats() { + System.out.println("\nFinal Statistics"); + System.out.println("=========================="); + System.out.printf("Successful Requests: %d%n", successfulRequests.get()); + System.out.printf("Throttled Requests : %d%n", throttledRequests.get()); + System.out.printf("Failed Requests : %d%n", failedRequests.get()); + System.out.println("=========================="); + } +} \ No newline at end of file diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequest.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequest.java new file mode 100644 index 000000000000..28ada548a1d0 --- /dev/null +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequest.java @@ -0,0 +1,38 @@ +package com.iluwatar.rate.limiting.pattern; + +/** + * Example operation implementation for finding customers. + */ +public class FindCustomerRequest implements RateLimitOperation { + private final String customerId; + private final RateLimiter rateLimiter; + + public FindCustomerRequest(String customerId, RateLimiter rateLimiter) { + this.customerId = customerId; + this.rateLimiter = rateLimiter; + } + + @Override + public String getServiceName() { + return "CustomerService"; + } + + @Override + public String getOperationName() { + return "FindCustomer"; + } + + @Override + public String execute() throws RateLimitException { + rateLimiter.check(getServiceName(), getOperationName()); + + // Simulate actual operation + try { + Thread.sleep(50); // Simulate processing time + return "Customer-" + customerId; + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new ServiceUnavailableException(getServiceName(), 1000); + } + } +} \ No newline at end of file diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiter.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiter.java new file mode 100644 index 000000000000..697cecd5d7e0 --- /dev/null +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiter.java @@ -0,0 +1,46 @@ +package com.iluwatar.rate.limiting.pattern; + +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Fixed window rate limiter implementation. + */ +public class FixedWindowRateLimiter implements RateLimiter { + private final int limit; + private final long windowMillis; + private final ConcurrentHashMap counters = new ConcurrentHashMap<>(); + + public FixedWindowRateLimiter(int limit, long windowSeconds) { + this.limit = limit; + this.windowMillis = TimeUnit.SECONDS.toMillis(windowSeconds); + } + + @Override + public synchronized void check(String serviceName, String operationName) throws RateLimitException { + String key = serviceName + ":" + operationName; + WindowCounter counter = counters.computeIfAbsent(key, k -> new WindowCounter()); + + if (!counter.tryIncrement()) { + System.out.printf("[FixedWindow] Throttled %s.%s - Limit %d reached in window%n", + serviceName, operationName, limit); + throw new RateLimitException("Rate limit exceeded for " + key, windowMillis); + } else { + System.out.printf("[FixedWindow] Allowed %s.%s - Count within window%n", serviceName, operationName); + } + } + + private class WindowCounter { + private AtomicInteger count = new AtomicInteger(0); + private volatile long windowStart = System.currentTimeMillis(); + + synchronized boolean tryIncrement() { + long now = System.currentTimeMillis(); + if (now - windowStart > windowMillis) { + count.set(0); + windowStart = now; + } + return count.incrementAndGet() <= limit; + } + } +} \ No newline at end of file diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitException.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitException.java new file mode 100644 index 000000000000..788b9fcd816c --- /dev/null +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitException.java @@ -0,0 +1,17 @@ +package com.iluwatar.rate.limiting.pattern; + +/** + * Base exception for rate limiting errors. + */ +public class RateLimitException extends Exception { + private final long retryAfterMillis; + + public RateLimitException(String message, long retryAfterMillis) { + super(message); + this.retryAfterMillis = retryAfterMillis; + } + + public long getRetryAfterMillis() { + return retryAfterMillis; + } +} \ No newline at end of file diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitOperation.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitOperation.java new file mode 100644 index 000000000000..243ea66106dc --- /dev/null +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitOperation.java @@ -0,0 +1,10 @@ +package com.iluwatar.rate.limiting.pattern; + +/** + * Interface representing an operation that needs rate limiting. + */ +public interface RateLimitOperation { + String getServiceName(); + String getOperationName(); + T execute() throws RateLimitException; +} diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimiter.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimiter.java new file mode 100644 index 000000000000..3c6b15e1a47f --- /dev/null +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimiter.java @@ -0,0 +1,14 @@ +package com.iluwatar.rate.limiting.pattern; + +/** + * Interface for rate limiting operations. + */ +public interface RateLimiter { + /** + * Checks if a request is allowed under current rate limits + * @param serviceName Service being called (e.g., "dynamodb") + * @param operationName Operation being performed (e.g., "Query") + * @throws RateLimitException if request exceeds limits + */ + void check(String serviceName, String operationName) throws RateLimitException; +} diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ServiceUnavailableException.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ServiceUnavailableException.java new file mode 100644 index 000000000000..04426330a13a --- /dev/null +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ServiceUnavailableException.java @@ -0,0 +1,17 @@ +package com.iluwatar.rate.limiting.pattern; + +/** + * Exception for when a service is temporarily unavailable. + */ +public class ServiceUnavailableException extends RateLimitException { + private final String serviceName; + + public ServiceUnavailableException(String serviceName, long retryAfterMillis) { + super("Service temporarily unavailable: " + serviceName, retryAfterMillis); + this.serviceName = serviceName; + } + + public String getServiceName() { + return serviceName; + } +} diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ThrottlingException.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ThrottlingException.java new file mode 100644 index 000000000000..2c85621640e5 --- /dev/null +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ThrottlingException.java @@ -0,0 +1,23 @@ +package com.iluwatar.rate.limiting.pattern; + +/** + * Exception thrown when AWS-style throttling occurs. + */ +public class ThrottlingException extends RateLimitException { + private final String serviceName; + private final String errorCode; + + public ThrottlingException(String serviceName, String operationName, long retryAfterMillis) { + super("AWS throttling error for " + serviceName + "/" + operationName, retryAfterMillis); + this.serviceName = serviceName; + this.errorCode = "ThrottlingException"; + } + + public String getServiceName() { + return serviceName; + } + + public String getErrorCode() { + return errorCode; + } +} diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java new file mode 100644 index 000000000000..549dfae5c720 --- /dev/null +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java @@ -0,0 +1,60 @@ +package com.iluwatar.rate.limiting.pattern; + +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Token bucket rate limiter implementation. + */ +public class TokenBucketRateLimiter implements RateLimiter { + private final int capacity; + private final int refillRate; + private final ConcurrentHashMap buckets = new ConcurrentHashMap<>(); + private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + + public TokenBucketRateLimiter(int capacity, int refillRate) { + this.capacity = capacity; + this.refillRate = refillRate; + scheduler.scheduleAtFixedRate(this::refillBuckets, 1, 1, TimeUnit.SECONDS); + } + + @Override + public void check(String serviceName, String operationName) throws RateLimitException { + String key = serviceName + ":" + operationName; + TokenBucket bucket = buckets.computeIfAbsent(key, k -> new TokenBucket(capacity)); + + if (!bucket.tryConsume()) { + System.out.printf("[TokenBucket] Throttled %s.%s - No tokens available%n", serviceName, operationName); + throw new ThrottlingException(serviceName, operationName, 1000); + } else { + System.out.printf("[TokenBucket] Allowed %s.%s - Tokens remaining%n", serviceName, operationName); + } + } + + + private void refillBuckets() { + buckets.forEach((k, b) -> b.refill(refillRate)); + } + + private static class TokenBucket { + private final int capacity; + private final AtomicInteger tokens; + + TokenBucket(int capacity) { + this.capacity = capacity; + this.tokens = new AtomicInteger(capacity); + } + + boolean tryConsume() { + while (true) { + int current = tokens.get(); + if (current <= 0) return false; + if (tokens.compareAndSet(current, current - 1)) return true; + } + } + + void refill(int amount) { + tokens.getAndUpdate(current -> Math.min(current + amount, capacity)); + } + } +} diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiterTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiterTest.java new file mode 100644 index 000000000000..b3207c019390 --- /dev/null +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiterTest.java @@ -0,0 +1,48 @@ +package com.iluwatar.rate.limiting.pattern; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class AdaptiveRateLimiterTest { + @Test + void shouldDecreaseLimitWhenThrottled() throws Exception { + AdaptiveRateLimiter limiter = new AdaptiveRateLimiter(10, 20); + + // Exceed initial limit + for (int i = 0; i < 11; i++) { + try { + limiter.check("test", "op"); + } catch (RateLimitException e) { + // Expected after 10 requests + } + } + + // Verify limit was reduced + assertThrows(RateLimitException.class, () -> { + for (int i = 0; i < 6; i++) { // New limit should be 5 (10/2) + limiter.check("test", "op"); + } + }); + } + + @Test + void shouldGraduallyIncreaseLimitWhenHealthy() throws Exception { + AdaptiveRateLimiter limiter = new AdaptiveRateLimiter(10, 20); + + // Force limit reduction + for (int i = 0; i < 11; i++) { + try { + limiter.check("test", "op"); + } catch (RateLimitException e) {} + } + + // Wait for health check (adjustment happens every 10 seconds) + Thread.sleep(10500); + + // Verify limit was increased + for (int i = 0; i < 8; i++) { // New limit should be 10 (5 + 5) + limiter.check("test", "op"); + } + assertThrows(RateLimitException.class, () -> limiter.check("test", "op")); + } +} \ No newline at end of file diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ConcurrencyTests.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ConcurrencyTests.java new file mode 100644 index 000000000000..f4efb723d29e --- /dev/null +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ConcurrencyTests.java @@ -0,0 +1,65 @@ +package com.iluwatar.rate.limiting.pattern; + +import org.junit.jupiter.api.Test; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.junit.jupiter.api.Assertions.*; + +class ConcurrencyTests { + @Test + void tokenBucketShouldHandleConcurrentRequests() throws Exception { + int threadCount = 10; + int requestLimit = 5; + RateLimiter limiter = new TokenBucketRateLimiter(requestLimit, requestLimit); + ExecutorService executor = Executors.newFixedThreadPool(threadCount); + CountDownLatch latch = new CountDownLatch(threadCount); + + AtomicInteger successCount = new AtomicInteger(); + AtomicInteger failureCount = new AtomicInteger(); + + for (int i = 0; i < threadCount; i++) { + executor.submit(() -> { + try { + limiter.check("test", "op"); + successCount.incrementAndGet(); + } catch (RateLimitException e) { + failureCount.incrementAndGet(); + } + latch.countDown(); + }); + } + + latch.await(); + assertEquals(requestLimit, successCount.get()); + assertEquals(threadCount - requestLimit, failureCount.get()); + } + + @Test + void adaptiveLimiterShouldAdjustUnderLoad() throws Exception { + AdaptiveRateLimiter limiter = new AdaptiveRateLimiter(10, 20); + ExecutorService executor = Executors.newFixedThreadPool(20); + + // Flood with requests to trigger throttling + for (int i = 0; i < 30; i++) { + executor.submit(() -> { + try { + limiter.check("test", "op"); + } catch (RateLimitException ignored) {} + }); + } + + Thread.sleep(15000); // Wait for adjustment + + // Verify new limit is in effect + int allowed = 0; + for (int i = 0; i < 20; i++) { + try { + limiter.check("test", "op"); + allowed++; + } catch (RateLimitException ignored) {} + } + + assertTrue(allowed > 5 && allowed < 15); // Should be between initial and max + } +} \ No newline at end of file diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ExceptionTests.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ExceptionTests.java new file mode 100644 index 000000000000..6cbeee082100 --- /dev/null +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ExceptionTests.java @@ -0,0 +1,27 @@ +package com.iluwatar.rate.limiting.pattern; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class ExceptionTests { + @Test + void rateLimitExceptionShouldContainRetryInfo() { + RateLimitException exception = new RateLimitException("Test", 1000); + assertEquals(1000, exception.getRetryAfterMillis()); + assertEquals("Test", exception.getMessage()); + } + + @Test + void throttlingExceptionShouldContainServiceInfo() { + ThrottlingException exception = new ThrottlingException("dynamodb", "Query", 500); + assertEquals("dynamodb", exception.getServiceName()); + assertEquals("ThrottlingException", exception.getErrorCode()); + } + + @Test + void serviceUnavailableExceptionShouldContainRetryInfo() { + ServiceUnavailableException exception = new ServiceUnavailableException("s3", 2000); + assertEquals("s3", exception.getServiceName()); + assertEquals(2000, exception.getRetryAfterMillis()); + } +} \ No newline at end of file diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java new file mode 100644 index 000000000000..4e075fd4cfd7 --- /dev/null +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java @@ -0,0 +1,45 @@ +package com.iluwatar.rate.limiting.pattern; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class FindCustomerRequestTest implements RateLimitOperationTest { + + @Override + public RateLimitOperation createOperation(RateLimiter limiter) { + return new FindCustomerRequest("123", limiter); + } + + @Test + void shouldExecuteWhenUnderRateLimit() throws Exception { + RateLimiter limiter = new TokenBucketRateLimiter(10, 10); + RateLimitOperation request = createOperation(limiter); + + String result = request.execute(); + assertEquals("Customer-123", result); + } + + @Test + void shouldThrowWhenRateLimitExceeded() { + RateLimiter limiter = new TokenBucketRateLimiter(0, 0); // Always throttled + RateLimitOperation request = createOperation(limiter); + + assertThrows(RateLimitException.class, request::execute); + } + + @Test + void shouldReturnCorrectServiceAndOperationNames() { + RateLimiter limiter = new TokenBucketRateLimiter(10, 10); + FindCustomerRequest request = new FindCustomerRequest("123", limiter); + + assertEquals("CustomerService", request.getServiceName()); + assertEquals("FindCustomer", request.getOperationName()); + } + + // Reuse helper logic from the interface for coverage + @Test + void shouldExecuteUsingDefaultHelper() throws Exception { + RateLimiter limiter = new TokenBucketRateLimiter(5, 5); + shouldExecuteWhenUnderLimit(createOperation(limiter)); + } +} diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java new file mode 100644 index 000000000000..71b798cd9388 --- /dev/null +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java @@ -0,0 +1,31 @@ +package com.iluwatar.rate.limiting.pattern; + +import org.junit.jupiter.api.Test; +import java.util.concurrent.TimeUnit; +import static org.junit.jupiter.api.Assertions.*; + +class FixedWindowRateLimiterTest extends RateLimiterTest { + @Override + protected RateLimiter createRateLimiter(int limit, long windowMillis) { + return new FixedWindowRateLimiter(limit, windowMillis / 1000); + } + + @Test + void shouldResetCounterAfterWindow() throws Exception { + FixedWindowRateLimiter limiter = new FixedWindowRateLimiter(1, 1); + limiter.check("test", "op"); + assertThrows(RateLimitException.class, () -> limiter.check("test", "op")); + + TimeUnit.SECONDS.sleep(1); + limiter.check("test", "op"); + } + + @Test + void shouldNotAllowMoreThanLimitInWindow() throws Exception { + FixedWindowRateLimiter limiter = new FixedWindowRateLimiter(3, 1); + for (int i = 0; i < 3; i++) { + limiter.check("test", "op"); + } + assertThrows(RateLimitException.class, () -> limiter.check("test", "op")); + } +} \ No newline at end of file diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimitOperationTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimitOperationTest.java new file mode 100644 index 000000000000..7a00a584d3d1 --- /dev/null +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimitOperationTest.java @@ -0,0 +1,21 @@ +package com.iluwatar.rate.limiting.pattern; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +interface RateLimitOperationTest { + + RateLimitOperation createOperation(RateLimiter limiter); + + @Test + default void shouldThrowWhenRateLimited() { + RateLimiter limiter = new TokenBucketRateLimiter(0, 0); // Always throttled + RateLimitOperation operation = createOperation(limiter); + assertThrows(RateLimitException.class, operation::execute); + } + + // ✅ No @Test here, just a helper method + default void shouldExecuteWhenUnderLimit(RateLimitOperation operation) throws Exception { + assertNotNull(operation.execute()); + } +} diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimiterTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimiterTest.java new file mode 100644 index 000000000000..92ec44457dfe --- /dev/null +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimiterTest.java @@ -0,0 +1,25 @@ +package com.iluwatar.rate.limiting.pattern; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +public abstract class RateLimiterTest { + protected abstract RateLimiter createRateLimiter(int limit, long windowMillis); + + @Test + void shouldAllowRequestsWithinLimit() throws Exception { + RateLimiter limiter = createRateLimiter(5, 1000); + for (int i = 0; i < 5; i++) { + limiter.check("test", "op"); + } + } + + @Test + void shouldThrowWhenLimitExceeded() throws Exception { + RateLimiter limiter = createRateLimiter(2, 1000); + limiter.check("test", "op"); + limiter.check("test", "op"); + assertThrows(RateLimitException.class, () -> limiter.check("test", "op")); + } +} \ No newline at end of file diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiterTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiterTest.java new file mode 100644 index 000000000000..ea8bc530d058 --- /dev/null +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiterTest.java @@ -0,0 +1,38 @@ +package com.iluwatar.rate.limiting.pattern; + +import org.junit.jupiter.api.Test; +import java.util.concurrent.TimeUnit; +import static org.junit.jupiter.api.Assertions.*; + +class TokenBucketRateLimiterTest extends RateLimiterTest { + @Override + protected RateLimiter createRateLimiter(int limit, long windowMillis) { + return new TokenBucketRateLimiter(limit, (int)(limit * 1000 / windowMillis)); + } + + @Test + void shouldAllowBurstRequests() throws Exception { + TokenBucketRateLimiter limiter = new TokenBucketRateLimiter(10, 5); + for (int i = 0; i < 10; i++) { + limiter.check("test", "op"); + } + } + + @Test + void shouldRefillTokensAfterTime() throws Exception { + TokenBucketRateLimiter limiter = new TokenBucketRateLimiter(1, 1); + limiter.check("test", "op"); + assertThrows(RateLimitException.class, () -> limiter.check("test", "op")); + + TimeUnit.SECONDS.sleep(1); + limiter.check("test", "op"); + } + + @Test + void shouldHandleMultipleServicesSeparately() throws Exception { + TokenBucketRateLimiter limiter = new TokenBucketRateLimiter(1, 1); + limiter.check("service1", "op"); + limiter.check("service2", "op"); + assertThrows(RateLimitException.class, () -> limiter.check("service1", "op")); + } +} \ No newline at end of file From ed01b7be4dc1a31705fad29097ce11a0791c1b04 Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Sun, 1 Jun 2025 08:42:23 -0500 Subject: [PATCH 02/18] Added Class Diagram and Flow Diagrams for Adaptive, Fixed Window and Token Bucket Rate Limiter --- .../etc/Adaptive Rate Limiter.png | Bin 0 -> 117129 bytes .../etc/Fixed Window Rate Limiter.png | Bin 0 -> 105244 bytes .../etc/Token Bucket Rate Limiter.png | Bin 0 -> 122458 bytes .../etc/UML Class Diagram.png | Bin 0 -> 122880 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 rate-limiting-pattern/etc/Adaptive Rate Limiter.png create mode 100644 rate-limiting-pattern/etc/Fixed Window Rate Limiter.png create mode 100644 rate-limiting-pattern/etc/Token Bucket Rate Limiter.png create mode 100644 rate-limiting-pattern/etc/UML Class Diagram.png diff --git a/rate-limiting-pattern/etc/Adaptive Rate Limiter.png b/rate-limiting-pattern/etc/Adaptive Rate Limiter.png new file mode 100644 index 0000000000000000000000000000000000000000..2d849ee8d05757acbbf37b980d7579fe6872364e GIT binary patch literal 117129 zcmeFZcT|&E_b(oG)NvePW-N@B8v-kPz&;INk z{vxgPbZK$@A zZyA5a@5ANxkfnB=kSEvMxAi@?y;{Gks$-9eYURbl!Sl&RJ}>@wlqUOd@~7{8Ud6UO z8;xJ!O|T^0Qm)CIjwaD3ZcAs-Y{toS$xID@`!Z5^;!veKNd%1KAFp3`-ZY=y{Eq|R z$LPe^A5^|R)b;1Rluch9ir#nl-S=M|fxSL*!0qcJ&-Hhl-17Ay1;dB?zdmx~^4a#U zkNg_@({;!e|9IIv`|ptcyGs8XzGR-L=yaP;*OPI5AI@}bk5#g)-Sd2Nm=7)#-<9j1 z+x8Ei0zXb(yZ_zEgviBQJKl%{d(J`id(EY1Hgr&eobYSYcoaWwR^t0=;M`=WA=@2SLro2 zo7|pT_fjI%^-j}&H%$I|U!5vHdoKkOb?suV5iH4>q|4#({q4N}bKJUB;4GmgtH3ZB zcAS1O=&L8e+7k92e8=CI&5lMtpZ39IdHb*T_(B0V<3F}<@#+7YdmOUM%_;n4vZThx z^7asBgPrEwjJ^%0{*1c|7@$ATKFUV6s@kXjm|jE31&5z?)X3|Rt7a5Oo~jw5&}%bw>!o_G;Ns-9lqyFy8z&f+SDqS`>F|#-Y74#FnL_u> zC4GGRxTRvCvSm_(+E_;Gxn>FZg=MYeS1abE@!IS`3Wv$-pQ|#!z=^(5!WjMUY?20S z#Scu<4m_zH_9#kBc=f^=AMsnBF(&JUoZ#?QZKlt*7nM|dtVtn%l}3jAwlbV; zDl$x9Do@|4zg4BWD<@Lf)51h+A}T3VK~z`!Al-g-0J@-?vLxt`r>RP%Fg16#1`FzVt zy8A<1V3Ebpx_n)(TfP*V9wR{IV?s-ZXkjaZ+9SSofwew0k?$WzXdJ>IHFwJyD-t3< z+;KD_NvG3)f1%eAujQ3q#^5GCM$SxYvyusuXzR+>k<)9oThMR=WP_te(D19#r?_i$ zO2f*kAN1Q0qcT4;z;3t<=a$_y>rqsaCRi6SL20k8?%uB+`SxJKkX)r3WLbau7-urY zSLUf=rdDD?*?Jm=Br@WQPRk5xf6N(gd+DCl)=Sb(Hg)Sb7Mx^)^2SalvbSY+=d=YR zcV@DdBezdBaCARJh-#1C7)^RNI);+a9mjE2xMjxb#AWsI3~-?#C$4s~t&V{zl_PvVr zP+~*-a3@9%!QfBm80%KDdHnVUAz7fIxXzQx;OMRXf~bh1M4;e$tAeAcCnt2IQopjL z)7A=LOHsY0#*68?Iuq|rKXhQn5;5QF=#8n*48uq3$kL9TU=w&P)R<;*N7%;I!N6v1 z921Qf-F_4;+P%3~lsB|rynqqifsf`y@Kh_Cf<~StYjN*6`*9Nqop(j`G%0BkL4wTF zxBVc`M8iCw%^0~|=7}w{MvIv7e8wSsiTHZD7Y%Pg@*dU;NQ)XXt5?!?Whh=asy%!= zvr6T55B2q5TeBi4MkG}&B5Z)sbzogY_ZPZ-2yt`5O=!*Z#WK)R)gyWJjFS}IgCzbu zHzRW3V{@UegR@20D1JR{$Z0*WG8{7o-D9ZGG68~X|4&>!FP3hyriS`l{Q9J=FNqT( z9v|%Aa%I>8Wfvk4tpq2BE`0h?LHara08a+5Nu^>@OuZEhxRNX#;Wz$Vg)Y#Q*O{u`8B(jrD?%?LNLBJIdEgXSKJ10G2GER@QKBh*|DZGe!#r(uEt zq1gGrxjK%t##Hn=Do0zIqQT|SPAt{y>g8%m#7BWWmd879-{w4U;?l0KwtsPmjd^W! zQeR{T$vtMinwS|(Nr#6D?w>@U)_IXt#0ojgt&0%aFf;h;eRJdL(4D8jM9#MrR}U8s z5tzEra^j;_aNM3OVVPurVxXSSjgpml3GcGk82Emb6`I`=x(x+a=YJZ=2>z6izRM$i zKhF=kr?2$wkZii>Fu@l^{Y2oaBD!yfK~UwMY@d2pgy$xrIhW2IaY90Y-drNErz|vL zjj3|qNuzK9fxlKOQ2|_x+PKcKJ;oG@jCiA8DG^ZXqU+~F9SOC3IUJi24&m1aK}_T! z2=BDKu*Md)-u<$(>cQH%<=&Ktl~%~*I3(TRJ1vkAm6uuwACg!2QE|0y>iNKldvpEs zWwBfh8X=*>#=`_DY22cTv|`EO8*&9c zs#=E;(7uKf$vml)ssS4n;GzipYr3#4*hCNsEgR(fSvqRIR}C;q{nQWHrtQ#BDW}&6 zXm~i%70a4sukn%WhfTe;<`cr@x$-f!{Q-;wv&wJ^tA?@=V~d81ty3!?V+3CNisDA^ z{b0EF`uK#rqu~Y)B2WpsX{qjl6(kfKvb$UgCT6>2gnvrbNpP^4jrGg`?$MP&YB?8VvZ^iXR;pC@q=7;x=qermgw}Wv_ zOQB+d)2elxjzEG;7BuFQ&W@dBWpxL@^PWfr4+h~!D8N-|@wK^Y4=7;_)&5^_VL@VtN7A$75lyfh!)NGgSa=e+8V2m~!OK-#61^CXw+Plge!YgX9`ly}Y_{EG2TrrsRS+HyymNDb(eiBl}}h0u-v0-R9af<{mn;;>+Ne-c+CD+qhoNgzV5pL-vVR;;p5jT!*o$I`a)Fe)bBP)3ep%8R?Lhks|?NM$^xL-Rq z;YgX~clN@$3VC#nq*^A}>W~G{%XCZUCRf9211M;U8dTe!i0o1>tF+Fg$Uz61>obfm zxil~441`ZKE-|c=!>XBHBKPkayDP*p#EXT3uI)-ed6`D#|gKr=~g$UCv)E zChWM-BJBr%5Q>wwJnIOoP`Ixp)^DCHd@bp;KDJAp-cJ^!W)oD)FaJ`R+Y!QChup)z zYZH%FOA%FyDU}hlIU`VN-Xrb)W4OEZY}Uu7L#=N{z)mHVDGCvQ#?)Va7)l=>q05~k zkpTX)KRhH%PL41PQGAyvE_-YRaFFVE%OyvWmO|c>O^yU7IQ%>t`N9Zw@TDFW_^LZV z)wTp*0QgH8RmhvG>`;FgEc6obG9lb{?jqDga1~=Z)EfZ-)KInX9%`Q<_k25NC z(&d-?+`-6vHCv}^9V?D&spx^+u z<*3sTA&>HAJB0T}C~fu}o9i-A3|a0pRvJuB<>^$KV6TA{Av-S_c|6Cigo=2eSTMDP^mZ1l!VUC>Uf7h zON<#x-QzJTEm1C`t2+>n7!Y|gL-l*#|Si7lk4|OMEEwKr9_m0ojz7pE>9<2Kmv5cUUf1BPBgforF&(2!U5b zN}!|%qQmEP{Y-I_G;{wJc1t+J*H4=wI4^vRq-II_eIzGYd*}YTte$YXo^NdnhVDO% zXaVFACw#-I0LTe=-2t!yN--aq;1HC>c=4O#SmdXsiOE8+?4w~VV?zxjAKJuR5AF)1 zo)(OYSPhI_#w)bb-5q32j-T!2F&bKwB^#^}0w8>F>kjBvq3f6l2yI$bqQddrVUR(gfC;ex?C8R5J&zGSv>GenI=nP(U3V@< zmKPfQ{_*({`T2Y*AoPgs}_L&yL6LO5B_ac;a(AqjMy}30Vk`006p~ z=zdD^^G2|W9ECnlTW$dZ(}tlu#rZuxLyL)5hvFW8hJ~R*!5(@%SQg(3pPRVZvWA1n zj@()8)rIWPRiy-1A)ZIIOcuhSI}g}+c0f~v#_XOI5qW1hLw%|pddrezdW0jfeLsfW z<})6ovm36Md{`zsJf)1?^7kRkn#RTFpW2o?0o_rdKWuUZj7!ZObKAp5Ceof8fj|MO zTsLa2fxykOAjSiRh~*=j7BO`zdgE+5Br~vh7Hb!ERu>+gANwFig_5UugqhGuhM1Kvpb6de%#4Qr;MGVkg+rUhh(Dow*|LmGr8rZ zrNmhv`gMjg8!*-0BUEO#W4nQh`y?%@J}un`uOlO*v`h~KHt|;;=uuleOWSJgHQhnp z#b)U_bj%G^`cp76ojJrSJ%M+3vG_Z){kcj}nb`42IRJCXKSo6yMD);&RJqqVJ{qi) z-74P0OJ3E}?{O21aKHD@*~*j6?+?)Ov$(c-#_3tm^U)q767^77!(%nUiyyZ06bRl_Yo8vjT*fLupu?s&e?i9P4Mw zvT!W@$Aq|xXabM$dy=my2Nh^{pvnQ?@DY7=I6u&w@xo*w~n}L;2|#k z<|9dz{0AdS{d$}Uc<6FJxviygrqG++*Bj*-pzS?UO`IF@fA2i=db-0W{LJJsUR_;! z7ZzlWOlr~yqZ1ljk}cno!DBaRICq7H^8d(BFBYz730n(`syk$uI6Y?P5zRZv@0mCP zq3ebhiaNHRNrNth5?n>C`IHy~?WEaKnXFIhl&3(&RTn4sgkP>$8I}@X556qkQU%s9 zK{rB37x3GC+ucZ6nFMW3Wf|ncH4EFo{`&RKciebS5L{{Uj)m4AYrdAzj3~z{jfn4P zRvnB8dHc7>O!cY95P;C|CRVBQI9{^9K$wA}N_?##C0POV{mL0(uwuLaNkJOj3?f!b z!BB(mf2vr~wBP?HRrgNfS)M8o-FAF+`^J2Whd;2z>Vk^`fT&dp7?efrH(#Cc@rwL! z4@1GOzFPZ@lLofKLg#;!y+(sE4L#RNs*c%jE6*5?94Yyt)_tvpeZ2B-iI3SCqGTW) zaXpW~^T{>ZlyoRY`gN3vfaz@3UmFMxd^HH&s<-!2&<8*8A@`$RF{QsSkS+<(_;sr{ zVSWH2P?c>aT37!=8+1~XzxpuLN0@fHpyx2GZ4j`Lq^jXE>*=p4XEfL9#kv1bfg4%* z=D9n+8UhSvq4@uxqz);7m-(Kbb4EFhO;D<*vOX3pZ~q?!iQ`uw!D$Ty?|*Bysrlx> zr*-Oj^p8K@E-n6)9kn#^pSmfm?LHugCk&)Cp7*$(^1MIwj-Nj3+ge3vIEi32Gsak% z&iKT*T5qfAimw;TDU}QOJK8`d>fj-1iPWh0q7LYy*|IvHmGMf`TqDoxIOaQk*&k@X zspxDJJe(n*W%#d57kG@-_PBm+{9l_hc!XpsFu5^mG^p2?bzd=4-rnpGr2PK=ICPN) z*WW(L7Sb8+N#k>Cp@%X<(`oCD42HMa+Ar&cGzj#@>S}}C(uA$}T;|l#HXlYNlP9a*+8(qC7 zx*3MC|H>TYr#jLy`O6J1?;bNoqvPcO+rR-NndNHnzEDvt>qhTCF|vcd>8aVeJrT*hxz8Cw2RgnnIak*ElR zJ^wtOVa=~INq3=CZB4m$a|HOry-f(^>e8P6e>?|fbO*5aMz+j8p-+8SuKXQRe97=$ zq3-$_WzQhUp#Of^q(En`COnF|pK@(zx+kb}oii(M|Id0z*9OTj94(d|o*HLqI$*C_;A21S0bObZ1B>|g%W524 zF?!P+Ci`%pNS98$tkG}+ZB1k|;i3&$_3TI%&Kzw# zfEcba4w_CY=5Y-zH~gpkhZ$W&DKdXm9Z~I*>{VOaS&6JR-q>fM%M>EP{V>`1BA#$Z z2v!pY%J^UQcJYF4YNGan4J*W(^`>2e6m>!+lrjHV;5-rg1N)VhtY_Kf=|>yOHaRgQ zI{8hC=xj=Hoky5hGup)`>W_03Iry~K4IONTz(Ad5Z1WbkY!o*3dX>2MWOcKh-L8*JgyW#|U5QY^TZy_ibQ; zl?m>*-QcX~y*&|S?K@6jJ<~H5a}O5VeRqQ7UDA)92)bB3XQv(Mh4iCciPJj0G4QLS zS{OmMUz~;hrQJ6i5@tSA3S=y6e}bMid1j-tD0*+JTqWw7>7E0V@agdbTt+Ek`Rpm{ z8vr?9yH_yXnkOvt!9raa4<+;%Y=tgdC`fSIEA)B3bEE00{Q4Kja=O3xrrl-XuKwz2 z#9Dx9{Al&Ja!QZJCEy0$jsdp>PHsQCM6Q$=%1A-C*myOzp8IPAZ)qie ze?7PJ%RH}r&iPgh%yWrTca2BAm-#53gz#JUCwe2vR}5Q-zTs&%jF*Z;BOXiPQWPDe;H!! zId%+8k@`^~wx!I(SW)~b*tEF@|5gs1nt$22_}Au$6Ds@pPCxE5LFta64`CJFzDw*Y zG6Gi7H<%K2+jnNtol>}TmR8AvSsdqmHzzo6D}m5IE=$?+NN)tB?=T_cvYh5BTiJy(xeuQ% z*_S;v_U2xWO3tAN^H&^*DAdbGf7?Rr%cSmZ+K zKrIhkWQ4pr{T^%&IY!0?z;ACx}Gz$v;J+FSXqR~ps(<%rKM#p9N_oaFRqw- zee^Xz6@O`&s)&kfJh0A7z$G%uulVs|i8a&z0&XjfT9YkZkF6`|0oNQHJsy5%l^s~| zrjVGf68mez4=Rm@*W4ofI(p-@lzfLYhP<$xRCXT7sR)`)J7Bd#r(y|**t+fKD>Qa|rh_Fh}!FTIt?FZ7sxzuTuaFa+iD zD?vb`pVw7Yj*$)xIj^^f)GY12ohlXF6ehmyp%K%Ryi4t3hl#3Dpb$G6>bXri+$C&z zYUswrBYk8t{f>b&=m&Cx6SZ4jmX<0;$*?)v{Ha3-ln%Z=yqbZlx^x=$>&_oH!p`&N z#M(255p~u2HP|(kCj|vQ>EDlPhJLJa=}RYqZTW``oHA-+a6CG($5w?t%KZ3j=iZ*| z+HX&quGaw8+O>H+R1f!=_-C&lYH9qJA?FE=Pc&4Og=ttIVm#&PsB*29pyw&HTf=>? zD+7;+P8`~8s+W4FMOuU6sz{*rAVFy@IqYQ(Se;HOO*n$pud~t_8P2S`%CXdBJh;|( zEtfNNs5HiRv;Tjyt9jzo^d z5frwond-7%UyKS4+lC43G%I;wOZExn3w{iZT%sh0MTa^-mKShZ^jb}o__y^}9FID` zk0(yOat68^6K|Q@W?eeUYmCrX%W;<2icVK?n@gFiHN~(duEgsdy^?1_Tp01~d`Cq0 zcqV(ZsCN_c!Tl3;;b6?e?o+G{R+5wlh|*n|jNMLvC~5eOkSwBcFC6S2iS*46?{oGC z*gAv-OdAZoEj@J^#2Y}w>Vl8pO%;zc+VxZiF0O}DIv%y;5?{YJE?RmD0!I0%<<&9; z<>!t<*8H0~L53(L>uH-3?i9k0R%NMx*7OJ}BqCZetzO-psxfKdfBuY7S}yHvOV<(x zSfUPw@T|2~xCNP)((y6#7+|wp;eibKf}nGA3yjZWa}=ZfxtIo+pY%^~nf8UztJ_YhrM*MoPTFc{`KfV02-i94^fPwG`^ zlwv`Iy2i^EclA-gyc;E%^%%QFmy=v`vy0zW+hUt}orB?bb4F~4OpJVW@brg+gY_I) z{9O?Ekrn_{=voF+7&J*+0rJfc`RDW8^3!D7`b}PTK>iIMnw1aFo6wX>9~%cBy1h;J zbxD>A?p&KK!CWTAx3aT^S>9pZ_Tvm=tcWQ}vYa9)C@sxm;)lzIbhW(d*0nk0(J&qC zpt4T*QU={`m#0^$Gviso71qpb8FaUt^|X05Elo+))*TTM5iuUdEAa!B@j>Nu-)ipl z?e}MAX8bq}Q5npi`vD>(Y58U{mHp-K_lasvb#dcA8I{#%>}Ph|2tw}5t9I!O2km;f z04gRtT3p+WloW4y8IAnhRTecfGsBwt(4t%#WQSkr$0N+7nVZ(vlx|6iYQ3avrX)y| z;dHmGEt}5Y8xD;(F7W4`3l`$KZ}-n#MQ>-+D>Zmjceq;aYD?HAWS(u10~Gi#K5*EN zBHyfVv{nRDe#LC8y2o5W@Bc5@fh5dKT0%Xa=T}!vyw;F}JX_v5kGkT4(yPC8F)xrJ zPt?ojihKvStF@WAc_QTf$@Z$p0W{iX|KM+LZ!aPla!aG$y22eZ#vT*uD)8nTe6#6g zHIuF16V@l~B8j=U1-Wx7w^=!Ggz%h*l5gJuYW@sNxcJ#YhXHh3oV}E}?Zna0oeQEF{yV$#Z@MOn; z8iWK9U3la7GtVYWTTdED_rpURhTkh{F*4$+hjaMIm?}+|va&hr$OwlQ%NP-!H3Yr@ zoig0JG>&TeCq#X!a@#V$EAeb^_{vbj(4`2Hv`*Vt3KP#sV2=SyvfWEJB%OV28)O?K zEWykt$Y9G&lasG~%mWCTA#Hy#?LAUhuoYLmQmq}47{#p+ddPlb+XM4Qj0_N;j_jkH zLu*jZv_R+qa+>nu$07V~I8oMdw1#g7JX>wttY+%;Wa{O$oU$F3udNWsuu|JFshy>|f4`h9G?E1^I+(Fi>x16Y0( z7CqXAo)*HdgIVgmvTVz!S3vv-b4ZCNl;H&)sDqOkCDsDgvO}PY_nlYu$7hyhpHu=bcJ(o zG{75yYAY2_a!?)VtlYxt44+TS`Bszy4dX8sLA#A-n+B`aITWy$y8M+gn1cYFluk5e zz{?WCbr7uiJCroKvg1$*X)|^Utnv51@|+L4DXHH_me>5C3Gz85#V0=VWyb9OBBR^a z!s@DGQ(U!-N1#0RJ{t+mb)p>RG@3xXnUMj?7`GWPU=bCw&Xfoc_ zpJ3s%BZUv$>JE{7zu({uKYlM*nBTu2IiLZN1kx;tU?$=tTDSIyr70?)y@2c2toSDA zX1;OHL<0z;gUD3h7(M^HWaPrN=AYxGdf}tCfGLVd%J@?+@2qOr;fsHo!+kOjz&q*g z3}71yN{^9>0P9FQ4`JGLu>6yVA5SU9t#9JZW8kT$L(R}nf`GT;svo>rb~e?)69+|f zXETu6%X-sMA3ik)ZI{dl<$?i*E|luIL+q|`F;wr!*)F<>6biWP`L=}pT6ugy6mHTe zc3HZ89+dSf8eM~?8~jlkcidsHeF<%bP&Q@-2Sod>z|Ibq38mh40Ud9rM@wrS)`!P@ zUId~8HtzP1;OiNUt&CTdm)UFN{}*IVBDXhyT&y*J5}6OOUnkm0h$?|) znhR~TMDMva`oKPHJD`)OKiNJlftqSI91!Om@j}kYDBp^C9o}44mQI*rfI_YbK~6FP znce7bZf?G9Y1UC>tLXYrGmTs-Y+|DKjNRY9G>a)LEM$4AYV}hA2-!@nQ;;nRH1Bl~ z@zup+0Oo1mqDMez`V~N*M6=A*eVmBx zu;-VmsNm~rFxbb+&v?s6wq|y>BHo%9<=ghPmezWA-<-WeMqT!mO^7p9`#Th`_<>`K@jH**&qL z5u>xT(oUn#b;1Z6Y4ODirS&U?-vd`=vE4CxM-a+WJa?s~>b#4YC>N6t)h~M7uY(?? z4m>GSbKj;Fy|E}$U~EjzRE0KwCEXwNu5&+4yCS;Te53a-P^I!9VDZyt<2hbYP6NYE2#wem${uzGIl zwl_0P+~Jnat=ZfW1rJwptvS%Dh+&?x!S$!<2U)v=O$OGHAPol0;4siQ{F>4JnlhZ} zths>_WlDay?~?#qdG5NuzD{!daeOkP;SVMUthRhCfcrdBsbi-wW3lP{Sd!5TGJNOv zRJHH1it)ocs%Si0&S>qBE5vm)xb3~l8-YEFJNpohV9p171!XFzjUZom9`T+n3ZHAZ zP(=ako6A*FQV16JK|quob?~DOh`md5-6{a*XeX`uo`?90Kj>Gg^RV*ke_KKh=Z#PI z6!^=UWIY2s&=BNs1w}>j2~9f;qVntK?x|Cb$QTsVaq8=rTHB0k&yYxG9JNkBAOQsd zjKk{0RdaLInQc13HIX;v1M3CDx)I6Kk(*!^YG1PKcJg+W*jwIBJ4<;1WdY{$2|$(X zoS(G&EwcOJpXUa?C>{W=-~C6@65;AOGpeYOE6Z)#3DRJF_sJ*|BRtL?NWStq*TLEy ze$442Z&wsRq`k<0umOjV~7OrEW)TiI2w@*)wbS2p?eE?a9^7yEuRByz0eREf@ zl$KZ~WW{Y>JPgHnkT@+OXYHPS3^fb*pcwd#()|Ko9J?AGJ5UgI4e5=+L-*akJlD(q zex9(@Y7|=oGKaK78!B0&c3iqefZH(*4_>R|tp;Uifv)9KSHxmtKa~BIKE(J~L5`IM zawAn!xiS+4X~2UdD_kK~o46NnX4MDrl>(`}E2C*UpK)E71!#u@i$0C?A{!oat&fimL|5AKkdC4UI)(0W{ z=vxBdj``i59Nk-vv5$=ldKVJO4vA27!w6YDaAK(5&-E8Zj^6JAjq5$sDl-F`h-aWx zPW-T(%j2u~^JZ4*Gy7kgR|Jge2QKY;NDRJpMf8Qjz`0=Q?`sp;*FJq;gSD z;zkw;aV3Obv#O;UZ>_wj>_da-XmV|B?cs6DqZv^43>cSuS;H|z#Ykse5=QIu!W{%E z=Dao(O=V~8*ma&_VZxom0|o98>bCt}>FGXFS@43gG7`v%O;D2DW#3cQf;skfg~b%O zzveDez`YM)#H~e$E8}?1LGS!NsoK|(=VGM#eDM?JVVL}j-jdM_kg%SwN_^YoSjsia zrqu?|I^d%~mgQBk4o3DpZuR%aASI}DCj7E}&N840KUa7y^yAa*=slSH$=WkYe~gcC zOaOsJ!wG90=5Y>1U^J#N>&Fp`6l0R9aAXtAY4M9l*Y)9xge|5hr{D6D$*4s-+-j(} z`IowDD(9yd*c3)z->6qL{;sW7x+=l}Lg&v&NRq`Z`ypM=(}RddRhxr_IjgqOJF0+@ zEKJnx*6ZLKn!uA-r3-*)!u6f}KQxO`sVb&Ml%^FDLC9tv9w)03j+}iV8W#eG*6pe3 z-b(ibFsoTb zS|*3f)F?rzSawVN(U>~`{(FQ^n$U1PAx)|E(+Hr9F5vmcd+=h^L0{=ixW>|l>rr%! zP7OlrmiITE(FzZNc2$tICV&QvUhkE$a~B!oJ0!U(lM%v7-VFhECg8?8lEp1 zWrj9s1Nji(&42nYP2cVO06gai`4Sk(mhI9R{xKp)eVs2u1Ea)dn`){N{|qj4_!(e` z#;2(XG#tv+plMd^_JFh$uX24X1T3gORX~}+$W24n9Fl_@D^@m2A#qygrEv4Ch&Riu zxwsuwv8r_eWr}fi*X+MgXBpt~unv&*T-+8k61$9(Fj3t6 zT6%Bp6*`n_Zb{Hl_8zd-0qBc3pCEN*eEjXp!ot=q!Q*5X+xY=c3_fOWW+cSB17?Ry z>N|%hTJnhQO*I{wMRe%VCK6@o(2@ox`Rt%bua>}%ZpWq1^6P)eEhQo#-5{+#XhM}N zcXabCPy!SPq+DkLh#XfcuNb4}8Ib>Qjw9kVSTEf;!lqtQXI4ZI3B(OQR%(9kSlB%K zzA@RfZh4sg;>Uy>qx{a$DTbbs-|0H)J7?1yr_RR?0|ZZu&kksZ#vi8o?GOeeXx~qf zqYCCE0B>_yjFi83|Ekb|wYWr`;Gj~4hPqivNbRZ~^ODiwV)SckE$ii-h;&u7niQ%~ zRenR{lK=hh>R#VU^H#F&#g`rON`z;0Ot>1;1d}u$G?l3USlK??6|W#I=+jh8z zElC9Bi_am7Qr6$3bH-howWVP;13*&{5B#N`8*d9GR2H?zkL3V8Rc+V<4JXd+2PHvC z*uFO(D?5qOj^jFX`%`decSD;QpppOJne~5(u6--!&<ToI)#$=fz z(UI$wZSh+4m~#R-h$>6A0wo4L$z}=gB0Cp|1a!jq1%Zw(mm{B8`ryI9;Bjl`Y?rEC=mAgA@(@jH z=T{?mKOr*>?i1hI`Z1TXL4X4KUuyPCFNUF#CpSh3yW*HY4yTvKfnc?vG(7~-QD z$UvPe!w*g6+?-yONLw0jiH*3v42ptV$_{6bAD8y6HDPtkqevw-)7{_v;;eg-k&@;G zYDG*?k$6BVjN)tIqQWX%1N}arf-h`x`lO@gW5S_o`rkH=8dW9%dJO@L(W_c0G_NGN0L@aLNA>Il^Z_sOkqGBz2=JpF{FWB^^z;TM;! z*wK3_5pvrs_NeHZL@oy17QSAVw>LfnlD70%_OLeq zK>$USzY)ZMZs~qkq1N>?6%iLnx9M?q9JR6Ws|UrMUboDCG(6itSDkcXx#x5|+(_=! zJZE3D8}Wq#f!bwpvCVUzrD4orwb==mNn2vwp>)jHpUZUAz&uLLbFZ-1W304iZ`r6W zw|w=0V6hG}E_@y$pp><9?~J=;x|F23^e>|=SZ87KIUuTEOw~LLB1+p_!UvF5PlM%6 zG(B7vxt56!k8$}pK&X#1nx@A6Phzl@TVN5TP+C{{sK*pfPv}N zp|wnExVzv41S7qqHH@s>2@+^>g(LDi?QLAVY_P{P9ZRroel4-h;ejAYe3yw1)N`DE z3WCV$T&gw3jvX+;?1}M8y$Tv>TotmvB$dS1jBwXZPFFV8v{p$*LlbuF<6F%4z-5G0J3S%hl3)b}4A6_Z>C@5$+ z0a|Eil@Up z8PAFvf-44mh;%H%f|>Msera0t2W)PT=SacNvn1aukJpF8#hA_F>3f*QX7!e6rs80s6+ z9|YSaBYuOTB9veEoZAFzi~Caj@b3=9Fq-vSOKcBAUslm*L=HS>v-w67{vE!)t*LsF z8Obf{@+873-Av73A{DW_(w6CvsQb*dw6O5lxhPhw>?WGJY@Zt|=MO~B=T8i%fHDLM zD9kbaLnwEO&F2nKHYooV)XMg=ZUHlH!8(L~A-{{9E+d0|FD6ah%t0wSsp_P2iwp30 zC`SY(zmt&00$Q5&#`>@GUKSO#0XB<8>LL?YyerH*s*O9DCaIdaNJc2bp9o-{S#*3ymCm@pLn>$p_9fJ8f7y1)}i~7l$w&j$2HdO%8ecq}O!K z0YwG0CW$w@T`ULO4p>P0oFe`gh&&?vIL5(OYmdWho&cu`MW1uFK4JcSY_Xt$Iwm*S zp7#V^^xD{hnO0nzwQsR4-MkQ`CiQ3pI8CK`2}39M^%W3PKbP6bCfJ zPUVBSiTr%)R_M0(xJ*FuAQ2Ig`NnF4Y(K9j3ao}f9Q5z4Qa`>FR`gma&%&cX6I5~C zM_+&bJb}utHdXU-9F1~5>&;kQx}Hsl7td6v_R_3ed|+Qkt8jEkFO%s}N6Q(vzmzk` z<8-QaFlGTq3|%XbtC&oiuWa*iboltkV8N9txhUT ziFKT))Noo>DPoN`fOph#!UrbB-vl2*x1+U82)JRPsXr!Yr@(2h`_2QajEC|{wAcG~ zBTx`U$rDzEa;-G6@`}F@)|*{Mm#AxW)NnBRZrGkr;EyrElCoOfAI3IVjrx++G>XX? z%pUooe-%}bqL4_4=|%baBqM$L4K24fR+xP!pZvCMd&GPrOJhbRD{|$h;Nl`sr_1CF zs{$(FvBZZsI>;N@`8?)P3>He3K&e#&s*hzKl4%1qU0Vl1_tS(#rf^yizEL2Y007J4 zt~B5)=x516a|JCB*EogRVl%k1xZaC(LE~(ss<5iR_SpAfP~n#y(rwM3P92q^oBMEq{(8f zB0%-%3djubF&)#j^+0)$STC)pDJ&{d34h;`s9V49l@*Wa@6UaMu|}4vYKTU=vRI+#uiaXpw38 zh!eE-@N>g9C+=lOM+{iLD&*NJAXz{>DOG1;;$q}_CM1^Ac0X*%3Pa|$ZG~CDI1S2j zjiVbKLgJ1A5pQsM7g3UGMUmV6#A~4B3O@1zMKY?dac-c_GHABJyp-Etem+xr5)10@ zjI>VAYT_%3c-NdJ&_}2rpp)YDJe=OIvzNDSE5St0`~h9dUn`Us*TJv8^>1r~em~!K z{DZ`9kKWJ@HQM4asVKVYh)W;Z|0jCCcdVjggZdF^JvCj>e)6aMKH!83zHSl9bAM=T zngoUS9eEZje^-TMc|I0@HTPWq{S?e1a(Q`K1Jv%}`XL(N3(Qm2x&}JH97gpCTeeBs zF_w@Z&!A5f2#Kp=4o0AYXNrQVb?5CPjjqk;>G6NfoEZdy%>BT zSY!>ti6>i>R&zdfVfY8h{FOY(u+?bUvP|$TAsq0N%I2g7zkXjID2XyejozMJ7+vDc zrX7!Zd(t53T;ncs=yY>8_YDw^?>Wb3Fg2lwtFPCf-I96BFjSAu|G2bOx(T4F8$l=7 z7?q(q#n0e2y@}PX)?&OiDqZV{)9~!#(&*4n5P??gJ8hDweAsclwUg#dn95J4|A}#M zkgi-`8C3-doPrXi*8KM3>KogA2}WX12yDT@WY99zhy<##GWFBva7)zEw8O>Ys+{0y z((mIEdp^yB4y`|4gZzsh2RiUJdX@_Im@z=W4qHi4nRY#T0XeRJF6jmjl9RH!c*}H0 zBFJJO>f{4rL!PJa2dMA}kK6nv_rx+tUp!xzfa;ej0(?dP!GSTeM%-1-+hI^+glbuF zwXlKy{=`{a(4Z=0_AB=GnSh$jVL5o{5N*wn9tukRt=AU9eYnn`i^K!~7IYG%1VV>m z8{DCBi2SCv*yspl-r(w1-m&{lF@m|zEY0jJDRaEyi#_K7k!e*@6oj5nKq>-eo!lfc zL%y!MxzXJihz5}457qs9?j6G%mLgB5fM47R4IKNAITPS-6#&X@;&zi3OldYAUxjJ$Y% zW>2`hiUm=~&J&QLd`R!;tHh5?xdh+zGMXi|0k-tv*!+kKP`ktmOTqS_LLc9tgiEdV zL$$Qfpcj%LV}>YJ+r(>#k4f6XbhW-zTo?7pP*>?S`btl1HX80|72I%mm<~84J7$Cl zbb*E^=R{?m5aPoQSgudLhZC2{_PsZT0K1%wH?2F(5A2&dKg$oidYL4J74hwRx|%E2 z@{A05x?6jZ@8lpe`O7fxnPslR}_t-QBuoiH9qi{u9%*(F0)L2FZRT7L)khU zHUcFjea;h)nAV`ch!2*kidc-OU3OnJjNPCRkN)UJ9ejtRU1|P#Q@LO5=QMfrsa?XP z-`{~m-{lWktH{;vgI*&bS#WDQ21%(Xi1O0>2SD#iD0jIBHv(!gP)&7B#xDe4+cJ)r z3~)4={3gRFP^p+5*|p^R9%^m^Qqh+_C^T6@moqTZEaTPEA1|+mZK@tox6a4W_mM$8 zt8*S9 z2mQ}fibsKlHWerxwojGNTrOtjF|YBG-OEiLp@~3@lLKBIk@~X26QSF4E<=3NQM3Ggv1 z3S=8dUFj)u8-Zj*jf!;u4+?*?n=8o0{{ymKu|hA z7k+~xJ39*M_R!NdKBpNZNTH!oZHd>oeuwvs6HU#>MtO?luXse!K42{4!B`~O-gkYg zFLDzgZ{u;&OkUL%)Sffb1y?5dB7T4Klc?&!3is?l=wC?SK*JLRv`;Lyo{-oD*I(cO zapP2Nv`16vm>=_80=+EzygOjNB(|09!N$>_;@3M7p`oJ$zczc0YUsRB>edAmmBd*u z7z)(F%KzS;yAvwI;JhE3KsA_H&kZg?trm-I8PnQBsRIOkx;07E+g5CM_I#c7;%a|^ z{$Tj%YoMC{Y6P-F`R(@V4E${%TPOKqJUKX)UofR^)&8DvaYi12I=7Mu6cx#H z^p!iRxj(5^A^G=KQ|)yZ6xEZrq_F*Wqrk+?o&LVQ*NQp!^TgU3K*^5A1NLpuJ{dAS z07Q!P<64uspT(f6quNNsE6@%GNw3Y)Ee`|%LLG#-sm=I8^{j40YgZsnHx_rGO6BVR`GQXHt(_@=k7*a+a zz1ivYv#|EX>P1-jT%w7~3UKKuX-x$dH!F}|b^KpUhl z@(gmw`Eoam4v@i_t}Bld`~jIt=4b)h3(?WgpgSfgQ1?4f>E52Ic9XxeY~vh|8J)6T z0d$@E-m{bh-3($j;AZffx-cXt9VKmf?_YN1yI*AhTep_%*qS1dbzCrAj-f$vE}*** z!(lJ>38@fmizC}PihL`aQP)3#1EL^k>eNQCW@n>%T^vD(Ql+HU(1SoP4%DGFH{{NN zC^CPxAIk!a>R3WQsDt0^+g}HE$c7BzM^cDtCpbjN`{J+K>fRQDej#Om_WL|DU{;G` z97Dh9{J4iBRmPpGJ$$8Fhq^bUru|HO-ETZy#=R?Pd=U^o?M2{19>re~nYJ>Wa|~h@ z<0+R$sMWoSb>OdJg$H(u^|i?Gj8GbHrf|#SI9Xe-A!P7Ff{w~Dh-e^=$vF7{Dg78= zt$@v(#LZ8p`wLq*W^YE)kqSLdruA{)}HjHDi* zspWS?jFshH+I`1h{4Xxv1Dxvq{~tf4L`FrCtcDfYvPY8;qU@c$H`xtEw-B=T-g|E< zWN+fwI~<#1`#s;?_vib+uK#sk_my$H&w0Pb^Z8h>_fCjN+q=pCOflQ~3i}g#$&NQx zO|RL}8G6mmY*lk)B5KLCPkXGtZy|sI(6EvyRs;+j+jwU%X1+1*gW>VEq9wuIu_d8^ z!zU<;} z7ku^1JY4+cDvt)hkJZ{g{&X^r3#4BHO7B8&(Z7fWF>Xaw-4^0jO^eO%h9CA3c#i7F zpmW&`k7%IN`;JPwJUlZGx4Q1IVxINU}rmI+P68gI~Wa?@Y&}G|8T<%@FD9Hs#;4hpR)AN+y}phOtp$5Jcd&QXLnPgCN4<+UZI^&jWIW_{{j z)nkPt>hH;FD3*YtF4}L&cvrAUx3iMG;;7kgR|<*GuM0{*YJ1{jKh=Pa9u_xIxiBcH zK+Jpz_z{wXcJtWD|8M|{+GB2RvsAiafquZwcRC;+=`qbOPhZAfudYB;_+UCszTf%s zH67Fou-zgSMAM#|dALc49NGsjoS5}>1YKQ7TToWF3yyGF9$`hIxd?muLbIE?kOkl4_fyX`Fwy!l9AK>QAOtkn47w&!JwL0Qo{IGP7q!_$;vwURx;Zys-} zvEOKK!pTT6Emj2yGbiJds8N7jJg!xL`m7Phao=kd$xXBzfM~$i*it@XBl%BoC#(e?)l)Q1 zono!FAjL#}EQB+d>$IRIuX?$+2THKMat9H3*lNw4azGJSJ0jCaGuRj`kgY(J>T3*C)K6+`BGg? z_|2-TZdwXR=cGfh*o_#*1W$^S6%$H=@N2Uz?%c9Puxj9NldabX(?d3%Sg&_IFhn{nR{B!8C ziDmmp&QNXj%1=2VekHJ)ypjUsf;4P8Lgt2~83$ZhUx&W|>9Yd+?htWkTbt1Uy~Ooi zA@O5GS4if+GKPrJfc*sk1F{tnqfz(7nq;JLkDXR?$g%IJSJ;in*u1 z^zH7Pe}h#mr|#z^w)1I2OZkq(B5w6=R`duimkfg1vVMDQ4Y+G8w~(2n$Ni;AfFP{ehn&M{6&h zR40iVz?V8SwufezTE7!;ssuA3ib&8$ zqyLks>)&1A8}@82@wHp3!c?0jEl|?1!)+lziARFiZ+=f3M>6tclIb|$tkew;wjem@0j+4+Jnj z^|qRX85;TF$#ZR3?D5DM=~ssgQ76hl2zsz6MK^uGPDG(CYk_vQ|KTb4i%4=0cS1TW zwa`f~Fx=ftVqz`zs4R)Pq~&8k3{ zBUp2_dVw4*-JEHjKQ{{T8_{JNN@aUOIPbV2Qps~g#Y|b@Ug=+MH~%~n3EYRs?ZYCu zT?z5!U|1wZcb^F(R+F3Q?0a7H6DS(U*&ez^uMUL4BaQ-M4MOz%uk#FvX#*LYDp&V| zvaz5~F`^@9p9mv6^rGzPW?C5I z-Ad-L&KX|e&R*x0ijeUShzhK9A8m-lSr8Kg0Rlaoyi|S25d}#bSvSN=M1F}lT0r#G zL@#IxexegNPF_nvvIWLJ?+h>3=gq^f`BYD~gKLM3X;a*>BIc(+=r59*L*H`y^eds@ zCakd8e#(qPZ(6E*(G{L=L3iuDb|(9XckE3c9f8w#Y$c_qdaZWkPWcpmPfK21AJeul z76WBAeS336d^EMmgx2eVrWckNU-h77|AiBmrRMt@&lhFut43w|@zFw>i($z$yNviEk!h6GXjmZxiK zkKkWKv@+i{W)+!YO0+@WPCRkgv!UJTZkV7pmHJ=Gg1dcFp7kRYHI(oAOdGCy$R{j@)<~QCv|zkIEX)q)=Bo^V>V#lDk<^0h3avJ*d0jRGv^^OCzkXAa*zY5~x40yDtMP@PKXC1wOnXF?98c;r4F0Cuf8(;bQ9NA)K6x@m zFeLY)&fEYTH$;Nyh;6dJ)+g6FLE|o{sMv9OQ8^O73O2x8uy+cFUC<~*v}I(27+R1- z32Rxku}U8fSWFPIE^FZe`HeD0Me{n6^??}bTrMR%`4(*+3U_2s&nYnr;qAKt7_umf z*kt|)AtVNSwEc7I`xi9G56>ZAW@Z1rwt{qii)%9@a89+<(*>TvTs@J3t*CGrRB`u% zV+(1(nE*(&yO)gxyI;aYA=CwMZU4&kv-#79I`h%F@{&EAnQ~bAiB+w`l`yeU4>`oe zpnDo#aaGN7G5g`dLOU(7*7PxCycWv%#zR5oEve2^$SEGMf!xV@Gtb)LC<*&2de0`_gQ(yZ&MP()Rb+s$|9fxK^w-O&CULsi#5S6H%&> zpm)(S%m`9nX1&wmVvw}5f_+SGZmulQV`y(9!p+-A2z{dYNTe&^1Q4Q`Hb$t+ZUwNk zKBx#Ug%Wr@54J@9E@dM@^%xmB_GF5f-i~2CWlKNY(F&m zro9Z~xUcdF^mGO^Ex7Fe137$u`uE_39{pXzky=CorCT`GnfjnfRAto_El|{BhJ+A~ zMEUGNf|g118|rw6bIEes4eGLBu4eQLQT@{op?e}{boROb6W*%f6k{kpN7zb9mxptT zqb=h3nHL!3iRV!}eZT8`lCr@{qQeG?u8dYjO!SAt9l0P|YwV=Qu^r;JoF_jn9(F)v z;fml5D6vQ-r-Hw$z$P^Jxh_P09Kj;i^`$a$avx3iIRiwqP_w*AzWMvq`cPzU<_)+q z2oY(txpe%8#ImNlLbFFT8##4i!Ol>3tlrZ?iBfBYvVrXGia&!>2sS4Bvv!f7>KG87 zUu_onV2J4+T<3~fAASiWYGh=je{c}uy^uwx714+*n@E>At}6Lc_f+%1-b(a^5Okty z&II06*_mwbr}A-pP+szZt*HH&4Isx*IZd!i?Aw9@~8hzBPXHOE(~*abc+Y%!&zi@B5mj}wrdJQ|svuyT?d)DSg#SPi3(9Fn6HDKmmYkJHk6lpoc)#9XbB z9iKD@gIUx-HrCpP0X5Cdb+U|WX*dlDd>euiF8~Rh%Ji2So$;*k7V?4XZlM1@k57b<lke;rhP`l2*#xI&6*((3(y)FYMs{b1Mfa)ZJ z-~e(#_gH*bg!IILef^-c=&>6re|^<8rTp)?cm9$}Oz)Tx$O(p>(G~3;aP)vT!3hYPM5uLeL$w|xL^jwBlU1Zn^ zBc=RO9`UKRw5oW8_LcHzL{2?-SA|7W?K~&Z-{M$`(2e<(5sF%94*JkoQrD0r2~ zHt?!skog}aW;T=bk;EGrY*GrZv&>lT%D*qpys!GLlI~TM{-cun2WEZ;$2QTy5$*bN zge}-($bSed2*ZC7KiZu;x7=&1tKOWi#a!g8c;>M(Hj#y0|AF)AN{wMmQq*+k;fdf% z#o1UFJSH_m&RbqgR$s*Lu(7eBqQyLEoSd9cCp?e)m8}^l3;Tk6B9fo??|d)+>{V0K zzFI4|Uwr%iaJ{;(^5vuHHxhAb37XI3l1e1>P;61Fxl=c-YA8DrO&;_Gqu~WlFIJyb;aCuRQ?~v6YtT=xKfw_k?p&X~(H$LEavcstIHFDZ z)ZpluMG}4=BPn?u?OLeT%4qrVDuE6e+?hGw=_j8%0%zJ~OdG!W8_?Dhwpw`!?Z-^d zu4v4z^|*?>rTDhCTWG$}ihY9w}usR-0v%k*(i^=HHl`Pc!)R`Z} zuBMNrNT^*80vswW3C&<~&N0yn*q(c_>inqg#o6#PnFdt-r4ywFNn^+1 z&lwbgiBQ{%14BJ&ik3Vz)F0BSE_s}ihB7c6Q}UfU+IM(eegyAz`H@eMjn!s?kArmsni-Bol!jGooKd3WQ|P<@g!!O~DxoYmU^ ztvsWN(k@A9xjQ@CcXLl%Ld1z~O!o~kcGsIODV!Id4CEL@lO(Q!BYVN&n!8o@sb7FRW8O5^NQ!B3ejpmFL zH2t{$CQ(K`IwqPk;`uhFr+Hr34ZXj)6+sK1cIKC|L{2L*Lt-AMFY$SgkLBiSv`Oaz zE;mkLaB~Nyf=LBFG+%K2{?b+kA71soc$Z-b8(9sQ0IagZgY=Wm;M{m#{xxSm8xdr&vUVL_93* z@d+++5Hl^D62dq*hu>Sa>}ywz_=Xw1M(?xl88$T$@Z$s5qRiiEh3ko!w@OR(eohY< z`o_n67y~WQO*$JwXBh`x3 zT!sg%ViH5o@NTt=88I5cfNWSSsLvL{F!}PlP)X~%w#*N+e2$pH(r)F*|7G|NJ;iKx zsk(fCcC=nrk%>#$HnUBPU76m)2ny*DSy*eUS_^C}4^uN2MjrjR;h!5)K2)LPZG+LV zE983P_L3|5@O-RAj=nkUpIaAu#jG#K>uYII?gw^w>1nan_;`3yv&k%<&EM^l3+J98 ziaHMOF!ZS2zLSwA*OIIOeb_Gt{9WptR4QZ15d3+2YoUC5=Bb+4iI)tjSY%lI&c-2jYN$j#p|s0N>{Q4V z7bUmWyoq5cwZA3e*O#X7r#r(gp;e#K&+V{ds6T50bxAJo5!J1Q>pM$)@xw{`a*tfJ z>8}stlCU#BY&R;@Z6G&v8Q2f}bU) zCbVCim>}&Sxc_GB`2*U>s;cfpNotY+hTl1DsYE^Yn%W+=fzsB9cgf0{e*s@0UCqS!=#b12gspyGwzGCGct^EN>6IY-?iwsmVI&gA}cyxE~@cyQvMw*kp0*&IUIx6Ii?{U z*>MBDofbFx=0EQqd0<>jG%mu}{4KxtpibXb%1aKhqD1cACQBl{FIzO&@OeYH#pwyF zAnzxs`x6=zh3V}Lm{*y}@GELS zfn4q{^2T4N+FdOjR>~Wi8B>TLG@p1^PU2}8hZ&KD_uw#Tx@s{T5a!W8B55I1VyPIN z30IOM;O)%H8Nh5+;r7owkK}C3jG-)Z`Dt1Ot7eHOE3d=^u3XIJ{8^=@H}yHo1h2Cw z=`$(G*S%lv^2Rx6#c8gZwQi35%JO^+%W9mCSmqn==f_#$bUqdD_vd^zo#rk~(e6-b zQp#%`CB@pxJnX#B07LhR=W{b@Ny8wDwAr6siOdX!^LuYc-K}XKlAnZ9^XYe~L*5NN z`j-0t@2_VxVB~*EE0}VjPCPUT+EuRb>+_f8j!zB_P%5>#60JVgIP$O%voq>!s7fIR z$niW}G-C1hb&0rCsGP39!WJemKLl?SZ(fL>TD!1emN>eFq7q&|kE%J?O>-u=gesjq z$Zg@h(bC$Eir<-$L$yv08F>?R7xG`a!4*wWv@kurB(7wLTXQTlat>GfnVjB=-NR%C z%Ei&fxH3yQmxz#v2D6upvlP#wqez4?9S!IYaU#MsC4@Z}F8$rwOh1^g{8Q%4ge*EGcQ&Vm{VW$Y#G!#7g<%796 zhX)G+)*6b3w1)oGW4^wOGwDh{{N6ednjgd!JBzsoRo^X+dw1miP?3)vCJ6FwnD`sZevYQ#D7V6Hk` zIr~4C>I>LKi$+#|V3p5Iq6@f*C@W^BmvD8iy*R?~Y2!%c=LZ*UVQklI)*n!@IJSid$c@o3@Ht<+)A*{UiHi)HMH5B;Vb~g? zEHAGNj5MG08%mvbwuIi4fa7Arq-BD>Uq$%J{dWZSFjqn7f57$|LvTy-`L#^Du|4yQq+`nh)vS~U}%NoA7&^c7j)Y9bh321z4Y*v-lf9t=v_Jl zE%i?mcCe1LzuPj~v%7~%bOv|i%__npn_9d`0q;}ukt=f*a{Zy@|FtU6*tll2+Ac6+ zb8orSW|<+&qOZ3vd&%)+_7XthhW%hM4q=^e-X25CqDR^nbl{c9k83UBfQlrXCqxr? z?3x_Xp*FlPh3+pzMn}HCHFb{B>Xef%8g=syOCLl1h?aU*T*i%V5!)4}D81_nLDn{o z4PUL_$8{b3g3I8viX2Y{N9JmE^vOs{mKulMi}hz&W~NXCMx1HJNxQm?pyrET7XOn^eL`14#EcAbM1nAA8PxaLfG+{mX(Iqh=Ah z6~jrasOucYOelOZ9A9kn-48aW17Z)<$$$gH%A0x9s~S}c&sUVdv0nLgD{Id5(*iCL zrAb?Kbj)y}UK|;n##i$sd34vN)6it!_>k#wZ-{(*xJcM(^^X78rrrFf1fU{VnpiD0 z@%fxGZjyH-KXVKtv?{q;GoSwuU;RQwP55B%=(5E=pEjeZLFuYbQD&5En%>rKO?Ane z^IiTf#2qFbs~ktF21Fm?DTEF`1ab4WDV)d!SY&Mz$GZ@eIo= zavD|kA>(7NCg?h#4G-{TiKw_Vs^t2YckYF6(LTWcridk2@9oD|ivUnr%q1A(ulmx6 z%Vy<`VV&Sh^mw>M|5@LmCr_Z!l{rNcbx99bt z!R{Fizo6d3`XI)NucFHNY#CiTDuvN99rK6w3(+e-0Eq9+Pbx=??SCNaHp}=Cj45#m zE3wgQnsyM1SIdctByw(E5WEX;-KzlZb+lBD=XYCqS>aw&uxToXTVY4;X%TO!d`g2_84nCDa7Ksvm6f@UEUCEEXi;8`vf!}=J|RPy=&Y9- zWU@E;jz0@y)E-MvpB~?EPvdgyd0)b3p%1_B%YVo{BWS;5UZj;b#O*#vB`jRCBAY$j zSXb4-b^qpmmY%?!_X<{*vUk_F=WR=EEkix4)k_9T6))^-RevRZ>zfr7S}+piokrfk z?%({QkHB?YwY;ABt?HP!nM3$u6nDYkYG3|R_-Meze+T7>r2Ve@#TRFv;52`^*>byn z5VqaCsA7zU0@20NWLW#z6$`zcCT#=pV>EK;ao;6-!O)NFx<>@;X3eenj0x!p8 z8$GRJRbD~kt0)PQ0MoY4Xpy8E58&ugT);Y2$!dQx{fx@H zJ6!g%R<1-XcW60Blu@rV5P)ZBb=7lq!~NlmcLQ02PY{$ErJd^g~wt12^@on<0T^O|{H@w=(S0d{Eg_|3D%8ldR zoakr9d%|k_r3o%IH+U>}@IZH>|4YZ+j!l$S6Zq&^)}s2~+hDR8&$#N2KDo)*Rv4+P z+7V6IeXzm!Hu_6P=x`*h=XaNUGr)NSrkIyP*56d7qQa=)Jz9Wm>#;TJYy?Xhxzwh)mtB5C_=!-E1WJE^4Ff!;eip z-l&ol{7?$!qeE;rF6aKCL(0oTe;$k8ZgIz57A96!xWd~tU&)ms!^CnHJ*x*8Lq)w3r1QijQaxH z$@UVO)(OiXyuJQI>0xc?q3E|aK|ho5&C%6?7V5mFXF8^~9`D(2$yV;HU>4`$=;V@k zb6VwWl}w3gtBz3`8YjiGLZSNCG|&oxkjUpiXJ%q)CHp0Mc+q=2C~V{)HmN4^F;>D{ z%<8{ddwHMo^n2SE;v0?AK29nn3_)MAp9A>L7v_2o0;dY){uO9j%bprTt)TceRydBo zE2MTC!5MtlHIS*qqEMp|O+fCmj0aUfAj0}RAhhazB_^AV!;-i28AWLYPRo{A+25}P zI!Uvui7v@6Vm>hX(*tFA&=NkH5=8BcF>4qXq_-bC)Vg2P2Za$|=j0yg%2j|B>W(dfMXXxJv$}w1kj~{E^Q; z+3Mt;4_cDHTHiY};aKZzDde!r1A{R+*6Rx>9_8cj*8su}+>8H;ha^KCQ}mbg4Pr3dZ26U@QP}$}(^l^GN?-CIVRtIE9CEaiFV|4fA4;7gzh% z>)O`Wnx`5rv?dE6g%Tz{akO`Nr#)f=*UqpSl;CHRTX%eXC*<1aiK?lDiQ(3jhTSLJ zEM#ksYnj_Vv(!l+sAE{m49;kEY1Cqg1Sln@` z78X83Pg->28$f}?H%O++9_lc#J<~-~yVf^pzzt@hX z*_{o~nz+;#8-y~n!B*CBof8QSra$^gud;0*yNk4lYXL>UMZA}nQ!+@ONy`;gX(~vO zwB5Ob!aKoUw{YI;eTwq>*j`2vU&=pCEfE)sh_}Du41M^6Nb5(F$-bC{or)Ak8clwBY)GBEra8Lf|X z+r!>9jirW{4X&*6@nR-zC2KpS+l8u?tOt&CEFM}FYaS6QwaAW~@d?s=(r zj{2sYsFlzN9=(fKvXo7+c^#3weS_{{+c6!xP3Ct#U7e#T0qI`K{=`&iyvxy|tjc3% z@V9Um_g(r0QPs3QPNOEumC^K-=C4^YXL65hpPEfneKb&Kq>(FDwQA?(f_4S{LQ{vM zK#J&|HVuVt*%wZ<@mBj}$Z+0S4lsOp8)jXxYelY905H7t29M9zRAFxeI3GFufUkXa za(+o^@&vSnUv!xO67Wd88CK~)5V(#A0_7fB`-f-Bf-n+3-xc!i?~MHK{&g|)6RnfW zV`(ASzdliX-9*oQ(%YUPYcJo2k z&?=7Wnbw=7Jr9$L3jrjb&A0sFlI6}oC9N|M`Ai}%5?L@mt@FGcn_3Yz`bNb~x}fevPMfSN`iEumJ*W6oUsc4qQ$cjdLT`Iin+ zb|Xq;>l>Xt_&hi1Qj1%%ufh7hDygQ4-UkoDgx%cM zuD)6;83t02YHtBKPkr8t5w)_K;N@*7SN5#Q9AI_I-wb>LWdl%+#jXig1Z?j%yGPxH zLE7pt0%zlB8#aI80Zc9K9`-%NuBM&OWmlmx+@WkT=bf3T^WJT*FZ^Oanek;<+^{po z!j7$2O6}wh}3RvQ$pQ1kRK>yHAb^O*3zubf1dz2 z6^Vjl^|`jy%R2rXXP#iH#vN#MPi&rMYe~Xg^QxY#7I&{ZzsghoF|~t`g_9?&0Y5t$ zL!hI91pgQa07FOkqiboIYNwd)caMuP?&y6}ib$c|?WA|!La>$+&?tJ2YdWB$x;U++ zg!~z+2~%RAyZ4IaWtyrx=&om_;)@Kr*Pw|>P1yYPgnL@ch~DXmBbuff*}OxR7@NJ0 zh1R_;M!I|7K;ys6Z+LECc|gZm->bAUNLiYl!C!IJ1O$4odd@p|L~#-z$dBx&H;gkw zDTbDa;xX;+HjJaqJ@skIp-J$Zj2Ch}Gutz`bpJA_x4`R4b0!oPkN@nrkacP6_oX7A z89q7~<5BLJ!O>0T;}779VBtu@KM1@I*OMv3b&WOO98aYsR#t1YoReW&C zp;QQ3-?d1JF@o14it}60sKSi7_(3kkLwcS+iWt0Wm8$`{?k z0hxYgcE#MOO3VGwEDvK~wrjH12FZ-csXsENg%8_mk07>TK3+StDk>p%dYjv@t3-Xi zuR|!OP-H!h-`(>Ab##EXq950WHGa;Y0-)Stz8wkdYHauN zj=5UZng3WCK7oOA^5&7_^zV(8u}U<{=-==n=i$XUqP8p~qx26jI;lb)e}Y`5z0HTWHW{6xLN zu^Yh;kWYu+0>1EH71EeJ`B;DJM-GF4-*ENA!**~pMxL8z4lNH?*i<=E%Z7`p5;*cw z?GLVU!bWTyjj$`ec?9o*5sVhH^XFB~oa2PYZH&wdvx=3C4kf@|H-nZ>^>DhowN9!G z;+u1eQnSrvX0#~Yr=Aa}`G!bVbEfxag!SEVLukDsW2iKv3d7t4KcB9mrCzl&7Z!4( zu47l8GzCOHN;+8e&(-?4*>Jp<691KP#QGLP_9Gcjat(%8hB*M&J0pEkrZnHGn<+S}96pzOympz3@ z?Z&((=XTd8ar`Z>fu4&Kl-m$$Zmf09rG=-T`L8?eqm@^Nufdl7{McnjI$AO5`~Lq0 zm^54oAmOl*HlZ`u6Ww0vArl|$I#t9TR$`tMxI85Dk@ykroa?G>X<%i_x=5NVv(mSj ziO(~L$zQpBXCU*>79klsLB!BxFsU_$ea<~^zWX?^YQg2oBcIp7haE!9;Dx^CwbF6# zSA(#RlZpuJ@HE*t<`A76sj|4bSh0PaRfD6dhJ@Kz6+D}~au=LXO$9Bv+_mmZARD#P z2manPZs{*31i(`Ot?E}`o`3ID%kIYmEy#gHOA9qON{ekii7NfL#K>z%DPXrth}v1| zZ`NO_b&vf|1$R$`fu6TKU(acmmveIZ1E zggkid)RaGu*&#es{u5AAr4ESTPr16DjltDt0!}l#D>xxpLX`{#ZRWgv*>*Ur*2BG- za-l^_!E^9PBbwuXHa(`6+pKdHclmIdSj1CLjYv?mwWOFuLzb5zSuEN#d>$V&{d2zn z$h-}MB)nda!=4%q}c&44Bs=jtfZ{!gvh4$Tl z{)A=K74qCxa6KLA|NJWF;8K=_KhB+G|G#7OB z);RXAIeqP14>7_WHkaMG!qjt%WSC)F6OXPChjm+ zwpq2r_1&h%VCxl@n`?({^ene44zjrLjPxg8oDBaQ>lq+>^zE@=Om2Un45GU__bl%? z7M)von$|Zp{;TF$@N0y1s<~YIUj(0aF=;e@WFi*82I!`<=a+;AtY6W z25}5!+*5u2qi&v902 z8@J#JqqYh$E5`8*g}$Eqch#eutms&TaL5_?2CHjgwnsN><_+b zH!M=D_#MOfbM?#AfkPj4#=_1r115Yf#--!f*(g{H{}%Jj$F|H-r6*xxCwpQN$|)MK za7{)k1!{1y1^eUGq-Q}>hFuB}NI^$rz~X5S0u!L8&{0V<^}(3iu)p-wKC;~zB3WC; zis^RNMxzYt7&r?39C+hXSdx4Wm?FWJ6acXbjK?P)`80s+3c0xXZ5QK{qLP0CS@;o3 zeb{OqbTvj+;y1bt&(&4+V~kH@%W%ZY1&^jQ_o)k1-%1T-Ia-wQdG?OwR3hWg-Ncip zx^E^-_+a$p!%vLZFV{6s^OAA5Ee2iRP?KeJsdIaeA{mxxYr^SdTp3x~?7SAo>=OR& zn#{*ro{_hvpFs*HSdAlhY>d4A-l{BCS?NIC<-YQGT#FLJkf75r5IXEXj3cFktL#H= z#j$bRTseble!fP1gBaxfK3fs-nD*BrZ-T0rxEBf17BVV;laMe5P~9MVp7JlsNb)B8x)u1LUNHUtNuMVp+1%a(zoQKnWOvk8O(wAIJggiW%Qv;fy`gv^WNGsP+8 zIA3~O!M*U?-7v?HVi&utrW`JZ48vJI`7RppDCjLks=HbG7;AqV7wLH5GP>X&wZc4s7!}bOxy9#&_My zJ5bA2Ue01`%VXPjuQffK^@vlZ-ZIULRLtSlv5@+7kCZU9CFd#Ua~iSG^5fPg#8IV| z3lX<)(r4x`){pE^mT$JPqxPIIU&_+Fld@P=J%l=9{U8af`$rWpEpM{rF&4b6V>o_O5FRiJG=_7YRDagNGPZ7JrcqUfKa)9Cc@ zS&yQ1h*^MCXIgR(=w$r4GaV5dp9TbX1UA|lW)^?<0S$-X2P80tg&%`#XFhtPt$(=h z*DnPIW{zaKf`8TGe_m;~84cX|biM~NV_AYoKnGSQhrr9eXP>jA`%>@JDgmeJRP#ac^Bn*ko5bSSo-OI+qRw`IHU z7q@v;NUB;n9j^^}T+p%aW|B}=gdHKEbYo_m`4N@c!y5xmPWIQBLE~YWm@UwTZt9qt z);d6~8C|)yBwA;FBkuw?wC8bka$Uti z`>~&&PQ{V$Gx_qKRC(m!`Qptj@|CLM`6+)H5&fe4#p|h8@6R&gfhgtPK|fCs6|~1T z%eyZg^xdnqtvEZ8FY_J(93xebjWIk}so2BfPv$hXanhx|u66F~8K_JHXSES>0#?Kx zAx3YzV@R$F7uH7r;Zd0;vZz*ctT`fBq)mjNG-+;6rtt+b(dKfG?_?+zd-JL1k9s z$wd-4@D$M2jM(Otbf<%(&df9r@7{X z{20V0pzsv^Wt5P zZv8Xe_Cta~Z0^3G)3S2%$$r~V$d`(`(~MCuu_2|3u&*dXd5zqGkd~6jeueQhQC4hn zqBWeGk;#da$_$ucto`vd`#E9xX?=n)V-MFvbxWY0c9H(mr$%#S4er7%P4e{FNq4$A$ zyjJ-wvehKSJgpUU}TvZs*ULek~Hsln$rcEH0YNO_Evb!=$`bCCDj5oIQ3ye+se+`Fd6(+F*p@`O@`bVBgR>=mD=SUEwT!%JOabv8smV~7ZE6v>+*jVT#|7g_N2 z*#bdR;?|{$<$tu&c^z~7F3DzOnOx$_g>UR1jI?g(l(6j=znksDozKIY!tf~>qt9y8 zS>ARuA{D9%hG16)^K~b65C|?#Nix|oIl#3NwZ@F1Ibyb^EE}L~~Ye1d+382(3W)}_)eLbqh za<$8QkVmG4X8@H6iVi$gPrFES?N{jU=tGB{QSB(fcSEVNlP?m_T#`di zh+DNsOM#l9)YOtOd9R(kw{Nj0rADa}^a^vmP)Avs*m0_7d$`~v1Q&6)O=$iA4e*V{ z(m7mQ!oETlAOkt>u~}kY*w)L@yjJ>SPloX~dS;_ovwGvBf3V zq1ILd-;(-ua4R`)6g`vSMJ!WU&$w0qi^Uc!6KUsY^rLPHklrTM^|UD>@FnVc2LmXsB_E5q&Hf&$#-2zVt!dnd*SEsGE}T!xE_!Ok zO8NelK!^=#nkuyf(Ldt_^p(%JFZ*sTz#&Z%4?*$oa?Nk1wj}LM_O8}M+0QgK$Ij3S zwxk0pe>A%=k2!-jJw5s`kj0(u87F+WV0A(yU*_u7$9@c>^-tIFfUz&Ulm18GVfkyy`g4+6ZZLM-(5$?>xS-<0=&yw>yZxX2ZwSTFxiWV`~1J`&i=g z`lHV9TE)0~Mgxp(8|JGW1(?B^QP|eLur2Q~LMlDBO z9tc@}rV*&sU}*ieaN2S68y5dBDE=x_zA+Os(3SH4$a?R1s{jB0{~#ox^2*4r&@jq4 zHVqmIDSH=(?Cd?FQYk7Un+WCD$FWzbWG9Ywtn9rxIL7b(?DhJ5zQ4=&```QhDuRC-od($sQmDfTb3`-vA6&0<>0@Wl3%Gd#@L@0R%o%DSQ?pHvhaz=cp1Nk zDZI(ZC>@`&SH#fmsP}nwu|yn&A~9o=Dqrcj0X1S)VyX28wQ6vWi^9`(`H)Dw!_jq3 z3Gkpc!;ys2qdtAz@1GWMi&K`9kz|wjl2Tq~v)J5WLZ$vuI@H!Kq zTWzkNjck_2+jLo2ym>b;5w5fsZjBopg9_u5Hcr6&8nyLfF{CkoiV&pVD%bRlz8YJr zzGAQ2KKl~^EVA2?-;KZdHZ@nT?cSET5RrAuXu7nT_Rou34PsFPq*P>zkp!WIIJNys z**}MCN!K=~rN-A|1WyO*M=Cb?{Pti30#PEeL5v z&h*9-P!j=YC#&X9yf%dFhA312`wKxTefw@oRu%@-7qG;~$C@jpLKgskK-*K1ue2mOIvH1)pEVbm;o?6w#@+3((_TU_Finox-sqarh&ao?rd zW+-YXo+A9Fmtq~?4;5uxC^qGUJ-1&3&O<5eor>0jd{|EO`>&wPQuSYHy^ zGwwtmxpMu56D51kRK+ks-~n19<86IQ(Q!=O*KBb&cCj8zS<&swFepbxn^+8tVy=9> zVsH7BX8h0RfPHQ@p`akbe3hYhfx~*ej`;0N)5=RQ=wTD(h~0OO*%;O)6y3ZBUm^48 zOj0e8;zC(?X6qS+RrkQ~28)xHxMN4&RQQ7qAqM7nEM~?hpeA>YxKT!sg?9F5L0Zx7 z=Sdtm?O`&641`KdQkr4S*#sxNAiKC?3~ngtTApY>sjMotklru6i?-Tx+6}T>oF}60xNE2P6`jyHzg2arLjv z+b2)VErl~4)TIyLmD0h52RjQ>!1yX(EBx$}BjYLyvFCi&cUh&D(p2#wPB|uzwjjS{ zKj^sQn#f`%2g62tW3cQR{Vcx*aXR5rEu_&A=7r8&=tAxBVI@9Qvy_m`676CPjD6Ph zT{f3?wJk7~M`{9ifRMKgL_S*PJ$+s5s@1T!*uXk$aQ!P9ZPr#Omhs?{I?&D@dmmjSqNlOn|d_uhhTl zPB&fc0#`CcBR(~{ecBaq=|85Z`(%(4H!x%iKE;I=v(N(V z0XysDo;5$!aoppgq9b#z6Q|aIQkk@0Z)R|(qg@*@IxKi^Y)={+Y*H|dP9KtN z%1SfQdI$ywffz%#!~XjnkdYw0gjcm8CDm*A(&}lXQs*yp=%L_*dWCUpqct5xk}@7<_{ax%IX8M4q=MMPVe84)y8GkJ#G#a zfCV3>=Zu^$OT6|HOIF8Xz#SO*N^%J?CHKp9OyjWKEzPeP71R@UbPIQXIt|7LlN2M3om#aEjF zfAX%>pzrxe7?>jlEbx~@Gv`pVo6%|kh89R##2(+41*g_OJrhtXby2?66*5u?wTvZx%ZlY9B*<#W^@*5Mc=PoCF!4Ygmw6Tc9QF+#r$hLtdB->^I13%!b+P*jvGr z7-iYy-nYD^K2gJU4T@4QXxwMM;V0PQi=pxJ*(mV3R0B;d{JbwhhuR=8jNdkrmG4c0 zFbHIb3&cK0ET&K}+A=|HM_;qgvlRZ-asT$ELDFrQ+y1O9VKEej*@DhxJVc_Jdao%O z*XS6!@0Qb@+2r0_BdMa+6Uy$pcVoZcq36=HyxfdTfVccsH<=alRU1+g48u+QdXI6` zF;4#Ba+)Fog%Di<;ahp?lzu*`7<~n%y`p3B4SV;RH9^g;&sU@tzl_ z!u4k3L%`ItRblHXkiwJ}L=zDe`xuN6NC(yF#DR7OXLvjeW!e}yYG3s_uE4jQa+O{4 z_WL0Cf?|qLQq$$|C5VE-m=?7!1m2zYxY#Rq;z5QVN7qqEi-}XE86%0te_%?aTP+=KJR?D z>xsM#_qAzyKIMW<_ozKjzHf;g1yvd^8m&xq_p1HVlq-&=-cjE#eybW9#AVFj#CmV> zvTc`V%voj=i-wn^A~)tA3VCX&>rDhxyicQPt_lB`621L~o1!omYG^~lhTL1^CO4EM z@vA&aO2cFNn^Jr!)oJSi;Ay zr{fbg0b-PH@1`Ob?}Zl1XARt_mzoTg?{nPRyOZX78sv>l1T55{iJmMmwbJU9Sq1I61zJC!@ zhZ}Q9jpEPDQf&G9BG#mP=d8CK*yrV=(vj)0sA=eS8m24;~ZBHrvuIAXVCntb~8VqpM zOrh+FY3AldwE5AG8^Ku1F8k;pBsw9~*8q7Sckv|%{)9Wq%?_V{`)?`mK9~Y($+k-Q zbd+J+o(!lj``q`2w<=xbu%j@H*Ow1?tG#O@ZxpO}m3*|?_2{k-=_)uEqLVVHnI~Iy zDq(n!v>x!eZa(BUATWwk&Fm-;IQbI(IwI>%URTsL%XbU*UXO(ko4sKP{*V?oIEMez zZHG5Y>gQ=LYH-S#G+mmT8*7$Z9r{5mVE|2}IZ-AA2)Nny5txryb+ieyZB8GB-4Dy*3*v)9NX9siywzKhsw#P zmxm++X4y`$d6s&RN-pg^?nDhGtDeXDf5{IxFraOylPl#smaTrw zN!bVCR@1s?y`V=j0bvCy3IjhAHmSEx%o%!w-ruHDe|~w5yD`U_m_%M`Il&}usddCw z(SWH({b9OgJ!N)KqA)*ya%x!oc|Kf50owbN6Pd|*{Jm+mn0!cc+_mmpE-t_F5s`7j z60UulzR>oh%cWC}`=$x53_smn2~YA*lDe-vm&5#+`*p<;yV2(1)u>C~PhR0%Vos=_ zWX(mw{fehFx&8dFZTZ~6DbDTo{=MWWcD)U$FM5zj9VW@!d#^UOp+_kSw7fMVw$APP zJqu9YO`?4p|A`jaCS`1VDG!Dm9r{n$O167g4P`zY83Z?)2Ke+qTfF7}hKOA475#Q- z*7Jev!_B?o?l?I?Ze6hgR;k&-Gm2$`FlCKO9i(EK84Ag)kWU|=a#^Q&)Y6^_`dR4D zMHX-jo|!I{3S3JMQ>3rIwKd|KG&@s9D5=^nr<(XQm9zNG-EHHPDVdki$74&8#RA(|KjUt4I-n( z!tX(z(I_Ffs5$-ONQdcw4kF!G6Z}ly(q z))+pxzPNnc`yxGDobYsJI#rzVVc4wWX z*SOp!s$mhX*T9 zd~0DE*%P^ManP`$DkzyEHrIukok$Fy!QbH6d8Emwi{vOe9duD6334RA@ ze7CP*(Q9O@WF}RmwN4 z{!!Ps-wm~8E0mq$UORf#ihIIxq`8iult~diWx*kL=Nuj0J&x_=@6_bSi{+}ab@Ia$am>J3a8d{t(2wge7mvHPf z(^B5`^;dp({U<}eYT`tQ9p&1su*{K)yxjbTVrv0gQNv?g;d*kt)4FwMNlDS93y>GgC7Am0NjD*x$FXv?E^u6zc zBvx7y(N6~{W>APAqthZd_r~V|-;*@0T%*`{DMztgMJmNNj~7^Se-kwzjwMDt~?l*VzICS(kV6cbiy%%E5aR)ml?_&7-DF zG?C4Xq6ey8d4$&g8sfeo4Nd-=KhqIBsIasAuw8!WF%3oqQf`nK zgD}LAf8^gmvg4vdvmPAM$CHZ{(NgEm4rNm2dy#c2E*H;uuRGo{mfafHXM!LBRP#s} zePmgAo?@m?Lx}=$P-2J8ef(=SDmKcWs%%X4Pukv0)R%3FQ2~(*P2>>ez;|2XWQI6O zV2<#-xAHMe9|p<1zt5d=HUTAWh~KXs9Ov1E4<<8B61}~0ee$=1siSF&%odrt11v}% zyrVT`7EisnPVdHDMpRGalJ}iHiQV;BvNrv+3wQCE*i_fy?efXP-}c51fP=*M+GnW= z5wlx%hvBh=piTQZ`bXfRr@pZGQm%PaWAmRfs!qu1Nqughp-kqokFYP5#~O-SU26v8 z{;a$iJ@D6R&pmQ>=bK5JIvKUQv`Yf5=~r2(5`qTUDC6A$p7vd|B?L!-a&nlP z1+XFyR+_%R$B_?6P_&xZ7)4w452W<&StQ!sVb$^n{MHesj1v$)1PA!iPS1P%Tx&*+ znTvC)*>Y|DFvawXe=t+iB8gDItXi{9{aT>g+Z^5ZT-*&W+n&waEcSV)UOm4#R3_1N z&2j8o2@Mo>6Zp@}(|zg8R3Uru@RU;4LgOf?jn!#};d)ko=IG6m;#bT5(d{OuRI3q3 zN-Cu$tvzdcfa2!OgS(UfDAM6N-?xi9;jU8A>dbWi#ey# zG8cK2X?bLIKLh@g*$s8fYB86Djb3uGJ$D*hYKQ~nW8^(>SKRoSZGD(~Q*@@w$-FOH zib6U$dSR;LsK=Xr$G-BtdbfGE1-l;t5ufk0dD5r(S8ex+uktU7n1l9&U0=-GO^NZ* zNm|t4+J8w{U4hU&v>z0n?R@hYW3-EQ!tgb8e zR1Ha5-#*2LzoYWT({OKqlmcunD9VmrrDbfdHt!tPy{h_dqc3TvYa9b~E12FDLVGOy z+zYy@OAVbyZ$5TfTx!TN>ft?WUVJP&{%w^0a2=-U_Kyu|IT;)zq~OX$09bxLYYiR& z12k*Ah-4!Ms*h2E@k@gLQ;b+_QFmFmsgV~xv1(R1CQXC5uDu6;_yRC5g7#KRqx^{?u6FuQ$hRTf;ZFDwsCH+nUr;3IR(#cp~qJ! z{eYB_W+3VJmeO*OS~d~!bc6F}b1aPnoPpQ@m%RBgqv0o_Pye*vrF*BYhJM7S&~k1S zea4T$s#-|}cim8LcTiPLeFPp(l-}-r2}3EzVff!{J>AJvbVL8ll=OnN12rGxU6lkD zBPVBPOW+0hZdUK|PV_Ukd~$Pja_h(qdG@-$x71$hD(%_`d}Id0jb1>|MJ(^^7jpOB z-A2ZZC(*f>wfl#h;;)A$WTQJQtDy2LU9EAk)*-r*NNJjBGzptswQz3pIqY9n_r>1U z`b2Yq>@hFIGX?p@6P>(2O?DO+r{`RlR@chPPjqsjDvMb5^ufDK#9#QrEB zTfUd)ND9{AKnGyj zgZ?st%&sRLIMR^({=xeiPW4sVPoyQTd#@#P_sx!V-1J13s8=uV?yJj`zhpe+^l&_0 ze&hUPR;SKhwO5q|xh%eFtC8|j?9-E5MfRD6)8#K>9o4AK7PMv=9bhhlQg$@7^%xSt z8{5$w2=Ehon?3jHSU1u0yWWUje@myWdKC>kl-Z?aWf!K$S)UWjVhQJmK3uI3gspk^ z!7(=c=8w^BwK_0L04l;pT%H!NbBlX^eZ_+%RE9c2MvX9<9wTRd`tjQ9Xdv)Vz}W<% zE8+of`Hoyr)X}7sr2~<)`Ifk{JM~&T{zwFEc&oGI=aZQCU^d314<$*U+vdS%1$|05 zjC2vZGJHGR_qhmPEcT+8!DruGuY$vm40!P9A(vK#3J(+K_p79PmNQ9mF6spvkS$An z)H%c|SFDV48XzBLm@>@{ET-iNl+n0~BPQBZXw+q#F5U9@f-z0{*k5mnvCM~J$bKs@ z@B?axglo|uLO3US?BXYE@%NOE5Dm`hdL4g(`c9Col>PJK?c6r>3B(Tpc8cfTq9f{( z0iW*%hm=4#$W!8r%|PXabYtB-0|%Ulq|6HlNmx(a9k4VmnE5mPG$ivk?M0x2^j@1) zeC*T~{xKq4%B00PwZFwuoMN|}O7&McOmfqb1CGKc7v|Bvn|nUg+#Vgz9)dX|bw%6=UdzhjW$@XGL>C^0k2Q&tf)-0#QPhGG$)7z1|o4&&lGe@r>dDe;f zkS4G3c%$9Ry+A0HDD)T(?OQQ>493W46CI{g_wQgW)nFE?Llv{%`z;YhxFu;CD*g9; zp4m zNAx?ggvn03gV^p#F8%;)rx-Xv{{oBfqldYqpMZGeY!pk2Lv@rf(tf0G(t>qcC?3-^TRc^#ZocMZ>U|{l@0MMoo05CAzk7s^*`aTL#aK$ z1%CAQPt|guD+q%6Fu(1E3^tOcl_&#CuO=goU{tAe*>aJi2e$BDkky3=0x$R*C~EU| zJ3wxHzY$Iz85z5_VolYtC;sAcRpjLnY~ z6Kr-H#Q7h9rvc%P@U;52MeB|4l|UHjn$mvifFEu6q2|@nws5~*0mHS#3>v0PfJcE- z3Z@RLkcE=48*7E?PdQ+P56L+ZYfb^s=P;W@WXDjZ&HNT*N7CIH-`aK|2`JDFpf>yf zFWu)h^({b&c-yA%9o+^J5}67jFfjv^F5F+&yx?A z@zmpO8l)4H>af=1xjGvA7w#uG|$ZHsGb_XS^YzdI! zpN#s`A} zFNL*z1;joZzCsnsuN6nCg-7$r5lp(o59E3+3bNaDbgiBZ**%~C#-}j7WBQH*@117s4mD&lfb+Y6 zPQu;E*?f0J4Naltm)tt7h0Gte&R;2Y-)0FUybn5Ykl|N)l@f|JY(n9ZywZ$6u2B4- z=LaUont~wK>yd-aA3W&Svx#>R8caO6|_>hz7H|ID~Ec=GwE4 z)&(JL87PKew2Kdk0~do?rJV&}Jn^-YsWB_REnrT8gDQ4}iRXYbeEPrjHt5rX_1KMB z(cUk+`kn`%?UFw<3av;L?qAC6X#dlYK>KNfG8shAgQn%r1O2ID#YbOXA=E+m8*XAG z(wJ?)Y>nG%Q`$d$>O6Cxx7&<qv7B3<;H7Kqv)e@}<>Y)6Y1d~xq ztve;l5K-!{i)4pzaGaz~wCb-i7!`5Cn5%G4BAepvi#J{jEPncr%5*c@eg~-u)^Oei zS^|jdkY9MAD_En9C>j3L2s#VQ5AzGQ{ZGysJX(Nb0*uF9K`xnXaaSV(&=@!sP*2*J z+8Y@FCI=CSl^usWREhJ`?by7!;24TQlkMCt6L39DwPQsY95rYPorn%Vdr zz$9xld`hla{xJ4pI`dXzaStNFLKwwKR|*a;SU4lT1O>u@IN2|aX-nkf zr7uoPNJTu(U8e~{;UV9|pT#X44Xx-EiwedAHG1xCB~XeW-qVWfA~z-^H^-j5^J9-x zj9Cc(xqebLH!R-vLopU)-f}W|yyA7PGltHDTS3nj{WB3>ggi!9&EZcSKj>Zqp09xr?j6uEpWmgsmHw{5N14J-%lH7Z@K z;RXcW9daGqNf>neP5GpspfY?i#OS=#OyFBpRY!(3FK;JI_X7ih(=c5biE>@n;yMFY8m9?*4;*-_1Df$uDtw#ybnSK>Su3y-^j7ghDhHAywpV0#x*2G3ym_2OUct6`c|E5}l zG`ZAGyS0XMldxSm<3FD~0cL$)sHTrnq*-^D2N#QG8nkA6`6w{Vq8m$cXZ$^Um)Sx1 z`JJU=dtJ)(a|K2xSLSCKQfjAq0Z8}o*_-gDc^2urTvJ>XLS3(x&7!_g1FWWEKRDZp zF8zU!>IKj}L5D;k^95eOcA!$DRaicAXDt|4Pyix?@{Sk{YdW**z)bk^hJ796rqK?s zG0QtDo?f2FISV5@n%eD8_&!pO&nb_I)`Y7t1AwgZMQCh9X~WY%znR8ba@<|A9evi&P6>hw{0Pa`(I2lcW^ZG5|7My+D3{NDDLHU*EN|i1**q`q%5+<#? zkIZy|i`)k!8OYal=f!77lZ!~>;QayX{|ISu6g1DG$5lfaNwjvPUg(Mq-RJ5o#GK%+ zgi-ZlEJXCgc+Jir$pG*!eAca@XyLZMPa>x{fLP(Qa*sGt@~p~xeTJ9}pJPM&_ddo8 z-V-Gvd9wP&-H^_~I)ndw8aJ`D^6|3~d=v-;r*!6H4SP~Cl@~o856H4!0|SJC@ty~S z*^&msdqI#WEw`RD&l6c4G-xiRyLX5nGGpZkPw?vQS^xcADei!;f^Ca{uyS9M^P z(Vz_032xsdKJMJ1AhzHzYzb{B(}q?MBQ$tpka$mnq89}wT$(rH?bhvRZ)14ogR5Ih4A2<3nDbLnIhgO4C*APk>7qg!I+ zU#ASet(0)16l7MH-d=;7Jq$}e((H92wK_<=_ecPvh|yD&1|qHYY0CqX##-`4>^(YK zz3whu%1E+jlh5G4n45N+paM9GEzN2#BqYr9h%cXQC`&>5W57B@qF@+bMOT_E*TLbdW$MDp#IgiHXnH zQRrjf7O9dGc6*eg07e;mOAp8=()s!yfMNA~G?Hf}9BxqIs+0rgjPP?AQnl8WTmOWI z;>L^_Iv$4baqi9i2%!x!?Q*_qC8HU8%lsz~g^SblzY|K-i~VRxTHe99_InKD+q z=t~g>N7iC24jv-^=ZDx%tI)W+CbXYNs6Ao{5d@eB$Y@hBAMX2Tmi*s6=tqK9YB2WhB4Put5w967vN<++Gc$ z)=$Uvl)z4fP>}!zuu%4m1!^1=Kxi5g+1qrY$2>xhjBo>{dqh1#y6Cq{$&Zmi!@T@?tqjl;Ph_+Tb*7zxjVDvD+H=gfPrgVKm*?! z{wRKN3o%!K*iA7-#4!z&ZxR)F;7Eff2HMydM}{H&sD|?gbrszGxx%1%>w(r4AQ(2d zR;a9iqd9K&^}Udn$5|8%h0S|XK4@VLS{!`FJ(@?dT^z?+rD$s&jCSb(%k?RsuyGOM zpjl2_6eZpcRry0~Eom0B`kXjaN5fD>lJk8E{x?z};}3jrmC~8spjP9@{2@`8cbcmG z^bUJDMl~;3qeyN%LGOvkllA0GmW=qI+03S{s%x^R6zA1{hMoy?P+(B8<5nL#rXk-i z55$k2a&yBMVopdxY~i!OuTDB0?x%ocWeN*6Wu6)niFiCf2XPjfGZf7s#~8dUl|?>7 z!FHe)=D%W#Ip3j%gK2?6g*z`um0-NO2rUune^Scnc1TM3Xc_mvhY8$>szAbrAs*@w z*G@buXikt|5)*oH1D+20A%?{|aL>d$2IK*~q1E#$1rTk&h;B|ekn71Lz*teCpxnVVw~ zdCWtq!!%z;Mv$l-@4aMa%Ps_%mhajzm+uHfoNcoQGjW!7PV}O`s_ZY-#02aoOyJ2V z@z~q$v3{);p(4^fpEl7FctV9anRC(p!;8~`uyDaCgpjA3 zyeb&*$W;>F%;$2gFn0FjF^c|D<8k+X>lZsTRgZl{P~YXujwpjWPA2tWG&;a*qd%s= zQR^!>Mv|E*QAc!+|9!W_D)T8f>*p zE%JAVOU2j>pI2y3Nb0!>2?l!Q3%>F;qC_P2QY5|Pd zi2TSaBPM+)ypeA}L5S{@yZvLb zvIxo@!dQ?r<0n4c4cGM{@;;@bGe{mmdxexj=G7 zuas9yjuaI3p*YH$d!sK4z74!I8`8Q=}P)ZXXY?*AaCm?3idM`tp7Fbs*>~wA(fx82gewKb#E+r-L=mK+;#{E zqlta9p~aCEJnY$IzlgiXV>SQF|2ZFDXDgf^fR>CUkG%qQN`9Pj3i_9KA>=U0 z;sxDI_FjkABHMEG`I3BYFPH}}4jvq6Gjf>g@ zL~VF{VBD(Hg#47Y8SprP38-#jRXgu#|KwXA)3SZx|IqaFifwm@*LOJuTVfup%VZ@- zjZ2!sj{z_9G1=sx<{wxrQyPH)hu`o$JAP^0=Faza%0KfR5mw@-GyXCwyzi1M6j_$+P!4aFxIc zSPv?GAe8q96qOLbAi|=7nOU&|Y@PwA)C$9na5ne~JAktTf4MuF{V$f%+5;7516M7m zx0%!vES_P#*G_nrf+6}!)4>l(R)A5?Xic&#F=`}zHX!OnPxo|$gRoQ7t9X{54&dba z-0T#g3lW^FKP$N&QeFqg!_poB0)kEo(9Bs2MSgTUB z-P08Lp<{ZnFqV1cVWr@#@&CxfT#03}PYrpp$2y4)Dl|%Rj&f z$WAtT6CK+FxFrw}*ESZPgZ77}dIUjf$WbyYDm{TOko8zDk-fISyYMYd#(sQc#*&}| z==t}mhR35!@-pwA@`%6P)_X0DMR~s6s}%hKg2Wecja#2QLTYaK1ZcK{Wud*u%?1Ab z4|faL^S_#7|(EC!No$Sh5i8$ z7d%(yQosH&o6k%J#Cx*45k!}mGc+=QzUmcS#w0^cUFM z^^wl5{$2p?2i3+Nr0u=nw1h__J2w^{ zA4DNy9FRNy+3{GdEo|4ujiCX;d{-dby0#P zL~JOVeuFY5F)^D8S1svFd+A@JCb9}3EWoEy`aP^Hi8OTMDNH(S*T5l4apXjGP*a8> zWC@>@u;ih@4O{0B=%mRohdn?Gt?p5X<-BV(It^HP-*PWO6e#gG)@>N0FdzQ|j;02IJ7A58(}Gaq4UBa7{eFA- z^cKaGcv12|%I^{Ii9HU*(aT9WOd@Ygxp&QkRAK2I)>*Ay;7n<2lOtyc%$k57KwSS6C@oIyu5NLc}u27Z)ah=m~A zBIa>AIKK)h=Wc?p(Ho$r(DoB6YRYg&hh&Yw^lg2}#RcAqsku0LK>&%JK|WSz|3W*{ z5)X|$-fkQ!*$d*(1#*(6$v|nUk@*{!mj5Zc&QzMTL{XHbSVS7E@f(%SOc}g**|^4< zz0U|ceHMwG!PXi#i_e2JaE}F+OGSU^?rn%gR8Y^buqz!r$B9A@c^ zad(?OQK3XLGLY3K;Fb7yw0)aXE(t!uLVp7YHhw(ux)p<$nRL- zVq1bp`{X$Y&%Bjok8yl0A(DAsKQzD|9Y?PlWw!zO;YniWDyOQ%63m47Wp$9SocIbT zTcA_f3^5=vl$`J9VU@{HR&&6WNONybZf7}&V0#2xV4}t<|MBV z5SeYh+YOpY{p!U z`QF;j<-CWx=OOA~c0>9L{B=+Xv_F*t+4I+)FlVpNbC9Ls>VE|NGqmCEk;j>B#LCjXZ&6?8yXB9rcGl#R}%T5yFKiif7lbv#$11^N_NbpSgGZn@V%Z0i2> zXDAxfTZ{Me5R0g=+=lhzMpOvXcdDhlJqk2&)>RgwmsZR+#=9CMLLUOiAt38+;dz}S*KNAaJH^4U(C7}#r{xE6k*;e+Qm zS$;UD?iKrRQ>pv^c^CuT_S36UMj#t44G?R11EU(3VTjEV!_XtPc@J?=p*oz*?F5@w ztY_0OCA+(Qi|AQG^}}0rG-sKeKkK`4eKD!PGHZjcBzm&k2b0CZF#H%Mvm4*!GXQX%Ue5ywwr$b6paVcW+oNSuel+R9C$WaVS2H8IJ#{ZNEI@2tB41hr$xo> zM+_)I5249X))T9CnX(67C4D1Vb*N(YO}XSKdzfythQ=+II@UaX+PBxYC_`1uQLdF) zT>Xx~(;b3^vgR{Oa8NSWx;*N?SvoX!&@4VY{wo_EZX~CNaLh9QPpha;Eg^SzMCG~C zBUIp|F1y}lrD#=L(-VXL3bzk;$(DrS_ClQ){~-fO+ukm5xlE?sbZg`I>fUqe+K6V5 zEm)xJxy9rQMzH}JNEbM5|z-eH9LQUrgp|N2OCgjEHWJVmRV1Xm(-RVsra z>1&~^DE2!DrFMFtLaIC0*nFYC3}sXk_vM3H)3QAwCZ+aLMX+5clAB<$k!u>&4p{nf zC8}&~^!o!s1I#Sx^}CUHxNy@7;3=TFK}gl{!(%|eUj+|34Ffyl8T~{;;KZxUc$CDU}S1e zRnz&fMqierAy~u}-Xhbga3uPU)%-_~%PxjTDD*x0e)JknV`1Puf zAK&Z=*zvToBkrk}(y|P++_ujyN-na(q3pOQvjvEhA;qwa4osPp{r*v#$dlTH4Nr*` zXYBF(=!{>JdTcd2cT0;n;ezoB67%AyEmE1?8jDyjCH!X1s{HRs)H-dmKfdf3&RRAX zb!9L!iY9zQxTqUs<(3jh^wNg1;m88W#P5Nej~FFFNZ$@D1#p3rs_?= z3R!>I@WLGSa2!*I8yH!rgR~ur>qwx2b6Nevj9$WC0K6C9!F8A_bOW}Xo&s?4tA+cX zOBcuS)Bp5~y?^L&cpE-0vJ!1uH6G_u!b(ZF%=5zQLlfq3{l;P4tnvc?z|%bXX??vYd5U;dPd%6K5)I z)IJV)10Fhl6iZRZQSzg2zzV8$&~oghq`iPb1#{;LsrgPC`z_MqeNvAN2V9R_%B0=c z4wQub-O}b{cr!I)Zwp}e+x#l~Zz>kXPuNEd_wQfJd$8-#IHu+g1Jy@Be`)au1aCM( z_1=S(BG=EGFYd2(j-3XPOMn=&8c-fLy}3FdH`nC_Z1*`L?iTjyJn`{w)OAL#BEyNG z#6=ZcubrC_02>iNH?%9$2?qJeLg9vlc;lL-$xeb60Y&pE! zG~t}r;7Ww@Nu+HQHu3=9_VAg+$}~flGdQA_*0#{bZxO5!ky{a<}W`Y<{m@t2n(AIJBLd+^CSP zYkj_s)N8Y?0OQo-+~cv|S~WMNiJbcZ%Bmq@9!e)*fc=RLRQ#B%Yk3ATuLi>|4}ac{ zf7}m~w*L@a4`+cn`^c~K5ZFw!DWfP1O04Mt{=or){QdtrFx3gtEPKjN6b z5CZ#PvN{LJcfp8A-o!XW*=Osn!bP&R*m@fLHqWxZ$=aYy3{rb>6LpmuBA@j z+a-^YvN&`jZ4XA;&QzcKcTX$wfJQn(z<-%5<-OP!^xr#M6@3<9VX$MsY+1OWkzCF+ zewYn;@oK<#3#VNMbrK+uois1DidP9V(Qd$&|5qNq3I8xz*F|MuEe;A-c`la~JeAb} z+Y0>l+CfVrq@0K8ACP=dAkW6R3VcJ_+tQEJq16=ncgVyc6!SF5)uXZ;V+Uotc+Gu zpC*FXByEqNKceUYiSxBc*HZk9k?Unii4;3KyF7$bl$Di_aB-=bnep=R@u9Mf%K~Y6 z?g%(;4@(#A>s~+s$>0)faE$?6TVZ8u!)FE0APf<{1GNq^ z21^hx8#D~Xi@~N0yx(g-k%M`b4B(Cqf}mT`#>2x%WC1#j-;F}XpM9k=1UMc}-Ax3@ zT!Hmf331azWyk$6)GL4ggy`=->pE`H`*K6%0F2l8`DD5~G%Kz2hOg8!sfMGbagUtb zkhsGyiYnyQ|AWp&Ki+;_M*p&N4;o&Z`4K`k1@fA}+>>Yib)9~vwdpCgai}V;uGGEp zn*kjio$FlBQAbBdItvI{9RltWWqZNJEt;86#4*Os!s`RAVs})99Tx|&mB_XcV%Utc z&tnBRuol$d_Z$oJ(3CYV^wOj5?MFO|J0H6Otb0Rd;e_?LHNJ-fE5|`j@hh{T3Xjg1 z80z+=MxSSQW+1)uKXO8vxqisz~A*`)y1KPAj}aLoOrKv>tbz#p*x*+>qx z|1ibq-hZV#OxjIaK7eklc8BJ^==QNBTY3iDe*%(WJaa09v2eM=P5$?sW)j_rn^5e8 zDH4vs9MX~LjA(qwBIzVD4b`U$qJ4Oe2{v3GXh7;Xw!zqa^Z@O~NkGX1w%~8SF~=fGJ2*8`ry3mk8tk08!V@J4@yX{%n;KtARa3URA;YQUKadQ!brvfnlG#{5OL z!?$BDTsEAXnD{Z*i(6iHo-ANFvVJ_F;n}(H*BO&8x|^2u=io!6hYT2CaVYIDf^==561xB-;ZJhhh3M3}R$G`h}SE`lEn zre>8FWZ!_zut+KEGAxRRjd)lwAfznse*OnpfF!_CG!D8fIFYsJ#dL@^;8{MfHtT?M zgmqZg!Wc!Im1?1(U+Nk;UWt2Dt!>x}7HffhyGFRpvWqn;A39Z&>MTrW8;as2ZJ))* zb0j4tbyg-`Hh_QjR$``nxS4(xzF@TYVjbG(CXf>2;YFa0_-N4_* zzWlZ3;>Xk0UlLKzo-jYDVh;Q8r1#A{0HQ&pr`n~Wy?^8818DP*3Bo#PCJ^z`e1V{- zV|Hh5!>0M$aAd_xJ7L5>HEc=Ww^57 zFGho<3g#PT1WV9j5QUQbI?7P*r|AXbR&Pce??4p2= z@7B~F^)uX2cbsoHV~PnlQ8QCBk>>-30&nqr9qRs|YVSEk_vv)7whCYWHitj?goDvD za@OUlcBJ$k;g*t8+wv*mkQZ{PJm^#}w5z%0b64RLpArO%Ql%k72toZlnkC!RowIinE$BzPedK<<#db$$wrv?RKl6rxx#jv@p;zWy@b2;$J=C z>wJaIpO$ToPUHA!+)*$A82*;*dB@O#y&_7Uopc!#|H*(K5Q0_BO9( zFAl4l_dCZ>Dk0H+Ut?#5(@s?fV$gOInl2}E312!4x0D9|wIa^TS8IUDrQz9PsV84z z2v6?i5cR}W&Pr_go1`Dp_df4z&uX8Lu=@rdtuZ;x5P)g`s1-3AqCAV%Qeh+Oim<_29lG$Lnv4L$raW-44<+le-Fjf31$&@+F%5+}dJ%;|@)LK$h2Piq+6K7h$~{ z9eZum;6j0wpUsSYTf;+%yEx01yRps6@G-J}S~?`e1cJyf%2)H$y`YSy0F4yRJLGAE z;Q~mxO)ddZ4oWWaFvptTD@`$vq=oCy;0O*wMlKr|7#{C&AW8h+R<1@7cyGW$bqW?Y zf-L^qLCMhsBSe<_&*}yyrj7-K=P$iNX!jL7qS*v7Yrksdr;rCzPgGQa)#5MeYf|ew z23F@Bi*;FV!S_VD*L1*q6wrxdGkLmrI)3;+uvFc|%+Mey*!$Jj;_FUby>ibmKK$Go zr*}uFu`e#p7s%K2+rJyScqrB1($K>$4NmX1`S#4(1~U+dVLD9B3)`otO+w+J;=H~2 z?tG2WeekIkJxmH13fY#g8!S8VcTa#c_`TF~;_y>*mD1}<{%Wf2d($GS3_FWF{4JX&v->QbYmB&M=Qd$p|4nh1B#NT7! zO6KFd`ZwdL)xX1`!*#FlCWXXjYS=C%j9vIj{lS3ctfb+)v>@l;>u2j342zm=0$rVg z;1>kmuC);@8!@m_Q8Si`s2eY)^IC!zuHE<1Ox=6 zs|;d9Kt<^gmENWI;yB8TsAv%BprRnXhE9SaVx&ZAp+|ubS}37}kc9ke0gifR-t)ij zcg}bI|Lp4m!p`1nuf5h&?&p4V zN(YbG5t{GzU>ZXpT_E>^_OG!yH=^6|MIyhO015ie=7-mZU-yZC(gomd!E0UM%b*1< zk}9KEuG>yN+zuf4ZLp;IWMZW}zmd@9OV{Ws*A4W^^LHDrv3azKr+cZnocptNpW47$ zkpO-lgCQM!jXgAj1(p}SbjK|pYz!D|pOof}mvh1M zF~j0qu-x=@-^ac>351`+*!M17An$}|j8$#=&<=`aJTfLVk5C-!eV9siEG1)(#fQmM ztxvGF$+B`GMmDa)8ugrW5|$C2+;I!6^#)etM)Xzsz(gJbNL1m)NGq^@q~M-fP~h`B zc-I)9@4yTuRJbl0aZX^5|I&XrFEYI6 zAn_icSKL9_)Ma{8=}Dl^BGZg*ycs>E3|j>1Q`6bQ*xH`|W=?o3%0RuaHoR zSEw6pPD-Bp?v0HsBnhYWv4OR(& z7i8Ig{N%dxCl)C2vnTwfpQLVsNdeE9yYzu23<{L=0Kfo?U=6hpVv215&UEDt_(<(J zrQ!qjuPwdl!-Qr96v@08xEKwF1we`cYR@g@rZG>jj{UvmvXx>AE-J8gph5_oz5ZNC zsXu1U!wUnx>E!|vzDZ}`{cmS}ja`S3@5T%K{uVVUeQ!5)uf=|FH#?CbFL8iyvIgEB zR40P9#6>`5HlU-ZBaVQ#c~KMJc8j6r@!ds@W4YE33+=$;oQ~rX=gm+^vySf6f+pE> z>$RIesZ~;tsl)gU?R99swh-G5-g`jN7%&pW_7`{n&7SX|>6PqF$ddAp{v$y8WESBu zwy(3)E~f9g#aM{+Q2drUYgxGdr7c$ZkM5;2;H+>^@bzvs@%Ah5+};Z}MHie{l(*q1 zSjjlML)!d@GbJDF>9YMOv~1xe&%=!`+n6H>U`0n;dTygrzUt2u%VHzX zABlQmtzaeYD=1Jj3u_o43e4V&s@QORv*m)rICmH*eXuGinC8LP{#thhmJ%TV83~^u z25=Bz4PKlEC-NS6+!4G!>T<%yZW?=-YL?Ssvi@Y&ykbI=*GNCIK~@bszW^{kSceK0 z2!Xkk1uqKCVgn_NFLBMaId-wZuXGN?4+bicy&!}I2>rv$^x)A@KVTMqdoiufxhf5# z2jhZk2La^t@QQ|Wege)pC@Ox1-eR&Nz8CcqPVAMW|1q;qeM@HL{6i67Va(TkU~wk+ z!bD!-&hg=aO*OGIFL@h|f<+ZihRGf{R-Aw)Z+Q5U=%jzZq|p zrmfZly#@2@|0vk*(|4~Z;rFBC&Sz4}uAMjl!tclJ6c7U>ZyeDSAk}ZKj!d>tnFcjS z0P^#K_gk%p`4muy308)`^mM5j!~&oyyB3rhY5uWZa(nUaURHP8Mz9uQx}YL>yb=&d zKZ2FnOThAIOs8>!sHh1cN-f=p>&R&IE`{+eyUrkH0paL$wJ=Zi7;24Z{0&pV_cAd( zXDXE#$^%PhiURcqw0Z(RST?Pyu>Y(JMF)_?U=>n~scWOc)iOZ@3t+7J`1Uq>Vu|3T zM%}7}R#0dFj{gxXi{(2oxC1(qbw%KfrLYRa`qf6zjl$acDNx2xHVdG3Ctx;T3He_X z$u7rZr;GYVenr_EsMlXsW7oA^tk_5uy?T`l1I$my!2AITaE2>s}Gj!VXgog2XRc2hZRA3IlbWc)OU=E$`Iqyvz z`t3>zzRav%vGRU-#hW*8?o@gQrKuguQDx5tPBt4gGaZwIG>u*<_7Ll0IQ6^fQ6jBE ziI3b%@9A4vS@~;-Z(*MGCuI@aiktEh>Fq35a;4dwSoV;CzHM*LpxjhsqzH17RcEow zcYF~x9l_2SJ;twixEWlMB0&k3H$wU9g6p~5{dq9WCC@U@z{PFi@#3lUt$QqmMwjmH zx5^s_zOz3Op3GpIx60&%G)fp|A0YaJ&L33?kJ!T>L*TR%EoRf|^OwpUmH80PiQT0- zr}i569!T8L7kNroC)upTG3lkI-doacR0H^tAOwy)5I1d9nOW3-sQH!>%zmm`ZSN4G zPWJ7p)Xo#ZlVi-w-b~iTpggWLGncd&)VVH(*`U)d)uG?yJF3!5O#_?2A+c^K_e;r^ z#Ygp}P2=Hb^w5LyA~Ua}u1#}1X=L!ZwLDixDA42la>t@+h)Q*=9$F5kI^n_*Vl_V( zpj3QFeaAI?AzhDbqXBrucb|q8J4oP+NzVL356WnFclX|)w_zgqB)5_N^Lxh=Y0Q=# zetNfEulQ;_>Qyg|?f36_nq^E+>hJi3Kp>p?l{G z^a;yi<|Ui=%muGsUE_(Jov~fB!_SE7YMx`1TcXHiyWu;ulKAhMb-l&$d~W3jk?z6% z^Hw^y&-vyB2Z$kuRb_oKv*-6tJ+|UWGb6e-S$e*5*Cf`ednC0cwdgZOg2%Z5+9i za`b0k-KzbyrxN3DMvO&?)CaLfXbb6T$0UUrejHooF3=Vd9U=8&+yhFm9FoS=P`$rh zUoE3cMnTZ7wXQRb-6w17Tr^vLweGfgK%EVFTd@)Gxu=Ct8QoX1IkXkqZw#c}j#v1B zu=z6EkQAk%zHA&4)EC*3g_^oku`m|&=@}uNGAR%7WudFC{-SbHo#spWyCH_evtDNLfuc%i;v}-3cVbWP~TDKD^-0As#zA- zFfcxep$of^=mght$zVR?d0!)gY6@VvZiOzt_PEBZ%Hsq=)i4ji-((OyaUBy=*Av_- zut8GsjxOfOXXDL!ol``reUa)+F2Ot?XC3V)`l9I3XeXi5%QGGxgLj^V(uY#}f=W!I zmY(CA^2P{r$@YdO8RByBhxw+Y`tvKab znWd$fSprZ?k5V!-oh_y<7-B7yJbMkj&%Ado9<@A{yw`j20Xb}TPig5Armvl6%C&_t zKNUR%>>t@_K$n=qr?U9oa9quE@pqcM3+SOSY3Tjwq4&lrF?a1RQ8mP;7-w51E$TR` zmVQS}l%@S$>QqPydrF9gJErD0^YKpwSNiVc@UsRGo!7FB3-(p>vW_zbhTosi^dP=g zdADB{=K5|@`s4H~$Hp`@C>VdNj}00cWSg0b zxHvnXrO>J7*s|`q__T;3C^}+#SWJ7cU@)t|r0j*dCeK#9q}7|@8b0Cs&&uAaEIu2! zIt@(7@FN+k*-F&ernuUO>E@d;7Kte&Pha%Vc5T4~aa;C5?j>Qdhlh-t<8>*gWR$;`RKQ-g9SR_|^Vb=(Zw zdD9VkceW z@3@4Srx|5NC?7ms%Bdi!ox8DmVHDoG%KE+C*hO{OaQYxevAH$bQ{Ma?^ zu8*9?#HyD9I82S!27*zx@q_VGk!K3W)Lx)Wy*4^+I>I;kAdz)K@h&$4QFTehE#Z!; zb35X)0Y$u2)qKldEzeeg9VuEdQqox8V_B$eR~Jlng!x`=u2LeupQLkU-z6TIkR#V; z*zro|`La9rkY=#=7>gfrn%y=X7O$)6(T%T=wxcLKaIeY9kN(9uv}VIH{*GU(BBrEg+Rifby1J z+G~kD7r?3+e0QA$r~aO>pLux$X{QkfCsKE_okW`Lp*iUtbG27m3>e4|Cj&|BaV&kM z6&fOzbf$@0l_TeQO4)ZTQB%EJW6*Wc-9H4!X4<&d4nSKkClvo6l~k_qM`4pcF@e6xiZa6X zPnT|H^te)miv_^$41@Hxwzi?FJk-Mm>GC5QNkzX-tE;-NuLC#TG; zTr5bHW@u}og^wg5fiuK1tklmNJqGmPaxhx6hxPVJLGGQ<22;%V{kE-#Ov@DS-YW1i zr1iQ*C`>u;wluj=m9Ar#vwQyO+{{2VJ%amkZEG8nQGBJ=%>3~L5CD(*KBqT#T<7Oe zY??{acc|lRZyY?Gb-O}8?716a5=IBJsV(8)p?2g10+HhcGbZFha~6KiEds8!(Ld-!ZuQI~k5~qP#~y8AkwdA$^rrou zl&a@c`E{{TLo^+!##T2Plhbr`U2@b=t9bH5k#g6$7c`P25Gom@M~4!M&=;Ar>Bv-- zi$_Q(mo1Q`GfFQ4XOx^0?rD{N+GDqa`$kR>raStQKD%Xr`CA%d_CcU%I#s%6%W)g% zSE2kMWe~H#ceRbB;??MV%#wv!LLfitq2kT^q>&HxLXsM!;l7@SDZb;~k`~HD8(_j3 z;}pfA(m`~Mlh7c)j*8mB9jIu55~O7eCb(4UP%1?5_f#fgx8K`S@kYD#aa&d>Unr-T zRBSpGe-BuDM2DhManp^xyWOIHkQ;xtkP`9XNJ&>-tR*AzX;UR?-=5Mm)NW~21KHa1sG{1sKwu5aVDMe$f6o*jg@-Wm~zUou}%?u6;VYT`yo7l z?jVzAkYT{MI%=>vS+7O)DD(Y9xY^$N*Z9&j;`q;FN_jkqhQ5vUks+;vCcXK`G;owj z7HiWw;M?Ju$|N+O4u3N=snq{v|XIkJrL}= z8xsgd(~z5la1OfHE1@(#Z(FMqBd!r!GVHD4@&0EdnwiEbY$tDxFkY6iJI&**F#5E zFAL51($HYlyu5=RXDY{$2?fV{ zmdfz&sh)4j?JxmP3NaDSbfHr|WfAC|Mp)E@zPRXPQ^L)N1k0k_TPl8(;1 zF-u8~o37ERv!4uO6mOP57r#GJt$UyKK&O0b1fce^dp<1}Ovsn}1FET}Cs?Z6;H!kU5Ty^ZZUL8rR(wq9o0C#j>^#c3& zz1`=w?4ykzqz_pMYd9vAcmwo@ba8RXWqv9PDt5~|oQaAh@G`7jah{h1?!#-K_ldCI z_9_7qfxzG60FX5}I)Z^>5NBmsv*M3bj))^m+3T%8IBBtO1n%g238cw>kDwEJ8;=++ zE~QtYbmXM!(#xSmOT253QDsF*X^;&q$|S2oddlRCI{gH<1J^l!&N6ji_flM~_R;a< ztW&6Cqq7h&KtwMel2@U?UYLsEV)HeDL9(F-)8A?d+-dCEzbwy3@IQu9XWpTCPwdGR zY8}9Y3kKOs0gOk(^re0DC>&GvYAsBwnH`f7WaPl;^RW5Fl*nM(?=VzuE!8Jgv1kp9 zPm+q!c}>EeuQN|%;g-mG4Kt#pWd zGwW1^{Xoq6<2~KpF&4A0vo+)sN}1R|z$V4}X_r^Jq2+Hy7?m#75h=-`x$Q(%T4$DT z6qu>QDJi~JQ$qVyfIJ=a-4>Dx0Yh!eluK&OCEyD^00!{lFY;#IU&hhbab+JGwZ0+$ntW57` zz0dU52ozz^T=9>n5u^L>sfxiM7eJ>*m+f!JQ8(^Ma|CDR4D^QwHcOvI2aT0IajJeY zL0tqvnCB$%lp(7O8rS4NtYXBNz_57Kq$B^u$q!CAh{&|&Hy06^^pJ)gDetj|NZ;P5 z$OURNGgM8KR6aLAlbNV$$b}Rapl5tsv7<|@`qDgmpXNz+9btC#gf``)=K7)GjT$Zs zzN82BLHm%<2r_0-w10t#QCDlYVaS<&lps40k&Yv? z?^Z6?k9vRPDZF+*7)m7njr%D|LBHHnX1(Rl8}CVXWB5DW_&r6z+0WmMJCb1?K_qr` z4CnsgJ2WyF2?ZVV)Kl)9X|#`^Mm&XClF^>TIjB`xP3RXA|xJJ^$?lo&Vg z2lMnb*g>+6rm_>7cwRFB!P_{$?l=gjws2T~FoxIJQBVYS!1DCRDNkn3U_(ziEnddW ziIbx=H7-DgU<@*$B1*%Z*K>R%Ln<8|9cjWb77sq9Xvo-w_#5jnUO6Z&-mjGn?9hbd zkjX{dkrZWDd!N9F&~$ldDTA1|vpkl&>{gK7%kaIAusm}*0FGmQ$)Uq9xPrmEIZ7HAKVH8{5s0$2{m-LWR``6jV|hbFWY#g_qZvd7z3cRG-}XN?Ld_n3>SPx=< zNN+SwrEA=`QV;QpAVXnYUi6#UJjc%3>WHlX;iYWEGV3gMzE4MP-j^PeC%~udbD0;i zLiAujka_~BARGK+fz^*F%;$hz|9)1e5L1y+I zh&7z6180mGS7|M+_z3+S`>jOkI8}zr`%RXeF%o@M)lPXs7M0>=R72K3crFjh0}>EM zyBbyGH2x>8z{*(zaf!0ND{vsxn-eT470|CiRU}h{$NI#P?lTy`_(EASm$UVXAVO?x z7s^hY18zHL;DwdhZ!V@qOCw#H>VVh>FRx(q8KQ_g`jgcM`Nnq?t4(~=gf`O-guVbx zmeq|AiILSZ$npJFMi;>RPR0fK2F#BqohMo*0cyxJ+mj+ac?O-hRDMPBk%jv_$Em10 ze(&O^0TTX|)_mN;$724e*+hR&55Q`GfqJ=fb0G+9Gy4ihvgd9%;5RZwK`h8wT-e!l zr9R1nAu3>dp8X0kisX6v}7C6BFs?jZ&pHZUJXUQ01lcebk2LhD!F;u<)M*$Sh6A6=8gVz9*0WojZ!usPCGP z(1=3c`4Z1gCYfPn8TjmhGV}oRIwANy6v`aHg*BG#38`uxPXWvVKk=SfAp3XeWb7Ng zCJ-9#^6ytP122Gb=_qOPR=cP7T#xaRObXRu=450b0k47iac`h*Jui5V0w7jzTc)f> zbZ96Q--QlYuCOsLTXCZTS>wwQ$FX-gAy740OAR-`4tFxs7IK~BrjJUE(f&@!Wj z45y-bRrph*5&5HKUPGm_AuYc_x_yC4RN?s7T^a@U8SsVjP%a>305eH@PT+H!pBJ$7 zabI3sv?>Q@wPds%Oixx)9Te9+ec}6OMtt+jixtApjd1^p3r?S{2tm=>nYS6Lr_nxO6hr{XFp5N0?x>DczPRzP=Hav z*3p16OM+g$6(v<3uHWnK1^qcB1OT72E4UWpVu=D?=H1K1m*QLTL=N@WM2`XdXlH?y zQ1HZuz3S6%J^D^IA`)`VT+2m~9wYTCVNM7>+L;1jUt#?6TijG0gp$5|*&MLe=GA&OekgRRO* zqm~TUGKFKE+^R&U`f|pV+dY^`^t6Hk861boE_Zt;?Ku**-{Ye;Ux$hJzoOE}=)2x;9{&@ocH1spP zB&$I+A!w=u1yIYvaNOe9%CKU;xUjT3jX10nr^$Zk!pz^nr$i-N^S4xX)K!Tc8hZU^s7wGDVveUKO<=+ z+P}epg6R&W!QLW>$so0zAUOqi;?lcG?;Ri8g9A-irFBr&l*+1>3T0B`!)*g6TZ^jl z(teoP(^|-E4q0HQOqaCsfuSOj0vVjO?&9aIiXMkx&FI+JYX_#sEc1CuiGnb5@jRomJ~F^eegQCQOG59L zNZWy-aO(ASaiN-`daM^-4K0+{&Dz;6A4ax-%EP&dE;%qu&Od(bCbQIa_{JWzxtdVN z`r}78qbpHUUIn`K*2XE%n0oEGo4^UTc^e^d2J<99Eq3zl*1&umrLn#CnEuY7w+g=n zi8v3yBDnhCdWw0{$rQ-imO(P;|Zt3ynQ1MUBZ#~&~v7MiKrx{T*Y}dP0 zBc#6P$Ce*_Nlnir9scg6&Y=b2^mCcDTdBJs{+N zN1^Ma2q#C~O6h%?hDjPs3+O1BxQpokn0B&f@?B`3pG(NXtjfC+v@|;TV+cy}A z;R{rBlt!!<>F076SJ_bHpNI{_iA}ZdjG_XUFZQY?i z8=pN7YThJZ?goCQ8r@ft=i}|>%6K;J$ctI~s8xml)&RZ`+96V+ltw(8B zm)=&RYw4ZW#@BT^FIH_Fe`9y`vegVr0?)T>s;c2cbTrbGc+;n>E}k6Fvfe+mZ)2^x z0j~sf!-`29+lCka2rWe*#$Vowuj@N%pbQ2LQDxQVd!~5`)f>caBt^ONxh*Q9+#37+ z1{ZT1gwCMn#@Z#)lLH*}l*kVqV>SSiCZW^6$9m`rK2}2{Qc(n?cl0$^L*pnma5aYB@%FNJ(%z9LGk3Oj$lOvh2dof z9R5zY?NDT-#v_P&Z!iTP(x>K^F_Y;IDB_)6NhpqwBYKD?flE*cbvHs6@2+uGPKLS9 ziQ>U~yZjo(TRl^fn>v)PblRas(o+IVmw*>;XNQoh@@zq-1(OR1s+?_Cfg?d&zFRUH zo9KDYV^$O2h|8^DEUn}ufM6!v>)IUEL*XYhDBcrR*=MxO{M|7IoKj=fRv@;^{W2|q zfp_tYV(6eh@QKya&-nCUyW2$@jKnnJF11CAtmFjp7geFH+LKAr5B&*x^ym9=?T26Y zwrTmVBnXhQf!&S#*ZUM9nkNJ6?pl%qGn9m(N;7Aty4yRI92W6V;#Ud_JOIOG184)e zVIJaYK|@j5754za#p}R8ktXDkEg-WG(m+F|HyZUN{VKYaZ3zicpk`tRWnk;i!=eO9 z{DT{j%^+BfrdWVdgHen=;Vf_=4U_`F$U^MG&v9{|WRFUlO#suMd^n{QRt0RrW&!)m zJJ-ks$14ZawdgHhmMznkQCqP9wBABTqmmgjhU16%%!4&mvn5(|rzDvBRtVwomR28h zX_YalP%U>qC3CFvol%yN0U*5Pf(^nLK>k}71fV~^JXj106cX9?@GI^Om@Rf`Yx5C&8V<+^nk1xPJMViqRu_tCy-14bm@wUw;U=DoJ7RuG8g*AZMIW zR{`_SATO2|>-I_>6@39r(_$e`777zW#zI{)(%KL6Z6w=eE?^u6e z%utc=fs>Hbb>98857hddF-nPA2^EQMk|5#A?I5aU?{6%8!yZgTzI!DF8`yCD<4WB} z3y^n4=g-`a+MWN2LFL9Z^p*Bq>hA#9KY6mRf&y6&K-uSF zdfWlO2-LmRA${Lj7D!P!eW3b#7lm@pDf#t+Zgshb3qoqvrZLj>EjZgUnFRQ#I5jst z=wLiRz?tA;HMf;0hQuzBi!zzFxDom1J#<76HMWldr49&bxlQ{J)Azhd86*2Jvn6$N zW#L&QEk~=1xTCw+A2SiNABD6^omMg|y889;)~~PE+2Nio9zM48a$jSW`e9Vuouu+Z zHC1*Qi_Rds0u(sy>W2ZXCglw<-vrIrsbqQ+W_^&E=QZ4ocwKsLx?P1=t_~WIB-N^+ z^OLXLdbL5QsJBN!6-leF7nUGQ0jvj4>SeZ~9&tD7_E$FKBGCYfkS@?iFi@@d>05Xi zZ8ON*u8mn!ls3Xv9kh7}**76agZk0|jxQ4CP_s^3fLXWnTCqeQB>}bN(R>2m#3w4p zsmP3I1K_K~8ATma2r3c~D8);@5TxPFC>3hk!9iC++#8pBAXJB$>IepmjzVpl-+ngE&<+>bxIGV?i%<0J zP?8+Z39&RJ5r8F61n^P^rhMNd0dFg7K;-90OB52njKvE)bko$ z5Djvx7SBLp?pE-Dt}Ek?Mx|Fw8IB%=6!hrk+oMUPx_TOqH^>5`o$vp(!^+z{UtXl#O>xKTyI%cr~(xq5Oa=qGEeTMO=luJrz~!}c6`?e4ogT`ML;jrZjY`w z4gM>`XNXkZKSYsu609wg$>~8Va-;a$Ejnxjw-$ zh6hn|>df!E;5_&OP+iybUd7GqY-C_r+4%r+R(q~qnv9)YxR) zvobi8FpX!3HT6ox2D{2s183@+GpTZ^QWhMoaC9Y2Q^HbZ&&`f6ERiLm3gjXPPmtSw zU)Z$+Ok~qbnA(N@FMnIQEhxt^DY&Y&R_F>DFeJK2o8^=+QAt{6%Rc5jL82{rLVkkb zG33UoINSBr4gv>J(dD$vWY~n_ z1(P*$p<1`z(P;hgI+yt+n@8)UjVk}4U`NP%;j<2L@$HGeh-vp$$|y*czZ{CrE5R;< z0Hb~n`h4r{kDeF2EY)2?Q%(Sh>|CjN*)kGp&o7m!pBGZy`lQ%f8RtfUg+nW~kzHwA zz3xQLF<5{Fqz&?c>9b59*8&c#wW)#yIMGD6%u>h%0S*S%cey!`U=j;pF#t#ahvWlv z&rszg?h+7O3Eu)e$hYP+H4B4#4UcyefHzx{mJZbDE|I8uUv-xLbpH$rb()uyI?`E{ zkqIe`qOva4gBA9IZPlQN^u4W5h??NsKo&kiBFYz&=cDC(Z@DUav7FM;p8I{+ra#Tx z4lXjVf!dr&JX1y747*HulWiBZE7WA3;ki<#QXvh^;;1srjjeG=^?Jh5Y6}Fh)gr*aXOu)K-XvLVnP1c7SPTjs} z7UN0%yPmOPgY?7Ms94apQ?Tx8-odkL2)M!(`T>k=3rOgd1n2;5IO{yq?UYw-NZr?w zMtY(xj&$AQYt`TSJhz(+2KZ@2^5Kx=7SXQeAEopA%^5KR6eAyG$<#TjBf@^a1WMO6 zH7M&|saR+DD^28AvFuL`LKw2^v?F5Mhhmu1@8862L&JwyY-R(6A${^B!p2pnk<=Z=|QwbngZT&dKkGQPXd9JAJ z!b)&f9Jd-h&%KavtxCp;>|$T0b@e0rDq$iZJ4n8qqOWC_{cI%Odx^_ch^NzeZ?T03 z9X<5vxt4fu68pQ$YX0svG*Ig5?-Iym8>V|M#UhGtB9Z0pP8;V)D9b6r%-FS*XLd2q zQdKm7K!$B%Fw}hQfR{s}qtw}5jxpSb8nK$^hoQ7~o2OVrT$_^T1Guz&gKTJ~c1xBH zMk3H|cZ_({F#o3sk>;@Ok-w104 zXv|T*AtEj*UIfB%X!F~pHUp>r@ zmSBzZ6*qJJE%haA6p??z|6@P!6+V47#J0BI;}D2*O3M|nKbNZ=Nm9FdX`&`;{ zlM^_GXBohOv>JT>#NtCR^zFa~zet!GKCh(J z;^pi69&SZQI(O-X_j(^4GgBm!aPF=?oglRq19rmf53G{m>*2zQMN#<@!;PGmFvJZ#o`l?=!dAYf_$ZNb7h0$h zh_N~kw8=j@W0;o~oyTwS#4W|_ ztfKebNvr{ez>jcNcCGLaLJ#E;R1-iZ{|U4@tJ}E~tE1+8WNE_m`uZFeXZ>|^EK#kRvJeL{9Ybq> z+A~Y_j2KOGec$JsxnKg6rM1vT+NM7>5)&Ibm6v8%d33Flh(o`uqROqNK+=xSC*nUxY4MQXklow@iv;+&hJi_ONokh`MS7UX ze;^cs8y;0Z^p8~U7%K!*K{3KD>tb}Ey29=8cfWyfA7BsrVz-zrlW~b{l@P#f*r&l} zRk&G^v$O;#V2)dLEs`szE>csu!}4CO7~wb8|HLOje2bIr@&kT);W&aO`BXA!AU5m}wc zQyCdIXiy_3>p^rSLXdPSpQJ@=UGty2p+z4S+10xrB;K`r?GTsQ#w8QaRaFBgO^FU9 zZ1A$(8_jkpkmG&4WC`jMch=l;`9vF_R0e(E12>%iBs0TjWs0VK0I#Fu!m*}R4Jqo2 zc#cPC(*>jYO7wk#j0%V9tjAcxdAmBqM}dlE@q{%I!0lI!DoYsUHo8Pjz5T?!WK?Mm zw0~@*%4Wv%WdmL!PfYOpqfahH;*42AB#45*<-+8DSY_!_JFphAWp*ur6zhS+p*WmC z-=hR&Dd_S%UJD^fedv4Go!nuWe#2ci8E?6Q6PlQP+^wzY^pLJht9n`$ubIyapA67o zyFsbVg&uVW^ElR2i#5k3%VL|epQUj@rWvDIkknNI4nf$%68q>)}Bm-KHd|?06CiucdH$P0BC$^q2U}b;)N)N25i&w{C^* z5QLU8DQ;W}`-S@zOr||#OJ(Agf@tA5@j$G^XtzvPfhH#F#+aXvzieK?qTBw1uNuU? zGkh+=cC&A;S{(Qp;cUPD5&BIue!H}&G&Wwfs@M;KpEMIqnM`!<%I%JZhvf6G_5*$f zlk8Bc^})u6k%c#q77ew0)EHQ>L7{foo}PowH528qa-SK558$@JV-@V-i8V{~0Y^nc zuOqU63xiwsheuSjTK^^0d%YRm?W?=w9Jml+&4Ra6^s6pX&s?58kE>cV>B0J~d^?>s zrt`cl=1jX3z_W1c_ygQQO+TiNP<|Jmm3OIfcc*HjxhaeFUSU->Ru2Qy#SMGF#0p(? z^%ITj{psx%m(g}2I)fm-*-|Ramz3GPlPmv^EGPTZ7Mhx$4IVtXbE55HC77zr9;~Lv znV6yQ%@LQ$^8~T4M_0FgyYx;$!XC?mX-v12iS7d6@jqV}{B=1FY~4>tpPtMO7xjWc zU1K|dYjxcAdr}UGs*x1_d~#GbC>8Q2OMO~7Fzd5AP3($8m&vX*DQ$U zbB&rXNN59D5&5sqJHF>1KnINbz8%nM-u9R?NOZ-mTVFgfm^l*%BkE@dz1BvUZp2rz zu(I>q`LAYsWzTV~jWTNk|M}88FByDk%FlB}CfDx0BTjDxOng4{J%6&XA?vXB3m@Q~ z#*@CeT=7j`3~IjWQ#44hWV_{IAE_<`{O(WB$+Xyts0k1UL-J*Fxzga1^=pLZo-B*4 z`B+Jlf-y#}Ao%>vf%)5BNJn2l9lBHrPwmg-E|CmThccZIe#;2mBOpNVB^?3+jFI>b zVLauSxx&$WzJ_z*f}auXlM7mdwI3=|XahR5yJF;>>DW2ySlF2WfUrSKmJ%b%w_F`- z)T6$uEu%Y{3vuylbwVJDpYQiM%a22=uE9;`C1u~!dSe&9j{_XA=IYow7mn=)RSavB zalFMfVo1(g>pmkR2F+n>7mk4OSXUg~S9*rGvt*>A-!%e^58|BsHxu)|qub>{n~RC6 zdX-Bdt9__0x;^*y{6|i5fGnpCV}@zC96a(~k7$DkYv1to^wlht*i;U@6mx4Ub$y2m z9qgURXZx%`t`3QmRef6^bsraXke&3rdyN? z%&q9_uZ7^;mA}HDj;ysH8}_3n0VwkeAL#OG%&xUI4HkKj-_hn!DgFusHO|RZlnOdM ze)C%?-C4YLZOLKM3IqiOq8)oynF`o0*upji*mop47u4~CW0s3lvS7%Pt@!00_FVrO zICZ?#Rg5Hn$hG6@@~=46s8#R?Z|Uc6Z|Ud12NPlQCs(l2>cxS}Jt-6~FHY?#b@T3e z7cJr0Go+Gfu@Ce>;7bqSu{%8)^j#ak5yY~fm#AdCCjobkD$9j<+_b92`S{HLVD2u< z6@Z)f_gm=2d-D3IjB|w*-V=rd2>yiK{_9X?rgg7_M;tfH_^j@0CnSi%WZT!<-<|(uF4vCyd?yMf zAo2ld!!hPdBl%scG2>T_{>@zcIhWwDudERGFTeS}G?(zQ3g7*QZjG-7Qt-RA?eiUc z{{QdQ;{WrZ%vcK%U^oANtC#;&uf7cK7Yp;=@M~udj;OIk{#Ptan66=P#>1rx8J{@| zcu{Ac{}p=qPxb1{z&(EY`A&+Xzc$O@hE&OC z@=pu%KjSUZ*K8~t#p&U%WjtH%-?Op*ZT|9K(#!t|6Zh3rU@x9Q1CsF~U>iXtTYV6A z#W5i+TRq*r!WhHhTiyP>$m(&y17{(nmAg@3BUQ3ug!e?8MT!<0n|zEF}m{&ZmYV!3b~!z(t3SE^^`v? zvJB|1M~Y&I5GGGKO;Xp@7g*5PIEqhWmlgc zubR9aEg=^;xxakcjD(*kkF>6P7u_xevW##;uf}-!+p-);>H;CuMA}@a1t+zN*@uzr zsAMLiqEm!f54al$k*chGLm~h-VUG5@UpT?&j_@$U$-)=3R_;DgwncT>Q;FK>2}i`U zJC0)gaVDkVu2ua;xm60_ocC(D;oP>I5m>tA*xW}E{6pp>q2)Pva@K!r6!$P?ij^!y zrX(pxn_7Seu@IS`I#V^01${ezMtZc5j2D4e!^xcfKwG$Bt70Eol%N(PLMFV?Ne+}! z?Df(S@}Dbk6b8{D+!EFT5QPBn1ez^_aVa&=t)PmcJ|(RY3fMd{MPCi`xZN8Z`FM9p zpKXHqwPqvqjw?fMC>h7Q<9bV@No0z_Wc9cH2j)rA$kt&=@SY$xi_TIlMcyCO_sx~~AWNlB^jb@J}w?QtVcte@u6=6e^G z$|GO-DKMN`nzisV=+$xb5Gz!rh{eL?a?S^YJ~k>M6L8Zf84PUofG} z`q9cRnqJZwGNs6t;8ZeE+A8GyrQOd?x@u?X-Aebn4Itwx<=d|=C0#vt0d38s8hRV` z2aM;?7*Tp}k>b4g{gLXAM7o&lz~^bfOh;i@!&7{%J9h-PY;7Hw+Q(; zLyFtBF$k;yp^mmxTWE&j3`8+XxSaIr&0SiJ{cBELGNl;y)%?TGX67mND>9l6k>0meiI zS;+S3!5A+$ZEkLk!A_SOqI!TWWxNDzJhW(>xS4b6Z4_>3(AJ2aJ>RWHJ1ap3dL=FO z9CjuPN}+T0ydlUNfdCu~wQEjKCpgbzF>JYA9Xb}U*{7}9*VTVlek(|R8~lUDwAvwY z2{wC)uW323<8slnKV4GIsmH)^1!r8O!r~G5Wzsh+5#04JkbHp1`j(l6Efwv5{WWI; zc3ph<4ebZ^eC-Rr}9Q{T)sDEqerx`_~%!mxgeyZ|BY{|4FYo zfB&z+q`yb1|0%EWe=!35E7JTQ!C7ChKEQ{>_vfh4W`ON-(&#^vpM>nM8Mf8KJ171s zxL>CITS6F|VJ!Yvjrl9R{iT7`i~Ngn^MBZoe7n@jWxCJ6EQHS5CBdK0!+$drUx>>+ z*S`*+{vBTH|4jhH?uNarSnWq=?0+`CYkmFK)aw6mc>a|M`<##X3N^2GEvyOsr|qdZ zRdacb@pnGkeQ6C(uiXL=yw=r3_n$kyn2T=&FYNZT(n?hqBJ3_qM18Y;ZP-@7_;0jJ z|7`>KHwNy|8w$v|!c9T!i$z=AgV_0RD8#ou;n1ru&HgJB`EOikt#9DZ|J5P>8_|04 zV~Xc0tmup#`De!JOZWb{OaL$laP2C zE+>0Ta$Gr-CGB$BISIY@j@H_Iqr}|F zg74Fk)}tKO#-I;xYZdtpHnijpW^|x8Hq|PIzy9u)ONMuL$HCChJ9P3Exh>pV`u8Ri z>aB!4NyHg8qc@f4-DjRR&W(7V`WKp7=r4COx8?>xHS*FzQw27-VI|!)w}Du`I=2&N z{*6|?h{I#;zv!{rUwrV$U(>LWe_=KP{(`Ii?#3>ipIif=z@ro{?@@SIxmK$(qOku@ z?6THBwf~2>_YP|+Ti=FpJZE%{gB)KABZwSF6dNESAcQhA9>s`&iimU+0TGfYC80-0 zM;set5D;k=ihvX;p#%uZ0Ma`Fl7L7jgwRXs_bkwH-uL(Z@%`~#*O%*ZbRgL~d#|;g z=YH<{e%7uzv0NIBQy-jO88-Bb)7y_P(*a*ELh5hlE>m^1>n*int-mUmgjc*t_sAFA`kx&Xq`##q6Y|?jz{WwV4i! z`j&=scy7tzwEuqjl2SMHe_a^~T6mC|EJa%4Qq6D(<8URhP2EkF6KoVz=-7s_s8DJA^bY6C^Vg+k-M zCb?AStIrp0v+rT0u$w@Rwy#pKobdc|94V>!J)h4OF)wdeI#*%S`%Gl2pT`>f`j+uC z`)XFu!uZ+%ON+tuPBq$eL6t|U%_*l_RpsmjWB$LbeZo@P%P>PGyb-Yj<1Y{-BNRHI(-e#a^j?8qk1lh z!>f{DmipcQxA%Vg`MrL9q;&dkPy6aMKBg0j#U{puXEiej*MhR9nmm@FH&=-cw|m4gsf z#sB;wk~=ETL>sHs^CUb8_kRYV8?g;NgDceleDucr{L-Jw)Z){}j`jGDrE~@KLJs=; zTkrq;`K8Lv3hUyvnTLrMc>XW$-5Z~24vnClTRHQ{*9=i+dL_R3RT!z*X=a^pg49KN zf7>(i^MJ*EO)Z_@aWz~{O-J{78+g%0(;en!^*w?Kn+dQGpx1NrmD`X0jd=lU#%E@y zI(^=Herd$07Wom-%Om2is9t7zm7ddZa=t6M|3R-vRbcw`^p}X@nDaFN63>Ok!%aWGJsw;RKKRx@jvG= zoHv)_gLOnU*GwGRn)S*oXa-Y|kDDaH@oI-6@Rtx$}Rv44_CWlfoe^NY5&gR|zZcz2} z1yE1?m17*08JwMpSo;7KLExv2D_kXx8(KSj|5BHPzqHuWKYnzPW0;UBdIU%r@?lG^x4p(ijo62X?g~y>Z|7 zsOdmQz_bc1F2~_XL-MI$q35)sB=!wCkJX-q;V||uwdO0YUNA}Zhs|IuChkd%e3vnr zU;UQHchs^K_s_DE%?gdXdGcHHwk}4n>Tx85FlIho- zM9FKEc+DYY+b4$U#-)8Xe<;Rw(4Vmu(mEKo=1m$#)joWmwcpExZdZEV3twp5Iro1a z9n&KbsxKLGdJDRif&{yc2FPPW6oxG`cc+o#^#muUYZPsc29Sg9(sdjg=UDrzU(Tgx z_EJgHeWcuPjV~Jc&gEUM=Y>fYm;)8P`Ejd*d6w1HJXMmjl*c;8Y;l)u>uRZSt-t2w z4Fz768vT0C%qY+FTdw8Ay-qgQp_xxQzwoFdI@V#y$+K0>n&AI!XR8n%`}s{>$aq-H z{6qqyXE5U)+pgEXdP9j#<7!I}4+ZS?$>8c2g#GADDqqhOxbE``lp6On3`(3^xNCqX z4%N52^9EwX>6y`zKi&x9JuUw+Ippp?_mJT_zu9r9-siu(j(8=%0c{w%8@Rq_ah}&r zWTdicXH1kd+Zc!_0U+C{V3 zcQqZoYC_eec*6*qoD}tryMIl+roL2}>I!R(j@bFOLnwa8;HB;%X^yAdDc&B}Jvlay zTjOXst0-af1!fOoPDIUe=PEgt;?omXr8?y@M!U8y51sSZMTzOiw6P}B35Kr>zxhe$ z4OxF&{R(VD_Kno|Rdm~>m_PruNYY6##>@Vp4^Z&wM|9|1~&bQCB4i9z> z$Jd9R7awU9(TBa-9xIyG_bHyL|Kph_+E?K7s|>$VCpc=ix3o}6SK1qSp=okAh+F@m(4}q3UvOd(H)O(h~K`@M_e^@ zX6JF2`8unuO_^lM<-ycD-^=-5fdhooSf*?r9((KI*``zR*RK~sN7k2@Li-h&eF=cEEcRshB+CXJ;-tcspl8EjW7AuA}QG&r9nyAZR&etE5vKr?AY+jer6b81_PLNr!*#)}}@u(cnhDB^eaag0A`9Gez!)5geZO&p6lGbi>@T^GWQror4Y%vMD zb6gv0-Y?}}ZoB&!OWB|KEG$5=Kn=^;^M2iMFXcO@s(hvxe!YnaGuo8?Zq1e#z3@ZV z&l7r!njNK2`QeH3-8VnhyU9Cl*SvJORNT&)p3Ah4>}K35RgUrVd=?#@Kc;bH{&whP zF5d@DA|1HZ<;&$xlVKsyH3m&}N z8fK=(#4q zF}uXmvq^pZDYB;Sj0h?x7iWy!8)G1`S=WslmS0DYO7Qt}I6O_RCHFfnEl<=Y&n_;N`uT`F?Xjg$4JT>-w^>j71nU#5C7!fCu^kH?a6=n^2d1k?6gvP zU%#eWde^7<3_8ENxTr6Gd2J-+E6f$(Y>N6>ds}teH0Q$1DN3*;eJW;$hK3H<7hTT5 z6)t+U-lrbUz@MTByRvqMDebq^-1JH}KR0*ND;I|;hDMl@q3@@V3hK#K!?0{{Y29D1 zE-QT>mAnzng7E`AUBj^zoFr)zrsmkhl;YOr9oJ$K*0R?J^FID~f!T4lugV!hZQz19 zp!;E5OzyW{HrCeJLy4Mxi&I9^X%fCgsc^w^mz(q;(TM3d{qve_ZEn(N*>ulwrrR{k zNNcT0No@`AwS@(JRVeVxKx9-q9@As(8Z3OUzSSW3(^K1PUB|dotAEAHj4;Ueaekwb zYKd@jQ~Bo;i6>0XXI%ZTz>%n+I~^B1Gz#}@6a~NppUWI`(<6mzk0@6!nmu49&3~QO z9xBTK`Ud;Nv17+Vn%vEHzE|}dn=8XpP$G$}#S7;u z@p+^B8MfhQ$#DNO7g1cYz@+7|%0mq)2|fvfDtXRx_YKY1%|2L4N_-4uoht41+I?iY zxR;`&h{0brm@Ji1!s2QD^UL$FtdMx3o*3GI_VHbLHQ9ZhR#E+ihkm>tsaj1BB>Qdf zXUE*JkVY|ltM7*ZYJmrZxKpDsPG|qEUW{)}?Rvcd{R$4;LKF=t9glx&j6I|RzdE8B zLOzH+Yoq;!$;AvjzjdDhk)~xZyDE6`sS2J)#o!ymE$iLVolck}1$&J=jG7dbLY;X2xdjS9G zQ{&&UtzE}{YlV(s!2 ziQth^b(Er^Qwa4dFY`S8uek5digI=Ri7tk||J^}9!f`Nm8JiB6Ql{d6$hTmcQI>kG zn?{9&+PzOv2se>`cFzsQ3X3wus6vF~Q*ZsKC)q^O)ix2dw=7yIUl=dRET2|UQHcte zd6)vz3;t<`7u+0_ae+9EZP`)Af=nzwRL@Q=?X_N`=zXm@B6^FEmwvUj(A?UPUOOCU zfIS4O{GQ*dP{nYiLZ9mQ%UC64>)D*6%&&A!(@M=+hEIa{(Oa6RdAJzv0GhtLO?8yv zUM3e7>MR&sb2uJ<{nCa5ar$28^NplTDUA;Pe#?;QRE(#ooV`pnH8*#lXUzo498c8y zO>1)+4Q<|_B(GGRC-Dv1P>FIjx&hAnBS=N@2)$e>f60{1k0#Ye(j$}#-QE?~l`K{M zc#sWOhCrUIE%8jlGd%;kM8ukM+qs?;=ByCf{VBD?*8!lUYiPrs~70L}>Wl zAG{idkyG43V&Fs}cVhj!5dg1#BjU{!cgrBNBtRTSaO9AL?-x7q3T9uZ-r{MO#u$s+ zQRK-#WngQaEv#q1%@Fo>QvpAGKf*9XaHxi_tb5yEdpU2S!~S@p7=HTz60QuJ{$qUH zY>I+d$Ku?%fp-`>!`UWv&3RIheTpGQ-mUQPS+5rLNnnq%@&NXtKz zE>oSpff&#C)oxG&83@M1V4}SonwYJK=st7R*mA}ghu}6DC(Oj>4f4}6*&hEcfx<*} z0T`Vu&50sT#;IqAQ)->JsMk&~gGiTjcXl+pjx0 z+jo@0B35yi26No~Gd41R@ZtY%RhYVC|8{TSIscd##KcWPY!s+ z8hr0=$$%&T7$W7(oAGP)fe^ok?)Z6;MqIy@(sy%jG?Tia?ZExx+4p{uz6t?Zw6Gb~ zOPtj-&K+F)t-P=fGCdYTRnJ@lDG@G!n~JM9c0Y7wgp(yz9szOgMlggxZelAtFM z&O~XtcM!R+STEvQ%3o?NG`)_?8qeT4w~Z>hblLT~YnOPh_O$$Yz=ZI!r>)@{j<%Bp zMI|b8c0W*vKei5!)8@@Y+Q-3VVrG%i(6RAQ|4U;`pjvZQ>JG9`g@bF?y}`nM8VPT4 zSEt%Vu?O-#P2(>j@43w*L-FDP>)hAu+@z!=mUpX3;dIS@uU5E|q`QSIKs!Ebt0(RT zNU#yerTso|+J?#3>(74>(u==f{flH2z)Tl=Zd=G4Pmyh)d9K%v> z$>2Dg z0vu#kc+N!oACQ~p6y@OtUMiWRn9lPS zH2_+!E0JL_oY}E+1c)LmL0M4jL~`3gqhx%k!&#D(a+IdabV=s=O*gkmgduMHxjXf0 zjJ7A0mGjJu%uKVRM;pbltFpLo-b4Hc8&Ql%Ntcg6aRov~j%B<(LI5_llJMSA%Fjn- z>Yu*|!O!b`B1>k9QICp8W9UC9LHBv=HNNLW?NC!aS1@$2QgZmn=uKWO14c;hUui9XaW{Xnwv&ar_f0kN$ zJ|O#O{rSizRCQoADso%2ctr~no+Oyc-e2Y4PSwquH%I9Q5MirQCf;2;GbLs3nr#y0 zQBnAgt>TJ~=xYIrZOTVEcM`?T+TS#?rRUJRYbv^kE&+kqtDHON^bM?N0xP45m*j(Z z8})SV!%6^Ko^Wg6uAaYr>*UQ8ghA|s7TjgGJu~S4wEo457U`Nq`3J^4W6102N2P7t zC8wnH_twsiwrX5ydj7^LXLoC|nHjIAL?du<61G!x8EJYE zg&|E4B@b6-kmt0O)4iGBfCLx@sH~co8G0uWV1_fKdm8IFBomY;v7S{V-ne%ZK+->y zqWIN&D{_zJt2Io99Y+)ZmeQr+`lUufSkB38@xzu|?@|{Ba(>q zwe~<)6khCM0c5WJt+k=?Mz9D~`?h}VF~plG6d*Xl$ z`Mt3+#r<5~$U)wl>VEVol;aVWC_CEInvOG#HNfRmiCb=2LL763gmMVLazfUb<~5lxU}Tc169b{6*L&yy6wu7Z8oc=X*MPykt%vpZDnn>6-! zbEwV*&ctPqqs=q@0b}s$_=CDHux!3l#>airpIr4Rjp1CXbN3SW8*?v0sX9WW-_CM+ z@jcQrLqxg5S2@Kg!&LWSAaoE&)FF%&GHqQU&29%Ir<8tklDY~c$Ho~%OTp*jm$d6R zP4q;^3!{~z37UF=bt8QWd{XOAmZQfx0E=Dg3R(|A%G6CKw424(ScSnhC8>ANt%ZAj zzws@sLtWN${fpy^FOyn&kHL7V3Z7qtLrd%DE(WA1=qcridV9O$oNHS$9q6zx9-k(K;N76&J6Uhfs4Pf0+Cj z(o_9XyuO-QhvAvqex(5teH)gfBA&Jf>)HCNpTe(I(rI${oT`$QgZ5$FefgCAswOS| zF~L6N1caQYFN-!J5P0ahg9P1nbQg+P1OP3k^a6glQ!JTOs;)AV3q$+{P&VEdh=_g~ zrqX8MgN5QT_nA-T4=bi7shCnWz6+w;{r-ic3z=8)O-Hvm0pP+2^}dsu|A)*0C|A)r z+KPj@y&W)q+1cXXh0|S{R=FQL+7#><>0DKtx5eexi@nFy^nDRCjA*24vY38v?&R?Q zYG0jJ%LeJWY42ZI)sc2sQ`5OC+Zjs<4H|cN9({nE%_br$||%g-T6( z<{~`H`Lx^NPZPKOPrmxr><3KgT2*}jWz+A&8qpf+$Z&`R&WPE^4Vp?>W|Ckcp-BY! zzjw445M$fmJfLZJMg#gr2-(H-11bZ`i})gd!b!!dWl9NZWFg~u20WzBFJxq zAR)k>rZ&vLrNP(?nnzc*-fYv+r9m}v6ep8zkXg#Vy8F}>(SwPC{zq{_uWvecro*^H z9wRNaMtz~NhRL(1LPD$p#|t`|!)4X%vMWUK2R*$h9e*?@$;j{h?e_79KUi&Z-+n>t zsQ&WPU}PP_tZxHh+QeWI=Y+4k?OQhj3q0^-qp50-<+*d4WR9TdL+s-;+Ijv=>A2y; zoCyI;`v5aD4$*{O1<#w;H-Ws2D$7$kWY{A49z72D1PC*{!>r<6pdaXNt1_+?qJ^G^Oaxmsip9c$MuBkL?-VpChK)T}uJ-DWhn*7F#51+r3?uJn@qFF3~Gl z=sd+oAtc&TZmZi=%PxJb={_J>sv*e}`6xpxM9=}x?>`=5>n-^7;{aOw#CNZ$q5w{P z@7T5e*_Y%ZO;i>c1}^dLk0$=74Fa$iU^92weHoadj33m;I(DtY;A%A;#MU&?Ihi*N z>DuJ|SoeZ-?ntvu8h6h#k_z9HCTc5@yk`V{rl(Vx9F5pc#j>5wl9n-!jl9$X+RXzBc9ht zh$lLp*3DrpxFhNw_A|FL$oz4QVm&p`O~AAgOy9xvEP#M@szsOIgr4g3krQf^>KmH7akY?Y=`EuN^wod%s()C+C7DA^zer+F7e6xY7hl&JZKt; z%{!QKO_>sx)%FNXd`dJ%q;k8~g1OsmUd!Fy=+xJ*KivLqW47XeO)yJr6bEHXFg=d}36IQEuij}xtOa6^oeTpHAOdNb%+w*( z%T01rD&9ovomSnFH4Hm_hP?lJP~1WC=I)c3H!o`DeO{JwK)i9vRF47B+k;QbD39=&?c`Q%Ow z$oYCusj!S!Y0-E5 z#U7oH(*;&^)lkvo+x4{|*B~C&xb==5*_$m1UZMwh*r2l^k`jAJa>oxbM8*^}(}C>S z8-ekdyja0$;O9fMLnJR0jZW&^e&xJJ*+J#Sg}@X|WSPP>wHaCiW>H$2SeO_+$Q^Z! zQ?*wVm&$mvT(phcGIWHuxL14IoI*>QE6dko-e98t;i!CV;)xrUViS4bKvG_AZUWRn z%X78I-r3n1Q6Nf7tX;B7Zqg?RW49l_G8gd64R;3*#T zc@Sn{i$ma6p+FZA7ixtZ8>2t$VHnXjrp>$nl!%1$tx%K^tE{9P8SV2g_IhQA&lc9g zE?a-INip9549szbOl|8o7=Fw#uc$~D_O`}Ss^o%CALs?*3Dt<b$;J3$C1#Z@QqEur0nk@< zfNxRQfQ4oGz$Ge|*9$dBBe1Ztnh4SXw)+5T_Y6xCP``)Mkv2Q**3}q|*ZM1Rf@|!wf8n4cw;}5navn8PD8) zAr{I=(D05g$Ok&2S+)Mi_{U|j=`zH>6hHmD(o*By-3E6DYtn`WP~i@+)N&&Ge{#)llsZYWj5W6bPfvu>y3l*^0CW*?fOO&dnk;$wT(%vA$0$nARGTxc#ngyr0= z&8rID14O~*8Ki&ysCQVHumLgX8o*$5rI}@d)~SS@2F4tz+T}!Llh_#W(sqwGHhe@v z>JU)suN}Q7Auzh!8|P?uMfr zU7xA?-s&^6txoZ3ksGl-ND6+Nj#wLDDz*ky{(kJad#lgMldr5IV59$+jWJSECk|r& z`}4Wvs-PobNv5j5I3{k`Wej;{69*}n=p)?Y@5bwd9BsEoH^mP-7~8|JjQHq0cZLg8 zbWw)n;6g*96!jNaP>2ox^z-J#ehDhXSCc$!t_{E58M?2*7zyV4_U{Kt$_28Qf$-Ij z2Xg^7p}GttXyg~LTAB>i)nC(f7K6e+imX7FQqu^)AOC`m`%0qPxCz=sUJ#@X(6BIOtY(XWmX*y~*b#@k5)LL3tBzmTGTtRDNh15M| z(HrZk6o1w(R%h|~En1LQ`=geYmb0vcc49)JwmEadtM2Zt{N(*OL*~T1-RSPQqE{T^ z1v^xQL!fUPfyY>7t$7WrOOs(6h7H?2ct;-pp+eRnW^8N>o<*Zd=eK7RKL z5FN%Y+a3_6LHuh7&H|h^47$JF5ZV1_l+fYYK)v4!JoZ_Tjv6H+QKw3-StAbx+>OnB ziO5(nNu$(rxB9A}%gmmxK$8|029NdL=<7+Uf( zhW@*uZbOVVkN~Hr3eA%SS$oM{ef&kJXBv=#(yAQ%^0f{Y;q2?Kaj{5bOJ=kk?IHU{ zu;)rn3F~x@eMp5^BA$Adi3WGfJJyCEJ}(}-M{j^tip0yqdUIi_nL24}&btnl8~Qsb z(yblpq9F(jHOAAsp36yLDj^^t6Hrm!IH&|%Z$7ePAlZA-K9~EJp5uc&6Hpo!b%{W_ z9f)iss{LdO5<@3)d~o@s8&qy5vc@>|MvSp-=})LjwXTd!z4^THUfk-khAYNZpKx}W z{*H56v1uL?oepq6kpm;r;gANB^6YxQk;-cA=HxN#1JYT?yc6*QP;}$Zl1Oxs5bkPH}`N+bARvU~5q16ySu_v)e3kk2wvd6si zW&LzWV?c-;#xk@oa!=UE`MJaVE)-ItFl-YCG@EAa02#NH8c@1GOCp~5u!vMkpgDJ8 zI}9cF)9H_SMGS&mOz`RKum^X)EqioE+w%c=%{QGJ4;RNINqA9*6{oAtnTb#5Te<_I zoX=gL*7w}C@&BPcW1DSH3>1CN(%W&h<&`Hn-kV3p#sk6{ez{_Y^p^efAm_9U&1JVk zZ=7+dgtIMhJU-zPYnAh;<&Eqpb|*hze<|nA_Td1B8+PX9wbdjoB_2}^AkbjO9sPDQ z2keBzV)|XpoS0p-tAQN;Xq6*K4_H=l<|tvj+clhZPNTY>eQ0foI#!xg)`sYlM z{=TY+u|1YeB@i({lM9bG5S&6@gz-OuVxVA$GCeAEn?^C)WDw*20XAdkoJ!r-8=IOc zqT*v!Zl5DnO-?toP@xhBU~1C=Rn<2ouOig0Vy-z(H#qDfT>rc|L|ODZ`mzT<;K8x` zTYR3L|Cf5>Q}vx2l}*PBTCyuWBTJn4m%=8mAV|e!lu|(Ou5V|A6All>RtP!6d9=|Y zs6rzGhpABiX4b$WM&vyJ-uKh)Mdn73lxbYNyB)+2Pb6ofxQe(tz)WuSv4FEiv-R0smC?-v}&4LYT2%ao#ylkli0{2y?hYY|v!5d@ceR zF=_O+9YS5uE0EB?9#_Qaq0#KBz}T@9>j_|2!5|Vrzt!t8NB}Vp+>+RMtrdpiEdp=4fN)d-2>KdG#({By5keBctifwD5GRm`qASuf z#;I^$&5B`}d3Vi2xq%e+F3$a1her6J3B51YI0L0`m3!sPuteoleB95sz8xG*j&Jz$ z_l>PI67PGt!+S_+OCOZQiS)q${KjIA*3#zUo8$`7I4i3WwMWJ{S9Z>%8ALVIYaPP4c zv}n*V08pV~rRu@<(yk4@OlzRNUiKpM&N5Y+jJs8x$aR3CcNVZE!e~#m5hWgalBWzc z1u~W}ar}BReZxc#q^a)q>qr9m3|OJ+aCmSv2!68J2doy2e%q^Bex8J@b;%8mDG(6K5m$cs06D3^Csu;xbG z+i7L9!R|~6&vvme1vOduZnOZJ4*3{qrE46S#k2PvhWPS?hAKmKb+Uoq)$JFkKhi~9 zUX9%r=)Dk>b6yNe0vZ=QCw_|@>UTA*t6zt&mI$n%#R^80_<8G9yMl!-a(#Au-lMB} zfLstWtY;m0YIGNuhP$zBMFy@?JrjzxFMd_8lIFNDEP=?I0QRsnAuU=e}JV(F2qdt-TUJ9?~s!f<7rz5{^D6+Sq9q`P;=>n;JY~WK4V)N_h!S-*(;HPzI z{?#UbENPTEu}GwJoW2gk8zli`kTX^K`RrH+1KMun9D%=+UiTw&rV=X4Gadmu_VV?s zO;-tEcKHWgwt=2_g#kjx84p6ul6n53cD_C;&jau@3`ic2ktr4M0YwRUG!Xa&_2EO< zoY^LFa-vUBYD(MuR$05EE^05LS;*^TL={}WsZU1J14ku~W$k@mtlb?S3>)#_$*^mv zRl&83_Q6Yodf;;aF6YyFj-nK`5nL8NXe@{Aece<`KdQ|r^U_sGSjbVdVp)dpM{>ZN z;pMicZ?SZiYr^T|ui&nDxkoYKV35Sz&>^Xcmpktup`7}ULXF!DaMnMnp z616j2fQv@U5Sb&}inqt8qGAtastN&csDV=i7iZ*50LxZ=M=og8v8E0Xe2AJJX)y4| zqGju1;}M{=dw5?w+JThVhOLHsfpj_cpMrE$rbA5@&CLfYgs+tTf@3212y|rn+HZQn z9$~{yN{;g@VhfNnz4yXm{fcPK-%EHPwgndfOfz*uccE2CeuHMkETy`q?#K1$hd zy}E%Bxa6J!kBe2RUM-my4d6B}&HNrV(;sd&DC@3$xldA9verObGEZ*F@4dP7agE{A zQqlTTqMe4FJA%F`o41*{?{K+--oBh^!Jmlnn))X>DyKm&kL3(Tl5wq*ul8m5^P`0I zvZYT9A(QI()cvkA_~#iNVP4SLw+x#aXe5Ib{Uve}SlN5lDER)=pgYs{z+kd*y1`Qx z!0~wYii1t-6|(R<^uU%|7uZv=sv6+PM{#s%G^f#9mu$Rh2=dDtJGv^?bK(hoJS+IK z{tJ`Y416D>|EA~z>{!p)<}+{xi>jPNK+d!?@x~{2>M0{aIvgC$l-x(QNRMg+EoS`u zN1|8vqYnbt@<-#jcFPsQT>d6UQ)?rx31ucJj(O1@)*^z7$g2*nYTI&HXl+8LS2TIqD;@5jRRKPua}0JTo=CZxa4%OMH}2R$<8E{Q05xZo|V6TxW7B z<8eN;BKKv*Kx;r0fjh``y);hddq7nm~T(wYABO~S{FGYqZHkOtw zzyo&V0xxLcSx-Y0{q%y;tdG`Z3QKqK#+hm%)1tajIBFz!l-d0!Dsi*6x_7+U zYpk{? zg$R!6qHn9zbwIcWmKtz~-a-bA>9_sIiE`T}GGG-XTp_vr$x1)-uY+J_HVlzAcvCK< z_VHS>qjL&xEKx@el*Q!Uq0${BgyjPKfmDe~_Z>R;6@3cF%R}{B+*I`Y?0A8U^<8+& zjtm={;)$Ts@v4!cPn&^M|MPb&1)N+iT|tHos~1?0p?uaZ!NYYC^~uB!f3&I5lUdGE z-b^({My=IG$))?XC4(x2YDMv6$oETSg6R~A<_<+U>oC#0d(cmg5n2(nt)~|Ux?G3D z%#|Z(-`~)$e6WAWJD@9nVInri;JWoA$rU>Uy3;qx+nZ*;VAZ2jeQx?^XEoX^jC%9M zJYOTqrkmX+(r~?K0iyzY;GQvxOn9Oq&d6w@?gjbK5zI-L(#ytu>4}qUw zS9-k})cqT*6(Qg~l6<&Z3$>Lzt^QbWxV5 z_;Gr;5ei4HITqF;fAEdinjLEtpVFV|?Nv;{@E?9WB=wVaaS4eR_-R&ssdGv(XlDUT zo~EN;mU8OYL#ff$M#*7Kp25rVLy~FHAXZoAKWM=BD~iv=1&O;U)WHfWK5eER=X?AutTiB2ke%ub92JJw*vA|S}c*m+Bst2t; z1gH`32nLrL=*ieKlrMeQ0s2-vYra$FH3ctKxtGQv0}$MM@E@15_q2oHkIa0?r6I$* z?m%nIN=$T4n{OqyjUma8D<>Ub>D9Dq&F0KZVBXF_gItGptISFM>^_no+!HAJbwf*pgR1az7y6#AEDc+`8aS6;(n5>s^BPU3k%AH z0N_#Tnh5$>YI>^_F+=)Ux~TI;scmX<+hxTMBJZyRrBfa_f2mqalI&fni(sfFfPjABeF|ccY5yM6 zbihlmLXa92toRa0(TMPc5~x*G$Z7>IofmKQg7eV${_gg3$W=~J(r|S+(}v1X<9kXLdZK|N znVn!`9zJ|Hh+pnBEOwh`lX?UFr~hP4n`sY;X^{gO@z0*D{&rRkdZ=NRnuSQ$GfJl` z4$xfPGM>%&y>mvI%}Rr1({I<0R$guk;AB(XzL3EUvs-16u^TN)iW0)e-1l!|5w9M* zjvj_;9jHm77NflGT^j>ARrQ;Oax=NdsPsf8S}22`qVBC0xe1o{lU}Ym(AO1>O^l;0 zAUd4?2gUdu3pE!+Dxr!?^sVAk^Z}rt8-U5$d~wjEo_^6D(TFIn0op>oV{}-k)N9~2 zA9#KbMY|ey(VV{Rc{n7;1 zWCI*?(+(#66bwXmsIZYrHXB2@gQ&mKh%K<|sK8 z<)s5=*1KlJ87V}Cgk?rys*mF4&4oPX!ls?;Bj*vhfPyNjcYq|#F=FOHnEjN@JyC-M zY*eE>*kp@nX|TAzT+2Wu7s`qd=I(8{hjHhD7ysOw9PpSmlaPyTHHnp9F-b}xBhL6o zmOnBD`k|5tl~$ib$N_+W36-_L4bb%)9m)!l2916fD+A zCO~aTi{nT-sK;|UqUjd@hywQx1qD@gUMZp1Jl7p2Gq>9Z8YjGv?SYfSo^^%JCLYm- z^aLU>%Ztgb7%qhCLQPv0#j^2N54``hpCLMIDQ3rj=z3uFx8Hw2g0OgLIFh!~9d3g| zJP(jHR)7)lDrC42R1PX^IfMsdi~Clw2BaS)c>0^E8&F6vV5Z3PS%NWyna;Y%rcIR4 zSoO>agRW*Rh9%8k@f+CC88*)Oi+8@vF-hsQpKa7}{7K>oPXYvN?II^HAEpG>VufF6 zP(r28%#5yb%UBEw?pVx0%=$Ly$n^x>J{gHe`@p*l4B!(OUelvRC?qBSFH4y>6W(l8 zyCBEp`WbCD_%0hbs``F~xQB^2l8YB^^pqPW@r%nk8b?S0nu4r__55%BhS(0kqY%-Ogy-EBy&qK??P?uLL#he+qysaHiM^%+zKo9HvwMQxwwC7!cn;)rvk zJa`oJtRFS~MGj7jJl7>0rw7N$8VSwB1&F1{#sy~B^j>5bTE`=`114o#`kG(y_fg`}R(Z<6E81MGA{I`} zNp;WOqA&!jZ`l15l`#qc9<{-QDP`gpaZ`kwiJZxaXV5bOB19g$2ve>p9BPm*(%r&q z>Yv>Wt7$_+m9MucMVG{LWS^%ve{g!MBF*=TX5xF`msHQ3Eu1;tt>!*=DmkCHaLFkXqK-s ze9%Uhfp}?nr(LQEOvf5)2#7SbznqOXwzmO!-L5SrZvN?Hc12dlqqdfo>7)>ZwM02ip z$rl#&)}8Iofab;Lix5sg{%y-%5$cgbZ-<^F)~I?0R}0MajmXOlbqP8#aJWanOPy~M z4Cm}_M+AdHcXl4NO>sHx@5xK{EF@p|ozjo?na)HBqbg|74$ zYq(0?I`;rCA{2$o6f#)MY0>ek{^O?q=zDRK09BYPY$=kT!2qEOU0sMw+sW@NyHjHUN@l zd@Pba5n0j$23LdCGJcJZMg2swv(>lU!Mj`GqU0$i?ULB)x$Vl7j(B}wi_s+-Zd2ekfk`p8S#*)w=R6nYybi* z;yVF?sroJhN#ypdRm0VxJtk1dUHe@uIC)|poi2bGXbb$;8?sndp#yadZK+kUzUDsU zV3^4kfSua}y2CIDJal0@c!qk2NJC6#q(k@9WvV)L2Lhnz#OOz;(;hX@Uq2uT7SVkQ z+1fM(sjOXy|Fws*d3)~!46=5Bebf98^if?1Jx?KMqu(I+^>UkE`Ed|xZ3DHhfgg2$ zhY4kg(O3)g?G`kqflP&bSq2YPQTBd)Lxf|J{gHIGZe-(9;D#dAxr+N{nl5nX zD3^0&LUlw>T9L7O5N&J`N{0QQ#^Y817%G@_)lu6au0O3}EfyV>p;g-Ld@Xg8r!~;r z*K?*RJXXi(Ji2z6RwTdG-hgcMye0RFsZ;Gl?Vn_zGeP~{S=e~w$Cz1YC*M!)1v`T3 zKZ0PN0DQjWY?&XTpk8y4K6)!erW&Z>X;8f{i)QG1_s(c*7wji}L`-_PGhRWf+eEyt5JmYGIB(FLnRKK|~G!@zgBf?ByrX5uwiXE3tC z%Ghim$ca@=Cizw%yy#GzI*P(!hq{u-qOg z5!n7K?ixq;NCnli$a^}rl7_ml6mU1nzZgu8_XGXt%6>P6sFVa;*;2pqqtRk2r}uR_ z)SSrV1MT~qmWPc}<5B17i!-pa=q+zE(~;*KrW+6nrW21v?dwyzKCQhCt7q)+DRbSP zAeU(e@2Bvkt!}3qYh-4a-DSA7)RF1k$d`m`M&+2yM2Niq= z-h_tOL%6iiDLB@?Um9`Y@5_?oJ*|@ka?sO`rEHc7B8TK6|I9sx@`G*ci()vah2G+u z!*bqCcfO%K@p6cdZZx0<=GXQoM~n|~^(?f@nV=?>)2uzLjv@RF`{G=mCkdzzJz21i zEhXZG>YY0!Pa3kqc8C7p16@1^h8}`|54FJlu{{s9bfBm+HOfm>INN&BAL^|ie-erK zSaWI`bl~2WA05e!xx!Gue%~f+7#4fFG zCEhu+hSsVmRW{^9?8!=W3UuYwxi7Zk9RomU_2Ieyz8@a`@@r$2|hl238G6{FV~g(neUO9k!xTdO+vD)5zW<&$?} zPP;1{ZCX5vyu0H|Gm00F!WsD)UnSw8zl&dJ()< zs)jbFu!On3E3x{siLR6dwBdMKKb91ixSxN9}+jjta5ZO&gYk4DNyR`N|yp`tb-=FQ%9pGjnQ68E&c~!rwX_HKv=vA zTb}GyP?L;CkSDy6O?CYoG~qE`Z%CI}BLMFf>`*{BAatP&EQUVl+#w)fzL`awl{W&R z+@AcPBi63H`W_Pk*xsk}Zx2VsJcjgvr64&jc}APGJdcBdN|-aR!VOI+F-ub#_m-fx zrL*~{!UbJ_5U(mld%p4bBh~ls%++E#RDVEvIe4FbMA9+s<24AwmtvPWpB`YY=%Q{* z;)Qe+GO@@3f|E@(wO(C^z$VxijbZm8W?npXr+NdRD20wVg>)PSH8P@#4pVa9kaUL9 z;q?$&+*G$Cix~wqyFuy-QyMk_z0g0=T>>g~UcmF3jyQ9){}N(#5xw;o7y|B)8u*Qn zw*d9;>jfr(G`gWw4BIuhkyII=WFs@^;KX^rgFC;5JUd^>MV>Lm7Rp zgs_EJMUZ_534zS}CIOtzbk3aroWJM)&+(qaav=BS%XjbhF3*L1K8-c)lKsj4-K7vaVI=x|^A&E}VsAvDWGWF@ zs>gf+nXB*))-~CXWp?lIP7I$YIw(!?E5PIvKPmP^mb*cDC0LGSqHp)V`ekfCaC@-5 zkrGgLV=>!7&bi$Gw+y!bY=8RhiIz*(YAwthG$LzI4uH}-%Y}p#bc{o`mmP*`CbkKw zRoqy(G8a0u^Nf^MRUls!gDFMJqMR4nP5KdKghU7OChv`^YMv;7N?{9hT|K}$BLuI= z@!dJ%W) zXwG&)hWmu^#Fgt-Sp$5iWe%N}Nwe;3<~W1G=|jg#Ji(Fu&<|R0d>x0>X`@h<~xEU% zJfRlQVvw0x@Fz#~ABb9OWo^nR{6f0`Sr*noAm6_$PVu(eyEm0dZj<)*cooY)9mHf< z&XPb6CFwKQQghK$y`^@Xk+$1&m5b_!QJ`WF%AgxNG%|P$c6U?5+>d(6XJfNex%WOsMu6ja7tRXu^m)f8c<@-# z#JK;4Z8f%ExSQ)!qJ65Gn}+N#Xc7*sPuU-T0-Ea3R_|m9pgQN2odTH z_PO~bkx)G))I~1Sd!3E2r)_WM1CXMy-kk-C7$}5=b~)r~jj;`QC@jFxj5{tPkjnNX zf%6!ORTxIyVbSo^gv;#($WEiYf@E!k_Ju$QW=|{mq(M-bD1D-XloQHI^^CCoHcUA& zvh^-!b8~4<_dtZ@%Mch-e{0-oH zS*BcB(nX)gKSJc@0!*V~?`rorp&E2Y4(E1zL!-q{nh;Zu)RjW2syME=$%%HC?BUiT zL#~UTW_LOen{V-(;UmpT7R(zFt13b^npf~t3^d3@h~$gvLm9P6ur%>3q~Igp3?R!} zd~XN}DxgB)2Fr}nxSn6X_vSCKz*6Vd`@46o3OZ>>x0m@*_eREnl@UfV8^; zx>=275pp;rTE$_Z-pBTI_+EeW*|(905L<3=6<)SWS`O#$u9tpdJwq?6Xva zp{*!tbXN`Nx00bB=Fen}qoGI;j)jo{JOGdk z=GvaBJ|F3Y=VHP0ljZI3zZej&+0+XPJQiTV4mQi=3nV;s>HgZ-H=dyja=NCa3ls(D zw@$g5fBh0l*IyB}M{eopz*nQihCjzgwO}LKN?q^?KW+W+HFOQ^dTQuErtYwsjPB*s z+JNjN@5w1F*&`zm1%gy=g3O%7!oucwS>koQ`A>xTUzhq;2r~aOZmjjMkZv+q=b{<+yS0j5|O^bzc_gT$o!D@r!IaD9K|n!0qjGZ zS~+aj@-`4_OeZyZEhUhR4vxg#WKG@(qTVZw;*5p`+jpR&ksp+Bx#ciAiz<69kyi$u za(j2mBJcYPbB!Ck^Qp7Jp}drv;Vv~AYy1ekwhx~$ z?EQd<(t6LHzk@$Pp9`x28t+n9JlgNz<~9g@zV#i)6Tx)>KTeh}mavmoX8}HkKvmoX zx)}Ye7c=idSu{0Dcm$AghwmWQ(F5@7hp`kHPXIZ5fZ(P9HNW7YPuq(%kwlq=<&8l| zg9UIjrtT=}+7h`Zwb28#ZD0XFvWlTj=PFS_2Jdh~?TkiiS*?86in_DdHm_E}7lf)4 z2l^M?TRgZcs}1^N=$L7+gT|xxA8S`y&_)Bvy#An`O8r#Op9}z;jE+_YxgxrLQlJ|y zu?T|o>RzXoEwSQA29;RHAqkYXLRIN zyLpwAg)s`=S8RI&ujPwO2>kHSoVbc;67c$Bw@P>6P{FDS#J3^GN+un88;F*eFSS_)53kHb)cjm<5og9p@j zwSlONR7!A+>rzbt`E2@1nz|xi7zH)`+<{+JWvW$B6hL1sECB!qqZ!`HaqMA}3EpAp zRi@$!bU=Ym49fTwL|Q}xnXag{6N65*jOD}56M`&l(EmVk^3;*NNU`wGVmlE)hbUJ3 z2w}By$vIPfV}zXMgCM2yi87++zCiGB;O~&?ZxUAH%Gm={oe!GFicux#duicDC|g+3ZWvs< z(GSbToznyFz8bwKu*KbSb-ivnrsz#T!dK0!-kgBq${0piO6uMn%ROL5ap+`^@Uck> zplUtrvQ3Ae@FsM;k|ae99*tF19H`94!8tnB)Wr4cH#1 z1)6I_^%slCr7bPgXzr2`n>UgkVfenKWj?p5!mjxtz3*px`dU<1m7$RNC*A4xO;cg* z)V%;R9Q?a`)Xco-zuS%GU-!%VgSYsZ0reC^e?#5ein^J*OUZMp=n1%jcj`6%c<#m|KyMJTfd)XC=w zW3R*Uwr$IjEU)hi3g{^I379jo<$Gsoxafj2TxWA)sBys1ubgP^M+Ekd|4xa%-=r|S zvsbk=Uh?zWi$!Oh#6lfQm!F!pUpBCTDPchvTK3$p2D&StrOfHIqc6$Y_r6KR#Rn}BoYmvp(7&pTbf`u- zOPAx8Dg7d~EJ@CBaX!=6Zq7Ff`b- zAzjkJuN^FPb5cDS__(AZ3H)XkeLru|)fdJ3NyqL^J!M@1!M%)lUg`0n_)o(GORfYx zd1X;VTrZ-BxNdoxW>>Ib*4m`euDFn(EuI(07^Z9*ZTv{Vxq}xrU9%ea`vj@_-C4Lz zLR!4+qdlF*m?QMf+Ed$71!gaUnFjV!j{?>~YHgO?KpNSK_DX2@-nz2H9^>)V;h{SR z&WYA+h>J@4GMc-BLRAe5?%bKsThD1?0A!5=_LB`*zV!|cx_L7UcqrVnv-(&lU8;CA zKIX(3X?&o+Vu8Fw2Oq>p^xBD~bvBu=&sLl`epr{ow$nF!``JfpVh>_-Sgt4D32CU@+-e~bfs8rZm)F@bNZQ? z+Q%q+6+Fti-xM4~3l^nX+9aOc^;y!ZxSAmi>dYoxWfb}2{fhQNtah(xrTqlAWlXf1 zp(l*kdbz?eQ<(%w|FQ2d#qIc;GT zf7$Xs-QDef<3TNxikgM2L&^~cmW4eS(e_=yQ(v+6r$1HfTKU7;d4^|}y!V%%D;FK{ zbYH*X#_V|~Qneml`=D!4^4I**Er}$A3huT_~eJ&b;WuRR@1#P2LVh zK09w`Mm`U3pBcq!`MF6bG%eNVe^xjIRi#bl11yt^dn@?veQCe0ju&Lr!elAvU=*uv_cuM(l2Q&jY=rc-g| z&GwkQh_TjT*727EcT>~6AAh{i&z3)N`a);(_huH=GjEK)MbM6pR&^T&xP&i63< zAZTl8>#A$%scUVr*`#BrZD6RYvq4MCP)qCV#{}^|o#0JA?90^J_3VHU4p^%AHiU<*Rn|G4Z#PSuUMG<0+T@hJ+3cG0(-VyJL?nzgMFU~{cV7w zZzY4BTSDPhrdv3hH|$iD_ha8O09S;;e>rvW`oQ#X_@nP`_v?O8l;5=J{JoT?oesP1 zH{X1E=h^pz-kML|yiqWYy1$^UEc0*o_=vk7Q9X~YTzuL`aoq2F?$+zR{f<}i-u#>N zL;1ssSAv%7Qsj!`n>xM{#2}((RJB5KRK3}4{lfO{OCxm=i(i3pe6f8;ujtzJ#e4Ab z5vHO`b6kcS3 z#fHZUsQyaRS}|U|%8hHEqVW%RcHCZaaUR{HhG$JMM^f3ywJ31LrSB>u(yTc(-ZZ(e z`5Ql1d@*|1xkT+px`88g=CUu2=j;)>cC5c{O3~ODYuA@x5UuBcJbL88KJDUA)i2LE zDQ|!G1J}U4nbo)3rYv+1taNkO&}gf$iKYR)`(isOzt^4=Td>g8nx}^N3RZF#8j*N? z&PELZLC@dYxj4K1E2~StJxtNq5Zn9PjzfQc0$!Y4uQvZ0nTuVR`}FBslac6>u7h75 z0Yf_;yorZZ7(S4&qrgF5e)jCv2emKX!(hud|4;YC_tZsHg!q`S6x@o#%_fc+C^K@L*vtW4znOyH_~Wl;&15#4d4Rl!d%`vLz+Wd`K-XX5uy8*|AbdcwF^bV1FNkrBJH@M%9 z@)nsJgDIc|=H1y@)lPTuoWsvNoFQ;?wkSj^B}#chhZ!u~Yqm9naY^XNxna~p zTH06l3NBAs%-2LLPH^hO@%O(M624Q2u3xzsl6L6Q;FB0~@Z>U^;hNhbS?k%JEie_b z@R+oVKjk|N5~N%!vbvSXa9SEU=0? ze>pAf%+7riBL>*C<-uw=u5P`fFIsSagK&1wMw#uE_}}6;l$Hv={_^?kO-iihYsP;w zZt2~={}{7tvme>tCA4FGL?~O9Y@H&DjP$%?Bp%dMUZvf zRT4TF#&sSX$WFHW=vH`X|?-;Aw#zkMI| zZumEcH^2>bVd2VkSL>Y@M`?yj*hZrM?$#^8@y8A zQfIEw@L?zmJwUBdK#kNnC5XIop?Cf0H2H220;crNs5$&ZX}7g?T8F%BWI1pl=(7;I zj|y}JtGRj#>3ubHkzhj8NEEil)&03x%sf%tK}vdhfYSuR0=zo}4{m!HHv!$e#&EB; zpCgL2<50al*PdGlh6Y`Xp*K|dOs`#uB@FDjCY~4s_dcj0BBgR};)9?`tQK>51KdC* zcqG4%NFR$@ntn)N?#X1kU01E=Pdjmmh_Hbl;k;FokwWn^Cg zL#;PO$-s|UPY**d)-(f#HA)Uh89k$;dh3{FT)G~&ItkV5v?{9jAbN3JdYBY|XsB=G z51RY!{9C!Sl-nO`c-un`@)5G6SA0m~-^L>m4g660Rc^Y>g zKt7AL$Yf_d9ElRV+ZB^g64Gyzty5Mvoj8lV5>X!p@Y-Q*{13ku5p14eOo`;EaK3R* ze3=h;l!)2eXpKLGsD zXP9J1M|fw;g}vS2M6t@8?nNbLp=YJFCW~{ETU_SX`v5->RC4oN@Z6AZ3WLTAQyp&%$U6#QX6lle!rs6DfG<&=q8ZXbc+Og@ z795vD?wFe;I^d0P-##g|^?sclHq=0$AM~rYgT{V(j%X64ck|W1KBCyLo)x*&;eg|@K3bYI4XIeQGdI$DG z)5aUt+MJA(d^kW!pUV>0D^UUFqo4TrQxF2VPWDUaqRt2vZYA~1KK1Gj83uY8PczQF zoG4AZ+p=sE$Dipc2x)=B27_r|W?c&Q>6ff!aI4tH5*5f)U@$4rq(`&g1f~?#NE)KB zGKJ*II&tpz;?UZ@y2XDJYKqM6TjD~eU-}5Olg9hmZf%R2Vk3CvGS)vmf2%1TnCXs* z_LaNcMk}w@gQvF@O@P5VN%3aaYmDB}(k2Mih~6y1rflqNIuudD4i3|TRxi~SZY^;$ zUb}Xt!$i=gWEvX|5T~l!p;j}nrC{;7GUjDMp$s`RI)Gdtj94f*AD@+*iwud8GFWwi5KTQ81I!T; zu-^E7nn;tVYUYyGAc(=OO;=hR1EJE>??akk-nO;UmS`l46CfYt5E(a`bmnV}DlwTl zP^2`K6Pnt+eV_o4HlF9gaq*h<$D(EzvBAIOj`2QPv}a-R;yYysKci*7q~^=-YITwTcDMgt!?(AEKMv#LCpr{%atRD@T=vY7eLFhqTL{Trt$^8zwdPPg_VZ4MX z7E4>$34Wu9)!~qmf#cLE)e*S;L&8tFKdj#;PHAytMZwAGk3*|*PgvJDzurya4eikE zEf$uL=Th^x>S9(orMx;L06R5>-5_v2VSuoNnY!@-G;-V#B!3M_`MMXQ&4JcUDTdlQ0WfA zZ)}}=05N~a)o_RT>lsQdauJi>%SKLagaR}ZMa!|MnKe%ALVXjpMhz~LHe4yKj6m|Q#yU^;!key(9I(bRi#@2EhjW+EyGBEwP(b4w{Ri;$0uNe?FhGe^95 z!rQcSPoxdeAlPRlY8HJ-qhYC-7fA-BA}LzDtOIf^FA@cy8p_p%N7p#KYrB=L4{eD+ z9rBMan9+el`CLhrBKZQ5VX<~LW9G6Ib?YFvPt;2rKU?mbba2Cm^wG=c?EnHbwm709 zudHbqRZ9m%N%kfZinWL0H6J*aKVc}b z{&h{Yhy0;(ScHm7H89W!NN0Eg<7-_RXZjlHT>j(Z=_-g-r6HE%p(w^F0R%5Mq!oCY z05iBozb2v+m|(bm)tBRdBeegFHv*vnxoEchMO5#KQw700FJ*xrehhh5NQW1xFCUkwu4B01c#$Rj+QhO1jXV~XJAT^(tsEID>#M%B4T5E$`k(*`o{@+TMPdDEN=?RJni}SaE(?3j@H`596mm6) zK|2qdCyiH}mUvy5m$25k%J~CM(otsHpy&DT|z6zfD3xxaTZyf|>%HO4%l- z((=c*#%A(4`ICOm+xa?y4bgvOT8t%-XImkeAU{AT`R?$DPs`J>u`w*hx1bmIZR z)t|pLz8un2AXbk9G1Z=_+X|VT9Ji(ngw?h5sl#aYG?Ci@$AR)iYGXy~N1!DO&o_D^ zX9`Zvgs^CND@&5*^Pl9(zc}ySKfB!Mx{$O(3*aBbZdxNul2bCicyx|=I zr5w&DAmpOo?3RWExw^FOQjVzgNn8Hb-B?j3({ak#P12GHw;js{4%Ls=w1wcq&eG0Rr-BhALSs?u^2hwp*`A}2?>pba|L6qc;5IQ3C_pM<{KG~;Yb3YE zc_Km{kl9bWx%DrM#ladZ;~SInyNsAx-=4RO?(ewsX6iMU8yq{04~s z3PF*I1?q#Ie-tIXTjWoNXih+a0(wAbn00O@fU-kO826OxN!=(dRs|q>0D?N!@}qqE zOcPXngyu1+%vp$91ea+u;I_YR)ofUL2QsZ7MDRPa zC!+}P;Y#~5ZT8pz7i))E6Us_*01wX14?7p;WcldC^Py!l9@G{uCz_=HDWK-p*LVZD zDcl@=|AC*!QtyyKMUqE$nR^RSMVrL$(;;pKCD4d0+qjWaw*non7(pciPy=wDT*w$s zc1X63`>+pBCK;L(P(%r{J0p5lSNc8E4u{pJOjJ!ox(o={8sCe$Kye0&QC_V81h0B^j7pP^+f;0p#}mry z|8WNx>{W45XOk>4I;bGt5r>q_@()T?iC6u33oUlSRxR2@w^Nmj-jG+OUlt&UZnHfg z_MC`w5~E~x4px<06Oe+ndh`eq5EP>4+2Rs*&tAb;qKP%RcHelpNQ`X0FOS63O(hk# z9o~iVwtV4Zk4G+ z&C&~*l2e8|m)3`6XroB)E7wHN9D+si;of|#R}m;F5;?jQ+U<>+G!sxuxI0GoJiplR zGP3Ijy^p`&;(cTyI}idfg?EHzB(c@$zn|3Hl2itO6=7<%WM0S^&LamWdKo;wow#LenGL9l^8=?=c97CIt>^GhDG3Fww%^h{dvS89hb8kf4RPa-qn&Re4`vvWbZ>t?uQ? zf7NNk4~Wkg3x3v_dT-1v?>=@w!vDEB5vxlx7F-dpb12=!3oUDWy2&_!A~{X>>3>S+ z9|6QSVtHA&>&i?`cLQSZ8|-SjX#*akGl|vmoT@gZ+YgL@iFIJx_z=q|m`uwI!vaHT zw7P^u@4Yz~f*2G~#M+l%ELMG}b=G=JdMV)FRJO{&MH%nNtaXfRJ*KqVDygcpZ= z2-Hhek%LuiTj_t~!cw`N0Dg7xU8aZOpe9fnx(!zPb(u?9W|;)lx;8_UZAIKQs18hn zvKnQzy-e6X7ndC84{FU&f`%%Nt715WP^BqIPX9kTT{2K}40e*Lu8V}~ z_tYMrZm45%76(;4RN%8QA71mWK}iYeCaO}R0-{uH`NZMNIDIVkb>w^ndpzE^+qxZm zo(x@vra@MM%8E)*ttK5P-$T-Z`YLOyPwfHMwInq)gwB^2smPjK*?zJfB4?1c26_07 z&tTXs%iN;}fCNE38BH)@-9PR#kl(@n^0ZjHG|+@v?f^^x%34jvCT5f0eR+Vr!A>;< z3|8s~m5(|9{_>+({nCHGX0($-iy^C?iJT>c6j*$D0BouPG|Z%puTjj?V6S{V8l`5S z?%NmJr+!-`C=zsg)h{0cy||JayBmh_|It;8hc3f#E{O;r3iU@FU=6>6gEU(d2MJxC zUtA0Zi+}&A*M11`rfc=u>U{`V_8jE}MoiyTQA0?l$ zCf_5VFB_4famB}QwQt^)*In`-MuELL#Qil;(7MpV2YuK0YV*+O^<{Me8*2S3_19Sx zL7`9-Qq+D3A@k+!K+l>_RgrWgVI!0qbN43VrS&phoPVF;@*Cr+w3OuSIZvBV9bMfj@Aar_hwpC5ty zzQO?jT2?YGVpw2SVxIhSW@2fhX6)P~;Kt@S$Tle&Mb^v4E2|$4G~$$?<_!ldQ~7eU zcLJU0cYxo9;l@Wqip8ON=wiWZ2Gmi;je|0e{r`4?Pqu-7s!}?CH12thR#6x0aQ?^^ zqy^nAstm-%Keh^U6bM@03^l3fA}Q;3>9PNGk%mXj5BA!Ter@`9^gkc}vD?4?yXS9P z{?{6Rn*zM}uQmQ_jXy2$|BEMFbp?b8HkHDuN=hrivAvY-LJlEzUbJUVP_bp%p?*2l zfzBLXn6aWL>=CU&{`2(5+Qow8eUdtvm=slbk+l7pNi)WIO^I5ojyo`5Pud^r>CTj@ z=_mYMVyxH>q3T(jN|8!qkt{*?DsIVD*QYzb%kC7bEhnu`S1qF8Q2H_QO8u#%@sct% z#GY4OF9PERrU(D#7LKM{8@_^B<{FuNU)AeOWeh6q+;@?5=vm#)3?*bh`u(+MD|?KM zI75d0r4a>c8yyWrVb3yS3}9-nvxrm+MWw|0?CAOPmDW|`7Wq*vssd(3^u;d~^etM}x3xBKw;x>HjWtM}08_m9O@fpJY$fm<$ZdZeWru~as$ zIfhHGnlLdAvFCjhHO&+?%e-bJg;~>)utitGHD3J?Aa?68@Z_d!`H3k8fjX0pa1ZM-dqx?rFj7nm99bHPyj z+KhTI@gR-jz$yOAD6y;NEe^2Q7r8Q&+wPY-^^a#`MR`;C=p=K8uPd&8zN(6Qq4KRW zZ4~TEEfrg1m7#NJ7EiFRbi&QbCNfE%bj3W9HssorDyl}kWqXrN_C0!c$sc)J)+lN8xtgX{(`!E zfE|AKb8bERHS*6fJ8lk{P`;I`dJ_-tDzFOX&%)yiEffgn8^_-UP{l6a37A_h2dd*kiM<2G1Z#s%#SZjI6xpXR~TUT>jG* zzdXN>`gm88A97B_{^-8ulV3ltNGTopJdt3@8TEtry$>kcP=ryGVE=EVN^Rdq(-gblmD(>K(Bku| zCCARsr_!%|@^iJX3gKNP7Qxd}rmz|uDg5l_rJwX^9a(n2g0+G8E{o6ibbR>tiI;#Y z%dS1&nyL%}0|eXZ)0o!%YXb#Vf6t-s=Q-?6{A&(h?VTFc#hp5EZx94Mdp6yVPU^B# zFE#DXXQm|~bksjjW5s9bQL*}&0XjCerDuMFDcstiY^vK^6|VVJ;j&%c9pI-2;{siV zup#Eb!uj!AiH8uM7fDtaYL|!pHH1<_;E*>uZ3#VYh zBki^KR^NLN!LY7%RO9p+`V_b9fmL|z{>$+kPv1|^_-5}>i5LJ!W=(mhU2AzvtH;U2 z@mUAl(QcfJn`Lv%BRP7_?1kZG$=HefGH04GNgN6*w-{D*nUO_`;O(sYO)hagKmB z-buiDGp%y=W?DW#}5LCjV#Zs4!ZJ_+S};}>YzjeQ`n|a zTd(sVDL@^dKL~Y0yLNcFG z_}5zQioKayxZ;+RbI(y@18R|lhz65Isqv|i{?iYLD*RjYxiFrHh0+a z%KT^yf9*Zj9(52Im~`Cl9H-cE*#Er}=S2W-zGwUaR(AM~u7BZf=~up2JBB>g;;7kq zNz%p{l9e-DWwL*&ALT{7=7!SRoLoJVrO41hj|13wr`OKf*82FA={oC9pO?PY!L4AJ z%_-&Iz#i|nzja~npW*kcwatloyKy4UEeZ`!7{0u`wVvKnf4cK^t!MX@98JX>LlEI5 zUtKD=9&W!7bxWBl=I*Gk434R{dNFg5+G>|lzB!f!#`N(e?~ls>pK4Cy;X#se2iy*E z@*4lPhdsJLZSy5!RDjn)6h-G}e5or+*IWv?Y|im03~V3l($1=kY&uwpYn4=F+3|8= z%+`+Ou>*EV7&X}$cL6curvQ6~Z?;soew8hBQkVqj`hh!D{2#HVqPDSOZxmSi2GMgv$rw$KG`vUDn8yY02{DAI9*R#V4e!aI#FB&BhJa zPRPXCIre4=FE_UT>h?T#XGR<4eOE~bXiU;A!RlXFNjmj{GP`ZD!}=E8sw*J=L01G> zvw+oH*8LcrG-Molwy9B-AT5vET$Y(Xw{2am{uyBCzVAuY{n*u<_Y}8jT9U{70|x6= zo^(gyU}*5eov>$dz+orPCVh)IM;q4aFGUxWI4}GOcPD<-gXipZ$trc#Kffoo_kEvD zJo6_0qIo9G`j_&Iq_%7aK!jFqHd|V0DCX4Z6})7YSnzJ)+oeh61p9>x+yCIN2L}xq zh1ee*x!``tXbbGHtYS3(_Q!#p@w1udwhh+)grRVE1i&t}D*=D4*t_Rw@Gqpf+L&_U zhWG4)ko35q1XU%dKXk5$|dC$3h{WIg+2YY2yloT8MgCy;$P1F|s zIaujL#_?yNn@XS4p9lSW%`AoDxCfR?%OWmn?$-{n-{mF$K5uJ-4#IN8r*-GOQ4mA3 z%w_W+SL0TV4VQZPoS~0`LQ=i$sdiH%SgdxY&1o=6cfpuE1?!QXf8^hV4WSBU3r~~z=|_C7U?P`2Q#52@jyJn7(IZR!=|(K3u=PMAbc{0mOufGT zfinruuEzN5Ud<#RBM->t2=dG|55YcYeM%Q4!zmLW;r}q1@hmFt!cc6bg*6LuS5 zCE0g=X242F=~Xzc8NK1Ro;^nKQh1BJPY@qJHlKe&LviKhjw28*NAE&SJ_p5`l3c}a z)-K~ba^0dly9O1<`I&)MMG4tBrD0N7>uvV>PrA|#s_@`W&y89U@5Y;~@x{fyMD!g* zPH{=e1v|T%cXfPRsut|<15l1H@=nYl&etiXG~&ZYq8L|NoJK^Cr>3Uv?=vZCG z(&RWqBHasRWX%sDe({x*-HSh~UfzmA?A1P;(3r@4!Qb>KXYU1$9<-*}Q5yo~(#>b? z%RT%tocU0R$dT2}pV{osm79%?5!mD&NPy$AB1Zam7$Fge?AN+(X*&r+O6s}+*~|y+dF*!T)sOLX~(Y)kMC%2d8LMN&9O${i3pl}m&dJ|uHZ2` zeje>}&+LhQKAB-t4w8*3{4pE|LY^ zcBZ!Pr+ooLIJBF!_uYm|?dZN!amsKI4D&yqYW*Va--#ZBu@c@Jmw*sQ%@7O%1qEP4 zN-;K*NKEO3xKi*0X_K^*ZqA-*NEVD}4&kI`anRWzn z7GH-Mg*#q#vsml|Na9J(F@W$PrhJ}rv$c%683pYb=RY|;CD$;)hD<`P^P9y^-uSL| zWW%K(10zPI2M|XIdqg}JA?LQq z^X2PkG@5V1dzB?#uR3x~jTE^H>Gedn$2dbU*mwN@+ptAyGc4r?c55jscUyfm{r zMJ|j07Q4f6Zh8p-%KhS9se6J2^8GOsxBk#fYt|7PLiupldey@0OLm7ol1<7ix4~rv zz4P%Idbw}~bx1u474W?)W@Z*a_UtLi3jyxm9YdIr-Od2MtU;b*s6ltyt!!l}C?AGK z6mY!i+}qnr6i@8KDWxGoeS{0U z4w&T+%j`?h{G;;;LUcb89s23g#2~KeX8SZRVhXei!piK|BRH`N7WHHScF8kCi*O=> zKdO6AgcwkQK+))V+4;t&DB9?t3{V=jp(BvcZ~&F*SMPK}?1N6_XS8&CFIf%{T#dUm z5wXu5(mskaFW_z@8f=E7jHAq-Q)Xh!yM!D6eWR4y$BGC0bgcn$$ZUTr<}q}~UyR!1 z1HdEB6uR&hMBR(Cs4?D$Z0Y1%T5Q*A0l56R^D)N)SEqvoeS-m{gNuc^S6Gx8$9s zzNBwwXUB?dyW65bc|+ zo0?!@kAxamEslXmMe)hSn4TXfD< z^|BF$Lw^BePHOPU4U9sN@=W*KIFtJ1ANKD}$+qmvZ=lm1+_pY!3y);N_v;`L1`)d5TX+>Upq`xs^ z1~uXPWq>er~xmE+@g)GJdZM(iaeYV2-n zD#$a>5wLOA^1No&=&7q&~RK@jAjLVvTem3kg_mC;~t)^AE&?J9u++`C6h zvv+R;!1dN2pPCqnua>bKx6`Fgj2f_7MBv8IjOU%Hd*l+ZG82rzz)JUkgau*pH+3Id zSW?f-&WAwu2O27{ zE+;>X{nFN~4!5XD`~m*%N#;SwK9T%M;<-njLn}cMt9b15nrU-9qPS@8?s{vhuIf!Q zz%bO}!eE!+`XH6@jLA^q0sM*ev~_bTnI!&@B@|V4-Tod5RDFRq1b?{kUTj@$8@i`P z+AaC$*gcEh@T&~Wll4fP9Aj>fHCPaHm8M|Sdb!s-7hAg)4YCGADscnZ1CoV_eQ=q2 z6HOy=TNM^@rM`ewYlE+!`i7rsywU2>@fRIZm29k_&eJUiHgB3@-DPzzDU>!`b>eQS zXZKT|uDRAln`;GJ@3521}SmIpJL|;P)!vh|xzG8>|cig z8%)c>UJjrL>CPJ%jFF$dDg*hgqGO$P!%SAb(@g#S&KRG=7P{S?_4nU@?)`aZgcx2>kgeWtY7HLFT#I=JI2*)ywuS z45vV{nmx);;pEgu1@R8&+WbdN;hKs9uvn=z1W3yxS++w=YzZiK z;R+wf7$_0TsN72bCe$x4sjlPs@v%qetP8wM$c>qKW-R@=PTP zH=dYi`0{;7wtg6d)UBY??{Qs7w9*;zNJpa9$P!l#Z5!YVL&Gz`T%Rb>6Hf2+RBdYl z8OmkQ1f9Xk%oE3Q43Z9$@>~!g6e^qeE}xW@w(d6_zruG{0k;ZnRxL^)zteaI2(fTw zokJX7+tIoh0TC8RxdEnzuX2%t^>|LV2KElbrIGHXkrEger^F41RBwAE2@#%(`^3Kh zz)EVHYbIUtW^7AR*63YI^LlB!Wk`ox1HKvw=ysY3zK$$M9@+S+G6SlV^{pj^Mxj-$ zyZpx~hOMB?LXB0Zu`$GqlqG2roI^LJI(TyT)ArIjd(e{X}k=iD?EW%f=FS15yK6B z?+DGNe3cXI1h75AH|#s)wOpquF$N@NjWDbpU>4swyL0W!lD-uQ5B8p4)G{61Igom* zo@OlZ1BQjjW76TF=k?XddcaT`=Ic^Z2dik3vJSS2O}eYp`+y61A~jg4<)4MN6L4Ks z{l=v!TTZdP$&3r#cwyzwTB(XTaIy+ts8WgXfHbFjy;h`53ugILd?B0ymJKz4;@GkI zg};kqC)c6x;8*PJ3&)SJ0z6c*gWm0rD=991_d9v+EKV+_?>wtTcjVfblBst!gkl{* zY2ig(_?b>MNDe~jNbZszug~4L9wJ-s2-uLpz_jP(w(OVOz=j{eEbUpInhd?lFeXpG zY_;umu(L~v*Vy;yPZc!ieK`w9B5_ljU9Kr8G;m)BZ|SrBZ3`^b4uZ|m_mZd%PEC#) z8cP9;^PT(!RB?H^+sCG(sd2U^s=XM?o78=oG5w}#%JA7bK{=28kfdKjKv4W~&ITmo=F&Z$a5%19)A zX`|I^VT0j`yb~sdf-S5;00)QSZ17~x>TR)Vxaj?l5K)Izg|CqS=@O8lq{qG)LOFMY zKT1}x1j0iL@ckvD7ud22bJZh}-E#qMliCpFhqT;IXI&~NBl#LROv&kjY5u~5nBTZW$&F=X6>V`{BLs*d! z9Csd{&@pp5E?LoJVm>eF+Z){mbMnq8q%%;i>xqU(Ak_-VGy0Obh~y%k7qM)SkXwjI ztr$$x&$+6bnb#3Qt)`o!Ju!l*?EI}yQuTWnz0cQ+WX1V)-^ffyyMQYV^M?;u={Tz0 z3aksbyQ~oW>NRWdQ)Y-X10s62wE-vq07O$?_TCC}RG4V9+H7)xtkvF6mVIq$UwUR| ze9}{CX6;MKMDoWs?g)rqOcB6>X5>i##rrMwAGfTKpc){_6?&D$>yy8gSa%@s-!iwgIg_{s(43ame!}qGMo~+L<9<=G z%y@)RksI$6pBi)?V=l$-!+ra@zw0_w8Ea5kvY{j; zSm9h_ICeFp@)S~W>Q^NeyN^7#0PJ*;aTyE88S1Rv%?f!<1hP?Yh73`)Gchv3Gcl8l z5a1Jfi*;31bC*Rbs(<{XO>Rt0)^ADqxwr*0mf3o-dlS>Z1m1Z!?8A2^&}`*HQe2Q@ z(4*I}K{T5i6FHLt0NjfZBX|oIZmMZEc2ltSxN$7LAxu~n3ZtI@9%v5LC2U=fVUqHbN$^AnX9(4XUCE{e|4QOPGz?ZP2do4zXy1efJ zhlqNzKH7dO(D|pc122QdAYsc2O6uu@ByhiZpjqM@>cA0s4gx&euYBq?>RLLFB6&8Iq4CNsUzA?>M_)d5MT z({mstzN2;lMXj|q}y!uj-@S@ zMDc=ROc6fDgH_=F;*_?WjJ6yIg#)d0 z&SsS69v?j7({;$FOW9|r7?i*&DqXLSBnE>LiWjqyuen9rH%xhEq{d~IvYw-V`YDw7 zA({4Lj5H0nO9ov|02r$!p!7X^i-45qX8-1XY<$*$*Eg>M{RO{gNSB7JT68^kFEYH& z-l#V}c?-%MRjmmIML@uIJvEKLA30F~p@C2v2>M?l>LB)BqFGC@X=z9kj{|l~&!EGZ`cLFWo^$xf;fz_be=dmg^5tj%J`GYPex082P(1@o#S3~v2_&z%sRlBn`KH+24M}9hm%4dw^4Xwtku{2q zIJRY)ERik7FQs2$jF7!SRT7fZ)SZjD6rc~|qaW-}G-~+XxXC-w6zx>cy2JD$Ai~-? zOcOOw*C?%_smF{s4M>$0Wk>rClrjpVpCo3q`hzkd3yj&B`-dXzoGnN$qB#oamk{RI z1~1U3K#4Bf$2@`gVsh<|dm${F_!x-*TXC&O$XAb_=MLkQ+zStalHPsM5xvrqAC3Xg zk2wlJe{s=tMH|j%`U=A%)QRE&2^f14!uj6)1*+82ZPYBRN^aeG;7nLlV9If4H6Qwuw@0-DQjYrp4|5zo{`vPq zP8bRFkHCW&Gn7A9u*s!f>QJE;Ni2=`pv=xQOY7|_!`S&kFL+*!8e->3qY&!LkAfh1 zoP7xmeM;FTJxiB~(Hdi}d+P^~oOD2PFIfF|B}hbb^%A!n;UF?eX}Go@ELN^rz9P|s zGPa7DVTw{eUJj zz12|gaj~Y^iM4aJw5C0MpGuj0_E*b& zhZ+JkXLjiJUr#cfWt%tl)F>7U_dG_I(7~4v<+(!+>L)rXOiWS(2K_Pv5aiy-2c|QP zsnwdLTrE?d0She&pe5utuQ=>(IQ$Gii0lP=V%IT-4MWSMow(&l<#wGQ(@n8T*7uwqJiwqs zNrEBpqYt2(hDM2=X1&~4dI+pS;PeqTM*rBVwxaJH0OaX-JFNjZ*QLx6c*>h{ZS@yc z?jV_|2NIoDHOO4T)!*~^)OQCP6(WA(*7~L(!e)qXIQKJt2R*@{sBAClbF%WjG8az4 zSFv*&p2^C&Z!EnCz@8HIg#Thmx7H#<$Jw|Wd2xO@7xX$r{`zTixrQI^PuI{GRf7sh z#H=Jf2doH*bUhYr8N>|w>6LkH#@9&h)JkO2tNmGfq{tG6k zLF1~eKiQBd*D*6?xaBalfqNTYO)y}PiYDKXx7Pktq^-aMn8t* z0O?<=;4O{J#TF>kM#Vi1c@H|*l-Y#gANzxn%xRz+`YOX6v@a&uY(6>+it2i}9V*t&rMJZdJjx(G+i?ZK3D?!ddl7BiP# z1Z%tLQk!#!`!Se}6p3Yq;;-39D_4A8hIM(-JZ99tv6+Fqw~HKVlms88(+ z`7<%ykAu4Mtrn{IY4@_JrGg}EqRqs5kz-fiw|WJM7BZIXPx_7ort#3FL``=%CM7PZV+IDa~`&}7@Hn)C-_w_C`XJEy%%Rq zTD-g4^;5}@Q=13Dp*SU);kt)c+oPQ9sOi*pK-q18YC1I5l0Ze_6Rb<@%NA>5_+?cc zn@~{0B~xil(tMAvX~6cmX<7t3!Ig0#KHwX zN@Id>z*yvUGO?K`N*RA3T^ua*$J*p!jdLzgUWD_9+!qk;D&X05nbBHfEr~WQ3G&@l zY#g}_P}FmOErc4SbvU8=j|(THnl|0DF9gGUXGN(ug1)c&4fcv7W?@l{H=vdm+*BaT zk_=_z*OrG7+R|}4!&qynO;3((28B@5E6WWrW|MPF zuTi|_h&%l4hcaNCYys#!%K@6dR~c4%Q|7zt{*{K zo%W%&;AIe(EH?C^8?vfr)1h=~zTv~-9<2aNQus`&k{-uJW&9qLy#ZGv~zcxe=p8Bfeu!F1?n1m$WfbNj*cuFdH-y*Cr`6)$qjUocX-f@m1uo zE%%YYLDw}6Dg#;IACxWrl5-(pE-gRoZPoD(mIE@=1ru@sG&V0rtQNq0ed_jMVqAn_ z9E|G9Dwu_kH?KurU2nG4xGj!v@b-Ac@n&p)OV9Gc*GGCMB1nwAc!Wp_`U-9ucWv;k zw{QI{C^e1eJUK0sk!IRHcT-@2w#hygakq7R)MO-A#l#?@_~PJV9+HiR9o~!li{K0NKawbwgbn^EN8#j+06%=m)!>Z{0D~9Vwi_ zMf94&_(=rcEtdurl8-Z=b*0!csb*Cdi^UJ?B$>h|0LzuiB9*u^KQ56Dp}Gnk;{fn; zkE_xbL=;uJ9<1~p2|bgVW>)tI`U7Q=-n)4aI$Z?pP;d0t-N%3@O;^#3Bj#Uk=`OMf zsu7;gJL8$SaW(Zc{?8Uz_@p*G!8lYBJXr&#nYcEE3gN|S;l3TE{ZcSTdf_M z=MKsk*zAzHK%#^s4yXF2udThaSX@Qnli5WV2c3#?lJlhdb!P^`-x6qbN>Mq{{`5J= zHi^)r?)nqXHwuO?igN={8Y~ucw9yedrRe*EfV4#mL?%BmbM+SUzT>Sv*sEMmQi7_hzn~^cuMiEj zy;vGsV01&Ml?TZlKBvY3D*6$Bd~KSxvkhuvu}`Flrz;^*4OOE+E9|HB#B}WWSNLc& z8`wOG5dgKRK6OOKGxlv}_g!c}DDeMoekK+5h!cdfTV~ann2A7a+44|5woVhiE5G*$ zSb=ero#er5q`om=$3fmzDQ;*Ae8RB1aI3k7;ci>Xyc;gVjp|TA`mL6Z)Xg}R0^&uL zR?2N~847%V+~)OE&*Pzd-}eD{BqT+fgwSFaLdY%^*_ADOvSk;B?3F|j*|TTg zjeQ?Owya|x`@WAc_OW}eyZ86={9ex=&+C;}5_8{kU)On_$9Wvbd8vK`Z7&~{!%A_f z)}%*w^x#(7>q2@t9>Cdp*+`5PwcO96O6BuF6{Qm?QU0JM8!(S6nMsMvRk-r8z6$%7 zji97Q86D5kSYiqcWPi{_8l7%Mi{MK8qdMGyz2Y?kZ~}@SYPHjZSpBPWz{(eyoe2oq z7=AOy_nR5u{y`jcmrtPLwPjBvP}MWl%xywrE@1p@Pd^!MGbBpea~~8~)6UX);M00} zJq#FyV@2q1e58H@T2x51bv}Bq;Xc}yxdpVXYPMQWtc+f#The{7br-5!pD{*q3 zBfO&@BJ{lhfohG^;<$0NizMXl%o4xh09B8F<@A6MXZNdgoYitTuP?HwHsV}im$0Iw zH}?S=6{b4L?mf!z%6Z3+WM#ko-id`m??K58ciTxm%YMaWIDE)+4n6e#edwv@pR#ZtPr`tUWD82sm)gc5yls=1pZ~4Ua0Ql3 zk)yIMKqsJ2=D!{}VU}l^aYuOG)2CBN4+4nTG~2QAs`;=Kfpr12xO%S}h?Oi=ASy$? z*d1U!b(BT7`xz>N{z`qc4F8ku?D#e1um!fxl7xoKt8xxaT;qkB&uVfN))wIVFv_0Hx_OF9u<&uX@y<1l-FT%RIQ{8uAamQ#yH7bqp|ro-3|!F*je!p>!XS6@8YO@jT!^nw z5o-)t4R55muvYr6_Z~XLTg<2Or~xWjHYK(M=x_0zVI%(cEo;=1xUvk;v`k}x>v&4I zGhXvSMP^H0?ZWx`*yJ1H`Pt@I_K>1=1SEL&7?J!}ci=A*UWZ@_IOevbBt}E;wciM) zU(67`Sa855G5VAqkN5gBL^4A#HoTLndA;8n;m0$7LHdLrB=|mLTPKRC^WWy5-oL;@40@+d$LFW1D) zRh2Wu!#WcaOV?knwEtVLRYbY%*kbvZU56{mLj_85FPHWd!}9two)*-uu0FE<;2gDs zkAXCQ9OyQ*R&;dpXazFZ^j*S=3Wx5+E*U?7@ z>|iC(C_xc<$1Xw4e5^Gm{X7&ZXuz8@dRco%V}NhUeqAkw2T`*&>J)l+2sjth2;OAS zhlYb?SA`Dt|M`?_4CQ5&U#LJ7#hMx{%2x=>?Qxh@@E)`U+I7e*mAo2Ut#z0w$eatU zqQGSUAR5H-^JS zyur~EOY^&YXS!?qf(V(j&CZyPbg--&+7bT}TS1YYEwbxkesbM#o@TLJ$UK3URaphC?cAu(66%=rs-z1j{-kLxGr^|_YoF}>Po$T_ zwQ87?YBi59pdjr6_Fxo*-S4aNeUB4d#P1NJoTP=UbP`gjCZwP&trYwCF8UPSbWf}` z0*bcUz4ol*%}*XBUF8!|*9W?EL%iR4-L{UwnD{?2w_&$aWeyMO|gX+4%28(qM1O8kRyH4WAueLpD%6;be`Nm8?qZl-5 zNdDeVd)VMOk9p98^8bbe7CrWV%palXLQyBiZ|J=FMgGksh(gAZ^;-N)sr3}#x&RHp z`(C#O-^(Sxb+!(8s3joYmbCJWEo}I@FO_M_Ml(%Swc5#tVad+WGIQgugaj_rMB%Bo z9a}hyL~qCBB?#IssFE#$@8zv1C`l4-5;NPHr!Ky9GyQr0{4nu%J7Rp@@$1taLR-~p z_5qs{TU)@@`}`j^ri18(?b3&UCr-`MY4K)judnQlR(bBYn>1Ihxu3iRG{=Kho+P+p z_5Z9jPA@27MlZ4zvG#UHwh8E|lX|3lm|=}i+0Y!|cHv?F=>H)xJ4Jp}zjfH{_Zt9M z;te;DpbG$ni78n-D$Tg$ZOywLXYYM@H(O-EcZF-7EShIm+|5=V-15#pluPIOx23Xb zMVtb|UoZh5=E*eN&E@ZNx0SDTZEHDO4|&B2HV^`2hUk^3$6Zd{N5)|(;j55(YH=od zPyQ6qJ4p>H}Zd)>ko`kiOixG)P;fu zhgrURAH_Bg5jH?)t{Spubb1Ft+~W-t>d4P1cfeq;1&e4alw;Ig-GsWPFjLS*^Hyx& z`bKLAbqg32LGEb&z(Q_5Gep~>bHEg=w8+-q`%d6ktfeSDJDqGe*tr^g|7VzAPP<^4 z2uVl9eUbT$|8ErM|4_rmOMt1~C=>cAe8SQ$6xsomD(IGuCtd=u|Bz%AbeLyiZCM!x zp`Rdi6~(Yiz$533AI;a2!!%NgmWofr5{R;-7Q3jy;~k*(P7to>(|if$v8*f4l;ktS zUya)p*Y$8ImIHpwmW87{;Y=yp`8gEPut@k!;Vg3>P~R+s(?Rp-X0>lJl4sDdR@C95 zgL>|JyAZuDAGXa?$qejouV)_#zZ(-0KCZ5GJb@lNL~QTsJ^Bk|&&BVGyb59CC-tdi z8D&q#$`^hvKwYPhHHIGm_vkapr5#8J;j%eZ1&pC5=sQgTUm>!v?+snfX2PryLRZkr zL5-!|aTgBquhO_DAl6D1tE|_BgC9QxoNu9qfj%054f!zn>uhOWxvU~*9u@_KW<|fD zhw~LUz5z$U4?oTtKbfjoiuI1m7`sWI;k48p^UzpkZ^R<$c$!S=wWT0Y;W0FA0Bm4s zp1owSH*NoB03^>IyPxHQ`K%YQLOIT6x!~~W{{X^-vqd*&)Daj00COzX#VQP93y|6t z202t+rV!e|Z5B2`z-m$=C4sgE_x3*p2%LM02mXPZ1OA13WvEOq-GcffiBfgN1wK~! z+yp;Eo!YNm-*L|d;@-2$kl~^GjY}>d^a5Kn&bRDk8^0k5=79fM05H1 z`c=^3Sf#tlfSvVGvkQ2U@qnV-8!Lal?mgZ6zm^=T>tXYN1e#B7Jq^Qq`>YTL%Q5x~ zL&)3cWK?pY6+*PofqwtmMTWve!BhEEmefV+f?N&0T(?7{?V4SI-)%n-% zY(=mb1$?5;gjms*kn7Tx>jtN&ZUR69jboaZ7_O+fCpsbu@ZlW zB?!B}kl7#d-vGH<6T1nC){xzrKTCD zB@xzw1q-4@@&m(N9-TJq4gM#cE9DwpXB;>R2b>oapXk8=TqxK*Ba45hc63{r%}zAO z8O1qBhE$b=Q6;G?p0HWgS@xX#v#X9FD%eY`o@Q%< zzFC$3%yi~KtZRqVH&r>w4uo$$OTL`oY4lu3FR1X4GCpo>tOdC(-`!91E^sYjZ2;9@) zspg5vDfRWCi6_gEW*E@i;Fz1sHFiV5lda#{TO6}D2N+R4OsB*=e+R<^;5Y=yA*@s7 zwfyrrC6FLB8NuAmt`Z=Qq4|QkWfItcD=2~qFBOs@&9%f8A+{51TIFXLo_8%7lU7+> z*Mm*TuTcrSJy7)9B z2zYDhG~}?tbCm%kuv{><97f^aC8bjV4DO~AvZrHzmU_Va8Aqk_pUvM_RUVVRX3)^q zwg9W~PkaSuW6Ldp!HB3sk99Eavyd#u)cw!orUG6UqUyoG1{(*@gI(aqz_{IQgRHWb z(`Ta1Vu9&sLk12#P{@x0x%jKA-D4Il-#23PUDA)h7hhqENU&ZWon!K06|J?%o_&}G zI7O%Vc`BGm4R+HN;tu}gGExd^;Rt{pdHy^}2?8H5T+JkP=G<z|N@W!)1-o5k=kV4;F76j{9YzHkHTi_p>UNANMXY-%1 zPtA5aQj$ z_LcXCQ$Md=)*#8!sXyZjXptb-yN_*^CPXnGRMpAta!l2Moe5bVbo(KmfTw1;ZwgdQ|+wC3~|BLGCmvad`I ze>g<;=%@6vN>nXJx)QhW(8!r?M+#si52kVv%3$MI59&b;LPv-3q_egyX%^69pr+&O z&r84`PYtU?gQ461W@j^7SsGh!U@fQT{wJTVLX>_(ylNPgKTU<64H&7^TKWDuQqV@r zMotq!J*FAR{ja0q)FM6OH)_;Czc4>VR!+RdrhQr#Fj507LwUrFF|FMo5U^@KU~B!` zXkdsa0q4H{6EXyW5hdhbt~hONZD>38fo!-iLj#Z8f;JYI4-$aPJ>V@vX7>?b3xI}y z!c2iZ335zf+|mhQeGefUT-dB>1mul^zAADIjBAi1C==M1&|p9aGAnf~)3Fr{q%R&P zfr%+-QZH&AvhmA96M0qTW_$o_>B1?&RRU{MJi89Ofc3Z^+{{0N5qPO+goBYTFOury zPzKFyg`}$6tllbBz%B>If@TcFOXhVR7zORg>T>$1T=d>9WOD)pJ~Sk=0(@7{(3PL0 zQ^ej3G$I8J^RTRM13Yi#6%3i4uxpgiwM14r)vYG*U;@ie^8N$#$qER__U-C4G%0YX ztg40IV6f_*P+yK*$aMbmJ{#K`h-cH5(2QrNtk226;Vv;3(O(QKyJ5`G#Kwv0>5xog zFp%0IPr74I3Hoa5JV1|JAtl!M39Puw$##EZhcOy5`G5~~Z#ytI73rJIFj|I&#s&U2 zFErgt_K(oEn1H;{&^QjnK0?MS(4e!)A0{2=-}Y#)*ajXW=;DwP(}%RKfVxmnL|l>& zp3<;fMJHV3H z>7?fx!+ShS-g+o3+8gDa{{OG#oc4f>XR~MiF(f}UmfAO1D0;B5V%ptl3WWCZBkgLs zk7myQ^Tcp1=3D{zgv%)1^9eu_=E*7tn#^j zqvIrNjv;H*HbQs`5aVD{SEYtqNa2-!5fTg_lvx>Wv@b(DC)4LFFFi2{lyK<$|7{|33hWJB%IXr-?9ZzKH#V#NOY{M>O&DOd*nwK}Q6gIKD` z18GX}!)d=&PcWn5_zu-*ZO~SiRyuA)2X-oC6reCjKoUIO(PW-l&3;`j8hJ2>B z!V|BSG4_?(;!e1&>m(%s0SI6& z13nmT$0-cBvvGI_!vYT%3wW1?S#io;?;$_6+ZpD~)uZs(ql$$pDFzUQ5PVKR;{aVI z?uqd&leEa&17}f0fl283!_YFZft{mbmH52JsjSR|T2K%&bsYZ$%SQubK`kwz4Zw?) zcZk8NzV5ad7Q%T)b~VtT&g<1TUAP|hb(X6gRMpHP9QPDHi$804NmNWI>_Tgb_(WlqC;@jDozdfM8)064A=U)?K6(rnW#93p`ws5 zJY=kaA}Yh$jvWIToq+Q+RU9RV%H`$m?{nP}Y#n)fln>3*=?Y@h81-!@xu@ zIAvsZ_NDyQjN?V<^nl2MAeQVyRYw9>+b_%J6K>&u6j?c`mjPwr&t4`rf|7i>F4xEu zjkCsIDM@+8m?)dEdm^*j2_~d!FijZzT6X_!xX>)>V5LBq%8+ zV<3Tal#2|q^)Hmi*>M`GwA70)!>;wixKxR8izdzUUMgBT=t;eNR z!j+Xnri|jNFwG;7P#u3mlfqB{^Fza3+FlSsqku>DU`05xv?75BD3qZg0>xw#v`YW@T{N5fDnaP_eVl#@XJ1zo@0h> zTt&M{W76L;ZOZnv3MqD}Xl7^%PPad+pn%8Uc~w^h%8XvBYfP}$hK%kzGk$x$f&?!x z+*sMYz5>k#Kpz(Ij=IoAf3hHBw@;@2p`j!P&!NV}$e~L} z)`PRP2{%urrPKOND%r^7a+{%N1+VTFY0!VUc-gAz`|DUWg9~sHP;x6?tvt6hIMRG& zi{NT2i%v>^@$H&ou7*%L&-HX=ehyvPKys9nN_U%*`L%D%tR2wcQe;et_>zdCxka>=@5AT=uE@-H7dy4aMkdY8 ztbg*aA@e{DE1NdaMRgl}(cZo}y7iJirHqnCiiQ3Hg8(CyE7fQJ^P3Z&>|rb)1uN=< zepnCjIgQqQsMr}2ZC&1V=Z@3shADpx@IjEi8O0K)I8VkR$UpLbK2~ib1wT16v;JiH z*JhsKO``hR=S*+;V_;?)2P|CCL<(9OWp>^S$B(I9&n4wa>y=#(mJm%);qqu}H*@iI zb+Q`xeYYe7ZQ2SBTjq0iab$Jw{D6Dy34fC`0cQ)oY_?eHy6HfuNBAWg!zY!@#-DF{BpcI`j&y2- z_f|&6RvAx2sFvO>XyoetptV=Am>pJgu^s)t%m)K!{_^Pe0OmW!ySXc8P=dxyc zxgV~JVgqj%DWa85sX;yLbLZ;~-!9eY-~^%q`Z3BUq zS0Xt%(URakC2sYT74hE+hj!qXD=BZ7jg#2z!b%aIq4gNY*>#30w}4p-H{vRf*50zK zG67+!x`S4u*!YH=hNquxM02xn@+&-YtG zLVQ{84w`;GP6oUcKi8ElmRJ4#uwTa&@AO!xB}A9RKXN474=at;=^f;S>XGU0 zGSYY~e-u(iV6Kariw7=omyQIR`483dBlS4jkFr6G31lJ_!R8d&_C`9Ad^{mDp>U!D z0UL3(rkhYMTi*fWS;X@%~$6vZGljV_RaVl^~8Jv$GV!_!?wIUMAZMI_ig|L_` z!}~`4;A)Rm7AMw(c6Rj?=-u`G*Ia_w6X-C-3_+G7#+7C~8b$wBPbR=|R(2>=Qhu22 zd!Sig9epN+b`<-;7J)mEeb>&c`HjYhXLgJ!`x*tQ`X&TBE{y&lYj8m*crTaSk%`|- zp6V1k(l$PoHA`XK_sa>* zUCogLJCA}Hq%ufsa%kW9p7XbC$f>G2?l8l_DFWAQLczk?iFw zrw_KAYM!*O$eN+3n8d;mCx6}62I}M80wqg1QQ`Kjo{?-|``Q$(-Lc|5qWHPwH909R zxUE#(`)f%;d{TwgrDUXYMIck;3PI36gyHUrziCa!gzC#F)h7ow8(x11AUQEf#Y;4v z`WET-6dvkfz&Uy^*Zi*Z3#REcl~ z12M4D&$I0q78E@N6|G;Yp{PJG+?d)^1;4t@Q`dcrp{G4en`cTGipQ#gsn0$>7875+ zlgmuqx&qrwXEB%V59X}AcXZ+L{M7t{A!y|{(OWdvlE^XFt*NW4Qd+}(e*eX%*~spP zg^IeWRO@@~{9aD`CzX!K!PV*I(STXzPl$!4!Mxs;+-k9E)|9;5RZ3wWjRFyJPimO} z8wzuu0Q;lN7=9DZ>=jF}=h$rQ9)n1I@ayC*usigglN^MFdk^DoL-t06E9`2_bXg<*EJ=j_zX= z1Co7ViP7!_-#fxaf`?15YnJWJ1K8O*Nj2}y){{pSXi}2=xGORN#h{$B{8sDASixr> zUwC>7|Kxc4+%vY~L!12e$yU${J2TC}8i<1TGBFkU2uMIUPEh}TQ^fDZV&nYOa$J zlqhAzvGs@hYZh#MjMV={+WaCqX=Yt{p^SO$db2#TZhcatphgZWRxO)S`B#`?L3&ZS zGF-6QFp|`dOEKUmyHA?j6B(YY?-7|JQY{NE%)jg`3TiB$^Yj(&qmi|c#jx1KmW`jG z135Z@k`f-oBdLYF38>||PYEP~b_3R6#VkN^g_bK59nT7CqA-m%_Z1=DNyB_tdTRSg zaS6zW5xrI*0QoEyrMC3TjeWloxb2tg?{@0#+})HX|Dr^v*fbmI5*;{tMOkT0a$H|O z2Edu>LkZtZe>RW+vM%>tqN3GFYaI$R8>$86)Y-k-q%Nwf!%tmG7fBWKDC*a+S7)qb zcqnh}>**~h2XdEL4W0X5?we-?N+|1@?W@F&EP?|FwXB{i(p7{IDq6XcjIL5NF}0Ou zH^C+F(3{Tnk;;+HL$JL__vn9n2|Y}^^{(%5^PYqqc(4i~+bGUYUvjj^p3dn87erne z($8&tCbf^}cI;Qw0v6TZQlnfXu5C9|8nfq)u0xKx-r)rIdB{z_yyM&| zPS*4wfJ+;3q)=-((en!V!-Aiv{trOxq|tB-P}tXb((w7@?qe;dK|?rU6dqsw`L zR|ioKZ3n+Ni^!>v0pE*#hF6-iKC4u9+nuH8yI$MZb!kI|IZmsx@X-TYcO`}0J2Hm@ zqq_)S810vuS*9bu`>YKV&JDYjAFhh_UoX>rSIsO>%g8L+FbXVHVOnKh({r`s+UiW` zR_Wd^-C+fp(xf%yJ^!f(4CLoH#ICglA{i;^wOFdWM6bqQCuq~7hJ7|Sc53;W{D`VW zSDCkyZ=9|yhBcpwjn#$8`t*n?&aBg1K;2x4{+Z$7*$?^sguh0H^H8+SrO7!!hg~igLp8(aQW-D2S-nC^KSEE;})zPB++YII+Ofm^+}c*wm^aCH#k zI{0kC@FBUZPldydHT+uy#ge>=0<0e8K@}gLu&vM5_-@{3se7xx`35X;z2{p?m1k!4 z`-CvBGFQ}+EvfIr7^St*I_i%Njh}G^>gfv9-KP$*^J(Yl1YMTeGClLxt*vNlTy4pw z{rlzJ>;y6cIY?JUMZ}z8rYHA@aJ?n8S571Q81v75HRiDVx82x{3w#jA1*@QS2-y0a zQ*&+K{lp_{4i8m?3NM@O82bgHnOg2^#h~? zg+8qBhpeqTYANCYg0JWZ+^En3NeJDO5F+Gol?8@)(86xm1~z0r@}dc)O{~B=e7pfb zI~&)}#c;u-w?c8Ydu8(2*6cM6&A7~9jU)PjTbO6GS5XjiUv*J2i_@`uAx( zd4p{PLF$Z>sfjZt5ER=8JFvH#{sT9lu%(4YlkLU|Hl~JYdY53vrf45^FHIb4s7Sv;dQgX^L0_g!X={X8UpEEOl9oZ=KrTmRX-k@2-p>$$mRKe^XVc&rBBvIq<;H2bbexjTPS7x?}b95%{qO zdS&r1lkdXTUZX&fpPgB60F4?^dZRqp=S>Vh8bjb~cL4PdlYjO^C(Nl2mNvUnum5;%^L|Xk_+V z5(n4v%_--iNmX6Es_S)}pjvB(v2W-^jxe~KNJLWBM9$M+fBF59(`R|_k%S*K&GHr| zV0Yu<6XHc&w}OUlsw%7A|F3ff$uJ;Gb?9bgC%_d>GXo)`u9N@{0QLd|=4{~KuI6f0 zQ2mp_E{|@ztC5~KJH0mp)qHkN<(?V@0UAXpF6IxZe2h6f)9jG0h}%Vw>J0E ztul5MOIHn_^DS`Llq{9S5!jWz%^3fkQVkgCW%5~H62(ocbR`eB{Wo#aLkCWO+&n-< z(AS?RT_B=d3rP+{sMeABcZSr1-vp`>gjrpjU6pm$<=i&+w}j_n=R4a~@6$eFz5qjL zN#-3t3X4pVeN_RQ>PN>hXx%&ah92{(fEX>>e)Qv8`}Et2@9Tw7+JI_IvL1>Z#Wncx zq96T|N`PnfZ}kG!MECdxOQ=%P0(S4yIq0bgZyK@Gty`&bwdn} zL-@+3!?-{r!XpB6*^tOUSq}5!!rgU~s3!*}-{}V)B*vKye0|3~&72AF>DtNLior)F zUqh#R?+1LFuy9Raz*h7E8YylIz_6=jho=cftjcknVUZncQR)1k0e(4!H>e56pA>-( zaHKPWR=v!2@zHx5cBt=+)k@YfgYm>4@?nB`!Peg2FYBMw8|p7U-7Bv!UEq(aUM%Y( zi?MjYx8b>QXV$4rhK9-Y96payj)dCvQE)^OPv6Q)@bf-CcB7jHue?>QU^+(tDY5iD zt*nUFaGOYVnzY}p#^i$ff4{XZ&&;^Za%d-}Gk&jNu#}P5edOelfc2pg_rBngggV2e zr)AEk_qgYjUQVbgvtA#hA83b54OB0ro(zy0gNr7jTwByeG9Vx%n(v{* zEfAsDv{>Uuj@udEs#Us|cMm=DO@!hOmX1YgH;2Uhy1(q*VNB~z|Iudp_F$Hz**%ED zJ^w}%PU#=Qd+s(>KvX-db*{?q%7PND7v-B5e7`YRiboD+hTx{7d5r#yd?LV2zFrM) z)5t@Yg8S0U(Qw;ON=W;`{e|7+Utbk1@h$=?*Sn2vTNm5Ca^t4Lnb}(U%k*G@QF1-Q zv!{GnMpV%5v#x*%*-uf_H{T$(MaIG&+O|B%b(t)>|Grk-^WlnRwo)8lV8vt`V?=TR zIK7Z9ocFcueTx`W?D|L^u>;@9*FmIa{umiW)U_?$EFrJCYW9{o(fB7%KL_lK=Sa8C z4TnBn?D7sFJ~An_>^JXxdz{8WS%a{c^z$VR=%V|QElUlxc8ca~ciSa=8{W89mpHX~ zx4aXIt8$h<(8tfr5RnVNaUy+$xQN7AF!Gz<(y4Gm?jgsEpbn0@{I)R}Qp6TG~QK0%%jwTC|O`Ra(`#y{3=HbDPZg)(T zfmXT2Kw-AjDuhc)M*I@!6TNc;$(APlcoDUnZAEcrOL|Pkn1sAw$_2B5FHHjE$5WHs z&z>RfNIa#**^dWaC--vWU%xDI+W_hKltJX~cD3VWh3VWYGVD6~9?leR@Ta%ReX58* zUTyrktx>b*B9;%Ry%Os=N}!2!Y=*ZU%&gIZOtrFWqgsOnUB>;;tJZn^1q%y!^{Ix6 zlYVIz($^mFfS}jmOQ(5bwTX?b!LS~DRo%|=%{Q(-&Y}z;UQCzk8~(3pcbb9^*e(rb zx7MT!iw)V&joM>u7Tqd69OkwJDVw~y{`hd8g9x|&R6Q7LI5}v`$8IBP%Mb2si;qj} zuh$FbO%(%RjcWL1+%(b_lT1tobqmRi4-erR9fYU0Ag?UQZT!3=DlriXpzJt-F#&@# zOz&R_&_zZ8mTSw4YU-%j?poNj;o=htN=A`qfUt8bw{`^tBxpvn%WV|_Zzur3Ij+Pn z(?3%Pk+q%)Qmz=SkHgwNAB3>BVoVe9{Yl=)!`Zd@yg_A9WJb!cL0iNlI#xR&;;(i3 zr{bG(s1^5@jz^f|PdJP|QTJ!6yxso#PRpCFZQ8iuV6?l32q{u1^_2;Isy3}s^nB*Y zs{Uvx!A`+l*Q$tN4ut6DUIh8E)2U4`TRhiRw^xY9=Na2#G5Vy+OWByn?iRru@puz< zkljDrfRmXfs4Q)$bb+G#{N~@dxUlh1Ly%enw^4sq=M*-$r16VXydAl#YgCyacas&8 zyOZprt9c)LZom?%od+{cgkQN$;$~OPsfRC4kM)KKPsTQksk1(`clp(IOeSbP{w&S| zUD?xidzh&)7JV=8oDoH1MJiKV1%Bb}_fLezNn`NV7P}}-Cf6SNlhkYFTsTcsP}@2D zu;6}h=O$^zXA5x(gW4-8H>~^8VDeyUf|UAeUof8cDTXyvY3lpx?S`k{j84QRAU zs63G&^5Lvk85k0<$7ClSV^vOUUPqin4{3Px)jl`)U73|UJ(fQ(sIr@B=dd+&yZ`I5 zSPH&od^O}A?H*?Ks7`Pp>{Aq)Gs(;@o}>4GFHmElx;|tClf>@9JZDWyI3hR*-ek-s z3n_y;+kOujvB}WE$m$m6O6=L)K-4DJCY=$QA7eNsd52*^+CjCuA@VTKJ+%Ln{EG46 z3G?_ViPce~iS2Cz`nz8$L-qy)O2XacPN3$#Jq&ztQ@* z;*#`lPai&KX?u5qN8Mjh@ufu@(q~?X+JcuPvSnmw$Du0e8~KfLC^OeiZz>SDp4;YDS6072Jmx*nm9uROrWFpYV&X23u^({}GkJj-{pi=WUoEisbI|Ei z?GT4ji?+v63Tb_gqj|B{FQp1&^?UJXg}&ZSa+$=hoLjw0^ZhN{XL2%qmat<{ab+~j zC--2nQ)x1(M%v?SbU8Xr>OHwu^5-on{yTSIOL=Ey^78Uct*zD_l~q;m*Y#&ezX{yB z$sAs^p}&MebBzRO0azsA+R+Ii(qXN=#GXY#2n2?@znYR&SaZi<(Q z6Ezex(d-E8qo?Us!3DjI_dg+mBi+=$#Sp&}zsh+dg-Y5@E6hZAp;w01l?z*Cv@jZ6 zAip_UYAvxsn_c<1ijROJaVB7&;99M=aoHw$-}S+H8of$qZ!Ug9`s)g64A6Ia*mr*N zzq0SXogqJFu0!RSudfHFtX+zp7Dy0?Fx&jr7Jstov*T4jrkN|by1WXt3n@RL4G6l1 zlwyh+V8MDc01Eu8)yWmY8gEr_#2UA3<6(TQc4(;k~;PH86KircA#a~sv zWg0#>OCbKeEikc#45m9TddDGa;vnitzOa4l$3Fz>Ty4~+r@^Wwu2lCVL*DKTZ|;yU zUs6kpv7t}^I^N&mC&W#O+6Ac_h&P^cS!chV<}fSJqJmXR99CLkO>1KH>bS92HCoEH zr*$V}-$qLL!)Ft5WMj&hu~k$zG` zSK<=FXQk_}R&)4>6A;V-^G|<^>pf8V+EYw7tb423tK0E9(1!q$x0yov_VCRG)*f5- zXI#A<&!A-Xh)$=%j-kW?%_=AuiIzMH>ghSA>dXSqx`r?#j=2dKe?MCzb3?SZK~cO5 zA(qehW&^S8qUhAh-6pO`xhRa@BD`nNbEEiK8*@>o*?59czPHnX^`G{8QLVe{2X^^eJC(mAbF+M)y>KsmB*rA&@`%@D3=~8O1xemAzElT~ z#ym#ByC2fw7#ojlP83 z`DRJwg6RBlxB27U)@_CGwlCnXhA(O7gJ}1X6k8d7bZj%G+dVay{P}iz+-)JIU{gDF zLi9!i-&2m(Umacq?`@}brzgP%-m7L+_AQr83dUYWYqKPY*s9}?ZzGOyh=r=c@kICA zYmpL#Q!rTh`nXo%mbXenyv~Lbc5O}R-8=SNZ3JnAv~%uU(yp+{L4yCn)Xx!{p{OEJ zA=%VHcPpK}?r*wZ4=ZvC;+(tyld3knmo9>xlJ=8pw{KBaC1g|z@BH1BGr~0pOazW= zW@YKS{`6w_UYs6(s>mU=ZYuFJPh+B2kVDd_8FyFWKJ~|7)x(ia%!>1xk?WU1rssW? zbz(3kgh30Jy=jQe^+UoHsLY38cuI6J&izf*XMwYk!k@DzYtJzpR+z6BI|O^uSd=i# zQKxEs-TWR})$wO@Cs%HFk-F3^*@vn(%4gxn8}JIlb~sHZ=`I&?1&fYsbba$aap|s=42=;}+ybF> zEjeHN`l!2L5xGO>L%K3IOmQ*e`eG)n9EOC{IHx;xppxNme zP8an(+?^i2I%d%fU}Oq-4Hw&~9Oa{fEf(7`TG{&so_hV@o1pInY}5AAm!(|aP~9cB zlEy8~B@?;XtXzb&6BP}_Mm1LmdZ5N*tjQw5*Wbo8Qn}cU1ZL^ zGX(zo!`(u}phw5n19UVCyef&;=AZ{~Wk!`h#Sep=esC{< zgRoqBWRB7LTG7^Rcf3pTLV;_;nC9HaM55E<=6>RjX9>cEY^*ocijk-IS|YV#+|H#9 z%n+Z2`87~l{-kqlAEUf>N9}J*9&%Ge7nsgPoz3|yUG7`F9*;7=bNp9a|7J=DrKO!d;LNdofVC>mqWfm?ddP+t+6N+1;%k09;( zbi#K)8T29LxgyL3KWgXd{q~qJimg^Dk8!cnN7)H*R}|lVZcA0ZYn5VFdGe;=)wS-^ zCV=n#9w6U6DoEFtiz4Pvh;Aak$7D!Vex-bExvxZB~_Yfm7{n(+*G9xi1*6ZdaG1D*aXRT>O zcB2o}kx#hYFD*Zpc_mXY2CH;FxCT+F!2AJw`<5`0|MW>dX#c>gw`QvA#aVO!>WoJj z+n=^O7cb#DWMw$s`*>B*`URj7fr#|pRw|`<{iR4umw8mau8N;-WSM)#o^@-nW(Q8P zKk<=mak+hm7I!9m=zZSg@0&B*lNIFgn$g<345LZl5*B@>ZElGIgWVD}S!%h(`R2WQ+Uwc6?AwQI!)-d+1eaO}g*a_`flIQ6ryJO)0Jt+q8Xt?lxECZjO+wPAy=De5t&p8gd9fdT#>#!fb+67)f|9Iq- z-4|4L#!i56VEZVBnzCO1i(Ac!|0uef5QhW;=ZPfM@sZd<#i*tB*@aTCEe=>;|0~;K z`+_sPE^b#?j!Lgf>|mneW0*)w+sMfJ9uQ3|dVb!4I7BnD%j9pt=W%805~iHgjhiBaFRxtJzDU=xn)2ua&Z8=&|8 zKOzbg_!p{*W`o~Zg4|d<;(*p{34b+3MR)C4YRme;C<@c+Uue~Q4SJJK$?JOElxjeB z;;GADnZ-6PUhW+gZTkiRQ6=c!qcjC@rR}Q})myJ!_Dp~yia)Nqk2>j1cV}t)9^GEI zhBWyHa5CQwV*k1(kf6%0&XQ4jefyzziq7d&#XRe^S9_>FcZTeBXI#@<#;lt?#!2|Ig1*EVoDzFgw$^c zjWi%~LlomQ#*GGZLimlx-{DSLlaA?~%vp1#(B0<8pudBe-AM;;@M@3nPaP*o)7_;| z=*@+uwmR)ES78Zu zxd}T@LNc?sDC_Ad4$f{Vyy$)T;>CM+?$ob(si|FAUnlsm67-s}oj;5Mu&7x6{Xm*P z+xm2z(fV(E&uL{<<+bT4hL51xlVJ@uYY)nPX0K}@$O}}C`z^H*7BPSb`dx1fMw zqr`yM0>~65AO60mX+R*!2xh>HVGSo(t|)uHI(L22Jz@2-)j}-MUcv@SU?v{}=@P-( zAk%`p77r3~>4NBi3us<{?MZ?cd-ADqd46oOuJw-R%7~_o_5lQ!mUROHYz0S%$<&@PzFN{)R2gp53BNcQ?3itZ5Zt_BKHsa?OTAPEdH>4|l*iSKzisqSR@JoE!VjnA;{ zh-k**ENHeRW{p=lysob8fYNZ`N(bfy+Uw>- z8;eKR*Cd%Iz<;JOU5^26lw3t~_|727IK8{WT&F}>UG;BnSMZ5ld{t{9Dk`XV4@A!c zb$UbeE)(lzUMQ9>{q(4TlH%5(_y$(_aa?k(cTqy$$hG>m5gm#L8ooN3R#)!6p%%X| z@}%g#5qVpgWF5l^V41&nqn(N0^wIZ2p9i3AiN(XO&m927(C1y#xQO!*0i?-lnOT3e zCzCHgfe-2WMPfWZ`L?QrI_$9l)-b!PW@;I4mB5DN!_~nh3#DYSYBg?0h9KU0L`i*$ zERlo7Ku)|leAMtcU0(_Hq-p6T_^Y9mwtaiI2tkR~{)rd?g6xbhQTqL@ws{Jh$-3y$ zsr7e9)oxEqHOt2dQm=oL5S=-l-j;5=RRb~_>>kD*93k>1ye-Y_kA%q!i|sw+TF6l_ z)y)Tk!L5_LuIH|7y4?tjvT*&P6_RW(C$%+Ke|pQM<@UXqHPzeVF5ko3XiBa5ESA<6 z0%?B6-wFxLrRS3RF)%bj>vRFAM7k};io|-HMANXiYulPEcWnlooXj?))90olbG2jm zZ8L=SrKJf4y0XLb{T8oJK*}mGT;NS)403mS43N}f`(W+^{llW6gZ&Vx)6&(-JRULy ztr6aGobwJ(;I(_#SuPy5CutwJzI_DxyzOYsd~&fznJ@UaA&hP|fyW@Wb%s9Pe<~Mb zev*-|g@hcf(2j$D1%p% z>XsyDS2{ZMu|63PfNd9r3IhLt?v$^&en*%sH2#*6 z>Cuj}zskox%6KU@@hPmWKFxDbyL1f(_73#$oez4S+>hk^Ly;ee#UAFbJ!${)R}pYw z`9Ek&@G!-*-ETs?YYEvJps$7LmE(FwBXMJ8#seLVMCr;Ry9tESpaQ_}0F_+@H#+JF zqpz?D|K!48+WejRYvBQd0I8qK#fxYq+syl8z8P zd;a|D)vLz4lAN3urKA>O^t}a4><-`4^WxkuV-`XLcH?4t@|Nws_Qnler7iku)NS|{ zPg5f=MJN&Sg3QEA&1@|5bjRe=Yx7D2t7S?a2DD%D^k{riv=A&-yShL`!0Tm>120v% ztnJV$jjM*+WVLq(DG+#pwZjauj4UX#hTp8GyYV=PBGcOxy!gSw8q2-=5x?VrYMZ~u z0(4|xet^CkxRsA1Y^F8F$pKIIl0wT%^25&w?-6ioI<`x|uL`VB{TX$D$-iDE>hZH9 zpqc9%;Qs;hvOVte^!t;Jlw3PDiwWSGTXMGp&I%x)I&iL^N5vzXAe#WouaPZXPqY31 z4_R*=7F8RyZx14%D4-xBts;Vi2uPQKponxg(%s#nqEafMbcr+r4Bd!|bax8U4Bh#y zt=-{biHc^-vfM)tnCCaxEsmMv_9F*DXKA;e zOEWXCOG-*w4|{r)t}`%{*-hcg%gdi8m_^GTd}Ms8R_=JqWqCw@WvuE;TH4f9if4Pi zb=4fBRf@x23a!K|G&X{h`;}>rN}VDHf}% zm0Kk>VRk=$L3{_X;LoL0{X+BQ`VA4>sNIE2o4tg`?^oi^uB?eGa*XW{kK5&@c-Ho* zc5`nPxfI5HBRLUzmNipMs;%kG^ z%v3$-h6z8PX|$KSd~YW?S#o$3uM6+SOx5h1IXrD6!>^dHBg#>@@wO<*uG1nObKHcz zaVF)S)ES5bYxhrbQyUzbxJMv8MB$&OYNCkgchK`WZ;YXglL-I~fh%LzX<6fj)3*8a z!(SFjLmo^fCdO^i&FB2Q)Hl>$_EsK530T|?9u+~QI&?wyRVk$1Xz9K?fn!A<_-*%z zVj*!69NQGSbgfX6Q7d|WcEu;}-npCFcUI_~cNEe68+}6DdrM*D5Ob1N*l_pvcn_qp!UeUMq3 z*2u;!Hpb(*X%*cc?{P@B3-QvUYct(~D&eoUN`1cwS)$ zATby}_D5bT=w#kp#A5k*NY%~xM{MM`3pj~?)U9QRwZ zMNMvFZ5@?gUikKNI>ASOZC#m7r}~`)(IWSnjlmt24Sc%PREzCIdB(UnNx!WLo{^cS93ilf0^ofqjVzfaoGCJ(e8CpBL(`ZRPL zyAv99p4gjQ?uFugGZW{PzDJtQ%_>Hl#;au{Ym!L%|lNA zv-E9wnqOP@nylP$j=T?Cc)wb{>U1xSZq&?QSvTI2FTJ!bcb=AC+ylGxr{#No5}SJ2 zd2oG#YgE1U93hRw=2xfey%nF&0@%?9*6Q*}D$`oC+WcD#beG$uL`FoQd|D5NQpAS$ zym;9d;zHE6<)9JI=LwVe}^Y{zNOZolPmKyiXbR$j9G0dz@A7hx z>S!OVs%=GYo>`U_-z5ARVB9dlw&#fRuOec%T`N1}WjCPfe|AYET!Y=AX5|w_6zJ9X z$^4HevY5$Y7x^~^#Zp{Xf(2e4i@ZFNd|s$Dj`{SO^NY=ejgxA%ifbdGGHEGOVcw3O zUC!d$Sv9&pel!Me1}S}PyE#DQ>D7l$1K8kOQkOqhyhjfN%c&l`;bMV97*C^GAyvxI z*jOR!>-xk-yJpD^eu+1y1UIoI$X0iW8gk~fRYVe$ADTWCUhPJg{K5wI>Qo&dbzRG` z3$5>D`x2ojE%fEIfHTP)UM=iR{0H@Bl^Sji+X3CE($ezj3WkNFfo7WFj6hPQnAj__ zuRGK6G{VKPKNb3RJtQ!|*){E~0TWA~%}y?M zhsbl30;8$fpcC0=#yy4vY2N&ChCEgI6$JEbYE4k+MN(t%0aa@3!QRxrUQ`n~%kXDf z?`DmF_VD;&e9U1q@03W4+0j0UA#8XmIcncVLN8l1sP$&Kh{ZUq6V4q?$$U^z4_Abm zQqxPjlqeo1p^An-XVGSZ&d0k`vd_0~oyekfj)Fnd>W@^!RA=H~v=0SMH$oD2kreie zl?8n~whzx`M`Dg8B2md8`FnSexGpVa{d9@olkT^eoLYfB%IO5_(0n3!Qba%XLW zJ@rT{Ejq;lFm`AYpAi=*meW{WV3a$hEb}>J6-d^qVNdJqopewuhWDa zC!g;JE0C|6&$nlP_wtY4GHT}t$qi;ES|}^ya@F%;pCg}W?QgKK`T>%q?eu~&N+$kY ziMdav!flpzdHCfXv6@UpT3u1N-8GcP2yt6dd`wn~i*op#P?hX&2`)Bu!5*$Xmgl2h zvD$#qhqwK%*RU87YlL);z?MfY2ZS|i@DLLV;lm!V3*8kUxc%gk{4lwBO~1_` zs&>O`e>m>MGvOG?Mv)i}SGQtc#DE(ydm`pLqoO}pEasK%RbOEyOx zb=qf{#g%XA?=gK~JGs%-MittTp-J!DKxg1$shj15Qc&<|E+Wdh9p>O|-MvyGqccqU zAY8}%V7*<^;l#VRQf}&#y#dE+k+K7Q%$2k>4HKfa@DEZ=jJRM`LGgPW6QE9ckQ9}1 zEI10j-XwZnA7Uy=kALl5EZ7+J$ywkLCrR*lNOHWgQT5q6ntv0Eb6nxXPVFp?L2}M^ zMmxvhj8hSyT<`t%NfUr?hs5#6qN(fNSKoK0R-29rGG%?qEaUO~`9_ge@Ivp}%7SEq z4vz3Kg>25l$jQtUmxpf@7_B!b*V5a!MTFT+&#V&&ypL(+CY1%Y z$#!|0bkg97`X^nP*X2|c+u#-W)2imEJs3&CbuC)&d-0s$JeB+S{vTEBkP|ovoNde8 zx=;V{xzG?ReA0EvH|V^KO z?ep|`UQTKa)T-ebZ(rVWue!`%0V!PMmJ5hlK{0m(bkz+uvUHB{dAl?F)AhNrpAtB5 zr7k#I57Tp7Co4Bt`wmChuD$@($Ju%N(lt79q}qPcj=OI{K%{lRelS#Szm<9Uw1q6F zHKd?P^&Pw5o(S1=ctd4OB5tTiee<{29}RZN^EIg*h7q#y&8~f$S6jnF9E!??`)~N7 zLYGhTV&;O%8z<&QFP!o%&283Kz%?^Cca1Lk0FO8w_YqIJZm6$ydq-V~hz@(SMV&!K zTkZUK_;_nXXCF5{F#2#f;gF??cdi~<0w&KlEwV&xt_$e?8HS*#>y*lHiG{x` zD~HwCNgH*xj%Ky$4@66f@zm=P>6vH=k{xTuTx@fU$W1@WdAeBlca)_xOx%mDF%Jd3^Zr!I}HV5UVOXtI6oA3ye?o zhd+I#Cv@m%qc)cQ{AktpgY&F%mhlPQ*1Fs_Tu66Ydf?r*WRv}gXa zv-BZ>>9+Vea1GXhlnjA?v8*UwZ7x>xtQ&hcPr@VAKB zWeZK!6P?i7RZ-B#_`-L5 zte|n_EzHrX9o7&y4iM?B&e?Vc#bADPV-UI^l{3FX;%0R3MD#|2X#F7lNyE2PdR(av z%gxuVm4aMXgAbuaLE+e>Czq8_TLZBMw|zki=!NQm2UPEOEeId;5t zCZh?<@|krs$==v#;bd9*Xk2@s#*?G`ogmb#ZK9b3_VWZr1|3Xt#>UH?So>!aLwjA> z#2#s!C8SZAaI!ylot+Re;w~L%qO4!$icGk_E=af6xi}aPfppNQF1C?pb?ZK`r2;=N ztfiaIPuHRik7nXlq-zuR_tUCe>5*|Mz&U-Q~L-Fou1JbjmGk7 z@Et^_X^_Crt#5oiZi{DgrD^W$!+m^C<6T!zjl%m0JYC;dZB9Q$e39Yz+)TX55Tk<` z!;Uk^MGu7MW^u$w-pIbfP_8DB-RU8q>Q|U?!fvyH{W;&_K;=-7RbA&~-}7ps z>3XOe8eR$3DDHS+D9pYBaTVxava5mUJFaTK1&KvFlNq5Z;J7^54jUSU=_n`qG^9mR zP!R!#-9x>TcrXoS+@tjZr+egEXjw6AVXZ^FcTi6Vq7$MU580zO#W1TGzgEVOYjVZ3 zY8Y#vx~&Gn&&;BkSNwpBhYt4c(4&^Be` zgfXsd=hM7*ur5E)6D{-`tk%}78xHrCR`3;2eYwF00@iNG>U}n?8a&pJZ-Llsf>6@Q z`+qFMh^_IQvINRilC#sbvu?uvIsv8H@7}Zxzkb(uz)A$ONr8~D*m5v+SG6`Z@{hBf zmpXroLcr(Rt9eBxPS*)tH;Da=Tjjabj<+@I@TJIJahtT!B&Vc2dG^fcXn#v(@Om(4 zpquV<9oIa)yv~v5%}z}{6vp2q-*hdz%e2=-N$2qezdoMk`x&&p@O@Di&;GXJ-W2Hv`NO6375;}UMkoA>KxPs2cd3v&C4I8 zZF%QUYmPP=iCm$c6b;7=oL~pL$T{xbgLKOJ864174KwN(_nCS{#1X27TzD`N8WVFa z>}TkQ78_(8Q(pVGjxYU~^^+q1oyvp}TJd(Lapxl#ml(XCO|adN=QVs8wZBE5o^#MY ziwkwQ+3q*wz8}j9g@fLCZ!JVzza>eeqJ7xz1_2_+*DL8N&l1qtLRIcN28gQ_w#5Vb z0b{>kcc>ty5uc)o`vB7CB%~Tp7gIa=arJSAWqb6-HH(vqI`gu#QxZb%sxNU1T`cN#Pr71= z+I?hNSw8aI15N5zXf4js+^VC;Q1Q0+gdc;2lAk8vyFOs!aHHMg{>ziy1~C+)MQTFA7I(?ZmoHD*G>?xbxQaG-PV;hzQA;P>tXfU) zRg1B?bERW(i~p&yEh{WS=rEN4en4OLVXTA>9g@Aj(XY=b2-|mAmV#;yw0G-+&&;an z?a+l*I8WyKvpDFM=~Vo3Syg;2UE;v{BP=3}#gF{?eYxI}cUYKy?0A~^-q|kpAShbF z+kLX|%_)x~XjF*_!-Qcj^INvuxy*m2^e#75a7gZp3)e}&a;DNGb;^5IRdVIYU~g{; zH4=l7$2k)eu|t{8%Ms9rC-_GWX#d=*}Hb|BI4*l z*iPC$z-#-A?-^oLL}9+R6h-%EmXV<3b+hv|i=S#!#Juh*Neh8TLSxRI8Xb-$SzX{s z(}8ldyq2ei8|U3sx3fXeaCNQe%)dHxa=IukDgjdGu{u@|9Txzn!2ajm|3k1xY0gXKl`bZ?+Lxdb zGgx|?5JITd<~vmLy*Ui6B3f^DT?f6I7e-gyuv=oY?RAD+W-G16+_(pL9Z+As#zCNI zWdLnnIBM(YUQo1Wywgut)^z|dqBSR{e+xq^Kzku_N5HR~f#|@N>Q`jjSWajm>QV1)TnP`K4)K7Ic1(H7% z{o+-@i&BYuD_JER3*HzM)JhmZg%}cUp2jCxlHIY^hUGVT&0H-7$46Smpnk*R${@?* z7oaRZcyr3tV3J?Z$#uccUq?CK>9>{7;`T-~nXOQFrw6lCSWCqP4;@NRX{)emEQghX zJZzUM4+n%4_X5)h^hR?JZQDGC9DcxuLKv3W+B_%|vBE%KeM|AHDVl;!EwPGD(2*Gx z!)sNb0Y*Gdmu0OABX#_o*8!ShVKKsPT$KkxB{RoTIoX^^lTQt{$F2Jttl^ z{^1jek}_X0Ida#?5fU(@N*SYRTS}E8xOo!N-nI5bOi*+_ATW#?DydQXp-;{)Tc}?) zbp~9MjXdbj(v%bw>kfX@%&-)aoj?y+*p<6C-n3FDBfXDEgN+%t@!HfNeW3v$2T|xC zZ)~;E{FXb?1A!>O@U{>>ahg89AS2V}neQe79|EdZzNy>G;t;BALHLG9{30&%phmC# z&10)e4PW#$%UK?-NLg6 zh3n7PBr#>~SiWiz?~mXEo>(3`qn#?H(!6zkH4UO9I0%sFrR+9Slc@G1+VXc@R`=mp zu`Q%h&K_=`Mc01hcg?3QRdI2|ia#+aCyF7BSi}#%y6`?NVwUTHFmut--dsv?9R>KD z3!SGqGR$t=i2n&9bcJ6w=J@#XicG=-sV3ROmC9@V)8Ffp`WK6`(fa!O(otM^RXU+) zGzXO1!2pkVzfR%e3b?Lb<>cgai{!DJ6pv(6f1svzg@A;8bo$ADM*L)z#Tzi4Psm(Pf>c#?Ti8lTZfe1|)ketI7e< zr6@ZI8Znr_C=VJlF381;M^|{Rx7&kij92?v-%!c)3<^4e3faB@DWz_dhh6OfRQ zNUAP8YbTHUZuLlwNc$e`kn^{yqz2qi^aCEu-C~~~xJ$6GCs=)h zCpL&uw7P>+CUtaF45O>56Og?0J_v23HJy!P$8E!3e)EUL@i>LWpeEnao13=Mx~Cd8 ziwNC=wF)|KdRWw$U?c+*s_q8S)x{O!Es!?vRdn; z-2ANlF(bSIFIH=()+oYofk#yx-{>-&hyU|H^UI~a>!=V2+EN}%8}&^wB=8{isw>|J zmH8BRu`eq^*6-9ks5&9$902XGKo+HX-`4 z4h`=_b;F;HU%?=ET@&Dp2M21Q71A2=Yp+Z(N7S;G; zlNvb;!4ZJ`l;@bjn3_ijb#L^k33-CAq73)Z$*yqP^?I)(=6rYj-3aUyrx5yA&TPXN;;T!dAxP-#85 z-OpVs*6y5{tH79Zbn8AkWT#DNWn$*5@Z!0%@-Nt(1Ze?W-}7SX+qZ9piTw`)h^ICB z{xpW2JtMcj@$>ulJkLFQt1(zQZ-ZLAB`7an{)$(Hk92vEM=WwT&CQu6yI9>2TswIq zdWZ){nVA@%f*d!mou1G=7daV5euE0y%7k4@j~hD!y|xmJZg1{lOZx& zDa2+;G%}}vzq)&jk?VQzwl}D<-be^Oc4Qpu0D2Pivx65opJ zOAI&`GtbDJ;$pGhxxdPU^;~En5p4eyaq>IZA!s6DynI?B$G^OaAOpi#lsir%5~TXn z21-kcSD-^7Rv=E=|8+1DC&yT2ZdHxDVT7G`h9$u-3)?|Y`r7AFtC?^N@dD>B^|Z>6 z(WAEf)Iw?yKBNLRN9pk#w)O6UGAN~jVAMGNQ2JzCD7qF6{*1RlYKpwvLyxI7&&dCT z^#A0TxDEO~L>6n$<@~-#nI&%6Sa}Yihv>NJrVs|LoY|sxaBO{fA;kF36_hCq3d?Qp z3X))erq9}&iz%I^hTxoVT5`Bk}+q#o*@8&w$YheX~t8?S^#*G_H zGi5S>D}W3tt%v~1fqWppGSP8eay?KXAmgKlW;-qF5Y;tB>m+!S9=%Zg`4{clPxig0p;{wzak4E!eo!)ZA*WA!x4YJg{2vp3YnxKF}n8 z5bpg`+jir;l84sbEeUT9Su4iKHxD8_&6Hjju+QVT^G1ziKZEcrRS> zcPE+7=&K$n_X>mu08ei~x4C`i<^Qj17EY8bo%?=i+{dl&~I$nD)9R{jzCY@tnFQeXv`+|QQ1sE*{mgSeD_6YL>*b=E56c+`JD|_94c&#W3MdITTvvz$j4Sc~_ z|9ExoBGjHRLSkTKluyWR-I;y+@d1(JGJt+Q9+gQfV*!-55J`ExI)AxRs51EDpv0Sx zEtb3+?RyTcJccx&AAC>yHY0AN6X9`FluC})7k2MoiO+$e@+f}o6Cvp?C@-n9Gui_i z3`>G3mFVL$l>@|DSwiK;-#U>_#OKbD{l+pE)(Z{Y;DU4hzeesw!E)Ydg|^!M0>l46 z6gemNatluBnxzKRc5TI#T}VFUJVH_GK1ijKs|ZZ7U}y@=BDl68$S*>$&qSjg)0K6j z!CHzh#6D5OVR|P{msXohUMIaj+8vAVa&)P9P1CDxTis_t1R5EzaH4h>e2;2daP4$0 z&{JWgg&*Fs1BMICQK-3vo%1LN#RN8u*x)*|5Bh!h!3;bl08!+;&;cG}Bb*FtW*LV5 zfp13xfJ$@)!-a{s+{~bYg_9E$QF-&%afhHZUQsyzxpgK$p(db=9Rd&% z$<%jJ!+TC*j4`vp!+Dd;GzX2HJY*q`Yq0O9-$#R9W6A{B7WfqjlXcP68oH<9S7*)a zQS>&^3Gi6|EGK+=r=@8N|6i-^Y7tF(pZJ~^Yi}pd#pze>IT`)&kif1#N@E@2(;#JI z1q0>{N={3D6srolP{;>*7gSbiWOv7mDVxpM5$w?cunc1!6;~pJDPX@KQRV#Mqmfe2 z;Hd5~gk&i|?(zbxWv8!#57u|qL!i7IQ5LQgZ7i$lP9Fsium0|rntgUnDw8}RJISFR z9PWyHrq6XnDd)ef-;Yoi$mgc+m&CmTvZJJ`BHXx(ARkIc^F|RCu}neT2G9%14Zb=6 zIuY)_+6^KMtpAh(MPDeTzm^ z-2NUPAREfsE^n?RpBrc*OsmZecPV)j_?=hHw}vV)Re)T(m68>8G;~;jtXSOtfx`r0 zl!=9h)b`@sXt``2ApNNyn47t5j6A|uob|8 z8PMwu$E?rz!51j09YqppmAStH_tK2Ty|d6bxN~;g0byqWqkUIDeTQ9;n+!yi;!F`-tE(-@L}M0ta% zML}QaKjI94dS(?r?WWQ!3Q)oZS-P|glWyU5wEL2Oz-j%*oOxb5#KiPM-$3&<>bL-l z{7Yo+h0CZD;WN-x6vqb?82W2c(Yhx+zxkXfiV_AN?w3tnk+qzhv6(+lD;S>iFre$} zGitY7NYjnpaMr*1hZe(usE_a-WI0f=w*&qtOu$gOte2S^1_~kQAzlI7CjZbN z)*pH~VZA_rS2Cmmd5=oAP9uj22hPM;Iw$NekN2-d!IglmxqJOAha|lY+)g|tIEWWf z9^Oizwd(pY+O0kpvdvkZ8+towjAX4COeL?wi}z`a&9Do+ne1&WVMr`wMUYFxJVUix zE5Ac8rE4LuQKM1%TTLre(Bn=fAN!~Cp@3Wlm6G!dAxhgtE+vnVP99RD!JOu%l_nWd zLw4|yMZ(TsyHWLKu)IR;#oeBZlYm;8n$w1zLS6#!6Be|5H6nJgz`(KC09+-$uk2GB zVBg`^eg#=r@V)g=F`ln?`&KVP_SKM7YWDp#eUbIeSYgO+DH#IeVb4?Hf#?`Oil$-u zqlR4hdV^x>`R=KG*POv5&?C1>m`)3E}sE zk(ebI(`vj=tXzB%USFlVRLsI^*rf)yf)hcnOgN4uli+;j@iLCDqXa7BZ&+4$jIRiI zENA!568z)LWQTS(jf8gpwh2KtVz>uO_|=&Wq7c?!-p!0p10@y(O#!-^qW}1gmRcAY zR$2Ck7{;;?MCnTlHn~zsT$$6Ph&8==P)~7%5TFnNruNNr1@hRX#a%E;X>H03|{|-$eBmWqWp5K zHK~j&TQnC+my_vStE+mm!oKl=81GB!_48Nkb3& z(YcY0*My|`H{UgiVC>`k>_^`gJT12jCo972J7iwOKDb1&MU{nBEwzW7Fx(ohbs_5F zQ_;8~7KU;c^OzMUBvq88<}+tQRn!a_@MyRGp@NQVI5kimTw$5gH^U+a3nfc@J#8Gm zfBpo3pazf~#3i!pm{>2^Lkgx*n={Ru$(Q~Jt^h(6Bc%D+wHF8n3?rmoAVZEW^G=5R z>~t{&E07cNJVxi9mIXQ>@)h`oS#v<;T|(dX>tZD=vzt-fLyI7Dzz&J6GEy1wJHj{Z z?ls_Ae?_q&ObmH36q=AClyY9?pyf|!rpvJesPd3#R)g7}flu^@UuN@8^w|6*iR+;U z1wt!z+O(QyQHkt)qK2`(dxYRNgw=bUp>Kf3rS@wj*aBDAEKHn;)D`@7dKVucs&Mk0 zQYReEshHc$l+u^!6u6?#{C*te5@9JN)xp~1bAD`_puIdKHwt;^F98J7V&f;h=o6r- zSlKec&4ufd?-qY7vpbHHn&Sq6USG)e-y=rDY7fXo)QjRq&AB3*z%RXFV zyQzN(mY}roA`AATu}sr}wu#>V9A3%cZmN_tOWjja9TveXO>UnORbhKV4jyZ|91?QO z$F$KhAPv4Lkglp`QBlkll6QVGVId%&nzVi}W>x0*X3}Byoqh2AZ61Uy>-i46-jLy1 zeYMfTv@N)J_aOxY8Z7uIZ~%qq-|NT|wg|x7lbqN$QM~}ha4r>(DHGBYi8H=j$X*}cP+p%FP^ zBHXQ%EpoLSkX0cA>#EdlFIxF0FT6+c7mKM;e7P6&y(r0M>D-0G*#l;EVRr8NOm%&S zMaSqE;D7PbYW4W2iHiA zte51l2@hc2D*__rd$|^~sZhdvmc_lIn$>iGnjdvfr_?8u8l43sdC9(3609UT(l2 z%L~^}gcrXp=?vDrN}y|Bp1bwE{-ZOl3XQU0DDHV{JPxt55r1MtU=O80SWUmGM65!o zIx>kTA{0ZdafU3m_9XOq()+LWo0%V|!sQuM&Un6!QsBvC#(kW_A1&e<$^Zo~Th1SP zTjxh%b@<4X_7)}^b3xo147U4^WMp*vYX!5DJj2_jrcCMAL%+fuMifVU!Bz#jV~H@5@ie z!Z|`yH4N_~#o3IKVrlzFdIo+Uu(V=PSfA2CaUw%sE-Gw z9$omfm-eW!49LN!1_!O*y{PgN>e+DI9r)lGkwo_twouE_vep^y=EmKXA|PHr*tS~H zG(2E{i*Lh|dC!%EG36|?AKF6Z-i)?nzjQdkT80$U6x5w9)||v#e|7^j985`PLQhi7 z{QBLpUmq!1_GYSd>ojvaz?FK`h`C*fO&EPW<|JYEaJcj+u3i9A9ugieI$g#*XYc zpd1$`6D$VJ-!JA*jhlA&pmcZ=x0cEmYn-i{_!lfg6Kx;!OU|1RA$#m(XI_{vK=I>V?nNkb);? zH&tdiUKo$%S$=%f5H9l*;d3K73yCJvcnC`T(8H;^f34B|w%yfbi;9ij`<18)f4#wG zIhX0opmYc%ultxQ`PtEC4|hDByo!CDVu9}@(-1^IDRcA7IjKyBh@~!f*cal z?(I=*ykc<3vr~5sKxL=ZOg_ous)05D^j8g3o;wXfA%i$V!&uAdgdLX`q-zj?;hgy3 zIa4?)s5u1H)PC;@iL^AKAvTY#A?1ply@Y~OFM6|!7$3zAIiXUy*9-g8X3DZXz5k92 zaB(nQJ{>q29>hfNO@uBE_*sOEABg;HUH?@))q($B1wJ618Bu?E>r?YdUsM!_#|08t zK@~u-Ho4yIrnq)Rp5FrD(F8<@1OnnW${kNWeUOe*ka)T_(`pll$iMsR+Rfu$oE}3E zkP$4#B}uCE0gEMiKje*~ZPpkyt2m&)M<(GURjmZjL+E?MrJtWqfH!2?X`cwIBeqlj z130R`;R{?r60xy?Cjx7Kqer(Hod1a);e8)m3W+XUnW5Z0I^8o*O#VlRL;ms3GD|<% z<8RgL;>S+m+~v`7DZ%SQj#SH0=ageFjBvB|lQQ>5{=0u{;H5ZCa<%~3#dNglfB}B3 ziKN*w7f6p9Hx+FH+mcZXuZal4Tk^IGzFp>Np7>QiPLp4O5UMS|_GYS|ljBMrYGyO% zjVZFsFgMYZd!Yh18%OHv6&{pYYh@;W?eejCXe6!6`nXQXE#20eLM(T`TT4(X1NIC_ z=%D}O_K7`ZUYnEwrJjWuw)}CeU`mch%1_ji*cA(xxRI|EjLjjNk12_&4B=(~cuRDMJxa7ZGsqKXp1j0`y@k&4yZfzn>`-`~PILdICX_|JC_1#vf z;h1u~m8ZMbS@#_IM*=pao1p60ArkqY7Gc(CI^7kD>Ud8S`& zegLs4t+_)k$sNW`qI+j=#B&*BDii2L05Wd2b_@(v5J?1;x10M~v~2-C7dLU-!K-NA zyjX+Bbr6_$FGi=7)S$noajTSG$h*bZ4bC~hn31{Mz1{As2kSaSK85h*&adTCY7d?H z(ipdXklRw#Ju^u+Go87-M`Z;m0o5RfAFolxcFGqbe}uI0LNZtna2de%K%7J1Yg4~- z@X(4DslsC3fp8`DH`l|>0&qz50dYU`>4+4)qf3|-3XJ^pgoyXxtRQrRY2D*g|B<6=T60RSS zdEd%sy66_=@)-2?ikms_MB3B(*=s9j&VV~M07x6nN$(<(WKumk^3KCm4fz6F`_R096|b;Dwii z%I#VOv$jf*zS{Q=3Dj4S2qwfG0*$qDE#0U)y5ioY%UXEnIPjS3mpUpf~omsYI4@6uO# z^8%>Ch9X0;>6Pe{&mYwrFwk`hacuIJxo!*}sMNh&H4;!H5eWkTcUxb2E3Z`p53867 zq$IwidQ`l8S{9nJG}KKl1l9S2Apq2eeAU!n`VnXhP!2`r5w*4WTpB!v$wyfAml`Ed zd6)(1WQ&q! zM9QsC{t?|1gnfd1t{M?NV;vPDdc~h-W}~aEs%YB6ZQ4?*Zvb_RBnZ@Tp00;|*nY9Q_eT0cN^zRU~fb})ko-uV+K6WQDQ z`XiqzHQg}?&3B?0@UZaAW*Rv(<`64B7{3Yyl0-*yCo_!%WEt}E(Z~sQW=5&AgQvzy z#G@g#A0txKe~lx!sb~zkga-1xW41-zy9EWsW<#MS1Fg^$+|8T=#$A^9MOgACf_LB7jOYJp2X_+#xt1 zmYz&$fT&wIjThNTe&~G!3uR4CX!%8#-A+9^A|xgC$?ML?uRG`F%=u#nExqRkXL?!$ z%}rLEiS!n@r6g_P+J5^8qnx0eZ40z(5Egzzy&4hhL2&z7KU#0>7AGSKfdtHhih8K~ z(|i&61Lz|&g1;0%kC6EhcU5%xWig`fr-FE_1uc~bpIPG=s#ImR3zAS~F;$E#Z-cQI zLoG2dooLzcur7(i0I8+K(|w%Lf|DJ$y}aq3SZi$f4z!~DbH?#BJ98f4Urdlh5SJRY z3$T&^Z~bez^2GD_N&NJy%FE^vtxn)*0M_93KSdo{{fLjRBuyF>es7Q|VV%9ps|B79 z*Q3qSb+!}<^65%ph7y2&BP&UqGehp87Qrp_$|0f8VLPmz)K2;n#aw#1+%!Vcv+B9O z=5IH|9k| zdDvivuAW1*Mq@6#D+4yZ#VxzH1IUi0eCC!eB2KhbIyO8aFz*X4 z{{`4unoo0sYPx2}bcLQP1YV|bS)o~QX{gj6L?$zJZIoxhDKi(V5q%78@1L3~8Stmx z3?V9txu}wpW`s%?0RzxY&`prmdzR0AKtqAY_z%b-NQ>%nIWn5bbL4E6!Q9Mb=F-mZ zFy6X?M8_-Dki}nS&bDS+2rDYwGBa>kauAYb*^vmw(rH4@2aWlrgW987T1CE8%~RH8 z?Xdo!&|D81zop>y<_S7DzPa4`UJX_i_>+r?4P14Lhx`|~M2XSMAB?s>%v4j*~m zzxoF=?i0VRn;N8Pg&%0FwB`)6Ji7kyrCFdQLuqYX#-Q!B<9VO$NT2N>=$Ih9Zvj(0$sPt%P90dUj;itu0nXrae5o?9n;*_B##UWg+5wiZ3d(-vs==$Ykp-dOfYMu#5v~OC z)0Xbi^COCiChf00U>&IFPD8B%IOfZdb3pg3&+mzRR}{4Hm#KY^A^|LME;o$e*rN9@ zIbxhs{u@)Bkr#FAQyvm;E!d|42eySwEmpdrhY3B4A(}i(^OY7CZZ8lD&iS55-3UT@VTS3j|R~1-8VEUnw&gSxtFmU|uK)U}(VeE%Ru~lb> zj9ltruon#0N&SckbI6ZOcprWbwm+qG<)}Vy?3 zSVh=BbE;vO4B`Q~!X4z6YrqwS3_(GD0t)?z(&=^+bg1Mx<;)Q`q>o8cS=al&@9>e0+unYm$d)!rAzDlasyk zPv}TQG1VOOnUA@Q({<}e9?f!RxxwLu5JKnree|k}w?<1E&Mb|Gf!`Vj;SynQkwH%N zoNw0&#v4?|@Js?B4;Xg12%Qd2!-1ZL0v+Ip>Os>&(LT~>R*xXw0T`auCXb6xgr}$5 zVx46Vb+F=RMb(keV~oR0`?hy#U|V^k))+IGMiXD6Hro!cm5xbA&-0Jf?3U|{&d<0u*R$76>01* zg@qQmL7HR7wRei5+XnIVT8ZhjnSC0pqY(~(pbNb^t|bk`i@^9ROXQ1A^L&FDldTl)Dvph&`l~m+y}{kJ-i>NHZZ>^VHBn73*{O>uqZB3 zx0Dy0O1+IhyWq~tZ4mhz?I=J9xOcyl*ZAu)UYX9u>*x_ zqbE@f4A*7GZH;%RCKpT6Q6>{&aw|0%u!+aVBFbjb*3I*yzEM|2K(8hfP6{TrvSX~N^Sf1d zhH#7jj9YJ~feE2`LLI5{T; z|3@aJ;)Vgx9OfMRL=1(T1ri&~MMl3YRkDL5A^p9#2E=`>p#+?xL8hAr~hp#zK+ zIgqPRFxL5;^=Oqv1+Q)^>R>rr00qBQZ%| z5*zllmE_c?1SLW1|CElGzr@{-OudwGTWrq; zJuLjRZ*dErK3u(nPeSjEbla%IOU2O=T|_p%?s>;eH@tv*d}0)0FzF9{URO0PnU?+X zw8gG9H`WuZcZI=1w!qT_z)`ncJYeyi9CN!14rI>SaVL-zU|(s&36wWL^{<1xCxvl|$Yo0X$tK~=>QpfcnFub^Es*yKLX%GCVz-U%t zpVCD?HL%|rutcvhRfn!!8M-$E}`ikji$FWY@8 z>C=1DV;Y{Dba0E8^C60%PV4&WdE5ZbjPI0D6MxBui!u7yn{$7;y09kKpV!Oz@S!K% z6MQYEr-qcna~~bt=#_iW*jx@LH7R8ftXzLK=1Zc;vOab2aP;9*Hzg%5*8-y@$@7fb z_xV}Fa?@vG@hu^%kppSz~Va)iP{u8-U*VtKd>L)8Xwai&-dHD z_#ins&^DgB0LntdQHw$SAGmuDMs+b*K?gWmc?iz|{LKqF)V}#rcx{KM?f~2k%^)PB z`#Y1s5`UCmPkT>V>0-)K9fnHGB_L-vS9razn*bTCOLP0FO#k`QbtMX3zqV9<1l!Ix zJnF42BRpVx(DKIt>R;#9UER!@eBp;}#oYyuHjhR5^*6AqUkUg}Cfsei8c-}dx2?3_ zKz0rb1UBp0MUvKo*f`UEfZjNH5JV|LJyO8GARA7)-fA0m`;^mYZ6UpS@7<#*pYg;* zu)%t5d44+;>^AnMo5l+cf)trS*AkjR|@Z{sZb0h$g82GN6bV1mc#;NzzbMEYxV60a0aUxiSA!Om&ExtL8T1stS12fBSs)++a zQ0(Brq$>hY2(oZEYfJrL)0XUv+T;sbX@+vy2Py(_-?c~+qGtYUkVU=g)yYzybXI*p7J+*=eGuc$4$D(U{bz|O1*jk|FL4CYg6e%m+kcK z5U}qYUT*lpFHCf8ZW<4%z#efq<-u2#`=H$t{#7FD(7|9-j?x-}oG>~sM2en^{m5t@ zsHWc*)Q=k2e-i9=yiY`-=4u;A;3d}V`F&CF0zPY}BuF3t8i-_l3P`xo@SN@J#y1Gc z-CKI!Ee6j7PcV7f9-Wg_yzr}dU{4yW#KzN|w>!{l=h6K8%PrnHt!7FD4_34rFfP6^tH<6; z!X#?*BgDl%sU$!p&6=#ekA zYWs`kQs{_Xpggu?a{N3ag>D1NcfbnbS?{wo9YK*_#2gq$5a?{q02!qF)y=KFk}4)d zOiF2QB8IPn* zL%IoDF8KVRr~j*Y3r!ifi1HL(RxWOP?^<$HSuihmS}Hn8jpr>zL&~Wjlcy~9l*&o| zq~)lLYJz;g0mN3Wx#M&Y3jc%c25sw8OpiPN0^(bU$PAqVA88WM)Aj@yfuS;bdSUB~UOP`|?>s*SxrL1R zft+$1DWm-z8M~jJ;i`^7#(7}Er6`-S*P1i*4pIz%XWiGjyC8t~oXM?RC-CTg%ivv^(c7sGRTnWSBL{`AI1;q1-FaaP%d3uk(%9%D`X8a1JIagF+5r*t5SL8wQ= z^UjA)vU_hGTrStuB$+A)HqqEVH6;rTXJAPKS)E7ht!}YjBO&Hs89N5jaq7TUtj9f{ z)d7bs!aH!{yQ7gg&tDQl3e-FnV}KwQ2?A>m7Q3ugzuyclE&j1R_R(73KE*kCx-?CB zZNm0w=8_97nnqe#&mtoAMd$pojSVdFVc7f+7O%K|Jcx7iR4vSS&-QCOFV^&HgNx7I zIrPXGq=LinE!=Sd7`iZs2YenQtVARN`1(In`)%@*1%DD!P)xMSim^YL3%t@M7wqbP zApviQqoP#SIZ##$_r3NSxB)KkXNZGDaj@&D82BGV*av}h=(gmoRCi^N75w9c?;JpV z30>g(fMH=!atfrwX0`x;^Uqa}cuExn*D|y;YPWRIow(mA>K>~4DC>Fn*l|T{RKGTT zveiYw%UQ`+?;L?h$d1UI_Zm9UclJ`aUxn_FYWIosL;?NUE!95u$F;sQFAsj;LjL&? z5cc{B2a$1#AM5YlqJP(|n)bfFIG1I_p>N}}0MaMt2h~nMd@5oG5U*3HeNNn8%QD8cQI4Qx{d2o}=HW1_sf)VPG(&oy{c$2pklwrg)H)dV@u8cN3s_@x5I|{Lq!J{s{XWdcXhjI?0pEvr(dkUpwr2?g=DBTD zSP%?2dSM}6H^vx0OWCU&Pypx+nDow^Oi?Xn212 zK+Am>Z%+CldHYtpaW3Ej272;xPENhPHU}KL@-s~}^b+3VpD$x3J%ume>F2&O>|4d> z_#eSMt0=YmA41crkN0VX=k^2>VZj+~72p>8lMV3qXULQVxIyf^i8NvIrkGf(>V*z4 zcK%-dLI4g?0TLLM{An9N!romVDvM1!1Et3S+&<|Z@`NXA7s%6n6)ym?bitygfYPlH zEd$74Z3Ac!INKY0O~*ipo}!!l5uDtE^hvb9nLPr*VoB9 zvxd6BF6(q782Q-^oYiNjQpkMe(jFD#m)g6}X*djvcKpHG_|{u4OfcfZ;KiP_@ZO>Q z(LRci=lG@gixTZ>A6?RyD9y)5ZX;ZIiBDtdM#=L}^bo!38>8RdwP2PYzHICpo*RDf zI*{ZYSIdL5uAJ672~^ut304;{WOr5)*d+dz`E3dmRisdiwDGq*XF4sX6`&hJ}u`sByG$nM)R zI1MSab?1Hp`GY&OhIL*WmP%`;;O;*5X|5cd8@wEzi+KPlRR~IP*oP+1`=)77^`B;o zpW9(|85Q0WVCGp@N9oEOWeEl zPS_u}I2(`r5qwea*nvTGJVdEI+&$}F6kjl4DwB~pgt%+l75sxJ@09{0C$uG zkW(TO@>9lU0RP^8Ta{P;iC5+q#d60V>woC%ejOmiL9<7iNVIh&n0y;#r7lLw#q9Bi z`>GF?+3urw5ZwoH#J0v3#9rV@2B-@qP_Gxf*D!$bB0k%W*5-z(fD%iE){-)gAXo`& z%Y#i{m5P=in9n}nlPsRdbnhj(2<@!2vdP_AUJ3Ky>$mtiwjq`(5iC6i#C4nWpKl-~ zm=e+r_tZM|MPCuX9b#Nr%Cl?G{bv4z&yeXnxqYw8xZ~|%N^$^zb4b>-U}CV-nQVFX z(8n;VeRxo#7{245r$KCR8_>#ty>b4)<>VS*Z-at0jwT=*5NyWw3n98q8B{|DW$Pin zJQ74bfM_N%F4r7?vWpf2_Lw%Rz1){&^{lJLF`&k3!q6+S>W03ThabrI$qqMl0x|mU zVd}}ei8`U^fVjl{`%(98cF%^_00oaGGI0CJZU4#Op_jf50iZJ%WuG!b-6-{I`ajX$ zgPm8iC(>dz`jW5IfUq1?80=2Z1hieGUT3vD#4Qqh^@=SDeOe6J*$>(%Pu}e5>n;c& zFFq^6U?!NFXc&4NO0YqDcUe@O*!Uwu4Q#+Diw%7o>-n}IZwf@(lQIEWF6r4(TkK4W z;v%Op%MPd57no`QM^WHpRz~mb0V=pJasXf)Vb&GAer{s$(74C+D9Gv4eE>>g3&vtN zyMt;i9K75;Zod$NTb9x%Au`#L~p;*3u_n!@d?0LOrvN^Q?}8J(7Zcc7XNfPB1g0Oy>VvabZ5 zM}uGX!I7?Z0J(M`=KdbUmvWZAfUCQQ*{w-k*#$O*_u&4c;7Ny7^wU8QBfqH4zO}*0 zpcR-w#w{ce)bI2SD^>-uB~0=!l4)m3LV>moiaUTbOU5sCnZCvTcys2ih8ic0u%db( zqkL-xn*c@>C~q(u=%qu8D*|*A2E0J8AQbBvP~AaZ8Ab4F9ypn0nJ%4TSPE>l-?7>x zLx2%nzZbZ^YXf#nmsoTX*FR;}fR1bh`D8Fq0&WMnezI*vPpR!$chx}hTF%5DAdw9| zCc*FF5UC3aWe^fGNQwSXkJ5Y)rv?;B6Lx*Fiv4A;n))B3lQ=1)#fawTx%3JycK7$E zHqn3Gcl75=QvBy%$sUuS+ju4n;SjO;5^g=O9Ei=?I?WTVIpcL7THm>w8cb0q?c@xd z50oPiK?u~(C$BV{y>&X|fY$y|`{*9lgU#qePN)p2#MX~^3Tb!6Diln)id^{)A#^>f zOtZ4_hc144p1@9FRF>ykCksVqm#w}zeGdMeKPw8YMIdJMO?h>7dx;~6gdKb*if-vn zm8KmY@y>l+kV1O#u&*#Ckx|mZ2X-Atq?)z$%uR-k7JBudJ(Uvv3}mqc!bZCSU2Hmr zN_n>We~%ckq6@sQeHHxGPX6p zL~c2YHS=J%bX;R5xi&lqaVO>od-ff=8~aKEwI$JALo3Xo$}!Km{$r)cgSX-8#a-h^ z=GdSpN2g2J!U0havpc*(F;6y-Cj3U895HW-0Z)>he>xzTZ+2qflQcEa|AR{$__MEd z=4LcfRkc9DQYG5RTepw*?na8IX%!qVcHhnj_UL>sE4PIFUiWM);-s`i85JA?9WnxZ%Zd-v9 zR;=6staxTJ#zdMkL2#RUc}Dz@a${>{o%&>Vw+9n#pF>F%nbLZ~fMJQ5^`Tg^ z{`_IS3heUQP=dH1%y6@2@43L`F2++D>+0%?ZDWtACCjvVY?+IdBKK{;i<}q@lBQ6> z&Hy@Te%a|nM(gQUj47W@!;}xrdNnx&u0!xFJ6;G^3my>ze=bF>cUQuRsExl4+lWo} zfXMasM8U>27!2SES`tI ztgZRL&Xeu@_56IQMbt)Ds_zY-iENat?TBA-2n2~X7s2(w?%&`7`cCOpVh%Pgnz{|8%L(lR zRONGtFiCQp9fuR{GuIn3ohRCj<&Ti5SF%ZN*=3ry$;8ISW(%j`8Y=YjU}$A5#RmCW zLQi$hXo59LtMDt@bidB@C#2Y!d+*;e)ua3<-I2zz=m%T#w~m5(H@DBpEOdVF^Qo*- zmWr2JYTCzb!ZtfkWG2z0gFg=Zg)v$wZJXoVDRAHc%{n_!K=B@v=llAXqRI!PL@biw6C_3aj~JRO%b{GWtmIk?d;aj#b69sr{lw5)HBUoyb5w+I z--i9jK90LJ+EcT{gQH0IUu+Jmr-v(%M`lUdG1893a4e34;xKy1oR=leN!(g#%f6Bs ztTgqZoR{u^QO|sHhtCYB^?ea7R60;0BgOTTGO_2o3u+9v;oX`1=y!dK$te4zGi0~< zdlkV4bBo=r36z@A%*6Kb`D{+oV-EXjEuEpQ)9rUXBHx|R>sF_l<%01mVUKFvVkB_= z%Y2zcu-{9g54$dMj#Lg)$NX<>-UVCNew$=_Qv_>O?Out62haiLbu>z`_N|1&hoFH z+LK>eiS7eex6X(nxtj6u@q%={9HR$FX@{f4?6B!U{E*LJV`WjXC&L4Ika)yMrpyo# zWPaRcB2mkxp$p@!Eq1H1yF2kv<#{LfJ*2UPEI*pHf?EYsDCsR^KzVg@*TuT0(*sor zFT26&%WfQH2wBYgrdirwT4yx&=v`pp^kR<_C57zLXd+wT z%^~}E2I)E*5|o#;h1UfI6lONq6hFupSY6xJ^Wmx7A@$}3&q+>gPfrQ6IFH;kq$a7y z?W&lGRrfL=SQ?@OJz{^P_5}=o5U&D@BpOm)u??tEGtaWAbD(+YeKbWZqLHvUMI%a+%}752mcZn{9-h-*pr6?JZ$oKXI8MMa9J`r^DeS~R>d(yAs_ zzJy#H(A_13i|Fz&6Csi1ATQu6ZZS$W6(ss41@9Fesa_T+ajvO|V^vUwos{mWEBY5tg>>_kVuhK-U z7uzo98 z5~J!f@#1-t#bT(fR{}=oUwK@#AGo#?$r;rNWBQM}m7o6Eyz^p-$Zhr@Ds!g#7*EiI zgZ%4}^U5E~wW~Td-4(iNG43QE&{ABkIg;Odjq>UbWg3{4884mS(0;1z_Ph3FK!~*6 z@lxv~b_Lv+@8mOAwo18ii>{Tk6KGK8pJ$ruZ2UUSUT$8V9I}uxd_E52uOL+74L#DO~4S6H6jU;tb3E=*%5{qBUY&T^VjMIqf!FS5-&}R3hpn-hZIt)ODhS zfpFGSP}rO|Oi=)j>%r79uDW^cy9U-?Wr}z4F?Q2>^$!8=V?UsI8@<2IE3w+e@I#(&^A`X7A#DI| zIn`$}CY3f}$O}fTqDIqA;nPsr!49_b3HQ{T5keH%30`qOsOC$!UecRm-O+4iXn>Y7 zlu$(8@BaKr4qp)9*r?`3Q?N4RK_E)AtY`}5`TceI*Ez%Mv2jd?g%DJZnZD}Nv1y_q z(tFe`Qq}thpfXlt+$LEL1s&G*B+gt)@;m%cpfs`AaIng%hJH(NO9CPOZ-|%;rq;Dzdl-irFr3^qL<0B$XXr2IBb|KUz2v;!~$tRAc%)harXQlLX zShf>X;Ghrw{s5k6I%XS#mkn5K#Yf;xv~iEmQpYjR{UsUVaEU z$}1QZsgM?VHx$NCp2RBW;Mh>OVhG!u8XofkO@|)1-rsWX|dQX52*Gf^YwjWvwm0fhS}4K zDD2cC?LoPAr|kHX?X3$=$1!a#a1Pa#8Mn_XSx@ue7Eg5^;>KLA3L^Exo80a;Q!NajvIc<2A`cMT286fI|Dz z3whpiTl}=AV>-t|P-t0#_c+?wcZeEr!^gE&wJjC!wg4SUb@cpr@nVs%X`!oCE^+Ei zfb85tS^}oXU?e}6O-?yaeSAjFdNJ(vk9W)mJ=X&^cZDxc8kjlhm8m#!E#aP0o8gZg_e~|Ru%|kcA;b9UQKdPSh~!d zFM;Z9tK$JzCJ=!&pign+s~9*t*umF)qNcNt)&&6(KTpGGN;ZoZQX2=W`*xzOdGJ1W z?+V2lsv7P|Yd%o)aTi!6En|F=0yDAxQP^fw`Tg4iD^|=dN{For+jzu?FGW z_$NtH;n&dhn9uj$$Eir7w(3F_42@J2w(5*NM3^;}mm|M~R# zq!y!z{iRVCWb64ZGb!-dXdK0*S~S)wxrDDwD$cOE|LvGLQK>=NN-=sF3 zcB}WZmV%1~);9~m`hY{+Q(|*@k>YF?^<={oYp^wexTo)nB)1Cb@v>tXuTAB?25P7{ zs$^P^V%3^&C||b*O0MKZfopAmo4L|L!aKyfgg8YXQK4?S&Pj$759xQIKpc?NHKLXY zGv^IoVC8fd9k7GYy8Gf4 z7@6|hgDCEd=aG=48M{ZKu)pc;d{ke+Z)G?;W?K0CwekEN0nzH>ar?VM;gwF8J*^NL zhgZqj*;DtDp3Q<^AE!H_g2rT@TipG zENjOTAc0uJy}e{T@5@E=G2D0kWu`MHINfgbLqPqq`8v@Z{C(^;am^Rk!3ZGW;BxUy>AzBNx%AZbPFlp*8 zr!vkX)f3w83>S0|Y(Bh;Vf9xFDZHLN))isvF5gwGa6CnMpjm0;-Dz3ZN=LUAhN0rA zR2h%ynMmx89vfyiHwh9MwYv`3k{OMpSx5*mUA*-t&xl}w3+36?Y0`94+-?O2BV3?4 zTtAQ!2fWpu5GNl+LRZW2@TEx^m}-wYFroJHVjuLe)Y_kxvs#$y2>5iH27D^wni?bN z!oF)p7CE!dx^{`NnLrdecUqkv;BpxuGG?Ar>GmGtf$3Y+`%^1sNnE|NbCe_|??w#B6Iqout!;j-;%aydxg}cnW8W6nJ319m5b99#LrO0Z>yvp=wOtXsJ*fV`}10ppx4467GtdDwObvS640gi>jLJb7T z8vaFOZBpM{b(>pboAkS<4~|0p0u}mW1@t!nPe9{%fk+ASk#yJd5H0B2!Z7kwEIhqu zfKu~LQcqa|LTfrz0+m%J1L~hR_0hptmP{o>4-acoNlBd})PaVnPGe1tIVI#J z)iBXd78q{0Cdn8x-;ei1PG^hybGIr{-scIXpxATfGx?hYAGP-?0H=m4bfnOsQ8;|` zVG887&?c-89DZ*&ZnWm}m@Tl)0(+*Y6-u5{*aEFNJb*iM%R(HR#(UgrBLw@Ta*H@) zEKiQJ;yfmR%5qkCgM*DhS&tozluW_`he^lCdJ9PBvUWGL8k z-SU5vT+aI*F?0ECd}yDZx`n62<|~2TQ(A+FG$#mOT@ zh0=b$jC$H{Rk6-8xdb33Zd)N0pLy@%N3ct&=KjByrPUv(XVS@6(u+jAr+nSodYyN! z`KjS(XK6o$+~=;X+}6lna4y-bKsC^;z360(xl2pFRqUpoPTFq*=H8EJ`&+F(tqGAt zC2?fOXbULbVXV&oV-|19Ag6UeNm@ z_E`zY%X`9dp22TL8IBT~dka*6>(YldRf*k^RNtBoxcHKe)gpUX%uWm|4*b0tph@t# zC?~6gvoLqZ0ax;VKukg3E(av^F@=Ba(h@uH_yLT_<-Id3J(IAzk^rgh-gphM-Sde8(Nv9& zLN}qws^g`~y{d=feOElIqMlTD=s+`b;~mSQO(myBZ(9bHJpPs9xe(E+nFAf&SaJGr zck{qnt%Y?I&!9C!6P3Vt+R<$4^ne8v{PdJTS%chjP5}oCspadBIWKk&Zl9EXgF|da z)THQ@Fg|S;>6JaM^!_rRcXYPzzQUoZ7GZBQi?uV_^_~al0+Mc`C=mw>_Cf(pXG{07 z4$H15s4d^81{TeeBQ22n=S5ZaceGlZm_9t860JGH2sDroQ`FP#&83ARc%I~O>)T{q zCcTFH*GfjCs}H!eHph3LkDb-@AiXM)yhGR%P}B7nXSh;$gP0Gc7=1W?tCi=P}tLB1qSx~0`2v8J@9VB9{kUgsQ# zK@OFcSL}{ec4mr8B})xQ^d9YScIePwb0O5l^njk{fxK9OlYh=q z4Ew}4lE&ZWf2!XLy-=GwkIcV&H~6M9GCaEcZH$O_5$*Y|gLmX5B%MuJJcwPXP>(!( zGsTOfg2J;Cv|`a45v4(GKwFH=Oo{44&S``ro$O{)URwa?p@F9{;&bS-V{5SD`zjd` z-3j00#+?uLQMfWmxj=wmUynV4%j zRVoFCIqyejHX;!0ww=LPa-ijOdtSN6Fk83^OR32XAf2PozzKj_ae#JMAxaN4A3vz%YbI+=y)mp-^+pm-f1vz6+h^W+_~c7K*4zf(tTEX9xZev!o17O9RqZ5o;xQKB+^25AQ$;$ipc8Z z=d|Y|&I+PWh*F4B?F}#t1&+-cex#Qh!ZC}6z>?niv5jvs=ANj&r&SNtTe^@_vj1s< z_!nFH-6n+n?pJZTiQp~=-?#DD4F|tNXgIq`EwzIvMdUBfv}Z0q9n5n#OQX>^|6HfR zj^0LU zG+Gu!*xu!|DF@(gKz9kayHw*tQ?I!vaEKrfYk#F&1y&+BHs8_-#->$DG#}VO2P;E4 zyCCNvE(7?lC-N8#_9T^@hA+KD%s9gs2t345v%Z#FrGW~B|5Ui2rR+SFWpM^9u4wX6 z5H_v4J&vuPF#PbP!>jH){y`;c0(#0{<3@^$TwAj8*aiHW{hl8q%UO-YB~3eh<*o%J zVZ-v%8p;iVBO{r*vt5rKlBtc4*Vl>Z7uVX$&Y97pYEYIj`t=88x>=2re8m6LcfDS)P!W69}(2kaE3qjhMFEBiR)(q}VTaYIMLw3y=1_|1gJdvLcT3ef9u4ru$ve z#}eR4)A0l}Fe&`y#tYxW*DGDfN0NOP{`>lZY;^f3z9VQzL_G@cy^|xeoj~D8MJl%;!g1 zTBO_)NiOEdS4DCo- zYG=eaFKj`#xUkJ0m2;b0p491wl$(CZ9J2Rr2&mBs+a%%w&>gLIBRO`$<@@ zFkPNSfx|0rvEB(RnD*-zrW-F-k&oyCj#v13YEUOQQjt%`^GD#q88eDgopz9Q*4(;B z8~fHg<&^^z22@J-7JE0R_5J!kc_s|HMFOvL3J3d2TDzCtYvNRrt~TjyIo-Nd^X$rS zT}8v`$KIH^f1~={jaKY+PNU7;lnyHa9{#Dui{*imh=AYRRI(Fb|8I7+?L_*Kj@fFv zw(rY-^@VDx-Gs&dijSS&a-q9iMH*_=^%BjFU;`k^@mS> z=KuNyeh51E<6qiaSvVv7fLV0f<>PBsZdv$oWf8CZ@^3Y`a?{h>!}ygI4t{%D6f--E z*M?_z{pkMRcIWHe>;ASASJgn5!H`+S!sXvE2`PH@ap8wrD}m)7G`Qb*KKMmLG;QG9 zxG!B2y>|}C-&Kc(#EO7h`SHRJU)f>kYW@n(2mHQjBA0IXw;Eh|#6Qr(ax)EPp3B^A z>8pO*D%lnOMGpPV-GBd9pafPK>9jaseyL3&N9SxUs_I$Xq@`jscEG< zPrpu|ujcCKfb&7>KmQx#`PT+le)%tm@}@L#o)}3n>FlbJULoue%m0WO z1evdX4s1V_Z`q`PpO=r+Z7a-f<(F^dx$?_@K}~<w8?)X!wuT2xu*c zaWku>$sj8lD)hjS+V*wn&*&W;AGcc3cn~wkl>fr(R(KQa7CgRD)AILKldpkW{Tz6@ zA>_Yjb}P64O@k|!{8v2lD-VVjUGVt&9zX5<&(;WN?Vkmv{nw?xkoi^6z{f7^68@qh z!f){Swji@<~#LF-xMXH0Zz= z^`%s*sry4z9+KNp!SX6$;yPSwuGt^;qUUfMANB_J1qe2W2(wC@phh2rS1oifwl?=+ z@W}Lmz&u8YiKN%wwLUJg0QJ(+iWL#x&+kWXKc@6Kh#e^o>A)a+#K=BQGeWiXVec$& znqae-)`y~{epG*6$RX%r&1TtB^gllpct|gTbfv-RxI8@f@h^h}5jtm>UD?Q(9GBDs7U~0Lbr+38Zyo|}rO#-x^GA_27=w`fXoqp{r?N zgC234Ku#VCD;ay#)SeYE*@HW#=GH3jvoLBi4YR9;v+cjU%}s1n?pkw#3 z$F1XdMb2kQ6jm`pIMP0M&b)-7XHg{~fFT{@z?91lA~Y=meu_75`n_Cv80oDAq3ABP;nC@7#pa9~ogW5V zxsxJiv9##|!jr;h&z4qSkTe_$r-jjaSEd@dRtb3SO$H|0?IS8?CPn=ZF4EZH6)ZS7 z;y!@d!gODN2P2AASA@)qG7w-&pK4BmBXz8|hqna01RM+acM2M6S6X8^A7?}=3q&|Y z#Xhu$;#D+@_i#xyEoYtd3DvO1D|HY0E!nIKM^@RsLGli2ERXq_XMtSxtSO{3Y#ZZ* zI(RbUj&a{l&n299wOsnL(1gCSX4r|PW7|qoD?c1QwaR$>|Mvo{9t_yTmH$j<_;&Z- zT754>R{K;&n19jqzFNm$Uu(r>^S^4({0seh^wn;IU45SW)%C=)?qATWzuo<}R-aMC zYM;tCpY_V<{EhkX|5gKC?ZR8?Z1gvU27do{T{hqDUZsJ;hW^p&`zPOx+FusQ3N^u7 z;qlD@_`hk-{P$G8+$-3x|IB6c?e4#|`u@pxll*V^>l&n1I~rlXXZHPtsr;1;{@(Wn zoB8HZgx}!tH&niS0njfb{xg@&x4Zw=>iZ|(jovDj3w!d7npXPt&BOA4&z=0QP}Bdk z)$>&<{;kvfpM5uy|AxPA=6}(h{I3w@f9A6JdiUQt-T&El^VeXDMH^%Yp?o~E4Z0H}I?*9jB&R34~KjltdrTGv@4IOd%feV)-2BbuNp46~X9SOD8 zwVb$>Ac|3f%9oGrH^;XhaA;_^Hg$~doWy)v81D8LzWUDzj;-B^M>%cW>QrG*qe*;l z#EJdEcQzj)-he{^j?~91>@jT{)Q!Or6uLt1S0i^Fzy5Q4??P+-dV`$m`<4+$iK@#N0WbCnFS{Dq@hM=k z28_+fbf-1&FqDb1u6Cq@)=ITN#Bi0*cx8A?576VEUCtZ(7-C3n_z+b#85qdJyZe%- z?U%MSL{~Tg$QCK4*X=&;J2NI=ko&%&DzZj;C1y7w_H{^~@QB{hz_%EnuqV5mQ;yE| z5^2~kZ3U^XDC9vpcAu|>Na(3WJG|7qv&Zdx$IzE+Rz=7XKJ+t5xRJSqZnxbE0lup) zIs4U_*TCJZHvG_CedYpB*shD7hrafDB@R-0pskpa+~HrZRP53wGMqd6zy0*%2*$Wc_@O zp}SP$<~j!%39)GY8PR(3ebrfq>B`K=Gbu;Ed*O9NZ&uVC<~%JOn>D_u5gHyx12G;W zjH9O`Pn)M~?#!k=Pvt&yOa=k^8xt0xDIGO;>u_lyQ4njXVYL*vhOws7pr4+?Tmg9a z&Wz-hPj(JhUF+IFI_2E8n6LRx6}8hn3ccJxknD2*i_UWaO*X#B>UFu<5nWpPaxtcS z(gF!m*dEdBmYYKCy1FuuW4_>}3H?&VzFLkieHUbsV3x$vQHl`zBI2&}4JSmS*KFPs z%wmGTMMKj6u_FKF@qbZqqO<)6AMlFU3#t{-T;UR0;9sTg2FV{;e0K&vUACSmY@hPe zqhmd<2Ew1!CYgE`!UoyZss9jz#s4+(m=DGAi(%&)XoY+O7I} zv8*guZt(Nl8fi#4sTM2#9(a-WACE-m&rZ|wdic~A9gb}QKb0O>S;p{!&)am;&Scug zqKicRsHV-wecd}G;H1xJukKOLuIXR+#Dmv+1-N|f->mfMcf2;7sS(1;3WiM;9h(so zMI{FmQ18~On-;@oY2a3v47^}Ot9hi+w$my$7e`{`*unvCg1;{uT|M9;o99c{W6Of? z#=+P6U94IfW>ckFtS~ir$4FU2gul4YY{&KC4x76^@F(A}RZ6!8U%Xa?ZnHFTN3(N) zJ@_n56bIJ?VRTk$npcJI`1h|ZpA-u}NZhe>c7iY~YjU9k z99g@nW2t1SQJmRy<|i*KT-uaJnufX~yn5;>M|>6L$3w4k{O(3Z5*RjcVwTX)u&eMG znVi7b0S3{&wW=VvCii#Fghy=^NUrp9(g&N$8O6Of11VGJCBQ#|U-2tb0CxtN&!*_{ zllcNj4N|z=w&O7A^1O@>#sdNKty0&oqM?QqkSryvu;=K^xgYF6P9O@O3PuLD@l{;G zFC3a){Z6ul+|!YgAFSFPjiweGZEA9%419WG6_t$CCmZXtFp*BUsGGl=8h|kj;vH~a zVVvMG&&xaC_wr~jv7xvOU8f3!E>bUN5955!B`093IAN_~zaChO4tLL@c`fJW?( zf}$t#0MLhnxu&oPL``p!VK$it-EpNAtC_?(H&!KA82}mdu-zcbf0`4_M|J6VCaJ59 zRrQ}d9oA2k31nxTS939eh=rlGX#j_0+*xuQ;Noilx=h+Kz!nMn;@kWW%#bGoK-h#H zwTUay6J?^%mv9Ro^)OMe@(0Wkw~B>q=E7HRBCZsmN^J5zCU`Bn0pQADH=Uda%3|Pa zz}yF&BM#yx#Zl6rJi~5zyadEt064T&EX0690`us-}eUU@U|5X7CSOiaZ<0M=!_#27F`HFL`VCHEgfwg@R4fdE#B zW-hd>lPSsuFOxRaTc5JXXYV*LN&ZZRr{-&m`(}+Q!SKOS6%g`=!UAlGVrxgw={#7< zL=Ga6Ksl2o%o9Kx!`Yab3(8rTUKCM&_ASThv2hHaLi7!b9Ni}X;vlnV-3ds;VwOX`gc~$sYVkUq0J8m{ zzw_`As%d0K*{RJXY(2^`G&~)m(IDbz31I`UW>S$6%F-wZ#j4OtY#53!G_O3$b+M0S zKun5IGo#-Q4d%)TKuoZY?H%>BK4=YAYuhLkAOQ-r5J08iAAlk@T6Lsw$sJ0JnPypd z2G(K#U}13-ypzy#t6q&;15XN4bI5Qi5`7nJm0ZU{6sIKN@@XKhkeqKBXFF3H>*U-z zPNTigtebQ1eL)w>gCK1m$D4Ja8EWw}FF-7?gioFITg9cCITPC@A$@mSZtw(%jn!at z2pJ=w&Bq4p>zoz*>F z>C&#Er}@W9G8Re*pyB`^K0JVlqr(~T)aSS~%pM5b@o=K2cRlR_=mdPn=URvXqq2$# z-A>+VRNan~W?-S=-90^r-|QBUM5Q&`9zf_)B7pM9!TKnl zNqq8eo`@#mm3J(Zu6tnKq1d`?w5ZLEV;ojtcq1@eah?oDTj zHx(6AKKhBCyR^<4;=f5#$Ch-Jjb9`~koiyEpZhCjERq+rEq%ez(h9jMunrJJ2@hm+ zK-K_|i|+t@4&PcdCTs_BOAymHhpx1O0DAx^cI#iyXDp?v1nPp^>vrkV5{QTOhMdb- zkOn$ji63R8J`_pA8bbiJ2f^xAy>}Ja;b5&o<^!s;99`VQO3t@41q>1{){5F%56G`R zY|k751%W!ATx$^RbG;195djER-;mMdi$z@-qT7VjOHdS|_f^fq3JThAvdFEyF=P`N zyx!U-v{zsBlh@&U2-MdVRK}0A-{howpHkC_6D3(L!m~MaavX%#-2?S|&T}RWIfqa# zY9@grjl@}BL+qz`$J+J#T7q9dOj@M4*ZcW$K}*ep1tRS|S0E%>n!aB2)`heJ`Cx(^ zmmH{l$=x>q0KPnY>K~3*E+M+a3qOrXDcS}Ax<`;uU-YL`fo|W$dckIAQRZyL45a%N zJQXLLI6nT zhNS;i@99(ji>T_8t#c3&=>y8vK+zTFf8`<_Tx*e)S66WYEa>T~NZl$dl645y1RAa_ zlpL@qezX91FX~eFhT>tDhXCOcHt=FNtWicD()gQciVz*va4|RH_`}*fvGqhu8Uupn z;0wYELy2L~BR-BpElg0K$fQQLZ1hik<@kEg$3QOAkk3zbBIeBU_d@RM!fJQg{T!2?a`1 zQ0wR6AlG?va^O`qwRnn~&O6a+t69GJ;ZDm~#Y4OW=DG2fsM}2Q!&_f;A8FZEbfDL& z+G?k`^^t<~L#@9ZNtoiFd;EzP>HJ`WV&yBwrE6~%Yp<2ByK~gb&6P=g#o_F#f4h5l z-I_9`2TMiF-tX~BVY(#J>({H}26{YR+EEu;A8(>M(w*vlsN9nR3iL#sOTQ}6(@|h)p0hkl) z(CbsTlx7O^J3BjFTYsY*7~L=k&%2~B*i^T!;sm){8mHA~%J?#Ja*m?TNOn$>vc3Bo z!SfEw%gaBTv`F#E!^ylUrdarwDNujy#N|4d1a>e(HS2iS3d%ZGTcNPV$RtvjI-@$? zP(dJt8JclM)~AVZ>2Ngo4}Nm3A&4|sv4QHB>G3A zr_!VdzW2H&CpP46QSrH1&Q1z`BEw$PE}wlVRw?cy*1b?4p_(YJH2Qk`<*v*EZ(Dso zKfkS^Iz>FTea}1jTAXHIBDv*wabdR_5??2w%g|?{V%!Y+<4&b|r|5A(4-}I13zx zaqrC8SjUK5@9fvyb3LBA%CmnadVDN2&U11!Aiwa9>@iSm+dZJCr=!!x-KO$7+Z-m#0iaBOKaGqAL1TCC+;}B1Jypif$0k)4Xa49JPIith z>MVLJHjb)HY8R7-L*rn-Vu5s(J-sF-XEW@9-dVz#V3M_){=fFV1FGqC?bEs58E3BT z^UfeDZDx!zihzoMp^oEKCL&-1)KC-zR7wOwhr~8;2NawjM7ka6O%i%g2N6P%UIK(3 zLm;7slD5x_GIzf7?VjDU=X|?+b~oo(2+2SH|NB1g^Zd&5{*(8@kJ?wR6F}nhyI?Z| z+v>I!Umd+Oo54%ibU4iKt5>lx`sL`lj#yKV)mFP_ts%`ZF-l67y1ECKDi14h+%j3_ zoO^<`niaWbH*-Y6ZYdrtJQcFtY=kH@6$k!>pzbB`b&>~*Q`5amW zuP42oRbx;w3F};w$y1-BaU<=YFUbn@JRM+kkUVg+4&s{RHw zZHYUWv7^7HCcj%x?|DG-35mdt{qvFiJ4-E>;fm+v-J`|TB>n^CpxD($qzhJ=ZszVO z-Dr7LkD-z1jP;%1qGAaT-%H*u^);@V<>!NA4oAk^eAXyt7T~qt{@&71=gmxkmJTy> zO6EDbj&*(FZxDI9PpYHLAi6!rA!u}Y@d-ga35&nqSWR0aR`eejuzac(L?@BaA0Y=ZhW99aZ*>A8`A5sRi__iC$stm@C=u zPYUx!tHV=_tz>x`B6IA(Fs8=1Zm}Aj#rDt*n!=F$foPnb9sdA~4~9Vewf8Y+l90t3 z4v193?!*a;g7% zsK&*vWA+NZ`dN?=YN9J*I_v_qQQkTH#d`DRrs7dm?;N#AH3DO4T8&M-Lx0?}-lZo0 znVfvP)hT{vcX3~Xo*#=__G9t*Mornp0-9xnSI1+>0BJ>x^78Vtm|od-l?g6VmHIXt zCrii_V%=TcM3Jw~^bBn1RkPBuUYA`F2Wx7pw%euZvv=3HjLn+1w7197Xtd)=q$`mI z9w#Wnl!%?FXLegEiqhk>C`4j_x|-i@^+pbaM9+lSY*(Wnbq_v1twl40**Npyl}W0- zEgMsFyTHPt<(AnM0>Pqr(}Ll2(V?wc7i~881i!&6BL%j9VnyxDT_1Do*<&r<{VS(S zZ~w#`cnh(r=6fFAnNw6=wwIm>3722Ojr@K%u#3&ulxuiR7P;ZE0`H#%1BJBqAU`r; z%A2EsO%gbvlP}9JK6?$nK?+OxWoP?24v%Pez=r=gh&e&`)lY4vU2PIc%A<+FeKE<4 zUt1WS6qj+7gM>t+rV%1k8k6HNag$Y32?p6T3->QJT>d$K&YPiP&UpOgFXnMN+NFXn zee?&?nOXCu^OCoV@|KFF!FJO}sU7)VCY_kY=?9wbC(WP;M2O<|yI=L?_PS==EO&yW zUwozECR*N$YvqUE4Sg}PeNDRyWPts-Q~iTRs>!~iR#8Zcne<&znmXS$q%0IV+!)t= zPAcdmb$%Bn$70Ns3w+m-N%NwXQ}o6#@7c8K%`9h|ATwWffnVgo(H7gtoV2uEKV_## zW*<6;0_+V{aVDK!eRpR{Z6GELO%!Li;}tG~x*}n`Ls0S8u=$Fw(^Bl+K$m%3J#SS= z4EaLd{@$*Z=g#9-?Dx=o?6w3$mL`66iNX zEVJpO)@^2SME>Wv{5Ee!w^3n$bSl=yt7%x{P&?!o@3|4{(d-2N&t_(3Ro;zT$bpnv zC0h$f_k)}##`>2cc;~%XhPGF)lEfVZZn2JX-vhV<Eb(KkgkdgMu*|;{-zxW zk@%NROn1BHl()AWaXU8DA4&eUol#AcrD zN`xz)8GmBobFL_;;pq&@EJw`jx6bQc@h@Lp|Mn$JL*JSSyx8b!=Q~Bu&Qz4f3I^vq zv=!Rh7mG0{c{W5_7+ba`V0g(AcWS>Y6!pNl06(hdd0CdWX{>tvy+gMmIFsF`IUYhz zfvLbwj;H@(s{gStLzA&zRVipNA@r2MCfM3sv1!wo(*DcW8bo8o*ntN_r4y`9iO1Q) zmPKAZ)$`uM<91{#&~i3pE{+V3&ecc-=8>`!7S=6}wVIgjz3-OHAvUyCK1god4Gj#c zizXlEOKqorJ+(hmm}S2a6i)rP=_F>0|H31z^Sg)18cqqt1J7C0lTVo5i%!u&CEuj~ ztnH%f^Qn8VbHmYfN_KfX*P(&C=bC1J&J#d3+VA|j==(CPUwh*Bv++ctuWc~XmTTRi zi>~sVd@^3q7*JStg}Bz^Q4LlrhuKE8k9+!r$%Nk}pct>J9Yw{_zAuPOKT^R7nM+(3 zZ1@4y;yB?gE+H@q*6|FQ>!3KswL=XhlRe+t1XZt(C~4CPTzJvr`R4K9JRE29ckgek z-d6I99ka1tT1u6hgT?T$Nao&K=-hpu87{)|UVD3s3<)HO;}o4->H=3k)eS$POr-ST+BqfCSb6w76xY3rh9AH z+|A8~O~e2GRv2l*BhniX85=!A5J?nW`*a3;JwXOKB#NFdj;lxdTP~=D|PFSCu06=GN5N4 z?p`VUE3Y{rx59^3o_X=N6==Bf%$d*sBrq>Onf`~%z498%|Iql9zG8K*yyQpA|9CpB zvqV%{K0Wjwx6fszu{dwgQh|vGOt3G_%F1F1Po>?5EKJ~bt7n||5*hkk8oc6Ck=2OG z^#$)gUy|D|@Vc!BAAScABGo5^hu`qj*B7$Yen3Ze`6`ezoF&(s$3z{3CLeqU-C1x; zXhsR1T&+?Ec{Fgi3!RKxUAE!M?koje!P~_+$gbf^cJQm~^hTgCC^ezyG+1Ft29Qz( zjZ`;d0yj#6dlHW;g_Eg=8Bl)tM-Hm(!5DPmAIqTdE4#JJ$J*>+5 zzH7UyU;(J*Zqa$QkI;CgpN1F16Hk3YT=TM=ESX0+zl;pASS-5#oqYJPaL4;} z%M#(+hOQGplGWo|Vsr4^9Ve;^7U_{LGvkEhiBoSbhAGBkAPc@ano=D)e@2;LnrweA z?My97Vms))(N7(f*~R?naw><3Hr?)$B)D_znuq~lTMx|xaFe$( z_qnwhrM9k)ocr|vpCF{H$ApX5&=D0|{jUKEt3UeYLA_eS@@Hl=mKMw(5;@Ns25}y~ zy`=>a-kV%caZ=KJhJYb;+tsUA!?BXDlWsm#C{2Y3+&nZlHp52~pA|TD2H2B>l*CGk z2%q2_*V9BN=~3!^5>E2v7G5Hb<37EWDwv_^%gd#B_Zq2~!=Hvjch_(ls{DMus^!Cq zzu&W0Gh7fB3l|2E#bl8^%5L4u|L=0=J|GG2PT!eG?2 zHxj=6HvynXfrHb`QT zKV!d#`CIk+V-zT^C;qAy9eIKaKh^>WiY}Y_ODd|o{k+dw)+fQWA~5Q(K@UE=JrloN zlwV_02`$}GMsuBr{^BTb76>~bY*e6OpbJx0$`aE+R#~mEu>siUQ{WqSw(0E0=+bDNrAh4=C>M>+~8=eiTUZl0kd5yEI?xroLW9h&#(yZiQYd) z)hLo1`|hACkW@_bVW;p=S{Rpa2L>*EH1^#6b;SvU`s}X%gGI`MzfQL@x;a~ z9zMe5ATZzEq*$uW0W5;Y{PMYE@wFwn1fSjvXSlE4))bf=OpTmzN&Z2PzHy!wFHEac zYy_Wi#h}bHAtW2JDIv_-Zm}_QVQvUJQ8%L{HFcc+<&i8S)%0ePotee*1_yv_1$ra5 zqtWWnHRN|TDn-NL-x(U?6TgncRh!s-7tGk82f3=zl^~8@g**7eSc3SL^d{927Ho;rHe%%J1sn4 zdy!dvHO7e6(DkPr!@sC_t zH>&Y>^{_L9qLH^|zAn4gShzGkh*>>v{4JgBZL;ZoSq?X)WRKW=%lms!_)$JG@|lJ2 z^l-F_+!{RVtRAZ5RhxG%FCPn8Y4pxiD(B7=IU$H#foaJR+ks}*ApiF6o|`nZ%y9Wo zJa*!yf}VX|tbmdY%7MWmvPFZaPgK$4CCWmT9_38cPKH+X*!E}!R^hNmF423FEw7p#8u&CXO~=#{wc7Y>lgdR?&5;_PW0 z<;rP|41c=-(p=?X#-5uwOg=*sw|{*2kz6AZKAScPvn~?|nxj`Z7UJ`C2`U3{a)|hD z6pvA>B!5V_;t0*3o2PE31F!^)ul~34*t?KL&|Ev#N4X!U)N}YCU*fJ1*qnwg26Dxd z!7>?#aW)o`nD1h__k{(Jhw+}75sV6-M;&m6ej?on$i-ER?QrrTrms5Qx>mIAYv_MM zTSAR)tlCb-w&YL?#e0TJa}(TC*UeXEF5L#!)n=+kroL;}>Im}5Jx1!92aFIetBT4V zZ!er(awW&-rH1SSL@R%>>ExTE&g1X)DXf2`14seVee_dP`L3onCQgv97vJ5OTTx9> zS=EFfY@kM(mrUStosAf zHwku=cUy&N>NhhKLh%TGVs>plY77~x>hXxz547f=E}-&lI}x^<@#3=d_2;-#bt<}} zFh*8ln`Gk+hTPWhYGqNeBMmp{1MnmQHkB64?~Do&>NajRCI{3}!_5mFciu5=p8ESU z9LMe+h|2`e%S5<1L}?M0y!(aye2-(J2dl4C6r>x_tIccQ+{h?E*VB^txq=e!mdZlE zm0_c1)Z(eC38d~$#d)ly2G6{9_f>~M?@w~-NY;S=z~j2EH9vBuGKW;$>R2+a4NZa-Tx za2B94)=|t=@-ccjrAI%r7@riQKP>ha);Zuo*2w#}1+^jRa~2k~m$RNJh{#T@t7Rqo zkNv9AfyxV8%8ri47?%>RcqXOPm1}?z^DUfY5|Tg=gSbly5w_gY5uF#1*&d{N)C>aIytd?Y(}Z*F%QU#ZZ*+yFqHN)GlqxQ^mu!!Ux_cSqXS3$QH;s60 z@K;J$G_SBkG;=IHzXc>-B$SPUCSG_}G5GC5i*F9d>?(bS50k-2%BCQnXc)&n z2E!P;hxg^H*uzzDzWTQibAsXwP$?S0JY8NQ%4CD^U0-jmhkA&Zn%3PXAg`kMxAUL+ zrFA|>kS_rB`4MX>iBo}OZVygb9MFHX7@mUS7(wmB6AKMxgKKs4*5o_|S@mQP6c`Pk za=Aj4^xnZB)mZSz&^u$LijHtvyIlu_fjy$kd7%BWJ`bx;_wJjrcL2W2OnNc zP`?0rO6MlUBH0Zbg()SSuaW@gZ3ZoqN&8GiaL}dQ!o}Kv6N>l9ERsN?W>heO_6lQJ zgb7;KjA`~EPyK9IJhmEK?)9XoPYrjK8yXeADAyRL?`lpNt}bx#{i{YoVJIOzQcJnHg2AO$C>rziGwRdk}HIPV{opk z2rH6B=b`&=;zuS&@OjmwASa}b18tIxfisprgeT3uO*MH{7vyZ8jOw-1pz$`(V;@3tj-^KvE|Txs1=P zQ~WqUr<`UN@{lBg;u?8fghcX5Pjd))hYD?2Jcy;-Q8w23r2QiXDp!3KvKeH_Xbd7} z8?G80T%)a=cmp`tc#Eo)0n#5(4nl+#v7Z$#*_5iBusurQ{?nly=Ie8!&h3r~&mI4D zyLkgh9$G`)t|f{x3A2I<_0r*vCwZ;|r}vt%I%**TKAwhGN^x7bM2URQZ$M##P%N(6 zB^XQqj{`rWmjB%1m4fH{Zy@D5P%c3rGe%rPWch*}I3P#X#2#)Y;PR#;sXdQW1D<%- z1M0FZ;onDG%uK_pH<#ByYsFRuqOwS1Kx`wC0g+OVqyPYcEuJ}4o5W?0q^bf$xo^Q; z@PmATJGJLNT2gVSAbu1^5#ojP4$U~Bck9Z?MHQwe4&X-XD~tf%Jb#cA6J-pxX|c3B z#en3{<^$-_^K+{_b?=Xq1UwHW_&4?OznS)CKb#&fmd*dYzg@Y-(S#&l;APLJe79luYqdy3G81Rw#evPL7$>rf|Hix z45R47J5W39f+h-+H5^WFTjRHF8*PJ))v!998DBS+wqY;qp zm^V4jQ&UDt6^;TlDDA_~djH-u&282UQY%h671B&#^9tE8;mz|vMvWcH9h#!#*ug7dBcNJO$1TBqp7Y0LL(?6oGI{xO@uvaYsSex(koqeKqj4j9icg#dw7GXnOXf&j&ICZ`ow8` z-FD`U=JlL#g=B;f;=schHWQ=<*Q*;E;e_4ZIUe&y5dX{G{}?l;4(#CImLX=N_nV-r zz=lD9s9!p+rd%6adpZ2)DUy}ka(Iu zdA=Q*GOGCc^oDY5YUE-tN+=N1KfKO%0!N73zG<%RE0=FxHGOT8SXOgQfIkT|XP#ZY z$9{|Meu!dD=GsPNLa;`Xcl&(1+iw`*e%yRywxdbpt}#u&a!|wkRd>Z4BP`u~oDUxk zrIdYnlITbqO+4mP-lbj3ajQ9tKhJs|X^5H_C@j9snZMeDA+i|Y@q%VCvH5d5`f%B? zq4F+vWrD4rsWcQ_na+`w7O7*3o*z<|k(TV8iEdzBUW)!sbj3iF(!Q)n#tz&`B=-D@ z9ei(LY2d=o#NwLWJ;zW1Lww#iF348d{{!`kgx=mtdf~WEGWEd>m3y-*Z7v1oK9X7^I+-gcvRRX`lqa zTJB5B4wevjiH6aA<$)!@7y7fVlCZ@AA^Eb>=pp0QmbPy|B)zmOR+kBzGYoAvuvq`H zt=yRUU4T_`=RAtIGz0O6X&X}4aI(fPyHC}3nW_C_`5adHBI4BofrFSC0(GU2kXRh~ z@XT)R9pvTwsJkL}>TgLxw-fMJeF0J%Xc_|Uesqi%`%8s?R_oDo_x>!tqbE-6SjqF~ zC-nGV>L>h%)A_T#ah=}wNxjFqGzTacB6X=AxIHN2Q8NLkJ9cLH=91YB0H z$7t_CVattan(7f*FG{^m5loP|2{;G4RAbeEQV$|5AOni-hduMyHv= z2u3n25|`3QZ7?Y@HBbd`;4g9Unh1R%%?BccW3_2IcNcBcJHXQKub_41uwGreqQeshAd{wWDTpEx0Ah>>iRqXh^!_jdH zZ2Ju*cH{{Q@4ELxNY_Eeeq2JHr=V9-Zn%6Wze=l>JM8qU7xA9!d(|9?_UJNs;+G+7KU&5G}%@0CozH5@;7{ldA*{1AwWFW>?G^y_E_aL#ar-$k37OWl1>8O~C5j5;ce9r;kjCQUBViKAn|iNH_%j1v@R4tN=O&mfTmKYMW_1MyX5E zRz;fT(TyrGKxVX{;cgmS`5ib=X-F-fm+3zS8RFxGy;7&M<1t72eLmn)!JRP(8nv>^ z%Ye1Nm|~(7kHl_-k0@xifWM=L0kkfv@?auSqM!_ed0JwVIwL^+Wz-P3#;U@ogR`fr zgdk)uH+g_Mjd1BQDEAunyp<2vW4W%N0ixQ->p}?X(m~=8YBE4r6}11wnjT(X#YV`T ztNPtn49jsM3}|hc0w*=V$(tSmWg4OD-jY0wQiK&#)Xid*+GNbUZk_fV$#sD#MReEM z=Ni|h8XMifOo|YUwV!l$1iKg)w-)uLnGam~R&SPT|hrjd6?wlr>kLV$B#Dgq962ui})^cK8uLS1qLe>Z@;_i`|%dW0!e0P{+ z_RAUf#RcTrz|jL(dLxj3-84-Um(pNPQ%!$3!2RHMenV00>Ky2_Z2p+3OU>*u4=kxU zMl6n_{t0B>p_oVJ9r3Rx^`lO2=v~F8Og`U(TD~-79N7~1o{*pCR+`I z&rpWr&lxuW`bPEN;XBul3seJA<#CF`N!RAQf1`nGvJ7_=y@To9C@`!WjWf<($J-s$ zhxgp=vjDcdGchFaq#tFFgH(Y&W1AERdK|^LOdR&H4Q6b~x`dc6fnYJXF605;qcPBwwTZOaDLxC+|^r*$6|<#QN_ z17*tpFw=XTin>%md^+PPEiOi!{`F(TRbD)rntZ#55cu>#6zO8myRwDZF-#4>ckxoE zu5TP{*I?eo>5aYwG2&;)RfB;eC)}_H5-{wPsau#Dm=Ig3;bS<0LGFTlS4d+Y!huK> zshi7QXxbS4l*PCRZHc>66R&w8LR}@=6LYLejP`9_Fj={kZ*I%h#l=lH3bbJQa@)K5 z`ucX<53p}B_Q48-rGlR+#}@_{>bJSTBI7`7nGJd!?B(FH<3>gBe0;rgwK4G(Tc%Gt!f{HU+Qwz0@n}4my`@fc)p8%g{82y3b*LOJy4F^?Ev-q-?XW!@p zkSdXrga|LPj1YLo?FSp-jM+7N3dsM(V+fM zL|?&Mc`$sp*tg(=V}Y0 zj4a31G#{GjmC#~Kv+SUnex$^J(XTvNdk*z!H7N;E(~+Y(ybq1Um))`QJ?*Wn-yCA% zJs5>di8{cgEvaQ&=$VS)66jC#>5|@JN-MTFUKo0XoIunIcsKNdE1V&$jH|}2O*e#< zl8ql0By*83N2-{}tU!|(){^rxP$kp~=FRI#h$ikiU-qqcxyHmr5Ka&@t(|z}{BT5md+L|96T|mwoLRBbPf@xQ<5L=2m+fn0O zUe1iShG=ZjMQ(mhJfx0}jQ*fcsk-^$^ieXYz!j$Rg)?eXeqW&YqdI8IC+bFYgHN`_ z`u9Jw--!!NGI%*CZP2`PzQEUv5?M?P*dVOT(Q9CU3qrxDD)~7?O2_YE2z6Y9`eF8Q zeP7n^+(kou^QgLc*sG-kmzmy8T3vypl&U~oUlo|tRr>os_32zlJ;PT#&BsKS6?AeXgsOjd?$y+>(`T_9qQmwd@;$+a>3PwS*RBB8pnC623OZE9vu9lJ zpdeEeti?QL1)z)wQ6gz%K73+XD$Bptq+Ue}Qzrd@tG?L<3D}S8hFWuXF!l5*W94UJ zwZUhYiK2g#bj2EqKWcZoeF4Qo6+cq}Y62QbWPz6US|IBKOO@Y7_>dqU>{w9UoeVO{ zM1Bz#H?`GjNny7@%}>r;Z}Tzg;d&(CYLLIKQ6S@i!!n+EEN9HeGd=zgEC`!v*eBh3 zLTEEmVWkcVfwc~f{G&cfR?=zYI}CSyvlz9b4&Pm50Z>i%f7K3?iaP%5&NUi^IP9bH z#M2ol%K!}Ot*~;N{Ciph=f3@x!s2<<5R|)p1@8ME8)?{=^d_r-q^FNFG3oGHC;-Wd zqFeGLa*JMY#M`uQDC&M@>VDTibdgG)VU&8E)qK7;L`=4fRJ;}%@Gbe`>Eb7PKhcup z8%dydSJ9@w?@sBZzdR^~^kPmC&urfa>X#ZH33>9}Xtg9=5kMVj`rHK)B%=~4%A>t8S zk?)xVh0DE%xW)Yx^N-;lg{ zptYm)<^9qpv8B&ETt|LM|GMH}1uTOITeYsUc}2&8D{p;+`^TX(dufVZW~XlZ>-#0C zhvAv?eyG1VB0#X%HHabHc7UEMVzf5s=BNn|8SG^x(wIc#jw=oHOm`+c0dfK$ZJF2s zW3GSj)zE$bpAMc=4UZK=?T}>*YU5N!rXmG|j?R;)2Y)mq;cua_rFj}fi=kQDQpJNW z08G6oVt7}+^gde%E5(rw0y5-W+JpI>1aZ(IXg<`iJ7t+{PmSRW%JyS=5Ub;P~HGKH4Msb2D zn6bQ3ryQAj^+xj|Ez*fSJ%*41kw%V+AcA*~6UG}*V+xdEmuUMn71B5ei18P-%bm?F zlYx~lDbs78Xn?zp*EZ+Ko1lgwjf*Yd_%8y3G^3zyi)W|O20LND;Lpu-BWFkCEn@6X z9e`8v;7~b(AmlW;C!?N^D8;iWsFexSn2b&mm_2|<>ve*@BM^A(KK<_C)pdO-R@)CA#20Jv%z2FV|(weOR)?ygs_PEW`Tu{EQ9 z4^d^^)uOj~t1(?1x19F@r9y)sY%FjB)Iy+g?C);dApQp>GBO91e&Ah&O*y)}FG24) zG2tvB`cianCM#$yyNPu%@%Cg~TP#xYO*O_IWF$kQ5OQS^fk(s+Tk<{dR?tob?G&gC!9FeG_^(w`*rY`)o}VuG zFz#)#ei_RH+XmY^>nt0fx*9J0NR>ih@U0*T$3z)6iwwBD+3N!M^YIKHe{$DZu`}!u zV3&`0(p#&?jIG3CupNC^Y;b`PXM$jH&ENyocz7NZ5{=QIA?a9-Zh%{WQ38hEL*iN8 zoxeMyxqCDXm1b00%5u{nnlnL!9$Xs=SZ4E~mSak``eC-r@46a*IZsy(+JEy|*QdP= zPB2VWk{saw8k*U#B5M$iX+>f@%B-JM095W#bWWPD+*V}#Wo_?SB%GllfsEMA)W|JM zzhHKil;6LV&pHgU{&J%i+A@Ju6xe&$4D1T}qsEWwKTkHEay`PKqV)j65~43iS5m>| zR=kiv-Fw0+eq*kDzK0!ps0C@28uNCf%}LtIeP{RRC`)1@Beg)=Mg?}IiE6E1BW%CW z;E;kDaPwV|g|Q$f$i1pZJ={Hwh(?3E3CcyW_mnNxX_iA@TI3gU?5YNbhZxr!JbQJ$ zf4``7V|ck2Dv1yVqUlH1sf%sF1lsc)m9)rzo4j{AvL5ZB3Rkf$?$z4_JJQOOkQ1*3 zEDSMLhkoK=dVMJt?Lt6Rx6{gq0VZnR1gOuKK(@8D(}^M8#;F3PYBv z?yArZPDxD90hdEa%u%rs&i4vKpfg~1dlTy5ET{KH%b7)?V>#vIO5_~HWWG4qITY5L9?Rsh;5MCbK^ z&k?@XB@FDyeQ!gRY?(^L+E;CFHefRy>W!DAZAeK$me7=t3S!Ou->k$_(0KIHlAY2|T3~F|QoPTfYRLrO!G-y2ses|X{73KvJ*W7dO zH}&PtX=l2}T>+&13@)Pjw$kP~`laJ&Xq2i-D zs5wai9zuzV$X8!hRjB!VUeuQY_6kO&m-hrmv1Zw;XJg0j^KFmGhBnH6v$hM^VWKEZ zQ(Q9Ms7|ByovzJ2ZIq&UcN=vhseko3Us(vUiXaZc7MHp>F7CYUSrS|1J^hs|!!!vU z5<8>jGR%YNq?(|+n5+ap?iN2Z>$zf7K4ocWk=W(i*OocPrC>?L4Ed)@N zrscz)PEBsl&-QVLoe?%hBJPtC1KBZOmOEX;hmzyt!4>VH0*rUdUg%HcCyZ=ijiY;>A*$WDa&! z(mP6IngN4RxD>mZ3IUgUwewsSSvx=&^VEYrTsa}~+6NO`a(;2)^x{N(A$G~zWRAG& z%x_m4Jota!nDlitMz>y6J>HZfz?Xfzc~|b?;uT{f2abDz<2f=GDd3F9&GOq?(B372 z-n!ZVk}PE2NZDsdgT7{f3CBze3t(m zqoZ@Hc#08J@)uv{#`5MViD7Iusxb+pXvfi~M}N||L|ciSBFh=J9Iy_2cRFW{{hIrM zB?wqQtX*lthaW2SyX?rqw~ZOl-I;OG<)ySum&B*zEtYQ+b_V;W?Hc~7EFbFd`*~k+ zFpIH+Ax9cDuIGI`xU821 zeyS>xf?-3!79I(#MRuCQhP^sUWU5X)F zQf=mbY8Ivrr&;S&^iP}!wDx)%re6UCWmVZ%e>&IBt>ZM;>B4eKo2;#Aac+ussTZs+ zIl-kMS->=;91$aRNPtG`g4Uluq`{%XmJ%fmsO~sfu3y5aSYo3$9Vqv0>qS~s=O1nS z@I!9F?sBzXuYV8!UDf9JM|T+darv&skL;Y{wc=Mls zI{t4|WV3G@%f)`nqYW2L(3GA2cw4+PIVE-w=c2~s?7#XdyUG}mf@gj{!OImI!iM$p zC#(2{-I`dv3R#KzqM!qe(N3(vv{&^!BbZ=ejTR3)D$W1&+H&P!TiI1FX5fHzXR=gO zc&W>@W=7UFCF&#hwa9%sdhXZh+?5UAI_Z8n!%PV!C6oK*kmOB74M~7olAW7=1xBAz znYY1wic(Tc2cvsR^sukSj@;g2`Nu(4?h}>HGLe;SzfB*1HXJ2OG7x%I%jbp!S6DRX z23c6IT#)&(l?x)7%$Xa_Ra|N#?`*7~WQrYOT_k7!tq(gExI;EmUUU7_sX*(G>v;L< zj(>V%=RQ~)`GO$5ish}0ZxSxcT2j1Pn^ZX!LGsT=ZExOR9u63g(XPT&v@r@E{Yj~X zJ|UD#BSRKK;>z6|D>tls(Z2zCh zJl(vt1%cKY47XzyqH?u@=_%EfMkm1S&BgN2-v!vrxEHpqIIl=@7fN4bO+>HW*lElb z3;kxqYZ>(suI-~$+O9s=LEk}-&d6Gst|*BiIz*BzL}Pgb2E~}|PEXcYtAqc;A+OXw zU0>Q4qhdc--c#Uz1z4x*H!Ozdt77be<`+WZ@~sr%Sb~Ec(xJpXcKLg7(*uS}BPPaW z25Yp}eci9ZJUr$9` zxn>$|!Q=!>6aq$KWaC`Q%G*Bv>-z(P%w=m4f0tk0s)_Tete)p_DZ9Hz3ZYdpD>cGj zOE#Sldq-3oS0xBj6xRfoOidmjjlECS_;g3!hm$r;#^?x@1$$dR9`m{ezev<)Ab#gq zB`~fS3);Hy>*}DA%y8d-_PbJ+w^I#`ul?iIpU&sHQu7+)$s4e>a=yTXQDJCXdvs#& ztB!o~qM0cSQ{oZ7o+R{t3o637@Hnx6_U_!0Ib5(nU$lfC?~ll$_%Tl+4ZfF%$QYFS zET{!IeVb1;|Kp2bar-^D4f+#4Uw;1Q|GEb-DsqLZGZmlOQ6YX9E-+Uk3C)c5W?vrkJ;YoFf!gKB&C z>h0ZoI`TEzvGcDtxDzg2aSr%zzv26qz~A5vKm73t#4GMj-o%UU*Z$k@@p+3kN7IHo MV*ZcppDx_|FJq0YMgRZ+ literal 0 HcmV?d00001 diff --git a/rate-limiting-pattern/etc/Token Bucket Rate Limiter.png b/rate-limiting-pattern/etc/Token Bucket Rate Limiter.png new file mode 100644 index 0000000000000000000000000000000000000000..d41701781e27091e6b2f0913581e18e6c115e850 GIT binary patch literal 122458 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 bb~5nvfBl^=p4KhkYurKmuk!wR;-~)&VwMQW literal 0 HcmV?d00001 diff --git a/rate-limiting-pattern/etc/UML Class Diagram.png b/rate-limiting-pattern/etc/UML Class Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..9292880244e086e87fe98ff0ac34deb436206ada GIT binary patch literal 122880 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

Mha{WV8AR1NRGN+NYShMVSfBf~ z`|&dPH)OQE*Y);26)+^+s6#7NYGilh98V=+;|XkqSAbpul+`KvcZnPH^m-yTbUz2N5&9f$qzM4QaqdHiuF-U4o4_sYRZiENOVkD9=e;gJbvxLMhGT% z|6`vId{7oOAKUtd0{K|Wdz;unud$#B^>SUT_c&s+s>m)GiC8S_wNph_s_T*iN_Vm- zGy<}i7M}EcOY)mhKv;3@HY>Ev0d*KTF~dzklqa_A#&Shfog)SUSWlIG2vwO22kfd+=NFJ`H6vdng}dPbY;0Up z163Pnxj_q~0Xv& ziLO`Di%>qDV>sjBzWPNoy#9pnsyYx&H8b$)ex`82S)nr}9 zfI#X6gRXOU=c!xiFBaM<;>3A&%L&hUYhH#0wwBtm4FmDodur}>AaJ(W+1h(JPjH1! z&QjbAv%E)U6w}YWxoLpW)i-m%%rOw^X$*Y38hapY$=UIE;MG@yz-5>%FTI@Y>zAm! zBYU=T1NX2CwWA3r`L-~j5m06BlSl|&u_3eU>N@I-UgU|y-Tw4mCyvZ&KYjpWpV|c%l%p-C2hUYLMJCALKQByK`ia{loIH3nxU_=6Yuzb# zn#=k7jj?2iMq|H1e^4c)v*JXUnyTwK9D^yQS;pY6jc1>@W9RnZV~7sXdT0DqC$VBtCbJW)_yPJYpElfNVuTWB9Fq@&_pAmNwWHQ} zPKt?nyfUf}sDjv2j*55=O+pYdRfgQEAs6bms6|2GTh?TMFZK^)R{1B`nU@?fM7%lWM1KH+e_y?#c^S9j$BYV$&}ed9umpNIq9mGE3h^ zc4eYb$GvxPds~_LaJ7D8_h;uELtfO$P7#b{1*T-_NNI#+k)Xko9FA;tdrbnUs|9jT zSW3<%>(=#BfGZ~u7{3*@w>&SJ6couW01UmBsEdhZV@VlCV=pIfX+9ae4OYKXK~zc# zvGj-RxE(>4lb3OHC46Qk6P`8SbWf9~sfR7SrU$(*}|7`ZuF*e1D-5`pz-_V;WJ6x|9%^UUvC3Lzgm=8t;k zlqmx;`UJzp$+!M!@Jj>20O2N%@Y5<>pwW%xs8;a85JxMVN`o8gS;`;^HLk28oIe4S zjsc7M;+spSsNK&GUE=NeJcbg{O1MpN{pm2NiTCt?r9MHGoyh6pNYlGlOtn5k4%Tz` z$e8+CubgvpVO5`bL}U5bI8fTK4128r=#$69ZLl8ptU0J@MGrMd>PWnn$dlJv>!plq zQgT{d5;Q7%_X0j##hRGu>lgY=V3y9l!M7BWmyU5hwE(Ydehb7{uD zHlLEYJda=QqIJd2D%Y6P6txG)>H#SrC)YYYRy7Cy)l?UTjqFBWU8>Zq*Y2kKC2O}3 zYpId+sjLPS0c~PoXrp{eFbvP4=Z&k0r&Je^!klnnl!IzzlLBJYk#LE$t!_}-bhO%z z_1Kef_Po}cVV-s`i52P3*1o=V{0Skz8+37a<24_)JIq*e`kQkW8BW`C)Z29Bs*~5$ zDlTn>Y(>(0BRYO?t{0AZzmDumh5|X4REY)Np73%PT5yruf;%e=UzZ5r8DSVdt<{Sf zSdxg~!6MJ4q~h@GT1}=!O*d||R*@M37RbMp++<+D`AO!3;ifd%eI>(kDi+DJ6$rX4 zfk1Tlq$DFQ{ArYw7S|xQi&8@l=`l!^<;4nl9Ie_)kUuo;kF`(wO4){jsxksOYGtDCF7K{>g6n|#+G zCi4BLcZ=9Mv!j9Ssr9epC>SXh6A&i>5=m6=WKG%sL=PED%&VjnQ_2gwzHJmwNy|~c zAG@o6iM4`vITa=?r4^r3J0UK#1m20Trrh&;hZF*4) zx_s9+*@8*rJXnPO9P)8XAn1@UzQIRmr6h;z4+N(wuxAQFnwu4eAjUCK{-lqpqpWez zTjHM?RtD06UubsTLU3=NK(~(;$>qhC&1`o=I{T+wSM2-Ck_uJu*#??<>VxjDwnR86 zA=tgEWde@;y;g2RFNfKGyV-n%mXWQn+IH5xq;#&Df$~SSsn6V>1y)hUu=`IoW?n~( z5TBmiEH-w(`{#ZA>lv?6IeuS5`7EWldV|N%Q#+6Oky%P zxehR@K**unp`E+`era<4^ryDs>;Hg|iR(KFpWnYv0oEzq(@XwIq56D{x7ZeDx+^Hi z!NdRdNcnMK{dvCqtUqWJZj%9I$w)$XLSbvMaJ)yeuV#rnUA6u+#gWb}*~ z*ZC;g2x6Z66LCb3h!&662SL-a+(pd~1tGUStjiS}4qL>}G!AfG4XZPL^V`xiamJNi zIY==TK`f!f1=;140hjD$LaLS*^W|hw8(Kk;c@cdJ+gyJ>HtwPI#>l1gEh?1Q?NCuk ze1B}9!2lN4a%%O1ky1&1zZbw# zrv8d~9E$#saE8>$TyB)ynpJ1LI=UF7ox_xBd&RLxBhM@@r2W|j0dnOA0&|Z7cIeOa z8A)QMwv0G5FS?j|Oz4M4i?fGbYi<4W>&6rh5S-Tju_DqK+g>6Tt)fhg)S@uis?HZ zA_s}X;evr#@wHy@44IaG>r+_X&OT&Ody{Y{Sk z3thm!>FdAKs|2l%jzK*v|4(-lIIy3(-#D-Hk3j5|!MDjssn7qwa}^xt-v2gN>HL3Q z5N%z#p99?^j`#i}1pGqnyQNvb=xgu~+-8xzHHN*iUF-kjnu0Xo0)u*_Z=E|)o9Mp3 zSus|()B4hTf2Kvq<&mpF?f%SSy6o+O-Fia6)?KgPPaoZQ&zW0HD&MQF&h7oxb<{L< zYGtLCuudFJ6qgiGdo<#^t3h1bqS?e(%+zv6)6cZ-P1Jv5@+Of#)U>ZFd+T{$Ju5`{ z+8Iqvrh>3RX)6y8*nXX&2Z5Eq+)n0T84;hWu%Y7jtxQs)n=mz2Jp5k zA#mt5j(KXv+UZxIHjl0{cW7$H^AzokC+KA|@_d8{2FYJXmy4lGSuP3^ABoQ2(^h(?mXePgGkK?&CC;ih`4)yJ)I%AGCk z&OttTCXfIY-2*x1X{gOOW3Z|m5?HvFxP528{7~bx&g#b+xgC#N9=<=SZ!J|v_w9gR zfUNX7NJ+l3Odcar55v(VNX83hf^ixaQSK4gv9@pFy3SAcYRjngrMDQ0zgKrhG ziXwKk?#P={D;ejoR)lj6^1YDuQ(#}$OYxD?=_o~?m&Fge7U<7MGB(!$wY%c=nkGiG zH1k6BeR{=tSfKcLY?SE8QeA%#PW(JXOeW4p$4z-)da}7;x=wtg3XvC)TKN3FvJ`QA zb9=N@whAuftPY*397|#1G@a4E^l1i6d*3P8w#M!`hwOd-K~nYufx7y zeD`8jG>=}kK}`_ITqz=x{dPiWW*aJOL_aB=5=<|SNaIP4RlVk{mJEY`z?$&aVhCOv z{#*!cqUZfMe~9~)WbFL1ixLVez9s>EF_pu;Q81R>QP2BkZMv&5p^eC}hi7<7nRsYp z9@Y!egVVbfQ1d3nXeKdXx#pH!G#8>ZWaGK>>&_ zB-2HQ*oWdUDZ_S8=FvhWb7jA~?~tGcG-|^{k5w1Q$O9Q?oyvX9{g~8Ajqh7P6OPu+ z+GyH%c_opIcLTP~N9G?4@|2Fj${Mj$zfd$!O{2431~S$SMcJ`Sokc*Ta(H(bD!d~U zbEI?qZ&P739c)GXGENU~+7!zz;+k~*)Z^D#R<3gKzhGW=luo`6cuR5`5<)8pzmT>@1+*;flmDynetv)OF*&YO3h^=O!d3mU|MlQVIUP z7?D79k(yI6yCSj&dA$b5i^p*n1aV-icCMTE!6}3qKK4}PZj_8Ud);gp3Ce*FaS1S# z5uEB;KASkar*|(V~1h+Xd zwe9}<*O$ou&gS_U5iWs1^z$^Cm+SX9F+J1Kzkq=c5NzZ@9P6G841eM8o&*mQ&Nu+L z@NY~$7KkoN{oR3R1up$>oD)+R=Kr>aUq<-h6$-Ej>~Ai{tB^o69pm5P$^Sc+RZb0# zHJbNTilzJUqKuQH_h$WoitPhOaBoN-lS>35>6KoVzemmgf42|+OJC2wxU4C6J_<3{ zsA~Ns$mfI1!4K>ZLijyk;p{!b>vIKhMSNW@H-9L{0CT3()?w(GINdLm+oA!h%uq%* zr_A03cE&|45kmEbM>S2{t8C|SLt890-@I`b8Qv;`6GnxV zV8!7}^6%KnN{fUDv|pI?S-D6Z`oqh3Wgrp=y56$aUmB^c6MtN;HMp66HhxTmhBDpV z@OYC9P<)OkP#sk4O>OJ(CyEuHThw$PQVy_nwjSuY>|3_`n9IH~ST}Tlp^E6T?l1Y) zw00z{HGXFB$p>r)Xt-G{GA&z-@vrXP5Fgcvu_nxhh&oT+8b${6(RPf6Bp!U71XfYJdHWV zA~4k1YZUVmrZbI7Fbmy05AGXFDjud@+2uW1)#o!sMa+gG&LB29v1e9#f>BWY*(u^Fhha7k5z}Gp?eq6lm}u&R z$t?Ogu}dSL9dx8j@uHM2lu@DRp(e~n{ec)|o6{-v9NFSV=-+S}FqA8V7tgQM25x@w znY^$eMdV*yeLAg_@~0wStB0*g-;2M@*QKm87A;?lh1E54oYl1msTX$DbQLhQ=YQGc z++~RKw5pRIXr^$ncHF!>!*y#nu!eH`m$(5$f&#&+vuWlaN7hoylajJW{ZE@n{c3wEhBC`y0cE{BVfGD5F2f%eLn{4H@Wodq0hGZ+XX>Mtx0 zLfD=}GBkXfjmDXj+RRrv6I!_z{raX~Qa&+RO{`(*dM2spnyNNiX#Kw%C}I z#0ih(X5|f)9V?YDq&RL^bKO!&lyZ^Vn%q*sI0ckJw>~}lB?yNM#yDfoDnF48zDazP zcPE+ciuGU3oHY5f!fDcRPNv7<*QM)czAC^+v+}}MvM$jlv&~-^>pLxbT|^{Yze6v4 zUAW#WBWzOxsy&+Bvba zM8X#`;%PhBvSd}2-!`gViNu0OZ=&Z^Fvd0|$w0pFD1!9rfN=6wpX@_oHeAOnvN?O) z@2%8b+IAi5+FmbH9o2E99Mg?`5gJRgm)+4OMLx-XI|!{?j@{K?m-Z)GIF{rOeZ0l- zet5|)qe+|%+&^Y0cvmk7y_dqGmHw`wk#hVfUa>c%j=AZ!0XskP#K_`{2|0HD{N5Zb@ob593!{A5rN3eD@8+e2H>Y5#+B2 zCEdUMn>ap!T(JaojZBiCOtZL4B0_=16T{VQ)BM#c(+Rm`80k~bbyOpA-|rPLQ89JZ-9C{73b;!i_b z7_aO!C~;f>5K$nu1f}>MF9&R{sQeuL+ZCas1NH81Un6z)&L7l5e7=la6P>mzih2jE zmoV7a5%aMqe|NL7z=m)b&3twLhy!g98^fVDYR&XECmYGWC*42s9+4r!%J_JU{Hm7b zw~ZDWWwwJb?dL0pq=*Gb<$s! z#M9tTxX~YOlC=n;2kG-5{EIXd%!GqqOg)vek%!$;%wNj;VwB;tm@jsE>U3{H33IJ* z49nFSuQ`GBwP&{!bu(5tdgFkG1|R+|1BPfUCVl5>O|SNiXG4$X?K5r3cE_oT^8lAB z!^BFtVD7pA>UKYx1wIh&au@r($IH!X9qDl9w4rHC=6!FrNhS5iBEHv+wdcwBDF1NI z5=X0h%)q3L`U(^nPA2>Ghy`^M>OqMpe;;+f z{FDvgwHXO=*1YwC7!h%$H06_)t(Yr@g6hGG)B!&l-@<`Me%z;MU%?6Ft`>55tzr!78$_=sA}8vvjm?#uZRE&W}PQ zV*+b&xh0ElwxgRKYKf>#Gs`gFr%J z=`LdwKqHy_WuYDYfi}T_Hx8@^^roYyX zJ*LUKtki?XDD$~tk)**>0V|e}4Z6_HmmZ!v_bamM3|gsY6TSM{LQy{ytegQ%cvV;Y z0`wGuXOKm?3#~pG|3c@!t6OBb9nUkXIraKM+skLf6WghfD^xt^`S)BZ?v7@WEvY!0 zCKDf|!V+ZQUSB8BkkIV)KS;Dv5;^U+MwF2rM;xz^<416rz_u!1s}dErvnrAs?GIY_%A=`{wqB!YZX z!d;~Yu@GJ|ks=~G`-VDoY8pnbYfdC&o)vR*v}bVTr_>FHfxMfgn#YgL5sLgrdm)|S zWS!^0HVD~WH&uVV0r7%Smxp_qjtrYfBl^Y%R3)lQ&PA1ji!SQB30vzxePHowOn&!p z9Z+=)6pjr^D;tfEqXxK-fJ+qdIJ2z7*0tcQ*ttn<%n6BD6LY=l?#uWGs-bm>8Z_JI zSo5rQb26^doyO5}b@J)-D;sfJY@eYhbL#ZfSd@M3iq+bd#M~4_Y*?tI#jsQ_7Ib&S zcBqtGFhdlY9YLoDX70(R*(kQTxz#wdZ!~zZFw1A*X>H%)lI-L*mkl)G+w;bmtU<=j z_1S8mxAL$kHyj9zB&AZA&bSRIi&v?gAevtSEamrO6ku6Kwj4girTdC&vK61M0`;Ll z1`H6y5XkMBjFJlT=gRTA3271-5)P>Y#p1K)k(NapfSSxUgPR=N48j=W_m(5)RC{we{Hm0Z?v z45$L<{9($To-6dbC=sd2*RGyA#W?dEPRRzs*}TAvQ- z+eq0F8V{hO&&~Yk1}+$w3cZDt!5i@Ah%=k&rssTv#CuWXswNk7O|rSXb(z-HkbC#+ z#JC?y`$ds0Ua594_6mpp&cMk#vG73?pl7J~fMtl5FGEPHJI|MbI`IhRYI-$9pcE!E zC{s;4&ATd-x*=b)8L|I<%CK5)QTWX_h4jH_tHtYxv%4BV!9VxG#Dzn&R%zxkCurIz zp_-qnB>y#^3S%h~pH8{Y6wP<;iLM+CI7=}YsEIA^hFhHVgOsjGYZjM zLp+Q*g5^+IIJq-BS#_~^7|3z&ejrHoN|Dtc-llIxY&o2eU6t6CfR>64*(^fD+?)HZ z&ap&upg<~~cf7<22pSGtI@(q-#N+Co7*qUL2m+T1f$Lh`BruiSyHnLt*Djis#`8j2 zyY}A1*)-l@EL6Bg!242v*SrMgp61b3>_9qeDO|TOZ^^+sNDM~GcZ%5bb;r6!8%uUG$OX;5q zmH@+)x?J#rcGl94BEQ}dF194#zcj+O-&+4w3E!Xtgz9kU#Q|AR(>2aUEcCQna|3;7 zK!CPc@N8teG^!TCkr{02rC@+>P9n<^@!lW1X3=IuJXOqd=G;o%$zMWwd_C8N_<`Ip zF-j?H!UA)mT6Tkf$Qo0+Ws#3?nalzgExkyB5h%Xol`;&UpY!x4rB6C@)cz0-cz_G7 zH=kYBJKf7FRRQ%F@U=|8a@!*SZ0Cyw*C& z$B@&BH2gwnG!!l0 zfw*UMiE0+DY|vt=>k*bfyZd3s(*eC@!eZd6FZ{7j9JW5{==|tr0#Ju`e)f4R>B?kI zsi6N4i~vB5!X%1wBD4?Cfd68A`j-%}D5K7rtS8axv1BxN>@~nc_=$&1>CX^U9}7<- zv`$K}*AQA+jk>5D*r3kjKk*X?qsTF9Ug(vIWY%^nVaXCH`LflT1>~u}UOa*ib&M`_ z#WsDZnMYZBP@n?%I>I}QxpP)N5Cnu&52?5{Mzq?8J(`ctR?xwSK4F$?Pk2lK%Q>Pc zS}hX-IVKKpd%){(AqOL|+p_E0`DFX+2)dzjI%f#9@C@$U=BJ{C_&eGD*-d^y&rG?$k@6*vM@uslA=j4-C^vsmZjg<6!D>h!srI(tC}V_FAbRYU+A3lP^t z8KBsly~O;({7I!3PJUZ2{lp1E%ZBZ#0}gDhx1R|sEy^N|Y&M67>gJu+U|bj2OLoTP zN9MzXMRbkRWuj>73h7vqn>-S>s2WU}TzdPG?!()*1>rVOrPg<*Z5sM@-Isqlcj7>b zsO#Fz(_1OxpP^yso?e*s1Z+UrvYUim5l1kdKiGSVH(*e60e%!jB{_s^9WoV zgjzkg_?l-Yy~h%(Zdvh}2QFPOP;Cldt}sXvQvRV=TA8`#fKnBL_P)~1Ku*l_Jd_Ep!v z_h|utpDpltpf0ru6DT%l7f0GCIfH3LdY*93Voh>2W2rU>Mt{qKTw%|2V%0eAojQ@f zui@%5bra!ty9&n-2aE^MgbeuL0D!$^&2?wG3+9!Epyn!T6^?fcFd~PMnq}`2n=0#1_X9+K- z?Hfcn%$-VZtIegTuC`pET9EU~mbPGuq$-c~f>QS!8NhoEx^4hHzXX;rtG@5`@+02x zv8Qp8{oPGvF@?>Xr4fG6{Y?qLLY(EStz`F;2a;&6UEm_SSv_GPlTl)8Sdwa26?cd= zBRs;%hSTDXbyi(!&hEm8WNQ09Y&}N7`>MKv)4Tj5`v_?BRO3c))6KVE-NY7GtuFmZ zX0VE&IlIEUFxhSwV>>vwn1>I!ThJpwo!TUNv1lx$7OUawBkjBU6}7_1OWD6%g&Dc< zR{VWh`Pf~7*LUb_3TMzIBO#@Vz=K@=0a*79bu%RNFLZ2OUVGI%nH%!dk2IAzcsVDt zH0w@u3NbA(;B>|d6YXIjbiN|H(q}%w2_KE|b9qc4XX>1*>CJ4o)w0{~jJasy__Y+G zT7&A^QcR2vkVqqNv>IscfBDJ{xNH}WAj1r~7I--^$BmRlwjtHitXA}=2bL%c9~tx5 zPM`A7e_tk_qYuoqIP4q#JdmHtOf%#0GNJO%Cz)P@AmLxeZV^IJ>@m-x1FDwL|LmpUBH0h6#cT9kQ$al76!v>r?Io60}-;TVs9< z3INQP#I-aGoE#51bM<-;4Jxqpbb4-&j@}kpozZwFBt86ee|S8wZHICY0znEeigcd9 zay`>+mb%=NxPp;$dGUg2&0*;Eeo19$c7f;HEcDs~JJlyoe^`PL28&sD1s0g2Z~#IUT8y1b#qa% z%!sL8DC4Pj%{rebT3OdQbOWv4ID+odm(73%J$rP(R8*>IU% zsD%3nA1l(#-JqZE4NE~1Kot8eJ#DVUh(e3jGdyB z5d2bBP#r_-IZvs4N6OLr6{e<(*NdPCx{J#X9z{ZKS9J30ge!pjO{e$%3@V%~dm_lH z0&Ks?(e{VRqR2fMJ#+RHF1UBeVKLf^TvfshV4L|mhOWloZmah#k_J~?2BLL(zu6_? z>IHl+f@cLixZGR4A5$g@mFeJ>Zt@~Q+p3em{FWnV0b-mE*TVQFzmCcy(ILBr7b)Kj z-WkF##Ne6~U0vgEq0o*rV$|Rn@z;5^_vD9Ks#~>L5K7$NfUvFX54UluD(QVv7Bn7+ z@H;GCaYS%QqderB++z)bK(1{4c3+~juGJQII+}N8ULsU#!? zfC&pDTiYFb8cDq}3Irtv@z<24QFE+Mff!K3$0zbHq{KuE#A=E=7allC?3-R39$e{? zR^kO9+BN|4+U5v^V~~tiHa-46&Esz%MfE_T_?Dd+XUvt}bcp@-*X-q(>e(_^O~Ik$ zv!w5QDYE6*MX+gw$}m#J1R(vMyD)BDey+vd1&ePoEDJRAd}%XrJBVe2+H z-3Jup{ty_<^Ibc`?D3f>pCz-%T z2NxBTxBP(rQt0Q^~v z|L$wnGQD0d^%%WN{Q>pjz@(?cun1tL@s4E+-Q_j!umeeYlV z=o$t>_xYLrXQ193i@S&)Fn^d^_~qC9C&l^y-HCyJ^@O=uGN=wAnUY87h*#Y}_-uV% zPbb^yUxj*nH2?cntdOYj@YXZ zxN{`jp2)R@8U~-T4di|tk+@n9tdrdCk0b57hk*bomADb&3;FPS#`C^6Uxgl7@pxo0 zm#aJ($-uG02ciHU3_v*?f^rb_+5%=f0H4FW%m_X5_`&BO9|Ix*e9ptT*ojwE-vejI z3Qr#13ji}KAR6@duT5=<>v)j7I-(9CkSZ}7(m#J(3_Z*Q%sn{7z{^MnPhdz6@BuO= zObDBB$gzXZfo;Pt12a^B&tZ_R3YaW&G+hR;zW>sS|8|q(_s)HPD3Sr7!0RwcMN)oH z)eqc=^x=)~8M9ws8=-d{JN{p>lK;Tt{?mp2gXh67+i&0ahi~z3d-5Mx$$#0#J9uvY zO(frqR{Zx0$lo^OABgimm3s8>uGRc85|Qs3GPP9+=J_ud>A$V`cfI*X;`|S!m{t`K={Gc;NT6@yo!DIuGv`^JA;4r_A(yTsEh_ ze_Mn3Z zDDMN2028BHz8vgMP{>h<#hNJ&b@DkpPRzx2*;sHg9$3Jo6jBg*bdLEP+lC(1- z{@V`yGX(vIB3Dwm+vjlDU2W`&;N`=|4#M*NW+M? z<^POO|4o7Zy}SXCh8o)&|1(1UOM!-*FkT0POr8U*aKGQTcmsO=Q^p|yDxZb`Gny~n zjWR%fpGO>SeG5_N>-P1_Z2iM6;+VJFSLNuv)5k|ZN2HbpJO=RAwHGAq`!nO?z<}il z5}~7T&9V$07&^j5cRXi}LF}8wyf5>s^M@F2RfAkRnAJRbEN2av$-Hkh@5}P}>@Nix z4n+q9jB$=0TU`76d9-U^;nSu6kG=N{Ybx#9hVOBlu?qwhm8L)-AWeE_)Bq9$3|0D| zG^x@%xm8+3KtgCDFw#5HJ5jLEktQ`DAT2bd1rkEui=u<`9LMv$@BJOm`{(=qage>Q zz4ujCIoDd}`XRvVBoTgvF2Co3dfMsBe+#lAM))xxgnyi~CVN`YnEJ-7w*m8I`_Q+KSQh`m*G>6jChn3A|Ke%&U*u{z_`tkDw3@|nJRSRie!HWs{vMp4KP#%4h`-&<5$0tG& zq96swSMx7%lMmWw`>x&5saF%~G|8zmKE6^FCOpP}I0Sx%Q(ZLxWYz4)^*pg9LdTEK zTI2@B#T~{BzzPLcc~AS=b9Ca|&GXc?tSSi?UKVWg*q*(qH}|$sB{YTORZNg}!>4&O z`jp2vPPmQ}|(wrKlo^b8&C%I!qs-SEGYXNKu z*7|S7lrf6+w;p$xb5-+dBw1cd_)yfmGN_0SrNh$&cy_*zunzDz10`J1s4Z=`&pW*u z7b~I5jhrb^>4|PwK_=@oX`d*~+l;6R=;>>bp=q-cmK_v(C8`DQT*KW-KHSmpL%Vj? zrEqleA&1!g@Mok>)~hKgCzMP4G_ znK?@~^j^o*(-e3`NPBBXk^BIN`N{oIrh~57R5A8p(K{4Vzxia2rx50|Vu*R4RfK@k z8E6^2HBv!K0vjl4*Cn5ks`6`jX{%k^Z^6&%dF?V@y@=O@9Bzo23<@yBx)cfKoT&Xn zax(DGpN>p*80OY!BjTv|iB#O-W|p-e3l`75O4zYsy;A@yyO#6mlxiH->GpaXvaY^h8xVejR(r)c|+DTulJU01>zKYPB(OA3ar4 z_NWNAw@AJwznQ`QY`V9pkMCL7U8sjT94X!g6VV%sq&0${R>7BSCN-IQY)rhwxt?CDG#h;x_6k-cUg z%7*URw$fn`Vk(Wh9D8ZU86@D89_}7E0SKi`mtM}DTwA0)gntm-AbYqj2e6S4xcGlZ zQ(ha_MGY$RE=J6+yR->bE67}cdKp+pt}8Ez0TI+X*$^{5;)7d#1&EM$u+6X(4!WkV z-j`dIBRS`aL};gu%C}YV+-EaoO}wL|03r~kYt{Oq1YLo5g4OJN+4;fOtJgBAcX}wF zhT{ntn@{ez*kJ~h>WPr@>>;0SDy_xK_hGFydR*7-x>s+DkW?-szH-;eIg4!d4s>(b z?159vN=+`CGmcL{#gX7UvXZ63;%Gi9ntWwPeiqQ}lK+Q)SW&8@Jix8~m452Q&O{i% zn+^j!{mZJFLDDGjOm0T*+wwaUpJ6_3kjo|;f-RJ@JKC@h5H=BHsH>s8VX!wMqjk(C z`D;^)_^w}{2k!X`J8CI*%IYqeGUO1=(gEK`H2{6|8+d_I2BOY$?j0{tcjw>6pekwS z-$V!80?K!~>F0lIIRs`v>!^2U3vcc25CEEq2SaYHkExJXLX|$eKQOSF$$T zA=>zR@+|%mLJ;r0@&MB}(&~iT4X~B+DIHVuDPNVR_n26zE?B#F2B+`E)NxU0=flcD zzU`*{j+*`uv(xc}YC4OQIkIN}FhLFLTmhx3u#X#Y$_97(>G!PN9Sys&ZihO-uf9KJ z1E+xSbfm5?SSHm)G3+~4J1-6b!F?*>Ktb;({Qiy{&swUZ4zLjwHoQ;Z!^Z&M8WD*C zDR+Ab!Ql4{)^pa6p}y3ss9g&9o%Aa3-?SxGfRb$rxP1}FZGQvyNchHH{BUoASbd3K zzqTYrkGL8S3dmcVK=%@%f%Sk6_w(3roMoP#q^wSSFnql`C;K<;(T+)+*w}37NTinU zWdgx>)>6)Er?-T3`ysz?U%zs7Y#SWBZNXW5d-k52&aQUewLmtkGODj4#~T2%*iP}- z&Qsm080n#M`@R`4QvS0`&W(gNSfXAHwZrbSxbsF$HxYql_zM1ZMr(osYDiy<( zqozH(5OE299A?{A-yE@rk-mQMuC@$qkB2THe0JEycIxXM!@hO$BH3CyZZ>zn^$^;z zLhRq~x^XGBicKje^d5QnycV0x#!ht|QBgfz_r{SWTI?S7a6-amO!ReZ73Xe#)>JLr zEX&9m6bL1nbRDI8tH2m^?R-dcqO@|)5%e<(!I2X}Ub?}Kkvex5oe;GrvqCZRorg!# zb53hR;;u}6fC!UygQuD~NiU(F1sPC?-BdM=V zNz8F?edKC$E~hQMxs$M7&U0$DK3M}NP*@DvO-Ri^YRFdA$VF8_oxDSm=R3EIO~ZQL z$K+^**S|a7h6+F3@}cjw*;MS;n_43TQjBNV%BzwKDXGyyVyc)lz%@oM;t8FoxvDvq zlWDuK=*y3&;#HR#$YOQO5Wl)iiNK^eTl!QC9>Trw(?E9`t}PjKjZjI8l2eXgz>1 z&m+MKt-{fhuiZU&kxG6x#Oj)%B9D5H#m2es?aKubM52VB_q-$4Fh;%l5y%j71I5BW4>$l|2T;ldo0Wnt2hR*R@osJanC@7_ zv?(p3_}c`#3^&_a8qc5gH5k2Z4NW{)*EX>X4wnu!Uh|kVU-yu0QqFLeJmHpdXMq~F z_1)e<@l`^{y=HtKqBCC@9j|#eg@c|nnA87)TEPS*UCe9UhP9d|=>ZGEY4H}?IJ4}R zh8GY+@liPOZR`3`yd1A062iLMLjn_89}kN|?;#V?;SkM}y4o zg>U)<&g0Y5TvbFRk1RjaUqO`FbwxoLUx}Xa3O_}bgvR*-x^uWTL`E2~>J>rmW23u@ z6k^yzvE1mP*ROUrw=ub0mFmC9>X`s4r;eKnl;D8f)cI{N5-B950Sr0((++O#w#0$v zD1-ml(C3jzD`e1Q|uI`%0=5<2xR0M-=v8HBX3 z7l4fXz8m39%GeUu&rhz!dOQF2PDw#|g0u5TP`pDzIEKxG8wmbjOw+zLV|w?<8l8<& zQ|747L_YyF*m0h2t`}rM4$75kk)8~L7HwOwqQeoMui>0xfdJ;p?e-pVEcyGDrID>eU!nI(`vriI;p$C{CB)P;%KyvuG1^3n^GR_;|Gx zvv8nf7F@(Rf0q1e?)Q@42JL}%yL#w<>XHUyU*bFt1UGjhL%Uk1%MLi+4f}}U|LDUH ze&rWsPdyf6vw_V30-^rMHBLfW_*c2@1Cs?xtx`3b$B2f_GxOIAv7WU4p3bC)`s{L^ zIql9SKv9S!n+ffk3F;R?YH$=oG=i--(_{4-_C;M}xOl}P5Kp17xc#h-rpV^mQ;z%y z5D*i*fE2p0Yls0ofsE_Be=g`6t)g;|I;n9&=y;oe`TY@IJn zwnO(Q7p+qYH#1vPd0S#|k3wMI=za`y7BD>rjq+sqS8f*z7t0aUsQf3^Z2FttZcBth zgk4ijswH#tI{adFEgr(WYZNWSSP0@JLLgQ9?>${M1e-OBb}1rM@!mIQoFQ8_<$o-E z8G|-NXua8l&Gto82Bi>z!qC|Y$w1M;qNplY3C%~KYIyHNfV(3|<5vc#R$4(N33XLG z!j~auctqJ&wg+IHtW0@!)94CGsH=8w_@|H4nvi10DeRv@-zRWE48cRbVUl}RYu#5m z^zFGD_@<&#holfldD;0guQSkVM)LY8-43FhAm;Ywe0UHV_qj?e!yS&vJc0De_Z|XmOEv)i>)t*B8WRp*EEfh@Y|>o_z1gZv z=}7i$5jJ|LlgDxL8tjbZTw|;Ls)xi_Ciq2}2Ng&Gnu)H&IG>{T2Y0S?C}xFVF?+AjfDHi}2ORWW{xeAu zfUn?h+scqI^eWKr{K@)Fz=zHi370#b@NX@PgZ?d+cdT})V#Ya+hy+PZjhmHiyqABL zUlaI#4rRR|hRS}6XmITT(|pE7JWQW^s6wu$@E>>S6&Dzff}%wa@zbstI2ZNLm0RY@ zm8*-TTL<0=BkJu-TyLu+hPzJ~PAaX=B-z4J&!{XJw=C@$QM(?WUU8p^k2i5_?!!{j z{CgyEMoT%;?kkD!piBiLQMP+6O-5=_E*xG}jPV8zp`1~+&WK~kJ+-&%Tr@q;f+4A5 zbvW{J@dS}|>HXTwx&fmqB>8Rl59y2%6$Uv1y?v~Ub+XUD`Pqw$>5a1_Ry1*3Mr`ey z^KyECsEtKT!DK>A`&iTT_LixVfxSQ z=2f8l&MiSOq@GX}U7uRPb&elvBsUTVi!0l^U;^eTT1Ch3Lv%4gRTugFnid3H6RR0a zSq61gspx8_(V7c`;te&JI6q&P^tZM*3eKflBnTFnBy%O6wApZe5ftOZ1Px+zJg~JP zQ9*35G&T)NPIV-bKg~1ZIJXKVyO1bh%~P9-KCxzjM+}&U4*lEMoC)g2c>TFS>65?i zuQ40MzvdUorAt+5_2NQ&nioNkei~J%%B$Hwutd@c0_EZGM`P67v{}B8OkGJRw}@;M z9a^pI`ipQ#DR%JIKpd;rbF{J59d-$g{zHac^xEY4Lr;h=l+h~@wa~Pa*Q$5+Nu%&#Ps6xH*1{&Uh^|7#sqWvy0 z!~p}nMPj92k13zI%f<``VxFrqBtlNIHG>l0ByknspaX&A;Vp?Uh(p-QR}Hn4FWYPQ zBffVKe@ki5x#x!ADl4-BI^m>)$#2&j?_6aa;RQ{=$Q5?Uhcy%6P4P4iI3e7DXR@6U z?l9z7=hqJk2OW$A=gyx33__qN-F;~-wEW}`wZVxfd3mhexbAF1D5k6Js-$Nm>`ksB z(uvxJXK0|~{=UW5FF+qAJZ3o@P}i+vZdssf37DhHKWZ>Xf+jZhfPL0sq|Vpb1JFpc0lCvWyPtym%+X`!+i?9>1h-xU|c<;E4M#;>S+ukU7R zoysekopU3GSj5$OQx|6dUFDuxvA}~+w0717B{+!Gqy^&_Ni!_5N>w@h=tteKV?vQU zlPN>aMo%%9W>+;-b$j20fOlzyH|aXa*GPK)_!#d{%%!8<8()t$2o^k+>f?@>E@PO# zl7mkEI@2cTo zW{mnai6?ik;Beje*n>y|_-WL4gEUN*#)JCOJuf&I12C&k^ErLfqocF-x3C+6d(qV$ z&?hBf@%_&Ne(?YK60iQ8r9{e4V2*y(sbGxx_qgqUJo5j>!+*NOkb%$FMU3@;J_p`( ziAG?Dv=~H4+LJ2=Fw>PW?D)h#42KNZ{ZwokSvy$ygJPVFthN&;BHg~V;h?JZeuBBB zQ&fsmlN;@PQRir(s;-uJ&<#jTPK^vDp{Dv;nCVz39=7SQEQ-XzXMl<_b4D|_uwaqZ zG(*)+Wo`{hx^;+tZFbisfmGgBSA%-vC2fYh`JzTX^HB$XuPdmMLY_r$cI#e6(x2!6 zY~1F>QlCT@imTZb`Jcz-HcPHg?Z%yErgL5I;}EQjm>sPiuFHDd0CE|b>r=up^>qvh z1F`6s{yJJQP=BXv5HC=0I?_PrCj&$tsS)2g^JT_I>9%{(mAOn&)+}Nb%u4HO$yAVB z#$9kc5(7*J1k6Wbw9mk!c*DffN9l`BJier5fWA>{PSML1`{-|Oc}~~iY!=rC&pQ{t zpSX2;XoRFPCXRnbnk}-+&{kX7bVQ}qNr>f~I5K(Usxb127@%gp7b9!STWD!&?R;Oy z!sM_RLaNxj)+2M&x>oYw$0orFGvqYlFXyxSt78A^5peEfSvTcefBWRs!>ifBa)|6d z?^yN6a?_Mn%;4G#%gxUnr3o3D`8KiZJa`d_>RWkxAq)Ft4s22D+4#fx>?AoWm+)2R zt{_%lER*at$JiOaJB@iW7TBB4oNwEBI~nZbAcQFU1XreM)3sp8G-^W$=RNMQi%@?6 z{`%y{-$+a!XrWn~A79j0oQL*$=#VC1lGq>_+X2JR+7Rf*O*s175OtlXzWw9rsj~jp zgk9is`4vJ8u13IeVk&c%L=1j2*IRhN7gOtFvuX%QJ`7sLHBY0~oHl=v{NBqjy@jyw_Mu5!3Zf(|9s06VTZf(kF{) zE(72{Q*}6Il+uk$+}J_dWDe&1 zk*;o8A@3WxY)7rhnQI7?ha`dkA5^M6GM)0pwY`%*H7IbP*2Z_hdTO%W3#SWgO=4X3USX*VKz25A9DoUdBI*9JVGt+$k-s*FH@l_;~t~?&i5Cw z)m)-frY4b>D7q02TEM4K<311AGeHxo1%{ndce$X#ztAUtS)u?cJ$&)jtV4#H+_!@R z5D?Gx7CWdko#HDkL9Ef+mX9o}?Xamz>L25R!Z2li@1M0_MK0^&w6|HQA){(SqRKLo zdu`xBI#p$a6x~#`L5?IKDf5^`<14~2eyp0m(Y_C2=6_mjd-D*5P3Yz4B~o7)U+nn2-y?p9tL+q@b4(s6GGt8{2qhcfxK(YI2rmm`QPcv@ut^GZb zyD*4RD4?49e1fvYNTFr%?IytGT|VGPt6Ek=`s<$Q8OHuDi0l$qM)9OzjpEAIm6OxL zPLwKBN)m?cg-=QqGgF=>ZO`w9hv@y2zkS;d@AJ!)>x!QVj?Prew$as@h@4#5+4_82u~3uRt{EIJb52zva3L zQa^G@L6|QBWPq~?kA(>1Yt^#f4zu^mJkRKL1mV==9tLK=*q)p3P4I&lSnJW%J>IEI zAuf4{=B0X{dsZK;8M(^&QbxLaF#{2&%Ab&9s0H$^zNcasK9IlXzwN|WW~{OO6CSR^ ztSrW{kE!qRW#yfE&xkR~vwF~~8zjyP7Pam{C+ZRLV(XS89a`m^pVeYx#iiXxM;jAw zUmYqYJ{NAd(i#{24Nh#7b?wR3S(8UZid+05j(ca!lKaTRQ_2T1F z#CRetGLO`q*n5+PwervoKNakh@98gqpQ^Hw+fcYhP@Z0v{C52Y=au5S>AF(G**RVB zCd5*4nb9fU$CQeSM=b*X1Z@7RO_6el`Ur(@01E^NFXoXb~KHV>a}$X5lCi=-fyCq==)*fP!zo z*tO?IFEo?Oh6&R(L(T#j<%jEj`LSXk>%%`rE;C8L8$j0K?ep)^=k0yWlj`j4ao$YO zYhzPk;wcQ;vOX{Rt1Y9}pXB!Q<%&-v_Q)AmP-16A_!KA3Cv%h|HL4ek zoVIrMfJ#nP zV%0B(2736d-0xD9XV-Cev~QRuT6CcdgOkPF7e!UzdRGGQw{CM?cMGVawYhWWM8M4j zhsBWP34xhZSljQX+q4Fu@u}MPN`{m(LNtk2DCh=j$`F%`KWivJ$wAnUd&?qyZ+MM6s%J=ViSv36ip!A{ND9mB{ z#o0#vGU=ujL$|w6iQnjoe@eFfhizcqo0_m)%y!_wwohJCxcDy5 z);uDcl@yo?xN9l>fimtip0`UEoQ`NJgAOXsYc z^-934ZRJl9m=Ho@&P}nsYPIWmt2$DQ)0%8i*M3zB!j>dsHYSB4Jjo3nw%t+}ciISxn!CGfPnz%gn-^Zmxzm4vR@xVVY|$oVC;KCsUt`wpyk=Q?MP$329g}aErVKgM0K_o!2#@ zt9FR=j4WX@`YaI+aug-F%q-7$usx-g+xuHJ*YNRwT+w82*mymONqON+ z=5NGw#_xiI4PgxUn5(6y!4)mNL+mHnN~2+JbyCcGQ!qz71>2# zh?wt5O5j}$c@C5O`m-e~zcq=&ku7nI#K$?5dWyu zKW;MFTElJkQJtye0lY-syir9Utgv{L4Cp<#@ijODU1jXa1EOjt*M$*BZotb^4ajqw z_=;KZ5U!Neh%V!qC_3n`2M(0my(`FN(i-F1bbKG^%S7m({-|PLMhgA(wq+2gyZcga($do6>WEF| zp-Sp{9%*txoDk{I=54|&+p4}cgaV#yBY3ETajm98GKy?5>*)80+)+whqArd4_!TksCGbAKWQ7>I z95=t(s|Wh))%Hf+H)Sn4|HZs=)mVb=z`o%@ES9|t$B?CcXV#~3I+jd)9f@PTIUTD? z1=^XzqquDnJ|`_mG6=UaDg&&rjHFI`dvbg>!w$<%q46Dgd1P$qP#Uow4bJvnF$@OZ zZ;YLhUmQWL#5G0GEREt&IU_xm2sxk4sqLsf15t>(5 z`>7O$oMg+E;KffG4|I8t!T&xV_O@S_^W2w=Qhj8Z+HhWL`W^h0-g9Iv;^=mDbv0_8 zEL`mvIo&p+EiudLXTg%(UzHJ^%X;7|htL>Mj$YfvrGRxWaE`Pj=a3C{Ny2a?Vm3JMbzEaUf#6v19zbHSkq_AivLoLYTBZ(?7kfc*h$ zzSl|qA}m~sZ|A<+tt1B;&ikwdY_A!tZHlMgsWbG7WnB=UQg#ltJ0(YbBy^>SR+-RZ zZXkOg00s6akBTwQd#zoK)sxt(n^fsOTDwge*>a+~QsaZ<%2$St9KdeNn4l7cQLush zQ6l&O-gM9|7@$iw!!J_XM_2#xlT{0{s3oPcrObKrlMbG`DTwoZ^-r95Z4pJB$@@>x z-=6^3|6Qb)asIty?P~sp$bqQ<8@LU}$W?T_z&BBad$?fo>kvrM_$d|cX|qv~g!|=6W3dUf^`K7Z>3911{V=7tlJoWFEdoyDZp!&&Gg_8O zM8LIK+TF-OtOD{bm7}8H65>64?v_uii{sFm<#+LaEF7j9w3AWBBl=ZAX;k%<;FEkJEeN`G!M=LDm(4?0Xbo zk=!62Qw)NxKTL@I8Ne&(^0SgO=?m-T3D159Y5!H6QglgZNckV>>KFjB{-Lf`s1iq@ z)$_iLKqQ+L9Gt&epBA}4I7DM^t)0C+qhWjR@t5{OizqT(0_(B`lz zGET3=evQ|o{9_!f2`>|)NB7Tf;vd%5MWYYRcBK@@{5cR_-%#tb2B)XL+L;16e15|F z6P=Nex7I6Oo&EL_H7=Vv>_(^C#8W_y>b(Owsvp2%v;W2jPly}0Pn3uBxLx$N7Fft` zQ}V^e>MfBBgK|#Q`crbFqWn~1hmIwMLY!w~J~Dm^nK=#UFr_qSZ9?j*aPt*sdSmW2 z&6DQlT(~)5PSS{h7Z+pOy}tQLgKNXH4<00?d1(^`H$Z&~S7I!B(V}U->jk9LWQfrx zZs<73)L=ffSK%2Hf8NMlLTAoIj`%rewrX{7dR*|CBx--y5ho@4OTYLEjOHW-}^_3OM;wMkg9UP?cqTrcdik$ z>hAE|pD#2r)+ut0nK)AT%;=LqrtwWvIY&SN5`XgSA|a0xX~VhLOxht_D@#6Sf4mgm zDl5Y#h^y#nROmyw(q=j=3X!Xyna^>;s-Y7NnCnx8BQ=z0Kf)i58?}Dc=Kv(0VuNIR z+qLjO`1?ly-({Qg#zRlSqsq-^a(~4Xy%K2UT6Z7# zi&C&lPIbVTK0^Dh8`6tU-FK;^KunWrnEMx8+=diBYuxDXW;4|lt>S1!M|8=-PHWkE|&>$}Va5uy4Z(n$DCwogaqVuVI(Mm^K@l4OOV#aCm#J7de)w6mHztXdd z{{rnTR-ez^xL#)Q4nb@j(=keC8s3CZ6qJY%esfD)TWZLuFoe40Y>?LA1&%k4p%tv- zUqdy+{)@YcS5%hWo}u086tD~!3GGLC0~yw11cl>m10}!dgOmy_RFrhvn4F}~T4#CX zXRFnP+WBX#oH^sWjRG>5rh%YjLmc#?(Ga@|pB5vv$)_n_GB0#}JF%vGX06XSfHJ9f z?RG}gv4mWjXj227E8T;9dALU7j!C$Zy0l}1X4+kc!Kh|6b)6=GByP`7Hzt8bKZvcQ z_$n%2!slg=i%5iF(j5W^>+Tu%n2-LhXCh2dxHDB(7Z(;*loYCQLYZLRHkXj^aY!lU|qkqMxwK;2&`x+qH9Bj<9n6s5bnJq74Q%%l4qzAWe2 zd6h6`#1ZaCB$2s>U5uRVXc}qCEn`1RIIr9<_lQ5SZ)0}ar+m?T*PVE$f^AQERY?zD zmpTe@JabuHLHV}qwAL|X5yw8s0VX^(?DUHIXtN5KC}1bVv%SBJ^pTjz(!FHj&g z5X$K5mAX)E7L55+!;}m+sf>#4r(M4wRT%MF6RYj}cPdx&`}{&$4qABZYXSAaiyB7T5ZO zy$T!o=GqeuA44uD?*a1rRYIG1iL$(}X4sP*58UbT4Z@a)R`0^<{ub2~ararN7yQRs zeR0N4pknDKhbjOsA)J8#y%DSAJCV$7+>$zta9@@qi>D1ARyJP&MEY(fH?cK8cHsU- zA@+W@K!GxYYnB3y*?2gyUllEnX%;JqoKPX2$9BGejMWuF5yse`Jg|{a^3c8B1n*?> z%tJQI6!<%p3%`4gCBHR#cQ$p+qhrQQ>{gh157$ekVz#S)!~c|UgXZh4oQ+dayq z2n}@?adARuTI+ZYQe#euRma-VfPE3Y7*UISAP_O-l=s>&wKs~C#ku+Fp_=?UJQKu5 z1a=z;1LBLfnRBx(?QC1Csykj@O7}Fje>$h7y><2In((PP8)Wh!xa+O>eoc;--U8BL zm{+Ke%C{|3@`eH$TI)d4C2YS=;|$bP%Y{wa;8$1eTH7cQBR7ik<-0^14vc4AB)~#b z@Dd3BMnrk_CnPfPn%-co6t8O-JWUn5jlX0|nk#EIMKpg~WQn;?wK0BDpXbqUOV{f* zBoMfdN?6Gw+2&Dq%lfk5lgJmTMK5-pi=Hjd9FaB>_#7fGViBqtD(t;PlaKjHid6=LQp| zhOuE1jQlmaHi3ob^E(TAmCzIp4II{@;iZ>w$aPumRE&o2tRRv@_XNlK33|F-M`S+( z52#p*Td06#rNGY=O1?}9)cTP8WbP90mChvR`v|0=EEPl&W+DYfc~;Fl=y0nEOmg4x zwN7KuEI?hx%FPS?k;u^HeuFP)=v*4H8*&r8Pm*Xk(}z*QG10PUwJWN^LDH>+u5lp zl__qosl`_$cVSfBY`ZG+PGMX_LSDmgG25|Vi2N=nw+?|4VsVVyHjX>Q?Tkie2!e7Q zL9p2>4nEsDf2ngCo${Z@JT!|!g~ZPq$sf8dU@6e&u!hjHM}MrXDwwOxLufGjv%fsa0(L{0l_f1C0%5-l6FlwA$IAk8@|6MRPR=7=YT?_*eTNV ztuJEnLe-S|7q_$K??=7WQZaH&H@otaSqe&tnDKKV2~yHypm=~>@k|bJ3za(cdL*&% z=%Wvoh~w@wDP6f7cBc;KZF3K=--2Nm>v_0DJFkXehGm=E#h$*3KSdKFYH<>j_>{)w zCk=TNP4vjOCR5V++dp&di^}#l`zqN~y3s{q%HUbyFBQe(vU~z=VT) zNN?T~#%itp=brQU02nuoiO;t;L;naOc8&n?2o*7ZhXQc=S<%@CiPU>DNk zWfEuj=gQ)%STgN{ATz3lZaI)jif0OU#=M~P++5@jwv<1(*Ba1S_a$DC+ zkwy(1D!MW1n!Me19g0m}x<uD?i&UB%D;W~ zuaC(#Xv|%kQPuR7Ws?8oC*zX$9?l|&<`eYxmY%)|7-Tdal`Ru5kVD_sou(EYKOQ!j zru=C#$95{jW%w>DG=Ue=>%;Fen` zQsYarwaAP7<>iSWr8Q(?5L_9aoa%acokDx#&>tcBoQNqh{hMyn5K~uvQUvV6$!?{i zmSh`-{KZ5bqh&J`!V`I>cWtb@6HOXlm{kf|>CdUwRYElX%K1(`Cn=Aix3+lgFK)!| zA%xp)sa1b^cMp}XyJzMf!DZ(sEC<8TH?bxBZ|hj^-u#zUXD__zPl*;c&$3K`iNZKD z1w}J$#7VK)KN>l5xN*y}dSGf%sk)b=w$Tc8 zvBj$dCNOkI*6y3CBYE4h`<+`%uVwQnYOQUou~jf=%6bm%kK}Q{Py{OouGj zY%KrLw6(27k>fyY#QOP?#&J z-fF2tIad)^K5QACDqIRW5BZlq2jcmujFvX5hJ}Ttc1nDAsfi!) zsya9N$EEp!uw%0sLqkc_uOH?l^_N>5P%A473*oHaMy>XD8ynI|6s`;&W}FmGiobYw zl;$eOze;Xm4NoB-Q@)DX6Tci)Has*t*kB|Fe9gL~iUTwIr6+|7AG+qk| zC+fW}J@_-kcpM)uo|Nbv7|yo8)Df`Ci^={m8{2K}CJF!L{|p-+7e&#q%ZUQ^>oG7-@?@pu z-vS^9jo~%vK@0kFB1SSi`oBg2vdZ8oe0)Q7SzX=c_;7a#-}g@`g*UzA;oNi+)VE(5 za1uGs8`I$G3GsFv`Cui<)EbjgE$$ZjzF}Nx_EIxHt9)1}rIPL41{KT{qKy_ZfQcT?3$2msT6amB2WR5bDd$KUX^&8PmXRG1~#(ZtlAjikugRzgNK(5F} zH}O*)FX^6+Vk0QW7%Fmbdv_%ma(#3A&6@}T`#L$|9}CC7k1mQ7;(KH&I^wSEtEOzs zDnFp4>|3XNficoYx1`BSBk6((?wAdB)Yt7RtfQ}&o~FfL?@XysHiT2w=G(-i*DHRT z$ze%0gvUd5)&#}n$suR;p8W4yT9+RBSkz9)7KIEC`CEQ$Z<>C)1 z&5bx7uYHyQ)E5F00hhTNF9#jZlc`q`UB2m?_C|6gbs|k=K4H~D7g8T{O}En_>t{#g zJj*{lrXQX7u_ES34VL~!H8iGeTPdVL5<17FUe>1cSWjvdv(O=`%*t%2)RdWj5qX_y zRId0G%DE!?F021{X&DW>z?ZScKvt*9vOwRlMpg-FU~hG!Im4f>D12L47KtR>dw9gP zB~`x6HNz~~|BpH{p^}m8lJ9*$*-_$V)}rvm1pQ#8WR8~dhBNHs@Wbti`I`+gtPAR4 z>UJ8qTV9V8)*?&QN7nfI8T-rgcizc_f48Y=Irr(C^ zcrrtKt4n^5$Iomhn)oaErV;Jx4Dy4D3G?d|dRwK(F2B5Uo(_hM!IwsSsPhZq@)1{x zzOQy41iE&%Z>72=47>C}3Ict6pLBE#pX>F<+Be+fZ*)P#L>KH5Zgjr+#MP-yYhRB? z%8B;N>wM!ITT{A8^3&w_?H7L^C+p-?DGMY^N9ILyZI&yN=b#E!trjV+Yjt@9;j%<< z6!guJC{aUfhg>D~@Z2Q7N$7O4zhIr0cL!=>TinEVBhn=J$BWTJ&AnSq>Y6(U&bN2= zgT=;1^x9WSI0R~#8ShN{#@4(QRN;!y(!IeX=hLTi3kY92C=h7*!I5j@;>8Pj3tG9b_tu|Vxqu^}#=Qi`;#k#t9t zC}F<}`Bpt8%YNU6@TOi`=vU=ud-lt&MmgpKF*~424kaBP*we2NC=ltdxvuTo8N0XE zJXIeR;`o;f=pKCPz*~SpYo5Y@I{JVAL+Qrk`a0_iGVa*Ry>BEjLUDDJwo2*G$y?vn z*VU)D9j?QYcg(M-ZN;YWa(SxLB5ef+s)9nPq(;()?7l`C4!OLmYncx*eEDFIao{_^ zcu89>-sBb5?HMcOv2xrd9w_Bn?-P&qmtsuPnF)7|C&*QWj8vi={;@;_er=R5!ZCHRk*@8^m9Z)f?x{qg^UOCUuo z-Iwq1ud}+z{`s{OT$1;raQ4651)n5e)XEglYj1jI=LEj{$Uw(@8>#gqzpJ$TO!Dzw znXOdXkoYb;(U=h8X1x0}%fq>qwfKT|*?J|&-+oP%yMvrO@u*>fyNS=Hxru?qk7s!n zsN*)bUd+Y)3UyhS6L7E}Szqt_TflmTyPM!^JiRp$qa#c%>vp8=ZkmmC{1G4TFw|#t zxm8w)4SDKsTfd@4rbGW8RB{m?<4`BNbl7A_?JtGDHKwBjZi_U`?(@Icd+)HOvUYEH z#>dfdRIs2}5G({j5fl`Z5-b#n0tP8YDHe(arI$b;mKjk{&=5cjBubZ16qFVSDk6pe z89_j#M1+6@2$B#W2}!<%0>Yg4yx*B~zVm$Vd9UZceP!>gz4lu7y6@lJnWB?_5@uw3 za!)ayi`g(t)?|FJdbs_^(+FaR!wWV!_Z4%_wR$RdYk9vJMSA{4NWh+O3)}s#BQs^q z`oE1icu#)q&hylKKa3G{wMzoV=JCkWlYVT@9(FYdTYo%ba9jlej5c`!C?S1}$uTX_ zh_n%-Q|!ma9E_dId=IQJYVQ=Y<6klbK(mnU69?kvvFd9R{bPN;fz^nLN%R)aPcs&g zZwtI|MA&AONY;-M)(z#+MZ?f}ym_H_h_Kq%z1q8?yj;{+B7wxtoAZ9~+OhUl?{-aD zAL}20AMp4sHzT95SE2o_0J;N#41V|(;gdXn(x9jETygXJW@GBD`NQADuAa9P*H%E3 z|1$e6hN%_jNTVtNSCbkvZik>rb1Ph+^Ub^pSI{ z>>`;d9er$e-bc9TJ?lJbR(B2)zrbikD)21nzM3qbZ)*`S`_!@k=3{nDK5Pu3<>*E# zn?!gY_TMnMC-j>ZxPA5a@Aw2wz*QRuFcToQxY~xtLv4ES^uWMx?<<@h$qTnEl5;;@ zyOrb%=b(2!$m@%mvH`$g-}d;XbQE@f9NmrYany`jsFx9nG`rUy0p@a;_?5_*cf)+VP?tk0~0RI;wI3q*S%{bUb;Kxri;bk2HD(MH4Lt(EGB7az#a zMz3!1D*ITM-V_~ir1eN)>ts{jW_a+PA4`5Pxu=}%Y>Ak9%?afx?z3?ITd)vrM^W_URezyQhg7SIQk1a&`bpRYTy3AiSHz3t)Ql+?%C`?) z%4?0+C03BfMP_%fb~mwv<=-3#fTT2iTsjg#pp!y9z*xq&Yz$1Fr^g59kVA^9+cSf ztK)S&VHL|ih5JhAnR6C05M=UGm5E_oQqkA97)SAlDK7B`nBL32mb{SAH*`{S9;Phz zvh>3|n#)37xpMEl&|EWbgIqKS6F&3U3XM0lT;T(tT=RTx^1oi?L}=H6&@pCR-!MB= z^WSVgG0dMk*0>l{NdC)M@7z5p!m)Q2e`RWsqjfPS{}YVuuax)efxl4Qir?oE$A24# z{U1D$u2tnB<2_3AsC*CN6(o4vNJKQGnEz!(y%NMMjQ9(tnEUW%wq<%0G)j4dUVDw!Pkr=XI&r4^K zrnr3WiTyarR$xpjOSWRld0AXi6DHrq`cI{I!Rh3cWL()MuBs4difMwwvzv1z3N7H*m6%;I z9Trd0#pvRiyR!to&)s;5?11y6GN#XyO<6t5mA>2thqYYDnDkT_%$eP_pORKW9MUl( z!=kE6kn=c=DSp!11}`=q76(d3M}C~rpOR34?4Lia9~N_{bAEjRWWh8z`RPA$oix&a za*nY0b3FhWKSlua`CB)OexCGVW6aaO^SUebH&wWHM!Pvf0N$)ob<@VN<2QK>YT~qt;2qxt8a)qAD zWab@}e`g~gg2B4L=)6$yVbd~tYQ;?iz0~dh9u2R!1%0&i$IW}dpRjrM-+$-k|F;L{ z$Bh2&k^Aw_|NOVi|L33Ui4>Fn0uzu`fK+_Pgj0w5b(I-a!P8R$bia9gVS+d0S)a72 zTGTZ*K1c8S_LuLTD)t^$UmLOhhh{g$L2fEs_QV9T*?T_6GaTQlKz4p}xlJ)nMUFH-HkW3-`k8PM}@xeW--o^ ziOLem(BQP*HuZQtF|7EI?8s~c$dyCJOC0V_pO(4T^%JApXUvLIT<@QDJ$Dj+_xfLx zo;C#khj#4muI}9D|FzQpuPcofbXjeIf4cVLu>P%Uzc(44`)ADjfQQVQ{QujpdmE)O zzabXLDt-r+n?bv|zjOUi8y32B#$ACSwKf0rlfw&hUg!f?g~GsTPldDr~WO5y?Bi(jUVe>aW)-t`v{q;YM=s{`cAtcT~n{kk?o zK`fKJP~*@vno|6m*Hb8W#yd3yYX5oHouU6jX$3X@Kb6M-+t?q_t4pV?N&vR}t?Ma3 z_sfi%6CmVSm*;=`bwc3(e?c_7Pp-@uiD>1uP zFwHd1jWw3oi&uzWmPoW;mP|{aU4rk zEUE4jTm90v^1EX7XHP~OkzPJx_LWgmE)veaHC}|-GyY296=q;;I7w)YnInjHv|PWH?Syc;)E{lqTYD_0ur~4{t&D-hp;qn8vERRzfm> zWS5CYOGUwmaB6N{G{ zFR`EfP>>u~GiF+)%l`t>x^WhZD%IO;)?i&}tX@}dZt(LH3aIxX77dD#%+Y7)57LMY zx^=L&OO_!zh*wS1%HTPU2Tq+^p1j=-74WKoqCWhbR^5+3PZ-X^7x7aka-aSbmthcC zsGt<$6Lhu&9sGJ5y)Qh^od=XDb|ng%=^cggx(4oo@CSV*^GC^$lS2vaB0{gY z#I{r)F&#zshIOBsJ$W(4wg0?MrK=7e7HX5QI7S_xs^E%*M<98@-JHajP+T_GpnSp) zyZsG*6o;Z@)x+0Y2RFpPwGOIBAf?d5TX9_c&&Bo6}ULmvv9-zRhCA zeDnkP!calxXh2?BaA32l2ZTey>D9GH8>t>+Zs zr>2A6A5uqFcj$&gRp2g2v9oHlPl%?`nTrpil9rJo-e$EmjNI!NPr#AuKm{%BlrQ17 z0&ZtYL`KpYt6~kGv&RE!cXW_$$Ft;O_24=te`YTppa%Gj+vTe6)3H6btgzqkENEx+ z+asiZ-e^?53`FP)H?^%@*4Pop=MuN7!;4SMEJzea(JP>3VI!x`j>IxVHrk{+ngv|E+vZ$o*V=@E_$M!z#e#>Fl^%Z4!m z9m^5fzujeh0aZpP`jTCamvaPvT8yVCl8m%H5K_ksstaUo=brTChq??8`Hf zy%i>M>W4{Z67o8&{afUiN!6}okD5O)@r+OoTYSF8?f9_5^WiHm9ho>YEgk*^$IfCB zDdq`KkmB>!{`^B^O%!#O$~F-DoX4_i`N+hZjC8y5C#pJr;<7#*Lh03b=;e8~o0;25@50pG!(M{58ad!z zte)8;%P6cl#nH~a*r+&PQ0WWLD%j6ztS&(E3NjErLGN>68H%Aty!_KqD^6!kUpbP|-NYH5n%X^}f}BVq;jD*cj$nR?k;4A8nK zm-1NSYH{h(*kj45g4dr#15$30_n=p&*`F{}>faI<=AgFz0}P5ZHxpXO!N zydfupcODd^`~l`y)SK#*)OFsvo8lxMWU3qNu*55Qq5KTH^*Mt((h!otsxT#2nlwdv z7WTj93KFq?$k%n0Eo&_h`Iz^`g3Vnfp`B>|G2sQw>(sF5mafmY$gE{J0gu(K%e)uE zW3gA?UOaADiE+l==I-it3kftqAr?f>2w9X4+_bg4z*MRA+>Y9Oo6Q3zc7-pzti!f8 z_j(Nvx%dXX-AXDFphWjyDs^Z*uAt@Db)@L13fYlgS?q}JAF%@*1o)xbD1qt5nljSSPxW=6kQ$B19 zqr3Bd`8;$oV`Oamtd##JO>922_#ggKWn-#e$Jgtq#%($l(KipzK~QpcKqiyaq7*a_ zefBn|l`Gvg7=ZURGj5x+z0}2KRK<;k;+NXMm9NxSA0a)L6gm|k!ziJhKhbOnr)MSC zKtIq9y>1TW_#D8=1=fTbFL^x!;(8LGt+nCf*U!ep8s2lokEl9Z0C}b3e1t}f0x}#! zM&sE#%ElM=-!Lys&29gc9{6NtRIDyU=z8PbiZ9Z#c2n+)iYnp|{T{0-8m zJxZRcMURjiuHhbH*9Ygx-(z+=^6qkOG)$)QBwDxTV8zB1MdGqPBt=d9(S@HCg{>@C zMuqKJkspmk@BXMB$PfB7baI9L46jYb~JPeM@rqK%X7RR6i&jB%+S|&f~vm$;D z_dqGZ<(X73s&%{e(`JK#EGL}RomjW1NFaL@>krXcg&`rlQ> zbD5cwVg9M`21ny1e#$eOzcdA8#?~2~ph!kg1S_df1p1g??Jh=PwM({-`XR8l@k!Re$<{`?Z#B~sI+2tsI zK5vr!jvEtk5Vx;-MoE&3#GdyTzd3gYMBqdXRS4~m>A?l8fAt#)T^u}znNNQt&4TxHjqu0n;)-NSnn|1eQ{O|3rVA8mB`@sV&*p0 zIh56N9Jh?*3kztX_V=%-hQR~csHw%FNm^SN+ufNVPqVhk^8*rXcR#JGwsmv~f2Bfr zTI!sjUbzin-L9A5)^xBSv|29N#m4T>>|AViP`?TP0h5#y`8a>1u-F{8Pi@W$a!#2d zrOBiBPWHRp4aKF>Kf#M+);xiJbh)2);C^pE?jB!*H(T5h&L#dQ z^AS0aGIuyoAO@&{OrsZEMWlEkdc{{71MR2#SalEPdP?G@Y?U?lMbu z@itOrhkkAeyE6Kq61NY@d(d>HO@NEdfnE)mr79T+@^rjsq>*wHp+dv=wB4Xs<*1a! z6WGF6`QqD*(-Bx(y%+b``6`uXPfVf>>Xn7nxZO`x$)|0?FpBVqhpiUrRz{fOusZb7 zjB2fi(nn_A7NqJ5b~l2NC;%0Hx! zZBdVKc+06v|B_(tzc8h2FYi#WZp+iv9r0}(G*3C+1U2zM#c<3lpvJxJef7~rmVV(g zxl6lHG7#=7RpJ`VWiY;u=7lr&Jr_5boi~()G;J(w24q_(^*c*$41wx=n`>|;-^tc& zM-9G(jDD6YeQ}qW`N$XKJ4jn!iVIo#5w#NPox1SjEbsiX7i1AqPQ;lVD&%Lfu4Evz zaxSDz>X*l=lB8{VY%`D0K#`r#T}_M6rFlWGJqj-EMp%cf^%C^}nQ+3Wtu(AI1o1g> z)j8yh*yskiv`mtZgxEu3y}kp+%g$S?WsVunJ77&jQ)(JlVi6-PEDbpwlvDZo?7i?C zF`Vw_EbUfe;ui|04sjuFF+z(L*mxBfcE@J-42dPu{1NduJsdW3G@#S z<=kTna%M0x=LqgdK6%kPTUkr>wc-xP)dsh*tW_+&YSI_j{oyQb4@vsE2}3Xwt4=Y`)WS@5{@o@Q0gbG!`I-gw05uyaQ=j zw-NktB^sOZIN#;DL(6t;2M?|z@8PSh8|}xl>qpnQwDxuuqz`Ag<8jV*R>uv6==>V{ z7>nJnJ8nUQEe>(^ADPfEhAdLgorCAKnX+k~qWWA=@ zfHdYo_#BRBE}hZ?f>8fcCab?K{rd3=VUxTerch*Mlqhtz`JU1VpaVeb4cbOY`nr~5 z-6ay+s_*%~->qpP4yb%Uuiy_=3A+`-DCMI5c1ivWb8|4oE$idfb>Vqvkan}r>L%8S z-!(QCSdl0UWbLXTmy5b;C51CjKU09@sYJLE`UXV0F`x0;n%Asufj>-zHcL#CSn))< zc+qr1_7$ZeGwQ{N-CaoCN}yaM8^(L9Hk}XKD>R49l4xr^ zP~0TUV1#_(2g?RsysbbfNej!gJtOmrwNjOj!=#Ju$#`8{jY6C*ljNPCN;4pVvih;Z zbsy6MFI-Xz)I_$Qj-@xmgPdr4gcc*MMeSr7G-;Go;C?NAV{)qfRuk$z+^E~3pB_@R z+gf3Jelz)XaIMKkT&$Mn($gm=cWyGch5a1H?1-p6t`Vt-tS2=#(c1F&qryK&+QxN0 zh^^y{KJ3cPy}Q5kpiX_@0E;$cU_y1XFAG>{LOvZlbcv!?;G(rh8Ugxs_dsU03&8uW zN^t}EngMuD@1=K2DVHcy??GePg*lg1C31E}cdY-E2|S)!{eJwnUV?H{g2 zSf{^wqPIOY0$X}C>)G*U<=eo{w0OYpkc(k?2z4tcI3ly9infddUGLG{v@6DMV5^~0 zg?>ci_W3h6_*mcjhb;`B5xJf%?WC9@iZu>!l{E+x+6mlZFK0(=rO7gV>y(-Fu|O#M z=}B1Ni9_oljX0fxWLR&w72|=Ga{uyET#@pkysSO_1Ze*n1ZUOEUdvx{=kJeQ5a=1F z_j^_H;5ATNG0ihS1d&e;Nhj;$hTBycH+enVkM~Qpp{@OoZh~}Iu{#y)XF zw7OXgVCE|!&mK-ZC%W*$m4Kcv*sb8!nm(~yZnsDZX9TPA!!lbvIzJAB>DJx-X>q!Do@r3d*gk%DE|{r;a^j=H}^V>GB^on`_4aNH<- zRFS%{Ox{(myV$;qzy=OyHbnqy)X;Vald9|B0?)}PVolOWV z;dHT4QK~PX>>;WE(c{3IsX#WBpwU+2LkuI#4wcq2aJ^(I6E ze#_5Sl+036f4$!7^@Nai_@)apgOeLi9@WV`6N6tyqc0BI0IAy4+^?k=X;J#&Z4X_g&8S&rVV_&2a5u4GDwrYn zChr$WC(Idt|1U1sH5J$J9$M?_@<+tDEFKi^F^0%@(#SVKi3l&Dhr^HeHkqpo02_MO zWlSiYR|s2raThgTpxwtRu-0MTva3?Nbc5!hW1%Zk(TU{O^tTSQY;sLGjp~h@riXE~ z4ok6oFC~~J+L4q($!aEbZXwvULZcjhIzP%$! z$ANJgDZ(J_5!Ns(3SNBxs=~-3YA~VjiBrrxQKsIWr*#>~3mq)Qn9;)q^a58sO&6r? zA;G$0^ED9sB>^=cMrtVMSaWKeCF9O;6tnJF@SxRB^WBc_7QCedX5*+$o8QWZf+m)` zvyG%cMWTH77FG<>4R)c1f7z(RC9gP69}d+%Cx#{qoGSUfC4Freo|x{GG(3E={L#g* zLPe0DaZLQtp4f17a&KblS*8B7Ot5fj)@5JVe!u*=Rj)7w>9lF5LwwTFup18R6`K0q zULwUM*BnK>6fG8Dt<@!pP&P` z-kbdG(KlR#fu2n|P1nPbEIih7+uwpAqK_H>P$Y9gZC&BFNv1$I5aba$Z|^2q z9VfOpB0`%F=xu{+f+Kqx&Ard^CaTTgYk6%YSr^3y5!evf%{k6H>F!M4;drF~?sqJy z={cVo6!2(W4TZbRrp3P*m4M<|Vd>{X55NUo#XI3+bf=2aZ`n@Mcu1`& zFZ7;Fn;$yGV1tk3jJ`CmNJFzl8J=|E%_K9-*-fUG857^!az??_i?vIP@zPi2PxpI=Y32) z63x14?!N__<;d~arIxo{FH^xl;Sxz_eVoyTyZ|czL_Q9o9p%rpYJ_u5DBQ6enAF_C z=`0`U#YcKB90%Y}`eQX0>2LaWmt&_P!=lkJoiDyg6?41B;=Skvqv?4vDooy|0e4Lc zqN({_I6qW0sB+raeE7z~pT7A-u}+UMLm5b&9I>!IUvR8I3Hk0HcmWw<_x!b2{>j_T z$il}ID#t@B8?!TCJ&8=IWy5|8I?;Jrhk?G~%IEz3yr#dVa2yD(bau+B}Aki`{MXG_`f zJ$B^e^?kkV8d_31zTT5YKh$B_#u#%G(rn5A4bGMICxAOCmm+BQsp!w6k+ypj7NlR7 z%P^tpku-%zop%b2o2nE#^*N*O`&Q2bHs$~hWJ=$45f1!m!7cl8uXo%rX)UCxaVV~m z2c_t@h;Yr8Wt zcnmEmty+zf_yw9B1!Z7XK{RJ01KtJbs0Q$pS6WAbbT~CDEzQg7Y7f6emEDd*`O_Uy z!j7xqmr5my&b5s@@2FY>%Mq!5sd>2Z+NKudg==-Wg3HfywbRjU_Q5A@BkoSJpGDW9 z_k0*PrQoFq#?%Y3VKy@FQj1$u@iufP%05)B8$rC^cu8`P>kO_nXs-vgy^7?rWH*dZ=`gca$d^qcho*Y z6R(RiJJ_&|6pK-Sw6XeW?ya_4w5>ooq4XcOYpO3bJi^&hpw7y>>!0Z%n3keX{u`Ly zxZ8`v$FJCehv+55*gPXlP}XGdGg7B?z$)K(gFo92Rz)%dO07$TzJ$2%Q`viXlUhJ&U>3^jK!wY7N(|@L+0N(GR7g za!9>GawA<8UbD4T!;RM`igUmAo;JB7iA?CwpE#=XN~aukA)ap5q+dw5gUwR2j&>2o zShJpdSfd+VBaCj?AH_=*1vYXl3-G427py@g=bfO%8PBA!X+dr}k9^rIo`xA5J(rC7Z1ZG7~vb@3Q ziM-@5obcMS?QnU45i-;sX6|1%!AaPV?BY;itG-;U2uCY^op+AA0_+Bdn6}GE+l@@9 zS$a=h>?=mHN)J#k8{W6EhawF=49N0xe~UVe^1jPE_08r3VOYkI!ZXmfrCOBQdwCl(fa!>{>UJ9vg{aI9I}$gf zP@J2K(7L~=Q?}4t`MJjcO)cF(Rlz}2j8;RUPV)hb*I*mvT2>QdTT+P;tJpWO@iV?f zPLMucP9x8W_=QlvhH-~fPO(`gDrs4Of(8iGP{r}Z4e5V|j+ zhVOEt@Y#9?v`Y1tggRn=Z_d{<3_IpnSROoPq1PHVT6>EfXZ#HZqMYJ1|$Ya(L3cdGp_T>B5rhLPPk#{BR<@7p%3T-CvR|3JjJGe z=r#ok-PdPVcc1nqvg#}QefBb(ccxOj4T%iLgD!@ez%3@}`11ADz=)rtMQNvzV`xj) z9+7XVyMjRw?|OB7q|pJ~Xv7=}epFacxSiwI#6JeiI`c$xb77rFJTb@~aFIu0Lnh{) zQ`q76kM*!?$23_Q@L+X z7q%he3`_bGpb0K1zQe&FEqvaVjujOcV1nBki#%QVoOW_&Bv{>*Kg44y9*TnFyiDiP zd_mHs-b!+wEU>WTRw%fV9d#_7*^JOwS3GCzom*jt#f|hyiwaTQ?6a?zvc_hKiC$QnI z7QG=fzCWDAxzW?!*12^4EPKx3Y9r;5Qf8$0GA4&S%(&`S$~i_6K^sXtd}8JhbaY|Ce#r5Q5O1YOs{`gK#ZGg^+`f=y_z^2_F8u#B3Xbtl8 zOB<|ATN|P4(+YZ8NWiyYS65CSD-B9kq*P3D>%_MM=X_3QK~he2fk%mFc%2rFea*FW zooB?A^=lKJW;34HioEtX$#~~e0_zX?hr9aIo>0d9bk-9>I`kbiQ+l}c3aEJUGnXD| z#0V9N#+}g*E{Ba***n_=P6+Tt6@sz$V})Px#^z0U)dhY16em+^U0vH}dXcU!5zT3} zu$FmC9%jfmm+@^!Vul+pITJ!^bwnoqZ$dJiL#C}wfCXx^LU1w|G;)%G4}eYuXU z5N9;UAEC&!2gOelx1+|9{gN@~_Q@flq~Or3b^^5d2xv+FqflHKStYPklfobDP+hPXf?Qhqs? zSJ!6(&A4~K3Z^0*Awvs`f=Jzxx zKR**ohiOVjphaV3&5E#bM^v!T9+V0Y^|Tc+Fk(>hl^EYwUa=Rf51(eln51D4q3c;K zPT!5#=9xo-w}aP1813c9NP{uS<`iL1jAo6td4xo$R31YTWXX#Ar#gUUh+5_enEK3k z1n0b7dAVMOViF7};z?Lfih9K)WrCk){S@ub-g$DQMZ)eSN|;^be=}>9{2p$e5x-O~ zv}eGR!hc5L4bUq><0(PoLt@e=n6OA!!gp>L!sbga-Y$4<<cDDt=S zLCx4p1l#e}+wKMLz^Oi^N7JDp37QHOp$x7W3#Oqq`&T?uK|*Kz&a4*6Fg?7|F5@`X;RL=RmPy&k@j;bFncCzF@& zGxVFE9vN4U4nLBWSA&HTip$D_#hiLP=do1uq3B#T1s~@u8x41VtlqGxw}3Oyl$x0D z2#gPNCC*w%WtM3~8b%A+=He|2A$O!2xRx7iw$^!_eeGxiT-@W#1U^<~{TTzNv>PfQj`E~bp9!tDuaa}esjbq*7AIqoe==^1jg&ow z?NL(4?SB~T6=#_y3z6G4cfq0Svl|{ooEg$I^0{a)Pn|N}Ez9*gj989bxw%q(Q_KCe zn6+tIjJUq2TI-F25!HD#9TmD#!f;LRIzx0?>t$=hjy;BfYh{LGdYweD!g$H$|OvCdP6x@Wbz^GDZ!$IBj|g zl@3&=jb=t&JOcEwI7}^wCy;-W8RfdHna0`oCb#q`Xe-}w?079H(7Qwbov5=qG!2Th zTW?MIl#c#5`X!rtG1};kQJ#$fwSzBw_ zT}vZk##yO?&$Kfy6?)tD`^$VTfj;hh^4!u4Ug*EmrtfWZ#0C|H{c~CiY4T;ps9Qh6 z-&s9!;feZi+Od?>dc2=h4d|el`a6K#KcK~EBKGAj=k2s64Bm<~7PJAUN`JP2lm^B|Fu`@ZpIQZUv&%@zGgM=Zi_#T)j`=)Jf8+xmIo^3Xpo0F5@{TTrL`W zrjK3|e7}b@`t$_|h!Zz#iz$OG4LxpXcHzD)A?ogJ4l5{e{#QUrbjF z2pO)FkGAqtXxgMj4IBtZSeH4V5HUP!oLAx;tTlWKYvK|N`8*ES7w*DE**UVj z%GHck2R+L%QEtT?2$O6WRNUe0*L%HARGV6E6!87veflP1(gB$w1AsI7HH%8QdOhCvR(RW$-rNMn61!d3<*rhzFayU;t_y zyQJWNd%EVYX3uiEUp%aRfPLW3&`L=8s(Dg0)D%TYQkO-ABKbOhHK2|;r3lmorw8cj ze^sTH^wOBmc;lCs8=KRA7d)5!Zk3%vN!$La($yaVrv3SV2&g;rCvh7HnSTwVRFueS zmpncfJ?9kkb&mdHFGytiIER^k13zVJ4aOmKtBDXtye2xvH zi2CP5;~1=lAj9_9hZfWwCUFKpZ;2YuwM_&frPFR)F3q#yvAit~M2O^i+_dG{41`!| z-%rgeIPc$w*%S3x1>O8u5-h8IApIGs7aTEo*T^ z;)l8#&o@oFe2=n2%kL(;FcgIc*VE8NiE9I$((@vVp#&e@Z298`eO^xv)3raODqBgP zh}Se!W!uNq`$-xagUf~}F};t?3uDe3y2K3^(nfSN#f%^a25FtgZjI0GMV5I_KyMe$ zbp4Gqg}L=NXfyFhU}|ps0N4kNyxr5L_@YaVRs{wpGxTwIu`0dhADd#dcGW=l?xL2# z(iD@}6hgLAzxFj+bzYIHoQx5DOw(`N9)5=^itn_8JUz4;*Ih^203VmjX?PiJu6kF! z{PU9s&o3mRnzX7exjwHA&=lYNY>XSNjV?kY3hPep|6V1;BFfbKd9`eae=1$4c{lj`8cx6}K}G{`(+?j9uk4 zwL3+J%ucXD(L#7$EC|jWlAK5{dt9mf%b#lW?Vyeyx6-P@DDZOPrxqhIsD^}?dAYoa zx!ngQ(8O7pZ${Z>{y(Sw2^Ak#V(z@VSmCMdq>F#?sn0OD60=pAtGC>)|7rneKgbk& zt{RyUmdyF1nO{y{CC?%Eeh1hlzRE-Hvi0>pV_t?uJq^O(SaK_MSu%X&_J8K(+#<`9e2H`C*7yC{3Rh-WSNs^E>(LF4u ziGA%X*)mX-U7B=6mpi^mMP+Wj!tmaVRK1>^XgLTd3N)yfxLzw;-=*B5uR>a$F#5DL zwuntvSuaN*Y0;D$1wGND56k3}!|Ll|MryQs8x3WfO13tpLy_%9celYmrOi0PK!BI+ zbGme3TR-r^5W``$aRZ#mC}iv}ZGul`?-Xo*O^xo@Q0v}*3E6)^u~E<6H1gebsERy@ zT_feu<;;nXcef9vGnH3o5Iyoo1eeRUda{mv9-zhVGNu+=J{a-v`&AtzkX?N!vM1&=st;LuUbi(nL&b#+ zLMKn|dehY~()7pCIAOeo(@6MUp{$Zbc`Zo)BZ18!kieTe^HmDz&I zr8619APqsOwd;Cb7AY?yngN=-TsH}2PxN-`l6YO!F|5XdxF-GlH@qZT#^b#AVUl`b zd=|samPm1`@Z&ES80?e--B;`p`MJcrop6>KB_j}36125!ru0(`D6U3971Hdx{T6Pc zSzqzUX9b5ha+GO;CzZvSH%v+&P{q}e9#1Wa?RfT15YChx{NQCUmPt0@n`T!g9j;Wz zH=A9^l6_!=zUoNW9xjbPkL>W(Ze6QwN4J%H?Q$My%?heQ=+(JCD;>XjCV64!Y{q9u za?im!*2T>?Kuycp)GC+{ZW(tn);-R7ZWayaUW&_(wh9$BP&#imDU0(oB~^1yB}hqErs6iQOn+ zUkeO~1j-xC(L1$$Oy>dv1$lCt0lkR#I}J#yuRCXK%2T1?T8G@)%1(?Fpv9-OiFKvt zu|BuoE0Nv_*>RdCOVHC*_kOaFH=%BI#)ZqLqiXI|BN`I);FiTF37*DF&_`xjjVaYj z686~SX}4!D3GG10+DXh?%w?8^9kb;Va=Xq2Yc4k(_-sZ`YS^h@HBjUn8!Z<#+!^_t zpgG`K6SE)iv(WA`L5PDfg0CfX@3=jdQR2~C`MJp~97^Rhf#Z5RV?Y4Wxz2-@_j(!V zl}YCWeGUHVGj|P6#_6|T+I8lrz#2$hI^Zi(m>xVYH0-4f)G7y zLWLUoJU2J0Z3s*mmCh%1qTDqLm#$&n)6}Xj+&G{XAGK?RUv_;YXZ6R6#8ArI_r}@Ho$*$RW`H5{;`}%XN3+gJNk0Z`b z`SkBtlRwiPPfRWz0Dj2BMpkAfS=&HSTu0=ukpet!1x<8beZWGr0chO$k7F_g`lP6` zBg1T+thV&v411AkH>=#S>17OuU(I|!Ab89Qd~D(D<#TIpMpp31YZe?b6-pYq0uobt zu$LK~1#&|C)}*THvtXAdt!Cqi}0g5q;WH<8z$jyYehtUZ_!z>l^M`w@_RLgZj0p!xZI%O?V?=R?0eq40pcHvE zgA!}&$tVqUoe0I<&Z56MVKhFLb6T{4)(1kdUfKGC*jGCdXo1)(yb-*2E?eCJk83*L z<8L5?v1F`P5Mf(R}QlA&d;P@CC16BPPH$~s^OU9JlHVd#g8i> zRgQ(@Qd!IJos{RDMejIO_F1xXG6SSjT*_&(_%l>z`P`nTdqG1k3o_FW;ppPM!?`ml zYiD~bu}44KQcu%rTf*|iT=h*nX!4eFIQ;ieocgiCBSrn^!%?EEm9`s(fS51%!~XgW zsCkPqbxbyu;bMWXZuhjman%10ERXfeFo@Isk&!@m$Z)ZD%G|N(!~M97a{x2E48rFY zQZlXjKXe+}qU=!oN?ZTFODNH6L5EX+X+#^#ObA8BJ3dv*OFa&|g!=h4LR7$s2q!y+ znva9kE4y*FNt1uU)@k7B7I=-2DLky{ris#?mpdo}Vg7u}?-7>e=n!)WHQ03=C&R?% zyr~rJyc41vxh$Pr>Ao}`MDWVm6PFE(&gqlMG9jmJbZA+6??QKg(vzuns7G%`Q}&<5 z4Kj=h6JkfSY91uJfS}wnpM1Y`Q#~Vaw443dQfRgs;xG#V=@`YY)aC-*mL_+% zj>2%3?T5$Gj%JK6aX$khW;_y|IolQWkjz( zd13O5y1;n^A{Ics4Hp4L8x}{4PkiBhb&lAc%CC+6XC;vQ2Meu$9NqQx;mh%SKVLs@ zVo&SgvB|p8_Oy`&bH$T4Zdo=JzS?9p4*KLIBYRRKWZn9KrVF8dzRot%`tLjfhhKo?$E7nVuE3Ifgwy0_xXzM; zp4bInG|+9KwT?-SR~L*kAWHC02WHVBs3+iVzH5{;soT$4vWimZdQN{K8ega(JUP{XFVcX!p(wP0 z5BJmb*XT}J%Q1I2iKZ9Y2+g}`L9JA}H^z~2k^!=vrv!)KY=P08&<0SM#rK+S z|1yCGW>bt~tCoMlk;d(Z5ewpHm(v%4tzV8Ltb%Yw8U7Yhp4}T@VY$5AFHx*Mp>*Gd z?3%t}eFtoV$=uHcsklPYz1xi&b2>MIC^F9+dBQQy3w7f1!v0OC3edYV+gyW#uCZFz z0#Z0O6PE)>fn=qhR}qB4y;s;$X7nx;XFzhASxISKCNf`{pRf*qYK{4CiP%Ag*Cgp0`<;R?Wi!&EXc=#oTSt|H5 z&o?j}dbMv>@C7GfJI>hcG8NpvWpWd0rpghkB3y|nRuG?tv_+LRE!F)j* zYe`MZgCQTYxkN7msnpXdY~+yrQIK)oJJ9|Y5bn+#4JPF=-M0c`GQM9=oL}CeTopLp zxu#IwvvFYVR}j#GX16j24Qb+lzFc(kb$%KAHm|HK6r(jMZhjeDj$t&X>Q%bzxSy*4 z>znlYfftcX$4n z{F8I;FE=;2_x_&ecb|K|pJ%&8Eq;O$iUqV}Q92_`p$&5~%!Hm%D`bl@JXL;bbxhk{ z(tNS;>ic}MN~;hHxW3xJr~k`Z2zvohA>rId@+A`HHmx`~dzvA{{ROWAeJU=HWF`LR z!vQbo^7~qUpbrdUY{@K;_aXM*UH9VCAT;KE%2q6K2(iDTFZ-8k*Vkg0Mc~?Ij@irD zZxF&zH0ec|wr!_wYD zwkX*>qTVmiy>;eqxo_6B!c!6IRF^7Qa_e+d#~8_WnRD~1a9TPezFLqGIsv_0q$x>e z6TEYZh!Yq((PmtBN~881m$B6;ue;s(Hc}`kcs=6)3(m9C9S^v=93|~L?J*AGAX`dJ zK#@SNe(8EJKGI>SDdJUkRFxzi?6RqD6&BCkxYbsd(<0YUvq#@fND%5J5xm@Hyl+oqr(~GMjLaMa>Qz#;Ut5`zC{_xL<`mM zgG&|~6MU7r1I&P0ZPt)q?N8*?Xxzejt19CLYtL$oaB`Qt*2*c%wW%=r!<6TR?ikL6 zk-+5Exw~FQ_%_qR{L<_a`3;k1zwV+&UVjfl-dUay7ivhy>~rK*OdRMqyE@h!T1hOK zg!Z!7E^!ZsZd1FiFH|owV|RygVpS)`A13XdeC+-jV?ySBLJ&Iill?W{#P?Kw8@kvRbpaKB^tmxY)?Q-C zFqVFAGdC#gNI*gHd}dhgoVsXMg0(B%BP^-04}Q=_M8Zw7NvMQv z3(5TAbqfyM8rpM6?~8fEpFw*OpE@Xbs`xBKJ}E4`RC&E7zEfi#c;&mSOaD5#dpUGm zvYg(?rZ&udkLX(=IrE@Y7Ta-GeRus=QXRvV(9XwH6joC1P%{S)`om^w>l_=Wg5q0~ zibmx@pb1x2MuYFpCDh^5l&@m}v!l@5u42KqhC$#?iaOxU8Gpp7pLUDR435aeXh|6T zp7T2w7?2J<>)e@_=2JDQI1e--$$T@rcIEjnKHM(t&ls@RI&H_UhZmL#^!$du>fJ>< zoh$%CmqC2%=SWBRiJ$RILS3}F$lf2^p1-7BJy^m3QLxe?TY=s@P>(?R#~F-|D&RgS z=|p-5IOVFE9>iS){3f+vs%L{p*Y6RO3XVy8gNpM{x;CJfnl?hFDPBLx z|6S}*Lu@+JW!T6ujcj^UEfR@E@LlC1QHr=qE10k^C~-2*@V@k!DhO%wGcx&2WYa}7&VW(Na9ZFU}O+mIl&v|^^$ za~M0_st5BRMS%|c^N`X&uaCS<$T#X0*XKLRz#zDv^7w>(6@qW)PJ)fK+2>H! zdzzOkXwPlnN%X|V`arw!1}qD3EESiw(JJ2}*e_}p)oq$-nG7J>waAo1fo&kq@N`jO znJXl2LvKKBZP}XVnk!R>-`Q++>Hwt9P0|p)PTC9$dCt&kva;o+ng?n>&Hd~Qx#ker zebc7&s^|17t0CU5s!ik%>|WF6On}|>e`_XwFZ#VFep_>*hx0bd0?Qd)U74K~wG&c# z9v+ib={sPssTZpovja&*=Bj+U(%V)hGIe3F zrTn9=u>bwbb6#V3X|C7BWQyJeTDPWPj#Kc_lvvcs#8~hKb3wYeIU?O1k Date: Sun, 1 Jun 2025 12:13:03 -0500 Subject: [PATCH 03/18] Updated README.md. All test case passed. Updated with Google Java Guidelines --- pom.xml | 1 + rate-limiting-pattern/README.md | 328 ++++++++++++++++++ ...te Limiter.png => AdaptiveRateLimiter.png} | Bin ...Limiter.png => FixedWindowRateLimiter.png} | Bin ...Limiter.png => TokenBucketRateLimiter.png} | Bin ... Class Diagram.png => UMLClassDiagram.png} | Bin rate-limiting-pattern/pom.xml | 18 + .../limiting/pattern/AdaptiveRateLimiter.java | 20 +- .../iluwatar/rate/limiting/pattern/App.java | 70 ++-- .../limiting/pattern/FindCustomerRequest.java | 6 +- .../pattern/FixedWindowRateLimiter.java | 17 +- .../limiting/pattern/RateLimitException.java | 6 +- .../limiting/pattern/RateLimitOperation.java | 6 +- .../rate/limiting/pattern/RateLimiter.java | 5 +- .../pattern/ServiceUnavailableException.java | 4 +- .../limiting/pattern/ThrottlingException.java | 4 +- .../pattern/TokenBucketRateLimiter.java | 12 +- .../pattern/AdaptiveRateLimiterTest.java | 38 +- .../limiting/pattern/ConcurrencyTests.java | 42 ++- .../rate/limiting/pattern/ExceptionTests.java | 5 +- .../pattern/FindCustomerRequestTest.java | 3 +- .../pattern/FixedWindowRateLimiterTest.java | 7 +- .../pattern/RateLimitOperationTest.java | 3 +- .../limiting/pattern/RateLimiterTest.java | 2 +- .../pattern/TokenBucketRateLimiterTest.java | 9 +- 25 files changed, 490 insertions(+), 116 deletions(-) create mode 100644 rate-limiting-pattern/README.md rename rate-limiting-pattern/etc/{Adaptive Rate Limiter.png => AdaptiveRateLimiter.png} (100%) rename rate-limiting-pattern/etc/{Fixed Window Rate Limiter.png => FixedWindowRateLimiter.png} (100%) rename rate-limiting-pattern/etc/{Token Bucket Rate Limiter.png => TokenBucketRateLimiter.png} (100%) rename rate-limiting-pattern/etc/{UML Class Diagram.png => UMLClassDiagram.png} (100%) diff --git a/pom.xml b/pom.xml index 4cc69639b071..e2532c1b8b86 100644 --- a/pom.xml +++ b/pom.xml @@ -199,6 +199,7 @@ proxy publish-subscribe queue-based-load-leveling + rate-limiting-pattern reactor registry repository diff --git a/rate-limiting-pattern/README.md b/rate-limiting-pattern/README.md new file mode 100644 index 000000000000..de7742a5d13f --- /dev/null +++ b/rate-limiting-pattern/README.md @@ -0,0 +1,328 @@ +--- +title: "Rate Limiting Pattern in Java: Controlling System Overload Gracefully" +shortTitle: Rate Limiting +description: "Explore multiple rate limiting strategies in Java—Token Bucket, Fixed Window, and Adaptive Limiting. Learn with diagrams, programmatic examples, and real-world simulation." +category: Behavioral +language: en +tag: + - Resilience + - System Overload Protection + - API Throttling + - Concurrency + - Cloud Patterns +--- + +## Also known as + +- Throttling +- Request Limiting +- API Rate Limiting + +--- + +## Intent of Rate Limiting Design Pattern + +To regulate the number of requests sent to a service in a specific time window, avoiding resource exhaustion and ensuring system stability. This is especially useful in distributed and cloud-native architectures. + +--- + +## Detailed Explanation of Rate Limiting with Real-World Examples + +### Real-world example + +Imagine you're entering a concert hall that only allows 50 people per minute. If too many fans arrive at once, the gate staff slows down entry, allowing only a few at a time. This prevents overcrowding and ensures safety. Similarly, the rate limiter controls how many requests are processed to avoid overloading a server. + +### In plain words + +Regulate the number of requests a system handles within a time frame to protect availability and performance. + + +### AWS says + +> "API Gateway limits the steady-state rate and burst rate of requests that it allows for each method in your REST APIs. When request rates exceed these limits, API Gateway begins to throttle requests." + +— [API Gateway quotas and important notes - AWS Documentation](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-request-throttling.html) + +--- + +## Architecture Diagram + +![UML Class Diagram](etc/UMLClassDiagram.png) + +This UML shows the key components: +- `RateLimiter` interface +- `TokenBucketRateLimiter`, `FixedWindowRateLimiter`, `AdaptiveRateLimiter` +- Supporting exception classes +- `FindCustomerRequest` as a rate-limited operation + +--- + +## Flowcharts + +### 1. Token Bucket Strategy + +![Token Bucket Rate Limiter](etc/TokenBucketRateLimiter.png) + +### 2. Fixed Window Strategy + +![Fixed Window Rate Limiter](etc/FixedWindowRateLimiter.png) + +### 3. Adaptive Rate Limiting Strategy + +![Adaptive Rate Limiter](etc/AdaptiveRateLimiter.png) + +--- + +### Programmatic Example of Rate Limiter Pattern in Java + +The **Rate Limiter** design pattern helps protect systems from overload by restricting the number of operations that can be performed in a given time window. It is especially useful when accessing shared resources, APIs, or services that are sensitive to spikes in traffic. + +This implementation demonstrates three strategies for rate limiting: + +- **Token Bucket Rate Limiter** +- **Fixed Window Rate Limiter** +- **Adaptive Rate Limiter** + +Let’s walk through the key components. + +--- + +#### 1. Token Bucket Rate Limiter + +The token bucket allows short bursts followed by a steady rate. Tokens are added periodically and requests are only allowed if a token is available. + +```java +public class TokenBucketRateLimiter implements RateLimiter { + private final int capacity; + private final int refillRate; + private final ConcurrentHashMap buckets = new ConcurrentHashMap<>(); + private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + + public TokenBucketRateLimiter(int capacity, int refillRate) { + this.capacity = capacity; + this.refillRate = refillRate; + scheduler.scheduleAtFixedRate(this::refillBuckets, 1, 1, TimeUnit.SECONDS); + } + + @Override + public void check(String serviceName, String operationName) throws RateLimitException { + String key = serviceName + ":" + operationName; + TokenBucket bucket = buckets.computeIfAbsent(key, k -> new TokenBucket(capacity)); + if (!bucket.tryConsume()) { + throw new ThrottlingException(serviceName, operationName, 1000); + } + } + + private void refillBuckets() { + buckets.forEach((k, b) -> b.refill(refillRate)); + } + + private static class TokenBucket { + private final int capacity; + private final AtomicInteger tokens; + + TokenBucket(int capacity) { + this.capacity = capacity; + this.tokens = new AtomicInteger(capacity); + } + + boolean tryConsume() { + while (true) { + int current = tokens.get(); + if (current <= 0) return false; + if (tokens.compareAndSet(current, current - 1)) return true; + } + } + + void refill(int amount) { + tokens.getAndUpdate(current -> Math.min(current + amount, capacity)); + } + } +} +``` + +--- + +#### 2. Fixed Window Rate Limiter + +This strategy uses a simple counter within a fixed time window. + +```java +public class FixedWindowRateLimiter implements RateLimiter { + private final int limit; + private final long windowMillis; + private final ConcurrentHashMap counters = new ConcurrentHashMap<>(); + + public FixedWindowRateLimiter(int limit, long windowSeconds) { + this.limit = limit; + this.windowMillis = TimeUnit.SECONDS.toMillis(windowSeconds); + } + + @Override + public synchronized void check(String serviceName, String operationName) throws RateLimitException { + String key = serviceName + ":" + operationName; + WindowCounter counter = counters.computeIfAbsent(key, k -> new WindowCounter()); + + if (!counter.tryIncrement()) { + throw new RateLimitException("Rate limit exceeded for " + key, windowMillis); + } + } + + private class WindowCounter { + private AtomicInteger count = new AtomicInteger(0); + private volatile long windowStart = System.currentTimeMillis(); + + synchronized boolean tryIncrement() { + long now = System.currentTimeMillis(); + if (now - windowStart > windowMillis) { + count.set(0); + windowStart = now; + } + return count.incrementAndGet() <= limit; + } + } +} +``` + +--- + +#### 3. Adaptive Rate Limiter + +This version adjusts the rate based on system health, reducing the rate when throttling occurs and recovering periodically. + +```java +public class AdaptiveRateLimiter implements RateLimiter { + private final int initialLimit; + private final int maxLimit; + private final AtomicInteger currentLimit; + private final ConcurrentHashMap limiters = new ConcurrentHashMap<>(); + private final ScheduledExecutorService healthChecker = Executors.newScheduledThreadPool(1); + + public AdaptiveRateLimiter(int initialLimit, int maxLimit) { + this.initialLimit = initialLimit; + this.maxLimit = maxLimit; + this.currentLimit = new AtomicInteger(initialLimit); + healthChecker.scheduleAtFixedRate(this::adjustLimits, 10, 10, TimeUnit.SECONDS); + } + + @Override + public void check(String serviceName, String operationName) throws RateLimitException { + String key = serviceName + ":" + operationName; + int current = currentLimit.get(); + RateLimiter limiter = limiters.computeIfAbsent(key, k -> new TokenBucketRateLimiter(current, current)); + + try { + limiter.check(serviceName, operationName); + } catch (RateLimitException e) { + currentLimit.updateAndGet(curr -> Math.max(initialLimit, curr / 2)); + throw e; + } + } + + private void adjustLimits() { + currentLimit.updateAndGet(curr -> Math.min(maxLimit, curr + (initialLimit / 2))); + } +} +``` + +--- + +#### 4. Simulated Demo Using All Limiters + +```java +public final class App { + public static void main(String[] args) { + TokenBucketRateLimiter tb = new TokenBucketRateLimiter(2, 1); + FixedWindowRateLimiter fw = new FixedWindowRateLimiter(3, 1); + AdaptiveRateLimiter ar = new AdaptiveRateLimiter(2, 6); + + ExecutorService executor = Executors.newFixedThreadPool(3); + for (int i = 1; i <= 3; i++) { + executor.submit(createClientTask(i, tb, fw, ar)); + } + } + + private static Runnable createClientTask(int clientId, RateLimiter tb, RateLimiter fw, RateLimiter ar) { + return () -> { + String[] services = {"s3", "dynamodb", "lambda"}; + String[] operations = {"GetObject", "PutObject", "Query", "Scan", "PutItem", "Invoke", "ListFunctions"}; + Random random = new Random(); + + while (true) { + String service = services[random.nextInt(services.length)]; + String operation = operations[random.nextInt(operations.length)]; + try { + switch (service) { + case "s3" -> tb.check(service, operation); + case "dynamodb" -> fw.check(service, operation); + case "lambda" -> ar.check(service, operation); + } + System.out.printf("Client %d: %s.%s - ALLOWED%n", clientId, service, operation); + } catch (RateLimitException e) { + System.out.printf("Client %d: %s.%s - THROTTLED%n", clientId, service, operation); + } + + try { + Thread.sleep(30 + random.nextInt(50)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + }; + } +} +``` + +--- + +This example highlights how the Rate Limiter pattern supports various throttling techniques and how they respond under simulated traffic pressure, making it invaluable for building scalable, resilient systems. + +## When to Use Rate Limiting + +- APIs receiving unpredictable traffic +- Shared cloud resources (e.g., DB, compute) +- Services requiring fair client usage +- Preventing DoS or abuse + +--- + +## Real-World Applications + +- **AWS API Gateway** +- **Google Cloud Functions** +- **Netflix Zuul API Gateway** +- **Stripe API Throttling** + +--- + +## Benefits and Trade-offs + +### Benefits + +- Protects backend from overload +- Fair distribution of resources +- Better user experience under load + +### Trade-offs + +- May delay valid requests +- Requires tuning of limits +- Could create bottlenecks if misused + +--- + +## Related Java Design Patterns + +- [Circuit Breaker](https://java-design-patterns.com/patterns/circuit-breaker/) +- [Retry](https://java-design-patterns.com/patterns/retry/) +- [Throttling Queue](https://java-design-patterns.com/patterns/throttling/) + +--- + +## References and Credits + +- [Microsoft Cloud Design Patterns](https://learn.microsoft.com/en-us/azure/architecture/patterns/throttling) +- [AWS API Gateway Throttling](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-request-throttling.html) +- *Designing Data-Intensive Applications* by Martin Kleppmann +- [Resilience4j](https://resilience4j.readme.io/) +- Java Design Patterns Project: [java-design-patterns](https://github.com/iluwatar/java-design-patterns) diff --git a/rate-limiting-pattern/etc/Adaptive Rate Limiter.png b/rate-limiting-pattern/etc/AdaptiveRateLimiter.png similarity index 100% rename from rate-limiting-pattern/etc/Adaptive Rate Limiter.png rename to rate-limiting-pattern/etc/AdaptiveRateLimiter.png diff --git a/rate-limiting-pattern/etc/Fixed Window Rate Limiter.png b/rate-limiting-pattern/etc/FixedWindowRateLimiter.png similarity index 100% rename from rate-limiting-pattern/etc/Fixed Window Rate Limiter.png rename to rate-limiting-pattern/etc/FixedWindowRateLimiter.png diff --git a/rate-limiting-pattern/etc/Token Bucket Rate Limiter.png b/rate-limiting-pattern/etc/TokenBucketRateLimiter.png similarity index 100% rename from rate-limiting-pattern/etc/Token Bucket Rate Limiter.png rename to rate-limiting-pattern/etc/TokenBucketRateLimiter.png diff --git a/rate-limiting-pattern/etc/UML Class Diagram.png b/rate-limiting-pattern/etc/UMLClassDiagram.png similarity index 100% rename from rate-limiting-pattern/etc/UML Class Diagram.png rename to rate-limiting-pattern/etc/UMLClassDiagram.png diff --git a/rate-limiting-pattern/pom.xml b/rate-limiting-pattern/pom.xml index cde9591fd1b5..d908c9529aaa 100644 --- a/rate-limiting-pattern/pom.xml +++ b/rate-limiting-pattern/pom.xml @@ -39,6 +39,24 @@ + + com.diffplug.spotless + spotless-maven-plugin + 2.44.2 + + + + check + apply + + + + + + + + + org.apache.maven.plugins maven-surefire-plugin diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiter.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiter.java index a7c565a85c9e..1b18a8c941b9 100644 --- a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiter.java +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiter.java @@ -3,9 +3,7 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; -/** - * Adaptive rate limiter that adjusts limits based on system health. - */ +/** Adaptive rate limiter that adjusts limits based on system health. */ public class AdaptiveRateLimiter implements RateLimiter { private final int initialLimit; private final int maxLimit; @@ -17,6 +15,7 @@ public AdaptiveRateLimiter(int initialLimit, int maxLimit) { this.initialLimit = initialLimit; this.maxLimit = maxLimit; this.currentLimit = new AtomicInteger(initialLimit); + // Periodically increase limit to recover if system appears healthy healthChecker.scheduleAtFixedRate(this::adjustLimits, 10, 10, TimeUnit.SECONDS); } @@ -25,22 +24,27 @@ public void check(String serviceName, String operationName) throws RateLimitExce String key = serviceName + ":" + operationName; int current = currentLimit.get(); - RateLimiter limiter = limiters.computeIfAbsent(key, - k -> new TokenBucketRateLimiter(current, current)); + // Reuse or create TokenBucket for this key using currentLimit + RateLimiter limiter = + limiters.computeIfAbsent(key, k -> new TokenBucketRateLimiter(current, current)); try { limiter.check(serviceName, operationName); - System.out.printf("[Adaptive] Allowed %s.%s - CurrentLimit: %d%n", serviceName, operationName, current); + System.out.printf( + "[Adaptive] Allowed %s.%s - CurrentLimit: %d%n", serviceName, operationName, current); } catch (RateLimitException e) { + // On throttling, reduce system limit to reduce load currentLimit.updateAndGet(curr -> Math.max(initialLimit, curr / 2)); - System.out.printf("[Adaptive] Throttled %s.%s - Decreasing limit to %d%n", + System.out.printf( + "[Adaptive] Throttled %s.%s - Decreasing limit to %d%n", serviceName, operationName, currentLimit.get()); throw e; } } + // Periodic recovery mechanism to raise limits when the system is under control private void adjustLimits() { int updated = currentLimit.updateAndGet(curr -> Math.min(maxLimit, curr + (initialLimit / 2))); System.out.printf("[Adaptive] Health check passed - Increasing limit to %d%n", updated); } -} \ No newline at end of file +} diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java index 1774a9301cec..3afba659cf9f 100644 --- a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java @@ -6,40 +6,42 @@ import java.util.concurrent.atomic.AtomicInteger; /** - * The Rate Limiter pattern is a key defensive strategy used to prevent system overload - * and ensure fair usage of shared services. This demo showcases how different rate limiting techniques + * The Rate Limiter pattern is a key defensive strategy used to prevent system overload and + * ensure fair usage of shared services. This demo showcases how different rate limiting techniques * can regulate traffic in distributed systems. * *

Specifically, this simulation implements three rate limiter strategies: * *

    - *
  • Token Bucket – Allows short bursts followed by steady request rates.
  • - *
  • Fixed Window – Enforces a strict limit per discrete time window (e.g., 3 requests/sec).
  • - *
  • Adaptive – Dynamically scales limits based on system health, simulating elastic backoff.
  • + *
  • Token Bucket – Allows short bursts followed by steady request rates. + *
  • Fixed Window – Enforces a strict limit per discrete time window (e.g., 3 + * requests/sec). + *
  • Adaptive – Dynamically scales limits based on system health, simulating elastic + * backoff. *
* - *

Each simulated service (e.g., S3, DynamoDB, Lambda) is governed by one of these limiters. Multiple - * concurrent client threads issue randomized requests to these services over a fixed duration. Each - * request is either: + *

Each simulated service (e.g., S3, DynamoDB, Lambda) is governed by one of these limiters. + * Multiple concurrent client threads issue randomized requests to these services over a fixed + * duration. Each request is either: * *

    - *
  • ALLOWED – Permitted under the current rate limit
  • - *
  • THROTTLED – Rejected due to quota exhaustion
  • - *
  • FAILED – Dropped due to transient service failure
  • + *
  • ALLOWED – Permitted under the current rate limit + *
  • THROTTLED – Rejected due to quota exhaustion + *
  • FAILED – Dropped due to transient service failure *
* - *

Statistics are printed every few seconds, and the simulation exits gracefully after a fixed runtime, - * offering a clear view into how each limiter behaves under pressure. + *

Statistics are printed every few seconds, and the simulation exits gracefully after a fixed + * runtime, offering a clear view into how each limiter behaves under pressure. * *

Relation to AWS API Gateway:
- * This implementation mirrors the throttling behavior described in the - *
- * AWS API Gateway Request Throttling documentation, where limits are applied per second and over - * longer durations (burst and rate limits). The TokenBucketRateLimiter mimics burst capacity, - * the FixedWindowRateLimiter models steady rate enforcement, and the AdaptiveRateLimiter - * reflects elasticity in real-world systems like AWS Lambda under variable load. - * - * */ + * This implementation mirrors the throttling behavior described in the + * AWS API Gateway Request Throttling documentation, where limits are applied per second and + * over longer durations (burst and rate limits). The TokenBucketRateLimiter mimics + * burst capacity, the FixedWindowRateLimiter models steady rate enforcement, and the + * AdaptiveRateLimiter reflects elasticity in real-world systems like AWS Lambda under + * variable load. + */ public final class App { private static final int RUN_DURATION_SECONDS = 10; private static final int SHUTDOWN_TIMEOUT_SECONDS = 5; @@ -60,7 +62,7 @@ public static void main(String[] args) { // Explicit limiter setup for demonstration clarity TokenBucketRateLimiter tb = new TokenBucketRateLimiter(2, 1); // capacity 2, refill 1/sec FixedWindowRateLimiter fw = new FixedWindowRateLimiter(3, 1); // max 3 req/sec - AdaptiveRateLimiter ar = new AdaptiveRateLimiter(2, 6); // adaptive from 2 to 6 req/sec + AdaptiveRateLimiter ar = new AdaptiveRateLimiter(2, 6); // adaptive from 2 to 6 req/sec // Print statistics every 2 seconds statsPrinter.scheduleAtFixedRate(App::printStats, 2, 2, TimeUnit.SECONDS); @@ -93,14 +95,12 @@ public static void main(String[] args) { } } - private static Runnable createClientTask(int clientId, - RateLimiter s3Limiter, - RateLimiter dynamoDbLimiter, - RateLimiter lambdaLimiter) { + private static Runnable createClientTask( + int clientId, RateLimiter s3Limiter, RateLimiter dynamoDbLimiter, RateLimiter lambdaLimiter) { return () -> { String[] services = {"s3", "dynamodb", "lambda"}; String[] operations = { - "GetObject", "PutObject", "Query", "Scan", "PutItem", "Invoke", "ListFunctions" + "GetObject", "PutObject", "Query", "Scan", "PutItem", "Invoke", "ListFunctions" }; Random random = new Random(); @@ -123,24 +123,24 @@ private static Runnable createClientTask(int clientId, }; } - private static void makeRequest(int clientId, RateLimiter limiter, - String service, String operation) { + private static void makeRequest( + int clientId, RateLimiter limiter, String service, String operation) { try { limiter.check(service, operation); successfulRequests.incrementAndGet(); System.out.printf("Client %d: %s.%s - ALLOWED%n", clientId, service, operation); } catch (ThrottlingException e) { throttledRequests.incrementAndGet(); - System.out.printf("Client %d: %s.%s - THROTTLED (Retry in %dms)%n", + System.out.printf( + "Client %d: %s.%s - THROTTLED (Retry in %dms)%n", clientId, service, operation, e.getRetryAfterMillis()); } catch (ServiceUnavailableException e) { failedRequests.incrementAndGet(); - System.out.printf("Client %d: %s.%s - SERVICE UNAVAILABLE%n", - clientId, service, operation); + System.out.printf("Client %d: %s.%s - SERVICE UNAVAILABLE%n", clientId, service, operation); } catch (Exception e) { failedRequests.incrementAndGet(); - System.out.printf("Client %d: %s.%s - ERROR: %s%n", - clientId, service, operation, e.getMessage()); + System.out.printf( + "Client %d: %s.%s - ERROR: %s%n", clientId, service, operation, e.getMessage()); } } @@ -161,4 +161,4 @@ private static void printFinalStats() { System.out.printf("Failed Requests : %d%n", failedRequests.get()); System.out.println("=========================="); } -} \ No newline at end of file +} diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequest.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequest.java index 28ada548a1d0..a61fc35f496a 100644 --- a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequest.java +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequest.java @@ -1,7 +1,8 @@ package com.iluwatar.rate.limiting.pattern; /** - * Example operation implementation for finding customers. + * A rate-limited customer lookup operation. This class wraps the rate limiting logic and represents + * an executable business request. */ public class FindCustomerRequest implements RateLimitOperation { private final String customerId; @@ -24,6 +25,7 @@ public String getOperationName() { @Override public String execute() throws RateLimitException { + // Ensure the operation respects the assigned rate limiter rateLimiter.check(getServiceName(), getOperationName()); // Simulate actual operation @@ -35,4 +37,4 @@ public String execute() throws RateLimitException { throw new ServiceUnavailableException(getServiceName(), 1000); } } -} \ No newline at end of file +} diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiter.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiter.java index 697cecd5d7e0..3a2b52888ca7 100644 --- a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiter.java +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiter.java @@ -4,7 +4,8 @@ import java.util.concurrent.atomic.AtomicInteger; /** - * Fixed window rate limiter implementation. + * Implements a fixed window rate limiter. It allows up to 'limit' number of requests within a time + * window of fixed size. */ public class FixedWindowRateLimiter implements RateLimiter { private final int limit; @@ -17,30 +18,36 @@ public FixedWindowRateLimiter(int limit, long windowSeconds) { } @Override - public synchronized void check(String serviceName, String operationName) throws RateLimitException { + public synchronized void check(String serviceName, String operationName) + throws RateLimitException { String key = serviceName + ":" + operationName; WindowCounter counter = counters.computeIfAbsent(key, k -> new WindowCounter()); if (!counter.tryIncrement()) { - System.out.printf("[FixedWindow] Throttled %s.%s - Limit %d reached in window%n", + System.out.printf( + "[FixedWindow] Throttled %s.%s - Limit %d reached in window%n", serviceName, operationName, limit); throw new RateLimitException("Rate limit exceeded for " + key, windowMillis); } else { - System.out.printf("[FixedWindow] Allowed %s.%s - Count within window%n", serviceName, operationName); + System.out.printf( + "[FixedWindow] Allowed %s.%s - Count within window%n", serviceName, operationName); } } + /** Tracks the count of requests within the current window. */ private class WindowCounter { private AtomicInteger count = new AtomicInteger(0); private volatile long windowStart = System.currentTimeMillis(); synchronized boolean tryIncrement() { long now = System.currentTimeMillis(); + // Reset window if expired if (now - windowStart > windowMillis) { count.set(0); windowStart = now; } + // Enforce the request limit within window return count.incrementAndGet() <= limit; } } -} \ No newline at end of file +} diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitException.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitException.java index 788b9fcd816c..2b3cc1f3006b 100644 --- a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitException.java +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitException.java @@ -1,8 +1,6 @@ package com.iluwatar.rate.limiting.pattern; -/** - * Base exception for rate limiting errors. - */ +/** Base exception for rate limiting errors. */ public class RateLimitException extends Exception { private final long retryAfterMillis; @@ -14,4 +12,4 @@ public RateLimitException(String message, long retryAfterMillis) { public long getRetryAfterMillis() { return retryAfterMillis; } -} \ No newline at end of file +} diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitOperation.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitOperation.java index 243ea66106dc..59191e81fc04 100644 --- a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitOperation.java +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitOperation.java @@ -1,10 +1,10 @@ package com.iluwatar.rate.limiting.pattern; -/** - * Interface representing an operation that needs rate limiting. - */ +/** Represents a business operation that needs rate limiting. Supports type-safe return values. */ public interface RateLimitOperation { String getServiceName(); + String getOperationName(); + T execute() throws RateLimitException; } diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimiter.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimiter.java index 3c6b15e1a47f..19495b401ddb 100644 --- a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimiter.java +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimiter.java @@ -1,11 +1,10 @@ package com.iluwatar.rate.limiting.pattern; -/** - * Interface for rate limiting operations. - */ +/** Base interface for all rate limiter strategies. */ public interface RateLimiter { /** * Checks if a request is allowed under current rate limits + * * @param serviceName Service being called (e.g., "dynamodb") * @param operationName Operation being performed (e.g., "Query") * @throws RateLimitException if request exceeds limits diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ServiceUnavailableException.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ServiceUnavailableException.java index 04426330a13a..f9fc55f15d20 100644 --- a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ServiceUnavailableException.java +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ServiceUnavailableException.java @@ -1,8 +1,6 @@ package com.iluwatar.rate.limiting.pattern; -/** - * Exception for when a service is temporarily unavailable. - */ +/** Exception for when a service is temporarily unavailable. */ public class ServiceUnavailableException extends RateLimitException { private final String serviceName; diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ThrottlingException.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ThrottlingException.java index 2c85621640e5..e07087dfee6c 100644 --- a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ThrottlingException.java +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ThrottlingException.java @@ -1,8 +1,6 @@ package com.iluwatar.rate.limiting.pattern; -/** - * Exception thrown when AWS-style throttling occurs. - */ +/** Exception thrown when AWS-style throttling occurs. */ public class ThrottlingException extends RateLimitException { private final String serviceName; private final String errorCode; diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java index 549dfae5c720..3001c880aad3 100644 --- a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java @@ -4,7 +4,8 @@ import java.util.concurrent.atomic.AtomicInteger; /** - * Token bucket rate limiter implementation. + * Token Bucket rate limiter implementation. Allows requests to proceed as long as there are tokens + * available in the bucket. Tokens are added at a fixed interval up to a defined capacity. */ public class TokenBucketRateLimiter implements RateLimiter { private final int capacity; @@ -15,6 +16,7 @@ public class TokenBucketRateLimiter implements RateLimiter { public TokenBucketRateLimiter(int capacity, int refillRate) { this.capacity = capacity; this.refillRate = refillRate; + // Refill tokens in all buckets every second scheduler.scheduleAtFixedRate(this::refillBuckets, 1, 1, TimeUnit.SECONDS); } @@ -24,18 +26,20 @@ public void check(String serviceName, String operationName) throws RateLimitExce TokenBucket bucket = buckets.computeIfAbsent(key, k -> new TokenBucket(capacity)); if (!bucket.tryConsume()) { - System.out.printf("[TokenBucket] Throttled %s.%s - No tokens available%n", serviceName, operationName); + System.out.printf( + "[TokenBucket] Throttled %s.%s - No tokens available%n", serviceName, operationName); throw new ThrottlingException(serviceName, operationName, 1000); } else { - System.out.printf("[TokenBucket] Allowed %s.%s - Tokens remaining%n", serviceName, operationName); + System.out.printf( + "[TokenBucket] Allowed %s.%s - Tokens remaining%n", serviceName, operationName); } } - private void refillBuckets() { buckets.forEach((k, b) -> b.refill(refillRate)); } + /** Inner class that represents the bucket holding tokens for each service-operation. */ private static class TokenBucket { private final int capacity; private final AtomicInteger tokens; diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiterTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiterTest.java index b3207c019390..042d606490d0 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiterTest.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiterTest.java @@ -1,8 +1,9 @@ package com.iluwatar.rate.limiting.pattern; -import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + class AdaptiveRateLimiterTest { @Test void shouldDecreaseLimitWhenThrottled() throws Exception { @@ -18,31 +19,38 @@ void shouldDecreaseLimitWhenThrottled() throws Exception { } // Verify limit was reduced - assertThrows(RateLimitException.class, () -> { - for (int i = 0; i < 6; i++) { // New limit should be 5 (10/2) - limiter.check("test", "op"); - } - }); + assertThrows( + RateLimitException.class, + () -> { + for (int i = 0; i < 6; i++) { // New limit should be 5 (10/2) + limiter.check("test", "op"); + } + }); } @Test void shouldGraduallyIncreaseLimitWhenHealthy() throws Exception { - AdaptiveRateLimiter limiter = new AdaptiveRateLimiter(10, 20); + AdaptiveRateLimiter limiter = + new AdaptiveRateLimiter(4, 10); // Start from 4 → expect 2 → expect increase to 4 - // Force limit reduction - for (int i = 0; i < 11; i++) { + // Force throttling to reduce limit + for (int i = 0; i < 5; i++) { try { limiter.check("test", "op"); - } catch (RateLimitException e) {} + } catch (RateLimitException e) { + // Expected to throttle and reduce limit + } } - // Wait for health check (adjustment happens every 10 seconds) - Thread.sleep(10500); + // Wait for health check to increase limit + Thread.sleep(11000); // Wait slightly more than 10 seconds - // Verify limit was increased - for (int i = 0; i < 8; i++) { // New limit should be 10 (5 + 5) + // Allow up to 4 requests again (limit should've increased to 4) + for (int i = 0; i < 4; i++) { limiter.check("test", "op"); } + + // 5th should throw exception again assertThrows(RateLimitException.class, () -> limiter.check("test", "op")); } -} \ No newline at end of file +} diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ConcurrencyTests.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ConcurrencyTests.java index f4efb723d29e..35a1294a8ad3 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ConcurrencyTests.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ConcurrencyTests.java @@ -1,10 +1,10 @@ package com.iluwatar.rate.limiting.pattern; -import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; - -import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; class ConcurrencyTests { @Test @@ -19,15 +19,16 @@ void tokenBucketShouldHandleConcurrentRequests() throws Exception { AtomicInteger failureCount = new AtomicInteger(); for (int i = 0; i < threadCount; i++) { - executor.submit(() -> { - try { - limiter.check("test", "op"); - successCount.incrementAndGet(); - } catch (RateLimitException e) { - failureCount.incrementAndGet(); - } - latch.countDown(); - }); + executor.submit( + () -> { + try { + limiter.check("test", "op"); + successCount.incrementAndGet(); + } catch (RateLimitException e) { + failureCount.incrementAndGet(); + } + latch.countDown(); + }); } latch.await(); @@ -42,11 +43,13 @@ void adaptiveLimiterShouldAdjustUnderLoad() throws Exception { // Flood with requests to trigger throttling for (int i = 0; i < 30; i++) { - executor.submit(() -> { - try { - limiter.check("test", "op"); - } catch (RateLimitException ignored) {} - }); + executor.submit( + () -> { + try { + limiter.check("test", "op"); + } catch (RateLimitException ignored) { + } + }); } Thread.sleep(15000); // Wait for adjustment @@ -57,9 +60,10 @@ void adaptiveLimiterShouldAdjustUnderLoad() throws Exception { try { limiter.check("test", "op"); allowed++; - } catch (RateLimitException ignored) {} + } catch (RateLimitException ignored) { + } } assertTrue(allowed > 5 && allowed < 15); // Should be between initial and max } -} \ No newline at end of file +} diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ExceptionTests.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ExceptionTests.java index 6cbeee082100..a7b037fbe73f 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ExceptionTests.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ExceptionTests.java @@ -1,8 +1,9 @@ package com.iluwatar.rate.limiting.pattern; -import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + class ExceptionTests { @Test void rateLimitExceptionShouldContainRetryInfo() { @@ -24,4 +25,4 @@ void serviceUnavailableExceptionShouldContainRetryInfo() { assertEquals("s3", exception.getServiceName()); assertEquals(2000, exception.getRetryAfterMillis()); } -} \ No newline at end of file +} diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java index 4e075fd4cfd7..04e32cfc398e 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java @@ -1,8 +1,9 @@ package com.iluwatar.rate.limiting.pattern; -import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + class FindCustomerRequestTest implements RateLimitOperationTest { @Override diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java index 71b798cd9388..0fb0768e561c 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java @@ -1,9 +1,10 @@ package com.iluwatar.rate.limiting.pattern; -import org.junit.jupiter.api.Test; -import java.util.concurrent.TimeUnit; import static org.junit.jupiter.api.Assertions.*; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.Test; + class FixedWindowRateLimiterTest extends RateLimiterTest { @Override protected RateLimiter createRateLimiter(int limit, long windowMillis) { @@ -28,4 +29,4 @@ void shouldNotAllowMoreThanLimitInWindow() throws Exception { } assertThrows(RateLimitException.class, () -> limiter.check("test", "op")); } -} \ No newline at end of file +} diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimitOperationTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimitOperationTest.java index 7a00a584d3d1..d4922bdfc073 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimitOperationTest.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimitOperationTest.java @@ -1,8 +1,9 @@ package com.iluwatar.rate.limiting.pattern; -import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + interface RateLimitOperationTest { RateLimitOperation createOperation(RateLimiter limiter); diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimiterTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimiterTest.java index 92ec44457dfe..7f1e6b4a2806 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimiterTest.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimiterTest.java @@ -22,4 +22,4 @@ void shouldThrowWhenLimitExceeded() throws Exception { limiter.check("test", "op"); assertThrows(RateLimitException.class, () -> limiter.check("test", "op")); } -} \ No newline at end of file +} diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiterTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiterTest.java index ea8bc530d058..5696299512fb 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiterTest.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiterTest.java @@ -1,13 +1,14 @@ package com.iluwatar.rate.limiting.pattern; -import org.junit.jupiter.api.Test; -import java.util.concurrent.TimeUnit; import static org.junit.jupiter.api.Assertions.*; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.Test; + class TokenBucketRateLimiterTest extends RateLimiterTest { @Override protected RateLimiter createRateLimiter(int limit, long windowMillis) { - return new TokenBucketRateLimiter(limit, (int)(limit * 1000 / windowMillis)); + return new TokenBucketRateLimiter(limit, (int) (limit * 1000 / windowMillis)); } @Test @@ -35,4 +36,4 @@ void shouldHandleMultipleServicesSeparately() throws Exception { limiter.check("service2", "op"); assertThrows(RateLimitException.class, () -> limiter.check("service1", "op")); } -} \ No newline at end of file +} From 1f3ad40db9221d82b022f04265233d4286ac4e29 Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Sun, 1 Jun 2025 12:20:28 -0500 Subject: [PATCH 04/18] Updated parent pom #2973 --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index e2532c1b8b86..4cc69639b071 100644 --- a/pom.xml +++ b/pom.xml @@ -199,7 +199,6 @@ proxy publish-subscribe queue-based-load-leveling - rate-limiting-pattern reactor registry repository From 3526c05dc38cec51699e9442931d0fce9f45664d Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Sun, 1 Jun 2025 12:21:55 -0500 Subject: [PATCH 05/18] Updated parent pom #2973 --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4cc69639b071..e967691baa65 100644 --- a/pom.xml +++ b/pom.xml @@ -247,7 +247,6 @@ backpressure actor-model rate-limiting-pattern - rate-limiting-pattern From 26cb1b2a258e169d4a1ae03b7d728e3e32d46e37 Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Sun, 1 Jun 2025 12:42:17 -0500 Subject: [PATCH 06/18] fixed shouldResetCounterAfterWindow() test #2973 --- .../limiting/pattern/FixedWindowRateLimiterTest.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java index 0fb0768e561c..e0ab0841d092 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java @@ -13,11 +13,18 @@ protected RateLimiter createRateLimiter(int limit, long windowMillis) { @Test void shouldResetCounterAfterWindow() throws Exception { - FixedWindowRateLimiter limiter = new FixedWindowRateLimiter(1, 1); + FixedWindowRateLimiter limiter = new FixedWindowRateLimiter(1, 1); // 1 request per 1 second window + + // First request should pass limiter.check("test", "op"); + + // Second request in same window should be throttled assertThrows(RateLimitException.class, () -> limiter.check("test", "op")); - TimeUnit.SECONDS.sleep(1); + // Wait a bit more than 1 second to ensure window resets + TimeUnit.MILLISECONDS.sleep(1100); + + // After window reset, this should pass again limiter.check("test", "op"); } From 8afefee7031afe726112af5d1626fb0a6fac0bc2 Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Sun, 1 Jun 2025 13:01:09 -0500 Subject: [PATCH 07/18] formatting fixed #2973 --- .../rate/limiting/pattern/FixedWindowRateLimiterTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java index e0ab0841d092..656185b7e68e 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java @@ -13,7 +13,8 @@ protected RateLimiter createRateLimiter(int limit, long windowMillis) { @Test void shouldResetCounterAfterWindow() throws Exception { - FixedWindowRateLimiter limiter = new FixedWindowRateLimiter(1, 1); // 1 request per 1 second window + FixedWindowRateLimiter limiter = + new FixedWindowRateLimiter(1, 1); // 1 request per 1 second window // First request should pass limiter.check("test", "op"); From fe253e404d91fb466362573767a9f93070382c49 Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Sun, 1 Jun 2025 14:26:05 -0500 Subject: [PATCH 08/18] added test coverage for app.java and fixed random to be thread safe #2973 --- rate-limiting-pattern/pom.xml | 20 +++ .../iluwatar/rate/limiting/pattern/App.java | 116 +++++++++--------- .../rate/limiting/pattern/AppTest.java | 61 +++++++++ .../rate/limiting/pattern/AppTestUtils.java | 26 ++++ .../pattern/FindCustomerRequestTest.java | 15 +++ 5 files changed, 182 insertions(+), 56 deletions(-) create mode 100644 rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java create mode 100644 rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTestUtils.java diff --git a/rate-limiting-pattern/pom.xml b/rate-limiting-pattern/pom.xml index d908c9529aaa..672ab73eb7b2 100644 --- a/rate-limiting-pattern/pom.xml +++ b/rate-limiting-pattern/pom.xml @@ -29,6 +29,26 @@ test + + org.mockito + mockito-core + 5.12.0 + test + + + + + org.slf4j + slf4j-api + 2.0.9 + + + ch.qos.logback + logback-classic + 1.4.11 + + + org.assertj assertj-core diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java index 3afba659cf9f..e1432839215d 100644 --- a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java @@ -1,6 +1,7 @@ package com.iluwatar.rate.limiting.pattern; -import java.util.Random; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -43,66 +44,66 @@ * variable load. */ public final class App { + private static final Logger LOGGER = LoggerFactory.getLogger(App.class); + private static final int RUN_DURATION_SECONDS = 10; private static final int SHUTDOWN_TIMEOUT_SECONDS = 5; - private static final AtomicInteger successfulRequests = new AtomicInteger(); - private static final AtomicInteger throttledRequests = new AtomicInteger(); - private static final AtomicInteger failedRequests = new AtomicInteger(); - private static final AtomicBoolean running = new AtomicBoolean(true); + static final AtomicInteger successfulRequests = new AtomicInteger(); + static final AtomicInteger throttledRequests = new AtomicInteger(); + static final AtomicInteger failedRequests = new AtomicInteger(); + static final AtomicBoolean running = new AtomicBoolean(true); + private static final String DIVIDER_LINE = "===================================="; public static void main(String[] args) { - System.out.println("\nStarting Rate Limiter Demo"); - System.out.println("===================================="); + LOGGER.info("Starting Rate Limiter Demo"); + LOGGER.info(DIVIDER_LINE); ExecutorService executor = Executors.newFixedThreadPool(3); ScheduledExecutorService statsPrinter = Executors.newSingleThreadScheduledExecutor(); try { - // Explicit limiter setup for demonstration clarity - TokenBucketRateLimiter tb = new TokenBucketRateLimiter(2, 1); // capacity 2, refill 1/sec - FixedWindowRateLimiter fw = new FixedWindowRateLimiter(3, 1); // max 3 req/sec - AdaptiveRateLimiter ar = new AdaptiveRateLimiter(2, 6); // adaptive from 2 to 6 req/sec + TokenBucketRateLimiter tb = new TokenBucketRateLimiter(2, 1); + FixedWindowRateLimiter fw = new FixedWindowRateLimiter(3, 1); + AdaptiveRateLimiter ar = new AdaptiveRateLimiter(2, 6); - // Print statistics every 2 seconds statsPrinter.scheduleAtFixedRate(App::printStats, 2, 2, TimeUnit.SECONDS); - // Launch 3 simulated clients for (int i = 1; i <= 3; i++) { executor.submit(createClientTask(i, tb, fw, ar)); } - // Run simulation for N seconds Thread.sleep(RUN_DURATION_SECONDS * 1000L); - System.out.println("\nShutting down the demo..."); - + LOGGER.info("Shutting down the demo..."); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } finally { running.set(false); - executor.shutdown(); - statsPrinter.shutdown(); + shutdownExecutor(executor, "mainExecutor"); + shutdownExecutor(statsPrinter, "statsPrinter"); + printFinalStats(); + LOGGER.info("Demo completed."); + } + } - if (!executor.awaitTermination(SHUTDOWN_TIMEOUT_SECONDS, TimeUnit.SECONDS)) { - executor.shutdownNow(); - } - if (!statsPrinter.awaitTermination(SHUTDOWN_TIMEOUT_SECONDS, TimeUnit.SECONDS)) { - statsPrinter.shutdownNow(); + private static void shutdownExecutor(ExecutorService service, String name) { + service.shutdown(); + try { + if (!service.awaitTermination(SHUTDOWN_TIMEOUT_SECONDS, TimeUnit.SECONDS)) { + service.shutdownNow(); + LOGGER.warn("Forced shutdown of {}", name); } - } catch (InterruptedException e) { + service.shutdownNow(); Thread.currentThread().interrupt(); - } finally { - printFinalStats(); - System.out.println("Demo completed."); } } - private static Runnable createClientTask( - int clientId, RateLimiter s3Limiter, RateLimiter dynamoDbLimiter, RateLimiter lambdaLimiter) { + static Runnable createClientTask(int clientId, RateLimiter s3Limiter, RateLimiter dynamoDbLimiter, RateLimiter lambdaLimiter) { return () -> { String[] services = {"s3", "dynamodb", "lambda"}; - String[] operations = { - "GetObject", "PutObject", "Query", "Scan", "PutItem", "Invoke", "ListFunctions" - }; - Random random = new Random(); + String[] operations = {"GetObject", "PutObject", "Query", "Scan", "PutItem", "Invoke", "ListFunctions"}; + ThreadLocalRandom random = ThreadLocalRandom.current(); while (running.get() && !Thread.currentThread().isInterrupted()) { try { @@ -113,9 +114,10 @@ private static Runnable createClientTask( case "s3" -> makeRequest(clientId, s3Limiter, service, operation); case "dynamodb" -> makeRequest(clientId, dynamoDbLimiter, service, operation); case "lambda" -> makeRequest(clientId, lambdaLimiter, service, operation); + default -> LOGGER.warn("Unknown service: {}", service); } - Thread.sleep(30 + random.nextInt(50)); + Thread.sleep(30L + random.nextInt(50)); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } @@ -123,42 +125,44 @@ private static Runnable createClientTask( }; } - private static void makeRequest( - int clientId, RateLimiter limiter, String service, String operation) { + static void makeRequest(int clientId, RateLimiter limiter, String service, String operation) { try { limiter.check(service, operation); successfulRequests.incrementAndGet(); - System.out.printf("Client %d: %s.%s - ALLOWED%n", clientId, service, operation); + LOGGER.info("Client {}: {}.{} - ALLOWED", clientId, service, operation); } catch (ThrottlingException e) { throttledRequests.incrementAndGet(); - System.out.printf( - "Client %d: %s.%s - THROTTLED (Retry in %dms)%n", - clientId, service, operation, e.getRetryAfterMillis()); + LOGGER.warn("Client {}: {}.{} - THROTTLED (Retry in {}ms)", clientId, service, operation, e.getRetryAfterMillis()); } catch (ServiceUnavailableException e) { failedRequests.incrementAndGet(); - System.out.printf("Client %d: %s.%s - SERVICE UNAVAILABLE%n", clientId, service, operation); + LOGGER.warn("Client {}: {}.{} - SERVICE UNAVAILABLE", clientId, service, operation); } catch (Exception e) { failedRequests.incrementAndGet(); - System.out.printf( - "Client %d: %s.%s - ERROR: %s%n", clientId, service, operation, e.getMessage()); + LOGGER.error("Client {}: {}.{} - ERROR: {}", clientId, service, operation, e.getMessage()); } } - private static void printStats() { + static void printStats() { if (!running.get()) return; - System.out.println("\n=== Current Statistics ==="); - System.out.printf("Successful Requests: %d%n", successfulRequests.get()); - System.out.printf("Throttled Requests : %d%n", throttledRequests.get()); - System.out.printf("Failed Requests : %d%n", failedRequests.get()); - System.out.println("==========================\n"); + LOGGER.info("=== Current Statistics ==="); + LOGGER.info("Successful Requests: {}", successfulRequests.get()); + LOGGER.info("Throttled Requests : {}", throttledRequests.get()); + LOGGER.info("Failed Requests : {}", failedRequests.get()); + LOGGER.info(DIVIDER_LINE); + } + + static void printFinalStats() { + LOGGER.info("Final Statistics"); + LOGGER.info(DIVIDER_LINE); + LOGGER.info("Successful Requests: {}", successfulRequests.get()); + LOGGER.info("Throttled Requests : {}", throttledRequests.get()); + LOGGER.info("Failed Requests : {}", failedRequests.get()); + LOGGER.info(DIVIDER_LINE); } - private static void printFinalStats() { - System.out.println("\nFinal Statistics"); - System.out.println("=========================="); - System.out.printf("Successful Requests: %d%n", successfulRequests.get()); - System.out.printf("Throttled Requests : %d%n", throttledRequests.get()); - System.out.printf("Failed Requests : %d%n", failedRequests.get()); - System.out.println("=========================="); + static void resetCountersForTesting() { + successfulRequests.set(0); + throttledRequests.set(0); + failedRequests.set(0); } } diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java new file mode 100644 index 000000000000..b36a017db1fc --- /dev/null +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java @@ -0,0 +1,61 @@ +package com.iluwatar.rate.limiting.pattern; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +/** + * Unit tests for {@link App}. + */ +class AppTest { + + private RateLimiter mockLimiter; + + @BeforeEach + void setUp() { + mockLimiter = mock(RateLimiter.class); + AppTestUtils.resetCounters(); // Ensures counters are clean before every test + } + + @Test + void shouldAllowRequest() { + AppTestUtils.invokeMakeRequest(1, mockLimiter, "s3", "GetObject"); + assertEquals(1, AppTestUtils.getSuccessfulRequests().get(), "Successful count should be 1"); + assertEquals(0, AppTestUtils.getThrottledRequests().get(), "Throttled count should be 0"); + assertEquals(0, AppTestUtils.getFailedRequests().get(), "Failed count should be 0"); + } + + @Test + void shouldHandleThrottlingException() throws Exception { + doThrow(new ThrottlingException("s3", "PutObject", 1000)).when(mockLimiter).check(any(), any()); + AppTestUtils.invokeMakeRequest(2, mockLimiter, "s3", "PutObject"); + assertEquals(0, AppTestUtils.getSuccessfulRequests().get()); + assertEquals(1, AppTestUtils.getThrottledRequests().get()); + assertEquals(0, AppTestUtils.getFailedRequests().get()); + } + + @Test + void shouldHandleServiceUnavailableException() throws Exception { + doThrow(new ServiceUnavailableException("lambda", 500)).when(mockLimiter).check(any(), any()); + AppTestUtils.invokeMakeRequest(3, mockLimiter, "lambda", "Invoke"); + assertEquals(0, AppTestUtils.getSuccessfulRequests().get()); + assertEquals(0, AppTestUtils.getThrottledRequests().get()); + assertEquals(1, AppTestUtils.getFailedRequests().get()); + } + + @Test + void shouldHandleGenericException() throws Exception { + doThrow(new RuntimeException("Unexpected")).when(mockLimiter).check(any(), any()); + AppTestUtils.invokeMakeRequest(4, mockLimiter, "dynamodb", "Query"); + assertEquals(0, AppTestUtils.getSuccessfulRequests().get()); + assertEquals(0, AppTestUtils.getThrottledRequests().get()); + assertEquals(1, AppTestUtils.getFailedRequests().get()); + } + + @Test + void shouldRunMainMethodWithoutException() { + assertDoesNotThrow(() -> App.main(new String[] {})); + } +} diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTestUtils.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTestUtils.java new file mode 100644 index 000000000000..282c3c966ab4 --- /dev/null +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTestUtils.java @@ -0,0 +1,26 @@ +package com.iluwatar.rate.limiting.pattern; + +import java.util.concurrent.atomic.AtomicInteger; + +public class AppTestUtils { + + public static void invokeMakeRequest(int clientId, RateLimiter limiter, String service, String operation) { + App.makeRequest(clientId, limiter, service, operation); + } + + public static void resetCounters() { + App.resetCountersForTesting(); + } + + public static AtomicInteger getSuccessfulRequests() { + return App.successfulRequests; + } + + public static AtomicInteger getThrottledRequests() { + return App.throttledRequests; + } + + public static AtomicInteger getFailedRequests() { + return App.failedRequests; + } +} diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java index 04e32cfc398e..2240c5af4dc5 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java @@ -43,4 +43,19 @@ void shouldExecuteUsingDefaultHelper() throws Exception { RateLimiter limiter = new TokenBucketRateLimiter(5, 5); shouldExecuteWhenUnderLimit(createOperation(limiter)); } + + @Test + void shouldThrowServiceUnavailableOnInterruptedException() { + RateLimiter noOpLimiter = (service, operation) -> {}; // no throttling + + FindCustomerRequest request = new FindCustomerRequest("999", noOpLimiter) { + @Override + public String execute() throws RateLimitException { + Thread.currentThread().interrupt(); // Simulate thread interruption + return super.execute(); // Should throw ServiceUnavailableException + } + }; + + assertThrows(ServiceUnavailableException.class, request::execute); + } } From 3a9de274199767740dfee8f5e8bb6439cbd6d176 Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Sun, 1 Jun 2025 14:27:19 -0500 Subject: [PATCH 09/18] added test coverage for app.java and fixed random to be thread safe #2973 --- .../test/java/com/iluwatar/rate/limiting/pattern/AppTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java index b36a017db1fc..9b43c8daa4d6 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java @@ -45,6 +45,7 @@ void shouldHandleServiceUnavailableException() throws Exception { assertEquals(1, AppTestUtils.getFailedRequests().get()); } + @Test void shouldHandleGenericException() throws Exception { doThrow(new RuntimeException("Unexpected")).when(mockLimiter).check(any(), any()); From 51201953c34a2bebce27367a18793084c79f7e59 Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Sun, 1 Jun 2025 14:27:29 -0500 Subject: [PATCH 10/18] added test coverage for app.java and fixed random to be thread safe #2973 --- .../test/java/com/iluwatar/rate/limiting/pattern/AppTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java index 9b43c8daa4d6..b36a017db1fc 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java @@ -45,7 +45,6 @@ void shouldHandleServiceUnavailableException() throws Exception { assertEquals(1, AppTestUtils.getFailedRequests().get()); } - @Test void shouldHandleGenericException() throws Exception { doThrow(new RuntimeException("Unexpected")).when(mockLimiter).check(any(), any()); From 0889442132e8d833702d71ff0a0c9c82ebda566b Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Sun, 1 Jun 2025 14:30:01 -0500 Subject: [PATCH 11/18] added test coverage for app.java and fixed random to be thread safe #2973 --- .../test/java/com/iluwatar/rate/limiting/pattern/AppTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java index b36a017db1fc..1be796c6ffe2 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java @@ -8,6 +8,7 @@ /** * Unit tests for {@link App}. + * */ class AppTest { From 4e886f8887cce2b97e9cbb77b2257c9ed97ffa02 Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Sun, 1 Jun 2025 14:30:12 -0500 Subject: [PATCH 12/18] added test coverage for app.java and fixed random to be thread safe #2973 --- .../test/java/com/iluwatar/rate/limiting/pattern/AppTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java index 1be796c6ffe2..b36a017db1fc 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java @@ -8,7 +8,6 @@ /** * Unit tests for {@link App}. - * */ class AppTest { From 54d7396f9d21a98b4ed9c53147c5319abb0e38bf Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Sun, 1 Jun 2025 14:32:51 -0500 Subject: [PATCH 13/18] added test coverage for app.java and fixed random to be thread safe #2973 --- .../iluwatar/rate/limiting/pattern/App.java | 18 +++++++++++++----- .../rate/limiting/pattern/AppTest.java | 4 +--- .../rate/limiting/pattern/AppTestUtils.java | 3 ++- .../pattern/FindCustomerRequestTest.java | 15 ++++++++------- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java index e1432839215d..eccf1671a2c9 100644 --- a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java @@ -1,10 +1,10 @@ package com.iluwatar.rate.limiting.pattern; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * The Rate Limiter pattern is a key defensive strategy used to prevent system overload and @@ -99,10 +99,13 @@ private static void shutdownExecutor(ExecutorService service, String name) { } } - static Runnable createClientTask(int clientId, RateLimiter s3Limiter, RateLimiter dynamoDbLimiter, RateLimiter lambdaLimiter) { + static Runnable createClientTask( + int clientId, RateLimiter s3Limiter, RateLimiter dynamoDbLimiter, RateLimiter lambdaLimiter) { return () -> { String[] services = {"s3", "dynamodb", "lambda"}; - String[] operations = {"GetObject", "PutObject", "Query", "Scan", "PutItem", "Invoke", "ListFunctions"}; + String[] operations = { + "GetObject", "PutObject", "Query", "Scan", "PutItem", "Invoke", "ListFunctions" + }; ThreadLocalRandom random = ThreadLocalRandom.current(); while (running.get() && !Thread.currentThread().isInterrupted()) { @@ -132,7 +135,12 @@ static void makeRequest(int clientId, RateLimiter limiter, String service, Strin LOGGER.info("Client {}: {}.{} - ALLOWED", clientId, service, operation); } catch (ThrottlingException e) { throttledRequests.incrementAndGet(); - LOGGER.warn("Client {}: {}.{} - THROTTLED (Retry in {}ms)", clientId, service, operation, e.getRetryAfterMillis()); + LOGGER.warn( + "Client {}: {}.{} - THROTTLED (Retry in {}ms)", + clientId, + service, + operation, + e.getRetryAfterMillis()); } catch (ServiceUnavailableException e) { failedRequests.incrementAndGet(); LOGGER.warn("Client {}: {}.{} - SERVICE UNAVAILABLE", clientId, service, operation); diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java index b36a017db1fc..11815a75de84 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java @@ -6,9 +6,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -/** - * Unit tests for {@link App}. - */ +/** Unit tests for {@link App}. */ class AppTest { private RateLimiter mockLimiter; diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTestUtils.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTestUtils.java index 282c3c966ab4..9d652ec96c63 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTestUtils.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTestUtils.java @@ -4,7 +4,8 @@ public class AppTestUtils { - public static void invokeMakeRequest(int clientId, RateLimiter limiter, String service, String operation) { + public static void invokeMakeRequest( + int clientId, RateLimiter limiter, String service, String operation) { App.makeRequest(clientId, limiter, service, operation); } diff --git a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java index 2240c5af4dc5..d0c3197289cd 100644 --- a/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java +++ b/rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java @@ -48,13 +48,14 @@ void shouldExecuteUsingDefaultHelper() throws Exception { void shouldThrowServiceUnavailableOnInterruptedException() { RateLimiter noOpLimiter = (service, operation) -> {}; // no throttling - FindCustomerRequest request = new FindCustomerRequest("999", noOpLimiter) { - @Override - public String execute() throws RateLimitException { - Thread.currentThread().interrupt(); // Simulate thread interruption - return super.execute(); // Should throw ServiceUnavailableException - } - }; + FindCustomerRequest request = + new FindCustomerRequest("999", noOpLimiter) { + @Override + public String execute() throws RateLimitException { + Thread.currentThread().interrupt(); // Simulate thread interruption + return super.execute(); // Should throw ServiceUnavailableException + } + }; assertThrows(ServiceUnavailableException.class, request::execute); } From b6002a58100f63844c2c24158b09545ee02ad79c Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Sun, 1 Jun 2025 14:52:16 -0500 Subject: [PATCH 14/18] added test coverage for app.java and fixed random to be thread safe #2973 --- .../src/main/java/com/iluwatar/rate/limiting/pattern/App.java | 1 + 1 file changed, 1 insertion(+) diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java index eccf1671a2c9..62288bb69ae9 100644 --- a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java @@ -106,6 +106,7 @@ static Runnable createClientTask( String[] operations = { "GetObject", "PutObject", "Query", "Scan", "PutItem", "Invoke", "ListFunctions" }; + // Safe: ThreadLocalRandom is used per-thread for concurrent simulation ThreadLocalRandom random = ThreadLocalRandom.current(); while (running.get() && !Thread.currentThread().isInterrupted()) { From dfe6753d56a060d3bd8b426f2cb254e8f01252ec Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Sun, 1 Jun 2025 15:02:07 -0500 Subject: [PATCH 15/18] fixed random to be thread safe #2973 --- .../java/com/iluwatar/rate/limiting/pattern/App.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java index 62288bb69ae9..e08b2508b6e3 100644 --- a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java @@ -1,5 +1,6 @@ package com.iluwatar.rate.limiting.pattern; +import java.security.SecureRandom; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -101,13 +102,13 @@ private static void shutdownExecutor(ExecutorService service, String name) { static Runnable createClientTask( int clientId, RateLimiter s3Limiter, RateLimiter dynamoDbLimiter, RateLimiter lambdaLimiter) { + return () -> { String[] services = {"s3", "dynamodb", "lambda"}; String[] operations = { - "GetObject", "PutObject", "Query", "Scan", "PutItem", "Invoke", "ListFunctions" + "GetObject", "PutObject", "Query", "Scan", "PutItem", "Invoke", "ListFunctions" }; - // Safe: ThreadLocalRandom is used per-thread for concurrent simulation - ThreadLocalRandom random = ThreadLocalRandom.current(); + SecureRandom random = new SecureRandom(); // ✅ Safe & compliant for SonarCloud while (running.get() && !Thread.currentThread().isInterrupted()) { try { @@ -138,10 +139,7 @@ static void makeRequest(int clientId, RateLimiter limiter, String service, Strin throttledRequests.incrementAndGet(); LOGGER.warn( "Client {}: {}.{} - THROTTLED (Retry in {}ms)", - clientId, - service, - operation, - e.getRetryAfterMillis()); + clientId, service, operation, e.getRetryAfterMillis()); } catch (ServiceUnavailableException e) { failedRequests.incrementAndGet(); LOGGER.warn("Client {}: {}.{} - SERVICE UNAVAILABLE", clientId, service, operation); From 28e8b4a5e09e2c427005c9be912dbb71168968a2 Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Sun, 1 Jun 2025 15:19:11 -0500 Subject: [PATCH 16/18] fixed random to be thread safe #2973 --- .../main/java/com/iluwatar/rate/limiting/pattern/App.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java index e08b2508b6e3..e76ed5254345 100644 --- a/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java +++ b/rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java @@ -106,7 +106,7 @@ static Runnable createClientTask( return () -> { String[] services = {"s3", "dynamodb", "lambda"}; String[] operations = { - "GetObject", "PutObject", "Query", "Scan", "PutItem", "Invoke", "ListFunctions" + "GetObject", "PutObject", "Query", "Scan", "PutItem", "Invoke", "ListFunctions" }; SecureRandom random = new SecureRandom(); // ✅ Safe & compliant for SonarCloud @@ -139,7 +139,10 @@ static void makeRequest(int clientId, RateLimiter limiter, String service, Strin throttledRequests.incrementAndGet(); LOGGER.warn( "Client {}: {}.{} - THROTTLED (Retry in {}ms)", - clientId, service, operation, e.getRetryAfterMillis()); + clientId, + service, + operation, + e.getRetryAfterMillis()); } catch (ServiceUnavailableException e) { failedRequests.incrementAndGet(); LOGGER.warn("Client {}: {}.{} - SERVICE UNAVAILABLE", clientId, service, operation); From 7fb2cc529f96b1601f8274fe375b798792effa39 Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Thu, 12 Jun 2025 09:54:28 -0500 Subject: [PATCH 17/18] fixed random to be thread safe #2973 --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index e967691baa65..1726830bbfe9 100644 --- a/pom.xml +++ b/pom.xml @@ -244,9 +244,9 @@ version-number virtual-proxy visitor - backpressure - actor-model - rate-limiting-pattern + backpressure + actor-model + rate-limiting-pattern From 931222594b6c853ee776da5d0523d20cbb22ae69 Mon Sep 17 00:00:00 2001 From: Soham Kamble <121136639+skamble2@users.noreply.github.com> Date: Thu, 12 Jun 2025 09:57:42 -0500 Subject: [PATCH 18/18] fixed spacing in pom.xml #2973 --- rate-limiting-pattern/pom.xml | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/rate-limiting-pattern/pom.xml b/rate-limiting-pattern/pom.xml index 672ab73eb7b2..9d5d2624ee8b 100644 --- a/rate-limiting-pattern/pom.xml +++ b/rate-limiting-pattern/pom.xml @@ -36,18 +36,17 @@ test + + org.slf4j + slf4j-api + 2.0.9 + - - org.slf4j - slf4j-api - 2.0.9 - - - ch.qos.logback - logback-classic - 1.4.11 - - + + ch.qos.logback + logback-classic + 1.4.11 + org.assertj