From 6477251545c1f3eb40196f9c1508e220311e5de7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20L=C3=B6wenstrom?= Date: Thu, 2 Apr 2020 15:56:11 +0200 Subject: [PATCH 1/3] add Every-Visit Monte-Carlo --- src/main/java/core/algo/EpisodicLearning.java | 6 +- src/main/java/core/algo/Method.java | 2 +- .../MonteCarloControlFirstVisitEGreedy.java | 88 ++++++++++--------- .../java/core/controller/RLController.java | 6 +- 4 files changed, 54 insertions(+), 48 deletions(-) diff --git a/src/main/java/core/algo/EpisodicLearning.java b/src/main/java/core/algo/EpisodicLearning.java index 49bde9f..05a84d5 100644 --- a/src/main/java/core/algo/EpisodicLearning.java +++ b/src/main/java/core/algo/EpisodicLearning.java @@ -5,7 +5,7 @@ import core.Environment; import core.LearningConfig; import core.StepResult; import core.listener.LearningListener; -import core.policy.EpsilonGreedyPolicy; +import example.DinoSampling; import lombok.Getter; import lombok.Setter; @@ -104,10 +104,10 @@ public abstract class EpisodicLearning extends Learning imple timestamp++; timestampCurrentEpisode++; // TODO: more sophisticated way to check convergence - if(timestampCurrentEpisode > 300000){ + if(timestampCurrentEpisode > 50000) { converged = true; // t - File file = new File("convergenceAdv.txt"); + File file = new File(DinoSampling.FILE); try { Files.writeString(Path.of(file.getPath()), currentEpisode/2 + ",", StandardOpenOption.APPEND); } catch (IOException e) { diff --git a/src/main/java/core/algo/Method.java b/src/main/java/core/algo/Method.java index 6372b24..99966fc 100644 --- a/src/main/java/core/algo/Method.java +++ b/src/main/java/core/algo/Method.java @@ -5,5 +5,5 @@ package core.algo; * which RL-algorithm should be used. */ public enum Method { - MC_CONTROL_FIRST_VISIT, SARSA_EPISODIC, Q_LEARNING_OFF_POLICY_CONTROL + MC_CONTROL_FIRST_VISIT, MC_CONTROL_EVERY_VISIT, SARSA_ON_POLICY_CONTROL, Q_LEARNING_OFF_POLICY_CONTROL } diff --git a/src/main/java/core/algo/mc/MonteCarloControlFirstVisitEGreedy.java b/src/main/java/core/algo/mc/MonteCarloControlFirstVisitEGreedy.java index 5bc93d3..3618eb0 100644 --- a/src/main/java/core/algo/mc/MonteCarloControlFirstVisitEGreedy.java +++ b/src/main/java/core/algo/mc/MonteCarloControlFirstVisitEGreedy.java @@ -8,37 +8,22 @@ import core.policy.Policy; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import java.io.*; -import java.net.URI; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardOpenOption; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.util.*; /** - * TODO: Major problem: - * StateActionPairs are only unique accounting for their position in the episode. - * For example: - *

- * startingState -> MOVE_LEFT : very first state action in the episode i = 1 - * image the agent does not collect the food and does not drop it onto start, the agent will receive - * -1 for every timestamp hence (startingState -> MOVE_LEFT) will get a value of -10; - *

- * BUT image moving left from the starting position will have no impact on the state because - * the agent ran into a wall. The known world stays the same. - * Taking an action after that will have the exact same state but a different action - * making the value of this stateActionPair -9 because the stateAction pair took place on the second - * timestamp, summing up all remaining rewards will be -9... - *

- * How to encounter this problem? - * + * Includes both variants of Monte-Carlo methods + * Default method is First-Visit. + * Change to Every-Visit by setting flag "useEveryVisit" in the constructor to true. * @param */ public class MonteCarloControlFirstVisitEGreedy extends EpisodicLearning { private Map, Double> returnSum; private Map, Integer> returnCount; + private boolean isEveryVisit; // t private float epsilon; @@ -46,8 +31,9 @@ public class MonteCarloControlFirstVisitEGreedy extends Episodic private Policy greedyPolicy = new GreedyPolicy<>(); - public MonteCarloControlFirstVisitEGreedy(Environment environment, DiscreteActionSpace actionSpace, float discountFactor, float epsilon, int delay) { + public MonteCarloControlFirstVisitEGreedy(Environment environment, DiscreteActionSpace actionSpace, float discountFactor, float epsilon, int delay, boolean useEveryVisit) { super(environment, actionSpace, discountFactor, delay); + isEveryVisit = useEveryVisit; // t this.epsilon = epsilon; this.policy = new EpsilonGreedyPolicy<>(epsilon); @@ -56,6 +42,10 @@ public class MonteCarloControlFirstVisitEGreedy extends Episodic returnCount = new HashMap<>(); } + public MonteCarloControlFirstVisitEGreedy(Environment environment, DiscreteActionSpace actionSpace, float discountFactor, float epsilon, int delay) { + this(environment, actionSpace, discountFactor, epsilon, delay, false); + } + public MonteCarloControlFirstVisitEGreedy(Environment environment, DiscreteActionSpace actionSpace, int delay) { this(environment, actionSpace, LearningConfig.DEFAULT_DISCOUNT_FACTOR, LearningConfig.DEFAULT_EPSILON, delay); } @@ -104,35 +94,47 @@ public class MonteCarloControlFirstVisitEGreedy extends Episodic } // System.out.printf("Episode %d \t Reward: %f \n", currentEpisode, sumOfRewards); - Set> stateActionPairs = new LinkedHashSet<>(); + HashMap, List> stateActionPairs = new LinkedHashMap<>(); + int firstOccurrenceIndex = 0; for(StepResult sr : episode) { - stateActionPairs.add(new ImmutablePair<>(sr.getState(), sr.getAction())); + Pair pair = new ImmutablePair<>(sr.getState(), sr.getAction()); + if(!stateActionPairs.containsKey(pair)) { + List l = new ArrayList<>(); + l.add(firstOccurrenceIndex); + stateActionPairs.put(pair, l); + } + + /* + This is the only difference between First-Visit and Every-Visit. + When First-Visit is selected, only the first index of the occurrence is put into the list. + When Every-Visit is selected, every following occurrence is saved + into the list as well. + */ + else if(isEveryVisit) { + stateActionPairs.get(pair).add(firstOccurrenceIndex); + } + ++firstOccurrenceIndex; } - //System.out.println("stateActionPairs " + stateActionPairs.size()); - for(Pair stateActionPair : stateActionPairs) { - int firstOccurenceIndex = 0; - // find first occurance of state action pair - for(StepResult sr : episode) { - if(stateActionPair.getKey().equals(sr.getState()) && stateActionPair.getValue().equals(sr.getAction())) { - break; + for(Map.Entry, List> entry : stateActionPairs.entrySet()) { + Pair stateActionPair = entry.getKey(); + List firstOccurrences = entry.getValue(); + for(Integer firstOccurrencesIdx : firstOccurrences) { + double G = 0; + for(int l = firstOccurrencesIdx; l < episode.size(); ++l) { + G += episode.get(l).getReward() * (Math.pow(discountFactor, l - firstOccurrencesIdx)); } - firstOccurenceIndex++; + // slick trick to add G to the entry. + // if the key does not exists, it will create a new entry with G as default value + returnSum.merge(stateActionPair, G, Double::sum); + returnCount.merge(stateActionPair, 1, Integer::sum); + stateActionTable.setValue(stateActionPair.getKey(), stateActionPair.getValue(), returnSum.get(stateActionPair) / returnCount.get(stateActionPair)); } - - double G = 0; - for(int l = firstOccurenceIndex; l < episode.size(); ++l) { - G += episode.get(l).getReward() * (Math.pow(discountFactor, l - firstOccurenceIndex)); - } - // slick trick to add G to the entry. - // if the key does not exists, it will create a new entry with G as default value - returnSum.merge(stateActionPair, G, Double::sum); - returnCount.merge(stateActionPair, 1, Integer::sum); - stateActionTable.setValue(stateActionPair.getKey(), stateActionPair.getValue(), returnSum.get(stateActionPair) / returnCount.get(stateActionPair)); } } + @Override public void save(ObjectOutputStream oos) throws IOException { super.save(oos); diff --git a/src/main/java/core/controller/RLController.java b/src/main/java/core/controller/RLController.java index fc33239..895102a 100644 --- a/src/main/java/core/controller/RLController.java +++ b/src/main/java/core/controller/RLController.java @@ -51,7 +51,11 @@ public class RLController implements LearningListener { case MC_CONTROL_FIRST_VISIT: learning = new MonteCarloControlFirstVisitEGreedy<>(environment, discreteActionSpace, discountFactor, epsilon, delay); break; - case SARSA_EPISODIC: + case MC_CONTROL_EVERY_VISIT: + learning = new MonteCarloControlFirstVisitEGreedy<>(environment, discreteActionSpace, discountFactor, epsilon, delay, true); + break; + + case SARSA_ON_POLICY_CONTROL: learning = new SARSA<>(environment, discreteActionSpace, discountFactor, epsilon, learningRate, delay); break; case Q_LEARNING_OFF_POLICY_CONTROL: From b0ca634b6452e19d02db613bb6517a8d3b31bf39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20L=C3=B6wenstrom?= Date: Thu, 2 Apr 2020 17:07:15 +0200 Subject: [PATCH 2/3] add every visit no jump results --- .idea/misc.xml | 2 +- EpsilonAnalysis.R | 28 ++++++++++++++++++ SimpleNoJumpEveryVisitMC.png | Bin 0 -> 80279 bytes convergeSimpleMCEveryNew.txt | 21 +++++++++++++ convergenceSimplyNew.txt | 21 +++++++++++++ src/main/java/core/algo/EpisodicLearning.java | 4 +-- .../evironment/jumpingDino/DinoWorld.java | 4 +-- src/main/java/example/DinoSampling.java | 18 +++++------ 8 files changed, 83 insertions(+), 15 deletions(-) create mode 100644 EpsilonAnalysis.R create mode 100644 SimpleNoJumpEveryVisitMC.png create mode 100644 convergeSimpleMCEveryNew.txt create mode 100644 convergenceSimplyNew.txt diff --git a/.idea/misc.xml b/.idea/misc.xml index 384e5d8..a19b0c6 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -11,7 +11,7 @@ - + \ No newline at end of file diff --git a/EpsilonAnalysis.R b/EpsilonAnalysis.R new file mode 100644 index 0000000..54f4ad8 --- /dev/null +++ b/EpsilonAnalysis.R @@ -0,0 +1,28 @@ +# Libraries +library(ggplot2) +library(matrixStats) +convergence <- read.csv(file.choose(), header=FALSE, row.names=1, skip=1) + +sds <- rowSds(sapply(convergence[,-1], `length<-`, max(lengths(convergence[,-1]))), na.rm=TRUE) +men <- rowMeans(sapply(convergence[,-1], `length<-`, max(lengths(convergence[,-1]))), na.rm=TRUE) +print(sds) + +# create dummy data +data <- data.frame( + names=rownames(convergence), + means=men, + sds=sds +) +#320 QMC +#188QMCMax +#234 MC +print(mean(men)) +print(men) +convergence$group <- row.names(convergence) +convergence.m <- melt(convergence, id.vars = "groups") + +ggplot(data) + + geom_bar(aes(x=names, y=means, fill=means), stat="identity", colour="black", alpha=0.8) + + geom_errorbar( aes(x=names, ymin=means, ymax=means+sds), width=0.4, colour="black", alpha=0.8, size=0.6) + + xlab("Epsilon") + ylab("?? Episoden bis Konvergenz") + + theme_bw(base_size = 24) \ No newline at end of file diff --git a/SimpleNoJumpEveryVisitMC.png b/SimpleNoJumpEveryVisitMC.png new file mode 100644 index 0000000000000000000000000000000000000000..58c718d01b9ed017c54781b4b58e4487b2351d54 GIT binary patch literal 80279 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 kLCZ{ikBx%TzR|QZH~ANJxaUe^DtLwC`vB zkXE~qZP3V2)Wg8-v@?_FQ)`~rdyUuLEGCb?i=&xe-oPhsQavI|>9oaj3>Ycrp6BFJ zTmBDkCFPkAWi5JaIv$yA4=fy=-G%&&)TX$*;nwqklXCdVMYc0?smVhJH0Uj{%+xO~ zg;^T;Oe=~@@dK8!9?3$?A-N{R!I<9d;PITfJ1u1V>S5Y$jstGH3kc_UJ|zz}x{mNF zqQPX%kB+Ee6F@dK(v0gX@(ku%4%cPjUEf)ok!NDaZw$9~dWd8O zGA8AwrTk$xlE}%f=4d|d1nJna8uN&H>9k$(yY$Ks>@epv9as5<33{3<`3Gdm+USUlT6J2 zHJe#Y%~*Auo-9DhWg$bK z4}0uwat!ra`>#sBn1^ky>^;@|jbrZ^_C$nAdJv6{tMKL}U>q%IDqbzStmVMC@?m|e zH@k$t!`1O&cehp4<_<4SeabCAry$Z7+Iyp9upG`mAw^N8 zWRy8&HjYNT)|a1<=p5A3A2NF)m(IwgG9q1=4xCX4r+6@{Lt7{WyB24V=1YACV&*Tp z{yf)!%2r}CF)p6Sb@}V%@sN8Hj?+LW>6evC>*Xu!lRfUmzR@fm{~52kjJ|rz_~niv zV;Xy0xaOqY;=l#VU#e57&fz=jb7Y<0r>q^FU7EBB^-X`UuP+U|2c;3$FZBJeDXX4v z)=V%93P-plW`+7C!fmzYZkPDa^E+Snw1Stcd}gV0O2hS1MzaXx_GBe{SMo|bvkQ0h z^3(OZ)3>9qmG|FzR2Mp;U;mq0!0G-v=Ur#+8uWTraW-ZCO&Y&<*CZnp3Ky-Z+HZHW zZAYi?U47>NYlb&rA6<=zit^IkY@M5|{b=`C@^eNEEf*Y`Bf1LN!?@Qn$`5vG4sy{e zVdX!k1UC!o8uv9q$#j@q&$3!dC}@Aqx%NzMGR197wa>+z-W2bniB7y9S8{~RWvd+i=O;E6K4L_eg5Evj zC@X=S$)q$9R}^0N_`XzFIe+8K?ECT#2Fpij*-gA5iuyyLD-*9LioU-fV9j>v+)bNb z(_S5b)BUk%ixN2Hm?#W}c>v^BosnS@BCyk1awy=R0D zmIFfcJBcS&0^HW(C5ygX;4)KbwY0=nqy|7R%T&2W$XY@KZ{LZn6snhUS3alqVqBX3 zpKpcpxQ8C<@myNI|3dz-AW~_s>hO)eq0hs?=QKRt8m#)w_Ic9S=r**8Xrad(;@>Qb1U7n&<~lNeJmp*qo_N3>>U zw>%y!O{!76kf*L;*QsbV;z_{bP?q7go+6u9bV1PNnVydyXSW82mg{=wBSODR_g?>` zPmF5&Y}T8rV1W*f-Mf-rvQk$t72~Xv-N?oG{Dyx0`;#4JW!saID-#l3t5E*~*mSFY z%8F5u^jj30v&mT5*K&deK0RFS4gg0dd;&@;hmowe{o(X~TN&de(A&w~g%BN(dvOGyK1WCqD3?b}o5Qo{L5AO-0)3Dp~~UA5;(s z%H*7LocR(4J_GiVr;ul>5NKl2H_n4Y>DaL3wplDfJ6^WCn36hdoEVKLW=zj-hP*;Y z7@3we40UC(sNk<+TFcU79sHyqye3 zuDlR_L2!m;rTen>Vs@Iorh;QCCPs@fMYs`%7C^W;0%#AB!I-fg?WOA0>F$hSYtH(( z%AL6kZT`@;3Zw{(>pqmncSjH>7$kBY7>k$j%c$2E{e1P_69dNS$V7fX-J(#Rjc6xP za6PGJnZugjkIG?y&7yE3wCC}QQ?nmLTaPhmduBHa@(ls7RHCv4sKExhk50eEU=hh! zL(a9aRxuh)U-9+`bMt#gk&K=ps&SK8f%6CS1cc4Y+#BG}DA*iw_VKKB=y~F`6^q`E z{WO;la#5!DI1{6%VXSK&dsoBgMmSa=(jvjn5u0X|Zs-)-Fm8sSUz|HKYmnbTeuBql z^1MG%CJzg6hpbp7680CkEi_J2@!m==81=rr_xlH9mk&i)eAdU~*b5RPV7oB3^AioA zrUEyQ`$-Bern3D7OEE-IjqZMZWOx|idWr;Km-*sZQ~HRF0Y*)8rIJQq;+Y=E!> zV@~0fiG1cGpBLF$k1u&fIC$o^oJHq8-unHE?b+{<+rKMtbnD*Ji_{0g3TJ$2WX5FQ z01JrPQUoUPBI%u=Kv0*9S-{_|!cpi#j>p~!j(|x;(L#z5bEq{oY+G+YD z(vyZJP_JOrC~z6DA%~7Xo{HW2dEL93AthCgM@5|Y1^y{-*?7@P=u(E-u7zT#KJf5r z%re1j!b|F0_3S zr-XYpZ)BmtxU6wRUmudGm|@a@0h!6gO)?7u->+tCy1uvCT#fj^09C(*9+Wk&$$24H zdHfzm0{9qHlCUHWEu>eADA$c%Hpi9mtIWzk0LY;9-gfH!2lMi;ALQZ;umXn}HwcNPJm>fJKaD~D8MOIB|Bk_g3-z-~_(qX`gO|K?!x-&%?s?o=+^e=Dkyui=R zsk8o@-uNHOQE?g1*A#394jl4^~#R6R` z4_I*JqQ8TkdM}L||`gy;U$D5e1pKutimzr*m`Hnt7%91ZM zK{K+A7#d?(IFlPP*{GU_*Q3v0+eU?u2zTg#1OXyMY?gX-ix>ddxc&zn& z^uupk>G;gmk*ImUKNo}PRe4?|LCP>tQEWynaaWnegBNz!X4>_Jj?}vjZ$B;2UWPyXQ~UB)DQTppAcr0V$_a$2(^=Z zeg$@MfL)hrq6(Mu#(bSMCWr;mmv^k=7HXxAG2HcL*xK%Eo)MuPqMpZ4B5n14A}_SD&2!*;D;q z=KO(k)imxd`a_sw{P9CP6H-)d7bODHWn6VSN)zN=pX%+)Bu^?)jw zqOw`9eUNqGy57fA%>SBW{_}2g?#5li3N+gf8gtSk2NgEh)h*XCV@mf`UaF~!eC)>r@% zL~5z50gebw3#7DilhYq6PmpjUHZ53I0#ee8l8uhD+s$@716b}Yrdk9}lxi=by`&0v`bx5=OarJ$D<^nB; zpP=i``(A#`V5E;pW)<~7H48yME0_LI5}0M$S-zQQKHJ3%z;0ca2_~ieC$F7XIL2(R z8pfij10DcoY6Q?Dd~;?aSO5KLe;rPr%502bB6Csi z%c{MGXbeb6Kn$9PEE&>9ZVtP8jz|FO$spo$XaJJtA zF5e=ZIuzrA{R7N`-JV;Dcjogb?eJC=w;HFtSl-%=;sSDLt{b9wvTI_o-m|*ShzHfP zYr5~RA9hQ9G???F&0&6A?~rGME_(DCFneY;)#moSPrRr|FaEA!$s(PfWhkz#d%x=n zHyqh$c?na(0JkQ9Hpi`BUW9{Sd8flaP1$2I1B+1&O{(_-jpKOGwQc+})EeRLfKwRT z|FF=6NZxA8HSHd~4G@7D|DN{mIOayf`T*{sXYne7Pz$a_mO>#6+14s`QcRHi*KGTr zS%~yJ;0!%TF|7U^?gx8Y>lyB)BW&tXK62qUMDY}gG8E<`lp6W1}SvZz9#e%qQX$t zk2Sj=*zE0=qn%qvbzzP|Bu1RI^j6jvv4lf%7OX#&h|bX9zU-sT6tjQSe8)e!m7FUr zg_Qkl?0n`LB6WxEz^ z<%>mgqKnFZ=rkV1U1Jum!_j*B9nWeaM7av|i#n0YRo{yoq$k|;7?C{9PzJM)3VDsR zwLrUQG`R1L(FAzWxZOVKq4kRmWABG%MDoYS}CF8mnVEJwSxGF&PC zUS~&P_U#T^SM?#xqO`hiJJa^%A)8@i1PRa09a42O*^Ba@Yw*II1(GL16p;lO)U}L$g68_Cmh(dAsM8c=VW^SU0l z9G=!=h6uR;HwgowpA(9KLNU5LpWS>&D*0sfU&pxT;#55&a!`(-GcgkEt|ba-hI3(D zI3g8lWV4&)^%{g^Nk`mDVmJRo4dlm#-MrmXEl3JtFnt}mczB;h3o^=tELk;X>~0#LmC@r>(@ z825win(Yji3C0j_L?O+rV@Oe$jEua!JswO)b2KM|EHeU4&!NJh2hwny2w@JrT8*bV z&_fHb%b2a4C-+;_;>ct)IjuC*%1_fMd8gn<3{Ec7Nm6`9_czM{f|XVQkJB!0e^xeGxPVyCT< z1VkEHw$>)T?0Lq8wg}=@PN{xQ`0>Hsb`Z`0Lax}!M7$}qnNq4_0~7HFSYkwQ0lKGH zuJSnXwfp|X?Kg~vN*qIy{VBN9KhDOWU+C9uwu|yCb*?wh zqN&_pU~o2dEGX)8up6XU;7ur6^s}du*L3J+^RwDlb8T9ctg(|Ai{5lO)lt9MyO$br z>{fDx^>Ggk;5U|YGhCTr3+8&;pbz#Lu>x0{g@h17`!;~aG00*8ESg0Mc^tCZ*wMUp z$&tc}TC`#G+8oh*tYKj`jx{7Z8m>4wrrqg5Q(t7|=(-VuE>z%YFo=^cPlQ#?Mn1X7 zl;K8|Gu7=z*DdfO+L5?G!f%c4?MbJG2+owRPGwybxr>LRX@2h@OA}9=p#(dx>QbtE z!k$#{usJz0Wwsq3v&Yi^p!<%W#^#<2qkBiY(V{50TE(R&IojdcMl@X(6v zY~Z&dASa;CD$~wal~JzNFA<0|!EP`pspO3j)udS;Mcy;_g{; zJXl+9cVnS=@61rc*?PhWjZVPhqpb}F3)Zp+JLM9kPU|LLBXv8u%U~LBP=@_!ccwC`fReVmfja81IxR#Ii$dZ@AXTeyHP{yCGKG65XNcDJB zoI7!t)_JG_hBK7XjRj=3FGVA$Pu(whl58iekrlyU4OB!T?(%V8ZOLdw=StGM%A?*sr zOXXaV2}adGSEf9Zy|+7zc1t0c9W={s)PZ!uQn&Me(V+q=83$_O#_5PLH?yLd1Rth~ z=ZyKF;OewOaV;5Pz$7;Sub_k^yu;>nvfqowh@>N%vEBK z6iP2sg9~G&QG;rU`V0}BIqbGe;svS^;~1D)d>mINb7fw-vj7iLJoYu-pTPhbGKF-} zeK|k>9j1Ir+wx9$DpZMSVMUy!@QSD(If-TIx)S1;Ne98U2YR(JP~ceX1pq_Vd~c%x zO{4&XGN1Jcwq~BGC>8j2ooX}Yl5+JN5H6qH(Fa!0VUaN30RopCAxxHUh;zH`ZEgMb z64Gc=ia{?7A264#ePLCc`~#*9RfxN$`8ecN4BMmWLPdF0Kgc?OJo(Jn9_6NRDI1MRXUE{UEW6)#zz`$x}(cT7T zK%nvf0md`!iPg|hQ6QVs!MdmhXRHk~$8Vq^!7$$1Val2|7&9g{85` z;XQ*A*r^jHe|TXLNL!l)tV^Y;VKfPaWr@|777&8eTwp-h{}fjb?O_|IsH{nHXoe~M zL*B_cheRqA94o;r^2NW;0szET4f~x8@!PuqQ1?X!d~ev;zp{gsuL=^Qz6eBvFXEMe zXv|HW)fK`VUC8zO*6C=rA86RNiY&v+uYy5~h^$*A3&Wfj_d)^~@-C5Kao9gY=237T6rfmhlNdJYN31vtMtowcJBW zKpJ!T!oT3k|AOHOj{}j*4syIX^?ko zySwtE_g0rdv#&-@699bQlnUM!qC^jrpCm)2^tuB`CH!4nQu zk;KQePQZ(hqP7<--6_EN$e@quYaSKWWU!oifWWO9*s2v6fT8aHi3|%NZd@QbkjY1e zIkkujw~S=OQ{Q12OaleGdRmmjkgd6o6THtZ*vE2Z~PjH(q;5jN0y-X$``cP{AsX zUyqWRFA@u&Mts3_E-dr?`IgWH8wYt&!wl8`rpRK`Lc8=Ph)yg|CG;)v^}K>~jgMa* z(Ekd@l$urKkS)t=KYsy~Y_+zmTfJoRIlFxWfY8bO^_qe!tdSja z(4Qkj+%BH}Pz5r=U-m3lx@r7hICW6!x%9V-X90_uTkwYR3taMB!?i;;^V$ctc zb*WqWAqtUIv%u!ht>rNvntu0D;@CIP{<79tB}{=f%{}n+9%AIO0z$JI8lgkU6na#l z*Jo&`sd#NwK2O6)@R*^{t}6dZ4IP-Nq<)L1%;%gFb5ObIn;theo90OgzkAV6a zEezL}-=AuV)&)2I+i3ef`hzi{1G*yng}!+=>tDdelOyi3!`6>X+l38K4-MkmU+!_7 ziXH=A&WvrTF7HzUR$w`Le`&d}*_8!~a;ZvKIhaW@A*EGzmu=*3EujyVDlIH=j(!tH zl%6NaHJoO?h`f>pDtxQSp^TVJ>)8`xkCH-nz^s*)ZmW?66QSytU(mpX(A4ESof#2k zVY({l4Um5_kx}5@ zgs56qy^HJ~S&yCIMflK)vNXGD0OOL0ys84#v;5oDLI-CNc!hB12%FAiJ1p?xVz;J) zCJ^^o&$Ju{?a2D1@deBFCRoX^!e>J)%eD>9J}3f%yEkn+B3R+zpZq$c_a!P_6?H}3 zjnca2Qb=$M3^QE*ln3U$s=!P45P&4|nJHese0OkZ6igkgDCCo2TxjzSO@hU|4K@XVek*SC#d&r;yVG2 z@AX(0b|p=_&TGZBN~EfJCE79c>WO+OL6qc|)osVWoh^r<0H5{345S%gf7~V~e2s!a zkJ0a>%J{c)AXAvOo-^q9D!csq#~GyLc?*jVMK*_C>YO>_zI6{tfFd$C>cgw+oR=?N zse3Gw7Z?r$A&8w{M1bt%j>3|uemE@RIK}XmDF6Oi`>T6-^IN~pxL<%b@0QJi2!k5- zz4~mR=zWSz1(h_@=u-~xbhnC2U;X!#`*+%bV`6&OJE3^`2v_mWrOJEO2#exhWDgNI zrGJxlNl1CvvZ;&C@eH4QUWv+0NDwbiX6ZSohOba>)LxGrxN;L&83+0Dtx8sJn%!8( z$?)YDG<$J9WqZM^`oG6UeOOuYSi3`-!&zV4MtZrD-+vJfO?mZ9(@1e%X|{$QSlrmb_xcmI=adQa&n7~az_)k=fM|5!3q zIX)3(&BDe*NijHNrEuF`KwLEhmnD)~UtzwA!qSXwE6A(Pt+5R5O=;zdt!ODG} zc;oi_F((BAA?rvaU5XICwcgF`*5YF+-&?u%JwU^u>Z0NO^m<_RSV@{Y-Q9pvP;wh_ zUuzYsc0ZVM=Q{2-p4VI73W;#F2l9Wv%i&|oP_aqUJi-(#P6JkzP`2UgUQ=4h-BP!aNbOD6uJ zJXQ*KU;RmL<8y~x-C|zd`?2@$>5Dt+NIAl@>>k*Mb!ybnN}g_t8GJhNc#hFI`622G z!L8=^L7ylc-5$#M%f-@H;|F0VWfjk{J2m;33(}!E4-sKLRUb&9Kp<*85XjyLsU4XK z(&18ngv?Y=Bpbx05HL5h@z!-fFRW9sg5E?QXzNuZ6uvK|pHQLd{h}Oh-TSExpTewV zbk=QuN3lz>o1V;oFi4`;PT8N%8j%rjVy1-W^=Df?{wR0XDBXYm`aINCpY4EkJ83JlSPq2 zDO{SH#EZ&$977pQSKV1-Zk-z7g3LgL=!Wz+#|o84X-xA_P>rKznZLkvfRd7azH%o$ z!K>!S^~mhGPE;Uei2%(^$f=9g6`PRE6Whe)?S?|^iU3y5(=f^V>%<0SLFCi!`y=1& z*?O8~|!bsElX7k$WHe3tKfWd>HM(3=M2RvUJ!~|D@z*xtj^hn~> z(X4`Jh&HWzODsJOIV8FOQq_+jtmeQmBGpxb00bHPCk2+-T@kbWbuyTeGe z+Ay})n_Mo=MqE?#P(Q4eE6MT;`VaPZ#fIXW-$P95g({GUTo$ybQpNG-1YP#ZTUT{$PoLv<2y>J#N zV$E=Ykm#eE6D4a;%FlaX-(fXj0}oCQK%r4^xUs&rstG*{S|AfX@i3HEoq+(Fk{r_++X3#Vt-V|WciVZNDt{^p^r{e=cy~TqdH`lWCk#UDBuSZGfS9*~nEw@f z-9s0;%Ma|n%&S(KLm-q2$sA2S^hAoHBUL$XTj0M1ljzq8!db@cUoMP1wqH6E6 z5#YJ+9qztgTZEWa(zJ5qq*&Fz>p!>&P7M75?qW=(HI1w$Gu6f=0DP!)$h6+0FqO{l z0RUZv4ks57+tiFsGXGutn-(xQvDMdIMtV{2Mth`XnJTUjxH2wW)N=%@%a|_BuF5Dl!~apW1*-L$*utr5ULOYZ^Q}8t(~@e9-lO>%zpMFLQ~;M;ytMr1=js1#yUZ zUW?(MKq|+A*fl)wscAW1R*xS%W+vil5z7Ku)1&8 z*NE8|H+*1gWY#k3MbOEk`ggCC4u+p26PwC#KH1hNS^0&+W?+0ur&mm%H@mU8o}Yh- zA(R32?)p5q5v>Q{ZDx+tnw)m9s?S1agF=1#aPGG&zbv<)F%1*TQZGWQe%K9G>OMSE z07y57XXzbv3THnYSjF@Dttz*4pYFrt$BVL$t z`!OOFa?dZPJ;uLh2V?=e$kE4cfpn>3aOS4pi_^R}kkPXwasNlGn2kbxm%k}s1yb4f zTtYgA(SkDqYcehX9sNOt%`Kuta=IC$Ph`|saRtsvqH_Z>m~1~#ku(A$*>jA^vqBDr z0-<+9>{Rh)X;x6Fs-a8n)w%hhGUS&xWBQu_mvOovO`{O{;tD6ogolP0GRLEnEkepL zWg^#HG2%(ygUJus2VSctz#VC3)=i4CsVcrr0a=zf7nGMWG!NHsapYy!SzMh0$Ym?AOm2{>%M#8CMJ76Q7Y7R25Ni>PS`+at4DcBY&ZJi0f-d{8BPZWQIc67jM^5AzY`xF zd2uHFk8>SL*!8zi?_R0hJZ23X%q{vkNWi4Zns$mOsrd_PSJav%qHePxJ`Tix`3XR8 zIiK_)`fq7!|LvL<3cxTSSAz&7gc`(ETW78=o z4Csz#6KKD^JH`ZF#V+UXv=3P3K&W+Davt`Pm*V--iS@D}KgSr-zt#3cST({WkZM{f zE?FX88N}nU4D0yK$x7b|XmKkT?pDS(Z6<-|JYUkH^#_QG| zn^5E#!F$o7=g8CErI7a<`01$U-DRaQP%Y>2Bx{`m4%CeWEx zQ;^zqqJjseq+t}V0Ny`YgIq&7G>TSj53iGa4={U@1>m&`z@$8`z#%&VUIksqTZ9wH z2?4S&DkXD?3DeeFxQ|$=9z~v{)FZl5jT_Fc{|K4hKzxG;oT-yE*>PzVA*)0XwXI`F z`&??a)Wo5aua*32asJLmemNCVdl=`eRe?xfLp*Rd+zVF%&@|4QSTu^6f-ZX>y@tNf z-6*|5TltsB_KWj(&UTpMF!g+sJOAy;9j2$9KHkc>B(jdoWOyBfZ}7g{h{L`t639~e zf(V=5GNzR$iYZc0TK38S!ZkNj87J?t1iRHi67 zZtJU7b6RBj$bf;#c_?M~^XDt!9ESc$2jJ#=K)l!TLccyV1pHLPQIM#H_51V84bC@Di8WH=wz$7wd{1H-W@QM{5};Q!c$7XquBTe=R;rMu)|pED3G0L;uk}@xHrg8C zrRlWY_jAJ+lkdMhcdh@Eh)+W)OIG@v4{m~5uE|4atnTBmfa#y?RD+RsPLvcQsj)gv zf0f|T_lZ1!<3rkH)Ej)P`LL~DpM1$V8Gc+25IT4UMT4X1_77b8)0DR#i#p>L_bd(; zi@czTnEz|MNYG2F`%4n6>7?LquTvJ3LT&@N9A-ir zxj~^m329B0y%=AkFzuNW_eoH-3)I^y6XM)kAI-aEFGSdCo;&ry$eL9~tH{>ahUvFh zrcUL3GDRV)(U-NBIJ6+Ud(}p0@dy|<7iJI}^EgoD4axMAe~{iBcATQx1}D&qX!hz` zDxY2Rus+#x7_`6r`SbqNBi=r-M1fUt>rGBU!6AMYx0zypm#i7^O}z^YeC)8gS6aLz z=1=*MyCtHVc3{7&%y@Wxeeg^z{*1ZyIygsN9m<<#Y-scMhIMHOS(gUUw4}b4uml%)=_3V+ErV4sk21n#k76vz=1v>kc!V9mrvi{xPQITN%YP;TSDijf9>PT zY1izp=`1c5N6$9mjB2QU*_Hf^@4go?4|8U_mf9RM#pSrx^=N_KwDb%|w}s*Z?Wyjv zIReA-4FT@b?uNx-hf~K2USRjS?njlx;JXiaev2{_x7Y5sjMW_|bK9jHTjYaJ^igI5$V>r;%YB4vgBG{7mG^bNWFbs*4nV!t}Y38nX z{sk>~E$fnb={VLfdnW)?DBP_kJtvQkA zrY;ODG)b9~sonGQ5l;L!?H2kJPgC<>c-GU~Ei!DU zC(-&zBwClJ@YiX91{b4wBPaFoXIaMj$P%oi``wn&MI`U zLq2($yt=Yd|3X}oIH}uW@xgleZpQn=RbSp~D?iA0Kc1H1xD&MrA+4!BwwBw(`cO=; zr~F`3eK>d6{t>OKG;y8tY{^PV%dj1v;_I@o&dnURhsc%C24c3m3pT!GiP^Ez`x{zA z&8|~64cZy=F8*%^>A$VLqb7v=(+ns&ic-(lO zi049r+6HQW0**u>jpj`-=}cY$zV%TEgJK(h1qp+~&E4?Ea%Y$<4Q>{Y3=JL3H4W>r zF=jY$u8v{UDk-qxjj&dGc*Wd~Ww8&q?hmF*9gR>cn_Xxdjgr&l#T^}fy2*4gP8Tsb zt%~=RI_I}5y0UD~)U!FD?u!X+&xoJf^twhRIT;ogTjpsi-JIyUDc&Moe%^+_eQmva zpKqjuX#D%B{kt9b!a2=_6X=-vxGuN38}gDnA_cHxX;>BrME38 zEiMborTeswwi8;{L~qqdnI>rm_Oy=nE~^E%cee;lXKH(!1orP2G9>m-uCK3i!jUUe z`OR#g;9F_U?QQUgmNS0Ck`}Dq8cVq$2(yn`QtRjql>^Fb^M0<2x1Ywf$NF-uS#@vP z?eJz~EPp(>6y}z}0fWrG$^Nq%Ul-oYUOq2M8+KxA%spCR56*-{tYC&iPr+2yViv}% zzVY6x5?^@D@2%T~hfCt?YuFdno`_-{S8v+KAJ*b%vkuBxfA4RDp<=cjn?A{oFklh7 zGYiu+bF(KI;Aqtln4o^epZtT>edI%odQEk({M{yUrK%pPxbsTf`w_ilSb+cn#bNGR za`i&KdA|}ea%79v8N#Q#m3^Qn_YL*t;8nzaytzcq$N@iF3&Fp3&o2VLjJFGPV3G;NEnqKfC}~nj)L)2?FqO`d-bZ_ zC89HO-b7f-9-Q3@j@DQ{8ttD`&EMb)n*AP2PDy_Ul4%0PUJE0PuBgq|1im69!#DR8 zNN*?ZNK@~wl}}M(&Q6mz??t^u?o2(;YOJa$=|R0nyVBIC8Kyd3s6op^Z%4%(U{P2y zcZ>CeCqETx8zTL_n7a}9>LSNsR_T;+>j(();q1`(a&3AF%`bDA_kC9VDnnPy8-R>F z=-0lx>RGAR7{Qt4xN2at_neUBX_J_m6yuwmKUGERTw(9&V?-Gig++6>SQtF{Av`Nz z+XmT4N=9;pY%KKGSNT!2mlk#pPxodgs;W3b?PRway)W;z591r>!-d?-dXe+G7M|E- zwCk@=xBftQ9<@Bn;l-%#xEgtB0sRg5A2l$q&vx20iTv-kQ|!TlHQLFXzZtzD!W3xO zjhLy6%=+^hD~xF4;eR-A@$xAuUInlkTdYiX$U(fMz`UvwaB-&)Af}pQw9uEE1@_Zm zu{qPW&$aY+;M_vrBBV0!&8qa}1+mxWJ{h}O$+JvV%2Jo@6+nZ5OpIib>e9xz1V@5D zVU*{$0%|6;qT%^lhQxd5~+;ISyKM7@Uf4XyGg~vQm*?pefzo48i&Ax(Q8fw6E|*PLQ!gJ;^OPUGwHF-8h_W zbnU4%^sPy<@vn`xedRt+635G@tAnR<$a|MX9Q)GGDsX>G6JfsZ?2Q19;>1toJvIZFFXP zGQ)MGuF$K92%Q}I_09G1slhvo{cX8k;=`yr6;`KoL;WjiHlQzfx1bQUkAkkwNFFXE zGdp{u@Fu`}5ucl&p|_nriy;(1ZWgD2tto44DASQGn7n|Z42PyUoJWWY{p6GFV7{5Z zPU#TsUfwjnwms1N&G7p#oWt;q7@pxeFAcLJdKX!(zDQ$7v0*5y8-eop^!c;gyMijk zSP=nqk&EOV+{o1!A8zls;GK5=2_-<^LPeO!RyeU%!42*?vDb`$O!fG{I&k!jaGzW4 zVALNOfxN`?64W?B@!khI>(vlOyGrlh)_d%Zp;f{5#la(#g@)}~dHzvxxW8=Hy;(s3 z;6&KJJ&L;4N}(#*5W0n{`pB9Y_rvKGW~@XeQNTW}2fGrbi6SrFddPowbl7SLdYEOK zn(e9RHsRPanVQ+U_K;g6h3?W}lgd0N{^j3oe?8&a6GB9%7Ra45Mx-2b`KF=UEDPVq zX81gGtN4L|+$h#D!enL^w=S16SGOKRfOWIizJ5kfF0G=AJ&&K5TCj!S-pm0^WwOGi zkv=8Fv^&b7oOB1?f>qnBEGaprQ|B{=rz+z;quXUTvey>A-NqilCN-F5x)^);{s$U)#dUL8wegL984T%^v|$A2eJTD9 z;4{d2n|zCQI?xFPoZ`~uH!vl3TVEbCf~kP-6P-@?p*dp#9d*!LPo`-72z5{xS_G0K z3y?wl3ab4g3gO&b0pdIF0Ga8h6PXn6vQJYFB|dhAz^DJ%ZBXr5m6Oub^Ne|J#R{LH zpkPDf7*T8GNhA@ekaMHly)b1k{2%%ZUwTpCh*JZzPoHrmc-tH;Cf5b5fFgAwtABhW zDg(8i8HoK>Vay_}%#eRlIsJU}i3j;dW#Q^8t_9GFvX2aU6he2&ySOQQZQB*5V<($e?8S zQ$VM(Dgpil7`-OKDi6{wGiW?6r)0=B&xUGI?RD@&Yk$(R)A(82=sE-+*}8{#lQ8-m z^x2;xt;{@mvP(Ui?$NJ!JH>nN5H7636T;KH*}4`|QG&KnjcMqc zWqo_+)ly$7MqI3mi57N9%`&PPP3P&d*Y#Dtl_J-7c6OwqWT03AMoLAHC_K=EdMPTc z+h!o+eAk^EtFx>T)Jb+bi68F)MtANfo}EXp1o<@ttRp|z%m?^$mp2#>9a{lWb%=Ru zl<+j>-WwizZe6QUj;*qc<*TH)T8 zfqjyGbQ0vPAts++nCbojs%hiZnRh{Z+mE~ra_1je>XzPnTh>P(6sA{T{)+F$RSQ$X zu!W66iRLgaJ{?9bimZc$E1Dh6{#KtdK@6Sf5NA7F+L^Wcb}a%=Jdmoc3%?5)vH`Kw zBKvfe4U-cShK><`!XEpT=Yyd9ywPw&H@StK{#8t+PR^1n8^j0+jloSRwzJWYXV|{DO4w=H3QI~?CbRx{+K#p{0T~5FNz*TbhuFoP4JVN!=fq2sFRTkg|;^g z=d{>^27Z68rNhsxw}3}H3EoO3K1eoGN2uI2UMxIU}~D8&`exL4h4PSNsqre(tl zHt5nnh5^DuG2r-~id@;)!EcJyHC@UuNEC`*oo;6<*)!s*h+f>ffB$}@p;~xA$AqEo zhh}>>F85Z*qcb^=?ZsLtw3P!UO$nBovV9^p9hZM$(0+Hz;))yVO4O#?*D!?=wE;)Q z3^Im#n1C`nanZKqy6Zw2-gZ4jGZn5j+o8~FVj|wBqo0g_g2EZ@hjfierbmb>T$YtfO2xElygb=d3MUI0vxT&=q>c$$CP;=< zrB=n!5v9dUwKty9z?y*R%#&4ktOoDBK0YP(eKvqG+d;)$gGVKB$F#V5Z&g7~UY@*S z>M6A)q&Rc9lO$jG?7P%j!nACv*deH10TTW)4Ck8%`0yZPGW$+%7Nw)5%H@p^ z3XBhTmvEv-x?`i03eW?nS$jP0=BO!yTh~>>(-)YLw$ndoeuo;dlVm5cfoLqkLF@sx z2}gK6e%ynC^F^WEh;A6S!3BQ`9>G4Cc$1j`;hKU&t88;hI&-wk6%rq2X6A;{``;%Z zJCeQ9##5lOrMhVBgA8z7r7$4Se0m$>u@fhg-9O^45-ij66y4kOh9kOG63Q`CpiWi+ z783mo=a8GHa^)eV)HuzaI}_wM4_G8 z2OMkBSPg(|PXLV=C~@$E>EqI;`ub>?FT7iMj;Crp7?FljPE9joIz3o8WjZJsjmIMP zDeCE}t1u|p2*w{!?Ro`)DT6#PNKn&IrT~&3E9SO-5g?7?MtJrVfUQ{1C;G=*gfeo4 z-;6bkUE{<;in=oRu(5!r8jiicEyFjd0Wesy_InegpC5oF9W#Vm$4<}$f*9gC_h_P; z3Eqj^KL~x?Fm#UCxb|fzIy&rcVSUo|dc`)g;-|Wtp%t``HBq?xHC49xiF>T&s{0wN zGC&wwqUZ-N)8Zwn8N*nLkfk08-Ien|fG2|JRh9hY$yR*Q*t=Q!W%gIs97r*ppISDY z^tyo1sv$>8& z6bgsHGCGDl#?YTKj63*-h9-B!cB?_C7GPq4_ zOJ7a7kL27rOv#jip)q|-$ld9YP&?t{Gm-cOyBwNX7g-!X|A5*1#~S7Ec3BUDSrk58 zkTJ(tH^RTDB}8ga(84S3LzNp0rJJ0-eoU2N>Xz=+!)we7;a@ z^Fz43?kh0F^?0}%iWWI22D&Ete6iV-O)ERx0Ut`a_w|ES(?Be=MorKmq(G%$4|z;s zAm3~;{rEES)uBUp168m*I#nqJz^ijSRzbHumrW$IVUv2U0OQF3<}{Tsf(X6CuDW9SpiJdd0SO}`>O{}C}A1C+8omL)*JI`Zjh-sKST_ki&kq)5g1lY^wEi@p+O+_hm+5Md*Zzjq>`+NA zL4@UsDR^@#`kq#Q@d!f%@;Ss+Ri!{}&4rCb`6fv?uFIO&1sK~7SGpE}G`|j40$ej4 z%OF-OU6gu62h(3+nI2#osIyD|@CmS#?=u*{n!zHHWe@ zA>fA z{pEo?6r1%JzsR7%eJusU=Z8qI&mhgrvN0vS`c8MK8z@!3*WDfKV3-j_#;_SvWdzm2 zKz9oBH6@X6Oe{UgP*#~!W!2gPrV)x1B%O5M>jQ+CMEC>3Iura-K~om7TT2gwGFAha zmNCG9%%%Borh}gL_+KNJ`-LfeQ;zcwg)p}lI7LIg z%C}3>!)CU$?;TaJn8WC}247&v2tO227U}YG%IgbLr>CL7xt-BVcDlS;CNH@z03?4A zYUMX};L1yf$DKDQFQgH+mzrveD=xXA0h{e{2&+JM#AH$^M$ z`NA9d*Wbvb#qB_WqC^XWBU~Yv=J0k1cW4CvTkRS!wBIHX}Fc^6@g(EfL1Ip=jP>8-N=fh0IT4 z2S#|#SYF0ZDUFk0?>_O++}d0|do@fmv+gChwYGPs6UAGclCtd0ik#u9QqR)9gkU|= z6l#YMX;>~@y6L!+k)e^<1bPLtv1-rR(@t%(j=F+Y!b;BP9Nn+1jP}lRQ%A6!*(C7! z^dU)#nheFzP6(cYLwoh7<&SMhs6;!SyWp}uN=M?HE6HZvlW}_CRQ!;?n8f8ViB`KXsK0ciiYC_)PrQLFkMOoP0k_xf?wF)R?72(vr@ z{v+}`)!sYRlotcNPFMM7sm?()b~SAv3XrBo2bfrma^HXJpQ@FiE{EXbNKFIsWYOt` zr(9`#fu{Uo;jQt}%WKn9UpfUbRZ7^nj;9`Lm1K1r0AoWSYZ>c2m+^A0Pr7SsVSp*# zWA!J)fyQsxyr2=-{nz zjwRm`9*KhnPPiMAF~5KQu_^y2o;VEeSI&1{$M7t*B{=C0#l8Q7#s3-!2>JHYYkkF!yI}DO)h&(4Pu!$3xDR~6`h35=@e$s?UZ{ja60JbIs?u3^V z{^Q4kZ7>})g#s>7&8P|>GFA9g{5`~A(d+280hul$Jp-&B7yw-)kG*a{f$G~3N7Q`$ zW{xsxbzR0yU~PvmQ{iA$Dhofw42m$5BbUKz!Y>A__0mFL6&;B?hH~^B1LRp2X8DCW zx7(4X;zmkK0uXuJZcG@f^&ff+EW(W^eY&3)Hh zIi>#f!;=&U?Yy@>;1U#{b%n&ERC}$@KNet64@gYK@@peI;DvurzT=bm*((q72)br0 z0|C*GjE>8^@%ACX3q*)4XstMgkV_3cP#sP}$##or_K^%0vyC7jCe+(inSq7f`pD@s zvVEr;o05~*8RbMYdZ5FDeGUfZO_|?5`zt{FoJr7fFbWOir8u*yjiWaYXjS>a{^v*7;V*_15dW;Z;=U2}~!l21keb-R0RCjViWW z(zaf3eP?we5}LIP3ggmys@F2nm!7{KMiBzk0}xW3w}b?XEIY3)m3}{w4(mBACoULO zdu*zgZ-Gm)$`%dVzeD4nXU&5-FnB@9!a-~AW3>2Asiq24D5KA~^AqKsEzJzy1~Jy! zB|Za8iHOuszcy3$iPpyTQ8jtIb}C;JzH1bWr?6YcS122P51-Frj8 zJgB=C=@N(M_y@+4M3_B+NuaXaOsNKD-Z()U)3DN;suZ0-fliPC(`_Qh8uDm!>W)LdG z2S8neOk@Hre8hFNk!=!@)J_0F6AtzC6u}h{-+yP6|JF)}a{qoW<$l#HalS`$!k+94f+0hHze`?gt(taN}-Q8Ey)Mn|4m8L34y7C4!clp%> zvx?ioXM9rH_iwFDp9MP-W2nFVy8<3oBklo1iDVgv&;k-;F2XoB@Mli*Wu(UplS z?TOPIhf?{MpS=;n|DfZbJGcQvFb7o6-5)PS!*!WqWQWiYK!|`_H{YaP{N-WSVF?Tk zWk%R`*&g5+D6Ro@U9wHCUh}Ej%KVyKiy!$5a#s)bz#Y*UxhB{G3cdZQ{g2-J26sWE z)}YiwM!yqv^H0X74(Ks?NIossCVzHIeEcfOlk2)vik&e1Nbf-ZL-G*=71lODMW!I^ zRfSblwVamF-v07lm@+3MU3TO?xDo7CcNt_We4krj47k-u`&jfQ ztG2<;v(L=9r1-1}L<#Oe`KgAY`)_j4w+>4|tG;i(u5}&zF_b=aj`9>JmE|p?zGIy` z6x{kVSW>!nAh$_e?CJ)*E=_#vsi8_p+j^nR0IyYFPVBCuqV3uXDm4;{SJMBi@gT}H zuw(Dr^TtFUu#}E|U=LCA{9cYfamTm&?31Hss>;oz$852ZLGY8PrZan74pJH)T6?xo z0}x*U>?gI>*#;H8G#Mbx7-zQ_Q%*~%BZ^MsO4~?wX(eZo2UthCC1tp;uJ5)96 zmYtdyatM~MKAZ6o2JoPXM2rW_Z#ob^w8V0Rv}!&=97|;l`P^zS2R&&e&vW+eG=E^? zESR578G1|Ul;kU{gwZ!46v)d{hUg67Ua%CMjLu37UELoN2;+8|D|a^Z~GK2D^eg4;kT>1`pk>G2oXq2_e4Nf0J&rba(V9>NTC%9L?+E znBK_FK`A${`q#Af6Afh3QSVEGxUd7E?J|Nx#~LkYYyWZ`y9hhbdw<@@-0%~4J*oX{ zh}7Q&h6Mat@PLF9Z=%YTFZDV&E1z8?o{!pekx@Oeo4e)0RP8^!G(<&VeDUs|cZ#E6>u_z(gJ;O^W^c#C%6 z4=8d{2)s(?t6+QpxiC|K?w8h}!HT*KS;4_VrNFkmj6yA-IK}{9to4b$XkE^%2rXZ9 z9Lx}&JUIz=U14B!M)?u~FQT=1n8Rt5be;H^B9pNQ`D4tFfHEZQ=%j`a#A~2aW}kvi zu{=U4c;l=3%wXR1Lp)_riQEcHzh|aWK$&F|b^KEPcO6h%I&d0R_FqJ5=)|NeV7-41 znHOQ_N2KkR-I)NNPYuHdy4_14%)*38wS|ql$CiLbxjHqoDv4%82uq3K7{u~x3k)^P zpPuW>T{eAQ9HVJE?{s0`U9yj&6YDwamcXGnt(r?*7Iq>)do*4k&UP^qp+fNc&^{d>9ghwII zPFK>NP8@qRzxAz7ytzF_7(F2YWJVHqnzh3}J1nO`V)rUgr^rGmUHBSNxdnNVWCFDR z#~VO?7H_rkv1#_vNRkZ6HsJ4O5WzMtZv7`}0wW6nCX&JXJZ)Fa@yGMU=HFf-M5RcC^Fv( zL*K~|G7u1S+7SdDh{HtapIw?m6FE6_X=K!w%YbZyU+VOX$pX?+08YSTiDe2v@RUe- zvNRO>vDRO{J%x%4`Zg*egRP`nAD`YTn+cIV!T^#Xl1!S&DvA!CZ@kgeZM&K=l@DL@ z=gS?jqdK?orxc$ucCotf0x8y ze|rpI+zTK8AWF9q!I3(ok{n|mfq-TY?%hv@w;)6LkD3US8BMPX--C$|?M3rVV|XKHF}7yW~^ZH}MrGu3m}y$B*W`s;!0h54pl5 zK0ZNj4etoE-t}+^rb?ClW2&O2cC7CnokO&ij5;z_%4<8wPbuQ~4)Rgg@PaF`&2cLJ zhJ{fWflYtT&x0yQ0F8*7ygxBX@~n$VGW$s*46 zI#|H)Kr0)F)S>BHf3~OH3)V&^Vy@&^?`zblXuCcee308z^8Vx7=a1~yM{P(uD2{j* zZ8<$5ZIb z#WjIU0f65C;?o&xSrU z>6TRD|BM1S4(Q*H)Fv5}c{Br>X*-S@&)4_2V&PB3hc?qs+Ajr(>v}D@+qtTQTU7HY z?0ZZ=ZQ=&JuM#2)hB){NOa`Yp-UhcraQav0;|Nw3 z?s+SD474VJGu^u7XUn_-66P(B0kbyCuTAv>27r&X$Ob}F?8klc?GfsQ@=>HE-j-~s zwf-_#4M!L(XmncpP37yGSK#TzRv_YdcZkTLQ4nZreA+?VhN0A%YUi)vvmW4)?!Us4eH zDmAHV!mRPpOzn0}%|NM>nFQm`(WX2nL9c)`5^TU%cQx*WF z-^a4hqZb`@If*aeQj=+v*_)kw06W6sDWwznmUoFJ{oT7ttKU40VV|0a%$SOJ(*92A?yQqCz3rC6=v_~VZJWbp-|0#{=4HFx zZQs_Z%b0fUQqapgD$5l83m|;RYX;K zDE%s#!QPczX6WU2!u0@+;3ertXzz{rJ|VJ{mtM0@bo>T+8X*T8A=it4!$p{WHkqtD zRrO9w#>skI^6pnwu1ssc$I*;jX?>k!7rrX?(b^5!^VR@+xEOe14Fsfd&+UmRc|YMw z@<$~Tl~{IJ=C!e>X7IHQgC$&_5m^p4GKrZgTgJgf?HwHVdv_S8 zT=@X1vSvhs>bbKn$5(PUFKkZVoa*8>a6P=O)LB=4fg%418my-JC~Hji)Ks!x&sDE2 zAY%yAnmz#taxg?*S(wmc07p)N60qf00A^5{!oG9JEZl&#+?a^qFVx{*`XOI_9Gy~a z*W&KzDaM6~P@idR(xLZou%G{qAbQL;-eW>**h6i&+_3lxRg8zKv=T4Etiy8kJxhg+ z2oMVRKS4Dt74G%UsHPe+1JlQ606$9F17UW2EtFG76@=zA{Ot(B1$utfWLYv{7>iA@ z8OXo7hDUb=SQJjg2-|Mt0x~=RsuqQVy||nhvVL5ZEdrkhO$w90?9LEupc8-Q?5l~1 z3CoOzuzVy9!MY+T*ej5&HaG-P76yW~l3|C})uEqyZ1~ZS;tGzj0l)zQy6h2wEvj|c z$5;dWU%hY~kC8aSrh`mNIzuaWiH2ktRwjfZS_b|fCTf4%ZT>x`+>5Pbj9rQCufQ~aVjVdbqKX9)|G&70(dND9tks!yHew}mHT8!Jt=Zze2aJQA1K14BhbCSg<{ z*J>9KTDGO}XLJCBBqA%QrYdtv-daB@4WUDKSGqdDl)}SM`0g{URR_*usbwt3A{}96n_<@LD?GR?T)syqk?+&it^=xoUj%#k%C8tl% zlwCCbgh&qlf=Da_pfQOiqm7bjw!9&w1|#Jyp5r9M4`*Cd0e;O!83kzX7>P#8(Nx$u1EU;%0_pR$?8H z%LZjdW?Z`pZrH%BM?*z;(i*7!tVC-66_0K*qqOSIl3}FPr%2 zn4?HGNM}{Pt%F-!L?smdDnbD{B#BNu`lTIZy&x|)MZlIC5Yn{W-+CH`Mw}P;#I!hb zdua9BM~3iAoVW`R039ULQqvMd$GvbhGfB$1k0yO|08=45Mnzv&%mVtAXw;n*Cicz> zy)*abOumWqXt>QnwIr1G;xq><#44x!S(h0OtsMScs(Ult=^>|h4D}t)uo#?_dPE}F z|Misoh<1f@_COC9R4RzP31cO8>o;wl^>Q;)2t9x9Z>%+7QBo9l;KKOd2jK9XoK{Ak zRS|zHkUHHa6Bx1PhL1QRsvk4G4GZ?cwjim^Lr4vs=?yiOfYO zE%@x9tSFnt837M4drf8i+$XDX83u%|v%2TK)4aS9_#0Uu{_(QiDSld=$_cG)^U*|v z;+|dgrfAT4HD8hM##avDj0}u(diVTQsyvaHJ z3!eMMQ0-&d$*(zRyCEz;gLtWcA$vDvne627^-ATBDOV%3l@ZzeYhERodJssUln%!E zWBqDR@=b1xgCJNqNrqlb3Z&*jo0-3`}fwFzzfsp$#a2=nVM$X?}dC%pP!mYX+#%<8VQ(}nC$pSp`~ zsH*j3XteG_v)1C7N52{4?(>k#g5ny9rg8utN3`MSu*WcH zuLIwKb0APG<2yD0u02s!l)RYOE&K^j-_Qx>Kjy-E+@KsPrrdrzZwngFLB(4d70!!( zJm_S(lWKyXJ#i%UWu;33DH2#?{*W2u?!VM@B={pJxSnutbv5Hoa7i1`2l7Pq<yrGrspqMDxVSoMfUnq9!q zE{j4~1Jn(zIsfI>f#itW%_|UdT{SHj0gxtPKKL@_ZR3wk@Umf_8Pi7eHtujPH#hd;-vQU1nr%r z+uJgA3zn59*2=(hvV}`Dr(OW#PE0GK^I}#n+e}W`>H>DHu3`Bf+MQMak@Ts>b5nOho!aRmm-o5B zX_kOk+w!8cg>jdFjLqC=RR!XHnue>iunk(wXn}Gk{sv%ZT9n!~-rcCfm0s{W6D^^+ zT)+jCottKkK0D$vL7AWAAE%Y2-N{*M4-LFLjE3Fr33SHD7(8IU@$SY|%5B*l|Htl* z1A&=6os@3=th4GGJNw&!H@0j|gYqmK$WQa~qt9NS*oNg@6JXH%pGmF)IJgvD<--s$ zNUK0T(5kOTp`8n(I&r$GAJ)LCM8pxl9jzik>qthin|v88ZWQAn(ho=uV|*ZnacW;M zB~w~IW7pNm2({1gl8DA!HM3bR9#$2KtH8IHJy#{B7r*jx{Mm;)j`GhY5$(HcXQVhr z1q6c+N|5k@AdZxb7qW^d-+56NO>5vW2?NHVNG*tTl3Lk)Zx%OF*FtPZD+earA?GU5 zRmgh^>fU3=e2GXKm~a5wckHf*8t8b)>xCb%&x{Llkok>b(8xvi%)kyglj|=K4yP+q zi--MYqEyEojTENV2)V4h+|i@KT-F;#dg#4M-qkcpL5a0NE)#}_LDk{y{Vn1uF5HP85Jnnx;L zBSvvN@-J`^HF~EtvJ)r_26`i#M-a6)=(#|^poUoO*sssrlv7p)h`+c2oG2$DP=x@; z*92XX(gCPhZ=A(8IsXHr1_1sJGW=676BK2ofrjA`*|`mDIx?^ZbGH0US8Q(4PLkQY zU4yoz5tcjLDYzeiDNZ3z`dzW+ju1jY>QTb@oKDeU5g1~ zN;~!KcRz%I^r4Rh6KbId*lC;V-mnXgE#Krbp-$1AH)XV!@BMVd;oHyvm~3KaJ~tdd z=|PjzswF1$5h zV(5FVAtAeWw+4^K409V$LSU)@vi%L74X0KTT7qxNBDB4**;oRxT?pmU(*%hO3sQXD zt8Q`bt9M=^wH$TuQMdK*oqp9h9V%YJe;PC}tJ7PKa?}p7Whb9D9GJyN+G3t4o-o8# zIl=(b!yzz+&#YzfH41zAU14!4}u;Un3>{0>Qjf8m}y!FgADrE?Klhs z1O%+L?>)Bd(W#&;5w=B!rI4vntB3TP$ww6sRW2pJWuVw6jI|wdj!46NEF6xCff~o; z5xq#t8+W%vfT5HCkFlm2%+ldQaLyUOK!`aJw~^U>K;a+vknv*98*q{}YeUEwM6!Dj z7(#&m-6asS!DhU&s?^DJ%f%Ioc1_4u)GookW zhVg8E+o=CevDOQpm9+im6#*{X2N6402tG4+zq&R&KtyG-->mz>)nE&c| zQ0I}D4}OHVb36ff=zP*@y91DpRDji;vFa+AwC|4N-J%w>34|@+QIK=3(}e3!{PtyK zAi6OqJ>=oVD^bH6XZ!omxAVp!@$=R6hr^g`L5fuMxVv`2{1O0lVNlTEzeUYS3V-T=%g&0;bqh zk(ci$p1PoZUdi3j)KA$#qx9ab=?4Ir#x80Xt1II!cdHEN}Xq|bt?6|8Q{h!=399K@lEWMI8#bZ?RLnlw3 zgc^9%wC83Ki+m`4N<`=d4SCR>RR^vH{|habz<)r6b+h(@Mn*&@1LduMPB)XHaiG%( z24&Qf?q{HcMELbRP;aTGtFo|bW@*b#UeL->#A0S<=lw?+_CvZB3PB@=S+>7Ebzq#& zYoC3vp6U{foq7QLF)Ww8F2296<_abxl7EhFA~`3T9(3CEHlv=&Wl4Lt&)(A z5>05p&1&Y=|B?e~1y1>iVQ5+;=W3B*L=dyG<{tHt596d%6(%N!!Eu4)O4EPz)GGn- zmyqrUx&d;O1QVaVLFr4AQcUV&%aW1WW!|GS-K zN(lhTt%48AlWtC856e+7S!x1jn@{@(yh()D49<%uiTu;bCU6Tkk0BV~Ii>xzP>P~RA2jSRQLKxo;URme0&n>f z`iI`*9FIL^n?NJRjtu^WgHtP4u6WN zS3YTK#;{*NYpyq&15oE{<#i;sd*C-Y5$iG{YR$ceg1dPfbR!YQW%dBHy9D5 z(_DGbaS^}~DX9HeEn@CJ?atCsBRs=-9)?YWV1Bt7hL8~)0Vx;DV6j><%#U^zSg6p^ z{iZ2FF)$)&n&irg&&fSxRoNt%n}{!&LOkxeg-hi{AljQUM1@*B2B#+*B7SVccvfs#ct6?sx=@d!@^f<^t~;Z%gz7%aB6UPac7p9^PV`rWgPpMkuUf4lyK!z)M+ zPsLvKfQi3xlU;va-H7r(b+8uR!`~3d&+y!;*bEl82z9^ z^UA{}7KuLVks?2gQDhPY}|2*#hA)ovN zklqLY>^E@EZX&i=u$jJyQ@`{Eps|tZt-uO!!en_SQcC8)qCUknnc!P6_QMNHCJQ>; z;EDN;`&0sv%L{HR?~_#5-O7zCHW#C;bL6&G0jLc|gnRigRLt*6C1`UVagvE~9<;K0 zJroP`*W0o~cXC^QQ`3PvY2n-BWa~c=g#p-8OFD`n`V2kTi!CP%kI)eX+CxSJI7MV2 ztPFo3vxJCEIR9P#Vn?8QN<5fQ& zHYOB!rZT|7RexqyRw~vJZ?L~M1-D35aC100+;Ni*I7I<9DX0rLh%K%saX3=LE`hNDHBA+WZWO=qs~aRmnzJ)>!ANl6^z& z1uGkEfEuw0HeV^e2YAau1P2j_{Z!6$;YzHJ!yFreQEu>W9*8VZgQLL(xosx>;j0t)nL>%HwX{<(Wq zpWfi}$Xf7Jx_`8nQ}ipTpd6jQefKtWfs-K~lvCoa`HDS!DVFK0Y$T807yXeoVE?0? z=~gHM2Zjh1=z!G82)OPT>mM^S1tmrb;Fn#wMiN#dioj<#Aq zqSh@r%7?HStJ&J`KMa=uA${yy@?@fwbzbp(PB-73#hg&yH`X#nH(3Q{ zEH8i#`NE9^RC#-eVg|wddL1pbRB)HF7KJ9BDJE;A{F}9~j8Cvw0;tEQp4HuLay?mWx>`ATa@eWg?Z{BHq27_T*@O6Wrn3v- zb9HUeH;<(om9w!Oi%)H&>&u7*;L^)HT71UuS=51TzxCA$MXuTf*QonZDeB zig?56^-gDr>HXfVkoL_Qng?wa(yL3w@$qZm%DuQALYfwiF{PfjSO*Xg0x}TtvJg)?Ys7*-CeW&W*vYaO_ zsoZ@P>O@lVTDx`G>!XSHm`M>&XCaU;Bb}!LX7ekYw;fJ}iElaV6tShnUEYa8%zWvi zeiSW>H1&hU@m7@E+U>5b&CUI)v7KCRzZ4;fR3NCIkM2bPBo{He6XV+R8L{>aVEW6| zSFuf^*SR=4<}LvjieVS;VLSSiiRd?A^eCowQp&hJ=xhf|?A(4whPH)84gc@V?^{r$j)xa|CN|u8de%c{g z%-y+M5MlHIeTvj8k5pBeF~X^Yg#}Z^pp1E$@8+BXz6{8o+pFXrvWtxf1B=|=siIzA`87RRJ)BDa}!f=5?Ws?(`)7>Y^iX??lg+W z^OH`VxE^bx(Q7x^9_|*~eSk*=`FAt7nxZAHx+3kY+Vacm9AFUU;x=NVkoFvzP7WL6n|>%<`nG0z=^Pp$kCw2pEt-XVhuK>8C1qGs zV6*M%LKXOkdPl?}O|}EneicT+%HF0S2V-IA+=^nZf&0sJ=k(s)IA^qBkS3nLJiC4< zxI4-yI_$7RB|c!{M=^;Jw@_|c;wO~@@v+1BAfQN&*xIl ztjlZ`8Cu|<2hzfDIUg;tUo+wr);Z?1AG@V6SYQ#*zvT?B&`Haaixw`31W}@9o925! z(eXv=81YR|)Rt6+Z=v0fZ!Oaf;lK0Q8dI&0D1b>{>XZ8y6X~TMrhpf2RG-&_)_3~G zmjY7qZRQ6iyia*LV<%% zZDx0kDCD>PC^<9Wn!D61E}9!no%4obC$7^vWk@@I-Z=v$mSaS2InEP$YX0u(aLx3f zk>_y1;+EJcW0E!8O|(kQ{QCaH$z}*2;>RG6O#2!YKNwDmieX5NV_oWVm5^B45t&Zw z6WIz0t=|2m2G&%9Jys^dcf_WX-l|$gu(3x zu##7gFziUj{OPkR(4Vi%U1i!11LGeX$!&$R&kq-iP*@;Sdkxsw#23M2UObs&KH9>- zLY_jZw+5dFWMK_=;{Z=u(_f)btc+OSISB7lJo3)G2A z^&1IZWLhP52GbsZ8MJJIn8^}{x$fYa&U|+_U|yhX0CP1Zy;%RBIK+gHk8+3$3|TyO zG=q<%tBM#6BXlCNM0?eUXva$adEmvy|24?}ZPtFs`e4Zh9;?vGHAKL2KkfxOPAn4& zk3ODn{P-qnP;r{U$_VqeRUkPLM}B)ClsS?ro(+fsL6b3 zNISL{fr)Mm%*nz=biWM%6SZ0!f;8t^91ce^QQ)s?9tIV{AGg1KzDO@Z>^2kb03M{_ zAo)mT&o=r1vXL>G3Xox;W6&Gdz=QAB>sKK7Tu2;uLs7W9&!wlel=WuoDF6=8QheZ7 z7!&rYFk3h57r*MC%_++8v@veOp~bQ|R&qw$L4btbj0TFukKti8VL#&wJijm6x1YZ_ zdNPT%^DOapJ$W;=Qjydv7T4_OfAswL!u{pi@po5GJvXU4bNbx*7kIbW6-La4yuB#e zFN?ZcY%R464@A1x$b?6hZCr`xa~LX{){hU?=u<@$$0HDW4HW_bDjtO5vZ^8gcA`$V zBAY4(K*6Hd;t3hqeWVbX`lyCYn1cZH*v-vNri2@=(!Cz7@%9#l)3hdN#O-PuL~s;S zs|{T)8TJJf@2Lqui)}Kqi}S5>%D$X|Nv(Y=RgKFr_D$@9U=BDYtWkF#2=hT8oWE*3 zM(X*-S>Vj*qhTO?`G{*ltO`*(?8|xi$5G5Fz>nZl4vrL;@H)c?gB9#NPOZtvxS$7f zi|N7F-Z0M5WfpbAfJFuDPsz&3Y0JEvo}T_5^cI8B5-+z4TWr<_b-m6$Ly`IlJ52Q> zlNF|2FVTqq4PqGm^1GVM%vPb}tST(goL>NsFp|BCHv5~v3rCl~bFLbLx^W@Kq0OrA zisH*ZVTONPF!bEt0B}LvNIPpa9 z>{r0Evhd(hiGuodb<;`Js)gIucWm(a?}iAlq;iz>%nSBMeTvu7N!ZTl?bSoX)b-V3O%TR(pJ3@9?98`!F!o=EnRo@epRjq@sUT8#80@=ti5VfIGh^y$;S zdOoGD`L6rZ^m^hYY|)b!|L<4{DW0#<{+w2C2k8Q9G5C?_s)g8@@~H(-PEJnx;=@i` z`T+=4N0geS{`0Gwk|*FWhaCU-4+>!#2bx70geAC{HH zsm*Z!n?r*LN$FLN{sjLDRT%D`W^h~C0_W<$o#}29!R&eRYrjdQSY}zD9nRrWJrO_$Sq-N|3cw zyaA@ie^GIxZW6&1Dc`*VfLP4us!PE*D0TaxrVp+m_R0Uqc{^U9@?KNu>0l*cZoMHk znVf7$$7=v;VG(A3@mW&u3(!;U{N)Ak{mYYl{WF-HR*>7)NzsswV+vbv1@ zggk*L%j5#_>cd~3%b)MSl?*-=&r42RjMobr_l2AfVc`GIeo#Vw1h1swzu&X3D(U5K zeoR>q0d8o5oW#<}$w|}D&<>V6{bBg11=+AT1cJrJ zmu7JQvvA!>co}cx@rSftp0RIw58_&U7e?FKE^{&c`2-B!I9HA^dxvrU>U{r&A-#}- zZ^FoqpZ`1jfBR&EJDwli99Ru7THm?TWW=rWTVS%|gm0yWk7Bf7>*lEY-FfhoLTsRm zhwT+aVPVlCXpn4VoFh*C=BSW17%)r|k`}F(g5qQ`@8gLAur02;bLUQ_J}}fRbPvX{ zML}h;2pf}JmxRp-{`?02tpom^PEaV{7!DMI#Z&-i9%5j)0iqxvFf73FcO^f8Fc`Ko zc0;_Z^wBZl{d=|kf6*CW8-;vhE}%fL^}Xoe#u*WpB^w0pLK^BcCKvpk0gMHTnZ(xssB0H>2G zC)lRvkZP9=IlM-&FZ)>%$m2#wjdngE8^w1R#Q%0zYC>6uO5}5DkInu_FTS;zt@a4;OJ=iM8WmG-v zZfFmKmPcCCs6T<5EWPER;z?RqsZk7EwHa0GJzNuxKsCIEOZ7D0#k%#`tl47jJsg3j zc5XQL?9-W$+P|gJdpO8a^l`$#r%#VUz0{tSn)(Io>P#|l34*~iKmkvd^nB`{XU?~u za7Os!mc&Ye({hoH=22qe4b1{OC($WeUWL8G_$SMFacM103ya&!$KtBDA1f7`Px7j@ zi>UkXhkreZLyqrk{-*8@?4)ysafbm!1PYU(?C`KhG`Ea3vi*Q=V)`DyOo4l(=AD`9Nc5 zyf&Vini@w5#+T;jL(s6!j(xkjNGJn~ouhr}W^2<>Xmd4s@EhebR2Ckbh@fFWCT);~ z@vBRMPR~+mzyZ9TDs23J@A(^7!pYGDwyMeJCr1H+acA2@CbRyRbA3GsuD~zp3>igF z+ANP~b#}hz$^I89|DJL7PF%(y@HmV9A*4O|EHz$m|9R~jmMC!nf$l!n)7)OC8Pd^a zYt@x|{uXCT1Z!fNnuR{+%sy=E8|0+~__B;(LLVE!qt(>%VH$LBr~&c5?XEF^?!~^D z(&29h^>2X_Wr(|DBi?XguTDdUD>FU4^G;tj0smdK#KW|1P0~B>GtQj2s@fMfV5H)) z9z~COBxouFg<+4*}x30E>V9D4D+ga!83($u~dWo=8_XXp}fq z3!6NTD9dt=>@*I(V=~I{0!kliFkulWvC(+yFPL!4pAUV*(zjC6=lmMv=S{e1L!hH5 zSSrZvz|R7!uKz?vigy_qykf(`vZ^85P<6V6WTaSi-+JyS!*w57}OO|33kMS0Odn}JagE}S$gktLVsY8s8|Fp?}++Y%4usw|*N_l>HEaP9|7)-$pr z22N-YU&(w1rg=9MYd|q{PRT~8bJ_um*(K`=GDnspb@;b1T`4D-b>890-ji@*$r-GM z+>Hl;HcdR=$2ZY`ucn5MDaXr2O+*a6r{|kL*aWg80{HA(fuWF)MLUn0FjI+z8sl-< zBTF#CrPsAV;y;6K6xBtI`@O)yFT7pDz~_m`!aAhACta@OTxY?Ai2;wk9W0)0jucSi zq0Xv!;%oBHd-{Lti^q5+TW5#CNKIN%&_uakT_ahO#(_<0S;{1xKMU$#vn8XS4g|KtlMmQh_Spg>0G6qUn4(V|zkhqx1Q>rau7 z9$FaAnmKP)pATq2H%u4217TOmE&_&-*3@4Z-Z^apT$P%^(*Hc?yH7xT_lu`YLWaD9 zB{P(OUGT11!h8oSd!18%%~}4GBiQYO9AN}DPJO(`>Rs32r@~acrqI(`WDVYgR~qW-Cr4Spn0g9mfc>LD=jQO8`}`2~`?*j%zo%8qYBU@P_ zeA+rX2$xI$F@F6PDQFl!;;CMNe-oh4>I7h|X9AyIe`KLMRVm@YFYjxAdPsj?o72dP zfAAG;Yy!NKg}`7_qYp;rFz_a5{WVDZe4WHERN*Un#*j$-2$2Tjk#%o={_{UAI{bmx zBHhu*H_i3Hu-T0nX6YHA})uXuNoTRNmV1BF))lcm=|O`wRI2sd`lrTXaldw@v9-p!9FG^O^0aYo&M>&n<6ddsYv3w$vaL+mib!@UNm=^C0N1r ztX^nVyC6?5=^&J1X#u{Uer6I$a&8ALYE?Y6(j~RCv$6_GNHMx zaH)p!SXufF_55Gw5tKvq`IVl&|L1Q^L3MGv-o1A;j^LF+qjL>|DTurGe!G5EHKL*f zHRx^ugGTYM+jyTm{%P0vy{2Gf--pt>^0QFR>-~;2!Rw6?M`ILQ2+j}cwL1N7GXIp< zCv(H#PVLj9|FmGg{p>!Gf>&}KedtdRhxQM$**w!puu>AbXa$aaR?wlpYrw$?o);Qk{)v9WUu~rEltLbs}^%vU#sAtdP|LvUqwdie3 zfp2BS!2kC`X?Z&WmqJNCz4FwYU%p{E9f!-Cowb{Ufd@<7M#mE^a8?>F#goq8mz*hR%TI zuc6v*?;+q<0LmcT$k3i+V1qan0Eh15;(({8T3sOfU8qBLpF8~1gOSUsl;IAG_j53zQrcBo0zj23*q~d& z#0f{}oZN)g?6!uw{{fW9El=%-DCVx8n@|E}(Gg~5cb4AoDU~-Bv_8ICV7wid;7c;X z@Ru}r*IswY98W-(&u&hrZF&caiKV=+EFWJZ87VYez3!%|@6Rb=c;r=Nu6Q-a;{1gL zJOHlpDp9zo!UldPnn{ zhX*E|4}%lWESJPDdsvSaGp7L$EMnbO@;PxXJ$G_Ve_~+eiNSZFYkLV>g5E-%v*)_q zM^%Xd&f53hdLJ+^(+LV_Gx@BG9g4a3V)je>q&|ItK5-yYx5yRaykl6cm`N}b4k3XXFLFH zFH7T&+?36ss8-&PP1%ca2nURqI38sjmx(=nx z?MUb(U?xYxqx6z=$dCE7a046n4Z2DdQ>OK#rKR;FwKM7E#0*tg3$i#Xu~~;MsTSGS zDgmF6{!JFQPiG7Fg_a^hRdDs|*51F4-FM>~SA> zD8BXT(N#rLu?07co{Lt~Ls25Dmp*Lt@4$#ZbGc-YhB>8ZP&OsIY8&QZb3`l6%|Yth zV>zMnTvuX|)c2;R?rK<$?$lS2gr54!yAqQ|BaD=%_cn-S2gG+cZXdg^AS#c(KPN|) zLW_o7(Ti%6R>2yoPx4d-X7Z@KJLc=K4V$DNUwms{S10Cmupgh8BQ`0!_Su!nc#pjr z!FEbVrN{4cia8PoE=N_UD#fU8-y0cvYDpAZ=wG&XK(MGh&`lwSx)FPJ!L{+3GrenH zI@9}&LV{rq@kC^T3;)fY;=umJ1I@=59;E$vW?1tQ^_^=+BO|YrrdW^ainjAe>F+2D zY@I4a)mDKWjZPOX;GC_$Siz87bu;-=M&kf6@TS28|MU76y?CkXUy~ar<;8r|q6zdf z-u2h7XYvUy28stYEuOM{TFO4UznhqxKupnjq;assw#6o4$bFPybRnHs@p`sVC0F;j zBhlR-w?6LINuOIUmFptY(<;BF#wGcFwJ@(&b?+HIZ~2hxe-3wlE({XIAk61q54iic zW9N_THt{5N8U^QLqvN5!9S*-m=09RIdm}4lJY_R0Zwg}As7gKmw!0M~+cg>wQP0iw zw=GcN5DMXpN6a3+L347)`p#fr(2mUCQdwY}jJMx^Ay57v%(Nk+qD9WdcQkJ&_DLo> z&{&r(XhPv=_ikG;6yOS;-m(KL_1JHKEAzBY-28JN?6(8tr>4me&+ED36Q66}?7vz5 zbz5FaisX4=A)!;L+8jJs1-iHJvf=Cv->vPUyrXJ&wzs+(!}it z7__A*yoL^TnpY}no87|=z8lTL;pDPY0bW+w+LuXn@}k;78*vw`^+9`n`hUC-3m;sl zI+F6@kE-R&F-i=r5HRdA?ezc%$thnoPh5#*$a>hGjkaiOYg?>f+iV00-}ASO20%F~ zn4O)KoScargCn!(WuQo{&4G%)9M?!<9fI^YPWnHV|4~dF2zU!tdDYs_!8%A8lwuU0}519aijnkv?^Tx~8-L6z1Wx%^ zulxf({d)C>l0p6MRt;AbcZzYFQ>q#mBc;{pXHa!5Jyprr z7i#k#8`ZBANh0}-sQz6<$?gGLxiaU|<3oSm;(u&p3a^i_nHW}%pOXCdj~Y4+E3#hu z-0$Dti2t*j37?^l{)dZrIqiViPNIuBo*Ue$U(BFGwQJWduZUcLUe>->?3v>8TnP|^ zJV;Yh^WdEy*apxa8Sm&2A43)>8Vecfz!{$(1w-WxNMa8$3cdJSktkV;ptOderEnZce`c?@m9GqEG74p86{f(8 zGS|`J*`)dkApIt)lZ}?`1+IMDO7aN`F`~ooEKQAnFw?#0cEIy}cZK60u$x3duUY@v zw|y$fe5qywl;aQ2d1S-O5{S$Ezm@gB0it*BSXp4117hmP|0;|i|i$w?|OqTAMbiZE22+3tT zWgo5o6z6|^u#%Ul%h$tSX1=kH%xo`!E(BE9I|Xd6UcG8pGCO;Yo14DSFbu)~06%jGy=B%t5x9X*SOZ$OAk8P6^ z6Cn@VXf&OjU+)P1Dz9ByQ#f=oK;yTVD$Nax+;ni);oneVqkYAb*@SO^*Vc)M0xzft zJOsoV*GobX2c3LK8@qsiZVe5B9RdbO^$H%o+Xbvr9-mTtenVm~`re_yKW`~zJGkL6 zy=Tu1{}(sT*Qq|DuFS=aiX5{(~GtZpi`iaKWFxaxd5gnz_ki07CF%o@? z$sA*-iLIEN28i_KQsc)&^eg(P1?H?;5wHHp7`tFsuAVh<=MqhWz)Gc%}O zWv&O%CTlv@W~-jS+x7o-`|MSN7uQJV`=h7un7?v0CR+&itOf6Xqw_=uV|laaRA=d9 zkNXqM6QM1dnkOC6zv4CRWoAQH>>T$*xjBEhnuUse_V-taf~pF6-EAZH;E|o+uPWJa zL^<-(p`p)uu5>14CMF85f-keth?ij2llbJF*A;~*@*S~88L)w#YZ z#k_xI?cTfC6#pZCArMIBLn`-J)0yG-gE$!L6<@a2)i~u?zh>9MlqT!vJgT45ukt30o#R05U-#Dd?3d6D&SkxmpCpespyqyb+jEs%n6>imS z93=J)cpeRojw8PX6b1yFd_*6V`Im>l9-MWb3k7h9&E{kwk7&yk0*limBd$0PTm2_lDohOr57NQ{SZXgN6KIoSn9iaJKOxGn zt9?-TSxF+I_Oa}-Dq3Lve3shiSmHoG5I>^SGUrAcieR=1wT_Q9UE|^)B0Ca;S(?zx zh?JZ|95RK#j#jc|RiPCO!nu|=ZvCDiJcFlmvbjp`-mm-Yt5#xzX>89&vBf&`7tm`j zG(^7+xLR_kH|h?}kScVEuO3|B$o6=jCo>Vb?tMD-_Id6(DRs%Lc+D(*v$EC22Cnzr zF$h3Pw_wvK5J@sp5n6;7ehvwlb zhhI1IMLx;Q)EUya|Mktz5ovZ=s*3%@1jvq!CtEDBhZaVSgzgzRUBu6O?cDF%^Pezhc4jYtZN5JA&x`g1os6c22IHM} z2&r8ljVmQT)c061nS{Xzi7NtqVB15b5PLTX%&Y_m%bETi37hk&(WmwZxWObbFM^_4 zRR@g3C?y4g>(Bhrm+W^DRw_6UQAZ053m|=i%dC=d{M)22Bxwy$wij(hXp=Gr4(igx z=bQjI+30SPC~>vGYwqLk*qo#~68mIj7=BjjJ2NadN0#4)$p5jW`2pX^+iiPxirccL zAcn$L;8$G3G5&s@ZSyN_b`hW zJ8$8L9QK(#H!TVTnZJS3DuwDKqtEXuZ3?Pq2Vet+RLLs;6zFdAC0dUOu?e*Pa37Kyv1lAykvP$6>_Cohahiy%eL}|C&QOlr6$?LEJmk2 zw_Jm@OYhF_{SFRi)bZl(?_vBz55njak81ei_VzKt9VgMq-TdQ6bYG7*;*=zM?7kP` zd5$-hriW8_yKKrhJ4@pj*}cxO<~}yJu$Y1fS|q+vcq9M*c!Y+-WJk7KzQX-(N>&!Gs50~{)n}~&qk^oi?^WlMs6NlHNKLk@#|r*p6W0=Na-R41l3CIg3JcZe zq$}Bfs&Bm>&|8*G1q$8z(*7bxc;Vt9Z}W}WcMpWE#;_z`?uh?_snq!)Bb5^KkoSb=Kh>3BA@yHF7*GN(f@_}$gB2v zExmS)$}PZj3va!n!ewN<0hV7om}QxgNUgS{kF`H}4g3@kkOZIO3?zEn55^coOv4x< z0ze#AK+36U0%M!kYKj-Dz|1!6=m+M1f3=1XOpRK01qMDWa7i4fg$9}xaQBvU9+WN* z1vmnYLI-Jv!UVv5eqnq66bJtFn$n$u>zqwZijzg_r;~h}5#|_JE8RPn1Np}*H28Wf z0^6t!#{1k7B^Mjp9ku!QYx%vQ*yDF*rWu*-Rz`O%h_x?s_9_f*`!1O?bak4|W$akl ze@vG5^9In0L+_JHjubd z#=-BQ!*p0p0%5&^m10Kg<Lg+GKQQsv%I{#tJKg!a`t0^Y6Z6yqZl}zyrwq<@F1Y7pt`9jVAC&bLNs)V6pqy)? z6I8HVUOjl}TJC9~5ndyu_-d)uqbS?n2tPh|=IMIld{6Eix~+A=h1AU1@3ki}x9Fx9 zL@g#SL50urNYG6GRnN3({Ba567>2cb#7QQR4{iFXjn#tw8Mksz*NU|`%Nt$aKiL=_woHU=Ip?YDD=7PTIh#9ytG9|y!#brpJ9Nw>f#*#DE&^Y3VnN4%cvoVCjnI`Ez|`qqDSp;J-NQJGDI#!C zwXTn)#eKfNr*M9FDd|v2(U#^df6)S}%BszG>m5_W($iAs7Q3ZBF+LXGt6Hb$Rnj@& zIw_4y`*xtF)1o~m?=$VZ%|3$1mh5!-s^$ArF_Ey5k!MlmWZ2%-r3Y= zS|jDFGk5Jep;Jk&Hy+uX^SWY^{AE&Gx2$)`Nwa#E*`mE?ZV%ev`z1zmZ!TjLh`t~~5!iLy55vWr9D1QQ`}Nt1V_F@B|vk3K&2LFV_l{fCKjhl+sohfQ#nW>=(Y zy7d0B%=QujM*Uq=H)SjrN}V#Ke6CJd4XhiciiZR1mW%={oljVT#T)Oez`ZYT4^@hH zgM()G@x^0TeJa@((Uvfco7aeq-$-hwk#G-`tvZ$B01L)mur&%8RAK(oVQvi^Z8=AY zLj_K1!(F!3ENT)i(@WhJd^sA10sHnbpLJXQesCYcwM?;cZ*773RJxCxfWq9F7N(iX zd&=+QeK650l|BiE@~^V=@NcTVr|tS~A(Lq=f;AK{pGo-;+P!+U0%NQ)A7m!H{Z)cQ z8p-LXkrJQ%-OAxhAKV&@L5xs$Gt3o!^<*weA-41@Q6y*h(y5w#?}Uwc%18N)KTTgc z^}t*H23@{xB2UxF=DzQpoKDTiS z)Q4nEwlEK<5xbDn0<2Z;elR&;_eke$F+qsnFm4nldOeTiosh0GSA42PZ5tn^Y{3({f1{e96RpXF$-c+mxQ^z#cQ}fpWNZnd zxoyWUufdPq2l`l|MdIfO7uYoD`<^FH#f1b8V=l2pRyu!5L7l!B^tfRo?Rm9jcZn^l zS|_<(#5_SYbCe%CGzkbzbrHUB7aWRxDwi^uyms&NYhW$9>QsSFw|E@va(1xj+QMXJ zYdcMtjr*joN8V{)goobmy;v9#`ux~eVG$KaMs^XWz!q<+I3B`|z37vEEj4x%+h5jR zQe-qp50?;eQk*J0{xw0@7uBCbbrJ<{>W8WVDk&yvG|i1(E=mXf&Vp`r4$0haSo+*! z%Dtf7BhFo@${r}eQ8X=zDdt*;PIE~@7d5rBAPx(kmGW5aTgLi5M)r(#Kecc0y)q~U zFP#z>{%*^fH-1KT^xpI814Djqj5}1|OWKw+B^nbcGs_Oq4B66K@z;(XQ_7|~S>|}r zy$SxWh*e2p{{F9I#vkpAuzSw%y}Vz89q_;nhg5G1ju&Qv|8*+=?`Ul7J`wvdmYKxH1y!Sj~bJ2rvbzl9217rA=oMabwDKc=?Z#<*&bz z45Q(Cc~tMHk(%($-;|+X=~>hT#@AL536P8}7Toi$-}|39bolM%Cx1!Oe)_Ew0A*5N z0?vXbOpiG(>l@g?AJ=$ClSZ-KTBB7hkWHe0 zUQ0v61jr_DU{bMb_;H{sp(flyFaCSJ_a54kCwI2()*HD`x$QsczC%23uQm?rtyca8 zmjCGqNlL-JJihae;o!e50R@#Ug8tMeEB$*8ODClc6`YH~^8WbBAe1$O0&wX6 z-OS&g^Z$iUhU>%;CPVL&uYoM63wC`s<$lsheC)ve_;Vc%N;bCDbI0H9S<`*4tglbTv6G!i(B zI~>!Xak_G`)&{|ffu&!ww^8sh|+}`i%I>>Q^m&B%f@p*T*SR-E*GZI4r@476JSt1+DrU~UsvLX>}{8oA) zfhGXIl-+X$(L2n`36dM@FMK+8Xs*!yd3EKmMFX5Ub|aU3=Ar`Et5W0Du(!o;3RAHh z+Z%*4V>!m$gaJpsmK2G<^bLN7II0jtpFdLZ8JIvwtVQERTm6q&0873QQC!y5A|&4) z2(13cbZKfHa=qw{djZ|7NMPoru}|{)goB<~%-Q#wR{1RBwnME(Pk`7A1VAXr)m<_g8JB(WgA; zX1aI5jOwzpkS$ojHQkXFLv+} z^xSk41%+*C=i2;uXz7{wO26;1h;m-$blg|z3t-QM2q2FiwVG>0yuKw?YLrU7Ks%2^ zX4HH>?e{$u9F{sfR_Y8~_K{&!k7FHgk<^9mkr#b1VR8|Cj{BLN-~l6@TL|_#(xg>zhB|k7G@(Q9GVUkBDnwRX5B+h#g542zqX2gx|Sp@U6>$;Ds5(@ z#_{01w=iJ+7BWV*=s6-(2614>+&MWDN_d|#A?t3gBSTXW0i%;c7M{` z?k?vl5pZ}#e8L71P(dsE`+Id~T<>rQLPG${I{o6+xXC5f$a#=&b%J>Jt2b_nP&j8R zgBr8rO2hz=}7ujV9mt_DvLu9zY%NZV_m3gK1gT z_ulCTaEOQFYs(9enSRr*t=$4EN0@v9hStEyzm(YBt;2lowx3nmLVG)C_1sKEzuUd{ zvjKzBewz(2?k_-+xLhkdDI#lxb2lk_U>U-I83IN@LD-8ZyMWCuheH`YwVYnOa6>%5 zq0tT~uEsDuJKt*?ZQ(`TqqSlzhOmoLreWCY{@FJ+3I-k)2^D9S<`)VW4RWV?!nfQ? z_9i$FOwJqUr4e3j?gl$qL#XJo@f&MGJ(g)Siv*)Ra+@C$GAjqIH01uEH}4FG_b?w^0e=6mI;<=AX05ME0ouY zEd)d=xY=?oA!+VtQiyzDLbgqV#N!qGl`VUxHyN$kF)#aU?AkU}A{ zDk3lBY|2WV#HGAkc1NA#F-`%AkadXEU6<(LZr2UM!%oiB=SDDpQg*jRL+l>$<+s_u z-9sqlF`o-zXmB@B9?f+vbEWeJ$rVt%-UaqMer;?mBj5wX*`n!Ux7|A{IK(_XA<)Wu z4y?8pWi|qn`anXt1&FL6osp>t9^FWbbq$J;7!&Pqk<@sX z3`EkUsiM+ksdtlYmSq5J@1~$|EI`JT#K37UG7YLF`a&? zPyYNs!3{aPzh&UEXMbsk;(vLINg7$>&iRWs+^X_z_EdN;ed7<)q(?=baKNmU?a*V2wKi{F@hT)i#BzKXnxn$IgeWdS z5EFO%xm8)T2*!MDZN-hXg>=NAb!iGZa1mH*+<=>T^Dc!qYqOEW=OPzcmsWVNkxiDv z0WNqVNFxFEjT97(i0nd~JhnE7TcdrABReZRK4bAVU?1ub4Dt;zUkG{)t$5e@Px{E|2gVxqe~nqUw@NC>z3*&~&9KWD$j-@)26pF60ebLl19#z%s#JoY}DL*wOsbVJFll>PZIDB?ptiWuOz1v-dtfWBB` z++(IYjf1Q(F?!d121DXgVKU8h|7Bkv9Oe_qrJjk)+(`)F6z{WLgo$~%pKlUDS>5@4 zu%hQVDsub#dn-KynqY&Ur zj6Fd6SOCHTA^VyoU%kTW=vh@Ywc)t=yKFBuyp6#A|2b0tYB$V8uCwTRHKpU?4^o9{ zoTh=qT315|b{AsrM3eq)=gZy}kd`u(#0feBSq;AFv+ zl9CE9R%0=v%{cf~EDJ()eAI1saiH1(U&*xKP6+I&zceSGvre2(=Ier;i0Ofxs;oU{ zRV+<#3pm7j!J3pSD6D%z-c!B_Qnq~*qEZx%==dBf;;V+YSX)L;w*03Z3JT_jnH+1e z_{p34!aU=b)MXe&Xpi2z&lJG5qVF_FGyU8IaxmU2+$nZ8&+zxRiOh<~zvVf1m}-XM zMz4(A6?S#6%6E!tLzPu)az~2=bvvN#+7wp&<=ay^^&0}r9qqnbAdgxck?Za1&jaNO3YFW-(NJ8-T8YX~LIi|$8*A!%RktWIbVC#q7Xl18+Bab1xu(mv1xjFbwIS-)+7bJiuEii$Q!c~%vD*ciQ}?K# zuvO&R4RGAFk#*nIc1x2iSv{dfq{u4271xMrlDdm znX&)EQzZw_PRr-wQuyAMhYA8&HnPw4PKn)SSakeEI`+g4Tj!WF^*HCy;#4j6CaSV1 zqiZI9El{e9!*(WZ9LTau9s`eM>rH!{SyE4-JY0tvuymq_aj;fyrCcRyp7f{3sN{SceijU&%aor$osi5S1nhMX#IEn!FG z?*F(kNI#Rocf6a2T2G6nL{|Zum3#^#_?3La69h=A*9%tlvG2yn2FYyeUuZwax4kHT zfsAglc}^C(F}?f73B5d{KIxYctR9}@?((kmpN1t2i;KUNK_c#m06`$|8tYSGa^$ft zOV6n~n80n1VR}J0xlyZE(Mq}!#kn)Gk}{bC<>Z2XIEIRyADuXfig&{Hp2-IBj?ky? zA$=c6lS|pz{NSZCPP(X)+m*DvSjX)omq^(R*YNy+Ygio`9iQI2z;mGM)gooKbwl}5 z*|akX;jec1<}V$4ih=XQ1TPfU9(iMHf6 zJ-g02zL8A$I%j{VIuj3{cgeqcwxp-8Dpj)~y@9MIm%s+GS-&ZRBT7fyH~RgVCA}eg zlnM{lYFk?~y2l=)8{2K9OWF)gSg&k7a--)~K^Xmc5}{XP1aaSvG?~J+9v2f#zl34A zF2k$Ttd<+*>Qdgls<*Slu)Fre@IF5rB%QXrD^yi+X{wN2KuEf$eXl`RIf3MIK{NOj zN+rx;P)XrRODOA(i;zQ4Yg0ZJ{TTC9Q&`ektb4{$YDb-P?%1u%4ObiUP^}v85rRsN z#q%p4w4cmykWFXldZk;gxD;c&NlCOxT>-}@=iuA7Tzy+W0( zht#%etiGydBH3wqHiE}%KIAI(MZE>?>KWPDg;KcF5+$WO>r7mqb8h3ZuS&6|XjY2q zy@V1c(o@1)&qUO36MPV#m2Az9q09~Dd}626;ORQV?c+|EWs9JnN%j;Kau0kH!1Z81 z@5xfhHrmpG&pa7B%ZL2AOS2U>;zI{>+BaVqy5;Q8dRvz5;ZO?GUaN~fhAmD`?3ZYY z=_;RjY9qkRMzXUxc&D3IJ55*3YOarFCSPWDk^hNtN#VH;O*fVPB3x1n2QfRaRWL-f zU1JGrnEbj{EOI$Xk4!%9ndJRQYbIJhyF2@|&JCxBeU2C0W8Biahv*oP{Z!jx2xgMm)??QLbra)zAUT|m17v@YVOg)oWMO7*jvQC zWr*KvFi|udu%zPHRIac__V?d05bORbQ4^POk`=s+FyqZ6`lw4p`eE0sQP(r+O3U&x z;U~I3Ohy}|bJmjLkC;ukPPHub?&s(m3+ukZjwx{~+cO-MT~JE%xFOv2KoF^5+OAsk zF={|Zd0aTn{$Sr&ejSRCe<&e`(lFc=^&_(O6}w2M8ZXG#6g*OsBfeIJpkSnii-4JL zE2e11wQM^Hv2vp`*a7*XbFU9&SLBC?T|2hdm2ykh+qi*BvYa~qJVxd-ej^0sFix$= zlrK=my4t4MyiFzi9PfFIo;j;Pug04(NqI(U1YMdnd}wZzA-b=XBpY=)B;C38z*QlX zzmjb_{%#7%Jm$4pZdK}Z1VK)Z_LPWi>*WZaNorMIuldHyXi2*B-s4Hr7Ae!2+690B}S|S6;6cowe3V>H#mtQh)1$h%>i$5PEx<4fwzHkdXIk zg)LUPtE!Kb6<{E8s#RPwD;Z;}j#ZoNl;)LeF7h(8q=h_*u&ftg)%Wq)*j%5(aEQ*? zNheb5z`E(IX>w~Z?4oqrlBJUG?ogq)uwjIqQX-yNuez1`VB|+5i`ZwX3tQCPU|R5m?G9ebp0XlMfK!|k zOxN0qM8HSj``0s*N9sl`;C*{Z2soawVm1B7pI2PNqxe)Ynfl7WbwTd-rK{Lu8B|j4 zLa$cbZTE%2n%Q<$F zHo+jQ6Q);^HI~Qm5-iW&^DJ5Z2#~eMAo-n>5DIt`fMai*$s`9Nwy&`TnwlK<3%7xk zJ+p%)WS}b9&5HTQVmk0I2@_YIc7(K%w3yr$j!G0bH5P*gq3P+Y{!2abXR3|$hw&H^ zm%HMHL29DRtaxT{wZr8hD2K&ng6~aVD?|)EE!wiO#W6giIuFL3Z44tlqe$@zZYq4( zg7wD5`hxDowPS>XP9l*SE00tt4_?C)G9kbz9oPkl1JJC^Ym>tDUC%tIn;v1aY! z_L)4JMGCT|t3=;Ny&l@!MR(DoBP-1Dm-Ibj3I@C&mJo!9MAB!k@m@mK97#Fh`b)Su2&#yJEuGVw6bP zPAzJ%rAf|h8d}aI9IdIjLHj<=OuGglaV;_n-bU-HV239hQZrx!PmJkdsOYS~Ck8kh-L6_A-WRmCGeEjVbChK4jA_WseiGi= z+=em4`R_%uD{k>R?H`#*cwJXkHX~iui?%>%EN6HdxPV)H#Q2MD6iu1tP|BXwBiHaa z!AF~64(Ih<`oS7u3MPNZn(|}ZASF3x4<0yPH|QFvPBK*8EWJ!!cJ?KqHT;}d!wIqX z>~){><@-3Yt*;_RN2U$c%1aj~WTomfCxc+*d%tVc-9u=4>KdX^{ei0`*K^%bh0Co9 zk94qOl5(V+P`XHmbLkJ?AY~1qI74&{-ErAE#;xpNvoxbfNm?SgG0dT(4aP~%G5Sy2 z?Kqr3esl>C#8PX?)?Fd--od~sIQ&ExkHb-;FN8cKpIn2o=eFls&p>H}waB|0p5p#C z$4vRp-oTF<>yE_JCdncr?j_)yW}?6>*PTK& z>)wpm`nu+tB^r&!F<{D)d`sD&{Hp0iEEioJ6XR);m)lIH4x2rHb`%m8rC(N7m^F4x zK9@pt<|}S@miaE%>ft|Pwpazq&rJ7_(wL>POJ`+s&M6B&O=D1QAU5H1buw_enFz8Z zDy+fuEF)^i32zN@*9WErI|(phv;va8eus}pJ&b?SDziAih1GCFMqn0#bDxv2Kzb>f zbhErp{E3|wt`b2@epvKuO&IC%MyYcqS@4^`%jvKx?D}9a^X!N&tbTc%HY?bGWrDwl zNV~+W1>4zM_nC~%L$47N`(*T8v`%@nm`CYm$2QoA2-k~^^(xr6s$6$It&(k^A>3Ow zv0I=cTyAw+Yo7qVykvc}hoi%dWU*-!0B1(w9M^?%05F7c>-T0RF0yCK;K>(kv5kb8 z6&K#H04^5?vtrzOBW0@59#KXv@wmNd1rdrdZNep7S@Y}h^9PFTBE3;Z#w)M%>8Ddk z^+;$ON>dtt9m0(*`n;eUguJwiu|h3p`xY_+?z^-t>AF{Nr!z(>ChGay;U}e*e^?*i zpD5Huk*^SaeqZv-e=Ir2!i!vq<#&5R!r4~Ei(jF>tB+@inpIf7iDYDjLgQ|cG4>oP_0iOcO@(T)A315yGJq>w*EQVIuIS1%oGJs)&9WV@0f`xK z9SPv_3s>i4xVEIF<9L&lEqiI9_=UYyL9Z6KV%1AjdRvJ~gHSV8k8?ppIX8?D$qz1- zULV2Ef+0GIr(UwRzI8!6nlo~$?7~PyPxocKuIWU*K+CF{@8p*&*yCr?w`$IY)OnVp z-+#0as^h6z?ybmMXe?+ANbjmlxEp_^c#P8dN9)Hoev<0pZV@7s_olU~`o2uZ#TRI^ zt#evw?ypj7S+K;ho5m)ol09Z{Rlcqxbx46LETiv(x7%av+N<-6MtbU0LE%d>xwAb* ziABqwl)XcuLqvhM!@*BngH6A@~PLN zT*Tw#T-b{Zn$cgZ*$%byyc(x7J8_H zxR%Zib3@&8u~x5a-`EJN200KYmaVG_yzZ@2F9L(Y^ssOGeJ^e8*Ti$jLVvLs;nk!t z&mxwl25a3NrE_YS(X`kYJz<-vr#X8`@n)t6!A^#SN0R9#iynoFL0L~Umm)f9fnagj zU2)=z&fSl}$NDXFw~9&T(a|ByqpR_s1mXtnbvzf1B!q87O#0y0C+)@2y|bdL1qX)h zO;Do5>AT|c6^<%ZpF#3%4CBXhu_2kXz8ScpE6J~iTi)fBP^dIh=98nES)}o=RN)+7 zRM{DQwDq`@4CDJ4P4osy6mN&^(Ib)wwo`qq+yl{yey!^I*r(&J)2ks%x!r>mpGylRU&@&?cG@U$N#To5OUT3Utt!4Ro&<%N z(b%IAe)nUFCIcBc#Cq%a@PjU>hcTkR$Ygu_l)SeMKRrH&Cj}l6>{XQgyJ0zN@w9X+lZn{4AS&6MViNi0kSjCA)oD1w{hj(f} zp=*)uJGuc7?jjuSDwjWx(rd3A3p_ilR^^LZSC$wAM>OpZ0h`%(;H{rf)55A0v@<@y z9U6nC_nC0EH}#IL-)d{7HG0geQbY&!Bxc52#;tFOv8&hgQD!XxjENpwUhN>p&)7g~ zP-R)aIqrQ-JDSI~Vs0g7+OC14+^DOlPIv&Nb81G$P>q|StOV(!+#!sh){EN9!b=!c zcFYZS!rGuO{_h2GE>`<}#+U85-XBQlCYT<&?2+&U?D!lb0pEV!(0UlMd=2X~??Rni6Oo7n z@Q__vXLe6j3(^iq?md5S2iPMgo`g;)XN?hemONq86&W-?@Psf3z6A^J;tvPpU2a8@ z$C|77#CUkb#xL#`NmTBJUP$Q6HY>l?*w%-g060Y-jbAl|DNy<(KSdGn_nB^0adv0( zk<&jPHT>S6QyfF1jz&*m=#vRwT0(a>B6-)Y-D{Tz4U5Ni9};}lj@50rp-j4NfelWs zPH1Q_tXu;BJtu|KaHYPc>~iBi@8I@X)&)DP0udyIeJ)ML&>3=2Z#D>BxGA&!UkGLw;@1 zjgYqP*YIf?LAK2|5L;L$3B#&sY()@?bv!98o_X&`-#b_w%+-*<0tpy`IAH9|(sRZ- zInJ@W#UJ0;$z`#yN^@TYSoNG?uV)!(pRjN+*JCCME784w3wc>vE&%IfCp&V zJCP4q=#sUNM0lP+vRa-NNnpK~b8xCd&;F@RF2Y_w%&446?m#41Rt(MY0*G5ILAGJN zaZY>_vep$-wFVy*Rm+(EWFszYYeGzZ_xL%v`u}35}Ev} zFb@3&$AFs-)%RD44pT&#M@~Osc9DOt|0IKL3 zfx!i)bNX!u){um_9~@?%z38`M^pVTEC9-^#zbbXp0h5%d$sqF9q3@&Ljc`Mx5mUC~ zJX*4Gn{)p8?-0+(M@M{?>4~n zM@_VtBoQO1fnvQ(GWo*iz20^WUz3&{e2L|G6I8P9w755KIoxSsTpAY;e_m+ix`C%w ziHfu5XGhn}C%65Tm^OPK$8*ikH#W4+Ljug9bg)hJWWmC%);h7a7bgaMRUk7{gM~h; zm&9O@Vq9W5T<2JBNi@s)94Uu4vuj#a&rRRq*~gN(VLV}fwjazjziz5z>9vK3WFENY z=JF9gNhTpi(Th{4E&n-0*Ntcl^o1q5>j?*Z?X)s8DC|Z#vqk01l+!vagT}*%?d2Uu z2KtwiUfbAwHh~E`{rqu(W|+&D7NQh2q2rjSkRXl@_+Cig9~-<`Q`mc+rG+yVvPW+_ zo6pi&3z)zR>uh9AOd0z!mW!cHRi@g`Pt5y>aw+{`kQF0=7uau7dZqk1|V z%t3v}Ps-CiFR8mCvAy6(6U&0gApLpo!J$Y4F##R)1E97Jyg6Tgp~5Ca*@saLnN@4> z#!ik@)?-a@W;|9BoUu(UyrA|{L6!2EGmpJTTBMn_t81qoL|qOUu;KjZHWhs;cG)4= z6Q)zU;%q<1FARdO?45$iH}h`E^*GyPeR8y(UT={2YMR#e%mxwuZlo_Hd%~)&btAmc z7NM*xvDnT%nu$Sz!t#8gtHzBC!34$KZL-Qe_EtD_odo)TDvb=)~<@f@ovBsjpH*=t}??a=iha>{LdAji$EzOYx>EIX_xYg%QDDYGq46l(Th`UH}# z%D7fA`=wku_-xN$F>S7u`>s1xy`UdT50{LtJ@aI+>u3uno0WS`-s2qTms;V$JivVb zgUT2_!qSp%k%VZVEoc%~+ID5?T=9*2!@1NRI36}&Im``TrH*4k?>b{?#(}2XoLY3x z1_)@XMB6*^KpPHm1RdIhVd~4wuqrKYDY^D?*l9}5!7ay3Q!(o73+X#m>SW$?9f6cA z7?u6x;*=+7ersKUWIFE6Ys7 zVHDGBiLf2LioqB-nOLi=yqGD;>l9Oxq%|UIA3Kt2GI8u-$zEKXLnkybUeEQ$lbF=p z2G&P}t)P{e3(bN4`6o;r<~Oi$X(nEZZ_%EuQ;+#$@6L@U5w;#`dfX1}upFr|a}!x^ z;E*opjeE>RoWEt;C!HK1o$h`em!uuemfb@staK=+%Q{H6E`W=p;AzLA4puxxD4|2< z%l6aHZ=H^JN}BfGOpA22u=YO6bPaD7yJgf}V!JI&i)%C46Y%mI#Zy5Jo`lE@@Rk z-@3c8aw)}rW=t@4IjP*HgJoI7RE@)rizdO9j6WIeFql|XV;;SIZ(m`?*VjPu zy2Rx)e^HE44WByt6hxrPF;w{!oS*Hu$Mq(y`Os-CkHfg69YR7aR1MNI)K!Z3N)Dx& z(8|Opp{d5%^_Z$FT$VAxrH=*~ZkKt-q(lwr;_Z^PwkJK5iBmr~q&O~LU-dPFGYG$v zF9j)ux&!a_z?>f~8`qQwTb5^U`dEu1v@p7%aBNQT~5-KKz$Z=31how;GW1P~SZS!X9AcagIgN_QZb@aM z=)_3cXcvQ6;S=V&f8Y1*%v8JI|DWq}UGK&3@E)J{d7t0?+_zcW?2PuZN8zjbId=}K zn(z)-JoS)eyWPu`V7ndejofRQxw7U(WuHfVSEa}e9EmR~M=Pk;U2Q*UDC;91*E5-T z=irmg8Aoigi;9s$(aWA5_6i-}9HUjEsnU{LaK!g=NbY0y9HqgTujZW^(!GyQyQem? z101hZdbXtWt-wV7c4wK5xU}Y3e7Rv9^3(kSNF;!FIgmw_BR$Ch+Zh5#&=(~Jlss4~ z8w(`<2YyM4NU0Moaec-+Fle{AFt1}K-E>~A^S<+02{P1XdN~iiv+#hzJuGCl4PonEmCy{_~gk47$kHxR+T={_=KQ zGdy2fBMvxo=4pQCHbh_BS;Y6*H2Oq<5XBX@61q z|Gt8xA}SgmcIA=TUp0`prb`og#A+3}pSAtZ8j7G3@_t(#>niyFk6J&H(sj|J*&|Jpj}@G1b>61wI<$A+c$DYslMD+t$=I~(o) z`15t|x%?jbSV)!<)A6V*H|u*{O5Mho7%XfA+_`nE`m-t5LrQYu7UYdEkjNotavw{XYlEwMY zLt)fCBJX4WL)|NXH_Rl5IQpFUKyPQkbH=ZW6F$pM_C6P|#4jyEbZi_r10t{&N3coY zjIbEU;?q#)HHV;f1`ZeNcfEtB`4%QO7J^W9$Zb*pgz7<~mJxW&)s91`{l~o!Cws7J z01#k^Tbe6|z5i(l=$phazdeagSvF@7-!uu00!VfX#C*%x*&oLGUg$wR+<8D+0*Er> zyX+U93Ox>^CBF6d0K<~U<`fqcY^{#~om2b4J98oG85>yN%w! zeH?Z+{U<`8%?okBU>YMDwoZpYD)&q#(6)im)fe;$=TfXhFO_Cuc9h`P5Rr2q@JdlH zm-c}p;~vBV785eo%&}$lIM^wpy3vS_2Ubnzrgz4-sQ_d){+c(vBd};B0K!>sAtZ4I z(kq$n41U#7P@QpCPn18t5yzc7p$72-B0}px#;W2`6&#BUM(Sc2tr@=pKzbHQtVCE+ zj$m34n@jcbZOO7d^oAj~@T3a9*ITg2)<_xk1z>R1prxsP1{z*9uIJaD-);lq{Wm0vb@kjFieB3o0oHq)4-qJT-ylnMb#nw zHu$^f5tRw8afiGx-qe`ukv6G)i0C+GS|@T%B(y1=os)kw{Q#BVI)H{2L0RNTlB(mP zWfJ1e29CMyKuf!3nP1hNBH-x0?hXxd?QcAN#z|K$p4tSv*{-XrU|=J~y@hfK?Y-LCthKRK;S%a4)*r@D2soJoCbX*`m3c%^(FZ^#R~|^X zHE>e>J+R*TtKw7;X1j*At;m1sx`fe)MCToE0;^JqjHKs@Yc;o53d|I_lP){H?C2yt z?6{sSe{)D17B>#&F2d^P6pA{{wD?{_$pkc9dy-yUp)!IXRkHp!UnF`A0aRoz70pVR zH^<&pO)K9Aq`>DIWqMk&?JH_P&0KhFZ%FQ)mWJema`KSYaSGF>Jz-}gyc+<~2CLwl zGvzft4A$(v5cD$S`|i_fahe8GAkC=zPL96~h)XKI#NP1L=-6OCe{8iKNfKlrU23cq zO8i^0)+^<6R}&EgMAtv`*1>@+{lm0*p%Y9&Ou6m$2^M{mRQwgV_^mfpkfowEn*Y1G z>cw;S{GS)J+C?p|+V~s3CxGk~_U?Jwdt5pQ>}CX29`(Z+&}@*}+#7|Yy}mM`YYs>v!BA~mT{Rd%Uho1@g^6)2iO%BK&|v_yvL;joT2O0dI6Sf^wUl#wpTpj zyt**A?P;O=(W>ADLftI=(kUW*dbqV^{)n2uZhK#o)PWLe_S>Z6Spf$3E0kJps^DvV zI2h?QpwOH|r9)z_?4s)`|7O-P0$K~?<(RHpx#p;AvG=B-%3Cp|O)OfKte_3zlFmu+ zmZ(l5Za}!H+@DZn_v;6Mcpr14!z9zm?hKIRTc8!>0~6F8_XN5QKJHRCoXf8uN>--| z|5<*$F>`~&)((hMa{n3BSdaL$6Spst-zF3mERYt-%}JXU^zvwWZSl8v(w)7RBws@= z@=@76H6Wjge$kVTr1sV+1lE0FP~F*y)!&1mODk+ZtZ68 z#sk_{87s3PYcE{JVCj!3joB*vO%w&|S(0=n#nF<#+PuFO$8bk&O?{=?tu&on!LW|H zK)|G1FDbd?IiJaM$+wWwk+p6M?1fjdT-nbv$No3}TO-Ze4m~lKqjDTFy)7qL(^?`4 z`kSRRXvv94`96 zvE+xW6AYuIbWRRkw^&;{$CO|5h-!5Q%tEgBFak2VaD>j&Js)8t383Tkt&4qR{r7XNKcEJgsyhkNbj@d4GuS<{kepCfkiPGe{$o{ zTVltlsKJ8U{_g2L;Zp{AsYCbR#-qIO77vn8{kSq>T88lzImW#?89uG0)YcyWa`m7Y37dw&jhZU|#S!w~_HUo6vRc+N~O_`=f6h9kd8TCi6;B^|p zZ!8O7O3f`0xW{OCFyUvbkG`{eoTVzX{sp(=u3;IRKAYNX zgxe-;9?5pZ>2uTNQ=i-=RG<6yIDMLaw|c(tUBVX|Va;~^-**D extends Learning imple timestamp++; timestampCurrentEpisode++; // TODO: more sophisticated way to check convergence - if(timestampCurrentEpisode > 300000){ + if(timestampCurrentEpisode > 50000) { converged = true; // t File file = new File(DinoSampling.FILE_NAME); diff --git a/src/main/java/evironment/jumpingDino/DinoWorld.java b/src/main/java/evironment/jumpingDino/DinoWorld.java index 06bb60f..5b60cd7 100644 --- a/src/main/java/evironment/jumpingDino/DinoWorld.java +++ b/src/main/java/evironment/jumpingDino/DinoWorld.java @@ -44,7 +44,7 @@ public class DinoWorld implements Environment, Visualizable { @Override public StepResultEnvironment step(DinoAction action) { boolean done = false; - int reward = 0; + int reward = 1; if(action == DinoAction.JUMP){ dino.jump(); @@ -68,7 +68,7 @@ public class DinoWorld implements Environment, Visualizable { spawnNewObstacle(); } if(ranIntoObstacle()) { - reward = -1; + reward = 0; done = true; } diff --git a/src/main/java/example/DinoSampling.java b/src/main/java/example/DinoSampling.java index 12fcdbc..33d02dd 100644 --- a/src/main/java/example/DinoSampling.java +++ b/src/main/java/example/DinoSampling.java @@ -3,10 +3,8 @@ package example; import core.RNG; import core.algo.Method; import core.controller.RLController; -import core.controller.RLControllerGUI; import evironment.jumpingDino.DinoAction; import evironment.jumpingDino.DinoWorld; -import evironment.jumpingDino.DinoWorldAdvanced; import java.io.File; import java.io.IOException; @@ -16,7 +14,7 @@ import java.nio.file.StandardOpenOption; public class DinoSampling { public static final float f =0.05f; - public static final String FILE_NAME = "converge.txt"; + public static final String FILE_NAME = "convergence.txt"; public static void main(String[] args) { File file = new File(FILE_NAME); try { @@ -24,24 +22,24 @@ public class DinoSampling { } catch (IOException e) { e.printStackTrace(); } - for(float f = 0.05f; f <=1.003 ; f+=0.05f) { + for(float f = 0.06f; f <= 1.003; f += 0.05f) { try { Files.writeString(Path.of(file.getPath()), f + ",", StandardOpenOption.APPEND); } catch (IOException e) { e.printStackTrace(); } - for (int i = 1; i <= 100; i++) { + for(int i = 1; i <= 10; i++) { System.out.println("seed: " + i * 13); - RNG.setSeed(i * 13); + RNG.setSeed(i * 17); RLController rl = new RLController<>( - new DinoWorldAdvanced(), - Method.Q_LEARNING_OFF_POLICY_CONTROL, + new DinoWorld(), + Method.MC_CONTROL_EVERY_VISIT, DinoAction.values()); rl.setDelay(0); - rl.setDiscountFactor(0.99f); + rl.setDiscountFactor(1f); rl.setEpsilon(f); - rl.setLearningRate(0.9f); + rl.setLearningRate(1f); rl.setNrOfEpisodes(400000); rl.start(); } From 3bdcbb39bcd5505b4002f0b6e3ee739f5effe039 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20L=C3=B6wenstrom?= Date: Thu, 2 Apr 2020 18:45:36 +0200 Subject: [PATCH 3/3] reset DinoSampling to advanced Every Visit --- ...veryVisitMC.png => SimpleNoJumpEveryVisitMCA.png | Bin src/main/java/example/DinoSampling.java | 12 ++++++------ 2 files changed, 6 insertions(+), 6 deletions(-) rename SimpleNoJumpEveryVisitMC.png => SimpleNoJumpEveryVisitMCA.png (100%) diff --git a/SimpleNoJumpEveryVisitMC.png b/SimpleNoJumpEveryVisitMCA.png similarity index 100% rename from SimpleNoJumpEveryVisitMC.png rename to SimpleNoJumpEveryVisitMCA.png diff --git a/src/main/java/example/DinoSampling.java b/src/main/java/example/DinoSampling.java index 33d02dd..a4ed314 100644 --- a/src/main/java/example/DinoSampling.java +++ b/src/main/java/example/DinoSampling.java @@ -4,7 +4,7 @@ import core.RNG; import core.algo.Method; import core.controller.RLController; import evironment.jumpingDino.DinoAction; -import evironment.jumpingDino.DinoWorld; +import evironment.jumpingDino.DinoWorldAdvanced; import java.io.File; import java.io.IOException; @@ -14,7 +14,7 @@ import java.nio.file.StandardOpenOption; public class DinoSampling { public static final float f =0.05f; - public static final String FILE_NAME = "convergence.txt"; + public static final String FILE_NAME = "advancedEveryVisit.txt"; public static void main(String[] args) { File file = new File(FILE_NAME); try { @@ -22,18 +22,18 @@ public class DinoSampling { } catch (IOException e) { e.printStackTrace(); } - for(float f = 0.06f; f <= 1.003; f += 0.05f) { + for(float f = 0.05f; f <= 1.003; f += 0.05f) { try { Files.writeString(Path.of(file.getPath()), f + ",", StandardOpenOption.APPEND); } catch (IOException e) { e.printStackTrace(); } - for(int i = 1; i <= 10; i++) { + for(int i = 1; i <= 100; i++) { System.out.println("seed: " + i * 13); - RNG.setSeed(i * 17); + RNG.setSeed(i * 13); RLController rl = new RLController<>( - new DinoWorld(), + new DinoWorldAdvanced(), Method.MC_CONTROL_EVERY_VISIT, DinoAction.values()); rl.setDelay(0);