From 1cdb6a7ec0ee825a42ef4fbd9ab0238a75bd8d6b Mon Sep 17 00:00:00 2001 From: Rei Balla Date: Wed, 8 Jan 2025 13:12:55 +0100 Subject: [PATCH] feat(idp-extraction-connector): update connector to work with documents --- ...-extraction-outbound-connector-hybrid.json | 10 +++--- .../idp-extraction-outbound-connector.json | 10 +++--- .../ExtractionConnectorFunction.java | 9 ++--- .../caller/PollingTextractCaller.java | 5 +-- .../model/ExtractionRequestData.java | 13 +++---- .../idp/extraction/utils/AwsS3Util.java | 24 +++++-------- .../extraction/caller/BedrockCallerTest.java | 2 +- .../caller/PollingTextractCallerTest.java | 10 +++--- .../extraction/util/ExtractionTestUtils.java | 33 ++++++++++++++++-- .../src/test/resources/sample-invoice.pdf | Bin 0 -> 46489 bytes 10 files changed, 68 insertions(+), 48 deletions(-) create mode 100644 connectors/idp-extraction/src/test/resources/sample-invoice.pdf diff --git a/connectors/idp-extraction/element-templates/hybrid/hybrid-idp-extraction-outbound-connector-hybrid.json b/connectors/idp-extraction/element-templates/hybrid/hybrid-idp-extraction-outbound-connector-hybrid.json index 59add31cad..ad44180683 100644 --- a/connectors/idp-extraction/element-templates/hybrid/hybrid-idp-extraction-outbound-connector-hybrid.json +++ b/connectors/idp-extraction/element-templates/hybrid/hybrid-idp-extraction-outbound-connector-hybrid.json @@ -57,17 +57,17 @@ }, "type" : "Hidden" }, { - "id" : "input.documentUrl", - "label" : "Document URL", - "description" : "Specify the URL where the document is hosted", + "id" : "input.document", + "label" : "Document", + "description" : "Specify the document", "optional" : false, - "value" : "= input.documentUrl", + "value" : "= input.document", "constraints" : { "notEmpty" : true }, "group" : "input", "binding" : { - "name" : "input.documentUrl", + "name" : "input.document", "type" : "zeebe:input" }, "type" : "Hidden" diff --git a/connectors/idp-extraction/element-templates/idp-extraction-outbound-connector.json b/connectors/idp-extraction/element-templates/idp-extraction-outbound-connector.json index 5e10d1a3ed..b3773bcb18 100644 --- a/connectors/idp-extraction/element-templates/idp-extraction-outbound-connector.json +++ b/connectors/idp-extraction/element-templates/idp-extraction-outbound-connector.json @@ -52,17 +52,17 @@ }, "type" : "Hidden" }, { - "id" : "input.documentUrl", - "label" : "Document URL", - "description" : "Specify the URL where the document is hosted", + "id" : "input.document", + "label" : "Document", + "description" : "Specify the document", "optional" : false, - "value" : "= input.documentUrl", + "value" : "= input.document", "constraints" : { "notEmpty" : true }, "group" : "input", "binding" : { - "name" : "input.documentUrl", + "name" : "input.document", "type" : "zeebe:input" }, "type" : "Hidden" diff --git a/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/ExtractionConnectorFunction.java b/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/ExtractionConnectorFunction.java index 47b0579cdb..8ae477f15c 100644 --- a/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/ExtractionConnectorFunction.java +++ b/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/ExtractionConnectorFunction.java @@ -18,10 +18,7 @@ import io.camunda.connector.idp.extraction.supplier.BedrockRuntimeClientSupplier; import io.camunda.connector.idp.extraction.supplier.S3ClientSupplier; import io.camunda.connector.idp.extraction.supplier.TextractClientSupplier; -import java.net.URI; -import java.net.URL; import org.apache.pdfbox.Loader; -import org.apache.pdfbox.io.IOUtils; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; import org.slf4j.Logger; @@ -97,16 +94,14 @@ public Object execute(OutboundConnectorContext context) { private String extractTextUsingAwsTextract(ExtractionRequest extractionRequest) throws Exception { return pollingTextractCaller.call( - extractionRequest.input().documentUrl(), + extractionRequest.input().document(), extractionRequest.input().s3BucketName(), textractClientSupplier.getTextractClient(extractionRequest), s3ClientSupplier.getAsyncS3Client(extractionRequest)); } private String extractTextUsingApachePdf(ExtractionRequest extractionRequest) throws Exception { - String documentUrl = extractionRequest.input().documentUrl(); - URL url = URI.create(documentUrl).toURL(); - PDDocument document = Loader.loadPDF(IOUtils.toByteArray(url.openStream())); + PDDocument document = Loader.loadPDF(extractionRequest.input().document().asByteArray()); PDFTextStripper pdfStripper = new PDFTextStripper(); return pdfStripper.getText(document); } diff --git a/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/caller/PollingTextractCaller.java b/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/caller/PollingTextractCaller.java index 4d20735f0e..7e7b5e6dc0 100644 --- a/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/caller/PollingTextractCaller.java +++ b/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/caller/PollingTextractCaller.java @@ -11,6 +11,7 @@ import io.camunda.connector.api.error.ConnectorException; import io.camunda.connector.idp.extraction.model.TextractTask; import io.camunda.connector.idp.extraction.utils.AwsS3Util; +import io.camunda.document.Document; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executors; @@ -31,13 +32,13 @@ public class PollingTextractCaller { private static final Logger LOGGER = LoggerFactory.getLogger(PollingTextractCaller.class); public String call( - String documentUrl, + Document document, String bucketName, TextractClient textractClient, S3AsyncClient s3AsyncClient) throws Exception { - S3Object s3Object = AwsS3Util.buildS3ObjectFromUrl(documentUrl, bucketName, s3AsyncClient); + S3Object s3Object = AwsS3Util.buildS3ObjectFromDocument(document, bucketName, s3AsyncClient); LOGGER.debug("Starting polling task for document analysis with document: {}", s3Object.name()); diff --git a/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/model/ExtractionRequestData.java b/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/model/ExtractionRequestData.java index fc207bafb7..09422a523b 100644 --- a/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/model/ExtractionRequestData.java +++ b/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/model/ExtractionRequestData.java @@ -10,6 +10,7 @@ import io.camunda.connector.generator.java.annotation.TemplateProperty; import io.camunda.connector.generator.java.annotation.TemplateProperty.PropertyBinding; import io.camunda.connector.generator.java.annotation.TemplateProperty.PropertyConstraints; +import io.camunda.document.Document; import jakarta.validation.constraints.NotNull; import java.util.List; @@ -27,17 +28,17 @@ public record ExtractionRequestData( @NotNull TextExtractionEngineType extractionEngineType, @TemplateProperty( - id = "documentUrl", - label = "Document URL", + id = "document", + label = "Document", group = "input", type = TemplateProperty.PropertyType.Hidden, - description = "Specify the URL where the document is hosted", - defaultValue = "= input.documentUrl", - binding = @PropertyBinding(name = "documentUrl"), + description = "Specify the document", + defaultValue = "= input.document", + binding = @PropertyBinding(name = "document"), feel = Property.FeelMode.disabled, constraints = @PropertyConstraints(notEmpty = true)) @NotNull - String documentUrl, + Document document, @TemplateProperty( id = "s3BucketName", label = "AWS S3 Bucket name", diff --git a/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/utils/AwsS3Util.java b/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/utils/AwsS3Util.java index 084adb4490..9e3c5dc560 100644 --- a/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/utils/AwsS3Util.java +++ b/connectors/idp-extraction/src/main/java/io/camunda/connector/idp/extraction/utils/AwsS3Util.java @@ -6,11 +6,9 @@ */ package io.camunda.connector.idp.extraction.utils; +import io.camunda.document.Document; import java.io.IOException; import java.io.InputStream; -import java.net.URI; -import java.net.URL; -import java.net.URLConnection; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; @@ -28,22 +26,16 @@ public class AwsS3Util { private static final Logger LOGGER = LoggerFactory.getLogger(AwsS3Util.class); - private static String uploadNewFileFromUrl( - final String documentUrl, final String bucketName, final S3AsyncClient s3AsyncClient) + private static String uploadNewFileFromDocument( + final Document document, final String bucketName, final S3AsyncClient s3AsyncClient) throws IOException { String documentKey = UUID.randomUUID().toString(); LOGGER.debug("Starting document upload to AWS S3 with key {}", documentKey); - URL url = URI.create(documentUrl).toURL(); - URLConnection urlConnection = url.openConnection(); - long contentLength = urlConnection.getContentLength(); + long contentLength = document.asByteArray().length; - if (contentLength == -1) { - throw new IOException("Unable to determine file size for URL: " + documentUrl); - } - - try (InputStream inputStream = urlConnection.getInputStream()) { + try (InputStream inputStream = document.asInputStream()) { PutObjectRequest putObjectRequest = PutObjectRequest.builder().bucket(bucketName).key(documentKey).build(); @@ -82,12 +74,12 @@ public static void deleteS3ObjectFromBucketAsync( response.thenApply(r -> null); } - public static S3Object buildS3ObjectFromUrl( - final String documentUrl, final String bucketName, final S3AsyncClient s3AsyncClient) + public static S3Object buildS3ObjectFromDocument( + final Document document, final String bucketName, final S3AsyncClient s3AsyncClient) throws IOException { return S3Object.builder() .bucket(bucketName) - .name(uploadNewFileFromUrl(documentUrl, bucketName, s3AsyncClient)) + .name(uploadNewFileFromDocument(document, bucketName, s3AsyncClient)) .build(); } diff --git a/connectors/idp-extraction/src/test/java/io/camunda/connector/idp/extraction/caller/BedrockCallerTest.java b/connectors/idp-extraction/src/test/java/io/camunda/connector/idp/extraction/caller/BedrockCallerTest.java index 24a0677e3b..8f17a0095c 100644 --- a/connectors/idp-extraction/src/test/java/io/camunda/connector/idp/extraction/caller/BedrockCallerTest.java +++ b/connectors/idp-extraction/src/test/java/io/camunda/connector/idp/extraction/caller/BedrockCallerTest.java @@ -49,6 +49,6 @@ void executeSuccessfulExtraction() { String bedrockResponse = bedrockCaller.call(extractionRequest, "", bedrockRuntimeClient); - assertEquals(bedrockResponse, expectedResponse); + assertEquals(expectedResponse, bedrockResponse); } } diff --git a/connectors/idp-extraction/src/test/java/io/camunda/connector/idp/extraction/caller/PollingTextractCallerTest.java b/connectors/idp-extraction/src/test/java/io/camunda/connector/idp/extraction/caller/PollingTextractCallerTest.java index 548b09c809..271a9bb01f 100644 --- a/connectors/idp-extraction/src/test/java/io/camunda/connector/idp/extraction/caller/PollingTextractCallerTest.java +++ b/connectors/idp-extraction/src/test/java/io/camunda/connector/idp/extraction/caller/PollingTextractCallerTest.java @@ -15,6 +15,7 @@ import io.camunda.connector.api.error.ConnectorException; import io.camunda.connector.idp.extraction.utils.AwsS3Util; +import io.camunda.document.Document; import java.util.List; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -34,6 +35,7 @@ class PollingTextractCallerTest { S3AsyncClient s3AsyncClient = Mockito.mock(S3AsyncClient.class); S3Object s3Object = Mockito.mock(S3Object.class); MockedStatic awsS3UtilMockedStatic; + Document mockedDocument = Mockito.mock(Document.class); @BeforeEach void beforeEach() { @@ -43,7 +45,7 @@ void beforeEach() { awsS3UtilMockedStatic .when( () -> - AwsS3Util.buildS3ObjectFromUrl(any(), any(String.class), any(S3AsyncClient.class))) + AwsS3Util.buildS3ObjectFromDocument(any(), any(String.class), any(S3AsyncClient.class))) .thenReturn(s3Object); awsS3UtilMockedStatic .when( @@ -85,7 +87,7 @@ void callTextractDocumentAnalysisWithSuccess() throws Exception { String expectedExtractedText = "AAA\nBBB"; String extractedText = new PollingTextractCaller() - .call("test Url", "test-aws-s3-bucket-name", textractClient, s3AsyncClient); + .call(mockedDocument, "test-aws-s3-bucket-name", textractClient, s3AsyncClient); assertThat(extractedText).isEqualTo(expectedExtractedText); } @@ -114,7 +116,7 @@ void callTextractDocumentAnalysisWithEmptyResult() throws Exception { String expectedExtractedText = ""; String extractedText = new PollingTextractCaller() - .call("test Url", "test-aws-s3-bucket-name", textractClient, s3AsyncClient); + .call(mockedDocument, "test-aws-s3-bucket-name", textractClient, s3AsyncClient); assertThat(extractedText).isEqualTo(expectedExtractedText); } @@ -147,7 +149,7 @@ void callTextractDocumentAnalysisWithFailure() { ConnectorException.class, () -> pollingTextractCaller.call( - "test Url", "test-aws-s3-bucket-name", textractClient, s3AsyncClient)); + mockedDocument, "test-aws-s3-bucket-name", textractClient, s3AsyncClient)); assertEquals("Test exception message", exception.getMessage()); } diff --git a/connectors/idp-extraction/src/test/java/io/camunda/connector/idp/extraction/util/ExtractionTestUtils.java b/connectors/idp-extraction/src/test/java/io/camunda/connector/idp/extraction/util/ExtractionTestUtils.java index 942edfbc90..d1d57dca64 100644 --- a/connectors/idp-extraction/src/test/java/io/camunda/connector/idp/extraction/util/ExtractionTestUtils.java +++ b/connectors/idp-extraction/src/test/java/io/camunda/connector/idp/extraction/util/ExtractionTestUtils.java @@ -6,10 +6,19 @@ */ package io.camunda.connector.idp.extraction.util; +import static org.apache.hc.core5.http.ContentType.APPLICATION_PDF; + import io.camunda.connector.idp.extraction.model.ConverseData; import io.camunda.connector.idp.extraction.model.ExtractionRequestData; import io.camunda.connector.idp.extraction.model.TaxonomyItem; import io.camunda.connector.idp.extraction.model.TextExtractionEngineType; +import io.camunda.document.Document; +import io.camunda.document.factory.DocumentFactory; +import io.camunda.document.factory.DocumentFactoryImpl; +import io.camunda.document.store.DocumentCreationRequest; +import io.camunda.document.store.InMemoryDocumentStore; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.util.List; public class ExtractionTestUtils { @@ -21,7 +30,12 @@ public class ExtractionTestUtils { { "input": { "extractionEngineType": "AWS_TEXTRACT", - "documentUrl": "https://some-url-containing-your-document/documemt.pdf", + "document": { + "camunda.document.type": "camunda", + "storeId": "test", + "documentId": "test", + "metadata": {} + }, "s3BucketName": "test-aws-s3-bucket-name", "converseData": { "modelId": "anthropic.claude-3-5-sonnet-20240620-v1:0" @@ -53,10 +67,25 @@ public class ExtractionTestUtils { public static final ExtractionRequestData TEXTRACT_EXTRACTION_REQUEST_DATA = new ExtractionRequestData( TextExtractionEngineType.AWS_TEXTRACT, - "https://some-url-containing-your-document/documemt.pdf", + loadTestFile(), "test-aws-s3-bucket-name", List.of( new TaxonomyItem("sum", "the total amount that was paid for this invoice"), new TaxonomyItem("supplier", "who provided the goods or services")), new ConverseData("anthropic.claude-3-5-sonnet-20240620-v1:0", 512, 0.5f, 0.9f)); + + private static Document loadTestFile() { + DocumentFactory documentFactory = new DocumentFactoryImpl(InMemoryDocumentStore.INSTANCE); + try { + FileInputStream fileInputStream = + new FileInputStream("src/test/resources/sample-invoice.pdf"); + return documentFactory.create( + DocumentCreationRequest.from(fileInputStream) + .contentType(APPLICATION_PDF.getMimeType()) + .fileName("sample-invoice") + .build()); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + } } diff --git a/connectors/idp-extraction/src/test/resources/sample-invoice.pdf b/connectors/idp-extraction/src/test/resources/sample-invoice.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b9ae2d7ff703e2374268fa0a5d89097de10ffecb GIT binary patch literal 46489 zcmcGzbzEFavo0JUNFcboySux)y9F8C2MrM1-95OwySuv+AOsB-oS@&3{l4eyedONz z&&RNSt5b=TQPtVW#l%_72>?*Bw|6FDX8$uTZ{%bxZD(c= zn&YhrFeL(s0R#jX{WPzEJ?QKLr03H@# zXZpvLH>3aX>5ngrqV_I!Ad`%;mZm^mqCZ;tM1R+NGx2XdQ73?rv!%VAn2|GpN{okv ziG`hsnTd;;nT?Z`nU;x(67&yRkG#F<|3yN{$==k(1mHvklKwNP{af?zX5T#dx7j}- zd~+8RKhOf5{}n(L0MOpW3A9{Lgv8yQB~_h4Zh_j8svJZdZ_5X@xQV#mTA-*&*xNaS z1|^t@IRA`Eun;jb{ncV6V*V3IkQB%<6IFn-E+Z(VjA{UPXGUpTkYSO(ZlZtPq~9XM zC~RkE?+l6=^PhC;gO&|2wKNj3ch?2Y%0$Eg>gVKU0riW5EQ7oT68)7|Nhf<32aqR! zR`utBQI%26$;b}q@U}V=4@OZ{Mlpb^r3pYqQUqj3&Bz!C68Wo2{)zyQi0SXadYky) z!IH4FaRxXsO4xvcAqFt9Hw7@t0qo43Er?i{SvcObfX<*a+QP%SXD;gK+OJDse8J3l zWkS^UrTKZW5u%4C?roiyQ>&`GYFB$0u%xbMZ$jRf1oeFPJQbTLg+Ol5q-A58iYCcw z-UUnpPGu7Fewplg_<6s$`ji<~-ECHUV1CkkG$2!jpOE&Q1u#VOmB&oJg}K?-d^Jwys~N}Y#*ezL4E)u=Eae}b ze1bD6h|bzouc^-i7>vaU5#mhCq4emrkiuZg7EPwXj{;3Pt+Rn@vq7CYo6~xAX7!|5 znNI?|ETdNP%Q4r-WdZ2?!RUi52=k>*d5u2=;4-;19Z1yQDPU%m`lm>kOilj&V5ILG z6@k!UMz)EgHIm7T-(wa~OXE%VREsj^EY!$bqQy;}oFI=+kqExVAy=qZ5Kti&7{oas zqp&$CcX>Wn5~FuX-u@Bll3Hs#h85rD^|GD!B{FGFsfTbkrtM*7rDk*6*74b5 zQA|Q!|AC-&SiPp5&fhh9_Qb`=rWT$lR77i!?(jdg4zYqt0%n7Y3ul6Wy*Ld+?DU^F zae%q@8j55;kD0SsFym^|}`lsOKe&RTlZwQ3%6|QaN06iAblO&a6W=UOB@mu&!L?dacC{xV-eiJ(m0Fy?d0J+{BRyvDk!5+Im^tV zI5rt>t$7+)_#aA%>2{*CqOM)p6KZ($L%H;9{3xeN3(5;KmJ+Bj^9@s`y7%h(RC%#X z2;#X%8fg5c2cO62U~x!i_tOa?I9`cnNhk79ozav^$abxxrQrQf>$$S9KjmC=!-l;- z9w2}uh;r7C(brisa(u#+wT8K*(y|o7$d@0)p^1D}jFt40rJYvS1dr#q+g5uLUCUz^ zS`&5&z)ii$P%RjiQpL!vT1d(%p|ZK@q03ms6Qidt9e2kWu86%6Fd2MVd&)LQ^gH>4 zrZ2Ok9Jo05>%_rzuFQ0h-fj+<0~)fUYUH+7=F%TD{K>}Wny8Xd>O18t9V{e8tH1|({R|TP;t$_? zGCm{X>S8KIxO0BpCwbDvjHiNBTKQI96)sCBl5qKPRki4F!=whL`AaR6uSymEcD`B; z^gaK0NbF;a+%Ihg!co>m^WS2tFy!54nhfZ+g~J?sq;3fW-2S^(?iOBt_?`}#)#f}; zAtAC20+eRahMBRn@GnUx`Ipwvp2}l$A)Vg)V4Hbr$E@s#>+|grVXDK(w=V^XK?~B_ zlC5_2UO<_~CO4%Erzrd8U0KbOCzF`AqUbp?0DIb}))#n9+nXnl-Gi1yezGMF?=l87HDjU8Q5KL}LcNJ=*nO>9DPup(594Ua6q*o)V*CzW81a}4F zusf97`>asNTb49gEwz$@9tgI1J5WY-X|WEMTS08Y3=t-`kfHRTTwDAMrez}%GAcO# zyWgtcAql$ngRuCCz=|574a!Pj(H&O$ia)8&iyZk5Is{w@Vxp9!Cx$R|UoeIGwV zs@A}Z9xTAKm3s&s?K3fQYk1)Dq8BXfUTh?P z&Srzk!xLJN%*4bdXzb$iF}lp61@WM3aAfBEoZe=6OU4gLjte4Lig)B}+fxNH1;>t; z8s^~w^&7t)>S-Lh=V;HBkCwYVIoe=995dp49kGoXxhH4VMk2&{IN_B(T~oCd7f1iv z1&p29-HV*N{ovYm3epT=5kNGGqA`t*1mKV1TF`@yPU}{18O%d%HLqVlr%|YZt|BfP zh1N*DEG}bN@UD%7O?FROlVi7_1Qi{iR-#U2eiT?#&_WJL%R$2>bzYu$8JwwdB!=#R z{&^Hy*^-bL*?^%8X$;pYaQk8#3IR0_hk&exRE5H_&4Z$gJJ&$ zCV%kGf8aDm5qU-hdna2X8%7fllKnfHdBbP_PCC3jo16 zMiC<*;E#lesF=98IIW7kvAwfBy$ZnG#m2~qQQQuMfh_IJ88t2KgzbQq|MC2$BL)DP zI9WP4+dC0)fvl=9N?1ApokcB-oQPOiKnVR`ZDtl`kh-a}1qfMl{1N=Szi%D?&ENl= z`495^w$%vmE(_D&A%ksn3x!~{-yOchpIEcRs*E+M@Hli zWTofgW+r+wK*Ykt#{M=p2)Vw62!tmAAgIjoFC6`!gyOB^AItuqaw{tQ&)oij-2c$} zKP8vtAIX*Y&*X~O+nD}8XO{Vmj{R?`<>LO2%yRyr1Aou#AI<;f?f;V6|LWfVFL~u; z`g>kE{~z+o4GQ_c^2)*V-}B1(CpiCD^xv7{zrS^ImUh;RDgYB_T_O$^2396EQ1!4f zFufH9D+3n`5j!U<11G3rL{ve{M)QrGFiH@yF$({i=Lnm;@kS7fQCE?EyQpl9Ks?2s z#~A>027Nh&OzdqPjO;uZK=(Hu_z$x4Un=PDg!Iow@PDcx*8i*^VJAx?8+o<=_pz~I0EdMPHipEx| z&bEvSpz{lszoG`B#vE_W|CNw3aj?9F?ccu|Z-jI`8jl^xTXKi+33`67ojefD2^k4y z_DqJ4h=3x4LVG1Ei~^PVx2J+j3MH*^O2T)@TceF{XKh(LUCti#X`?F^;Mf`P@)q&A z+mY}?C~bTM?msFV5#X^?0vr=A2o(J<3bFVQjYPV`R6!TAJw*bHy+lGh`(~O=gr8hA z5{c@}0i`Mm8b)f6?Kpj+=SneFR7@}(d8!Z`Cf^3|*BEreYWgR5k8XE`E;3ZUry)eI zVlGIClpLt03qHrdSjEA#chA^}5Z9OkxWtAt*vKb=p`yaL3BpLpNMGJ#B5^R=;i{NZDPkNT{*z+L)Y$PbD%vo3CzR^bIOPVD8g}b~EgIth2G5WxnFK_SXu922)h8#35fN7jrh|q_x@28vSzUR>`h*G5CCR5kN zB2kdIF^6#hb4VFruTWrF*TFY)S>C+Sx0;R=+85gZ!WHD|ayG(surQv^R@_yN`g+e7)0-2p*G zuH}O(47NNfS3eRt#^81@WStxg$0`7ey9O;330#VS9s=%Zk1Q7#=^c8iwBNAtCmK>_ zJkxMFn3f3PX_c8sK|LYhen)Ro!}j}76{A$*SW08+7`Pq@UkcWNz~AJk79T>HJh#zf zH(04AJ`-v|Ip1vra6(iNd!&AH&k6WC!BRx6Hw0k7QrhyW_n7)g0jzD^(Cb<~!KTkN~u{&9gPRBpXjVI%W35!41jYS z;+bcrn6YsQUB?A7X)|bHZ3*5(A2Uys03J6f=U+Njo-TJ3ln##E6=D1x9fuG39=-6*a166^KLGA)bhyQc^{tH zp!hc!H1m1LXBOCs6rpQ*@jrG%>Qm*9;aM^G%>FcREoHr|8&4~lVqVaD%@g=#!s$rL z_~ZA4fi{&T2HxPT84L}+4vO^F1e>|ZH&`Di*9}=7xAggo5v>$n>XM=K_K3JzJBoy^ z-?q`;;%d)6qSlW!H!uuan?VAFMW1XWehn^+^0=hKCEEpc-}9aUvUn!ZtxYRrvno_6 zvrYcoi@9^7BeP_)I#kRjD?Tw;gl12|bfxl$7b^gTmnt0`i+>m>mzrdl0N>Q|RE9a~ zxmlJ96=qB4_4Xu&rV16bOY6-vm@wG}rp?|P%HcCKTEcJ!EKSn6bVLW}4bM-oV~*su zGI+O0m84lS#EAm+!5tx0OlCZ0vt)^@%31Wu2GJj3Wp0}AN3g{ns>5Rq+AYuYpj?yd zF4DA#M`5KkmPkfa;tbXWGNhkFAAG{Jyf-cF+&}_WPp#V0{$G+^pT&r1SL?nh3RbQ7 zIR1LoMsDme$$0GZ%i4?mF;P+Bajpp*{-$Mpv=AhZ+?@0Jm2x_# z$t;@R${LS!moyQ2KvvF%WyZ2-Vib%U*?lx;4EE-BG$`%Ulz8exIx9s}QO|>VDwv3e zMc|zEa#iO!mRfbGVOLR3eMx6t^vTWfs7Yv`cW@hs@ zU3?qU4ct+7J>J+L9yRC(Yt`yhLCQFan{_Zgy3r#Jufuq(XjEGciHOF6l@n2L0Y zzQ#AGh5PfYuPQC(M}uFs_<)V`f`tmj;FI3d#cPCk(VRXu)fq-g=X~3n?V2GTT`T7? z84=H?Pgl25anpVW>-`KDoL)cff7yKQU%u~jdp$JsZ1-_F@7+6{9RI!9UXI^!`?IEVov+p7 z=FC^gE;{GuU4utUw@Epo>vHv7$exeZ`w;WPRSG@>P|Rh=J-yq#0L;6gUJtdYF`QksFOrXj~4q>D`6H@ z>PYe@YacA^a@UPw8tDTlDCj8g_{klN?C1PQFqh4CJL?+``_B(E_ZyL9;b0?T10C)8(}75<6;9r`!@@qH!=D||4GvR;%)z?F#kIg1HCZf;QH5# z0?>49Z0!F9nVooja8_MzJmhwZrIT&i!;U?rb*%jev%Yd^V>6y$V}d(9#6mz8gJom$ zeg$g%6VXRxAWUFdZ0-ka9Bgnb7BrTb84l@$hH7tli_5hFpGNuhQylE1ub%cdG|7EPXJG2!B;YcTIgQUWML4mXQ)3vG+8;dx+N7=D&eKeY+Ss0=$1_m)rV=T*SF1RTlG;JMFn4f4+pzG4H5$o78bbv=Ti$GV(vKZ@#On_B?<{ zeWcmm5)S0V8E@iC{iRU9mDf!ag-LQ0<#QK9JdNmcGZn`u@b$j5t=AeJ4LwxE*#FC= zT?#C*&kZKw)=PPtFqWl^ib}x{B|g0*OCo$-ek{&lo(a>j{ZkXEKOhzQ;>!TZ0D(yq z6B(tz(VY@>T5vkvG3xFqgJhe0>|&ggu(mcB3-PY&cr08l!f$3+OJo6g2RWQ$vP_cn zP5JvS&hNZTRXAC>xB1XPOBpjXx1)*|L<-wrF3x}j`8G3L~(v9%3U2!+wXwXisA zNUVwQw`0TC(A3gjN%rWAqffY?F%bsQ@a4(MeqY2IEhl&2IBa1{ikYyGu#v~_@=DeM|8f==RX4ZdUEZu)erb8vQA`R6>t#k z!{PmB{FMq*USX*d$u3Xf-pcuiGxNcsRUzfU5QdB>}2L;Bk`80{;}Tv z*%ST+M{rVQvi&s$?{&O@gp*H{`sI_!Pq$ZQ6rZ8*VDvpUWO$yCtzsmX87S}hLbn-5 zApG7V!M-Qzwv>h->h2wZ8iAgHKzo-c>rDez1{M!y1vbLXiQhvaO!1DJFu_g5%va&v zrDqI^Z_+#OIW1RTu+rDhAJX4Vfn`E#!8vIA6Mv#tcz>z;!S*Z6ghrsV1owndKzH4CE8?H?(uLfFG;wOt(M3qPtJE%wH zi+xd=(9K%Ys9d6s*wr07#^a%Ey2L5f(}qUr=ZF#=K5oDmZ+XFO?34U7M2hDES(RMUKv=`|&W=+Ns&_Yg(N`VzKw? zNuWt6fKgM#qEtkVX0Ustp;4gkiT3KmmI0N3kSCgcvmWTTz3I$Y^(rL9fVfIn6t6Rr~<-Naop!;70@ivSQQ-2nI!D<}n*-}3a=h5nX zV(u9D1i45d&ck8|XLZV^z8Ke}0e{G6;bw3Ro~OUY)1}|9JLK<==lz@Mqo7&BQ6*GJ ziK$qly9*8#1-|yeSVm<5Bo?fmxYD9dc_WW*1=NVuqFG4VpipoyLyu@@{I<9Bx9!pCDD_r`nZK0NA#kSg+;8DBSP;8GtP^~~X;ginvx z%N@m4yKu=jY0x%|G{Z#o-sZ4mH(Ra?RrN58l!b@bc=I2r>Kh&?HD1{AjVzctt@zqT zH7({jYUw~?i~113i!**Ye;^&jR~{H6)#crW3Z60E(;a{{j=5WQ*)*I5t1Mc&h!}P5 zLxocuHWuiH*Fmaj!z-r zfHoUyjsJqNn7$*+=R9i{o&(sZ`gP+}8)IN}lLfvGd-hO5#!RcP@8YP4S;L~lMqK0} zff`*ftgSwr1>;AHCLTT<=x(J|zqg(YFIO9|% z1Qj>+OC&~ctvSVIJN>%-Rl{AD!$?Ar?>N?b;I^{nfq!pK$*ijU5GVmvBC779P~gbr z9)b!H7H4MhvHv)W#T(h9XVHAy_OvF{RG_j_|IixB3Gyg*mhE@P6u5kelyEW;*Dpl+ z-KC%JY@Ip$8*AfUqThvZEP{P0L)N3qx36sMlgLrGp42fawapn7gAp$<_46AD4wsrk zdVovWTs6V6PL$lNM6NOjSXq(9LZ>RP0495;j|9Q7l*22~utCNKdgy(4{6I>FhD?B~ z{eFktPs38mzA~Y#Dj`|&&`_++iVu#$H2|k~Ha<$}AXk%mj#hyNl_AN2nk360u4YC7 z$^vQDsc%Z3+?NlD{x%oVNgRp@QPq+>vL{rXhAHk8TyY1ggd71?1Oiu4i1n;X2Z6UH ziSkoz>``Z6m=vOsMFTU8PF!lId zXB842(UuKj?Lt$xQ=9{*h+O#-@&vvX3_cq7vn5#KE-k2~p5xu^VPEeWn#%gIck97D z>j=ta5#r}U4Ja8Nrcn6tEJ#y4$cCY#@P3vTK?<f?|MjqDfKc6S%fe{Mo&^gg*%7ySyk49)2&qHIuxu=Y=TUn| ziGiBo$`xvjYkf_QQ8xD|>isS@8CI-FM$O+Q*e}tEr7=Z`6s>n-HxSQpl_bemNp#&h z&x#hT6w0c~azMi&s{I@IH)CsM7@=mjf|3IiouBkp2fn@F+^k@dx zpyGeYZt>xYN{vNQAc^?#0($^c0bS8Jy=>BPR(*q9R;YfP<`pk9iq`?m8q-7Rj_s5d zMk9h+a@&<3J%IT>fYuA6K7dxdG(}XG;;AQ6-8;Wb+KkX!P}p_1sIeR+L?5@1VM^&} z>|Xa79}FHj3k3Eq3ExvD1glhI(h~S^>uyihjJJi5Os@h1FXevkV&>(?x2Y3`)bd0u60SkDH z?>QQhub~;)qm!=!ct|1~7Y3?B9EelgtQz6B(TvIoB@2x(LLi#dpcSVS8(ns?h%UHv zuq1XMP{!q&5D^3BR~KN_v6T7NTOL=LoYdNQ&-X_?pg$SJ1KlYIB(n^8>6N)VjcNhDiMwtR1NAn-dU7q-1|L6d0HOU5=A8@ob;N zw59dth{DbxE(2F9vG;~@tkuQR&dyecvYDbWvc9;jby3=`igC}jigR$XQpRrQbNtqR zTf(=Ev0V#0@ym}@w7rw`F>b)D3wt2G1m`lr!TuUXTkBHLv=coXFSl-FM*UEv(`2n( z748xJ`*R!*{|cz#TpYuQW^uDsvi{mS7VYZDsd)Brj!_HKFmW!7n>;~cow#jv zQA#Ct1B|gg+XN!z>^vDt>vfgQ(=Ep1yWf|PdJh^+8SfI`PSwzl}0!+_(ME041L zb6p#A1se9Fg)wA{O8mxOdZmVN-MgH$;Zy+Ix~6}qJUnZuhvUdq>w6Tv{DKk zKd5~Qz!M^JYG$-5o~)JHd-G9b9)2toC>K zegr%BlCzdrt6?1ZwoGUJvEA?JMU=U%!~-ne+Xk&Y&%7|_>{1@4Xdzw+!Z>G&Ddu6O z@k>R8zFR}eI{?pSizg+&6!l{QA46Co$9eYf!51RhW!|q9a+-Xi?|ppmgsmwAyKwCh8}PsR8)iHge+)A`{l$~-f;<6 z$AssipvLRfNl8&92AK9BZAS?sCo&6AhkZWz1rg$4GWY8;Dn&=L zqp9)7?B=y&WvP*}i=s&1NZBMKN2Rxq;-p(sieXr}O;kDIXk3;$hpu@+=c#n&dwowkLv?2z&8|@$9PaA7iJtx1;MA%E&ZTQJYZXmj=eCV*^X58x z5}$#5v6(F6fsCh!oru-z4v&l6E}i7Y;m26@P#;o*XNitk!WWDo^{|P+!1oag$2X&a zxFX)hBsH=t{XU`@LU=*#u+5xowzPCBODiq;4w#0iiKbsCG0Dg=eyOeLFWi!VslO{R z73$=VYs-8PP}S3Etgmx2SGR=p$fSuXWy7I0kufQc94h18lckZiExdPkmj1Y)F~kr? zZhJVl?g_-YjQOh6a!jEhMo4VG%RWSe_ITUZ;+msHkR(k`u`>`{#&GIC6N5niXk;+! z4`?bNEtvi?v-IU!;4t~lLkBF}>fIzxYTnn!c~zCU4-Erm=EFm&as`?>p0uZohb=pJ z9;{dykTT$AqK}H1-16Gm2PuRjdBSeXErRBWC%B&gwF4L*Sr~j9#|PAj=B5!4E+OH= zbA_YRa#)brPP36juj;)^KfUI_tYKwKGt10xuc9w{YNkw26Y#C8*H>5Dyd=#)w#p_r z@mwAR4(-y(PaKbA%cneDJ{ck&Oxg22F+P6rco9TM-`7TX8E8bX)QGHn4LbrkIY2MT7g>KMv!kyn6e7v}*72DVr5L$~@@%57mhp-uAHtA6HwO?Azn>$5s znk*XsCdhr}oyiMRQ)6H z0b_z7cy889HI#zRKY$zo5s_(VXzHr=@tz7i^cfsI_@$|tTmU~@mRr2XX`7~{Gb$| zq?J{$ldLQI?9j;~qy@2th zLKHg`;pA;eNJc!n%fdY;Z1GyyB>hpAKsZq$E4mAQF;SsB2^u+ZLj6vv#h0hHwgl0_O$GJuZRFhe`%>PH&8@X* zZ8^nX9xAMD4>z7>F+JNeb>V)j5gwJC$VQcZQ;Od*#Kcq-7}SMN{N4MrG!BD45STDk za638@8i{~lhLW%C$@PO&1;z$i%1idEL_V`kmu|CK|JhHGp3Z2>7VLn4T zr1-N@5GJDJ%@>w@tl$?XU*jIhT>0Eiq_5oZX;V0_B_WF785RE>q`*?jz6T!W{h{tR zVE*`;irndMU;}q$YZ^bhL=l7MX;|=?>ZzmUZG9){)MntXaFf?7k?o5I(k<)PmYbDJ zGLwD><=f!og_iWQ>oQivMD_D8n{`h+Rphpc-CG&$56yxeWBac8w%a#tXwwW-C@ersaYwt3@@-_`m}O zoXjjP&daMYI4{4nKP@1nDdxO45VvwcRWa%Z`*ATHO*=uR#jLQ zfK5?{KQNEf($6;N=X}f*Eeam?Om30+>>%8~-_h_LW0{bOkE{APcg`hN1sd0s=3S1u%Ye~nkXC4N}Qj1F_Ca?3}& z0UFdds?2H{shv z#n`P_<9;r|>OQ_7q&QwlkwnCMzRYyF?|;UJ9>+ZQayjiyVmzrlt+op31}0`DzHVnpii8=F@YVq(5&DD6lFwkno`~bmE49qANOWgKI+}valG~@;pQ>WGV z=P<+{5I+VWNg-E5^`xH5iRtGjQ0kO2QtnbJel>*{Z9(-^{9165LxyGh4twi8HZF{L z@b4>a zBqqf4pQIdVM)UPtvX1x6Q6h$*%{A@m=xOt-p+CJQIS@0!KF*pZtzw?kJd*1xrc8#i zWAxL3hy78?AT$!$d3HAD{wsaq;~IIN-970DRD6j@rOGI}t4wH3?{LDtginm;^@&x( zPpjAV_2$=>SDnoVa`NNJdpgqY=e?KXEO^Fq>qEuSO*+T^aAkNcpHyl31X}H+lt|;A z%TE4e#xz<&3F8 zErYSIxDE&}ttBL9m_w_C&!OamnMUaStV!^=+B7N1tE~&%G0$jzK5<{XL*Yf>SRy=> zlRn~6+PYTq1gE!l?{hiGTl|d7s>sIYcOPGabH(c8AJ)!E#|!Wqqde;dTkE&G={4I4 z;{Ah*xL5Yiai6giKbDMGY4}2GLmbD3b0uUqZ!%IdOy$%}!@yqVe?YEP`6Q-+E=CAh z+p=3ptam+thOB1so}XL=jUSeODCz9*#n30|^Wm-I>{*YSiYcc# zMZq_`C7jWY8t{&~Wi@#_%!>CRm#J%k**^9=^`cd*_clAZVOtxf0z{i_Ma2WU3ObEldHG{o_Xxu`G+XIC_Zo~DLI+I)9 z*C+h?_m)aHVg$XxkjTo&mX=?X9c3OP(>7fpk110)7>Fs@A0p~5yFFuL)dmEq$kf3!T&W z>Vb;i$|zIzgg<(xg>$e|(&?dOnc2%R2-a`zB{dlN>9ofiH%~+|MssQmqcg>lUOIMT%GZwO{Oh{VkeJsN4ySS&w|7uQ0)9)IS$~k<^|c=yE=T7Y1o~=cg!R&H zaL8Vj2T>_^|AVRL>Gx&N{kx7YElt1*#%5k#x0?XSD>yvwR?`EDgHb`nxYU?vBauWR z)>eEt@Q9Q{Kl-rYuiJcVsdP3UllZXJ$ij8F*dm{syEt$I1R z454SWwznANFiD~7&sZ|}{kVIynV=W@4UPEvE4R)czZ!w#V@F$O&gFO9c7NJiS93aS z`WK*+`CwngS8sx_XG*DwcU`jIutNcUU|<#$GhEQr=R@Boqu_pAo{vR{xor2Mo=5oz zQBqrt{*=|7lx-5Mw>e!s3*;3n{*3*jY`+4X{0d$jf}EZ=%G>L1G-vLc=IIroyW8u| zrT6lQddxk>S%s|LmlnX6qv+^{OFh{<7vz!Y{j%Iw2r9V1c{7T8@a~{E8P7Gk)^D2o z=8`PZ{$dAplmT%irbmINubeQ>7xUIz-{LMu{J3;CbMx9}{li+1I*WDAWtLs*7@zAH z2n%?%kP0Fhv=HVdmzgb_?av;CF%1C*>Xu`x8)D{dn@_l6^11vuXxSs7W)mb`gW0eb z$?KM;#U0|u7w&64RI_IO#Ek9`FxitScZtUHYpnEp`QsP{Va@4Rnwnw(0HIW;VY$1m zy7q+`XNx^Co}1_Nsg;K4$^i)EfJ1-%unux{!}!M;7RxfXox!j(4{;sO!R0G|G_H=R z0wV=?;q*9RDyTJVLO)lO=Aeuxe#Z5 zFV&VMXuC+`Pi26k`aWJ)nk}cdF5wkyFQpH`2RG3t3bUejRBx~9~Wosd( z_xid;g(P&ncD$o8yFF1NuYpOY{jjh_g(pK+igQ#Q&aU#JE`4C=7`(WXsIKUo63IcX zr=V|FrI&=N(8&_1>Pc{_*Ou@2J!xUeKawIL+O88AFAXdeyWl)IPYo^HEIT6FL0s1T zibWr7`K85#B&n^o!h7>6k0J(2$~iy~CZ|iJ_O)3FPUctNNwpQ2zRSVyc2h5LIGi4P z%Dzl82{l95E6ufhQ>WRQAkBI=!w*WT6{cg>fx#WK5#^^T90z;0U7wl_H!|I{4cnR; zOy#B3)Q)i6lYdgb&bV+QsH@|*)iOAL(}ZdwNb zxcpupZ;|rSyWH-Ogu%D!Lhd8TjIWZ+OSXzC0{M3r%50KoiVxnO5PuuhG{dZ*LB5U6 z>FWgy@>2jRkm?jzg8YM`Oy|B7 ziHQ$MwYG3MwYJ3dkaUKo?96!7%h7u%*9Df0$-4-DxPIaFmP9n$WVN2QPYyqIgU8lQG_Bn4wT1X8vWdw_MR)``t&L>sy5&JmJln`B z=`i|CTx4AKb-}#P{d4{==_}F0KV|9SfRjY%L61Ny>J0c}EI9?-%^aDJ;^ToZnp*5m zMc|5b?%TUcN6u2}3VLl{JX}#Qt*(2CAul{`^(bu54d}X``*#!HK|Y6WP+F>T#ytcO zMPD};G$Z79E zcD5(tXgC5_cmZ)jGKR~k%i%!ej}GaN@0`B2xI|M+Rf)Yg$I1!sXr^TaR&OSRNHRwT z_U@7S!Y6@i8GWVl!U?fS{r+IHJwf;+ske;1Wf;|7h3MnEsMmeGA6b4KT+0i=bn#2P z#kNrLJq<#q?D=OuDW(B+IbOeLAud$E&EVkoq9;6}W_MSY8BR46dLMdC)DqET`xcxc z4SQ#o^<|%SWHcBMMz019I{3;NNKFO5wmM{tZ%V#yb8t4-@+c4D4K-A;rEoi%Ki%*Z zMGhcwFF5|xz9mNs1|RM#0iktTh@gb&3PS16#9g(}lUbMknRo*w=9FK1*A4@fR6jfR zmiC>>-{gDLHXbp~q|e%&a0*f~n;Mx(TN(KX>u4(P_%z?`IV$6?zNov{GdkCwN7RM- z3e|IXiq4-r&e{0;QbknMv9-gNF~*Zygk!BdKu>8SGRz`Ag7o!+o724Sb3Jr}{! zf#w=s(i8Z7ps^ILeWzc;YaE_d@^7S=iYhF@tV5S9|My7sCBn6`}*Njf7o7 zW)C}j`VAB6eu6IIZ^WvQwEUldbb5BIMWrM@&lbhI_jxc9<$MME8yvXr!^_k{x?gnh z2lBMb`=@tt{gYRT7}df%&@@==#V_LZYGEY@so&E`a@LONYz0@dU>HqOqyv^0LX1v? z)~31SmQu->7T^lI+Q8A~ZrmmVf zu4Y%_q=sHURN!M9ezxGEF5nYKS*{T#(54uVMqsG6X|D&!-rgg4Bqqf|$)c_4Gk!tI z9~l#%+B6!&Fg1K7V>gdp2_=fL-kcASQ>3{s_mMthzB3!wAA4^)Y+xjE<&L)J$AdI0 z3VDc?9vB8`+4j}&z&hi;YQQlbR)1!6%Q#e56GuT5*1gIV z6Vd)?((w(vepdb;V^5taZ|!nkHpC zczJ4Zu<8xoQh7i}rE;g=VRdV)?2gtkXyR4RkK=_W2DV4L%L~dD`NZiVUP@&5Z9H%j z6MfDu9)1R=9DEnfCX4xe2`vl(}gKdBD4op5rSwn`kw z`0PQS2w9IEk7H1oD3!SQy|DAcht5TTQqU`{moKF#(lir&IEUW>ZO~?fX1xls5n5QG z9tE~TbQ7VQ-A?wcw7fB`o!~fX%#plqK_-60RB4)- zB3nbFbjSP_+p5~OuwIniyYN=$UcLO8IuicLTmzx=6XeUswcfAR8B{%leIz;?6f9!7 z^QTO;!1QoAmFy@=RFuv3lq1SZWj+=qMQm0=R)O8K&d=#CD@w4})`$}udT4!9>F^@J z%1U@|y#bxzQ^d(N6Okqy(d%(yT_ouaQ^13h;B?`|cXDBqy?pxCXLaE-S+_)Z#O5nZ!tJPrmFRc9P5M^5XO_w^;Bx=DYP_L)oM&N8*L_ZlJU`Ml*~*}Gx3oclsHmO1lBxiMH$XpRy-Q6 zL_DRW9wGO4>9J_d4;s{un&;M8_4HZSR`G)vJm(PStD`A&sIP;-!-Jy_VQQPC2Ky`2 z+HoA(Rc@#YdcG!5JTX^!gh-c}2n@R{vCENYJ3;wC?R*qhC@6+F&bYTX?q7q5RoUcJ z>QA&cFP~vAxT$5Rj0$2SY@Qt$0XPssNSWvNL=7dI1{3#@`Yp}3-=ENq<%ywo{4 zhKX%!M_+{T$*^gwm|k>K6>IcbgDyhKXj`0InFwof{FQ&~E;nGsQz(Tufe|)dG@<+!&9&Qr8AB^O!Qj*!S3jfe`u}6>9)o)c8b-m#ww;rl z*tU%m+sTP-+qP|;*tY($ZQJ(ddG6j@`)=)rt?90r>8_rd>6#B+jbEoLZqE#VimryT zmqxdhs(_VN1k^?bPK*x$cvu?P=-L^_4Ntd<>v{Af3ywR1TrmyrZ>&_Tv<))`XuAV#KpDN=QiN{8{Iu6I9(HA+06=unFrvXGVBJ(yvp|c zq%fMuMsm%GS4bP!W@>z9mkkeik9z0~*YXbF%*dnG zP0F@m&e+ApN}-3j);z4aDtWNJ5?3PVh$7Qd?f>SCP0J;Zc=1JSZ@zh$$DIN3v7TgN z;;CaXRm(i1@u;QO+0Q}1q<$nsT20Jm<)m~qUCHx?MRDvb=aFpNv%6(!NV^lCD(1W!)b6R?(eB_DI#ca zXrAw>2^SvNA>S&%=R~31)frgl5C=z3vS!0g#lVMhrYj6R zN?>RUsQ1ia&8o3h$R&znVUKmVBiMHy#j(5KQEd^mvh$V1#PSEZEU2k_P)zpRems>#rpvgqR{yxT^;2O2v@2?qK zr@?%pvN#It?vL8n{c#Qb62DTXF*77zy~@*8*7^~qqaIm!;99}g1L05qyzg1L;^)ky z#kYTb`QY6fVMMDuitEw2jpuRc;j-ZZ0ij9f_ZQe!f$ac7D7=_$DY6uB@4Wq;Ybr zhNXXPYFwUJiMJZBcuBwmxA9r2HRIflZQ-Pj#{}fjk{16vCeZvx=H_(rhRNR zTIuO-bu-PkHi-gDKewd4p@BhSzNA4MKtdcbi+4Q=gIM7`2rZ|8H75Z`M~A*Rt)aOj zLAKH8xzjU?z4cq8GymooM(_~Rr#U^?1M2r{|8DFdd0f$W^edPdo4XS-1qdz9+Arnt zA*7ZriSh2$5O686DNoTt#>5<;nqc=C!*Ax_RZAT$h!!*)541<|Qr*MNA5W87YH8`# zH6Mhs#Sa^#Q_;2&B@LyZWw}%J)C|szm6h!1FSdhIB4c2vzPhJaDrWSrY!2JQyC`)1 zU8i~w6{0Pm#ejYB5<*5d$mCvJn<+2GU8~e>Kc}DDMU`U=tz;bDw?QRTi~qDB8G0f2 zgo@PQdFg*)r0~Rz3LAB*w2l!7oweVUI67h4!{>Cr^RV=~n->aD+_D3Kv;rNCsos4sjBA8I;iW z+lFYU8nxS#(h(kNoGi66l?`>d*(Jyl!PJdzD+^Xja9m}%rS$0!6MZxS4QCxwr@m+SwEo<@Z4-6QxBY;3 zjS;0AsqRiPhd;Z80SE!~1$ zvhh(e6(hBT>@7EMjU}~enrSUN)-sjv91InkCR!TldsyC2BYOP~CHC!oCLcFoY2~pd z>l~VYfoXC6y)YBq+(t|T_i!uQX4@5e?ehlg8&o~vs8e5H&ZR|yO-IwhLaFDx-BS3J zm=)1+*h@>o-75n(OHe&OQ%H72+OGtVTJ{^Wc7!RkCx4#ox82 z-_%B}M}*bWX+A65`su4Q{(e-+9};IneBJfW)^MR@0w~;p?^k`y6lp%UyzNqKCZj2t&N8mn0I`5=o6a~1q4P0 zm^(S1wWco0C@Be}V$@4GB4}|rhU}CbskIjrEay}jJnaT_=MIla=^2ov!()afzE@W} zY2B;JeMrnwINIi(^BrxOEW#Tz^de>Y|`7CWGt$%u9haC~$eC1bHQ{;BIw zvltEoK-c^#GC8JBHZ~1C7Zz6Om`YK}+19{y*dlFn(CIJOJ%W-vyKAZg{|yi0AYT8L zh+0utpql$))MWHHnYwx~&K}!}+0$A+Bfk3WlIb}*Do7{UiR)b6=-e8{rD4(+C=xw??J4P*--h)gBfTI8V z;z*O@bd1<4o;F2{=sOJ6VRIs+*<3h1S+Jz>yo!!{_H<U_>;C!HY3kaGH{RrGTG61>r<%9TW@^*>N*Nm?zhArpxBCTpl zzrKxx(sm_fI+W=yh%6qd#O1)7ooM;DKElgB9@y9?&Abt89uNAj_NPV7oL=+j2y@;` z`2wH>&(`zGx~6FYwlQEU(g^Uv!cs-DC z%{PNzncP)YVQ5qeMJF4D`uAK$BHlPI9jh9?Mt;~SM{Uv3LiVD=ITc|v9WIc;*N7CNRjvu5JGD|?8R z4v)+s8Jq5v5=3=tqd8And%|}5720w);rRxv0dj%-_CYEhPEN>M6gshET}lKS%OKto z`vady?;rTr3^6DGG`{C=^OPMN-OP~MscWWh;UVA zx%7VhN3~PwPQ;{@H+-Vr9KYaqrM^ioYNCeLIj6g2ISrh9SH9Mj+qulrxDpod`*zYL$124W(g z8-q%1JCsxPJl#FTqC2U|X#U*$1jHX-;C=iA3r+w?>gJ#`+mX5 zv;{f02E&M=f4TXtbMF~lcY^CmJ%ZKam_EV`{F*kn59sk4JYuzNxP7JR$GO|?lb<{s zdsl+UT>b^Rb5FbRZENL!#}@GUqQaOylC@~_XTwWZ<=sNg!QuH;bMf`6NMSll1^SlS zk*5ozDoRc}{Zddd`rYPl($n|?oty~4h~jp6Uhb{J|5_Byu@eS!1$ zpRAj&r7*@)qeZwZJMa4WngM7?wMU04BPR2YirH4g>hB(iC@mfuTVB=FJ25FgFF6N$ zPe72p`nV59)VR#s)LikqR{wBT0>Oz;0xCX>&4!1KOwfXDVx-!bJ}v1>s=jtLKNxL* zLhRf24l(9XCAU%qjt(a3JgcS}q_4P+VkRmoZt@gexr}6ZbU9s*Ut}dTe3d&ICgo?# z9^$At#hl^?@()1HjFMmj*R|VIEQs(LjL-r*upIB4zHWYstO#}MAqEMyq zB^C0@y7)*OTXeqXDShdN84GZSH*#2qOWznCGn)2JhXYOrtLR1obHu-fn-nh*Z&eZe zC8uPcciOvAHluD(AK?oVLPC0```ks-|Gh69pN;%PihUuwH)zn1LdyU zxuafHRCJoo5HG+uL3Tc+HzJ>Cc!k`Av5u10#CIq&h=-bIEcyEVJvlyI=P}hqm=WCK z?$q+)_2KY^_Qm~90usS63*LzhAOz!wstT6&YbPk6ZxU)+GWY)F0Ca||gR%K@Xhn7n zX${(%om*gn@D_e1PibevWutQ)`}=%77M&M&I78sSsIag}H?aKQ;hS(iS|g+QKjFImWa?1?Rhxb@%dz4(wR}biveKP;tKT3#wv( zafmUW_&ANFpRC4h6>()V2!35V?})SPT2}V_!+>^dTd`w}W~SD%W8+-=yhp<$TVA%n zdljNqu3OmD)Z91xYF;SCrpe5a^g7%+(Kg#$mj}WAZdCE`t0(DxrO4@Yqpcb%Q z|LnUuqM4lg3BCzPLLO#OpAfQ|()V34XDniCaZ07obJ^XYLVRW-i6y2R1Hv&U&lxO) zlY;yfb09@&-QrNsT9$K~0AyUtxxYqHfh^{i*yi|2p^2>KI!XSB=5rX@UC3n+iv_Ah zLWgB&$@vgQk)846cOdnmj5p@++BHI?agoA{Wnu4Pvka|@;J))Ex&MwGNN-xe#wOy|2pz;5kjLB_^p{Gf22M||0SYdxDxOjK{_gq zf68P2;)T1zhEXe&2fmT|6?NvvFyV$82@KX>1`AaPFMwqY(qD#q3FHIBi})e>D@s?W z2l$JL3;F~7R}@|TvR_ZQdeKSf$?qLK5Q7I=BnX)o=ohfRNFlk!y_xo~H_;cqJcGP$ zus5bRNCmgHH(Fu+%eU}5-@&%P-ym}J-->|W({a`78?NGpKodMkhF2MF8D%pbcNKcEST}lXZHd0?A zEDZ)e2?TvHe`2=Yaei_ZxJkP)ha4XG2eSrW5r0Ev|8427p z0*UF~MCk*)#QiK(hYi3)qU9jr06WD5|K%KD7+}~N3oCF2Rti?rSE>eP3)Dl^3h|-T zSK4a}tsexw4Qn10>_tR~oG<^va$_1a-J2{(G*MzF@q$+n1Q|3v@EF)17{^D#1MyLR z1OM_syUX2cYfegBnM^z)BJRqS50WK{ZXGtTIPesFceL`Iqe%z2FWP%>a< zd}dKtw0U>}7TRUDWwvqLkEoBRcX?PADDFSAV2Eu!fB^x@t+--Cp}2_H3nU;iop7vO z;BRID*E`qolwZK#K+YQjr~rtE_yDe;ykrECOtatOvN+lLR^oBYJho3o)2N0s*5tB< zUIJssg#u@EkE{tw+lu_e;E&9#{(sHD>N5qnXJyM$5|_DT#m+ggH-|@0Tx7+>Il?z4 zn~r+Ffu=~REdRe9m;Yjm|HpCpk0tqE|Kz`J{r^)*`Oh^I=Z|>u0~NCV_o|1R~v z)Bk5#wjZa3jrqrAVP*M=|It(a>SaQ`^eoCI< zT28*{dhQ~x`^}Jvd?d*ujWtO3v%=O77?dq?m8ADqotqxRupegU&Pv@Oug&F!Im(FS zIZeNo9hpqVpScp5EED@R66-D!^ELZ9l6kUwQbwN7<8E?;i}vh^3HD2`?P<~Du8thf zskY-R&#PqPAY`Gh8~yly?R1=%eXzf&k^3>qnw+Z}pZ`Q&^aRLjaxK8SJUyE`bT1(i zDUS(tw3eCPj*Yag&ml4K#mMhW4N))AOEp@?5-USojy}_$HoLl;lFDoMfCIEa(Eo)B zT?1+2g8E@##EeYw_io|8lLP{o6rF~6=onx1SU++Yb{3jq6#&O_d{0a*h@`yyhR3QNgGhqP%gKz$%IXwB9t zZ-=h6?VF{sUH z@Ggha0gvvx+?|N}3itToI{Ybz(iZXusNA>E`k6l?r<^6ZWKKClO39o`ruhGH^SLcG zA&B-lU1IP*(`AZ%og92an{oB&xTOQA{LtjM514@xfc^l91N|$0vq%NFjBQibw+MeB zS(u*3rBsP^2J81055=FgFN9c6w4RT9c?^b>xIL>*Y*TFg(?IGfewELYJ8WH zym^xf92GfmCG+;;$>HCBIdj@;n7vPOtnkIHyBL|M^}h#6f9RFCUTqhqYDHzV3IkQl zxLnb?^+ac^ESm9i!(Ef10luI}C0NMwH*nqDz-WuMt)*-6SnXW%z;$Csw>_mV#Sb}m zvk~NB<)QVRmRVbS)O^2v6Q6&+{cASd8&u_MvY97|HJ<-&``r~MXRtFg<%TM19 zmYEEsoNB+3Uii-gbIJ*nR7GN^x|CPRX6%q}pz036WqQEUJ^(C4HCS1*g-D$oMCI4~MW63_|o z7|PEhUte5*Yzjd9Q5jgtgMQDkg5tti&NVZt{w35v% z>qs-Q*}=cqDCS48_y=A!e_`ZIiguwBBP$n(F5gRm1xrD79yGRQ5?L~6kcg9C@)eS> zk;6KBG{q@t-!-IR;Wt<0kgl9VG1XPxwlPm*mQ^;qdx9evg>W``hD>AJy2q=!Gf2h3 z4HuwV>mX)q*ZOHJvz+!PHxZt&)%6H$`TE*5NpbQ99fV;KKCyUEnB{+pdsA z1UKfMsWe|c%Yn|7UpTxs!&N6E-!TqL^NZ0+jk_^G)vzh1T{o6r#RZk?(n`IY(4;$A>L>O`>+yz8}wc4 zh2lMeL`C(9kg?Jzumx2hc1lnhtJmb`K};l9mpSkpS$>_ScD1$p%_IGT|!eUfsJnM`;I(D_^~+1zoq0 zDOI_wb&+BUxfQ^X`mncwx*rJ8}m&WX1rM>j1_gmVKGFyX`OXLxwiF^2})w zd&*V}OnwophkUIoC-w|uRmnINHT1uDo}ulFAaduq-V7-K{y#i9=niRlzu1Acm*KsH z@V}JcxDvFIOX%bkrR^rOT&d;R)RiIObS}qB2+_iYDD~iPaS*8rwVa#)tII|u*P^_3 zNOW}h{5mJUCy;){%z;9ChNwlki34rpR$x*N1#LtnRD9!+wk9#d1`8{;GH}n?f2^_y zTN$D*|FjoomjE9Nel4M?n+lMI$gJ2+O3-}1@m*Ro0lqGZ%*n-a=0^Tp%BJ?jO#?(6 zSy&Pa$wHttZ3g?n6ii(>9$&`qa<`dA7M)A9x8-GWo z@_8If4FH6SuRNk3G_2#eJtfus>%lQhqe~+d-vmse`y~4t^5U6dF?)UbrC>#aM^48C zJ56S&Sn;du6Fee4-HUDyoyyi4^zRtT;_+xVp_&Lhyp25$CDG?bT8x1OJ!>qYcE3}#>@OM8b(bX}ut%<);kY<=?PN29J?rhG1{@X~HZ%19k z9y`3Wsc>4?X<2Ik}aW$<%(`)o&h0-K_VbmwAl-jRk{u$uEb?Km4 zgjwa5uNo`{p#sNuFqOx0AU2>YK?Exyop45>kUa=W1T&x~itO$Tu0#$<-nlGiR(yT; zFLZTUYd@&ME{dvOXk)=rlz_dYt+M8KmU+aGozx^vp5=ywv!PAN{R|0z0=7t$iY4hX z%QP&APn>}VwCB6>zr*Xc;2qw)*(AERsm-6#HYwN^J-@vxG2Vfw0LE1WjV93RbIbDB zF74!(+3FemG|O`Npw0sQSx}M89h9K!SHX%FX3D#YaLS>MN{S8u<0bdO5aM98b9x)3P@J06--rxv5~%W)+*nY(cO;L z)m6I2#SMlwaw^0mW0;$RdI~H{RdHk})GY+DH>`;UwRUX>`#gS~c(iEK(Dq+d3!ETr^1`^&f2h)6rn7YsQ*|c4wRe!SQ=YWbsZcKpxjc{E)xh7 z5a^JRq-pbR83sQBqyilks=YptH^^aEK-IHJ)vW9LCI2ow+A657svxf%0H5LGL{mX! z;AQA@XmYqp>^ZkUEB;s|FkKy(hx(9Mr5mw|*W!4|&cDDsAnr#M-)9`Nk0qQ-cduD3 zPuy-43(dkA%8Ki;M6LThpfDrAOU344WRaWS6j=Dj&g^8CimZ&lRnz5Ft<~?()29<9eK*o`N)(+UXOB3*GxIwR+zNhQk&);t4+Av zj+>I-jhl$yNYCqhB(Pxia9r~A08aKglytn*A|kKPEM|J6XM29 z$en%o*sjqzRhF~G#mtn3*$OzVVw~6MR81VQtS9c*d<_%fto+66-=)->n$%M>OC`5QE#EJt1r;3)9gc|SVPxBgR3X|ofV~8IE}oYeYMzIln6mj zU3XWM9Vbv9>?MmeY;|-)!FN*0t{g+9151^?#Y!vNIbL2-D95qKf!>i-mftqS6maWv z9^?H!6ICE}+{ZO82_cA4psT2DiEWVnxzywh@PmT@^{%V& z-?_$iLi_q#JSY1=!v)OhTG%p6>4e!G6(dnh_*ai5Do2E0z;pI_mh(XvEe1jOQ>+n^ zH;hi|@j1W2hGqn4TG;QH#)Ci%vG8-|p2!KsjzGvYpB(7k@#WY}yI&{dDhQeBt78V# zZ#BF*AK&lUGmamWw_gGNOeD|@$~tr{aORsR?*ODd?2+NyCU2kb0g7w#N|;Ind?px) z8TQ2}4&}8#fCZi*uV3Cegi!)&4&+ZD&oBr=zu1IZ>~jV4sC4@7{^ua$moi&wI z^Zh!`6lLGk#GmTN^)BsPxUf9!MuAHm{O#l>JVvhMA zSXg)kC`J!2v3Jp^)TYkOq2;rl#E<}rVhS66i* zl6yl)OpPcKK0O(CU*iB0WI>=P)3}L&QGH~INze%Fvpf?bq@aHDk8dj^3Gq452jYqH z)*dLxf6*dl;%aN{C_*Xxh|HElL{JSiO~_tvyE?9i`0Q!#L-lkQzmIZ^V{NHWYD7w= z!pAF6oT^v{=&NwNTz$`1uQh7LOsm70m$A{rho0>&*b&2g`@Y<&%gKDj)-nhYY`NAo zYQIKvHkQ2jirF?fY6LQuo>y*~nJ>#La<(*V*hNVeiKEy$y8G!3XaS?gX#4O&?0!iQ zWZ@nSO$Gf@2C;2*vv7V$E}yGS+1g1<q=(il^yRzQgxjLO^19}5tOhGGc8{=W(^OHVQ$$Ava<2O9{p#HeRnmA?_ z?5rVP>NZ`vn#NU)R|W=23Zw&5_>uiRbXs}RW&nB%IdppKx1F4hE#34526aB4!!fxV z_Qmr{XwggT;4a6|?e!&hoAZs$7H+D+*po|7U;q=UNvsej#TH&kOvI7KO%ZcI^ysMl zSJ&6qR-ZDiKa8-ZgJvA%DpWhvhkWr5Xc2&vK~!GU384%=&`;*E&+DqTk^rBw7j^XK zcCPuk#rJxT?7lZPrR#32_Z0qB~Lg%tj6VI`4*pDeBf-YLu@8T$xGtX%nLiR}C1 zn*+_^0FsqdNwY|k2ySFF+;A;R<>eY7h{XGK55_jJ&Yp3>>kj3So@fUa0I#SUT$K{@ z217_zkQKoZuab73U2?w`!;*QW|Mq?lcaXzoC+pek9r}Ho+Rn-f6gpF&pQ=cZ5~ya8 zZYXAc{7G+%N|&Yi=&%V#P~w%gJnhui@%YmA5wWvv|A`%PaQybZf$4Z;NM$mImmh&} z<&*yM^1Hs{@qJuI$21jfeSZFONR+K`R!mpVyWfPn?yZ^G+S(N1kfoT6{qRtIey&pa z7+1&FB++kxriksmu#%yQZG5`-(WLDVluOunL1vQfw}gYTeprHGK!jav4xmIzNYEZj zu$OWkBKKtUKqfhy5?##M$U`NhZfUUPm~LCE;p8h>gLHkWQrFw1mB#k7T<#j`TSj(z zK-x~?QU9^>AY({FWAh%>a8jjVPTIAK?%#&J!)U$f(=yxE^H)sur(Snw3y35imOX84 z4$Ym|7sV7_KUFf{*B8ve`LTE>*4#KUy}J&@CmCw(uNoGbM&x~Upjyehloj%B0h7)M z)WN2Vdy(IKoJW6iyH#bMNuEw^yQ_$1bG?Kf9k3pbM;Nx9W`NVIJ+g8JhyQl*_0q>Z zh?Oq_>k@dD-eU)DT`9T4pCjAFOZinBoE%}LCKo`me+AOpCY@(*7g|DlU=*~trvbB zj#*9T`x#T8L-=^;HOG0@-f}>I>Cvu)z;g0j!WdC!Tcg`G_LcOP!1t^$R)TgB^UpI!47fWkg>T4< zn`}xO$sJ3aTWwGq!wG-t+r=+yh>_uoo{!#ce!jJhhnd68Y40{#`HyVdueFphXVzP2 z87D*l@9(I!~WTpU0&l5*MyOe@3} zr$K;k-i#J7n=o2$_h6?#)74WH)Ad7aHvg3|I(;o-#5KdET1|qc+y%r30dR?49K&0- zKN7sB&Nllk>>l@(&)wKahbe?ir@i9pbgQY+{s=fXO_6xJM2Qw7iMzet&4{vN5^z?H zS`A@jl87dY`{D^iXx|jL6`1mhMEMQ6J^vNv$oI$E%iJx=ExwC38ok|=rENnv+Go@B zAc7QWH(~27U<5Zf(;J(93bz(@YJC5sSU^_V8Hph4moAnsjuorFvOL%Xt|29oCmFM? zq6}ome!{OMXmA<7Y;sj(^uY(JPVx~hku7+#Qvrt5c%MLw15~>5*OkziO+o@&bDx8O z%@{;NbL8zPy%~Pnt@bsy(@i~8xo%ocIv?-q!hO6aF5No{RlfPz+o+exQe*F_zRpfT zQ@z!-_{Z1Rb8#bt)oq~A-6Y{!{?S-)HyJmtGi0Xf4vJCNHtz*adqUmyR$^Lf(ZZKx zH~$H~+r^t3H4*p4Mu7GTb7*@(^!3&1vj?J1oristG}ssRP1Y!j&|DCc6Uy*NM{1r? zyQUb9wu>RD+rc#%>=E6?OI_>FwC`Boot4ko+msYTLVt-E_DEYCi*gE!{XGmgi2`>u zuS2XUV*bzS0DH@mo6G75@>DAaBi-kgFp81j%%=LG`Cue^H^ zv{@3KjC8c|Hr`i#H=o!h$AhO=R!F@o-~+)XW?-wuUxSU&r@&()5z< zdEDbh;|kOYfdu6E(&a13Nqib@HFc;aknA=3T+Lpo)r2rEAy+;RQgUAmJ`%1Yi2A@1yTM(3&z_t5`$*JKSaN}=6Tllm6(UzHd%iov50M3!vIZ?u zx`q`mAqU?(ozv~Vjw6XDfu)up8|=D^&^(c(6xbo6t`K!&19xjA8}}0T>~9TUxI^S3 zWwMlvZdcsq+~5?Ve5L6UT7bCi&xw@X)I@EpUc|R>ihK+aMjijl>)qjnFaZZt_AKC zqCkbdwWS?apQ`YHLMU};^f}9@yt?}fow|abk3x6Yzcn0oG91uwH1TWob_bn!F701k zqE)lvN5t++R>^9gw75-XMNx(c@pIh#MuS~Q1{;c~7$esqw@iI4V0rEUU!JeSUo;p7 zRh-n~=HTH)0k29LMouQ3_kA%!#~MH84oz#wg6tTQn-MiJ^!W7Y1Uj!1z-(&%3wnA@&AHaThpo1-lA%1QX}H!tm6MI^O&;D7cs9-8Ue`J zTyt=O7=ttey>wyghf8GSMx&>_n|#!q*Znibs+w@w)Lo`5x#m=T%08P4DtW?YP3w4f z?axjc(@yTHA0DpmI!lTMA-t80UlUd-sjJo=;IfhUqopj^C8UOUq2Ft!DZ$g2IP6|! zh12tY|5M8y^4>@^^d*KE;0>JN#;N-2(dstS?xz$+gk>$oCMKZ;8#DB0y44)<72ET5 z?F)uu)xhKKcPTb)WxyF6D*7Qed~@jX9GOtS_ZiB^j%^iC$u~QV0^__NY#-j31Kt2h zA#E5~fy)D$gZ~(?-Z5siWa552?uucF`$}MP*7;jRmJtgD6g1#k+08Fxi@b}ZJj#@k zN1VrGukw=fAU;vWQ&aOvRqfK+W>f1i5|D%?Gxl&=u4(N+@-0^7@BckP~gjc`@{FaP7= z?v0+<^yc4pfOtSKu~r$sb=j0lN|c9(CZ%Pn!bbjlWq7V(Y;`p2FUqkYd>R$IX(Xna0p@#|8B<4s zAGOZ*sbe3Mt867C%+zyp;>PdWphG^=(!7`&8cT=u%T6hE>|5*aZse_wqOjBJJQ7tc z3#j9TeCx)qKy_d^1`LLf_5)#HqLypW(w>L(Z{a^)Ul3fjyA1s&_SMRcjC#xH4bY;y zg(tV53<;N90pw{h&be?0>+m6OPDkT)n&{A zjI|H(Z>T42JF49SB$flcUk}%_BQbdz8!$#lmNM`DIa%y)7%>s2?KiD5my%ni;^)|! ztu*#_HZo0hLL)>hHfhmFHsH9dn;e}!1lQSX2*q6hr%CsUvcUMPu^Ta?;>!pS3%K-6 z^6ix1vXDBOS0eIf=={r8GtVeRrLTH<%>m`t!_eB)b3VE|B;3C|rA>~1O{P?#q@J!e z^Rkoai?}j=eI75xxMS=Pe=-#gs@@#bA$(Qur0Eu%TjgC|Vk9-b&W7Mr3(VR!zD_K7 z^1dCwp{LURmT+AzJck_`HwfumS=o4D zcw0Ii3XOO4-EcGc#qGH>AqJ?N9@X#_;|W{sU&<;g%UTk$uXM|otb*Vlp4s+kV9f)% z!w*}lyi;VNsolE{{`B(TDpx;-%V^3s2EO)j=|%~)K3w| zadH5dL&M7B9OjAA2eQA2ro{j3eI;>kT>1PI`yG}IzCPb?2r(do2weZwbJhT9$>w8n zSGZ?Ah?R2kNJyHg!*;`T+0o_Qu>;^6^`4}@zgJ1Rkkcq&K&4+2Z#ko}V$6V3@Vt7J z7|(41-ljwHtn(hQDSq1S5ImOz%7Q$Dgc`x{F2UGAL`;Gdb;D|SXL;rQ(Suc)INcu= zeWZd&Cqs|JW3v6c1##=}*W1S?nQlWpwc%_xIX(E?x7BF(lslu=MNBqvRC{#4vdqZ) zkG_$hj-JZl(Gkmdpyi%4JeShLgPT8M6ou86x)Sq3T3YQ*j3}ie98o*Xm?QZO520HQ z!V_d;#pmab*Y~@Bvw{|!XwG27JJ7jeK$iS#AcCA7V-mZvIUFC%^k``!qGs}y(rlUX zcH0go=I=A9W-~k8+9JpA^N4B|Qs)?(${Zvy<+s^}zwy*Dn;`Xx(-8_L{2Yu}aD03s zsO{eYu+oD$XaR=a4=w;!SR%6c*Ey zw(OQoqL=P%m%;tgdn*bP2@6U1m@&#~gl)CIjgQyGD=K2Uz1gaKGFdrS+pGAhY+6Y< z+l;Z6+F*-}!OTVT%;g4dSGVcy0NcWQ(Wa&bdlzuK4%shCSvm_?n9J%9(sqZrgs+cl z{rSk9`%+eQL~Uf&l{uR&2TppQIn{8dHs7!=4eRS=Q*#x8lM9=z@Q2)X(>B$76m>dE zv<-T+x+pN~j`uuPE$G8>&DZ_4nftmsE4VZPw|lj7h1l#HA+=q5q_a?!<~QyZmH&FpZ7fA75{Y9RnM^m@ik%QxL zY2*i=sD;38fc;Lnv6QRs_I6a0b@JzgGSlVux_3ofA~;Zl*`Ic)(KBnE^Ut(#M!9Ij z#_-ftfmc3=8B} zh>gal$v$XJXZzk@O)fnR zvioX!E(E5Dj7)9mvGW}QBluBYUU*Kw_3MK9-|-`9`+I)CtFeHmU z{!z^6Co)c;XuvheA)K%Mv3sSqtr=V_wZA9Dvl@ovDi7{lWXXie5Q2U=tJ9 znH|>>Wwksx+}|}lx&C?4{V9Wjt4w3)CgEr$0nBcWjcqDinOk3mS2PCW$mFxtDHl>s zHsKndp4yz-RP9LOnnF`1<7L)C3k?olBm} zE|ZCEaLf;rV)2Ai%%o2e)4w)WciPY>pKw8%ZZDG=ImwNlc(+_Gw%!&J>i`?K-jO~Q z03$qb?x?t~XqdVb#9~XSa9cs5Yj{aGLwUpy$;_xue56Pm0$mQ#zBa(RY3Ks==DMjo zW0Z8VMTF}#1d01}y&;F0n>^yxu^Q4DpT=^eoH0e9~C5i6!jZML_76i0efX9vVqTY+8jnzH|^ zy=xDLYHj<@GE_#$sSLsvnpty1m>d#2L&;9g#u#TajBy$Yi4>xgT@pg+gicPSnoXus zB$cvBNDieOibgqnYqZvGLn_uPl)_pE2u@444_?gwUDaC|u2 zkn*}iYf|e)n;GeXC@D`c_qi|!zh2RwEE32~*9vS!PwD;~js1nPvTE|@XI;g}bbA-3 z{}g94iPNgLOY;~xrq^!bVrh}gX|Z0-=F#o8ZsYgrFD4h1Tko9mdUbTht01qcYpia% zquaxI`R38JhfM`y0?SnTJtFsb)yhy#_0A3dyJj7jht~VSrIuQ!##Q#itqyS$lkMSByJGpLOvd9pSQP_DkS+`4zt}U$zQ4 zn_t^F${qYZx}(BP;=!< zXC-va9akqj3hQsIV2*_7`DaW>Ol|G8ZdxG~;V7L{aH%Qo812)8;-K>lX;tx8&g}h? zW*F77=JH8wt&ZnA1Fd2Q*XPn{73J64P~|btUMCB>UK~%nobwhrh|5f)b+{JCoC~r$ zommB6dM^`6e?9TbSQ&b#mfr87)hv$R&=M6mTzAoc00AEYUk6$7~R4CGZ#*5 z`WR1Z)m2w+)nzCs>&2=(*p#Kzmzs6UD*^MdZLji{I3zV#PxO9StG$g%)KRZr-VF?! z<(7I@Bqkb@HF8vbLK4|8dhJ37Y3cONt#4ebiZ$naUz;6xJ2Bi>BYZ>{Z+VlZbdtv1 zg)X|&nA^_1{F(J=^oB(2)B0YuCe_t_gN;n<6P7YtDL(Hw*^`x}_@^7K+G$44uJJN% zU4#2m>)t%SFl8gS|5D6TpyOS#V1G{3hi9?!Yu4yJ{}6E{>OJ!rc3{ER-o8LByV-gC(z*o|F!Lw2G>V$VZj zb1|%u&B+*8X-^!E%H5Hp_+>*9UCjT)s%?D@4B?v1OIOahTrXbNrCX^r>`x!HtK(<` z_Z~;&WqJ-Absn`{{?pN4i*}yAsvd_l?#%1FeKdg+W;NwP0T_%T{D8XobjI?GTe}`_ zZpHn!4m}gosy8PH>8P?+HG9nE{p0hGS9qSguPssY zaYDDN2tN76)y3XewL-#Z@T{F{UV*17SXa2ubhn(@UQ}d5wB`U|+^dLFeKnawY`Qq2 zV0_xKGphdZRgW7D@3h{zjUG9_e)yT&!T0N4L=v}ujG8+vQ?gR;YSOgFTvl7wPI!aF zDX$lbJM6B%H9vab*HKUJo7bc+!D?r1)jq&ro7zpR2S!waN959HCSQwhO;hfYSk0hm z_xHjZHnqGP3KE|`{QKck48`N8By1%ka`u*p-mzC5#aE6qw@q`7QC9pO_3(`0Wj*~1 zjOmuP!{zDXgG2U3b4VSe7H9sBsE=r+hB0tdXLWxsD}m=lSqlM%1$7Q|gh!l1~dvhUQDX zz#X3UwYv;k4;@ZFr75p>ZL8_>438(<>2GBs4@g~K5_NI^b-Q0*Q zT^g-tI4uq(gkGi7o^j&JBPuCRvy*Ye7Y=L7g5CE-J|6AayQCH~lKpu0zQ!}v1ar@%(wEn{fnd`J0DIxdrFQkAg zu3b8&a=6Ewx?4&4?QiJtnp~z^rDU$OK{;y6k*tBw`<&)(Cp5i6I?~R`Ox0pG38H=p`G+?X6RTeCVPyTq)J-YnEb!j^FE>}yxBlqhr(vd_|bgtSoz4~yzfLAq`x zIPMKEFwAI%?W<^>hz(`N1P<;k(^NjkWsi+K8n5iw#kzDn*y+>o+im6pDjpxburKlf zOpDIdk=lLcUbnlFLM((XnIO|<>O`@>ra0H9cBHLNEvVe^knU^5p09+D+KZPN1gT$-Siz396}vYnYjT!>Q~YIdNyTSnm3ScSvN1_&t$w)<%563=W?-et4^^-0& zre;j38FbL>dLyB|g#tK%UEC-yoydC3n0Z|K8SDH67UM*qYJ&nQ|C@46j=3VM3dNttL06F&s==&t5Yd8pOji@3(uk$b}*E@ zO64x^zv>b^nNfMyh{H;pjATog_^i7uD1^ceD|eFbs0sWL4i{s(Q7h3Izg}U<9@oeQq3on z;v-~w<2d3T+eCKyFJr5E_(-U`8?yiu!c^^^c%sv(BCw4m@R$#>asmEik+?)I4H!-2P6XOA6iR zlb}2H#II~y#vY0huu2n9h$#Fufl#c^rVF8d-^V4OM$Bd;PR|OYA1I=*wIAv9RJ3mF zi5EiMowa92Ju>lH)hC^D%e$u|df8Z7G%zMpCmSv2k)%*3Szskw(5Nb0(C{pQ-m`12 zv|5BEeo#jAV(uBZ*2y(e28S$#g7(Q93BTWd8g-jrOVnqT|J{~mf+0~YbYLsQ+ zrMI^@jO&laL+6DuxlX&AY+Myg)sl4W|TrMk0N-Ora{=GWG=<{rWwdImodoD-Zl zR(7bYr&}vVnOoB@T*GpifREvdC6*|k`negN<6^C!P*!q)-Qr;HMGsI3EyBVLoO1>9 zG@Aumew7!p&*>JK^MIA<&2EKFAaCg3NV*8%QgU!PN)|BA+E+SkO)WoZ{PYtMA9l$@ zS(mQExMX<(4lUXtHfE9+?@HE)>rP%BocQuiX(8pqY!dwQUiimM*So9d)8nn|xa)3a z<^kd+zOv*cXlX^#=vKzs_kliLz%MqYKb1hcDAV!4zRW%!HDatW6a_@ ziAn`KEM87YvmB+ZYn5TAh^_PH2R~}FRt603JZJGr5nK)UAR4v$j7!$DW4qJaVd&p= z?he7ste#2A)SBIG9+(&WZ7sRuU#te?EyVk_8j$ekuI}Kj>p!mN2SfGRZz>%0x zv5*j4#E2z)zl_kB7#&Kc1W}m?Z>nDa%|w0l`Ym-tfRBl~6OM!;g<4Sk1FTsL>Nb|0 zBZU=2G4xR;pZ&?le( zbyJuz!^hXi!P4pvBk;^b-Ji(}H9{hzqN3JCVb;+Zen`O3&=842BhhGmP(wdFhQ=gE z>(jzDzIm{uhEo^;q09g}4Z-tB_NGTLP1My9fA|gk&Mz%|-9p3GQRpE^@B<{U4uj-5 z0*{ThFz7xJ6e`2inD^25r#!dch54iD-$@_?`%wPG6B@w?UO?kR0TX3v2$jYR2V(;Z zv626td$7y@^#22{XmTj%8@1pYR5G$)P{~X>!;wx82BGmu{uEFx$xNy#8imH`qX2!B zfg=DIVF^YUKo^BFLZQAh{iWCbV$fI+$55bC7lw% z>uVcJ(};)wA0q>E13Vgo#_MCy7@R)V0&AsjhPA@zV*o=lOGA_u&d|bq0p^dkJfNV& zh8E5w(nrVp(_P*i?Av_V^so6gl?G0-qrlnpzsPZTdBnGAy=6dnXfQbjoZdJFFoUTG zCL@B%o5h1Z7E}NNFI)Mhy^sX#aG?4kw*|1M2=GIslPdy1U=e6{1k!;{XM!gvgagus z=1WKL(g*O+($yFZ&Xo-C2Id$X2934CTJWYy-_Mjx|7Q)*zg0jmlgdC^1%s1IODcu# zL;aR}VDOmlQ;+C8+!JS~j4)a8o=++kZMHUdRE{+%D4IK*E|F4f$~r4$bBx;J=IhYT zI9~CpJDE7UZsToJ0kx94BVl?+`oihvSCA8P*h2Y;=PB>b+_4*B(?-lCr@W9#kJ7b9?wG3F z7F20aQ{li>HY&S>iQNek(tdQ{u|aa0L0b6G2JLk{#;j0L_aP3ou3@R$Mr8RbrO%;~ zgfQ{yap_N?E0>3=+K($_j)}}hCl5xa{2HBDt#DhQy9a05ONpD(bnlG;*Qxxj+dG{8 zMC>MB)ariG5YjTyRtR#4MKh?rOJOK*eBi;iKVD$ki^t)>sx`cizRAEOnD;`^{*(cD zaKJ5+q0!)|S|r0@!IX8849}~d^P>!HfCW?R#WF*_7#I|ZP08som0A3}$MSTjO_;COzejES_ z0tWzr1AxE*K;Qs*ny)PY1P+LK4gkUD004mloNw^QfWQI4=KwfI;w{0m0`024Y-6@Hqg%=Ku!cdO+|w z0Kw+~I2Yx+9uRyEK=3)hs|LCFy8yxG00f@{5PS|m@Hqg%=Kv03TtVVHk<$qeS#OcIO6W6(=snwlH!t(L;RWtXU>u>X&?A-6E7k%)yR aA$gBNwlPD%GqB4RHyV!tz$Pv<`o91r3!8ob literal 0 HcmV?d00001