From 80aed311350f8daf86e681ecb53a7045aada1f68 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 28 Oct 2018 14:26:58 -0400 Subject: [PATCH] Broke and cleaned up server commands --- annotations/build.gradle | 4 +- .../io/anuke/annotations/Annotations.java | 0 .../io/anuke/annotations/ClassEntry.java | 2 + .../java}/io/anuke/annotations/IOFinder.java | 0 .../io/anuke/annotations/MethodEntry.java | 0 .../RemoteMethodAnnotationProcessor.java | 0 .../annotations/RemoteReadGenerator.java | 2 + .../annotations/RemoteWriteGenerator.java | 0 .../SerializeAnnotationProcessor.java | 2 +- .../java}/io/anuke/annotations/Utils.java | 0 .../javax.annotation.processing.Processor | 2 + build.gradle | 5 +- .../sprites/blocks/turrets/turrets/arc.png | Bin 111 -> 191 bytes core/assets/sprites/sprites.png | Bin 105144 -> 105132 bytes .../io/anuke/mindustry/core/NetClient.java | 7 - .../io/anuke/mindustry/core/NetServer.java | 23 +- core/src/io/anuke/mindustry/io/TypeIO.java | 43 --- .../anuke/mindustry/net/Administration.java | 38 +-- .../io/anuke/mindustry/net/NetConnection.java | 3 + .../src/io/anuke/mindustry/net/TraceInfo.java | 27 -- .../mindustry/ui/dialogs/TraceDialog.java | 14 +- .../ui/fragments/PlayerListFragment.java | 2 +- .../anuke/mindustry/server/ServerControl.java | 266 +++--------------- 23 files changed, 92 insertions(+), 348 deletions(-) rename annotations/src/{ => main/java}/io/anuke/annotations/Annotations.java (100%) rename annotations/src/{ => main/java}/io/anuke/annotations/ClassEntry.java (90%) rename annotations/src/{ => main/java}/io/anuke/annotations/IOFinder.java (100%) rename annotations/src/{ => main/java}/io/anuke/annotations/MethodEntry.java (100%) rename annotations/src/{ => main/java}/io/anuke/annotations/RemoteMethodAnnotationProcessor.java (100%) rename annotations/src/{ => main/java}/io/anuke/annotations/RemoteReadGenerator.java (98%) rename annotations/src/{ => main/java}/io/anuke/annotations/RemoteWriteGenerator.java (100%) rename annotations/src/{ => main/java}/io/anuke/annotations/SerializeAnnotationProcessor.java (98%) rename annotations/src/{ => main/java}/io/anuke/annotations/Utils.java (100%) create mode 100644 annotations/src/main/resources/META-INF/services/javax.annotation.processing.Processor delete mode 100644 core/src/io/anuke/mindustry/net/TraceInfo.java diff --git a/annotations/build.gradle b/annotations/build.gradle index afd5e6ab73..edc88bfb58 100644 --- a/annotations/build.gradle +++ b/annotations/build.gradle @@ -1,4 +1,6 @@ apply plugin: "java" sourceCompatibility = 1.8 -sourceSets.main.java.srcDirs = [ "src/" ] +sourceSets.main.java.srcDirs = [ "src/main/java/" ] +sourceSets.main.resources.srcDirs = [ "src/main/resources/" ] + diff --git a/annotations/src/io/anuke/annotations/Annotations.java b/annotations/src/main/java/io/anuke/annotations/Annotations.java similarity index 100% rename from annotations/src/io/anuke/annotations/Annotations.java rename to annotations/src/main/java/io/anuke/annotations/Annotations.java diff --git a/annotations/src/io/anuke/annotations/ClassEntry.java b/annotations/src/main/java/io/anuke/annotations/ClassEntry.java similarity index 90% rename from annotations/src/io/anuke/annotations/ClassEntry.java rename to annotations/src/main/java/io/anuke/annotations/ClassEntry.java index a9be2ec134..3da814be88 100644 --- a/annotations/src/io/anuke/annotations/ClassEntry.java +++ b/annotations/src/main/java/io/anuke/annotations/ClassEntry.java @@ -1,5 +1,7 @@ package io.anuke.annotations; +import io.anuke.annotations.MethodEntry; + import java.util.ArrayList; /** Represents a class witha list method entries to include in it. */ diff --git a/annotations/src/io/anuke/annotations/IOFinder.java b/annotations/src/main/java/io/anuke/annotations/IOFinder.java similarity index 100% rename from annotations/src/io/anuke/annotations/IOFinder.java rename to annotations/src/main/java/io/anuke/annotations/IOFinder.java diff --git a/annotations/src/io/anuke/annotations/MethodEntry.java b/annotations/src/main/java/io/anuke/annotations/MethodEntry.java similarity index 100% rename from annotations/src/io/anuke/annotations/MethodEntry.java rename to annotations/src/main/java/io/anuke/annotations/MethodEntry.java diff --git a/annotations/src/io/anuke/annotations/RemoteMethodAnnotationProcessor.java b/annotations/src/main/java/io/anuke/annotations/RemoteMethodAnnotationProcessor.java similarity index 100% rename from annotations/src/io/anuke/annotations/RemoteMethodAnnotationProcessor.java rename to annotations/src/main/java/io/anuke/annotations/RemoteMethodAnnotationProcessor.java diff --git a/annotations/src/io/anuke/annotations/RemoteReadGenerator.java b/annotations/src/main/java/io/anuke/annotations/RemoteReadGenerator.java similarity index 98% rename from annotations/src/io/anuke/annotations/RemoteReadGenerator.java rename to annotations/src/main/java/io/anuke/annotations/RemoteReadGenerator.java index 5898e369a1..524e590847 100644 --- a/annotations/src/io/anuke/annotations/RemoteReadGenerator.java +++ b/annotations/src/main/java/io/anuke/annotations/RemoteReadGenerator.java @@ -2,6 +2,8 @@ package io.anuke.annotations; import com.squareup.javapoet.*; import io.anuke.annotations.IOFinder.ClassSerializer; +import io.anuke.annotations.MethodEntry; +import io.anuke.annotations.Utils; import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; diff --git a/annotations/src/io/anuke/annotations/RemoteWriteGenerator.java b/annotations/src/main/java/io/anuke/annotations/RemoteWriteGenerator.java similarity index 100% rename from annotations/src/io/anuke/annotations/RemoteWriteGenerator.java rename to annotations/src/main/java/io/anuke/annotations/RemoteWriteGenerator.java diff --git a/annotations/src/io/anuke/annotations/SerializeAnnotationProcessor.java b/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java similarity index 98% rename from annotations/src/io/anuke/annotations/SerializeAnnotationProcessor.java rename to annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java index 58aa2abd5b..3cb31a1ee3 100644 --- a/annotations/src/io/anuke/annotations/SerializeAnnotationProcessor.java +++ b/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java @@ -52,7 +52,7 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ TypeSpec.Builder serializer = TypeSpec.anonymousClassBuilder("") .addSuperinterface(ParameterizedTypeName.get( - ClassName.get(Class.forName("io.anuke.ucore.io.TypeSerializer")), type)); + ClassName.bestGuess("io.anuke.ucore.io.TypeSerializer"), type)); MethodSpec.Builder writeMethod = MethodSpec.methodBuilder("write") .returns(void.class) diff --git a/annotations/src/io/anuke/annotations/Utils.java b/annotations/src/main/java/io/anuke/annotations/Utils.java similarity index 100% rename from annotations/src/io/anuke/annotations/Utils.java rename to annotations/src/main/java/io/anuke/annotations/Utils.java diff --git a/annotations/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/annotations/src/main/resources/META-INF/services/javax.annotation.processing.Processor new file mode 100644 index 0000000000..a83673baa6 --- /dev/null +++ b/annotations/src/main/resources/META-INF/services/javax.annotation.processing.Processor @@ -0,0 +1,2 @@ +io.anuke.annotations.RemoteMethodAnnotationProcessor +io.anuke.annotations.SerializeAnnotationProcessor diff --git a/build.gradle b/build.gradle index e21d058b06..b6c140a870 100644 --- a/build.gradle +++ b/build.gradle @@ -178,11 +178,14 @@ project(":core") { compile "com.badlogicgames.gdx:gdx:$gdxVersion" compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion" + + annotationProcessor project(":annotations") } + /* compileJava.options.compilerArgs = [ "-processor", "io.anuke.annotations.RemoteMethodAnnotationProcessor,io.anuke.annotations.SerializeAnnotationProcessor" - ] + ]*/ } project(":server") { diff --git a/core/assets-raw/sprites/blocks/turrets/turrets/arc.png b/core/assets-raw/sprites/blocks/turrets/turrets/arc.png index c41a9b2a80ffe6ae740f9b157f694277f8bc2a2d..82d7b7fb6f90642877261885a4a8874cd5e41838 100644 GIT binary patch delta 162 zcmd1b&p1J)o-N7S-G$*l2rk&Wd@=(A180FpWHAE+w=f7ZGR&GI0Tg5}@$_|Nf5auj zYhdV@?rI7Y^6_+W43W5;oS?uu$FltQ|JmmG|CGB84@%5bb$=if+r9t5&7KpxBqbyy zM4qsKC n1*RKBgLGq`P^-2%+rHl&wW5Ldupml?vI(GRP9y zTI|_F*~yY+=J&ks=llDI!!gHUp69;r>%7kEJkPtNkoj#PbMC7?RJ6hK=SB+G>gb`h zW{!h0wjWP^4B(xsEq{`jcu=KFrLyR!+fK!cR}Yyd$N*Qz|rg^_JqXKLHj?60qY$)KXX7+8cf5SK|7&{Z!s~ z=`+3J!ZW4dV2zvl#JuXIpX$kX)=%+B;@xGHE1Mr%!|-r=^TQ1leIP>kIX>#A{N~3% z{kTWLWORADG?5bzYAQcvAnmtQ+vXIRx@mEeYG9kQUgdih)tTKUVSrz^y+j?h>EkUJ z)Maxi+Ka&a>brMYLqkVtz_WE=DphF%m4ilBl-?h5exQu=Jh~h~(=4c**}zjSd5-5l zmjHVf`5(vnRJ*Lb-W}^rmknn-_`$WDn^84wF^#A0`EZVPfiVze`ToI2bR#olWUk)r zC?3cg!l>|h_mKLmV2MBKsy6co<%UpEkrsoGK=DMEX&fY4ovww`MuKw}v(tuR#fKUq z^f>y`XB^dw96vIqnu8_jbf=bz`42_Jkdah9>er1o!;kZ?>Px`Az`PfamvdbVAFSQa znNToSpexu_TC*VsNR(TQrzg}y>4ja+e}RmCn09C5Ww^i9=Ca|NNY9%+CGqFrYG4W; zdW#rh=X`?W@Q^o4*HEBqeM-$z4Cnm(r1GTDZt7N^Euj;JevC^GouWU~t$h9JTKK)F z84ZB0VKp88-6ZfB87zFthdTgDB>+#~tu?5)EbM>A0TQ!T(ncy;rf?y7#* zhw-GV*`;a)0KIkL7W$jchpOD?{$LA@`n2sv@WM|wLL27>g7xn(Zh0wg9N|tY$`;{o zy&Ae+*B82$vuBPkyjes9ZDS_Gy#NI9C}Mo=D*v3fnwm4cm{8R{NXkih8(JwV>qQz0 z+Ps{jWF0(nyrOC*Y$hXYt?Dc)OJ7#LkouGhj5lK|7QES5gB7nLr1^L5KbWGmG@lrN zyW^-O7ekViw%i=QH$?hGd|LNv9zOuSWofvj)o{K!*(8+4KnL9ixEZPR%#(r&&Rr}< z)T_k4(xFwI0T2Fmk0+gNNj`e!W}}W0bd?LKKrMFYda1veGrRs^?F6KGH$8u55qx~S zp?UMyy4VwC*4EShBu&`|UE=~n8qB#Bd9Ujtz}@xL(T=%&%}=_&oLaoZ;nea@csmRw zT~$A&gB1%iDh`b!r=7cxTQ-M192&2&=HFB%3@I#{N>Cd%mM#Tf*MS}>%4yMKsl-$2 z_?)Dm1|2PRiVlFlx(pYX`PQ6k z9;WgRq0aL(nhzjUUPkth&)hVGn$84A-1$ZZiIDg!^`qk5;2nfCk=?TfK$ZQAz2i>@ zngl5BxRZ&8EYuh$0`pCe43D=lf7i5?pd=7t0u&m}cuR_JkEql;no={=Pkb$Nz^v&y;nE2_yI7l~9!C{WopQ zb96mh$GkLCstRbO^ba@kBmRd16rR5+`fJ3_Fa&rBjj}NGiEfNGHjA<5Jsf&T_r7>^ z*huF5f%Y)1_F8>232K7gSpLSMYgKCd1A!cntiNXZi zM+Q+6B(AL@lyjRKKw(A%#VBGRN@z?0QMeQuOk<;dWL$k?bk}V=jvRnHmPr5!eQh4N zlZ&+j9fy{<~6_|wcUlY<5Mnom`CuPVrv0 z4WpFsfs6_J(b#Mcn_?Mx>%GtGU-LfhN_~LWo$N!$0L1&ZMjL|^8{^H?> zvF@W{y0nmtA%UBmyy49y*M`T=z6!da>8-O*hlukqf<L#L>#im5u;Q&trWf_fA+n^y_mg z)-yC@iAzW@xO(-?u_oS*{OYgr2ByHxgl#kk-(4@%{t))PzFm(HC{5o1 z9xa7W1t4u3G-|1bZG)kpPThTHgm^qIZ|Un2sRRflQR6u{sNv%}4@tSM=iE36=2k)E z7?d!-RM|@*(W>U&t|sWty{UCvb8Ti70)jqn-RRV|DNW7?VIfm?<91K9xHb1o5%0hya;zBT*xg&)M1FWF%J7X>S=s>`}~3=oG^^l)%1hMHxT zpvMIIPUEovZO>DA2-}&!1I@-DWq11j9jet~mdZw1&wDkg$6q)~fIzm=3sXDhb^_vS zSP>Y9>_^}+xA^Cs)U3A56S!9-WL`d%OG5%AHUz^i^l!PP>wRly?xT0xKAW%N@k8Ve zRW(E&s_@X>VWS*2V!XBNnrvR>H^;(I&s283FQC}E?>hs1W0i9v#>MNil49gr^VPFz zp4Rl9#F*8Sl6Jo*7U&qVTb==!5!CY+(?8sE)?D4IY_~kzc$XEP{EnmDN`+0$EM9+V zk!iOe%&7j%eObz`;F`kZ*4%sm=HGeta8|LC?*(lCs~Pap4Y9svM_#`|rkc-cYDKlt zH^RSzDf$AWvE@j1O}hd$n(8yR!wQMR*$thwT)|ov%t*}sV=VxzQCyGb8%8wr zEd+`cb=PWv`k*Hc8Ec3yZf=n4RHl-^)_3{TQ`fbo!Hgq!0*W@If9T%J{TxB04B}C) zhNE<&h1JJ~gTp{$#kn|b;UUfItISoProg+WH(cr%>l{{fgNgb-SYam>RT?=k)mkvY z0fM0w|8`QfkHTeJM-jNspA(u?=2NrhVL4Od35;_UwbolsTG+A@&qao3JQxjYbhkKz z6goQQdR0qZ`0*+J(*^A(tdQ2BeVTtW=X?Bm!}C>223-@VM}m%RR#i^R>cCp`-r6c0 z^aSsuw~1xlYR$gpi(VR!J#Iis!-319wn!a4)WWT4G;J-xZNp?Q4uBFTp5U`};dA%Pp0?dAX-l3n(r-Ga zVIyLPiI+U%fW@u39`hq_j~1mwsn+c8a|G1>+4}^2rtHEtD&?bA zJo-%N$;63m2;2dn$WHQYT`(i$GQk1n6xHJ0IY3kGy5_I=FXQC`rLIw0?J{H9M*d{f z)0gzT6RECRVySIqQ%!$+DAZRTlvNAUR6}M#&02 z@rE`QZHo_xTK2V2dVQUT{c_-e??v0uR-f;b@pbm@hbzq8#(ku(&iku_qI1Ig#4R%l z4vJf`Wu#0}>k9iEevC`C-(15@Yc2=2x;spKV$1buLtF-P#X9$!UbYGM6j}K-`72~) z071UL%40SgqWOrds|+rzgyim8Ds~(VcIo!8ex|Nvcj;b7|QIUd{C`hTr zyTqQ=`Jy8%QYi+~H#7YkF!HwwSR_N-ExOqimg+#VMK2VbW zaaamy&XXM;PO0vr`CGdkj3`ts6kjp{y8J5#O%HYoFjzb099x*dS3=*0f5w*ZFo&0p zh;&t)G~XyRso_ulwf#s=1`g8;tkr*k- z(B#%;B*eVKMD~8bOOFNjYxt8Z5#i0=RX?j*zWt9b-TRj==@C(&ztz=oF~n$s<{~qh z+CWla@*#c{$<0>DZ2QMV|T82Yi&mqZT+=RZU#7Tlds5EhOI?U)#$na z)d2j1u6?ee#YUql$2mcobO#5dwDdJuppmKE_v7;!o=z(nD=Plb-MZcv3X#3)`&?J- zh)}MC0=KF&2sEsT99oFFkn_)oszZtVeN>rey&$zbCF;cc)}8H+XHIWqOjfO*3{$es z9Q}kpD_qhv<clvW)r?SfN>S?Brx~NbvN`RW(CS)-Ga!$m52RG#MF^Yhu77*OK zHQD-sG-#U=TPn6YzNVk4*?#O5&)Q3LU3RUSD;RF}dlLJ7x@>BW zJa|I5Sg$h-*kqsqO5O<6No3Gu-y7XdrGg%E8%o-A>7&I%B7TzNxuM3W-$SYyR$f3AaW!zxXE471fZl~|JLeh^F zy|!+s(haU0^KuRd>a`^bopHZ9-=C9R&7jx5JbwS7wyxrqx5iZ$4XOEeCz-)P0#2NlV9c?W{L~gUAa^uI` zh@GO;<|nGvZlK*oyRMm$hJZE%RJ(p%W~a7yIGw2+k+|#b&_7{Uxx957p+;8UtUSo0 z=GOX-Z?JP^_sM|gZA76g1XWMc@_nG`F(I}s)2D1S5YvHjb63wS*9yrtC!&h-QH-jT zK$>PWRT}R6j=z?SANng`i`>h%%Jr2tP5I)mfH2mxDgPxdl;xLjacTJnvbl2{J%h z;EC~qZeO5E?4%GO(*Bn4fQjiU9}$~YkFi1dpAPr95r%rzhPLbE@2b~85uA*-i$Fl( zTRzK%mRJs2Qn^zpAiD3>6`-5>5(pH~4|9#80(nQUA{1VBd(qcYHGad86zBvb)rtok01@ z^0X;SRb3VA`9QKQ`zSzBI{q@in}CM+x5hGEP6grP4@Qe|;nN}G;oX|zo;@ZAj7C-*9yHZvIyT>I$Qa`WGgtIc zDAimzw>0?mslpv!z0NPQ7a`1IL=Yxn^oWFerG+9qc=(T7OZ>~N@vvs_>^zdj{&H~| zzcReBod^1ZR)1`YmC9XJ|GjX-wOQy@bBK!{_nY4$=XOxU0-t=;)osmpk7tX$Mb)J? zu?G8}+S)>XdPO{!=?NhLxgpm`459kaZ|D70m9(m~j`tjXZkecY^@&o_ix*ubr%;9A zI}H>GUB;DU?o}_vu9|yI+uAp2H-liFhL<)ja~B#?n~t5?vto#`z+<#^w~e4VW*j7b zdq4)pfZxg4qJdigF&E1_@&=!tXq5bE{V?BjaE^7s z2+ikjOhKnB0|Gmu>nj%5G~awk4*o!rV3!)pRJHzRJRQWlY#p5xX-xx+1kt-tFdNTN^#ccN)CBxsk6>pg{o zIKu!(Oku)%12qJrnV2+%P%&-lNc`vdSlx6NZo{BTVc+!-JL`zPycf-(TYsEy^6w|4 z6%@n`N>x2A6mc9VnmZpaJr=?&TC#ZSUDn%Fg@CGZ`sc=nHKri}*Jgyh zOV-HX$NH(7pNxk`W!EL3By!3_#3<0I&s2%C0w)N@rC)j-cX3`W^YZ$ilw{_zxId4m z{(yVs*qj_{@!fr`$>K?Uz5i^PJzt1d-43&IqCc!E$sKXsn551RKU&%m@g@ z)cnWn4{W`vqtVN{m7J%f*UfTHJx{Gt;D@yQS3o)M7E;uQlNW-t*V*_J3v-x?%QCEZ z7e&B#C6EAlq;U$BEr1X1^hVny?2e|E03|pji}vA^5bf~KJ=X~V%VWd2_J2aCe-Rn2 zb(9n-bdWFCt~N`};SGPwIo7S8DzY0}hi0Rj7N6-nSjwc>)SaDts;nx@MSHl5H|=K6 zb;k=Wzw3kL-UutPZY(C*lvUO^nN9Nsc^uSL$gZXLyVwYl$k?L>h5?C-n)#j1aFFP& zKHG2g^Y`5;g!Vv|aFPJe)^5(6i@>xQl--tx_Gp)5?iC;6x6a~qGS!K@V^Z~B$X~78 z5D$NA6>kEo_ z+#)*}=D$3}zb90M<*J0U|6|QWv)p8>j^F!0CIA`-Wd&?DtviB!BY%C^6NctCER$Ge zj8bl9{ILj#R{9^3+S~OzkEi^$*RM`#(dhh8NGw`jsjc6;)!tvp#D8u-E$-I|`^AD6 zH6DJQHCJ4EySc15Q%*Ah`P(b29)4CxNqoP58_761VJg*T6`_^9GtsYOY$ewY-^xDf z&>jD9ezMn7sYpRxN}~t;=dh#tqrh<%NIZFM)u@;2<|%)kV{%`nb?J3I=qwYaoX%VL z5#c!=zMi~*5tFQ_kCUkEaES}6nm>?MHoj-u-H{!2I%fOHQb1nK zxJNW)(VIQ`UBl(za`C&&bd~KBJ86c0Cce(2{;pq|p5p-ZQC+^(=Av@Z{b0U$2Oj=; zf;#e0m;9*iqURODAPbgSH%`BU-o04`saeKUAWYxF?xcK4V+{V#Jfnv@xBs}!v zsgXNg%6=EY ze7nNuhXobB`Y-sY1Q`}I4;+xcB*@r&MpFldBhW_zk4z*yL#Vq2%jr7FjoLGbN#sB#nto^t*`Oi26gw= zHh9GZ)KpgPjRo8C7$I2%%6Aw$OT`qVg7$q0n9)({6b{9ju-3;|IE9k;=?KOP5f0^5 z1DqvMXg99SMC5&XVF_s>jp3LvVRjml?y(*>I+v@@9sTUDx`4=hQk1)eq@>KXugyD1Y>n;=?Y|(~dBM+!g1~ zZ%Mx2Virn*t_6z6qU{rRHGS~8*tge)KUl@gPY;FZPjB$LQqm$X+D_zOC9s|xLATbI z=~t~g^{6F#uaK}7WHzDCKb=LmrodwFYwh`LCsp~*8EJ&Q`FwS>Yyj+JN9H9!Xq+h~ z7Os;hna8J()}(yiIsLP;Y{E>~5KcW-T2uQRQ8V`*tN;FI02RFLuFfkQr8wM_TNY^b zSnvJFSdyAsKxhK_;V2X2U5rs$nET%>5c6$lj=q5Yy&X6b8P+~fxYq-vb(QEu(W)@t z069Vbp&Q7fwg38Vt#it}Vq&Ts;o53U^+rz>3GA)<7rv+}Xx?LiV}^k5tjH7FEfb02 z{f3S=Zz?8fJ(cEi#nx(hz8G_RSksnpF?P*LGZ6N5nNa=nh(o+K}Vc6Nqi630Y5M;(hbnss~! z=Au7+*VQs`6r0OJE_}T6dSn@$ACAQXJO~loL2kz3_5$VK8As%uIzp8j5aG@IK4y*X zZ*F!@sHLR*)=A$J;iCZp-x%_wP!TuT%Rs zez)3md!7`dc&5*CHNi8#ze}FH*!0iqT-T0GQN6(r zm!-UYyeUC8_{daaR;eSWZ(F=rO1rRd_Ek>y?aXz{?%Zr9|1!<3cJ02q_rJW8D&!Y| z0}FFWAsF;?14U&gYNPVy$XC}2dC4)%Fy*0?qVECr+q~JK&Qqt`nEl3j%`3glZYh`m zzInRa;|X|gyc18_H#^nlY6+@V_xYbpLmSTn{8u}FJRJQUp$Ybev-acDP0yZOX{EP`Jzp|o>*&3B)LV-4%cr!^|Z**dUZ=2lC2m_`N-|Y?9fP6** z!_v4&&u^1w1+|?r6-Rsq^;*82rF`9*D|>?CKr#Nuo|CpYIPfk1om6ysB{?Ngz0 z(4{uE|3(QB@YV_-6=?-%k=Ki@2aH}E3)6sHi@!alD&HJxy1p5y8n{WtM6iNV5Slrs zjs?ixhXJ&n3fU&FHHai{CyFNih&%j1UeIF@lf}%x9ChS`P&~9{7d$=1j*blmgswLC zWFMbxtk~;2z~pDVD*)cw_U(;A4}XGPeY$4EG@owb#us<|YC|9)Ymn8C`&F=2NwnOu zy0af;GyJF0kfh*holL`0#$(0HBwv2xlNGz^b_i%akY)y#QQ0^qrv4z2t zt?wr6Z?wb)-{DgD>Su+1ImgD^cfx?z;)2h;_dj2xcj>j!wskW;->2qpxLj?U!*Oog z9hJRomoQ_6e7&Kty`dreHu_1HV<%mk8A2Z>N-P*iMyy_*o@C+_5-uxR&+&XZ>su=( zyeIgn^ytJGEk*YiCf88G@Q|LV;veOaErX3LF~}E{Al{m>o8n;@;fyr%BY) z-A|p;YJp-Jefz?;mA{iBGShA!gS!JbFWkXBJK)!PAp8qJwCj~|_4^~J_1BQQ|M{k8 zx$WhEniDj0H3SD*_wz1eQgfS=Rh5F0m)s9|JeQ?{>!HBwTj%lh7nos^F3yij^V$;s z%ndfjs0sv>c0Vy}kO$&fR-Fhksp!-WzmjELOACc}n5p0)elw!$z@k9#MbM&QS ztBH`jd5LxTU{n1Khd6-?pYo2pdVM*xNOh0>T;|~#wYTrW%-&e0DJ*Sq1Fij?g-|*g z-f+#b*icYmRI~pGP|?#po!OU{5X$I39U3E5muox_=xh_?QhlMq1SQUgLe8!YZun|P z3RdCjjjT9LoG$6qPV?o>6J=H&fW7_3_|TSwBye{f9uJt%Fca>a3kfTna?m^R7~8ml z=+|;dVk%l_X&#*Mr#;I+WK$@x2TyH1Qxx6!;1-9X?f>RHYEAcN|M%v=E`al<<-Tj@P$*BK4QjHEM2cg`et^UQ-fNXOv-`ceEovxzQ*=~i{ZYF*`egDc9&k6aj0MTrvNxh542Y}5 z*#}wmp;g^E>3&jw3VbfFe)Z)F4dV}F61B~`^(7(e)~uA7Q4X;nx9wA?Zg-s6&OZNX zc2mb$&&`2)?TEZ)dPQWBr-M5;1L2NYKJtDy{uLW?O!J~*0BiSc9IyPHkqdMB@U2FB zTKj7wx>Vz_BtgrkOup6`9Qxdg`NxDwooX?r+nRAk+4fs%D*RT)A zX;wHeDy)*6I5h5WyEiiD>s|lFLoq0Cfx8-~g?gGV+oZ%m`qrKtSX8tVC^)5P)7j%Z!c!)sWoC0OSv zKywd{uUUj5UH^BgbSZvU!WI)EgJuW2xsYfD4{9Hafy-*b)<==AzT%N@%l2&hH!xwP z!#*U#L)Rb=iC6jwoJ{m%UcYIF+bxdSpM(0C9FrEn5I@P%bpfG@sGuhv&lW9)oU44F z)xS7->tuuc5lCzD!~zgKcuKI6pmHPje0*f%ptiAfMYdr7cg<{+1~kK%sy@)?CLQm7 z1SqN1H`KoE@B1`LI~@48M1v|c)q!O=Ov-gt$JLU(Y&<%0K=Xp#+uZ6CgB_lx8tgch zMdgj5O26Z{M1M}$zPXeB9tUPPV+0~Mj&>NO3M6e)@Fy$yBjgK#=h@e996O?`@)UKEK0|zwHkemZg=lL1gR-{hd&AfabJx<>61%7=Yw(|h8Rm_2{^X9Uk`+bQFs z-dbe*Fp}N$+f{9>NX@hqH+Ja0GpC&&9MrlY4S?#9VtBn2YJy)}+v z^@oGrw^(=YYE>GJ0eLJ7Yi@(uBzL1dd5*?54<+Hw z5JHZ4TCUX2e`ji9r1zkv=7itv5%C#spBJ9Gd_Z1sM-T$Z*mvgcYLe!!uxG0$$eTf6 zteh?6s`d3+=%4*Z`LI%<-9N)J{=I8JnbosDYD+0U;Es8O*&B72S~0&W)x9=qTcS{+ z0aRu0>zhdq7!!|~JStN8=QPD&fkE3$y;sEvCF9s`9S3SYgM>v(d4Xa8)R92|$)7Nk zuea!W@#xJeT^EZpgREsdmr5S259=(t?%ct6I=I;x1F(t48Gz}Nbu4+-#z8xk(2>}g zo+wMAIWzpifL{7qcgIBcFPqC)H>EA=JfcF+8XaPEea}~U87kREH);;#j@rPQEHS72_K2>1 z$!Q`?ihlfrIB?G#C&e&Bj5B#5-{zpwc|k_XBtsIEiZ5_|&e0GedHK#)qb4A_@#CHE9a>c^vmNv4UOjo)Q5a}9A``#1 z?}1Z=GmDCY_h)wTceTGk(>??|U0j+LIuKW^d?Ri%w#Wo6?LGQ!b?^LyNC7wX(L%od z3G&5o^z)zS+o?{Q9pQU7)g4MiHFZ2^|5ZRZ@g+S7w9rTGo^8o0QuiYuP7;2!#l-wL zj}#x3uH8CwbMvhW&}gLz=~?d$EG|So#iC(vZoZXl%v)1`_Z8i7RQ;>_?}oax1TtF{ z9zG!uhRpj096nn~5koXo0>6ne7euqdrHej=_LRp&a%u~K$2fF}aUUQ1)5IAkOx#_b zW6d0MlAm!YtCIe^fUw651dyU!EhSjh=)nlPA}nLW{hFQ2d?KwOGa-L8aXhB>D3EbNap8WFB$x_Nj| z&65Yqf_$*!88$jHk^G4BhO>kO4*qUE!lFwrb(qQ&+Sis3VHTTnxjSYr7AZea6{Rib zRM3ln&}JLBtD)Tl7*5(u_H6@FO_klz>~b%?( z`ZwVDGJAq;JC{c0RZ%eQDhLg}*)7WshxXZUlKQ;P0~XK)@_ErSVgB=1U*wJ6^w!z5 zKzXi>al{1eT_118+kbi_O?@uD+B}XshUFYv>k_KZZ3Ww$r_7kZ0{mbIJmxm32^Wh>ku(x>0o$E2T z+Q^X=zrz=0|F{3%vfqNrE}iqI?S8-9HTNcnQzS}!MMJB0f-9hPkFJsVlZLw@FO|)zmY?3xyV!grW;FjV*>X9Fef32XYto}&+rjs`zJsYA zn7;aEeQkNjy(C;#IPoJB#N#T-Kvq&27>GS+)!O+04Rn2bMNL-?$oYJX%WWlZfck9O zgb1doAy}3aJ1wCExU^t|aT94e2B=SFZYG4!Cm__<&z`rGHk)t)rvGZ%zrumHLT2j# zhh=+WPo}2x<#9;+h+Z;hN-MhVU=8*w(9VKhSsmm$8sAB1bvK!kLHWg4hBPi+iXITFuI(thYpdYVaHSiclg1h+yt-gn80%zis%iZ`*Ss_*CbX z=^_6{@yWEk0J9b7TWtOBtn`Y^RX=`H#p4Ja@m)T&`7`;$6S@pPT2oU~+Dq9OpVHOV>+jy6f)KMY`o3g-t)q%wj-gv`N=2^2M#ndxG-qnx1>o$qJXnM^ zOHPPl=gBoNQYXK`e zSa!Y>({+d^of2GWH&=>_Vc+Ryn^)e^cBUOIDB>Nv9-BXY&SI-`<@-sQ_lgs-Jbn5I z_375l7S-h;h7%K@3j%05-}L3aiy1OZ0QC$f-aAa8a(7W7Xml)bIRepod`y#>e?!Fi zjX0?q_owVu&@8jiU4M? zJNP_^e7aDiM1(I9aCyH57hCg_p}|p$l7zhNWMP^0*g1F)Dih@10?aji zUR0?w-6DlYL?NsWq5nTzO%8j5Cck|1pKF40aPRP!`^8&UiQLQ|w zD@hPZ-Lx=% z)Gb@xb_*hK1>z@mj&o5MKdlDEw?mr$+5|_c01(;)->3+{qCVF>jCSw+e?bU zk~L_E>4y2U!LIzwa-Ablezt-(4J72`Uqw^DJv%+H1vCFr`^?v;UrlhY!ht>Bu?{SL z-X5{B(oI0#Lr)Lt`XK3z=fIp^J!=fdpnkAKXTiSiQw({v5`LR&ZxuyBZMn~0MPoIh+bHK(Us-X&r6YM zRP&+!`hfZPa%=m9c1njHs`bGh{pKD7p8d$|*+t*c;j<^fR+Iqts@$e`|N1>PVmcnS z$dmr2IB2^7JZni>To=?CA>2cUdMbYjch*@fmK;BPLFu7jj5>RBni2=yDs8#wRDwHM zevUd*XgAGm|NS?oyyuK_ZSMbWQfNlAZeC0B*S%HPhcbz*mP@cFc-q9x?X@Gzu!1k6 z>0p8uA0mkk+{QEw>Xd1h1$O740soFB0fst8|2$LMW&m;d*xf~gU9H$a^@EW*S=t(V zWn{YiH-kc=_8Gr@qksM1TzCf;V`OT4C558fd%7WWv}0q$xxH><&iWkgUmYt80KOtg!m0WoCp zLs%gDV8#h2whV4~Typ*iC+QUysz|n5*`CXSP~J!P8BPx?BVa?KnY7v7vld=-x-u5_ zsAV7-Z@8w6Mevw#@UZ`g*@a-e@0VX$1qfe~D{z>w%FSG@EdiR`^`nu~0w@OK!8aX7 z?81QnO8dyd?uj4SPo*TMFRO7ZZI?G+vT!AF3;5QB*=8R;NIa0A!@?HhOkZ;PyF%{p z#fP?THvF~A-lUt@m{Z-wgVsw|7{*}&$=U%OYbleRISVAx9Y!J}_JLru=-GH0o_xiZ zV*3azanxsR@wbVTD~2f4Eh+7(vGbcsNLMm=7#m^~xwbLC@3tt8wlNa$Tg%_~x-Jel zq@!soO%?>?Iu@|8`Z*!pzjK zPVz?=!~y=CmtJv{!@@bUBW(zEmsIiYkUYCi_X%RGiqzG<(R_$d++7pINs zeX4Au_}x|uZ4zLUF=;#SekRT?Raje1xa#_oR>Lc$L5zI}(#}f_VPI}uP0l*uCM>4tdC1xlr_@9@tO)zEqNy3|60Nvdyy|V-$+&GUJXkTSskz$9 zbYOAab22EH`1ase&igCpNwtpFjHVph6U*x+denrRAos`cYOD;21OZ&;bUN7J|f=qIhHc@ z4Z36&xPP#IN;X5)E%=0>z;a+_>V54+T#N(KyOME!=(`v6+O}XVOft_IDB;o(O3; z)r?WO1VJT{=j7{r#+Arn$r?ET_F$x4g;amfR`X!(4EYe=Fa)E%VpIm~PiBFcyD$1zB7b zb*z$WFp?sW_k0V>ZE*bSbCWSZ%{_0!mAGH2g&Vdn$xUPLpMfPJkF&er{;lmKZ+u-+ zH7EQ-gc8ckgFUJxqbUd50O-_*b<6s1du2u~VXjPo9 zg0ZRnf&^n6^-lhp15W<6NacjZ&R==m>fSwzXxr3V=SVN^!+?tD8hi;bC*&|0X-1!E z(-ZEp+m1OUco}6vqtlhu(V{ahs-17yMRi*)6?&%1p8ON=d2`wJmcH>Ly4_{J)iIS@ zSyvbjp57o_*l;_(u^BB(pW{itW|V2&%Lw!3D{*sFdFK5 zzw2iG8Fk*HK`5WkEh5K%$-X9};bF$aJskqIjc)Q*ea~P10|MJwX$H`))w~gHOB>3Ww%|C9K+M`H@V{v#2)5u99vOj{g zldGC_pA~)z_y^rYW4RceId z7|UOwTU{J7iw4d9#4*?NVULG32L_A8lQz+;Cdf`X@a#~P>=U_dulC|6KVsTLm~P+> zIK~WOJI*}+gAI&91)WiD)XY74FB6yf8yMAG=s6E8&5in})CApVqdk;3!yMzx=t7{! zg!=J&wv_Wbo2|wDzNbwG4`dPb_u;6+wGl7RF=50(L~c7C#^kw<@K7Fiqg{m4hN6AWf!{5;GiPCE5Zf-@!v?kB(NS;C52YbKSz-92z~5dldX)TQvj z3>sX>AMa|uIs5XoKPF0-XJjxDC?Dz&%H&-2V!8i5pib0*MOoWLKgICkfnfD{S6Ywn z_K8zdYSmGnOJ={Bw2g^wjJ;;d4PY!#aC+ANkEy?mi?aLPxZ!=ykWxc;DN-UJAP538 zf{LJoih|N2q0%5BF@vO{g3=*jfPsP_DcwjaN=SEi3^{XeuK(|T?&p=h7(dROvG-cX zI*#vdFb>#It+q~wfff19E(F}rguY%18mO-bDrJPgbU)m$?|^g`a^B@wDO1;Ud@6r7 zb>01NIu0f@*A*tmEZlQS9j-aN_1LaG>)CLpXb*B}5u+tnyjI3(ImG z<@ghP5(2jhRRFAQ`V0Ub4C$i4D-oL3=>>mvO1}v{Ac11*Qr8X<^=1w!cNAPg2wSZ~ z(vX}`vT;m!iy1XCoJ;{kHif?J>Yk@})wyPK^lPK##QF3%^N5|T-?aQ;>0*HAIMurZ z{O$jlgJgRFj$@8A-`#Hh;eq}2hK=<@S3}Z^(_8?Dhnw&$tN}TRdD~*+FuB(Pa4chP z{A*Q;B{_cdY+HBT%9MsP&u}c9agkyK;q!4k$7d}DHZP9eWg%OkFD$^x{51>+-6l7o z-C@d>i%o|YJmczXTaRW}D z>exSY_uPFok;DuhZx)7UgqdFfBlX3N?-+qBA3=<2f|l$8N0|TJZ|I$oP57$+&OaiZ zKE2opx}le7Ev@AgI*+Gb#g_=L_sGe1hA{Cj&vbpAVSK({fnS!2uQ z!9e|_hq3kG=SdlPf?<8k3#jtsS~005QJ}&P1O(3t?0PQf*ih*qAh^Kk480uNKk@`` z$>jPq9n^NGW|+IqLZ1d$Vy_)vG4j9*cr$HKq)Q&pS;Rko7yrKz0VO?xQCwSna#RLzSKQqE^<{eR#fik2t}L3L;OYEDJyer0 z!D-9lZ{&Zvj82aYFCcXH<}rVoH#tYm()mFHBz`OtQV(YoP@{Ae{8{K!uc(b*lf}K* z*r5fTfMs0!#;NzFrsG5<_oc^8z;fx$`#@^E56>{P{rvgzFKEo7x78*Gw=>6-Zrf#7 zQ@B(a!wH0b{IymsKS~V#4JBAj0IXMkdDpstzLr21(rBSyAzQ}H>~*ySP}NdN=WlpQ z&@N5H3fU1x2wI;FLD57Ic*_a@2T~P=PbNBqBO2}opM9l zXL+?(5ggC3YYbU`e{!6P0_^Yj+Am9cyZMU6l31a#A@*P5`*aJhp|+t8&jwI(nO5bkGkeEwZOl1qcF7+g>YDyVR#~xHoq*o%j z)uVC}@%kw6&lO!yjt+Uwo3a9>BVQ$G02@OHkBu*GoA3rWI9=U(t+-&(R4ZipDU1>g zYGnD~_er`+j1Yrr$v8!F*#Hy-_dk`+yVvMu1I)c_340R+o&G^-?f=6sF!~R zA+--nN%d5K<1~KBZd?plCb2gs9&dJ!IFhy|TWec@uj%{+$CR$)F^;TZ>|EfT+In)1 z%j4=RZxZz3bk_JNFfcL_b0F>S)Lg?~5>4^~QEVtSE>IVUxd*qmRT=ZJ=e++j8t{Rp zV*tk#blkeqjsbi!^2C{4SIWNEFG*29Re{*wpM7i-tE*wqk#LJ2Lxv3>^cGf!UACAL% zL)AJv```0~#?}gI#?;oG?64OpfrZbhgJ&%IR^P~?fV}PByVwUIOu$}rua*h#NC|tU zzvKz#nMY1a+5YYkxm%b0YyR_z|4Fm6jkg|Qe0>I$rMDbp*S>s&3#$M7{;q-pMZWV+ zR)NN)L0W!B_)>S19-3oDDgzv%Y|YPO8l!)ndS5!n;U++pn*J*$EW<$KboQWYBY#Fi zrOb_wY71{8vb54qI|uOghN7FaPu*xfRZDfLex+P=lkbvjuCAkn%p-xQGSOdaza!(N zLsjN?_RU!iwX~3|RDWUS>^lE0!fS0S=L|q-rmN!R!3%?LYM_iw1C()DiPH*csMl8- zXYnd^s+7>Df6Dp46&w~Fv~Z6){rbeIf{MV}JmU!^N8wL5CdYoeaqHdoQXaGWt)6h> z4flnBE?<~c&D+1dmR8@t_DN9eNi2x}({905XK4KA+-$o)ZZuO3Zm@`DLF>5mJ8M6AM){4ZYWal(Z1l=BjsBiq-kz&o`pPQv~vRWMj+nt#Q2&2 z>qO3gC>DUL{#}qEuT|Hn!pw`Wn2t)=jE|1J+V@S_=C6*|+ILF7YhEf5$lE!D%DMdD ztGA2Q>~WOPfTX&~@hik6Y;Mh+k+KsEKW(np6f2m{zM;9G%oHTGpuNAo$wxCF0;)7+ zyMGPpPs@)`rpv`n2Qz@qa)F;9Jt0|IA-KN-e~La}Bgd#*8h zX|x7VB+J zUuEvU$AA6S$zJyjGmDKo?2ko2dVzI+6g6Pe%W&(^%)qbi6oveHUy`G3A6!LJKdD zJy+}3>Lxq?BB81uuKGt?}fuI79-6EkglC;$p>Fx*KOiH~@@ zy~>s!s)Yh}G6B;64SHVt+A2zS)m9cSPSj(=d#GgwTxL@&+^?N==S2XG{F6!RKL&r&3Kvz^j;6EAgQ~S~n(Dk! zjzD*q`4BZ}*j__0Oz6L;TFCZ%2Eu3|%ABvdU^ zz|C^D(D@+MwT8_)^vH2ak(;TsHqnCSgAPar!=*7Py2M}-n71f&gKc?h&lKp_!*t< zhL>7Qqnkf?OA` zUmcWs7V?LUox|u)0QR?F%n0z(U|hFg@b?O)3Ob+(Db{*P3KCi){o(%o z{xv*L4?3`9zM0fxyfC{{D6CgHERnO2@o7ugh!lQgF4ydbr*5zBa`|+I|5~#cX{XNS zw*JBIXC3;=$cQBxPdJk+bdAK+U+2$JqyCi86Hvj$D(+f)%n%6Kr9Gt`55D>syK&{& z5nzv1Xmy6fT$ax4h>c?GB5s1Fw*Ses(!g9hsJ`b*?}`H`w* zU)bI$hgG~B3~H^|VXB~5H*}o>Y;yldDA+v;xog(UP~P!{s)|jbES_C9 ziU`~P0OF6~Rari65Wd+f#s~~z7ry&D?wy@nJRlBhyW^-v@w|@9h7(RO2ydkRbP}>(Rnn9*p(@N&vX26RIh|u|`#gRTe~HCsmDO!lI(!YRskh&H9KmJ0>Voddg)B! zEItcCVJ^MJ>?)MgD9E{C0zsp-T6T4F3f|i<;}1?EJj~X&-u7rC1ai_+zm=^!lb}Pq zxHN+0_$#L$9-Uof)b4f{L1Nm7(G}ILeX;TW(ug9*qxAb_auPzEiEdK-sU{vR90lIV zN*eJH#Ugm|blHVZTRXml=86?2ai}khDUL^CCxLNoTZHpcgsRKd%IJha8}ecXg|J zrKozbwe#^i>)Ot=n>7c*k!dH_c2?A6l^ix(P}Vj7G{cyx<*D~Zf)3hNc7`OkvA!Cd zbhVQYroF1Eohx6h`vx4W{a9(eth9Elo_)9H>j9Oy|0YX{%0pGl!Oy&=H2;O{VanSQ zMOdQ52DaNA%gDPQ&m@Z+6+Y`#4r3i#)R02({cc9KhH+V97^DfYu}n>qfP zEFwzX(@&57Q79gdmqoPkFHVNlx&HGi=l#(30#?3+OTE4lEC-YW2V%OZnGs|nQnjL` z6(lJ|&?JNd+!hE&0S&ut2ZVs4utx|^g@U^5ik53f!jFJg3ami3ZB6Tz44LYM>JFP} znK!e!@8aoVznwe`vCo@)DHKDfL1e{1g>5Xwvz`bv(B#D*vZ~U3B@r06z6;H3A3t4< zs)r$>mFey>x7f?5nZroi86ae0nj!diiL_*a@GyAfs&YRKVB51VZqVrA`d1W9p z3I{DX#uLy5qsCf%VsKab6jzj4U+g6Rq#S_)h_(ctIO*8Thh;~dqi3WI%fMMpVIt~rlgNRW5cu+L7X)YaMtFRB*00sl{ z6sB{-z9Qhd_t^P?Oy1ysM+)oN9r0s+rwh^$vzwlu_L->=1!&voKXm=C9l1mUD%wC* z5q!yHzK%d0ut9`i+WR&moXGYb?IQ@SiEtbA*Zj7>)*@4TcDd|Wol|diKtd6iqNu7P zB;3MxR6XH?u!O++5RZ)?)0Kfijr!Hs_5CSb^SIJG(pF=E1m%gZmF1Ve`$FY5T4N9;;8dkA2-6(_zhr!JHW~Dc6zb zlSu=XvXNE{sIe5LwE@2S5N7z2d+Y40Muz{%5{%${?qQCjdkk+;=)252g|&C-vrSV) zfpL;#2K4HNQ5uXN)nWf^8jb-wT&|j6;{0>Shfvi#8wxsw(%ojYlqdNg3J8lYlqdlW z=-Be>PO~LVQY$w|i2`8GMq>%(%v%9{bZ}A;1SRb)3fwrXt!lq(fSJ-s0KOOqgM>5J zM%D2rRiDP)P^7FdNj*y;4BSl^{49)LAI*L)aWCZRTj${11Q!3_#Gp}-z$zpSiXlOX zKK+IPZYUMrf@_3+hrpXKGZ$f8X{xv1IKJDgYsNu7W1@?}QNeJOC`nB&wGS%+s;pN< z(JIP4I)8?<_)xgY>-?bj(dH-2ddwnT(2iIh^^{&pA14mDwhk%{kLX6PC={fO-vfXe zp=9Z;cjG$-!hO|ONIyR-G>$)Dn2caG%*8gj5V}MZTAPW#$ zntow*TRhjY`f&<1@7H|fNNpHX7}PR5sV57EkoN}1M~}ba)_G24i~plf4c1~QqBJ47 z5hDh5UlH#+xEoUZf9*S_P=vxlPl*16m)bJqnJ>C2pY-V*^;7J3HcjvhQw5V@q5y{h z&vooRX`l?zamm~OR;TOk+V%u4`zy+%t z$T7B*?OlE63UFNpuq>R_R7;5Uy}r zjrzO*$fm%_mx%8+d;2uHvQACZHT}Gpe{eSwLrZ@=@yrhG_LNfPz3<_$S59?GhQ+Hf zx#EjjgDi;NBUkvJb+3_hn!-TZpjv=5t!7CZ-)as@3YBE@^+NCwtHq2k#=YUsQl!b@ z$T?qFfM1!=YTmc+zLL7wbMW4V$L0DO?z=d^mA0dS(3`L;(2CT`pa!>Q)k<2vyXSC> zU_==$0)*(t$z6CVkU%}sKwKAX0=U>?7bmBjAA_}3=$h`MBOt(HAh`_C=aY4q2(qh! zlqgt_dQshlJ{{D%ai5}udK8eONKo@hWdSR`l7p4o3zZ)w>26}0O47;{qv(L#{KVFu z(ej%BX9H2OQVs(n|HIsfL&^SEf}*G#Ug~hplDcZKX=w?TD>^D zB~{k6T>}|vCwkGgC;`lqtk>Dl;&PagEPjXpI5fug( zXn?5gNr+xC+>((7vLRr_KYtWRQ&b(LAn?*rhqI%E5Fot!u^Ce(DhN1pYe+7ep;lcu z_}p#`3$pG{LZa*R+r3|nA^bm<1(+D{%W7-IaJ5?V45+MO3A9H>_4CQ%yB`M$NZ?{` z>VsR-3$e$eRTY%4yohf*{Y9)Ff~T`g3oIV}YgRez`(WtQgcAfaT+z+X&O2M^$c=M~ z;lvUDvFQkD!m6Z91N7B|&=m-P(nQ0q-QrW*!#nMc3Mb$|v_iMT?vw};BMh)iG{iR|h+znr$s^ByLf-MAFr47sBw`sG zep-q)J?o>z@+%-|M~*cIcl+uHBrn0^a4iE9aa>@(ak_fG7S5+Zx+yi-Qr{MON(P{+ zQnlN{OBerY1&+$CVKMp1asd0(Kj|RrqB)>Ipz@OplKZnqyV7%JMM+w9o;+0_3U_ns3Pbn=)eYCQD+{Oh4PRM(4y0gevM0&$<2 z#-$NI=AWMm8@Sn4`U5&3P^f*S{zN?a%nfh{@?PQh!{EI5ZrD?!0YW2$M*b>RIH$-F z*jtQPDQIxwreViXUE=6VL+pGgm(@so^1lw_c*M`8w+RPlcHBCokMyYt=1CAz+HZXv zPzzHNVnbq)Ka0~p!F_}vmZ&$OC5fJaZwCVM4w=K=X~zJ@(-HpuM*lMa7tKPRr8ZX5 zK=}ce3_l0}qhZ|RPT zat~JZ3q5{!L@TT$V`-YeBdc*6?~ynx z?{ak7OA<{ePKN{wMgi<`4X{Fmf3#T8gNtudML6;9VSo+NWfHKOTnJE>L3kX;{qO24 zqJW@kK2_)cwphOtF;yPGa%Ku*Y*W0SyOQT%K#YmmwnCK}zsF_pdyteE!Vj>n|yC9ds=@tI}{Vq5bpag@1gUaasAZqL- zc5s(I)5x^Nhf3no!AS;CvHIM(E?x$UsIeBj?>fhc!o;BoRDap!MX#v`CdcEkh$3PX zUx-B%&g>1Z4-!f;F1sk+G`?5-+%#P4g^xf(n>R0{z}v76Y)`@05XL%PM!vnr%W(bd zxyRa*@zA;dWc*PaB0*W`DJ=Cm-T;S~pgKq6zu*vIyi&wxcE5vp3+ls7MF`0HZMz%; z#l)e4J1c6otrW~*5#P#-p9SszPK+4&c2(cLNI$uNNwfn$4Do;z;Q4W;8s{Rzs@TB? zbqf@X2F1M%J;efMoTmbq8R8vxNmgEzrc0lLtWEx<;~(T;+9pVm^7{!i7}g!fxqfQi zLO#LJhOOw_52FgLU(3NdkBo-ybVO&xf%42CUci%I`AfXRIfM(Z*+2KT^R_!9Ph1M& zXWr{WL(vn*M0HV6(?$hGymBi(>vQd?KV<>wZG5Bztb2zPKvvXWmK#mnJ(%t;ymM}( zmy!bPD4YbH+??y8moQ4yK$NQWCiRM8Xn(Fg8=Ua#n2zM1|E4@YHZhkDnWA}5kdRJ1 zEcpnMR3mt~FIfRsc{!s+Gq^=bv5oRH__ozGiCpS+uA8tR-s$u)e%YDX3Hs=j?PF4{ zmB-TR57xV{E6PVv7(n=3$4PUQs8^uEzXGn1J*JnJC|ukDVDmp*_izB{a!d_ukC^HF zJ5Dui)vw#Ah!EnH=r8|usP_>bDl!0;zwkj`wad4sss)u~HZGLwSVn)yl4`gL1+X)} z%k}Oq+MS+tcbI<3X?0<`Up8~hXyt&`=>JTmqLDyBit-jjh4*w$_2_m#@nqY1y(v@s zY0ce0-7fk+P*2;<{jlTRwTPtXx$K{Qaj-6|aY5z#b0|*W1ZKME{yJ}4C=>SybIUt8 z1(t*9jx;0b>y>A8IpSP{@j8tyMOAuIo!7U-FHP>r`(&qI-F~%Hu;7{Y$343f04b*{ zUrRhM)8S?ATwJ*0j2GEmbA-FQS2~n}#iquN_z$i+Jp@7}b5j8P_56>i+NAyW3iqmw zQKPuOWBw|Ue=jJWnFL3FSM#?T+jgBFl=>lgj-N_JpY3)%=+AC5R6a+ow#$?nwiIZT zQ9|Z{q7!1Q$9iaIhSF>4!LPl?ERrngR9SEr7|ZiK&~mRmgv41|{M~ct zcfaHd$lQ;R~v)!;- zzhh^PZ|dLqc9Qvt#u*do&X(Kl52B5`gG1jRnVV`i5&jzD_=AauoaR2={)8n^WJ9;5 zSBcGuyF$ND{^`hv=H#CqdMt$CvLg#@TVa0wid|m)|C<0Rlov67!a4;)d?Rf#*1)># zqOJf?>G;-8TK~7V8EO_EQn2K0k>E#O!aLov=)}Of1p2E{U}JN$8cL}aF5d$FKOA~Q z<+h6UUOskDetR8DUN4IvJNwU@h#$_u4@voli;FDml2gs5{Ag|gT#&XL3S|1jky@gv z!X?X}W3Qf3WX_gjfT5uhubNot553wg$7ODYy@aykG~n*UWe6bk9q}C{Zne_I$Ba){ z;J3SzO!wTb|-!GX|$`<6btL zWQprpwVF&=CwfHo9Doo)rEbzqYG8Nq1=~eT)y>W@SYV_{j~D6ek8iFj;rHUtTttLq zx{QDjTZ&81)!6rxdW=hJ!HIFT*#;#lM>fmZ=ln0-rRP<=a_`CtFTV zA0K)@pSFKzuafMGrKXW4*ISUVq`N5T!FT5Z`wI*eq;GQV!mg_-f^L76HFH~=d{O--Y>HKAETKz&q=CPx zQTd`N^VfV>AKHtavtgYV7gM_i@n_N74~BOFnLu$C4Xl_liPvZ$&viKW+OW>_SI&l> zk5~TchjNydPUQWKNxgoX%YFo|Uq&paB%sNoy#Y$$0Cyi$iNLf{)dqJ&y2lg?xdit_ zsCmXme*f1!SL>q@k4+Yl>Ji20fjE2gv z@!6w*F?evxp1m+6oHv82ki#E{p@8K_;Yf8b{KM0l7ep0a;QrJ1)F0k1iNU=ci;@)R z?N@~>0w?%Tm!*^7W>D2;TWBhf+thCevw>oAAc}aSoJo3^)Ya(ztgigNi7{5)`x?w`1mPAHa*?_%f!M7L}Sn)%IB!4g0HRSdqq~s_q9c zMk!i-`hRmi+le_0dnqVn3hY@9e*hz}L#tUTAu>MzvJbXWWPznB_N`|e-FVBVhgX;1 zX7=sei@@{CwhY?=kg$Y5QM$;-xW6=Fx@~XabNA&aJYR?5Rd3<88KWeH8h50qNUN4hbDFY3^zdk(-EnVJF91oaMGu?b?E?td zmDEmJoIfMLv!T`xw~YW5kWQC2qG3_QM}<(K!OTb^{=TdePx|_Jy)xExp=G|NU7rP5 z3X_~AKsxF}VGhI5E@;!e6aMj!B-|sQ*HG|P@DokPXlDZe z8AaXZ=+3KZu;G>qroD12{8c*MuuXP-y!mnO1X88D*;g{d6hzGdgzim|4M2K`-Iegq z!KHJ4T54GPQsS?Ji@#CeYF#BX;;X;KtZpkwf|0$8lwjyVShf`WyR7)!vI51{2Y|zw zhCOi`41hM*`Mz&V8g6Xc{kb`kSx@Lez`^e;+ly!O-OsDO;GZeOU%z84SIX$}On6!A z=FIxrAALbrP_+v@~y%OLsJ&M(1whrrW;o70km{`x=T&4uhTPG(p> z89zP(F7;$Vz2xv5rX|un6w1%dhVcmAOXfl6KRFp$r;)L=?vB(QF4_P*HZL?b;>e=_ zZj+&lb$ zW%R9H4xj)75z1XTM~+?fL4A;z%>$LK8~G0u(XM7J7g-@o6E5d}y&R6j8ytkbndr=Yjxe@loU^H3 zlOP=u4sgQw@Iw4w*4&EwH^spRV>zC!#iWIZ@?cQaW$XZLTNhsB4Z*XMx(}*EDbhH~qdVR%?$IBKGQF-VgiBqejEW&iJxGXe9Lb? z+rpfOQ&#=K=QYR}kZ0SzE3)yHk?+RvDS^w33_@?K({$+PY@2QzeMR-!>g#7wPD3+W zpT89lSVdvuakCW&iL?*(_E3Q)W!VWbjLS)2!{+u4ZsqzNKCn?>051YOz zqb9F8yTwlhq(Uk=C|2-_c5{#U0wv> z*8^sU{L0_Y1&G7CTj38>n%Qyx@2(}SMz(3s$ zGTU*O`B%Tr1j@F;YU?V|05)=}yifxDbcUS!Z?iaZ&e*;X4*L2dIpAqmwyWAJutZmc zb{CLzKmF41@M6)hbgLm1)ORUCr|T8;O zc=(AAcfjooxLOX);QyS%-0+dUVX@jJq5}rJYcU@TRT6+mKP zYrAGV&iQjNgB z8vZER$A=e)Sn?5EaHjhHVNCU@coB^|W+bqT$?zonSqAImBCn}x_ZvO0E6E*(B@JJD z-#z`5AklEz)kgAq>_;B4(}}&k+To6THIlf6yxeVVnqZO6$0E3NO4>#2HtizED-2Cw za4<%W>)CVW1WSho8Y@0#hjDEO7QVh}?}4uAkIs1a-3?`8>R#MX!1T@6b4x_?%ASMn zy@P@LXGWSpdw*}zVyB%}==hYOt4O8eV&nTAU9o@c9jWMM(O(khV+QIzk}}I*B&`{`SSq2o(5Ub_3y}6b3dZ z;K)c|V*(bt`pIY^HWWb^2&nxI1_l6#J~Ys@*^~w8^KT(#KvVT7e}qlev5^6q^*1}z zCQ><^IQxxCUU-QIs!+*Kouo+Lyt9U%Ai#;-paI@tAX`!V@_r)#?AxZ7Fr)!p(1{^C ziUDwC{GtF$qKCf#Ai(=@DTR0xjO?;=p*pYPv2FT|V`*E*L|+ui8Y0msq@t+qCIX-0 zuoLki#)vx79$#mSDC1w6k$X!-2vi{Z)@K3m=cmM87D>=XgK!RFjnZ#_d-T>sxvcM3 zJMWbsACi^g48ZXm$b3FRn4nyd*$blw9vE;5gQEi?S8EW$n~Y z+R-b*(k+`lU!Vm^jfJDMBPinIsTtJ}zyb_#RM3N;D|}(!Jwu3xrn7mR6%9;D?DRvJOF86QRC4tQP`O5hSy&8fu(Ji}JhgqF zH8q}<9)#6^GAo0shcxG^eBWZK^rz2P7GdmHx+3cK$2$zA>UFfV#~>Ml=Ue+jn$z0Z zD}K_9s-m(Vb0;Z|$8SipgG;h?jl@R0D(Vq5?4B3aSYW|CqdLM>u;h4q>PQfEs5+hkV=_3?V zjJJ3lID}l?d8$ByqMWKc56a+XG|Y|X{IQnYx>c%&76xr8K;)FAiC;wrFHV;h@U6*( z->&Vif~`I;#fYlLnGV?{-<93=Z@eiKU?yPG2l<|Mns}8K{{g;MMEY@a&WYBPvb;Aoyq5DC5wHWNC_3XED_^@>{3Uh3yT$Z2&*RrmSzsNzrxAxCd zmH0;)OzVF2AZ0P_GS!C-@PQ3ns?uiJ{q3QbkR>44=Amr~r67gXNI03jZXkh!-6}a?BaBQ1$u|vz*IHY%E+zohaQhAvMv7e&AJwYx6*;w{<7SaHFT1q6S zj=*rKZcFTDdu6rSY1NWNU+0C227LL!;K!xv#eBm?YC1o1YI2;L;B&K_!&UK4hOF3< zYHtDApygZ5SZe6bn2+SD44mVlb8VN%lW2nU4BxEvdufGiFm{yBFl8cHa|E zbv$u`eJ{}@s}OyB6cYA7!MC7FlaTPdd|O9J!8Px#@|`oa^Gia&z#>b6c-8OqqgDOO zvp4$IG^iGd8T6I_bvMmg=+f>`b`}bUJ8L#NImB?yl_C3#YXve7d#Md%u zZPQ?t=vRYh+?ii+-=w?J{1YVxK}l3%-iWDW-Z^F7 zb~vw-!MS&?5c|FILQGA#NcgLh{enN~hiVndS_3ty^W=h@`OOytHh(XE-6}6hEZ<*I zAkOSIJK@*!nwOT2cMT4H<|ujJVpJO9#rPxH*<#MA(mKSXbWXZxZOM0_DfFb1_aar1 zTib1~>8Gci>XUxt-!t)4@6G#?qrT6eR5niO)wROxwfI|Uuy_aCeE9z+P`8XMzuOnw zmhts+^!QOE?KR&$kWs34UGwA0!&2Ynw@b}v-$53pEoTq7k-Jp(pOumKCU;kyj(=={ zI52b<2l;xHI`(^(`u4nt-?KoB@m~|ChIUC8y|()XKfVt6M4{{(k=>iL$b{V){ygB+ ztw)}xOFCv%aqI>0RQL(ZEu$A{G3AeS(|k;3LDi309w_OK6y=Y+xY6d$*pBsM9CK%B zzq&*M({d?Y13rswXdpxSSgmR->LK{sfqLP^^Nt@Ecq0|-E0q$c*6$F1;Cnsy@vD_P zLv6?2qY0_EyGVR0S$6J8q8J%5xD{3bLN+hg_LIf(#kT2oW10AXLy7x z!FKpwE1IxFE__pO$b@74BiQV*1z4HJr{h!46?@n4gA`ZPk2nW7} zMJZkzs#lb$pq?m1z@KI%PXdBK>5C(pgkSU^-G4??P!3cDQ&E^6yoEH2A#X)_zc&?| zt^aK8tK`o*c_xWCUE}^?pnUdz?n$;+28oUd4?}N4CUQX^~q&KDp0g zyy;alr&`S>8vJ*7eyt-5uOhO3NJMKrrfLaR73-ExnN1y3Eih;xR}Me?+$H)dCP}e+ zqLlr?<2{Cjj4-CB2SNPA#U}!3i*!!Qy*rtuf*B&=DU;f*65Jw8gFZ8Zwnwj$)tynD z#?oQE)4dOm1?&E0%jt)tkF<^Nsdaa4exSy=F3 zM$7fgxh54VptrYRk@q!d#EHhkzvY!riM3LX)2=06q&a7Krs82@^`22B@u-($v9oF( z<@JRZ@Nm-dtR;)F)P9xsEUV;A_GtyAYBuZO*7^O&mb!CU0LMw;Qv|(#{mSzx5h|ih zBPnL3_cfhXvE!x5NvQRHcd>#emlLKCAQe%0)@E-1O4E?vyquEtlp{AdGr#aHn}A(k zmc}>N9dri2f3qFtlS>ajx%a-3KN|9&!$g0K?sUPDWjrjW?KmlIKu+J^EEWMH+u6qD zse{hGg39k^1@Ep~3={;Zsh@RzP8LLiL26*$syKE4MHtI}>!ng4eFu91R5dLA803F$ z(Aw#_h5~H?ys?K59(?ZLs?LNr$A$h%%^+hbQKHT ze`Yc~TW5u>x`zc4dxkRCUoVdRPq>=fT&Yt?W9=}IR(2fja+a@LA$ zR(qTGM!R0f>*wPOwT${7r^i-lp~06AbidH9U1 zDnneLO~ig$Uc1uYfR?M=!X2JvQJW}^%AO;AF_KJtO`Rk$mrduoXfbTZ_vya1QQcqb zU>UaS+xKipY3Emm_puL@mOa)vzg{g$yNiTU=(J@n@G;rUZ7IvA*IW{yAr!HGz_5gX z+qrQlaEE_22S1;!a$2N93&Svft ze?<+AH_DqUj^{^CHsetgfjgh$BLc+Eh*a~S0Q93i^&Nk%H1N&3G3ltl#m$%7kvvlK zYDg7WQn_Qv%AxU(}M#gJ^^F`LQy3oL_%qV${Z5sJLJZ`qx8j#?QqX*#Cyga6C+G+ab0+($ZL`_`TP5Dwf%PrqWPKqNiL z)9O9+py|}xq<2?ewTL?&i^n}cKB7XGi{>97nkYoCNX7}dgreu6Za9rOX&57QTjfoB zkPGr2u`QBtMHo=XN|BN~B7tB}C)c^F!-G?W(v|i9>9s}^o?ho+!C@bOs-DV+z2&6c z`K30cVTa~r6vH`i>K$EN^^U1fB%L=3Cmny|vsQeX2hze?%Uh_Di^EFY*oToU{8wpH z)qx`ahe$kve;M}+e<_sXF?f|Mzv%EAL+G{p7=8au`9DdJ;je#Z_qrA*c4nqtYwK@E z#~XnAxjnqdfd=0A%XiZBm}vVj05=M@NzcA0^T+9~Ts)F0&up3DX%k=3@_hF)I~w{l zr><7(3j_X5;<^Ne#!*XNrLCUacrpHXU^A`p;xyj)nKCtUhUv)H+bE)%cdP~|9v)ps z*<&BvnbJJ$t=_q-Z>7{X8bPCg_K-BSHJ_|Tm^drj{A>-0#Erxm*G{i@5(V#9Zqw#&e zwdlaipUq{s?s2|tWO(&CaOeDk-j(mYu0iXzJtWQdzL}HvNTmcR@>$R24tl%&<&ezP z>xbudyzn8*l>WO9mPO&?wTYbqu}M^W2l$!)Ai2@D@r+}q+6Gt}rRX#Sl$5=NXC z@Qe836*+x%H4Pp?xHW6{?A41af3&N$cYXxx$8Z2@mHSW}3>6ne$W@An0zRt|if zZvQ0HzV`aFh~=P)@;Ynzf0gMzdayKL#XoDSA$1NROrmoYFCEtGP{81>^5({U?5gu& z_Fff)Uex-5t3Zf0fRUw+h3dBf`rd>d3)#n7pu_-_sW~>d&rQkT%Of9NYt&8nb1HD) z{d_Jf5%?`UZlo7;tmPhT6-lg@$IYxI=Y#L&7kG81!;ck!R4M7Z6?PxnuQ1j=UD%{93C{F_?XsaA!==PMJxy*Cg*hM2T1NX`+iI@AUJ3`CIS*`0QFI3r&B}6z-Yl8d##-s6)4R_Ks zrvs;qude1W=P9+D#;C==d+3fij}rT~{GKEzNjiE zIVZ?MhQ}JZn`fok4Xh@5jyrfYaN8B{DSq)R@EUgbHU1iPDBo;;nXg2koW;+GxM)QR zI7+ZzV8!`ZEz1Du2MSV}2CTZHEY}RwpAIE!GM$hjm51C}$Za`FVpQ5q;{=z4k>7T- zs0jd0OElk-QsypVq(yn~fb4z`3&lIKR%@HFX2)`!_60u=+{{7%$@xKdys0muh(C6V z#DA$~zGYS2-D?L36%Oxm19}GC_PWX+hKKtcPhAuYSlDV12ppeefv%6 zvLUt7*-z=!a=)E#7v6atVT1qREGn(K;bfAPf?2EXRH- z)V}W2biYjLXITMX5$tz7%VSJ)m=N5bxSpKnYQ9Vc8L7HKJ{b?peEnuhkGJgMM+O4j zKS(d+8#%8eCUd9^S7{K79ny4@N4Hv&#^&yXoQ5TT@K&us!~sLPKx#bbb&!{t8_gz#w?~U)d*E;(>cdO-#40c=`NoCa>6*Z#KgeWZ`yaC z&W`csnpbD$q?&AfwkFj@;Jk5zNotX}E7-PQQvx7hY2O~;EM%EBVli694bLs{Ug+3l z{C8}gha9{-l*tXQH#!hh79WKqevEitCN27F!CD;EYBWZcdSscEjA;asw@mtH{j|z` zLCWD*3l@`;g-UZ*#8vtH(aZyvG?p6`gkuth#GmH)8UEi(1;Dly`!4 ziDiK1z7icQKkd1#V}V3)4h)?~^vf;2bjHPD_KhaZwWZap$C18w-5x)*Jvd)$?_bgr zp>|m0dSd)OyD~MP&Ll|!WiE#Yws1q1cR~7{Z~HK>Ad}x}1td6~{*;+71GN)<`Ez67 z)L4Ie2R#2ZU52#KR(~yCd{)%{jlbWIBlhs}T{NSGknzY-e!1wCK}D;W*w2J(YJ2v6 zwABg|>DE4OG14r;vCS*UFx0Km^lCgRve>({i`zeX#Doi&*Y#ccWo#Xq*ed%Lg)kjr zR&d78hqxOjBafa;H9q6XpxxbB)75EoIMA8qCu9^tR%zALpX8cN2hbrFdbJ9oMu3JPm1-nImYY_ zn9W4gA^Z&sMhIp38#icVdK(t_vdl;`rD*W z-AF!XJR56u=cEXLA^T%Jl7d`g}F)v zRNZr!siF06+@@G;70&dr@~!Xpj3Yus2r7K=PhZvdkxc_XToxbYnC#qFYGbv%^L{|n z#_7@9Rw2swgKn{U8jZVxS^X{#gx6H}NOW&fUfyX=MG*uT5V#mig3qOsoTH(T+tbR3l=ZpkN{f~z>|LHvH66|``-u+&O+Q(e2eAUQ9aeQf^EIDSjRfOt`%`bxvAiT~y zedYX*N9ifNP(xjgno-hXUxQ5c<+Aru?n5r zcU?(9mQ(Nv!%>_+?K?Kw_- z{?h8z(8FkH?9k89&p_spy;y51fv>eKesyu>z3-%?@X9TZ<^WR{n%@>#*vZGS@du#fp_g)n!EzwcBz||5`P})Zq=gERdl`4=7ES2`ts4+w9X>Tzx(% z?L|*)%gUSBB!m-G5R5?t)j1j7EVhMTh z%p4bQx&6{YmWqcC)iPvtXMe^nM{$%_#cuiAtboebP(nABgvT9<+~=&vF`_604Fr5S z)l+7ftYXY^m1auqGQRzj)(N1Iw(1*@rZdsaA1+ZRZNA9tobu4cPP(V0GjAyosQmA1 z0cKtl0~jyp7RkTsPr%jkswXTqlBj7f_BT-N5iI3|%oUWQ?xKiLqruL>!OG^*C3f^*gyS3lAt)^l+>Q%Tp^)-|Vfbf%whimD=uawg!S%3!*gu zb>H;SHQj=0sJF@BTf?9Y&p#?Us{4gfr~NCRO`ZL*0e4))&3p4$vs%yGr(KiMxf!|7h{^v%%TK!S;1sGYsriLD5v zCca@a2$4Gfbkm3nKV(r|N~dUJ-8hKjYkXVvXQ-D!=xJX+#nBW@{Xi5v zW>daBe(W)F&bn)MD$IOh&%v!QY_w%Jk#bc9^WS>qo0TYMiUeIByw+?DG9+Y-$^G1N z(}Pr7j}<&f>dLj7e2+S!Mlf81XdqaxzGXJPcEhRH3Crua!Q%?Y2wZ;@hZlPf*NCWW z@5JNCk{NC=EZ3zC);SgR&U=7t5Rg7sen&R>YQ>;(fyKS#f-Ah#lk_f;oXskzEbXI* z`zLnH#PG_TDVU=5Egd|5K;_(P>hR41$1(QQ?7(M(3>X(J-|sM#EVOW<$o6z zp~Cb&7xYMVHa-cEXSW}0@XNCYYrXQhS!_CPv5gBnTkO-K3!;h>+>e7kj;!s9KmlLm zDiGa2nG<9uwEU*}QTg|`+pF@^CbRAe3dhAUFUks@1ggbM4QamnHvMHucOD`vAPi}p z=1=}G;gW_W%%kp!*zC+q0#X)ZOdDESOo1~)uMXmXYT`#+*+_(bGb2JGIn}P*jTLu<~qaMz0(rmm-tJ4S6 z?;D`WvgZKax?D)geEMp=_Dx&fEOFSKw+|63Jz0`a+xe@i=I_Z@6j8%NQ`0cgcCO(u zK}k31A=w<=1yz1$R1mGAVn}N6Au_^Y4SFQGjD63duUkm@^_=~(X_PDLZ>Q5D(UKdK zw_t=7myRhbiGrl9@R{Ij+c`LVpI|+SYrjP(L<->D z_@2$uu>B}cJDD2GiR1=8w*x5GoEqL@c{|FeT%h{T${tMgfkusx`qg-c19LUS<7fK# zr%YBueWLL70{d&@!kqb`kGg8qh{t`{n@>-f4?WI&P5gAeAUCXT;eMe@&);8&rV2ra z=_ww> zCN=2+(#JZQpOay+hKE2s#^IN+<7|h;odd>pg zo~ZR@$Op&=TNGn4Wary#jkAmnAfhnyt408}T_~_K$Ai6g3YxOhx{eP{o9YuFj=1E^ z4Id-*z&e6RSqmBHUb7vc=aN8GNsW;4i$wJrlIH~#)pJflK>f!bO&_7yO>?4wsze|M zVFLlEr$%R$q6z5h@JR0p3o?@nGU5d?`F$4cMxVO>_=CS(zhLYKtuuEYljkC2~W+%1|+N&%0Tc2O{TG5^tG-mq=|YU8mExull|v zem%`^#lU*w4qK7h_0WFA?q)8s*y>Z`L#-~{Pb?f<$+b}!VjjdNi*m~<|IDuFR=r=&rC%^mXFT4yFwO!|=YXIb`8MByZWo)#Km+ygWc4Q!h}ZMcFGFYMd_oz6>$QP|IVcgrblpmbkg!>Ek;3@?4X=g5wPm1^F$JI7IYf_-1@>+clBycX` zsrI)Pc`pT*DB()}Uj6$Qg;e3~q_lHlA58)Anc&dC^wsNKG0)CunesyuF;m5`MLwu? zr+K-ZaDE>C#zcrqP>Hc_{3T&=$ROU<0<8UlD$;JCz(Se>B93|>j#CY_{9#01Y8u>F zPkPQp{mTt8BNiU8E=$&4o2!d)^TY{}`?r-0+U{jED%6uY1Un6g+4p zuvSa0bOUm(RoZ5`8uBdGw&I4n2hjDS^kWl0{&b`BO|FcUG}e;#Y7GBf;N`wn2aVB; zR2VK(zdE3IQggL5Xpvm&=nneut0E@Gt$WMtlt&`21KCW;X};ftWMV@itE6tAs&hdE zh7&iUXAEg=pL^D#LlsAncl2o(3P*1OGsG4Xd|7FKsW}J~S3!I}B{ZE=V#Eap7fIyO zGb1j1fH`)K(5-NkJc>)()3{bi5`{}{)m3bl$jg*EL(}_a5C2g))Xe4f%qnd|wO_=t zzWn%$G{{1*^a^8Ge)|6VoL(}ODNb}MNAJ>=p%Z32j39gNjH5WH-~{SJ#mbR|??`Vzkq-*#y#r4>zk>!Jd9&)^R;P0bvT$FfX*}IP zli|=1tipcG|5F0p4LE4e)}gj!rS?TIQk{f3*=X|#8IveQ#q8y34-?z75Bdw9KaH|k zk;r}7u@d|g2;R6;Rrg15vqy%16xTnoxP!seXDCto;rWJhblU#S<<+~pr@mN(o`Yc; z8n|D8$g3^w?q=z@>^hlnxB4!@#=E0%x^21YwBN-|CiQbZ0+lOY1I4;5%ezm%p4prJ zL}NL1E8~$RhQkZ+tU0f8Eiq6SY8 zGU5{OIVs8uS*#nLh{FTwL`bS-%ryZtc?3)aa={oLTIcDfgs4C`oiG$=b+n!?0v+pT zop&x8(jxgF2=Kq}E?QlYLW!~MwU^5CIXg~{CG8CgV}-AkeC)`Q`|YspXrNlpMgl`0 zw>-aE5&wl{T`ny!I8=T<9wq7pmp)>D%QoGs+jDPU!n^uUIeabOeHWL2!{QP8Zf$cz zZzt{3ogd>8V=w2{kzJ4a=#qtTGuBZ9##-uVL|f z@xGG}r#_{#gFMCXu3EJ_(Yy-C%XqOh88S{*xQY!S5au~I7$0|eyP4c|ykSxWKy@u= zmqD(_y|UM;6lz^p8Z%ai6-BDHa@REd9H`9Cs|!Vsz2GcWu-Dv$R-&C@8} z-6Jmcdf$GrTXMZ6Au#~|01k3-4qoa)7PFV`q7Uo}JE?2ub`o@aeB|As5-5>Z@}mPtBzN+eGH%8T;t+1lX>lXDDH!d!}WnT$|g(i z{Ft`=cRVmXaRhIo0etJ0m5^xwS`46Y(6Vg?G^#KnL>YLarfz7A-@Qg#99m6g$gvz9 znn`W0-HSvHO)$3JX#8utd$+pSSK;;TQnO9kFJAn+73V@rhtSG_ zP_?PJ#TlfhVe%$#@##XN8cuiTDYVEtnk&;k ze%-lm^GA{R-mfVEj!`?Q@46-<*82PT*OPX?j@{gg=6IQH)o@BMe^2X^M0 Hx?cQ$#6T=6 delta 41785 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 ui.loadfrag.show("$text.server.closing")); Timers.runTask(5f, () -> { Net.closeServer(); @@ -438,10 +433,6 @@ public class NetServer extends Module{ } } - public void reset(){ - admins.clearTraces(); - } - public void kickAll(KickReason reason){ for(NetConnection con : Net.getConnections()){ kick(con.id, reason); diff --git a/core/src/io/anuke/mindustry/io/TypeIO.java b/core/src/io/anuke/mindustry/io/TypeIO.java index 294671530f..7a0f2d3069 100644 --- a/core/src/io/anuke/mindustry/io/TypeIO.java +++ b/core/src/io/anuke/mindustry/io/TypeIO.java @@ -1,7 +1,6 @@ package io.anuke.mindustry.io; import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.utils.Base64Coder; import io.anuke.annotations.Annotations.ReadClass; import io.anuke.annotations.Annotations.WriteClass; import io.anuke.mindustry.entities.Player; @@ -17,7 +16,6 @@ import io.anuke.mindustry.entities.units.UnitCommand; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.net.Packets.AdminAction; import io.anuke.mindustry.net.Packets.KickReason; -import io.anuke.mindustry.net.TraceInfo; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; @@ -364,45 +362,4 @@ public class TypeIO{ buffer.get(bytes); return bytes; } - - @WriteClass(TraceInfo.class) - public static void writeTrace(ByteBuffer buffer, TraceInfo info){ - buffer.putInt(info.playerid); - buffer.putShort((short) info.ip.getBytes().length); - buffer.put(info.ip.getBytes()); - buffer.put(info.modclient ? (byte) 1 : 0); - buffer.put(info.android ? (byte) 1 : 0); - - buffer.putInt(info.totalBlocksBroken); - buffer.putInt(info.structureBlocksBroken); - buffer.putInt(info.lastBlockBroken.id); - - buffer.putInt(info.totalBlocksPlaced); - buffer.putInt(info.lastBlockPlaced.id); - buffer.put(Base64Coder.decode(info.uuid)); - } - - @ReadClass(TraceInfo.class) - public static TraceInfo readTrace(ByteBuffer buffer){ - int id = buffer.getInt(); - short iplen = buffer.getShort(); - byte[] ipb = new byte[iplen]; - buffer.get(ipb); - - TraceInfo info = new TraceInfo(new String(ipb)); - - info.playerid = id; - info.modclient = buffer.get() == 1; - info.android = buffer.get() == 1; - info.totalBlocksBroken = buffer.getInt(); - info.structureBlocksBroken = buffer.getInt(); - info.lastBlockBroken = content.block(buffer.getInt()); - info.totalBlocksPlaced = buffer.getInt(); - info.lastBlockPlaced = content.block(buffer.getInt()); - byte[] uuid = new byte[8]; - buffer.get(uuid); - - info.uuid = new String(Base64Coder.encode(uuid)); - return info; - } } diff --git a/core/src/io/anuke/mindustry/net/Administration.java b/core/src/io/anuke/mindustry/net/Administration.java index 48454fa1a6..7c69d5d816 100644 --- a/core/src/io/anuke/mindustry/net/Administration.java +++ b/core/src/io/anuke/mindustry/net/Administration.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.net; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectMap; +import com.badlogic.gdx.utils.ObjectSet; import io.anuke.annotations.Annotations.Serialize; import io.anuke.ucore.core.Settings; @@ -11,8 +12,6 @@ public class Administration{ /**All player info. Maps UUIDs to info. This persists throughout restarts.*/ private ObjectMap playerInfo = new ObjectMap<>(); - /**Maps UUIDs to trace infos. This is wiped when a player logs off.*/ - private ObjectMap traceInfo = new ObjectMap<>(); private Array bannedIPs = new Array<>(); public Administration(){ @@ -53,17 +52,20 @@ public class Administration{ if(!info.ips.contains(ip, false)) info.ips.add(ip); } - /** - * Returns trace info by UUID. - */ - public TraceInfo getTraceByID(String uuid){ - if(!traceInfo.containsKey(uuid)) traceInfo.put(uuid, new TraceInfo(uuid)); + public boolean banPlayer(String uuid){ + if(bannedIPs.contains(ip, false)) + return false; - return traceInfo.get(uuid); - } + for(PlayerInfo info : playerInfo.values()){ + if(info.ips.contains(ip, false)){ + info.banned = true; + } + } - public void clearTraces(){ - traceInfo.clear(); + bannedIPs.add(ip); + save(); + + return true; } /** @@ -86,9 +88,7 @@ public class Administration{ return true; } - /** - * Bans a player by UUID; returns whether this player was already banned. - */ + /**Bans a player by UUID; returns whether this player was already banned.*/ public boolean banPlayerID(String id){ if(playerInfo.containsKey(id) && playerInfo.get(id).banned) return false; @@ -215,11 +215,13 @@ public class Administration{ return info.admin && usip.equals(info.adminUsid); } - public Array findByName(String name, boolean last){ - Array result = new Array<>(); + /**Finds player info by IP, UUID and name.*/ + public ObjectSet findByName(String name){ + ObjectSet result = new ObjectSet<>(); for(PlayerInfo info : playerInfo.values()){ - if(info.lastName.toLowerCase().equals(name.toLowerCase()) || (last && info.names.contains(name, false))){ + if(info.lastName.toLowerCase().equals(name.toLowerCase()) || (info.names.contains(name, false)) + || info.ips.contains(name, false) || info.id.equals(name)){ result.add(info); } } @@ -287,8 +289,6 @@ public class Administration{ public String adminUsid; public int timesKicked; public int timesJoined; - public int totalBlockPlaced; - public int totalBlocksBroken; public boolean banned, admin; public long lastKicked; //last kicked timestamp diff --git a/core/src/io/anuke/mindustry/net/NetConnection.java b/core/src/io/anuke/mindustry/net/NetConnection.java index 7314caae55..3b572d0bb5 100644 --- a/core/src/io/anuke/mindustry/net/NetConnection.java +++ b/core/src/io/anuke/mindustry/net/NetConnection.java @@ -6,6 +6,9 @@ public abstract class NetConnection{ public final int id; public final String address; + public boolean modclient; + public boolean mobile; + public int lastSentSnapshotID = -1; /**ID of last recieved client snapshot.*/ diff --git a/core/src/io/anuke/mindustry/net/TraceInfo.java b/core/src/io/anuke/mindustry/net/TraceInfo.java deleted file mode 100644 index 0b62ec54d2..0000000000 --- a/core/src/io/anuke/mindustry/net/TraceInfo.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.anuke.mindustry.net; - -import com.badlogic.gdx.utils.IntIntMap; -import io.anuke.mindustry.content.blocks.Blocks; -import io.anuke.mindustry.world.Block; - -public class TraceInfo{ - public int playerid; - public String ip; - public boolean modclient; - public boolean android; - - public IntIntMap fastShots = new IntIntMap(); - - public int totalBlocksBroken; - public int structureBlocksBroken; - public Block lastBlockBroken = Blocks.air; - - public int totalBlocksPlaced; - public Block lastBlockPlaced = Blocks.air; - - public String uuid; - - public TraceInfo(String uuid){ - this.uuid = uuid; - } -} diff --git a/core/src/io/anuke/mindustry/ui/dialogs/TraceDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/TraceDialog.java index 2cb70b4346..7c58101b03 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/TraceDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/TraceDialog.java @@ -1,10 +1,5 @@ package io.anuke.mindustry.ui.dialogs; -import io.anuke.mindustry.entities.Player; -import io.anuke.mindustry.net.TraceInfo; -import io.anuke.ucore.scene.ui.layout.Table; -import io.anuke.ucore.util.Bundles; - public class TraceDialog extends FloatingDialog{ public TraceDialog(){ @@ -12,14 +7,15 @@ public class TraceDialog extends FloatingDialog{ addCloseButton(); } - - public void show(Player player, TraceInfo info){ +/* + public void show(Player player, SessionInfo info){ content().clear(); Table table = new Table("clear"); table.margin(14); table.defaults().pad(1); + /* table.defaults().left(); table.add(Bundles.format("text.trace.playername", player.name)); table.row(); @@ -50,10 +46,10 @@ public class TraceDialog extends FloatingDialog{ table.add(Bundles.format("text.trace.totalblocksplaced", info.totalBlocksPlaced)); table.row(); table.add(Bundles.format("text.trace.lastblockplaced", info.lastBlockPlaced.formalName)); - table.row();*/ + table.row(); content().add(table); show(); - } + }*/ } diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java index 2bd79e4a63..2a58ffcab8 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java @@ -119,7 +119,7 @@ public class PlayerListFragment extends Fragment{ t.addImageButton("icon-admin", "toggle", 14 * 2, () -> { if(Net.client()) return; - String id = netServer.admins.getTraceByID(player.uuid).uuid; + String id = player.uuid; if(netServer.admins.isAdmin(id, connection.address)){ ui.showConfirm("$text.confirm", "$text.confirmunadmin", () -> netServer.admins.unAdminPlayer(id)); diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index e9601b65dc..bdefec5ad4 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.server; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.ObjectSet; import com.badlogic.gdx.utils.Timer; import com.badlogic.gdx.utils.Timer.Task; import io.anuke.mindustry.core.GameState.State; @@ -18,7 +19,6 @@ import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.net.Administration.PlayerInfo; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Packets.KickReason; -import io.anuke.mindustry.net.TraceInfo; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemType; import io.anuke.mindustry.world.Tile; @@ -157,7 +157,7 @@ public class ServerControl extends Module{ handler.register("help", "Displays this command list.", arg -> { info("Commands:"); for(Command command : handler.getCommandList()){ - print(" &y" + command.text + (command.paramText.isEmpty() ? "" : " ") + command.paramText + " - &lm" + command.description); + info(" &y" + command.text + (command.paramText.isEmpty() ? "" : " ") + command.paramText + " - &lm" + command.description); } }); @@ -176,7 +176,6 @@ public class ServerControl extends Module{ Net.closeServer(); if(lastTask != null) lastTask.cancel(); state.set(State.menu); - netServer.reset(); Log.info("Stopped server."); }); @@ -268,7 +267,7 @@ public class ServerControl extends Module{ if(playerGroup.size() > 0){ info("&lyPlayers: {0}", playerGroup.size()); for(Player p : playerGroup.all()){ - print(" &y" + p.name); + info(" &y{0} / {1}", p.name, p.uuid); } }else{ info("&lyNo players connected."); @@ -277,21 +276,6 @@ public class ServerControl extends Module{ } }); - handler.register("players", "Display player info.", arg -> { - if(state.is(State.menu)){ - info("&lyServer is closed."); - }else{ - if(playerGroup.size() > 0){ - info("&lyPlayers: {0}", playerGroup.size()); - for(Player p : playerGroup.all()){ - print(" &y{0} / Connection {1} / IP: {2}", p.name, p.con.id, p.con.address); - } - }else{ - info("&lyNo players connected."); - } - } - }); - handler.register("say", "", "Send a message to all players.", arg -> { if(!state.is(State.playing)){ err("Not hosting. Host a game first."); @@ -384,14 +368,7 @@ public class ServerControl extends Module{ return; } - Player target = null; - - for(Player player : playerGroup.all()){ - if(player.name.equalsIgnoreCase(arg[0])){ - target = player; - break; - } - } + Player target = playerGroup.find(p -> p.name.equals(arg[0])); if(target != null){ netServer.kick(target.con.id, KickReason.kick); @@ -401,17 +378,27 @@ public class ServerControl extends Module{ } }); - handler.register("ban", "", "Ban a person by name.", arg -> { - if(!state.is(State.playing)){ - err("Can't ban people by name with no players."); - return; + handler.register("ban", " ", "Ban a person.", arg -> { + if(arg[0].equals("id")){ + netServer.admins.banPlayerID(arg[0]); + }else if(arg[0].equals("name")){ + Player target = playerGroup.find(p -> p.name.equalsIgnoreCase(arg[0])); + if(target != null){ + netServer.admins.banPlayer(target.uuid); + }else{ + err("No matches found."); + } + }else if(arg[0].equals("ip")){ + netServer.admins.banPlayerIP(arg[0]); + }else{ + err("Invalid type."); } - Player target = null; - - for(Player player : playerGroup.all()){ - if(player.name.equalsIgnoreCase(arg[0])){ - target = player; + if(state.is(State.playing)){ + for(Player player : playerGroup.all()){ + if(player.name.equalsIgnoreCase(arg[0])){ + targets.add(netServer.admins.getInfo(player.uuid)); + } } } @@ -422,7 +409,7 @@ public class ServerControl extends Module{ netServer.kick(target.con.id, KickReason.banned); info("Banned player by IP and ID: {0} / {1}", ip, target.uuid); }else{ - info("Nobody with that name could be found."); + info("No matches were found."); } }); @@ -455,35 +442,6 @@ public class ServerControl extends Module{ } }); - handler.register("banip", "", "Ban a person by IP.", arg -> { - if(netServer.admins.banPlayerIP(arg[0])){ - info("Banned player by IP: {0}.", arg[0]); - - for(Player player : playerGroup.all()){ - if(player.con.address != null && - player.con.address.equals(arg[0])){ - netServer.kick(player.con.id, KickReason.banned); - } - } - }else{ - err("That IP is already banned!"); - } - }); - - handler.register("banid", "", "Ban a person by their unique ID.", arg -> { - if(netServer.admins.banPlayerID(arg[0])){ - info("Banned player by ID: {0}.", arg[0]); - - for(Player player : playerGroup.all()){ - if(player.uuid.equals(arg[0])){ - netServer.kick(player.con.id, KickReason.banned); - } - } - }else{ - err("That ID is already banned!"); - } - }); - handler.register("unbanip", "", "Completely unban a person by IP.", arg -> { if(netServer.admins.unbanPlayerIP(arg[0])){ info("Unbanned player by IP: {0}.", arg[0]); @@ -500,49 +458,35 @@ public class ServerControl extends Module{ } }); - handler.register("admin", "", "Make a user admin", arg -> { + handler.register("admin", "", "Make an online user admin", arg -> { if(!state.is(State.playing)){ err("Open the server first."); return; } - Player target = null; - - for(Player player : playerGroup.all()){ - if(player.name.equalsIgnoreCase(arg[0])){ - target = player; - break; - } - } + Player target = playerGroup.find(p -> p.name.equals(arg[0])); if(target != null){ netServer.admins.adminPlayer(target.uuid, target.usid); target.isAdmin = true; - info("Admin-ed player by ID: {0} / {1}", target.uuid, arg[0]); + info("Admin-ed player: {0}", arg[0]); }else{ info("Nobody with that name could be found."); } }); - handler.register("unadmin", "", "Removes admin status from a player", arg -> { + handler.register("unadmin", "", "Removes admin status from an online player", arg -> { if(!state.is(State.playing)){ err("Open the server first."); return; } - Player target = null; - - for(Player player : playerGroup.all()){ - if(player.name.equalsIgnoreCase(arg[0])){ - target = player; - break; - } - } + Player target = playerGroup.find(p -> p.name.equals(arg[0])); if(target != null){ netServer.admins.unAdminPlayer(target.uuid); target.isAdmin = false; - info("Un-admin-ed player by ID: {0} / {1}", target.uuid, arg[0]); + info("Un-admin-ed player: {0}", arg[0]); }else{ info("Nobody with that name could be found."); } @@ -610,37 +554,6 @@ public class ServerControl extends Module{ }); }); - handler.register("griefers", "[min-break:place-ratio] [min-breakage]", "Find possible griefers currently online.", arg -> { - if(!state.is(State.playing)){ - err("Open the server first."); - return; - } - - try{ - - float ratio = arg.length > 0 ? Float.parseFloat(arg[0]) : 0.5f; - int minbreak = arg.length > 1 ? Integer.parseInt(arg[1]) : 100; - - boolean found = false; - - for(Player player : playerGroup.all()){ - TraceInfo info = netServer.admins.getTraceByID(player.uuid); - if(info.totalBlocksBroken >= minbreak && info.totalBlocksBroken / Math.max(info.totalBlocksPlaced, 1f) >= ratio){ - info("&ly - Player '{0}' / UUID &lm{1}&ly found: &lc{2}&ly broken and &lc{3}&ly placed.", - player.name, info.uuid, info.totalBlocksBroken, info.totalBlocksPlaced); - found = true; - } - } - - if(!found){ - info("No griefers matching the criteria have been found."); - } - - }catch(NumberFormatException e){ - err("Invalid number format."); - } - }); - handler.register("gameover", "Force a game over.", arg -> { if(state.is(State.menu)){ info("Not playing a map."); @@ -679,108 +592,22 @@ public class ServerControl extends Module{ } }); - handler.register("find", "", "Find player info(s) by name. Can optionally check for all names a player has had.", arg -> { - boolean checkAll = true; + handler.register("info", "", "Find player info(s). Can optionally check for all names or IPs a player has had.", arg -> { - Array infos = netServer.admins.findByName(arg[0], checkAll); + ObjectSet infos = netServer.admins.findByName(arg[0]); - if(infos.size == 1){ - PlayerInfo info = infos.peek(); - Log.info("&lcTrace info for player '{0}' / UUID {1}:", info.lastName, info.id); - Log.info(" &lyall names used: {0}", info.names); - Log.info(" &lyIP: {0}", info.lastIP); - Log.info(" &lyall IPs used: {0}", info.ips); - Log.info(" &lytimes joined: {0}", info.timesJoined); - Log.info(" &lytimes kicked: {0}", info.timesKicked); - Log.info(""); - Log.info(" &lytotal blocks broken: {0}", info.totalBlocksBroken); - Log.info(" &lytotal blocks placed: {0}", info.totalBlockPlaced); - }else if(infos.size > 1){ - Log.info("&lcMultiple people have been found with that name:"); + if(infos.size > 0){ + Log.info("&lgPlayers found: {0}", infos.size); + + int i = 0; for(PlayerInfo info : infos){ - Log.info(" &ly{0}", info.id); + Log.info("&lc[{0}] Trace info for player '{1}' / UUID {2}", i ++, info.lastName, info.id); + Log.info(" &lyall names used: {0}", info.names); + Log.info(" &lyIP: {0}", info.lastIP); + Log.info(" &lyall IPs used: {0}", info.ips); + Log.info(" &lytimes joined: {0}", info.timesJoined); + Log.info(" &lytimes kicked: {0}", info.timesKicked); } - Log.info("&lcUse the info command to examine each person individually."); - }else{ - info("Nobody with that name could be found."); - } - }); - - handler.register("findip", "", "Find player info(s) by IP.", arg -> { - - Array infos = netServer.admins.findByIPs(arg[0]); - - if(infos.size == 1){ - PlayerInfo info = infos.peek(); - Log.info("&lcTrace info for player '{0}' / UUID {1}:", info.lastName, info.id); - Log.info(" &lyall names used: {0}", info.names); - Log.info(" &lyIP: {0}", info.lastIP); - Log.info(" &lyall IPs used: {0}", info.ips); - Log.info(" &lytimes joined: {0}", info.timesJoined); - Log.info(" &lytimes kicked: {0}", info.timesKicked); - Log.info(""); - Log.info(" &lytotal blocks broken: {0}", info.totalBlocksBroken); - Log.info(" &lytotal blocks placed: {0}", info.totalBlockPlaced); - }else if(infos.size > 1){ - Log.info("&lcMultiple people have been found with that IP:"); - for(PlayerInfo info : infos){ - Log.info(" &ly{0}", info.id); - } - Log.info("&lcUse the info command to examine each person individually."); - }else{ - info("Nobody with that IP could be found."); - } - }); - - - handler.register("info", "", "Get global info for a player's UUID.", arg -> { - PlayerInfo info = netServer.admins.getInfoOptional(arg[0]); - - if(info != null){ - Log.info("&lcTrace info for player '{0}':", info.lastName); - Log.info(" &lyall names used: {0}", info.names); - Log.info(" &lyIP: {0}", info.lastIP); - Log.info(" &lyall IPs used: {0}", info.ips); - Log.info(" &lytimes joined: {0}", info.timesJoined); - Log.info(" &lytimes kicked: {0}", info.timesKicked); - Log.info(""); - Log.info(" &lytotal blocks broken: {0}", info.totalBlocksBroken); - Log.info(" &lytotal blocks placed: {0}", info.totalBlockPlaced); - }else{ - info("Nobody with that UUID could be found."); - } - }); - - handler.register("trace", "", "Trace a player's actions", arg -> { - if(!state.is(State.playing)){ - err("Open the server first."); - return; - } - - Player target = null; - - for(Player player : playerGroup.all()){ - if(player.name.equalsIgnoreCase(arg[0])){ - target = player; - break; - } - } - - if(target != null){ - TraceInfo info = netServer.admins.getTraceByID(target.uuid); - Log.info("&lcTrace info for player '{0}':", target.name); - Log.info(" &lyEntity ID: {0}", info.playerid); - Log.info(" &lyIP: {0}", info.ip); - Log.info(" &lyUUID: {0}", info.uuid); - Log.info(" &lycustom client: {0}", info.modclient); - Log.info(" &lyandroid: {0}", info.android); - Log.info(""); - Log.info(" &lytotal blocks broken: {0}", info.totalBlocksBroken); - Log.info(" &lystructure blocks broken: {0}", info.structureBlocksBroken); - Log.info(" &lylast block broken: {0}", info.lastBlockBroken.formalName); - Log.info(""); - Log.info(" &lytotal blocks placed: {0}", info.totalBlocksPlaced); - Log.info(" &lylast block placed: {0}", info.lastBlockPlaced.formalName); }else{ info("Nobody with that name could be found."); } @@ -789,7 +616,7 @@ public class ServerControl extends Module{ private void readCommands(){ Scanner scan = new Scanner(System.in); - while(true){ + while(scan.hasNext()){ String line = scan.nextLine(); Gdx.app.postRunnable(() -> { @@ -880,11 +707,4 @@ public class ServerControl extends Module{ state.set(State.menu); } } - - @Override - public void update(){ - if(!inExtraRound && state.mode.isPvp){ - // checkPvPGameOver(); - } - } }