From e85c7d8e5003937b6c00545ba4805d123668bb32 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 26 Sep 2017 14:19:35 -0400 Subject: [PATCH] Minor fixes and balance changes --- build.gradle | 2 +- core/src/io/anuke/mindustry/UI.java | 3 + core/src/io/anuke/mindustry/io/SaveIO.java | 11 ++++ .../io/anuke/mindustry/resource/Recipe.java | 60 +++++++++--------- .../src/io/anuke/mindustry/ui/LoadDialog.java | 11 +++- .../src/io/anuke/mindustry/ui/SaveDialog.java | 14 ++-- .../mindustry/world/blocks/types/Drill.java | 2 +- .../world/blocks/types/RepairTurret.java | 4 +- desktop/mindustry-saves/0.mins | Bin 5089 -> 6955 bytes .../mindustry/desktop/DesktopLauncher.java | 2 +- 10 files changed, 68 insertions(+), 41 deletions(-) diff --git a/build.gradle b/build.gradle index 356a58ccfa..356935d1f9 100644 --- a/build.gradle +++ b/build.gradle @@ -79,7 +79,7 @@ project(":core") { apply plugin: "java" dependencies { - compile 'com.github.anuken:ucore:f77bdb38e4' + compile 'com.github.anuken:ucore:5633a3df2f' compile "com.badlogicgames.gdx:gdx:$gdxVersion" compile "com.badlogicgames.gdx:gdx-ai:1.8.1" } diff --git a/core/src/io/anuke/mindustry/UI.java b/core/src/io/anuke/mindustry/UI.java index 11c9c129cf..9bbe03a06a 100644 --- a/core/src/io/anuke/mindustry/UI.java +++ b/core/src/io/anuke/mindustry/UI.java @@ -55,6 +55,9 @@ public class UI extends SceneModule{ skin.font().setUseIntegerPositions(false); skin.font().getData().setScale(Vars.fontscale); + skin.font().getData().down += 4f; + skin.font().getData().lineHeight -= 2f; + TooltipManager.getInstance().animations = false; Dialog.closePadR = -1; diff --git a/core/src/io/anuke/mindustry/io/SaveIO.java b/core/src/io/anuke/mindustry/io/SaveIO.java index a65eef4d87..5f360e9841 100644 --- a/core/src/io/anuke/mindustry/io/SaveIO.java +++ b/core/src/io/anuke/mindustry/io/SaveIO.java @@ -132,6 +132,17 @@ public class SaveIO{ } } + public static int getWave(int slot){ + + try(DataInputStream stream = new DataInputStream(fileFor(slot).read())){ + stream.readInt(); + stream.readLong(); + return stream.readInt(); + }catch (IOException e){ + throw new RuntimeException(e); + } + } + public static FileHandle fileFor(int slot){ return Gdx.files.local("mindustry-saves/" + slot + ".mins"); } diff --git a/core/src/io/anuke/mindustry/resource/Recipe.java b/core/src/io/anuke/mindustry/resource/Recipe.java index 7492fbc09c..335be66618 100644 --- a/core/src/io/anuke/mindustry/resource/Recipe.java +++ b/core/src/io/anuke/mindustry/resource/Recipe.java @@ -10,44 +10,44 @@ import io.anuke.mindustry.world.blocks.ProductionBlocks; import io.anuke.mindustry.world.blocks.WeaponBlocks; public enum Recipe{ - stonewall(distribution, Blocks.stonewall, stack(Item.stone, 5)), - ironwall(distribution, Blocks.ironwall, stack(Item.iron, 5)), - steelwall(distribution, Blocks.steelwall, stack(Item.steel, 5)), - titaniumwall(distribution, Blocks.titaniumwall, stack(Item.titanium, 5)), - duriumwall(distribution, Blocks.diriumwall, stack(Item.dirium, 5)), - compositewall(distribution, Blocks.compositewall, stack(Item.dirium, 5), stack(Item.titanium, 5), stack(Item.steel, 5), stack(Item.iron, 5)), + stonewall(distribution, Blocks.stonewall, stack(Item.stone, 2)), + ironwall(distribution, Blocks.ironwall, stack(Item.iron, 2)), + steelwall(distribution, Blocks.steelwall, stack(Item.steel, 2)), + titaniumwall(distribution, Blocks.titaniumwall, stack(Item.titanium, 2)), + duriumwall(distribution, Blocks.diriumwall, stack(Item.dirium, 2)), + compositewall(distribution, Blocks.compositewall, stack(Item.dirium, 2), stack(Item.titanium, 2), stack(Item.steel, 2), stack(Item.iron, 2)), conveyor(distribution, ProductionBlocks.conveyor, stack(Item.stone, 1)), fastconveyor(distribution, ProductionBlocks.steelconveyor, stack(Item.steel, 1)), - router(distribution, ProductionBlocks.router, stack(Item.stone, 3)), - junction(distribution, ProductionBlocks.junction, stack(Item.iron, 5)), + router(distribution, ProductionBlocks.router, stack(Item.stone, 2)), + junction(distribution, ProductionBlocks.junction, stack(Item.iron, 2)), - turret(defense, WeaponBlocks.turret, stack(Item.stone, 6)), - dturret(defense, WeaponBlocks.doubleturret, stack(Item.stone, 12)), - machineturret(defense, WeaponBlocks.machineturret, stack(Item.iron, 15), stack(Item.stone, 20)), - shotgunturret(defense, WeaponBlocks.shotgunturret, stack(Item.iron, 18), stack(Item.stone, 20)), - flameturret(defense, WeaponBlocks.flameturret, stack(Item.iron, 25), stack(Item.steel, 18)), - sniperturret(defense, WeaponBlocks.sniperturret, stack(Item.iron, 30), stack(Item.steel, 20)), - laserturret(defense, WeaponBlocks.laserturret, stack(Item.steel, 20), stack(Item.titanium, 20)), - mortarturret(defense, WeaponBlocks.mortarturret, stack(Item.steel, 40), stack(Item.titanium, 30)), - teslaturret(defense, WeaponBlocks.teslaturret, stack(Item.steel, 20), stack(Item.titanium, 30), stack(Item.dirium, 30)), - plasmaturret(defense, WeaponBlocks.plasmaturret, stack(Item.steel, 20), stack(Item.titanium, 20), stack(Item.dirium, 30)), + turret(defense, WeaponBlocks.turret, stack(Item.stone, 3)), + dturret(defense, WeaponBlocks.doubleturret, stack(Item.stone, 6)), + machineturret(defense, WeaponBlocks.machineturret, stack(Item.iron, 7), stack(Item.stone, 10)), + shotgunturret(defense, WeaponBlocks.shotgunturret, stack(Item.iron, 9), stack(Item.stone, 10)), + flameturret(defense, WeaponBlocks.flameturret, stack(Item.iron, 12), stack(Item.steel, 9)), + sniperturret(defense, WeaponBlocks.sniperturret, stack(Item.iron, 15), stack(Item.steel, 10)), + laserturret(defense, WeaponBlocks.laserturret, stack(Item.steel, 10), stack(Item.titanium, 10)), + mortarturret(defense, WeaponBlocks.mortarturret, stack(Item.steel, 20), stack(Item.titanium, 15)), + teslaturret(defense, WeaponBlocks.teslaturret, stack(Item.steel, 10), stack(Item.titanium, 15), stack(Item.dirium, 15)), + plasmaturret(defense, WeaponBlocks.plasmaturret, stack(Item.steel, 10), stack(Item.titanium, 10), stack(Item.dirium, 15)), - healturret(defense, WeaponBlocks.repairturret, stack(Item.iron, 50)), - megahealturret(defense, WeaponBlocks.megarepairturret, stack(Item.iron, 30), stack(Item.steel, 50)), + healturret(defense, WeaponBlocks.repairturret, stack(Item.iron, 25)), + megahealturret(defense, WeaponBlocks.megarepairturret, stack(Item.iron, 15), stack(Item.steel, 25)), - drill(production, ProductionBlocks.stonedrill, stack(Item.stone, 6)), - irondrill(production, ProductionBlocks.irondrill, stack(Item.stone, 40)), - coaldrill(production, ProductionBlocks.coaldrill, stack(Item.stone, 40), stack(Item.iron, 40)), + drill(production, ProductionBlocks.stonedrill, stack(Item.stone, 16)), + irondrill(production, ProductionBlocks.irondrill, stack(Item.stone, 25)), + coaldrill(production, ProductionBlocks.coaldrill, stack(Item.stone, 25), stack(Item.iron, 40)), titaniumdrill(production, ProductionBlocks.titaniumdrill, stack(Item.iron, 40), stack(Item.steel, 40)), - smelter(production, ProductionBlocks.smelter, stack(Item.stone, 80), stack(Item.iron, 80)), - crucible(production, ProductionBlocks.crucible, stack(Item.titanium, 80), stack(Item.steel, 80)), - coalpurifier(production, ProductionBlocks.coalpurifier, stack(Item.steel, 20), stack(Item.iron, 20)), - titaniumpurifier(production, ProductionBlocks.titaniumpurifier, stack(Item.steel, 60), stack(Item.iron, 60)), - omnidrill(production, ProductionBlocks.omnidrill, stack(Item.titanium, 40), stack(Item.dirium, 40)), + smelter(production, ProductionBlocks.smelter, stack(Item.stone, 40), stack(Item.iron, 40)), + crucible(production, ProductionBlocks.crucible, stack(Item.titanium, 40), stack(Item.steel, 40)), + coalpurifier(production, ProductionBlocks.coalpurifier, stack(Item.steel, 10), stack(Item.iron, 10)), + titaniumpurifier(production, ProductionBlocks.titaniumpurifier, stack(Item.steel, 30), stack(Item.iron, 30)), + omnidrill(production, ProductionBlocks.omnidrill, stack(Item.titanium, 20), stack(Item.dirium, 20)), conduit(distribution, ProductionBlocks.conduit, stack(Item.steel, 1)), - liquidrouter(distribution, ProductionBlocks.liquidrouter, stack(Item.steel, 5)), - pump(production, ProductionBlocks.pump, stack(Item.steel, 20)); + liquidrouter(distribution, ProductionBlocks.liquidrouter, stack(Item.steel, 2)), + pump(production, ProductionBlocks.pump, stack(Item.steel, 10)); public Block result; public ItemStack[] requirements; diff --git a/core/src/io/anuke/mindustry/ui/LoadDialog.java b/core/src/io/anuke/mindustry/ui/LoadDialog.java index 1fb0039a62..39cf024f80 100644 --- a/core/src/io/anuke/mindustry/ui/LoadDialog.java +++ b/core/src/io/anuke/mindustry/ui/LoadDialog.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.ui; +import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Timer; import com.badlogic.gdx.utils.Timer.Task; @@ -8,6 +9,7 @@ import io.anuke.mindustry.GameState.State; import io.anuke.mindustry.Vars; import io.anuke.mindustry.io.SaveIO; import io.anuke.ucore.scene.ui.Dialog; +import io.anuke.ucore.scene.ui.Label; import io.anuke.ucore.scene.ui.TextButton; import io.anuke.ucore.scene.ui.layout.Unit; @@ -39,7 +41,12 @@ public class LoadDialog extends Dialog{ button.getLabelCell().top().left().growX(); button.row(); button.pad(Unit.dp.inPixels(10)); - button.add("[gray]" + (!SaveIO.isSaveValid(i) ? "" : "Last Saved: " + SaveIO.getTimeString(i))).padBottom(2); + + Label info = new Label("[gray]" + (!SaveIO.isSaveValid(i) ? "" : "Wave " + + SaveIO.getWave(slot)+"\nLast Saved: " + SaveIO.getTimeString(i))); + info.setAlignment(Align.center, Align.center); + + button.add(info).padBottom(2).padTop(6); button.getLabel().setFontScale(Unit.dp.inPixels(0.75f)); button.setDisabled(!SaveIO.isSaveValid(i)); @@ -65,7 +72,7 @@ public class LoadDialog extends Dialog{ } }); - content().add(button).size(400, 78).units(Unit.dp).pad(2); + content().add(button).size(400, 80).units(Unit.dp).pad(2); content().row(); } diff --git a/core/src/io/anuke/mindustry/ui/SaveDialog.java b/core/src/io/anuke/mindustry/ui/SaveDialog.java index 89e555c3a4..60f96f5661 100644 --- a/core/src/io/anuke/mindustry/ui/SaveDialog.java +++ b/core/src/io/anuke/mindustry/ui/SaveDialog.java @@ -1,14 +1,13 @@ package io.anuke.mindustry.ui; +import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Timer; import com.badlogic.gdx.utils.Timer.Task; import com.badlogic.gdx.utils.reflect.ClassReflection; import io.anuke.mindustry.Vars; import io.anuke.mindustry.io.SaveIO; -import io.anuke.ucore.scene.ui.ConfirmDialog; -import io.anuke.ucore.scene.ui.Dialog; -import io.anuke.ucore.scene.ui.TextButton; +import io.anuke.ucore.scene.ui.*; import io.anuke.ucore.scene.ui.layout.Cell; import io.anuke.ucore.scene.ui.layout.Unit; @@ -40,7 +39,12 @@ public class SaveDialog extends Dialog{ button.getLabelCell().top().left().growX(); button.row(); button.pad(Unit.dp.inPixels(10)); - button.add((!SaveIO.isSaveValid(i) ? "[gray]" : "[LIGHT_GRAY]Last Saved: " + SaveIO.getTimeString(i))).padBottom(2); + + Label info = new Label("[gray]" + (!SaveIO.isSaveValid(i) ? "" : "Wave " + + SaveIO.getWave(slot)+"\nLast Saved: " + SaveIO.getTimeString(i))); + info.setAlignment(Align.center, Align.center); + + button.add(info).padBottom(2).padTop(6); button.getLabel().setFontScale(Unit.dp.inPixels(0.75f)); button.clicked(()->{ @@ -57,7 +61,7 @@ public class SaveDialog extends Dialog{ } }); - content().add(button).size(400, 78).units(Unit.dp).pad(2); + content().add(button).size(400, 80).units(Unit.dp).pad(2); content().row(); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/types/Drill.java b/core/src/io/anuke/mindustry/world/blocks/types/Drill.java index 720401bebd..5649f8b1fa 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/Drill.java @@ -11,7 +11,7 @@ import io.anuke.ucore.util.Mathf; public class Drill extends Block{ protected Block resource; protected Item result; - protected int time = 6; + protected int time = 5; public Drill(String name) { super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/types/RepairTurret.java b/core/src/io/anuke/mindustry/world/blocks/types/RepairTurret.java index dd1f62064b..e972c25656 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/RepairTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/RepairTurret.java @@ -40,7 +40,9 @@ public class RepairTurret extends Turret{ @Override public void drawPixelOverlay(Tile tile){ - + Draw.color("green"); + Draw.dashcircle(tile.worldx(), tile.worldy(), range); + Draw.reset(); } @Override diff --git a/desktop/mindustry-saves/0.mins b/desktop/mindustry-saves/0.mins index 5e0bc3db65cc28becbd611802b2d13125308b729..4646b8f1e13663757ac19e098492831f69a8d721 100644 GIT binary patch literal 6955 zcmZ{oYm8M_701`UgAYug_kGXIJ@*a+Gt4kh9>c4JL0h1-6#BqIs{*Ytpd@NijZKU- z@gyetp3Ie z7-m4EJxpn)z44B#ow4&%wjb0my{N9Sp9YKCpGHqh$abbx6Rr0ralo(|NHIE#3MveL z8oNq!nXARt2yeJbPpicBNu;t;GgV5mmld1Ih>=9A<6uGD@6-daQ5w@8cuN+dbRZ{{EyWn6YzJivc6Km#j0_gPyf9aJ@gRLzrSc-z zS1`vT^LPZuV&AbLGDqPkKAUswHrF0TPfOI1mQXMkB6AQCB^!}C&~w>iA%)N4#*!8# zM)8o_lQAnJkr{_#uJ~);y#emxgs*Og+L&MvcEo@h=%x6a&%Fb#wu~I+toBZ>Prt{ZY`1%2qEc+~Y3%sY`e9l`Ou>o9O&2p^$Z!H;lZ8wypZ zu^Cuz+H}3e7yOJ5MIu#I(~Pwnw1Xr?&3cn&J@YO?e|6W}uwFQ9aq69|O(xLmJyhvp zft#fF1#(!VSvSzY6iq%x1Im;eW2JbE`LgrNn9oKSiK?ti#(Be4yHP>jbep_Sz81-S zPs;cqX}u(Z^{d%bDKVMEmIvhe$E1EvuI!cb%jKDG%A=bk`Z@-z`DT;W4ah#s6VNqF zx(*GC(VJm-j2epRTW^Fpcm>^9oF;)yNrX$=Iz|hVFe5RFFET|o2?b1oc_hL-sH3Bo z4`G-q3HR&nqa{^n%8jy>R%5=0!6=&!rmmPXtqn^sQlCO4+=VvtF@y|T2sBVk^RhYc zBI7ZlWr;9c2$M$kE8`p~H*l;T!!@Bopveyr4;`Palwq7iwfX zf~sCnLH-lTQ*?NE!MqijZ@^LWB6`dnk-QzrKKeAMSFqjZ;8s^O+al^spX`S9g0tJh zdfDU>1?o-bJ;-9YmxgdG=`zez1IORk>R2hhoUI2fUZtB-O+PGE>%x^SM>u_$%gVJ1 z)EH;X_6U>Rg{;_&PIT3B3`{dtEthGCs415{Ai6#7drdz4u(WQK_a2nLu9GA8%ig^b z-2z%Oc=YD2GQL9kekSj3lgs<$@P65IRHBtw2F>kl4}7ZEHA}iY4aMB;VF^~sSr071 z0jAr-%@Mv#7TaUiO*F7BqiR4|khqqr0ay71Gi5W2MpdOD#@gxPp}d9|zV;KX3Qalh zP~L|jDVq+du9!O{OE8-r%1U^LGTs(}iv^0Mc?V7~o}*h68;jMzFv}-%gR0z22)?TN zoN{V6E6$rfUHa_%%U9+SEXjqJOWv||Cc=amQG5-L9ZY=&-3T#Tvf!n}IT9}h-P_!E5Q@N?As+69{ zwOdGNReaagtd|?7Alc8Tk4%nZ~B-B9+N5SnU-Du!R;Dq zpOpxt{jMjKW^F2An}!~2@~}gL($a{0$1TN%l5*SKurG^Dy$w0|ES68Z^%?ymtIw)r zv_upUp@iFf8S26vDi;*C=kbi+6r z#q#03%BSId-LPRiGm2$nG3LJ!wt=cT=;U=1YJyJiZGhn!l*Z*AP=gEciaSWSgF7jC zC9-tY=g~QCICZ@K2VGNmJZrV7NpVJaH8q8Eu7@gRZ)i|qK5)vb3}?Nsy7l586`OG| zZcw#zzg8^RDOK}S)uW90VT9w=1C7~9HOC%=TF=-)u~*##p*Au~=fbXABM$}{sOgNs zN2>%LXv{-UdzH2C`+_bAX8~8QhePVi^4bD=z7j#rgG~=aY%@=V9%Xv?--J-X0ffjJ z{nxB$LEMa!u{So*fi-M?R97oGo2Z6obJCQ%=-|yLnNi&Mg>P%8~L^D^InRa*nuurMz)Gg{A*^u9DWDa+S0#)mce9 zPqjY5K&RW*87=AJ)2mVF_|8lFp z6)WRvfSJ0T3XD-Tkbmx{V`cC&G!WJI_t+TR5gVhbAZn2sh+3>J7(@SvnPD}cEdLx8 Tz}NjVHa_?-8gMQBf*St^kpvFN literal 5089 zcmZWsd0bZ27QK9;qREFCsDR?Dl#~D!Q5htVZ#kiiDr(3ih|KUYi70AXT58V$(=reapKEu6en$}U%Y!VOV zF9^{z%>f4&YLMK0oxQL+OC6byDK4&ldBQHp*Suz)Vicl9@qqy!irXEeuiz7ZM#pKVHGo=Zx zvR?{&o27#C1n)kN_S45mYJ$IOI65pYXG#;C5$}aDFRtOS!bZa@n6!R|q$Wg|Er|Ny zEK^cmX4(Yj%EObEUI5axSjoF(OGyB0k2#wIBxlq-;MqexN{B2PSu zq{*&KNqJtVKfG3N=dnWhxAX7_Pn6VzG3z^_f8%_nwwfj2j~rNEK0?%Hl`R!t9R}<2 zJ(800vQ{K`c4JC5ka_{>hrShKxz7z%NVM*il!_moL<-(uN;c-kzXR_Dyb9d9U+yF5 zPL#;H(*(npWWoPPd#0p3VfjfUhRWuM)?IBu`l!Xaa>S81#C82bSI(^3hmhM3r4$vn z)*x{8pOTs|Zre2YzM0LGCKzUoLdG$TsG495a$<5MH6d!!G^9;9%9L!3yYT?Ye||5< z@&xM-B5l+*Noj(MmtcAmd-kQ`nAQ(5b(30O;W-_d@oFq7d&XhLS8@|lH`32_Ls-K_ zA;sNjt;UcUCnPmt?4?@xTuNeU(kx?&&LDNAc#w^)iInTNAg$V7QnK+^1X6~3G8L`s z^$ij~Y-?TpLd;y@FQj}mD*n_9iN6L)s#!w&H6q(nWrgQ)$o}rKUL0|2C8n%rlfL9R zE6oofPrV|t?D?l<7+ZEqQd+_Hq7mql&XjD7Kh=aJJ4Y!cJdZ&}{$@$38}oN#<|#L( zLfN(kA^%>%W5pKzsXf9I-;&gX@eh|`bT>Xn?qX3aUP#&5SxO0IGcxyVl$0hI9gXQSq(a7<=RgNl7{O2txka$5iZ%*vZIf3MQ)d#!BQ2HA`wjbU_;O zo}orimTXu?=VDg#FJi3R{5i;Y+fP!mai$VU>(%O0pVLPot4Z!yv7Z~8k#YrkakRNF zvabBdRCxY*EymfZ4NS!?TQFv*IyfdwFneM2TYMHoH^vSq#Ef%aw%NFe^mQk7<;Z(? zkm4{>Qq2;S{1FNs7h6SouIq^0Ke!uWZ$wXzMQ&9tXURt5`8bUCZ5EW5`(`pGdellv zt!sK7qek9kO0Dy|*Mid1;ta~x)jvQsjAIp@_XzSJX2h)vyZ9Z)xhRg#Kn39cn&j>`>^%9hA+^9lKN^eQ28^s$D9>S|2x)C^F1FSP&l2X*Vy4A=} zG&XJF-cdBDyc%ezn7tWeH-GE4;ad8wqty>xC%6(9NhB|@}^wpv3!}YLGHEB zC8gHw?23YgUoj=maZW*)G^s0(75lmQ2Bt;ck(6%!=4?#Kyu?&^o*xOTc|DI6%Jomd zx~p1JQVy#{&O!BDx}UvWQJC|IQQWW-c^hXN#bpVoh zb&`~}XwTm)0hZE z#w8S3-W5`OtUO*ucC|c`xR7DXzr%0vDi-@}m)GiF zj2-I_qvYdUNy)~6LKNIz!&FQ#peM4rw7snw@<|4DREmQIwa_d86rwtU8JvTHW*StqkD&BYp>6iIE=s=!* zH_X7C(W#VGp6N3_+F4TC{K2zOvXO5F@g5v0M)jF;mJ=`odIwf`PvUqhRe}VN!0<s$p4<#mz5`j>`ymK(c5h|Qo~Rb-U%{1Kle5A9r*SZH&UQmD6FLwBFl?X z--x0;{UxOd#@6L-q+O#dI1rS8`~2L#PUVZuD|T<%8wSy*e!B_$j4Pa^Mv@wOWL>>iY7ooiEW zMOmwzq5NVk$|AQ&N}jE$sHkjPltV9}qSF$ictthJ(%)xF2iDK43ueD}+ptkL1#`@1 z-A2q~ttj4H&6FlMuv;ePwf-ul=)mskhl=PyhVtt))+Sm~O{;uBQ>)N4|F!g2bI>%O zUJCT-Er6q@4Srok+%_rTuvvj#PblEnR{<9txapv0e?7HLf!-V;J+ArI$}ep zpJ1Xv&S8S`*Btjtgt&rx#YcfcnnuR#J{N#Q2QZ)s1Xxt$QT|FZM4j*tQ75kW-{<^a zm5p|NAw8W7U9_MLC;ujO4~R$5v-}v)(_Kf22!SUUP-=u8aTu+No%sA4ew;`D!;dpp z{Bx4MkLeO)6zF|Y0D4}Ra6QFTf0xnk+a7z}zLDRe$kg`j? zh!F5