From 70c963c38f8366e0c9a25c548a274e99e567d3fe Mon Sep 17 00:00:00 2001 From: Winston Li Date: Wed, 5 Aug 2015 19:41:05 +0100 Subject: [PATCH] Fix issue with pulling 2 new identical binary files with known name --- .../data/model/ResourceFetcher.java | 10 ++- .../WLGitBridgeIntegrationTest.java | 27 ++++++ .../canPullUpdatedBinaryFiles/base/state.json | 50 +++++++++++ .../base/testproj/main.tex | 1 + .../base/testproj/overleaf-white-410-copy.png | Bin 0 -> 8786 bytes .../base/testproj/overleaf-white-410.png | Bin 0 -> 8786 bytes .../base/testproj/test.tex | 1 + .../withUpdatedBinaryFiles/state.json | 80 ++++++++++++++++++ .../withUpdatedBinaryFiles/testproj/main.tex | 1 + .../testproj/overleaf-white-410-copy.png | Bin 0 -> 10402 bytes .../testproj/overleaf-white-410.png | Bin 0 -> 10402 bytes .../withUpdatedBinaryFiles/testproj/test.tex | 1 + 12 files changed, 167 insertions(+), 4 deletions(-) create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/state.json create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/testproj/main.tex create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/testproj/overleaf-white-410-copy.png create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/testproj/overleaf-white-410.png create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/testproj/test.tex create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/state.json create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/testproj/main.tex create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/testproj/overleaf-white-410-copy.png create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/testproj/overleaf-white-410.png create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/testproj/test.tex diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcher.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcher.java index e3f1115651..4bc0c277d9 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcher.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcher.java @@ -38,11 +38,13 @@ public class ResourceFetcher { } else { Util.sout("Found (" + projectName + "): " + url); Util.sout("At (" + projectName + "): " + path); - RawFile rawFile = new RepositoryObjectTreeWalker(repository).getDirectoryContents().getFileTable().get(path); - if (rawFile != null) { + contents = fetchedUrls.get(url); + if (contents == null) { + RawFile rawFile = new RepositoryObjectTreeWalker(repository).getDirectoryContents().getFileTable().get(path); + if (rawFile == null) { + throw new IllegalStateException("file was not in the current commit, or the git tree, yet path was not null"); + } contents = rawFile.getContents(); - } else { - contents = fetchedUrls.get(url); } } return new RepositoryFile(newPath, contents); diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest.java index b47f7fba33..73097658ff 100644 --- a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest.java +++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest.java @@ -63,6 +63,10 @@ public class WLGitBridgeIntegrationTest { put("canCloneDuplicateBinaryFiles", new HashMap() {{ put("state", new SnapshotAPIStateBuilder(getResourceAsStream("/canCloneDuplicateBinaryFiles/state/state.json")).build()); }}); + put("canPullUpdatedBinaryFiles", new HashMap() {{ + put("base", new SnapshotAPIStateBuilder(getResourceAsStream("/canPullUpdatedBinaryFiles/base/state.json")).build()); + put("withUpdatedBinaryFiles", new SnapshotAPIStateBuilder(getResourceAsStream("/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/state.json")).build()); + }}); put("canPullAModifiedNestedFile", new HashMap() {{ put("base", new SnapshotAPIStateBuilder(getResourceAsStream("/canPullAModifiedNestedFile/base/state.json")).build()); put("withModifiedNestedFile", new SnapshotAPIStateBuilder(getResourceAsStream("/canPullAModifiedNestedFile/withModifiedNestedFile/state.json")).build()); @@ -294,6 +298,29 @@ public class WLGitBridgeIntegrationTest { assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canCloneDuplicateBinaryFiles/state/testproj"), testprojDir.toPath())); } + @Test + public void canPullUpdatedBinaryFiles() throws IOException, GitAPIException, InterruptedException { + MockSnapshotServer server = new MockSnapshotServer(4003, getResource("/canPullUpdatedBinaryFiles").toFile()); + server.start(); + server.setState(states.get("canPullUpdatedBinaryFiles").get("base")); + GitBridgeApp wlgb = new GitBridgeApp(new String[] { + makeConfigFile(44003, 4003) + }); + wlgb.run(); + File dir = folder.newFolder(); + Process gitBase = runtime.exec("git clone http://127.0.0.1:44003/testproj.git", null, dir); + int exitCodeBase = gitBase.waitFor(); + File testprojDir = new File(dir, "testproj"); + assertEquals(0, exitCodeBase); + assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullUpdatedBinaryFiles/base/testproj"), testprojDir.toPath())); + server.setState(states.get("canPullUpdatedBinaryFiles").get("withUpdatedBinaryFiles")); + Process gitWithDeletedBinaryFile = runtime.exec("git pull", null, testprojDir); + int exitCodeWithDeletedBinaryFile = gitWithDeletedBinaryFile.waitFor(); + wlgb.stop(); + assertEquals(0, exitCodeWithDeletedBinaryFile); + assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/testproj"), testprojDir.toPath())); + } + @Test public void canPullAModifiedNestedFile() throws IOException, GitAPIException, InterruptedException { MockSnapshotServer server = new MockSnapshotServer(3864, getResource("/canPullAModifiedNestedFile").toFile()); diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/state.json b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/state.json new file mode 100644 index 0000000000..ea08b73617 --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/state.json @@ -0,0 +1,50 @@ +[ + { + "project": "testproj", + "getDoc": { + "versionID": 1, + "createdAt": "2014-11-30T18:40:58.123Z", + "email": "jdleesmiller+1@gmail.com", + "name": "John+1" + }, + "getSavedVers": [ + { + "versionID": 1, + "comment": "added more info on doc GET and error details", + "email": "jdleesmiller+1@gmail.com", + "name": "John+1", + "createdAt": "2014-11-30T18:47:01.456Z" + } + ], + "getForVers": [ + { + "versionID": 1, + "srcs": [ + { + "content": "content\n", + "path": "main.tex" + }, + { + "content": "This text is from another file.", + "path": "test.tex" + } + ], + "atts": [ + { + "url": "http://127.0.0.1:4003/base/testproj/overleaf-white-410.png", + "path": "overleaf-white-410.png" + }, + { + "url": "http://127.0.0.1:4003/base/testproj/overleaf-white-410.png", + "path": "overleaf-white-410-copy.png" + } + ] + } + ], + "push": "success", + "postback": { + "type": "success", + "versionID": 2 + } + } +] \ No newline at end of file diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/testproj/main.tex b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/testproj/main.tex new file mode 100644 index 0000000000..d95f3ad14d --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/testproj/main.tex @@ -0,0 +1 @@ +content diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/testproj/overleaf-white-410-copy.png b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/testproj/overleaf-white-410-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..6a23d10c15d3eb7fcb18609be0bc4bf0706eca49 GIT binary patch literal 8786 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 literal 0 HcmV?d00001 diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/testproj/overleaf-white-410.png b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/testproj/overleaf-white-410.png new file mode 100644 index 0000000000000000000000000000000000000000..6a23d10c15d3eb7fcb18609be0bc4bf0706eca49 GIT binary patch literal 8786 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 literal 0 HcmV?d00001 diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/testproj/test.tex b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/testproj/test.tex new file mode 100644 index 0000000000..046794f19a --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/base/testproj/test.tex @@ -0,0 +1 @@ +This text is from another file. \ No newline at end of file diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/state.json b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/state.json new file mode 100644 index 0000000000..8270c358fe --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/state.json @@ -0,0 +1,80 @@ +[ + { + "project": "testproj", + "getDoc": { + "versionID": 2, + "createdAt": "2014-11-30T18:40:58.123Z", + "email": "jdleesmiller+1@gmail.com", + "name": "John+1" + }, + "getSavedVers": [ + { + "versionID": 2, + "comment": "i deleted the image", + "email": "jdleesmiller+1@gmail.com", + "name": "John+1", + "createdAt": "2014-11-30T18:48:01.123Z" + }, + { + "versionID": 1, + "comment": "added more info on doc GET and error details", + "email": "jdleesmiller+1@gmail.com", + "name": "John+1", + "createdAt": "2014-11-30T18:47:01.456Z" + } + ], + "getForVers": [ + { + "versionID": 2, + "srcs": [ + { + "content": "content\n", + "path": "main.tex" + }, + { + "content": "This text is from another file.", + "path": "test.tex" + } + ], + "atts": [ + { + "url": "http://127.0.0.1:4003/withUpdatedBinaryFiles/testproj/overleaf-white-410.png", + "path": "overleaf-white-410.png" + }, + { + "url": "http://127.0.0.1:4003/withUpdatedBinaryFiles/testproj/overleaf-white-410.png", + "path": "overleaf-white-410-copy.png" + } + ] + }, + { + "versionID": 1, + "srcs": [ + { + "content": "content\n", + "path": "main.tex" + }, + { + "content": "This text is from another file.", + "path": "test.tex" + } + ], + "atts": [ + { + "url": "http://127.0.0.1:4003/base/testproj/overleaf-white-410.png", + "path": "overleaf-white-410.png" + }, + { + "url": "http://127.0.0.1:4003/base/testproj/overleaf-white-410.png", + "path": "overleaf-white-410-copy.png" + } + ] + } + ], + "push": "success", + "postback": { + "type": "success", + "versionID": 2 + } + } +] \ No newline at end of file diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/testproj/main.tex b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/testproj/main.tex new file mode 100644 index 0000000000..d95f3ad14d --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/testproj/main.tex @@ -0,0 +1 @@ +content diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/testproj/overleaf-white-410-copy.png b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canPullUpdatedBinaryFiles/withUpdatedBinaryFiles/testproj/overleaf-white-410-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..74e1fcd990e0bcf170aeddc797d74fbfab0c4e08 GIT binary patch literal 10402 zcmZ{Jby!qg_ckfgAl)U>F?7s;NC_xINXJNnO9y&=1}?ugG6kyhZgrc^j!Vz)ZuwmhSdG zojf_cJ+Xo{7Yki8k~=Duq%{zWoh>&a3LP2vNC6oU$oafhe(>yS?rP2rwd3Y#?FglY-8hDtbJ!Rtk*4gkAof|Ii$2uV`Go5;f}Xl zMX}XgTJ}x1HjQ`A7KbO%r|4+k70YX!E5X!JbZ9Lu7YbSyXe~s!t~uwa-J-y7b4qSi z5;S@IKj^>8*ZEZ3Jdhe5D9)1;g>15P8w zo{kfILl>E7BA3S}&$Gv^K!!2W#YNkkMr7&Ns2nZtaBwa^ z8aQ3fFfqQl!C^Wh77~*Oq}jR1Yh{NVJpi9u8^%e?m>qURio#dQ~){ibMqoom8-=W=u+EHX78czziw z?c}O7xIJ7mUD+Q+P&NBYIqoVnZNjlc*p*9a;1<4y#FC8s9s5Q_iu+U_gtGF&K78+z8#hLENJvt9& zl_j|uR}b*}Mck2dxY9fvTTH$WVTv`Xd5FHJK_9lzW@{lLn7pn-wR1?V6EnpmjUFcJ ziKJN|fPRs%Nbi6!%5ZLJRBFo&2Bh3rMEZsMMKE*`nJJf}g0Q7F!w0-$&CcgON(R+z znTj>T9$0DIA&t@WgEW5)c)7j({q^J*6GIGVuOV(8eCXLl-VDHjnx8pTQ^6)Td`NEX z%RAM(B(rS@9hZt?)+U>Fbz4MjzHI+|Vkw3fsyQ>*YPNzgHW2uq+dkzg#Yr!NNy z4Wj*Md65F zK`hhUIsmRrkewj0zdXsi@O5VE2(ra+g=|DT@H3vByiz>7B~INlQw=n7BIGl!K}Jq0 z?%>{>q(Sd>pZNfX}mL|tKI?S$LTvlQ&Y$dKgt-D=E+!zg_LIJ93ESx-2&s+A<6+7~T03d3h|1_! zsy`HdyrgC08%(rgwII>*e=TmLUmGY=dY7M<|n5RgCp2QMjj|8?=mT{mvj_GH^27o7hd%P2lJ;ew<+)2z}0^^EmQFfkaz z729bR{S5sNdVhLJ`V)G2`sj3wbft8bbR5Y~63VrL#)-z$b&GXzZYQpOtJVu+^QQ{~ z3r%e|!8of4%jHWdtCC3JmZOjq`1m{V#G06z@H1g1x-5Q(;G9|0+a@l5Yk$XE=G*pb zhHEBlee7ebXV|LPPIxcy4d}`Hwc`=q9-W3_-KqaYhoUfhQ12D4kg0(z<-H< zgl~jf@DM`c&+?2dm-`W?7V9v_q4uj6zYN^7Y?Ib;07L-c^2g=)=4Bll9UdKd9mO44 z&*vY%Vt@8HPK7|VEm1WwD3KzOxVp{gL(Kz6Q1!`z*tS@e36OY*p8LJu z8+iSAa}+h)mt2f`^t$G{-?gR+ejzGLN^)Q5lxk;ck?J03NfsTx_@FqdD+)fTrqz83 z;WI(#ILetAfRt{cF2xDCVo73YV~Nwu)BMv$)5r{sDme`~s+6j*D;q1pw(!k|n;Py# z?wuZ??tUJq^``NpLHx1e(W@eXV(@75m%EXtv&^H}BP0M3Kp&vNSwYNIgj?Llu>mR3 zavpq88JVc^U8R6)>{r`y_J**qsW4N;k@d(b_iEv)IG-)wHeWAaCm%asVe&ZQHIG}d zylz>EVo5vVlS5$a$9|Siq(*>g&S|=7=(J;voExm!W zEY)mgT^Sk1((<0w-a=klz%n1R#`MNF4auBh@40)4orU-EevimJkYSg}^7Zf|zEZ!i zyP&veJR3h0IJ_gtrf}hW&8@-lO=90IUQWY%@a*--eD8b~ix`WIysmtP{8sxzGgC9Z zh2{PD{ZFL6q`0KSY&A;Oig8MX$_$ZdUko)+3i3nJxt}cb2lX<7^baN)%PpW&Pzq@C zV#Z?G6G8TO90ZS5pICD=frZqiGGbItRd&@$Urc5QB^Ram2ob6tsc)%MsiIzF%~*Zk znsHj(jh{UevJ{RIT0NE6tIO>9RLA3HUe@y)-{9EbSBcG)$f?e5*EaD~fUFTqJui&C zOT0iln%aeHxw{~kY%Y7ws;Ka25~q*rM~A!niOV*F@MXFEo? z8xe}(0O(qvUtatDo&F;uA;UKYQ^rq>b@i)XG3v{_%7JJGykE0D9m?wRg@dF@VGX5; zH9|G62MU9c3rSBn=!zAJqreO5$P6F7omaD-h9}1t!p1hPDBdhWS!thv-I@L)?lsi- z{x5RlK!Fa^)S{EG3=Otk<#p;syOtm$zg>10uG8VJpQb5UrscK6emW;_OhTTw583yP zyVB-#c64rhY56i_J-!;wx5_s=E?NqyXYpHdD1L3PNM~;(CtVJz@T+1gTvE2NTw5y* zERA$R?WTbEL0~7RX7A?l+_O`@B_oiZj~_!#l~c`c&E}EevZ*)G~Ssa;OuTe|-xVQeBqIoSK z;5Otse2ijN9COnjf1b2D@`Sz1`-o5#T@4;Frw)8>}Du^97+!ic>_RAuWYF!3lQOQ-ME zs#c+qC`xx!$!T8N*CTl@Qa_j4XUnAS)p^;W0RoO3_c49KV_!Y?)FA3OSr)Z3G z*Ay_mVz;vrW4VYF+lNG^cZV+hK876w~j&zQ=n{`g65+?iB(3j^x{$b7XHXnK#E$5m0?Y z*IAMLH>lZY3ICIbo_- z$1l#g`$;CAZrMKq zCULdizZA#uL7oeok<~-M)(+21X>#%Fxjfu0en*;dBv))%A3JO$M1~z z3QU9cUDe9v@8fPq7AAp|sf27j4Zok_+Vk9K-rrCT*xnc}{^5wkuula5+r?%lf13C_xrI!CigUYHVdB52@h0X^~I`NFo41 zpFsj5#{8I&85z=tDrqrCs#-}8+}@x2hZj%RxE6O7uUK2yzc#Zge0^SPupCQGLiK(y z!F^73wpw{J;#l${<)nXI${~b2`NQ+x8Scd*?l(%CVzkquj#VX`vAQ zGU-gkxrNmQp&}nd+0tTD$BiuYr3_RImP)!Dr5xbS;EJQ~h4 z>(4twKNW;vr@OscKhtJCp#iU}pPwoW6dKO~BO5j_`7U7i+j!V`&GZd%tMUD2r|o6% zbZ#Qf1kMY6Lv6}e{HC`}i`PRl7NlJ}+!Ww%nW-R2eI2(qo>lF3LnB8vPMLhbwSeD+ z)>qg+4VR*&JbF(OQ@r@e1W*ufzp8?TS@=0{v|hBk@CgrN-c4^?T?<4B1HLu=nT!C1m0w0rDOADGsOhjJ&e|k z5wgu#M^}{h))4(gL?~Y&2;#;4)Y7!?RQt#&1k$SZP#`zfiv<>6(QRT$+a5KfU|(b0 zr_;y7OT-gC8`R$^X3haEkzg|hmOc;<=2&{UZ+EVAEgt;16|SL3oxf0UkXxAh@v$mN zdu0D(jGow6%F%;AM#KgIgQ3H-`EyE;r?Or111?FLVdcS*VO)_L(vlI^$&;VFgV_UD z@a=(y<>ck~<>IdTt}k4^xIm#EZsAA!M+66y2a*T)hbTOPhhq*sR8bVCkA^5$$U-`v zAg|c@RgxWEPOpY%21f}2zw1wWduKl_?#_RlQ<7tjP}Pjqlg)-2R>*JVp9b@1{HFAC z#00lHaQ$KwUFobI=qCRFUVxwp*=_pLK*So~qh3P6zOIalsd! z2DCP8po#LAhjyKnVgEfS}Z0x>3 zoCplbY;4}ab(|2(c$~N(pFzURU@!?5G`n0ps3H6D`a^eI+Q2WbfxH-WISHtD;P#q% zVp}VL5D8|LZrsYSyRe0pb&EE^{8ZCE0$nuwke6MiZE<;3wb)MLrMTj;DJ@s?JO^bD zXRtim0Bv-%W@*f6Y9jawnC3Fj_n%+%a`-*nT1s*!$snF}^r5-bdO#pg-cFqdvS3Q0 z)Fv|s@(nczs*6;N&WDd?dIa+&XLOq)bC3tY!U@qhv7Qf!aZn7u-DO0Zuy5Z6Imp%U zeScQ@4Dt>~u{0_<(kdccrB)@)QD^!I7n0*;GD|ncq?LCf20XViG3fgz)tEOyhKNg( zSd?MR)cwPfAGkhNmpc!%mC`%Kp45H8Tzx^wn7oFdbl`O)c4Yd#=HlWBTsR(3oD%Ip z%!LFf4-Zh8`n;E7LZ55D6+yQPnhR-^XAIqVH?EMF_o&d>JjUF9@gv!rq?n{GZS4`s zwUyb(pn^buyU;Q5Vv76H9?$_ygI?M1wK-}vZfYR9cwxj0t*{1Ru zF@=K!pEdFO?PZRnfv-F)0nS_wiuS^{`cE-<*MFxxm}+@&9;l#!HW2uBpP=vQar|RT zybF2Q(2YNt559#Nbb>zao!UH+$YNgv(W5YW#a)(SYU~%xt5~a&$=LM_MiG877F|0n zI!jH9qx%Nu99X2!Fw6p#BA$G-j^G3XUl=oMKF6%2t@Lnbb?4Z?-arX<3snLP?>j+$ z{6#mYPmVW+x4(p3?2!>!y#NlrGLsE=3f?%-6CW&9#>GT82fGyudeoZAr~WLhjg@sf z_t+c@nvSKOSo;A=SMWZfGB_roBzng5f?rXg$GA?xO11xKqbgY$1p<__ReILZGPNI9 z9;6cf@rQRsevwXbY|f5-Jpm4GSJyycX|B^5=&Q5=kdE{8x2!Mx$_U#$*yq_{+gpXN zN>HVCzzB2+S5oD$C$BJk81Yuvx}mor&BO9;H~qY!)))0`yLC#QU-==@F+Xy}P&u-z zle->l3iQ}?AD#4DV}G+d7B-%+^@)G4Hp=d+qr1ZcJ}Rf$>Y>WH^_X?ajg6g?rYhI^ zO31F$9BBNC>460!KS({``=Q9nBx;RR;CJI8wfA|aZRK0~Ou+ynLCN#X<5m~$%cV%L zNfspF;?~21_C=ZRozRibX{T`yeBS%w0+~hFj6qpT`GXQfl@g%Gi_164&%;-P=q^h) zUD5A1iVmo34!*uz!pt4TLA&zt@X#ek^Cd<5iKC|%pob{s&w3UetB2+u=5$?Caa&@B zHNW0RyO}~ib+UJ-e~XVIXub@q3k$t}doXJEO5a`op#N+tjzyF-0eZE`Y$z@<(*xvm__+T_yt*I z@R*sIfv%R;Qd$a1|4zTZ1F_n=ySqpU2zYvW@_P#NJGc@i(>r0DP|;+sr>kFW3b&axGDNg%~H4BZyIZKa^KwY8Cv znz`GP;}leYOvdfi$VUC%E%ee#e94=H=k;GGlU`6bDyv!2?_w@xq@C&3>vE)Pw3Vag z4~ITF&o>@y#-{7F@R2jwrUvI*cd45n#Y4asWf;xpXN-+nG&X-&Bw{d#?{3H81tZ$9 z-v(4qk=n>?z*9cZK#bjo!3R_18TU zK8HSJT`m)>v*B{0E8lxLm+4?%2gkMZ$GQzrISzTGc-L(MbFPqWytck_STNfdcD9Xm zEAv9?LJ``)#gZWji*9(Q=7?c$%EAN;H)WI`*-c1)LAt~Uy{wEdQ@rE5{1EPMtyvs> zLtQ{jU{RT-O*BguJz)rx&`{%FF)K-7k{F8*mvIC)q;V`M$KZpyQPd7GZj{U9Sx8ah zYtd*o+pMUvP{$SSChD>Q9jM-Uw^{%>>W8f)@zSORs_GYbOC!%8nS`XtGuf$Dk4(Y=xblcC zS`f*MZwb^ix4;8BcooOqR70W`YQHJ!GT)A>FxZs7_#>O0#MpESMv0Ph5^i5g zc;ot!SyBHc4O`r8q7~Dk7v(t(mBlv@&yw?K^?uq?W^#o>7PKmAp-D=Q0*A?d$rOf| z<*7N;gYJ+4(ndfo#=cJ)tIFeKb~uT*40RW20kCW0TWgA=0I1T0xzTb4_n;qhz|!J$pgO`M-71vH*H|C zq~PDSS+^HQYU^vwS+}S1FZz#)L+o&nw)EjWx)i8yYUP~N2hb$S$;lGuYWn7t z;251cYUSBRJ(PDbO|jutk0ASypr)Apv}%-FE~Mzm@W}II{Aup zwiM(%=Q-Fha`>slb01F+S)o}G-g8-HULmtp0GLK@<5PebsKuX?k;+BKK~5N3DIICaZ`!1*jn1} zfQ~`ulbu2i6eFKU?TJIp7@{G&BD`KV#)~t8&H^-}^O90Irr0OdfWiKCkLD;(brqAO zfK4vDb0;aF<5WKrfuq)E+pGz^I-WAPrT|mGkI=(CcFu6Ui<@Fb9)YEc?|2ypu#1KD zuA_#g-ar<3Zljc!XgJLEX$0K5?fJePS4bU_%13({_YJX@T~jn|76Z#EWe)Z2w;<7a z{$_h64QbMyJqi6NhzNq zB75o^6+dX7>BO4569a9`_zp=io2$snu1Z$5x8@c*1=ae6w7OP#27M?I#`cL-9()65 zsdS@-ZF&c1Uq7NOv2!tQZ{bmuH{$`(($AP#Qv__dp^*CHSkPhmwQo&8^61gm#cA*| z(S0eV*9?k2Tl6QLoU=&3cwz0j11@xY^4)rR{mmFWKQJJ!GwZC~E0X6w)n7jdL9vhB zSk<=r-$MQj9WuzH;1>C}J^TSotY9OUEQ8VZEqKYk;3SRq$CyaBSDpAI$M8hk#h(4! z0En^qWgb_<%bV1L@K>HQ@lTADz|vN>$W8|S^oQ5jKIFBv*(VITD16^g)M88!)m02+ zsbhpY6TqnD7Qsb)6Tu#4ysQB^qd=8Nz=m8I2Qm!IKUxqj9eZ^0cKI0nZA25{822(T ztzE+ZaS2_qfgk$4 zBG{??^gDens>Wb{xoQ!AxF9V6jMF@U<-BvRUtS9xzHkVXITJC~hcNE^fGlc?${13< zX!skQpd}ucw{lAo4ZKCsPQ`4f&F~9h{!IJg3!dMw6T~WX=I=`5a#|(}YENbv1*AX^ z4x@(XPZ7o)1BVrvliO1Q#Y5M+S4Gaw^tGlAC>rk4Ohb#moAKHRd*HWRSG42CEF`pS zaa7YqllNrUaAn*tOispp-fe>&DPaLEr6j)irF+gDXV`x)WYV8?RbM>9*!@=ye*d-Y zRNR6j9P}9)a5W%M?p};hoR$(QC(VQI+C}O>&idM|4|qG%bmOS2D4L@3s(Y>OZ*O%< zqbdf*{?6YmYe8cB!4u;A&DN#Ijj~oU8}|+x7c>8Cau7VXg`a;N775xC%0N~qg~Luw zh0E;!x}OaWsvwR$`9S?YM+*l;pujqULag~eQlh{+4>n~YrT$ECJmg5}oL0Xqb0Cu$dyYk;gjT=QS?(*2$j2xMO7 z!*nJ+EujAC&QVc!aC|}OjVeIVAlkA8ePhF(p2$PHr!Sw%N!AKb` zvE3s~%YlP94E*`?Z>TOQY)uE%M7&tWsLW1^8%=3@vlc`j@LuPOwt-7BgZxA&*KGT< zJ=m^$X|Ae#`=O|&UqVU?PHcTOmtD-jCXt%DCe+_ji%P$jSNENSH%cZ zirOB;gB|Y$`*oE5)b!t4pdJKwEp*e`#KI|<6dEe8#v*H2p?!~`4^=v=W^M$ z7-5eV?+cDYYeUO&{TeFSPomK~R;C#i{pnu~v5mAn86l_jkT&!& zL)@m`wR-8h2?cPFH%WV@WG9a=7`U{)qGvp#Y2M&Bp=AnP70G>~Q+nWqD^ zNRTz3$5bo!+Wvsklya|wX|DTfbrh}@U^|p1`;9(C_H&-s7{q>3{F9o^IM80`r+0)N zf!nt}VM@PFJBv)2iw!aek}b|Zlw*$ICu1*?+5yFy=~nS&#Xj!-oCiS$SvZf`@(w@_ z;@MU|RCt!r&x|C7$Xsu^xn1Q@uh&DY`Xmxt?EtM5mrBqJ}00990#!zpR!dgua_rK$y^qh zEJo6+ox@h(LTio3Pza9;KK5G=Ih4fym;i6yb>2A*t#NyhxA&w;`-qXW8q?u^+xCug z`kxGVU558LYte~t+UMZD5|%9Dyv2eX2+BkkFBUFtGwpE7jKMG0J)<)#d`eb^euxIN z4qj@;PQnA^s1Z!95aBhgEX`fbYpsB_`^~L=mA%Cv0(qxVdbNI}s0#QoetM41VY&o@ zHAyJMP1r{^hmO;Gi*#1htRnVDuXTLi7l>*n7oSs157V9?M1A;O${)ZE_1tu!zg$oH zAO|kV-EzD3j-yl!Y3=^~T12kHhYqAkCz>(4!X*~>31nQ>l5^{Y9yj1fqWm^?{mS4oHeox4F47< zv_@Ka9P@{ddmjH%i%j`HIWl8%-{Cz2uo(aOF?7s;NC_xINXJNnO9y&=1}?ugG6kyhZgrc^j!Vz)ZuwmhSdG zojf_cJ+Xo{7Yki8k~=Duq%{zWoh>&a3LP2vNC6oU$oafhe(>yS?rP2rwd3Y#?FglY-8hDtbJ!Rtk*4gkAof|Ii$2uV`Go5;f}Xl zMX}XgTJ}x1HjQ`A7KbO%r|4+k70YX!E5X!JbZ9Lu7YbSyXe~s!t~uwa-J-y7b4qSi z5;S@IKj^>8*ZEZ3Jdhe5D9)1;g>15P8w zo{kfILl>E7BA3S}&$Gv^K!!2W#YNkkMr7&Ns2nZtaBwa^ z8aQ3fFfqQl!C^Wh77~*Oq}jR1Yh{NVJpi9u8^%e?m>qURio#dQ~){ibMqoom8-=W=u+EHX78czziw z?c}O7xIJ7mUD+Q+P&NBYIqoVnZNjlc*p*9a;1<4y#FC8s9s5Q_iu+U_gtGF&K78+z8#hLENJvt9& zl_j|uR}b*}Mck2dxY9fvTTH$WVTv`Xd5FHJK_9lzW@{lLn7pn-wR1?V6EnpmjUFcJ ziKJN|fPRs%Nbi6!%5ZLJRBFo&2Bh3rMEZsMMKE*`nJJf}g0Q7F!w0-$&CcgON(R+z znTj>T9$0DIA&t@WgEW5)c)7j({q^J*6GIGVuOV(8eCXLl-VDHjnx8pTQ^6)Td`NEX z%RAM(B(rS@9hZt?)+U>Fbz4MjzHI+|Vkw3fsyQ>*YPNzgHW2uq+dkzg#Yr!NNy z4Wj*Md65F zK`hhUIsmRrkewj0zdXsi@O5VE2(ra+g=|DT@H3vByiz>7B~INlQw=n7BIGl!K}Jq0 z?%>{>q(Sd>pZNfX}mL|tKI?S$LTvlQ&Y$dKgt-D=E+!zg_LIJ93ESx-2&s+A<6+7~T03d3h|1_! zsy`HdyrgC08%(rgwII>*e=TmLUmGY=dY7M<|n5RgCp2QMjj|8?=mT{mvj_GH^27o7hd%P2lJ;ew<+)2z}0^^EmQFfkaz z729bR{S5sNdVhLJ`V)G2`sj3wbft8bbR5Y~63VrL#)-z$b&GXzZYQpOtJVu+^QQ{~ z3r%e|!8of4%jHWdtCC3JmZOjq`1m{V#G06z@H1g1x-5Q(;G9|0+a@l5Yk$XE=G*pb zhHEBlee7ebXV|LPPIxcy4d}`Hwc`=q9-W3_-KqaYhoUfhQ12D4kg0(z<-H< zgl~jf@DM`c&+?2dm-`W?7V9v_q4uj6zYN^7Y?Ib;07L-c^2g=)=4Bll9UdKd9mO44 z&*vY%Vt@8HPK7|VEm1WwD3KzOxVp{gL(Kz6Q1!`z*tS@e36OY*p8LJu z8+iSAa}+h)mt2f`^t$G{-?gR+ejzGLN^)Q5lxk;ck?J03NfsTx_@FqdD+)fTrqz83 z;WI(#ILetAfRt{cF2xDCVo73YV~Nwu)BMv$)5r{sDme`~s+6j*D;q1pw(!k|n;Py# z?wuZ??tUJq^``NpLHx1e(W@eXV(@75m%EXtv&^H}BP0M3Kp&vNSwYNIgj?Llu>mR3 zavpq88JVc^U8R6)>{r`y_J**qsW4N;k@d(b_iEv)IG-)wHeWAaCm%asVe&ZQHIG}d zylz>EVo5vVlS5$a$9|Siq(*>g&S|=7=(J;voExm!W zEY)mgT^Sk1((<0w-a=klz%n1R#`MNF4auBh@40)4orU-EevimJkYSg}^7Zf|zEZ!i zyP&veJR3h0IJ_gtrf}hW&8@-lO=90IUQWY%@a*--eD8b~ix`WIysmtP{8sxzGgC9Z zh2{PD{ZFL6q`0KSY&A;Oig8MX$_$ZdUko)+3i3nJxt}cb2lX<7^baN)%PpW&Pzq@C zV#Z?G6G8TO90ZS5pICD=frZqiGGbItRd&@$Urc5QB^Ram2ob6tsc)%MsiIzF%~*Zk znsHj(jh{UevJ{RIT0NE6tIO>9RLA3HUe@y)-{9EbSBcG)$f?e5*EaD~fUFTqJui&C zOT0iln%aeHxw{~kY%Y7ws;Ka25~q*rM~A!niOV*F@MXFEo? z8xe}(0O(qvUtatDo&F;uA;UKYQ^rq>b@i)XG3v{_%7JJGykE0D9m?wRg@dF@VGX5; zH9|G62MU9c3rSBn=!zAJqreO5$P6F7omaD-h9}1t!p1hPDBdhWS!thv-I@L)?lsi- z{x5RlK!Fa^)S{EG3=Otk<#p;syOtm$zg>10uG8VJpQb5UrscK6emW;_OhTTw583yP zyVB-#c64rhY56i_J-!;wx5_s=E?NqyXYpHdD1L3PNM~;(CtVJz@T+1gTvE2NTw5y* zERA$R?WTbEL0~7RX7A?l+_O`@B_oiZj~_!#l~c`c&E}EevZ*)G~Ssa;OuTe|-xVQeBqIoSK z;5Otse2ijN9COnjf1b2D@`Sz1`-o5#T@4;Frw)8>}Du^97+!ic>_RAuWYF!3lQOQ-ME zs#c+qC`xx!$!T8N*CTl@Qa_j4XUnAS)p^;W0RoO3_c49KV_!Y?)FA3OSr)Z3G z*Ay_mVz;vrW4VYF+lNG^cZV+hK876w~j&zQ=n{`g65+?iB(3j^x{$b7XHXnK#E$5m0?Y z*IAMLH>lZY3ICIbo_- z$1l#g`$;CAZrMKq zCULdizZA#uL7oeok<~-M)(+21X>#%Fxjfu0en*;dBv))%A3JO$M1~z z3QU9cUDe9v@8fPq7AAp|sf27j4Zok_+Vk9K-rrCT*xnc}{^5wkuula5+r?%lf13C_xrI!CigUYHVdB52@h0X^~I`NFo41 zpFsj5#{8I&85z=tDrqrCs#-}8+}@x2hZj%RxE6O7uUK2yzc#Zge0^SPupCQGLiK(y z!F^73wpw{J;#l${<)nXI${~b2`NQ+x8Scd*?l(%CVzkquj#VX`vAQ zGU-gkxrNmQp&}nd+0tTD$BiuYr3_RImP)!Dr5xbS;EJQ~h4 z>(4twKNW;vr@OscKhtJCp#iU}pPwoW6dKO~BO5j_`7U7i+j!V`&GZd%tMUD2r|o6% zbZ#Qf1kMY6Lv6}e{HC`}i`PRl7NlJ}+!Ww%nW-R2eI2(qo>lF3LnB8vPMLhbwSeD+ z)>qg+4VR*&JbF(OQ@r@e1W*ufzp8?TS@=0{v|hBk@CgrN-c4^?T?<4B1HLu=nT!C1m0w0rDOADGsOhjJ&e|k z5wgu#M^}{h))4(gL?~Y&2;#;4)Y7!?RQt#&1k$SZP#`zfiv<>6(QRT$+a5KfU|(b0 zr_;y7OT-gC8`R$^X3haEkzg|hmOc;<=2&{UZ+EVAEgt;16|SL3oxf0UkXxAh@v$mN zdu0D(jGow6%F%;AM#KgIgQ3H-`EyE;r?Or111?FLVdcS*VO)_L(vlI^$&;VFgV_UD z@a=(y<>ck~<>IdTt}k4^xIm#EZsAA!M+66y2a*T)hbTOPhhq*sR8bVCkA^5$$U-`v zAg|c@RgxWEPOpY%21f}2zw1wWduKl_?#_RlQ<7tjP}Pjqlg)-2R>*JVp9b@1{HFAC z#00lHaQ$KwUFobI=qCRFUVxwp*=_pLK*So~qh3P6zOIalsd! z2DCP8po#LAhjyKnVgEfS}Z0x>3 zoCplbY;4}ab(|2(c$~N(pFzURU@!?5G`n0ps3H6D`a^eI+Q2WbfxH-WISHtD;P#q% zVp}VL5D8|LZrsYSyRe0pb&EE^{8ZCE0$nuwke6MiZE<;3wb)MLrMTj;DJ@s?JO^bD zXRtim0Bv-%W@*f6Y9jawnC3Fj_n%+%a`-*nT1s*!$snF}^r5-bdO#pg-cFqdvS3Q0 z)Fv|s@(nczs*6;N&WDd?dIa+&XLOq)bC3tY!U@qhv7Qf!aZn7u-DO0Zuy5Z6Imp%U zeScQ@4Dt>~u{0_<(kdccrB)@)QD^!I7n0*;GD|ncq?LCf20XViG3fgz)tEOyhKNg( zSd?MR)cwPfAGkhNmpc!%mC`%Kp45H8Tzx^wn7oFdbl`O)c4Yd#=HlWBTsR(3oD%Ip z%!LFf4-Zh8`n;E7LZ55D6+yQPnhR-^XAIqVH?EMF_o&d>JjUF9@gv!rq?n{GZS4`s zwUyb(pn^buyU;Q5Vv76H9?$_ygI?M1wK-}vZfYR9cwxj0t*{1Ru zF@=K!pEdFO?PZRnfv-F)0nS_wiuS^{`cE-<*MFxxm}+@&9;l#!HW2uBpP=vQar|RT zybF2Q(2YNt559#Nbb>zao!UH+$YNgv(W5YW#a)(SYU~%xt5~a&$=LM_MiG877F|0n zI!jH9qx%Nu99X2!Fw6p#BA$G-j^G3XUl=oMKF6%2t@Lnbb?4Z?-arX<3snLP?>j+$ z{6#mYPmVW+x4(p3?2!>!y#NlrGLsE=3f?%-6CW&9#>GT82fGyudeoZAr~WLhjg@sf z_t+c@nvSKOSo;A=SMWZfGB_roBzng5f?rXg$GA?xO11xKqbgY$1p<__ReILZGPNI9 z9;6cf@rQRsevwXbY|f5-Jpm4GSJyycX|B^5=&Q5=kdE{8x2!Mx$_U#$*yq_{+gpXN zN>HVCzzB2+S5oD$C$BJk81Yuvx}mor&BO9;H~qY!)))0`yLC#QU-==@F+Xy}P&u-z zle->l3iQ}?AD#4DV}G+d7B-%+^@)G4Hp=d+qr1ZcJ}Rf$>Y>WH^_X?ajg6g?rYhI^ zO31F$9BBNC>460!KS({``=Q9nBx;RR;CJI8wfA|aZRK0~Ou+ynLCN#X<5m~$%cV%L zNfspF;?~21_C=ZRozRibX{T`yeBS%w0+~hFj6qpT`GXQfl@g%Gi_164&%;-P=q^h) zUD5A1iVmo34!*uz!pt4TLA&zt@X#ek^Cd<5iKC|%pob{s&w3UetB2+u=5$?Caa&@B zHNW0RyO}~ib+UJ-e~XVIXub@q3k$t}doXJEO5a`op#N+tjzyF-0eZE`Y$z@<(*xvm__+T_yt*I z@R*sIfv%R;Qd$a1|4zTZ1F_n=ySqpU2zYvW@_P#NJGc@i(>r0DP|;+sr>kFW3b&axGDNg%~H4BZyIZKa^KwY8Cv znz`GP;}leYOvdfi$VUC%E%ee#e94=H=k;GGlU`6bDyv!2?_w@xq@C&3>vE)Pw3Vag z4~ITF&o>@y#-{7F@R2jwrUvI*cd45n#Y4asWf;xpXN-+nG&X-&Bw{d#?{3H81tZ$9 z-v(4qk=n>?z*9cZK#bjo!3R_18TU zK8HSJT`m)>v*B{0E8lxLm+4?%2gkMZ$GQzrISzTGc-L(MbFPqWytck_STNfdcD9Xm zEAv9?LJ``)#gZWji*9(Q=7?c$%EAN;H)WI`*-c1)LAt~Uy{wEdQ@rE5{1EPMtyvs> zLtQ{jU{RT-O*BguJz)rx&`{%FF)K-7k{F8*mvIC)q;V`M$KZpyQPd7GZj{U9Sx8ah zYtd*o+pMUvP{$SSChD>Q9jM-Uw^{%>>W8f)@zSORs_GYbOC!%8nS`XtGuf$Dk4(Y=xblcC zS`f*MZwb^ix4;8BcooOqR70W`YQHJ!GT)A>FxZs7_#>O0#MpESMv0Ph5^i5g zc;ot!SyBHc4O`r8q7~Dk7v(t(mBlv@&yw?K^?uq?W^#o>7PKmAp-D=Q0*A?d$rOf| z<*7N;gYJ+4(ndfo#=cJ)tIFeKb~uT*40RW20kCW0TWgA=0I1T0xzTb4_n;qhz|!J$pgO`M-71vH*H|C zq~PDSS+^HQYU^vwS+}S1FZz#)L+o&nw)EjWx)i8yYUP~N2hb$S$;lGuYWn7t z;251cYUSBRJ(PDbO|jutk0ASypr)Apv}%-FE~Mzm@W}II{Aup zwiM(%=Q-Fha`>slb01F+S)o}G-g8-HULmtp0GLK@<5PebsKuX?k;+BKK~5N3DIICaZ`!1*jn1} zfQ~`ulbu2i6eFKU?TJIp7@{G&BD`KV#)~t8&H^-}^O90Irr0OdfWiKCkLD;(brqAO zfK4vDb0;aF<5WKrfuq)E+pGz^I-WAPrT|mGkI=(CcFu6Ui<@Fb9)YEc?|2ypu#1KD zuA_#g-ar<3Zljc!XgJLEX$0K5?fJePS4bU_%13({_YJX@T~jn|76Z#EWe)Z2w;<7a z{$_h64QbMyJqi6NhzNq zB75o^6+dX7>BO4569a9`_zp=io2$snu1Z$5x8@c*1=ae6w7OP#27M?I#`cL-9()65 zsdS@-ZF&c1Uq7NOv2!tQZ{bmuH{$`(($AP#Qv__dp^*CHSkPhmwQo&8^61gm#cA*| z(S0eV*9?k2Tl6QLoU=&3cwz0j11@xY^4)rR{mmFWKQJJ!GwZC~E0X6w)n7jdL9vhB zSk<=r-$MQj9WuzH;1>C}J^TSotY9OUEQ8VZEqKYk;3SRq$CyaBSDpAI$M8hk#h(4! z0En^qWgb_<%bV1L@K>HQ@lTADz|vN>$W8|S^oQ5jKIFBv*(VITD16^g)M88!)m02+ zsbhpY6TqnD7Qsb)6Tu#4ysQB^qd=8Nz=m8I2Qm!IKUxqj9eZ^0cKI0nZA25{822(T ztzE+ZaS2_qfgk$4 zBG{??^gDens>Wb{xoQ!AxF9V6jMF@U<-BvRUtS9xzHkVXITJC~hcNE^fGlc?${13< zX!skQpd}ucw{lAo4ZKCsPQ`4f&F~9h{!IJg3!dMw6T~WX=I=`5a#|(}YENbv1*AX^ z4x@(XPZ7o)1BVrvliO1Q#Y5M+S4Gaw^tGlAC>rk4Ohb#moAKHRd*HWRSG42CEF`pS zaa7YqllNrUaAn*tOispp-fe>&DPaLEr6j)irF+gDXV`x)WYV8?RbM>9*!@=ye*d-Y zRNR6j9P}9)a5W%M?p};hoR$(QC(VQI+C}O>&idM|4|qG%bmOS2D4L@3s(Y>OZ*O%< zqbdf*{?6YmYe8cB!4u;A&DN#Ijj~oU8}|+x7c>8Cau7VXg`a;N775xC%0N~qg~Luw zh0E;!x}OaWsvwR$`9S?YM+*l;pujqULag~eQlh{+4>n~YrT$ECJmg5}oL0Xqb0Cu$dyYk;gjT=QS?(*2$j2xMO7 z!*nJ+EujAC&QVc!aC|}OjVeIVAlkA8ePhF(p2$PHr!Sw%N!AKb` zvE3s~%YlP94E*`?Z>TOQY)uE%M7&tWsLW1^8%=3@vlc`j@LuPOwt-7BgZxA&*KGT< zJ=m^$X|Ae#`=O|&UqVU?PHcTOmtD-jCXt%DCe+_ji%P$jSNENSH%cZ zirOB;gB|Y$`*oE5)b!t4pdJKwEp*e`#KI|<6dEe8#v*H2p?!~`4^=v=W^M$ z7-5eV?+cDYYeUO&{TeFSPomK~R;C#i{pnu~v5mAn86l_jkT&!& zL)@m`wR-8h2?cPFH%WV@WG9a=7`U{)qGvp#Y2M&Bp=AnP70G>~Q+nWqD^ zNRTz3$5bo!+Wvsklya|wX|DTfbrh}@U^|p1`;9(C_H&-s7{q>3{F9o^IM80`r+0)N zf!nt}VM@PFJBv)2iw!aek}b|Zlw*$ICu1*?+5yFy=~nS&#Xj!-oCiS$SvZf`@(w@_ z;@MU|RCt!r&x|C7$Xsu^xn1Q@uh&DY`Xmxt?EtM5mrBqJ}00990#!zpR!dgua_rK$y^qh zEJo6+ox@h(LTio3Pza9;KK5G=Ih4fym;i6yb>2A*t#NyhxA&w;`-qXW8q?u^+xCug z`kxGVU558LYte~t+UMZD5|%9Dyv2eX2+BkkFBUFtGwpE7jKMG0J)<)#d`eb^euxIN z4qj@;PQnA^s1Z!95aBhgEX`fbYpsB_`^~L=mA%Cv0(qxVdbNI}s0#QoetM41VY&o@ zHAyJMP1r{^hmO;Gi*#1htRnVDuXTLi7l>*n7oSs157V9?M1A;O${)ZE_1tu!zg$oH zAO|kV-EzD3j-yl!Y3=^~T12kHhYqAkCz>(4!X*~>31nQ>l5^{Y9yj1fqWm^?{mS4oHeox4F47< zv_@Ka9P@{ddmjH%i%j`HIWl8%-{Cz2uo(aO