From e6c7bb675965a3f701edaaad62fdbb7b7dbd034e Mon Sep 17 00:00:00 2001 From: Josh Larson Date: Wed, 15 Mar 2017 02:17:30 -0500 Subject: [PATCH] Massive refactoring and fixed the client --- .classpath | 1 + build.xml | 31 +- fxml/primary_tabs/Deployment.fxml | 54 --- res/connected.png | Bin 2200 -> 0 bytes res/connected.svg | 43 -- res/connected_large.png | Bin 20077 -> 0 bytes res/disconnected.png | Bin 2447 -> 0 bytes res/disconnected.svg | 43 -- res/disconnected_large.png | Bin 20685 -> 0 bytes {fxml => res/fxml}/PrimaryView.css | 2 + {fxml => res/fxml}/PrimaryView.fxml | 22 +- {fxml => res/fxml}/primary_tabs/Build.css | 0 {fxml => res/fxml}/primary_tabs/Build.fxml | 21 +- .../fxml}/primary_tabs/Deployment.css | 12 +- res/fxml/primary_tabs/Deployment.fxml | 50 ++ {fxml => res/fxml}/primary_tabs/General.css | 0 {fxml => res/fxml}/primary_tabs/General.fxml | 21 +- src/bundles/strings/strings.properties | 0 src/bundles/strings/strings_de.properties | 0 src/com/projectswg/CombinedLightspeed.java | 70 --- src/com/projectswg/Lightspeed.java | 17 +- src/com/projectswg/LightweightLightspeed.java | 16 +- .../common/callback/BaseCallbackManager.java | 106 ----- .../common/callback/CallbackManager.java | 91 ---- .../concurrency/PswgBasicScheduledThread.java | 64 --- .../common/concurrency/PswgBasicThread.java | 65 --- .../concurrency/PswgScheduledThreadPool.java | 115 ----- .../common/concurrency/PswgThreadPool.java | 108 ----- .../common/concurrency/SmartLock.java | 129 ----- .../common/concurrency/SynchronizedQueue.java | 151 ------ src/com/projectswg/common/control/Assert.java | 117 ----- src/com/projectswg/common/control/Intent.java | 140 ------ .../common/control/IntentChain.java | 53 --- .../common/control/IntentExecutor.java | 132 ------ .../common/control/IntentManager.java | 144 ------ .../common/control/IntentQueue.java | 235 --------- ...ntReceiver.java => LightspeedManager.java} | 31 +- .../LightspeedService.java} | 49 +- .../projectswg/common/control/Manager.java | 187 -------- .../projectswg/common/control/Service.java | 122 ----- .../common/data/BuildHistoryTable.java | 4 +- .../common/data/DeploymentTable.java | 3 +- .../common/data/HeavyweightBackendData.java | 10 +- .../projectswg/common/data/ServerTable.java | 2 +- src/com/projectswg/common/info/Config.java | 183 ------- .../projectswg/common/info/ConfigData.java | 152 ------ .../common/info/HeavyweightDataManager.java | 11 +- .../common/info/LightweightDataManager.java | 1 - src/com/projectswg/common/info/Log.java | 258 ---------- .../common/info/RelationalDatabase.java | 190 -------- .../common/info/RelationalServerData.java | 445 ------------------ .../common/info/RelationalServerFactory.java | 271 ----------- .../projectswg/common/network/NetBuffer.java | 237 ---------- .../common/network/NetBufferStream.java | 435 ----------------- .../projectswg/common/network/TCPServer.java | 298 ------------ .../projectswg/common/network/TCPSocket.java | 172 ------- .../common/network/packets/Packet.java | 7 +- .../network/packets/post/PostBuildPacket.java | 3 +- .../packets/post/PostCreateServerPacket.java | 3 +- .../packets/post/PostDeleteServerPacket.java | 3 +- .../packets/post/PostDeployPacket.java | 3 +- .../packets/post/PostPacket.java} | 17 +- .../packets/post/PostStopBuildPacket.java | 3 +- .../packets/post/PostStopDeployPacket.java | 3 +- .../common/network/protocol/Protocol.java | 51 -- .../network/protocol/ProtocolFactory.java | 41 -- .../common/utilities/ThreadUtilities.java | 60 --- .../common/utilities/TimeUtilities.java | 97 ---- .../lightspeed/CommunicationService.java | 8 +- .../lightspeed/DeploymentService.java | 32 +- .../lightspeed/GitListenerService.java | 4 +- ...anager.java => LightspeedMainManager.java} | 6 +- .../lightspeed/StarshipProcess.java | 52 +- .../lightspeed/build/BuildService.java | 14 +- .../lightspeed/build/JavaBuildMethod.java | 118 +++-- .../lightspeed/build/MavenInterface.java | 2 +- .../build/java_builder/CustomJavaBuild.java | 52 -- .../build/java_builder/CustomJavaCommon.java | 3 +- .../build/java_builder/CustomJavaInstall.java | 45 -- .../build/java_builder/CustomJavaTest.java | 68 --- .../build/java_builder/RepoInstaller.java | 3 +- .../lightspeed/git/GitInterface.java | 7 +- .../projectswg/lightspeed/gui/GUIService.java | 4 +- .../sequenced/SequencedStarter.java | 3 +- .../lightspeed/server/ServerServerData.java | 8 + .../lightspeed/server/ServerService.java | 8 +- .../lightspeed_frontend/Frontend.java | 189 ++++++-- .../lightspeed_frontend/FrontendData.java | 112 ++--- .../LightspeedFrontendGUI.java | 45 +- .../LightspeedFrontendText.java | 36 +- .../communication/FrontendCommunication.java | 41 +- .../communication/HttpClient.java} | 132 +++--- .../gui/InternalWindow.java | 3 +- .../gui/LightspeedPrimaryView.java | 145 +++--- .../gui/primary_tabs/BuildTab.java | 170 +++---- .../gui/primary_tabs/DeploymentTab.java | 197 ++++---- .../gui/primary_tabs/GeneralTab.java | 116 ++--- .../gui/primary_tabs/PrimaryTabData.java | 13 +- ...teIntent.java => InboundPacketIntent.java} | 21 +- .../projectswg/lightspeed/TestLightspeed.java | 4 +- .../LinearTestFrontendCommunication.java | 12 - .../lightspeed/frontend/TestConnect.java | 77 --- 102 files changed, 1023 insertions(+), 6132 deletions(-) delete mode 100644 fxml/primary_tabs/Deployment.fxml delete mode 100644 res/connected.png delete mode 100644 res/connected.svg delete mode 100644 res/connected_large.png delete mode 100644 res/disconnected.png delete mode 100644 res/disconnected.svg delete mode 100644 res/disconnected_large.png rename {fxml => res/fxml}/PrimaryView.css (95%) rename {fxml => res/fxml}/PrimaryView.fxml (56%) rename {fxml => res/fxml}/primary_tabs/Build.css (100%) rename {fxml => res/fxml}/primary_tabs/Build.fxml (80%) rename {fxml => res/fxml}/primary_tabs/Deployment.css (80%) create mode 100644 res/fxml/primary_tabs/Deployment.fxml rename {fxml => res/fxml}/primary_tabs/General.css (100%) rename {fxml => res/fxml}/primary_tabs/General.fxml (76%) create mode 100644 src/bundles/strings/strings.properties create mode 100644 src/bundles/strings/strings_de.properties delete mode 100644 src/com/projectswg/CombinedLightspeed.java delete mode 100644 src/com/projectswg/common/callback/BaseCallbackManager.java delete mode 100644 src/com/projectswg/common/callback/CallbackManager.java delete mode 100644 src/com/projectswg/common/concurrency/PswgBasicScheduledThread.java delete mode 100644 src/com/projectswg/common/concurrency/PswgBasicThread.java delete mode 100644 src/com/projectswg/common/concurrency/PswgScheduledThreadPool.java delete mode 100644 src/com/projectswg/common/concurrency/PswgThreadPool.java delete mode 100644 src/com/projectswg/common/concurrency/SmartLock.java delete mode 100644 src/com/projectswg/common/concurrency/SynchronizedQueue.java delete mode 100644 src/com/projectswg/common/control/Assert.java delete mode 100644 src/com/projectswg/common/control/Intent.java delete mode 100644 src/com/projectswg/common/control/IntentChain.java delete mode 100644 src/com/projectswg/common/control/IntentExecutor.java delete mode 100644 src/com/projectswg/common/control/IntentManager.java delete mode 100644 src/com/projectswg/common/control/IntentQueue.java rename src/com/projectswg/common/control/{IntentReceiver.java => LightspeedManager.java} (72%) rename src/com/projectswg/common/{concurrency/PswgTaskThreadPool.java => control/LightspeedService.java} (71%) delete mode 100644 src/com/projectswg/common/control/Manager.java delete mode 100644 src/com/projectswg/common/control/Service.java delete mode 100644 src/com/projectswg/common/info/Config.java delete mode 100644 src/com/projectswg/common/info/ConfigData.java delete mode 100644 src/com/projectswg/common/info/Log.java delete mode 100644 src/com/projectswg/common/info/RelationalDatabase.java delete mode 100644 src/com/projectswg/common/info/RelationalServerData.java delete mode 100644 src/com/projectswg/common/info/RelationalServerFactory.java delete mode 100644 src/com/projectswg/common/network/NetBuffer.java delete mode 100644 src/com/projectswg/common/network/NetBufferStream.java delete mode 100644 src/com/projectswg/common/network/TCPServer.java delete mode 100644 src/com/projectswg/common/network/TCPSocket.java rename src/com/projectswg/common/{info/PostgresqlDatabase.java => network/packets/post/PostPacket.java} (85%) delete mode 100644 src/com/projectswg/common/network/protocol/Protocol.java delete mode 100644 src/com/projectswg/common/network/protocol/ProtocolFactory.java delete mode 100644 src/com/projectswg/common/utilities/ThreadUtilities.java delete mode 100644 src/com/projectswg/common/utilities/TimeUtilities.java rename src/com/projectswg/lightspeed/{LightspeedManager.java => LightspeedMainManager.java} (95%) delete mode 100644 src/com/projectswg/lightspeed/build/java_builder/CustomJavaBuild.java delete mode 100644 src/com/projectswg/lightspeed/build/java_builder/CustomJavaInstall.java delete mode 100644 src/com/projectswg/lightspeed/build/java_builder/CustomJavaTest.java rename src/com/projectswg/{common/network/protocol/AlphaProtocol.java => lightspeed_frontend/communication/HttpClient.java} (51%) rename test/com/projectswg/lightspeed/frontend/TestFrontend.java => src/com/projectswg/lightspeed_frontend/gui/primary_tabs/PrimaryTabData.java (90%) rename src/com/projectswg/lightspeed_frontend/intents/{ConnectionStateUpdateIntent.java => InboundPacketIntent.java} (87%) delete mode 100644 test/com/projectswg/lightspeed/frontend/TestConnect.java diff --git a/.classpath b/.classpath index c19037e..474b4a4 100644 --- a/.classpath +++ b/.classpath @@ -24,5 +24,6 @@ + diff --git a/build.xml b/build.xml index c79a61d..27206c6 100644 --- a/build.xml +++ b/build.xml @@ -9,6 +9,7 @@ + @@ -26,9 +27,7 @@ - - - + @@ -46,9 +45,7 @@ - - - + @@ -61,22 +58,26 @@ - - - - + + + + + + + + + + - - - - + + - + diff --git a/fxml/primary_tabs/Deployment.fxml b/fxml/primary_tabs/Deployment.fxml deleted file mode 100644 index 923b9b7..0000000 --- a/fxml/primary_tabs/Deployment.fxml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/connected.png b/res/connected.png deleted file mode 100644 index 97e1b0fe7fe2123c1d988cd4b5e503dc5b18b2f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2200 zcmV;J2xs?+P)C)LQ2a-r2;PHr2$*JnzbEc9aVWJfo?5iRViDw zPMW7}ohOwcz&r#6rVc{cd#oL7ZCn`Qv6TY#N@;iqD369$oOj|lw(nzq)c}V9x7XqNAW`dxL?G-QXJ6oLU|OQqOh7vD0WjO^aMjr>oOq{p4an1MI$0(Xk0XN`ojIA*X%m}?sFeePZ@vU{8_ceaX%GEda>a(0S%7=aW5P1n%7 zZdwma@H$+lqXxU(<9yecCwf(yuG2pwi?84N5QDA#INN-UeZEupg3Xvk%o$=Eu+Zyp zDF7nE8V=yS1SZLpD6FXrvgY6(HILza2i#0iwP*R+XMe>PY(|Qx$u$6c6*%m5xNf?Z z0r8FAgiv&iff?Cs9rq&r`()kr|B?FhEb(q5sD)#7u@zVV=pCa!-dF(knslJR+K&xm z7DR;rcr<4y?$L9*>ZSz9@j6^cV?Qwk=-*oqs;)8ElEWJh&!o_r*JazWx%V@Dz!(Bb zOsg#ENWWI#>E4WqftDQB*o%26YfxO*jL0mYs@{*TN6lqrksynga?~8``3!JV$scnGRWtQ2{}orY%Sv+UuS6lKOAio36zqIlny8+}V5XbvcRp#>P2lR>&kcEC(D z1Ead@FsO$4$%yI9E|_p*?9Ea#w_qX`Q##8|?nKeGsMm%xg+g0CZ`v0yz>*#Ry1n`w z3-*`O5Nf@};zB?mq)=5CU~sO5G?N4vCV`^vI$iSMRA${bKB@zKXV4fH4|^OLWd_!C zog!O*-g@+V2|-jgT;<7%b=0=C#B|$WSmmP6kD}@T+0rQ4#MJ2QLS88PT9>Xbw00dp*5stOTgAu<1x8~ zaXrBEMN@cn_*0}w6G1J^5L+J0N6uoH?cTT{DlVU7=D&V}s%u>iTx9ambe*c&R-3uI z#w|)P?gx49zHtOKg`HQttbe4Gy!7}jamaU`(tTTK3x={r#=8wY({hcMyyY~713iYA@{bh+lu(Z$I`(0b z_R@abd+I~AXZd;M4qBA9r0)1$RV7bWtV1G_j)~jc-z49cw4YBLi1(s2X<|=xB}+fq zjv8ZG5=)-TC;0AxZM3POltBnVP18L0e(5hicq3s=jq94jz6;FQ zvx)jnYo`=cUN!?rwKIBh1gi#K9Gk^P18t1#)d;juBPEL(;VfQ$bE(z&Cku{$m zKKM-vY`N^bbez|Y>>#YEcLD+d+imHl(&{;@6fla|nRPe*p9`D^vXbbSv;OPMIJlOp zb*+HJYEHi+5P(lgxx9MLDkZCY2~EYTZ{8)M;y45NOAq`Of165GT`Q`try4^CgcK}l zDOt0T^^2iw1ChZ_M0NXJV0F@W(!tut#E?8&=K?`WJW2|&rln-fMu6OVGH&sR+hq4R ztw2RQg^8}z7FPM9wiQ*=QmUL5l=|+lF zKpZehQQA_v`ZkEDARR8|b-3ybm_PNz%`!9049>M8lXElOfOy|5#B)va-Pc%O7JW{O z_G1K04X_Yc-xC;1x``qA?J<)?Ot^&<(;AE2*I2ih0eO~~Su>_Oy|(cZ@H&u_^b8g< zvRQmFQ*Dwsn~T?M?pwZuXzmm@NC!-Wl^y_`v>!@ZlS$1jZ31C79G;6qi{D~?V5)eZN_|NRf}&0d+* a^ZXB?#V}$&)~&bz0000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/connected_large.png b/res/connected_large.png deleted file mode 100644 index 16724878be66ae8bcc404630694bb701e83b527f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20077 zcmXtg1z1$y^ZwG^Exmx0N-5oqNC^mvbgOiC!x9n#B7)$O(gM=mT>{cwOE0i2u+;DJ z`TqZp&ptlSz4y#L^Uj=^_spF`w6>-S5&k255C}x1rmFZF1VX!h_~Bv$SB7GR{{sJE zTd1ojg6<#w{cI^r2Cm>atG;yuM$A0?(B!!?yn%~2?rIuJIIFl!#3E>Q^|m`85DQ36 zQBKc${$R<=jM8Jd?_|u$rZz8XIaY6%9U6v}uTIqynRy5=<@CzJ3a#@pQ<=aZ=}{Rw z!t>1{QVR_Qv&jEK|I3;ptIC&A)pX`}2a=)+VgHnV>T`Q0$w}_nCUiRLRVBeIs~9L4SHn8_cK zdiOT9BAW8$5D4*AK4u%;juq=2njP-XxuW}h!L`W}P$I@ES1<#si#B=`dpE28s&=ZW z)NG}@5prEE7DJK(LhA?C-Out2isQ+h$J4Kkh_5BJBZ#h*|5=9l4qe+pl1YZ8n*Fx{ z8dBb@B4w7>!#aCi*UL8k#M=j(OaQ4EIpH`URc`pSJeg-|v@yjPYaA=l7;WNFa3|jM zH{$49^mRYu{=?u!eB(J2{nDdZ;Q`&A6H;Ix>$KM#Lb){qIpnvnZ2LUU4TWKvuACJaOvs%Q!t04-+5?WU-kg`rozk-t|)ojVD~ z``%#o$;U}0F^XIeYN>N$&?vxYxPg@&MJ$= zG)*UPgg7?30{dnUx?OkCZ0%hiR`<;7Rb4OHTlW!ME$PAskz)7CG~D)+$$4O9kOgfp z8i;{`@b+aY<{Mt}T{LJ=t3AvzgOx>$8kp&DWsB*v;Koe+X>BH!*6?mYR*Y<`c<(0} zY^=RmT%Ep!BX&>%mwZZBhCJHt!ylpjIA-~Yr);L}C)rPPC8Na10U4d__H$i7lw^Nk zvX*08*=mM&B4)NcRT~V8LzL*FBwK%+u>i6#>HR_L@3`uz$pZWbyAgPdA# zCfFEo0E^V5RJr?780!?^Lbw-K2m0yT!u=K8>?$hg55#(XNG-M8iH)g!GRqZLsDkV9 z+Hpaenh~#Z$kDU+6Dx{5G@q>fxB);yrRG@|DTK#!gL=_bR~7p=V^}u*(7lD+V7V*K z4BfNI4(G<}(HA8l1F!ot&=Bj2{W<^CAO^WZyelRzj*7_R!)X1gCaC!e&|RN^XgKAC zb?_hw`CuAH20=f%KDjulx0?6UlQ}%kI8$_?D1p`9@B)T9aZc{gVQpi+_rq*;=9H%-SHa|; zF*d15bXsET&FU;zC?uJ75wF4FaHa`1)C}i(@)8R!-wu_kwEtb0xB=Kr9?Y@PfvMWp z^?FsawJM8CkUf!)eOnBDzWSqzPmCCu#Q`^$rg8Z_1?Ca9b^-;fVEB8yVI7_tpPO`P z0i@o?TLZ1wVy@2(2A~U!Ut`gvbbs;iB$HRivrGkMbvs-DyH30Ax+XMr@3b+t-;&#n zMw6zm^PP2pwkfY-O%{bdm~e0cXx-K(i*%*4ho5@k&4pmF3T~P1%cyeOIxi(7vV`SnQb@>ME|aX(VV7gB9@FtA!~;$G9pS-EkG?u{w?oKs%$ zh4zzR6+wfKXR9Z$hk0YC{5e<~l{YZO<`14^$(jGs&ch17CQ`6HUVRR{8RDsa5}K$pFymiq>9PPc{)4`>3EBixPqH z_rLOWpQkI>I&5(bE3M(aQk2ijE4(9XtojP&%)y263m z-@^<7?!YliB}HZ96V}b4oKAtKZgG7>fL?kSQj>)jdOw>neo_?5DL(EW@GRQ!4g8WN zaDwHFosya4Ta9i_rJ$ww_#Iq=K&kxY;5V^|>Qx&pTbI+SmLOJk$JOVM{_bV+)cM2a z(y`ge3WUkFeeV7p3Hx~RBny~e7MAv{-um+3mO*LrM6eZ&-Bwa?vEq700HJ8bs`kCT zF$JO5YWyvuWyDAF7v{%rbJ6;J{6Y#q$Aor6Ba4nBuPB^~85+&@F&OudVQS0kGI%@?fKfG3MY|8e8_`H}ZOo}QK%aWN4 zL&le-TypRVFIfFSrSZh}7}#lXWl67;ey2S@a%~Bg=DYWX=Pn;~`GyR*f31wW0vm>E zQM*va1sJkF^{EdTpLz~b1FWYr8&e}^HxD1~$a+s4R!LICWIAkDfUSrftoh&F!^H8( zPYl~)gF1T5E4HQ>EonaUc4(Df0IXuZY2u>~`2nf8L&v$Aq%rxTp-&L>6o?i%kfFaJ ztQnCb%OgM->cG3*$@&+wcOL@`5=;quotpNk`DP-Fp=a(yFz{Ud{srLCR-$E!vZV)C z4TUdMI!0RmefcY;f#q*{lDrRr#JxHqYit&E>$aTB#1grFwA=K_myPwtR1l%47`bA! zpr)j@UwvR6_?OGlG+;?O;8(ns!C#h%B)|^@`%IV6jE(<25Km{yxLYxgw@1+)qBR^K zUuOW>ZPt)1;wa?Xw5=>d&9F+DT=g`+#b?>~Y(R1&0)r{YVaLU%LEbzm{J((Jue{y+x2wZB_TWwSd$B<-mHbV*98CvwfYEuKAQ3E3G^ z(Andl2mPz&#d$fYuWu7vNaLhl3)(D_MB7VJK_I2|OB;MZR6DA^y^!(@JXPBjDyJZI z3X>US0apn!q8m8TieJmbwTvKMWeCWUtrLL!dmfV|ou?}F4+#?nAdGsKpFw4=@H|V< zrgp9XJn0+8YwqZky^*tr(F;emNHujP$DgYHqvI50bD9BMcL|5yX;MZ#txI40-giO+ zK_Ru0JJFC&Maf-7w{;H}<65ZHAl@pS`-%0C9dWXxGGm4cj%IB8Y-Z~cPoEs_Fq_fP z?jMqU(GXnOna6&7%19&Air-zyH9cN0)a;84@IsVUjSe6XSP(l4rz0&A78TbrCxXhK zOwP~o$6$%sc|k^Y`!XGT9=IPRgOsv#dL8gp>it*+?>^eZ_Z=ZJvL79eto|)RQPOX% zraA4FXkb2)F{Z^8K&(=9CqB$~Z?)f|Ie06KK_JCiQK7uTgy}6Ql_DtRd!-LXbnW6G5AS7iGM&#zKNcC5iH}3@ zx$81S^OKsZ0{`{suYosFfW>m&IktN+qTlbf`F_t|?yxSJRj&(T#cVut=K$xN%^vx^ z`P$puJxj0s`rTexVtq&_?55bk0V-J>JUdMavEn3XYT{0S4vO;KWN%we-!i zCNPR@Y#6)}_aOUqdLR3s62C+5=Nq)?KTdr@)(5(OZI{tP$Ruwe5Ux*t1&JG9CT%od z?27O{CJ5*qc6>c}4666pBO}xK<`Y4fXGI)zgX4%~ePBnxe2Iazt4K!vlN7H z0^=pz_JOk)U_=2qx*C1t=rRyDY9*PJV0*j|aMGm^kn_nu^79dPKS;*8JO+&??2rSO zXL|JPP zevynOR%*S>@OjFje7eXA2A?Gwu;=HSSa++~)DK-gEH9Sl9umPQNf!vD|9wlJK=#;* z&pwP3zkV+JbMf700C%u1x!r-YDASrv5H+{G(Dh4JgD|f_Hb53WF6$S;sL}bsk-Hf{ z1^g@Y2V5T)zU0o{u(_xI^4De=9PS^ngG)BS*PxFh-Xo%v@h#Gh%$VkB&K~PaH?T=8 zItZ4?b#Cyp+aRQC%SUu`q;L5z!@-jQ<ZAmS`KMJtu>+Aa=5f#3f6lJ1FF zD%|ZbKIQA?y*60g$ff_OK7c_wKll|Aye#mL36lJ2KjiI(6i`96+t)#1RieaPK`bWTRV>ECo3 zxg^uG_blM1XfH)`<-$tZzg$&K@!{Q3Q9>ufoz(s3nW#c0xV*dy_fv~x-@8M&o1nG zq*sV#|7@Iaf}3dd+Ss!8T!`MsxR@rqKj7^P$XM>&?tH@Zdv$^FcwD@K_5kmCgalkQ zN28Bbzz;AwPPRv0eT!K$^x}y2ff@1}p{vJ;@`Xs8r(mFt*^@mOCC3MK<2fgVaq`9 z8^c19>tF%pJ64XD9W$j>Pf(ufPRRc@S5H3A5&XnU5FwjmMFbtY=I_dn5y@=2<_?z3 zmp;1Ci{=oyF8(r`@xTMabf|HqL~as`OpiS8I=*BC402}K?IMmNWG$I&!BxJndz+AP zw=R;R=3l491f4ZYQHQTmH1CZ8_j|iUrQ!ST8DbHxkYnPLvcaV8fc$^-sDW8lipdmQ z7iJPBvbVg509s#c8TX-< zMAm&9)zR6MKj{Jai7Th$WJxvhGT)&U*sXRINOvW~+;gjc;<}%Z;+rj!R*F_s26bkD z&QVd161_42hiUDed_Q?}4HEU9h4kY?gW&R!S@eOkdU(c8Kg8B6KPfmNzwg~+0MY9W zf02^u!_9gz4<#a0-wO6Qp<~@9lR@TJ=fvYOPB3ryT?j$Nf6}wND+j@4`ut8+6jLM8 zqe!8II7j^|^Wj}Q{=Z$$9ouX^eI3b!w_CcfRPt)~uBX~- z07p%q@E{CO{PWoX(lk%B#xmMC&sHuu@1xJ(s^|P{gJ3}YQqfABBIBYrn+^pD%$@$h zH!EQP5BocF79TK%*p))dgF{G@(if*t7O#$a0Sggc?@u(c_R33FelIgo1xlFMc5oLBH_mI>%THGcY z3plswJX9SHl4%(oM~O6pbbOz?#_)*7t(a7(T)ag(msRA=1Xf>MS76Hkk^U7aO5!Te zv5SI~cBPo}bg0<*&u@k=Y*#O$WPWN8`W}HA2g2e6B3a6b$ianmJTf=fLdIb9Ur!%38@Qx36 zb^S7 z1^K#cDq3}q-$M_r8N#D$qDzA2WlB!>MZfJU<@2?pq1`qX=9`eBMoiKuL_dNBzjK%2 z2q37(d60E0#@i&Y{=u`H=9rF|;1kw_00%x+QnHA_LkGSt<^_@+mM1^Uc~Nm~)Z-k) zTdB~}zfSvfY9Wuj>Xj>x0j7f$+$zZ!-OqJoFGHxiK)B8F1pIGJdcR_yTr_h>$)#be zR)}2oKF?iiGO=g50&=oi0*~%zar_V<0Q|^s%vp8z8jhzQqgm0UPkZA zJ8-X-(g}NJz>75CYkWu5&XpCZNXdQSK^xCqc9q2NH6cLFu`I~RK7u*wta;qwwLiBD zmesk*bJMcf<03zEW)PA0BXS+~R}Mn7BDEH_%Q3 z9k*O;3$E&NSttZ-@h*z2{)bm@HC9C%KK&{2kBgZi_>blm$J7;62aUX5$=LLDdJD)> zOVQj*WnoC5VOo~B^ReJr)#_xJo5UhdTYTxFpdRW8^UZ2^>q8wBZ9Jopl`O(9x2 zpCSCSf1sU_c3YNd8sK0yhu6F6h~uViilF66FVSgrv|o}$(OmEErp(zzd^3^~FIU?m ze+C&FXEkOAMpz#gR$S?=aO^Ppabr2@C@Gq|88orhL#IK+oi>7Q)z0;${OqPiY3*zN z`^#FUtBXJWjb15*GYl@QQRvX#b#`Wp$G4w9rSp~WHNQ4sZFL1PJmrd#VbKx!XJ0g@ z=5jQf?eSlVU?4pNa3fRDf_~Beo^a1FOZ!!Zx3C^vtmjQrc55@g^)BLZO?*r7)n!AH zBBkraALhaFh1s)()^O9vWBs$M{8UlL%In?z!8w^GWwC3%81)A;aEYLHfApT3TnN{4 z+~b-oH}D(;Im*4Iil=_J6Np-8Xp#PSz`+gx%X-#F+{Irhwleq8fSjD9?4A!@Q1Cc{ z4|(S;6QE9czy7YLwU0*V`^nC^B4zPs>6$aqW%QZttou84|I`-VoCGKk6%-mwFo%O= zZV9fRWi0>dtu#Qly?+)0`6W!r%Ab2?_{#2IY}fC~8cyQX3VP`m-Im-JSkC-)gm=M3 zVSL5tgGw*rTR@i|=)m}m*YgQxFoz>=9|1?>D`i8|6t8Fcfs8nAL$3m40?-70_f|#$ z#Q-uakKF7zA4#WgmTnRHChwE((2;4IbVrp}=;BqU&D$;6t%xr=5$uE%5 zKQ60UjLH`N)s)0ty@MFiuS`xJc~UY79ati8+!=;>!)7usCXeSHsunA#h?VBBEN84Q z?5nFq_A&zB37+QcL#^GVx<5SY{@}<(nh1J%vjs<$IQM5nDQsPFAyeJV^vXU5Di^vC zwv42rcmx9HVhxk4$KVP2Gg`}9ZT3Ixx*J{yeV$AG`51}$yY^iriR>}2ckFv3yVaO3 zfORM76;gfK|D#OdWliAyy2a|8~2B-*&YoNH5d_s@8t=c5FdkuPF|k;|0O z`=pfi34gvvoXV`M^NLLsiMPd!erOYEg@qnUMVfJTi;Qd;?kcY>K62%FuFSr0?lJe? zaHL(Xr{9bqH^L`jy`6pI|Gfn-{|=w{JJc37kOIBuz64bf43Uj%c*xwY99+pTm$Xv(#9e?@^=-D9gdyfp zt&9kZ#}ny4)C9=D0gV+K=!1!Sg{@(9zGqQ)JA2)t6I>k*h$wE4s5f4dW@CJT<-YSJ zC%lwW(S=1G?$J(>b=OPLAB~VCA7N;+RQTl%bIh@*mCq^SG;lM1gjMc%!jPd^(KrU@ zabXbq%16ZYF2NcBLiDh0Wb)pUh#yJK!om-PnC8FN7j|^Ud^rjENfKy$1&iSe3nth~ zT#}++iCRMEj4Nz_8O0451_KUlcy^_K>B6-_z_wy+0GUifPTp-#dvwfZWU9NY?lR3h zL^$)6?J?@mA_we^h|Lw&H*RMvZ{v6UxkT*cP_`8~w*)+S+0X~+Jp*=&_6=n?`AG3ftRQ&uK zJF$D;-P^2C>)lGFUwBklL4WM%_j>iu?EN~HFL$u*7Y?|*nepj>a>N6TSOU7 z1$CFUJcwAe85@r>ErFrDxwojNY~dPYs6JZXg`tWkT~xb#W^U37_puJ|&{YVUxe#yY zRxA63`k2~KN*1s#>YHyU!~WF_FhT(s5EbZ-lA%KhDN(mqcH(cQy-`Mn+Otd#7JB)nyh%!2MHn`(&lr1o>io54BeAL{a1 z)Ys%eKcy~T`bSE4zUzD5-f2?De~F!gcdiG!(v^<9!}>HJ(`l~fWs{%U|BOo|+_7cD zdHSSI>M8Q|-l4Z0t#2;oeMHI%>jc?Im}Bs`%>3bp$mQ)*TGTsUo{KfrRvKS+$6pmg zo`pS3ulbRLE#`j`9O7vFmWEeVd~=US$Au7tw^ux6@C|47(27;W2-AAded2@EAi2R2 zRWmpnIjXNot8F%5_fFo&g?vH0$i&41I^V8c(ivKU*Nzr&Hd55k zqtg*FLMa92S5&RZ7n2uQo$fNX*~XRkS4PM6b3%y7DS>i4>b%8pZxu?d7*aQ$M_Ic* zj0#R}eM7MVh_f9!6zMN<55J{B=S35Pn?2hHNbQ2{I=b4&>BTOA^*6j4C5q6xsHYCw z^V;P9#DoG?OJy}oG>Qy-7aU(I$v0Rc&*(ov&XjPfdl2hxDg<}%B5a`(z5#aHQ2g6W zCg7tDp_DQ|!kp}XZ12gRi%BnJegDj6;ViFs{j?CGz}ehi7h6UV%52z%5oK=Krx_7Q zqrfcOh)KNTqr=d7y<1Xvi0#{QV4>c+Y^Xpe2WYs~RZ{W)D6{1bBe` zmF@xB#1}SO*hrp{Ji)Nm9b?$oIIvoxSDATBWgXSvP8Ga)H!C)L?IT%Gk?bS9r~G{O z_&Ibp?;`Hfvu1=4!fA(3J0X932wUVfzv_Vte}QLLRB!l@q;|amLI|5Fwn~m|q01Wl z+hE^AF~W?fKr590!Lz|NenR%PQhb##KLGn4lhAx~*a)-#^nf`(qI*2UY%4RfeFH!;7aXQ zx^}I8kb0fD~%2(Ru>;vwGaGgV9b0=502me$7fd8KeUTq zpzWCpe_iRDi%El2S+*WN1d72DM&vk4muy6|$!QALD&)jJDs{k@P4>td&!|~s^h`#8V=Q;p^K&a(d$Y|HeO*OA-U{8{@gs9 zNamf#I9a-FtXQ*Odun+I8`*U*0ovD%_6Qs99zSLKQ|^ zLL4&IG~t8roi7KKYbqt0lG*NTU+5m<5ui20laU?%C#vY8@3iA@{(b;l4x*@p?}&s> zaX`h&?f!;^L4Mzz&#wW#WF&scDT3k#R%QYjVawA^N&}X{`bQU&G^%`5*VUo9mEe=5JTfb}ol1i*17Ep5f z1#FZ%4OZxf6P1kx0FU@O52y15tjRXH4fwB~_M3>@h^<81`nfDhagl57#sVc7;*Maz zh9IppUZ|m2SHi#d-_nMGP~<~fnL^+4gUT;J^z~}Q9eodtHaVrLqT4IzTy3PtQ7^DR zhW9SP0W-e3<+-&RiSSVqIen}lT-UZ~1tUqNa;6nFc(>LEeb0wpxS}QVF2w9WVQn3o zrnBsn*iqT@ZP%!G>GgC0Vc?(b&YQgdph&VOl)BYw;0q3Gu!iFVQu{+ycmcP;52N>7 zCw;Yg8fna5J><>RDan^}BY*&i&M8O`h#o%*1}iqq9O;U03LPtWmHvQ(x#Az!V`BPF zJ9No?>xMm+I`OXi`09iwATkSNW~%l~LCbcF;9(1z)tud`NGWnnYDcF_5=|UG{VMYL zUT9yVu>)+i?_qW75?x}56K|(Nhj%JUR0l?+XT^J7Y>~dAyD9&+Y+uUCx7%m;Y}gV; zhth@0ynoYgu3ZCb>`sz&62d}%7SC4yt_NNnG5i6bwvzMHhV+4PfUcV>0tn%{G-%;G zwyC@wNG~2-|6OGo5c>JQvNVw7{n%puW-^3gy`OF-VTvAKI9+GdxwJji zfKiUk1kKKk=4{ZSuFeRh1dx$&QceYybe0*9fg04>65uE3!OZvx=2r9m419ds{E$i! z@a?N?W!VCEjo4PzL&;}P=mVSC@Ckr*-U_ExE)YUcF3$2YC^)C$6pLcU(yctf5)zLP zzLbf)1IlSot?Y!%Q*z?4&_{khEODRlSvt+F-dEnj6C>_=Qh=V&Bhp`iXg(>1j?L>MAy{gM^FyV5)`SnkLh3<1nP6w`DN6%Zh>x!6h=a` z`+;1cwHDVBtQU@HD$ayXk5BB3E9|0Bf>z&hX#E0L$~4Z_YXLuA5J5RQZNfwPcSsF$ z<*%iYC?MichaDVOb+j|ZnL1aO8J8`d&%Z5xIsKY^{K=u%$C#CiTe62wS2lX!U+-!DTS`xr(VmCQVLWT^AI7 zK@!wwPWsj+7uamISEh;P{p##Ui&kN|)H=ANJZ3flZl=#R>O%Q!fcx&o4B9*x`F&zB zs#y0F{_U$2>B0yATEP%5Q6w%%Ra5IJ7HL;fcs3aGZr%r7Swv%k7|Dkx)t}u_y+P);=(+-Z85pez`#F4;Bi~ zN;?|RtEB0?Zky#bJ78n-XAD|EvPxURqY3Q~i^kI~c|-{Xi8RQRKtIuf$6ZuUEggx- z{KslZSXuas)kuiL`&r&Ft%OAnnaHQN#dNXg>ga9FYGt%w61%YX;@z3n-QoZ)0Ic{p zQj{g3RC=1|^o4FEO$D}g=WS~>~znKtex&R#bVJuhS5$ zS;GeKjarKJ%>S;pYgNjeOSLn__s(_%IS=_6x`cLc;_JgIP^Z?BS)~+yN;e2HZAy;$#qNXd zbD{Sy!nE9%p>5xxoUwnyt4$ zHeO$ZI<*NI!|$uMjQx{`Rw<@M5vIWY)>s}iA!u``b$`9n_U((bTVeP?yFhxZ?gZRD z;iJH>Ko#OJ7(=UMBSmtnKiw7@bClfIt-p#&9h*D3nhOVLviJiMb>Fm8kNPk&R=Vc> zTMt5EpT06JN0zj{?;lUzDk}C}-?_i0sf>zuU`P_v-;;i|a4Fn6v;uhUZR8kXQaK!3cuWPM?zB$T<2^q+=0E&rRA!we}J5ngAyB%>4e&(|uU}n9ee2P&s~3zGLN* zI!vpU@YX6a>(d}KrgXCQcJl7&z^sv)&(A$QIEgcD_c+B|aB+;rPFzb4Kk^^pUB+zt zYI0A2uN|*~R_%^EB+jkZ(`5*N(Q zNDV{!i&PY^^GxJSWf_b=N{&z}sYg_AON4KQ$M*7q&My|{UK2a}$?8Vw)A}SRCn~y_ zi@t=}kGplN|5Mc(4f7g*{~u`f>GVf9uvqS6r8YUI;{$YlI#UF{j31eQc|%ptd-md! zEquW0!K@jrfjABS^@MA0ZfFkwbSa%-ZeZoZ}CyFYq zfSQT+=ABZFB?$=qR3d&p6+bQvjeFN8z3NrEiF?Qkq_CiV z|J05`$R|Xy!A(0Qa(iQfL``(!7KBVY)?Bf(LpN?Q z=v{VrOd2_hKXVm+_cIIK$xM5n`XS&2qp52i;%s##{pwM?KBWt-`!fCQh-n+KjDnUP zuVz$Zf%v^ijRjxCO$u9nw!~|bV55I6aSsJR?CHUr+w^+N>85dx<3SBQBVvta!yiFf zdiy16kj=O$1<-ewKM1$aOL&I;bz3?_w=1Li^~Vc6i8q%-IrC2E#p}GyCt|ka!hX1_ zcvoU7>TRB-Ik;X<-i%_YJq+0TLqig6=CJ6{_ATweUq@{vde^2Y>q7Bg1J%EZkcb4; zC8i;EGat-+*Nnu7%;LgjkiXIzw>(x*!VbodPaFNSw$gg1-%64_YPUA(@|pg(9nZV$bmtUGqg1)?`sq3;dso2_dY zlOKpw^upM;f0;PtM|;`6$@Un0m(%I^miXfAuau6qSms{eixzTihrpr$+~A9XE~ralgA6Mfj7c88KatoIIOMDqkLk^wJ<1L6k0z1k_?u!u;;sUd z8*>iRI2B5C$3j<&zHSwg$R|h;3nt%|?)kyfkq!r-VU?3dU6e4x$MT}?a>xtF?p*Z@ zdtV-z68+kB(tdFs0BU}$GVMB^5$h-193r2c*7Z9YOQN;+N6GyNFoTF-5NRPSVS4*w z+7M`$`hbhrnJsF3*E7}EnPQ~9Le*z(D2WKVI+9t0Ma#1f7Ex^)-+x+4bV3%kDtTwH z6+Uvfv~KwJ{ffucM{T9*uI3{VlVRUDMZ}j$=+qvzS4~U{0*5*z+eNDe_pXJ0MX|CX zv+MUa8c+WSzkkhr>KBTv>>$OV_LWZR>(9ANGHCtQ3{ulmqhCHPHXm6pd-utk%+=tN z1YWR;_~s-!oqsr5R&%=ue+pm_;w9!={29ZV)7fBq-+v+tOS0O7?#Q?r0_DUHqb)o& zaR_oMvt%|ty5@DOF`a$7jJ&|F@fBR+6EP5cPtGC z1QwI79)&r9wVX!Up9eBY=@>TXdo24H(}`xUG`oBjB5G%4!WL(iP_J@X>8;b=uGr*% zMe0ieDD>OaE{5-;(SZz@+Rt0E5p#JR`tz(NA4VG3c1P9vbgZ5F;PO$>0-O#rxm-IhOdIOd(l={+fydDjYpx_J>!v{UqSw>}#P)%X%X?b||`zjf3{{iW8e zG6=)Rkc;+NoKpVzlC&oB$WI+!8+X7r48c@qjX8+;-fEFomNF$QNdGnjCB-*CV| z9Lg1Hu{e)9^Kl9o2NFvRf)8Z+OGU00fZ*=W6{8;JWrOYrxvIfyO(o6>?E|!>|c7@+F{B9Sq z<&65nP_VrB?Fx#}-wpf(7fwDjsp29x+9&FamV$Q!;}mqVDY`^^V-ul|uGeKxf;gNr zqoU=_9hOZN)33yv{U=Pu^>@+Y48=)SwhwmrA>d(XQJ{hQ)|0N@z=yIpJ{+BdDq^sp zGpycggPt&uUx68JsW&sb;VDPzZN8OqZq-J4acLb4bQM}Uo)deVd|h)Je8ubs zl5N@GBM8p^EoWXQX)D3BT-E=kqk`~K0N~<+lKNC3t~#zNqIadgyQQmVc zmx8tu1x}THk@uD`1E5POl4gHO`pLIHzxxF%ae{>-WNrx1C49WO$y@v9BI%51*jPM< zq*Wrb`X!(1W9Ec=8r9!5|LzGq$?HKYiY@epaKHY_xDvT*MAPBau?ooBCa2l*4_e9N zjO{$%;a>B1J&XzTW^5;BvWc;R+kP_sRP^6d>*JKBEuuajMem1y_x>kM^-6^4L(C_5 zn@X`#=mTh4&FTRh3>EDOh6iY7UB6Xm&}N6bG?G$)?!w`ly8vCBY(P!sItA`y&gvuL zi)?!2tb#21;t}`h-voyqwv{#~fDHjea+`AFZQ1a(KfoPXhXom*tMk;Pnz|IQg;+5{Fa%R9$%c<#XmBn6PwZ;x~QkjA=BU zX>+)K-^FP#S^BF#>Jq-6{t6i=?Ts0LuQpSIZ-hY1S{Q<%3GtuWrRYsmirW4UC~ad-mR&u+=*8VY^v|c|76y}5ex;$i(zsd{nCaJ zG>f;FG-0>o!1&u`kNg4O$Oal%5NcRw>45AO6JkRVspLhio?YD$v!oSb(DgiIsy}y1 z&8=P@ib3(FOmK4`1oDe-WQ(pp-3(zBWYx!&;?bmI-t9AoFl#<8EL_Gilhz^-T=d!$ zBo=Cl?@276i98%jNxZyRK35&Nq3s)t^&y44dcrz*rHp*x7D#jABp$~fCujM{fy;R& z8}yS*i%9Sbk4}UavRuVxl=V+cS!}^XH0$S^zg-J1JH=ino$(cfSMzA#V(B!6rxKMy zfuJ{~kjoKC!n3N4%|BB^EO0C>62Y8}9x5)bvd*8%4lWKE%d|^XypQTPLQiWh(l*y} z!!qF8%g1nqH38y`e(;`h)3KQ3F1Nz_8sRCwxGzGlWkR~`vcOiGs~EvNlnDFrM>H=S zqe4E<=Xl+|QFT_<-`{88K_oU5wyBJ5GduU zMEj^h{>@uyB=t^Cw?T(F`P*-#!3&3(pMLdO{bA)O9Q%d?Y4T}Iq!acB=a{NPJWEHj z5W});QjdG=6kIPEg+L7JyYkA*@cnLaF7ZCDAE%^w9gG zk2ralmSP7rK$pJPKBcop?wF%yfhOV;0xA*NpW%fZfK@4<5bIA+{3st1@_YLHcFBl} zmmzU@$o4o@yx?St9XlHmDhE=H^OUUIDdrS@w{>Nx?23x>39ip5rL<_qE5)ha^N^3Si|vy^3|qS|0sN;^ z3SwlJM13Y|)tJ7&Wj$rw$ z(e71>i3%}2vR{P_e9K}mZuOOK8kMM!#pj=pj@&1Hpf80l0Q?ZTAgT})-jRJ1r&R60 z>DV+ej{63D?wEj;d9_FbQ1bSdX6e~BK=W%TH(n<&ERh8z{m82Ry&!i~wMemldew%V z*sYsYzeX{qo}$ZJoDBQeU^~@pAtB||DPs96kno2${uFZqe=}hH;qL;FC0OIQ3*h^!GXeV4u4+?C3A|%$by%eEJGi`| zYGS$^VY6`v(=Nwa-3h`5PmVe29yew8AZ&0$M5uQer7Uh@Bv6E1OD3A~fTiPMTGIh-MM<4r+6? zyU?lTRzymY3Z(k5<;DUz?(p{?R1xrMZ*G+!qSteO>?asY6_Q{c|15^PgIHKZO8*_D zkRLnKT6x}hzX!9h4pyc^Z4b0|PGE;Io|H2L89ms{oC)?3uBX`5KKu>prDxB2b3ji1jFL@W}mxG>RPK-gvIrH*{(HaP~Gd zd_!H8-RoX_1cS7MSyM?opXbr^4o`gP*l23>a*14EoE5?>gQl0jhjC>mgy8k;BB!eMq zpb03Ph8Q@o$b9G0g?+MAOLXo`wqe68xsUA^f0gek77UyVerw*f!x13p05g6k*A;#l zPbejFowy5hZT`}`N|S|~pn#chEm|z?MK_)={RpHz^=2vrzVhl_{JFM#zJ|gjO#>#o zN)f?}h|fJa(f@&r`))97KSjv5G1K`#Q5EwopRi1d5(zdb<2g=6Zv*eD^{%rtb$4Om*OZaFK z_J18*c|6ox6dyBLvy6SsQkHo{h3v-eVMJLX%kW|d&pMGe#MrWz=+Rhbq-;@=Mq+G} zH3>ze5m|-?V_zrlH}C)ZIp=%N_uPB#y`TF%NwGk622=afb8zolF7F@fDKqp^O)RIV zM31kq#@>5>WyS((XPHaiL_-UDr;xkhKSdJ!z=?OJ&N*ggM#w^Qs_3jb+!-)A>|yv? z);X79@!LNVA;-LcObjcmGT-o~Abz~!tu5Brh&TBIX;x!j$T|Zgp=5pmesQ)x{P^*d z?Aq9ku|eF;!eJFYOhS3s_XBIJ4j zJ3M97g1INf`VxxedrTU108i8M=D>Z^OOEcs3#4gz-iCEnB(uy)k>=ps(d=#X;x7^1 z^hs$BTVQP)_dSoUG~{A)=D!7%*&#oyUCcsJ-%h$aIAB&>Sz1|S6UJmi_Im}^# zg)^dfx1<&{&prrk(@0}J)$p%}WkEagirM}zUm!dT%roaH!z*w@^y2n3ZTY<2-3Ur7 zXr!18I1M$1=?b-lv>p-Kd`hDW$GmCP61k+uBQ~eV?jSZMcX=ZU=K2rh$vSFBvs|RQ zk7?23Gk7iJZ)#_Bs+KF5kL3rVq~A$Gv4vj-IOfox{Bl>7dJcZeO8x!*6S}c-D<@a0 z@rBT#JN8y@08~3xJp)$hhU{Hvjv6Lc!WT80C&&I7kb(!*b+20`bo8Lxd?K821`fly)~bmp?GhJ^D)ZaIK!e*iFf?w>yQq}V7ef@ zGtzuefbuayyY=X*rzRP&rupae*Ijyfai1SZvU!)>b-}KO!$xpztN&ud?>_%>AKPS< zJvwqUG^pnKhzw+3Y)n=pZo`8%MnIoky>Umne&$VT`b%217_1^Nbj(G5+>b*IB}?uq zduKXPXvMzE*Af~OFnjW$kyg#28W1DmpJ}OF^Qr>YLXrxXn_kb*(Ub!KnP1NU
xAd0L85w`d^CC?Q5q_^Ya}#;fc+0|4FJ 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 N002ovPDHLkV1hj_k;(u7 diff --git a/res/disconnected.svg b/res/disconnected.svg deleted file mode 100644 index fc565b1..0000000 --- a/res/disconnected.svg +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/disconnected_large.png b/res/disconnected_large.png deleted file mode 100644 index 34f4b598d4c802fa9dff04797066f568dcf5c0ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20685 zcmXtg1yq#Z^Y_w7r*un7cjqD^(kLiOhXE`lxs*$TgdivlqM#^^AhmRebS+X#*8)o~ zvCIGA`+MKR;c(7#Yvyxj=FXj&OPq<39wiwo83+WT)V~il1A*`^Z+=OMfiD9I@?*ds zVg~~~FzEW`r=X=I4ft})^ZpYbV8ryzFP^qgb^!2^#8=-?mjp@5NhN<<%yZlx1mXti zgS9LI{-Ndrp%!a1*9ZF{Lk|T$-I1Bm*Oq@@nNVHYz*I)6kDyCzV61xdW5D>!8~1#N z+F$<~e-&B${P}C@@#kv{3WIbk^zgEs0IZ#HeBp{1x=x=kh`wn|XCHbmpM$dsuB8J=l@h)}o%*&P#50VqWY zWI>+XOKnFIK1hQQm350w$tE!KczLMj{x?UxCDoON*3q~)U#z9H&vb`IjghE@u(sw7 z7y@#|>mw-e)OP=hhalsD)6u>D(w3PeFfD+1wgYx{ChyhhLeNK9U}I@>Wt;Y)!rdTJ zB@i6}$jMXMzJ>{ZfT!D=XVtsg^;)(3`zwuJZJ>7@#F0y*ZBOmvKPGL8$n*^Y2kvlf zj~(SEGVUr`?NF+3qN!vV4QXc;bQPj!Ub5gswb5JK4=NrU>HG$prWZ*E^(9B!H;vd?+fP%b51a{$F$~;~8 z!fW{O+aL3E33e3vamU&Cn}S|?UXDqnIn+;!zz zzkdVksxrxvFxwclNi=@L0}vBlrH}M6fta>Ksz4X}w?bw6e}5n0r~Ef%4`QJLl+yLh zgpGqv8~Q_QsLsGW2$en)tVHL4isKC#Rz3XgmOc1bpjh5a`&q|s?%O`Wa3ZrmXISlr z`gvw834A;~c|s4j|0D#x#Pgyo7LC!AFpBKZb`Xm!wXirh0@!>?70Dc2MB|3`%l7`6 zzWfw~RicfrbjHUd8$P;T`Eg~Z(5scGW~w5WPT7yvcm4tD@rDViL9Xa9F@pjNv1K{G zlL>%DHXoj4udSKBiD;y|B}LU{0y51ZV*%F?erFW6Nj9F>NXuW<1JI|QNaFPVlHwrB zeGla6!|UY9iPuaie7%*W{F>)xohMU;MZB3}_ZCQFv+;5U;!^a*KA2q%GF4*l)_wn; zw8Gt!CtA~e*QD1#SP$gs$?HTrs2wXp8DUAckgb+^)BI2`BeQpcXuIcrY(4>VUtCJJ z*llebzfD}2p2cH%FZM1(T4A7`?IeL&E_cKZsLO{Jyl76sgDWSh-JmNO{MX|}<7nJ7 zvy5k|(D>qG`m%>6j`@lzph#wvThd(nl3wC~-qH9X391`q*7WK?NH_Kp?^#mO<^6`BoJWX*yZ3c!}?ye(BvF)-?<0T5-043&Nb`cTp zncPEp;qDfYv=VI*GOf*nD4=`>5*7uS=j+Mq`1-5(j%nN!XF8ofe(VZ3wxh^~w3(Sy zG4ElH{LhRVhP9VH&p&u%yM$Rin8RzW&J%Kg$A<^BFW$*FEH6L(Zy6Kz%VL!Sa?J%I z?oaeQV^J`(<*j@0T_W`o<3zQ(Y*C5i1I*6;ZTvI5`%BvZUfSz5Ci?o1{1=A!L zbMUL@tG$%*r&CH0db0(=2vMWRJ{te^reYf7Ce}4u@S8U>g4&5{xvGcZ=yb;CeBr$y zUw~AK!1`7jZJdDpgOjElBB|43wLDW@U77$^{1!z@UUMsf@Zjg>-!;~RVyo&K8pqz( z$nxY9tbWKLPTjiC)72EJ+amGJ`+_P7RwbCABj-WyY2fA<^ zut3y4hJT%?U_M*%&8dhHut1vPv(PWrl!!2Lq#sD$C^8m=;a(%heO@*VrQ>omCf*Ph zV>Oc@97lyE3OveeR(FNvvpNVw1lwX-w~WOLlUh7xQi`LJqK|vf#kL zqhvTvokx;3JdK{GXlgN{ja>Jk?}^eik*R5+7k8rCmdW!#QwcF{TcR%A9AerxZ6)y* z9`Ev%9Xa&c5otD@iA;=2+c^Oi53caTbAc(i(YGR8S3Wev6;)S9t=OT2->N$6GTlc$ z!prFfNEpeyg}lqtCAN3wBEBTc987j5fyChX?YB?Fg$IyARXAv)0tRBb=*#&G;fzP? z=Soz7j3LpRg|200%|rzXC0gL6xkGn6uaLP*8ThJfqV5tY#YuvI>gR-g(=S#XBlM<( zzdCEKzCT-Lc@9lpt?nDlds|WHc0bxyq(TP?U>WOc_v?GSm)8fGGcSfjHKK_6+JKJ? zhjM6hbnJcGSD@XJJ>eQxPoSx8Ja4Hp*URtPhpyp6Z+xup12W`fP`{KvWmC2iKtoB9M zQHjFi)R#3ln%ckTAGQM25HZfpyW(-aJV*==Vw2dBIXxz*`)qJXRC~rfnhCVgTM19L zZASi4vQ~=kTXBYRpc6Tj!S~&Tb&SCRW5$FNU+OHG4t6`{P(KYHTL`_e6+drD4+!sl z8~acM6x;jUHUF9!E}vOdpTqb09>36of$VV6CE3_M{I9RG9Nm^{U)BNQ2f1~^mvBjF zan2cD4(#%izI(bN&IjhM&~DR6ru-Ue8OY2CE#4z>yUn=1w~eo~t&w74oIR$Jr(f^j zEeYQ(PoWtHH7L>YR+kbAJAEkm(eU;&DVI$Twch5yz~^S%g(bHqJ+O7Ys#+CI6NuTH z)6}&c!ItHZK{LEOGbZqqx@pypRHu58Gzwkfbc9&tjdnI_6T9FGt;)v68fiKF6mZsG zu6;7Am^gy;IW7FRX%J(B&w@!T6y#N2`8Q)=+U1&8UAW=JoY>+ee=$}#{eWj3|Nc5K z_$faJ&C%v{6D9bVpePr?lT5J$jQv z?8x;v?~q5IRHz1o{>cjl7uHJ_TtxFf8ae?;4zZf}!1U!6-e2O8WI!IsvKc#E*_N}^ zvD|v2^3a{mVZd%k(Np%fI*U!Gr7hlo5M?)TQEX#i^Uc zWm#LBz3+P|dFpCmt}bMxSo?|YkR2euPxH-sPxV&e)WM7#skr1lMvy*G0g?vGX+2RSZetdJm-$a`?J;|?R- z*}cLGZ`&T-vyRBqbD>!-{Z1k4vI|1b7 zXowk7IFAer{wmk5_T?h5XQ4>-bBqm%Fs_?K4fy)?rCElcQLbE6RsFwvVQ>0%&BoR7 z+brGaXg}o;W)Y$t&(gQM6I-0+FYKT55F~(#(U#${ebQ9glj6RXLkmuITyx$MBV~6b z9z;=C$N*cAk@hy+%(>fmrp5y0Y?`WblyC-OK<5bZRu|`az8H5hO@&n{IBw!Cy=!Nq zIW)`L0fVRb!v_Faeg1Uwo7+Iwg0=jy6v#0ki=LJ?{B?_Sce2$cUeftw2IF(FaR0V? z1TF1oeQ`MZZkF_G5l0ASgnElwh@6O~^C&AeHnc!1^$*d1#sI;VUVj|#BwUn%*SB*1 z5DYG)Q|3#sCdRH0>DKuaF6@Pj#X*C7Ygn{q!3(+HC)2D&&^ zNL*~`J1PS?PY><2oS!Zig%9h__gK{Dz6pH<3_h)?3jZy`T;72J!xJiT^KSL2y)a#T z*Q00ryhVO#n>&;fEq@U^DfMof!=Smgn)KLMWuvPu^QW>?vKsGLLSy;9=nR=gRuhK9 z1chj6iTX|DxQCL1!`3tBP<#&oUroql!C^BlR;aHC`yFbK#Ktg)(EDilI)DzpCBTS| z*0k~#QnW(w!e0QRM8SSBwrp?KCxRyTh>aEUy%Wj49txRy*rWb;dmv$)0Pi=MChM>c zFE3dY_WNR}(X&UBp?nJgIyOC-;iQDM@SDwM5Xi+pz1`W$F`QC$mO-6qi$#0Jrrdm4BTD+kQ56F7}1{c4kvw>^wuL@5# zHO$mU41R6>k0`CF;7rP8iJ+Fi#>AEq-_5!dq2(DJFqru1zQL=3`0}X@N7~$PfHqCy zTaj}|2~yG0viwz_`EmTn5f)&fe+|JaZXZUrilD>JutY3 z(S)GL_QuIi4Sz3m>o!(_WkwmQwy|#oF(L zaZY%s6|Aq~egAiHZ8J`T_{|YPxwB+jMS=S;0LoAH`I5HC($lRawn_ZuNP${NY?fTpmE%p@jBsj9>%k>QEl{Uom`TSo5L8;i?3mAwK8EEhRYI@J} zSqO(4!O-jJTn}rEaiSWOsAW2fo9{%!8At~#?(TQ&P8d=w~Rg~lle5RcX`5?pp?Zmr9oYg|(prsb)feh-x< z;#VV(I-8@evrg_?ps^*-TEsDBm9z|yq)!#&9pay*KQZ7tZKA2tQ)Xn0pGem@V6U{> zOnXmz*;Ug>rUpU`!D*_DRmu7JKalhjx?zWPP-(-u>c=3vl$J5HRjE*6joc*EH)( z?SL2#2`f!D$7PnFsD30IUzuT}bQ%_|$NBb`qY8D-sJ2Ek!>GbM-J!p)Z{#n3YE~{R zV=aN4s@+ue=$nRbnI9E~x#A4S?JYCeWikp~H{W2H=hp7Ib<>+v`vjsXy1WJ{V>$iH z%5|tg5AF%%z=K&I1PM@Q)%pH3@J_1fa*?=kC?hT?K>-qfMs~tF&nAlOmvu(`c99XX znwuPs9+DI8Q&b$_m9ChA-Pulp7qoPU-N!49@qhkQhGzI96oQifNqz<#6p8ZUp;z+upwff8eCv2ZTbW-MS1>0bt#(??juhvt}{%TuPoAS z4>|u0m{YaR7!}7|+#qNyFoz|`5n@MuI6lH0ALxQ z$^24!23fP_Y?RMAHf&6F?y_Hb?%@j1;RC@KYwPcHr9~8OL>up>vc5iwx(YetnMbWP zXpP!H{>p=z1)VkrTOv40l}_112Sf9iZwPtyI@Z6t%!>%P3wEbuhvZHN@&N={J8*t` z>8XCG5_`v{%i(5SHYP{zGNZC4@!}1WJ`W&t!OOG1Vehp0Q#KRPi)%y598;**wR|!Q zy#LrD@<%_&GJIzz{lOF?@ND}Qo-KriG zEgxP6`xOF$m7+)G!%Pt}BDcHn?wp_BQ$eA~br_$NN0GtD4YScy^7rYh#6g=sO@VDU zJM<(rB$x_TNZt5xDA#Kyk!22Ts5j>vJBTxRVwypTz;7FZ^^DLL>@Eblbylc# z*h?PIp|>7BbsIT!DEUjZUGGj5Qd6&gl>>;;mWmH5hjOE}UN?%?QGMD8gLAE>A#-c_Vt9CUj$U5_xS6~P zjwMJ(J)`35!ndw3s9Lt~yHFm$qUJVrD(q+Fq0&yI?-}|HF7DY-;V+{a&Rj#kl?~cN zDCfoW^nGE9{e7895z-JE*RM~RM~3es02!%qGpDX zY#$gLsS}xLE3y$~M$gE(lk|E%rvDWM+lJAT(8eJ*m^#jpU{bx>EuGQ~ZwiJE(q z3X+%}#(fj4<&MB9K9V0wkiZ!xNW<8z1s1`y3@M+UG)Nhlt)RE-plXh zA^{OEeiSbSoG8Wv#9i&Al`2Ugo`7>3W9sH1Wws%`P)HWjuGi=3WYnSeozs1Q8w>7m zDh-D{lbfpn0lvba3A3y?mRPfYsciq`*OJQhem%`-50$z?P_A0JCBrckv$S%Z-L8N* zAPD8{rQRIr9q|`B&3mDQ4}#aumS$Uyl2U0Ux9^XVOHp63R8fN>=q~pv=$QJGnBDNVy*0w{^Ei zzte$X^uZ4M9O|k>nzYmrQZpnrq-gWHX z>ummFS$p{)sL8QH_k5teqFQcmJz!6hs-3ib|IKZO&;uGYOyz|dV9r`_y8MECCu0W2 zm<@nDKUu>#R*q8yx#6?k8MZoZ`BJrDAFAj;J3sXtc#uW?@Y2y(OI0y7Cv+@q2)UDA zR5(BHZiz}xWX&SskyzTK{C9DMKOW|gz4bQCNJEh;ue1pXj5sKM=DpqIL2SEN+~yqf zC%(Glb}&yDGvNW-ksYK}{WjKhbKJ3~=GG@yQ~+tR%;rt;gi5c&}&S`e#F)ec5wK2Q2+ ztIl4%fezeSfKF`wf}doxPcwEy%x8Ut;XilUJckg3S=mYiHAL5M6KG|Y+6zbkX&MwB znV2ZQPHLb2Ab-*@S*0QU$^t)JE2rX?{AJHQs`kWoIGV2O>T0hbWCIVNB@^D-I)5z& zt6*C0CApXQ;^au`XHpA|9tkWz3PSdD5TNBp`}G0RG5^bA`;E8`4sIOyZo*yBZ+QOL zzy2+asfrO=axB2Hd|aNb!q6OX!Me;+M8zTx+$7BPP5Y$eZ&Fisek=~muoH^JNb8FFV**H=Zh zr_sbORDSu;JVu};xDr3A46#FP8taq(O_r$~+^;mDVq5lh<)tkvAS<@K-x7Ix;%T> zFls%#@T5lj)KvzPTH4Z#HZe^t>#VY5kI({H7)?9_?gE-B0pYO9vFNaF8t|g;z?t^& zyM?D&)a-2$=SMmh{*oAb*BX_B&oVdz*9)dQU3Nobk;RdaDGEgo_TDE}FFUzx$iTgt zv-L5B^~;Ynd<2}hX%6A8!+BUxc%B+LH=%~T8ioG`4DaE-2?|g0RA5rtmAL3$azyM> zJ@SbN1{UK@`k3PFSNoM>ef!Hx<||L-BeT$d1DG5A1TlE02w>MBFT(df&#)7w5~1={ z6iOk#U%R6N^)*D#*40@5L_5{0oXW=zD1m)mgDB2H)YCG-hdu$-$(_ zQNn9o5ZjMTCdp|^(h;mJ_KwB4hUE{#x3Bx*^>RnH0KK+eX+0z`~ zn{R9oqX@l!QVK-O%(ET$$FDNI{BCczOvAovXb@nq?8K@1ZecrOs4V42mi2M%)GSN& z=i=@@D4uTJoZLDL{0je_@ipg&EETK|`O5NV$M?(q={0vpw2nnEa`{&;ryc4i^VOFG zuVbzXFB&lM<9aW?+Zh?eSaJw6biN5KOHF9xP4mCNbR7tllPjl7DXx9&?q7F)IT9yS zowPTfaNZeR7&>fuhA7U7x~gpu3hYVS+;fEOz#X9%N+Fj^?4<$o^4*&ev6=V zO0@f|%~FMjKbp zKiz$)5G<^#F%;jhM8B2oj}7|Er99yacv_1G^9ur5!{3#)lHL03*t`u#Io5fcC7{uO434NMm;W))53n8XI5=^;9Yy zxZh7_?O|m7Vt>Zze#^yDw(-yrzKN3fD@uSop~ONiDf~eaDyzedjfB>^p~oulzOi z_k*)r%qN39B%74~e=UIY@eRMOg|;<4V>e{FobnmXV4JRy!BtG!JA*8=Fymq_&gi^$ z2npk6$TmXfcr`Y*U2rVspG0fh)v|*umujEAB*vX@bSJ$kQ`@`dhB1<)AJ5{5`1Cp~ ztp{!zAuT3G9Kp!TWWrcxXc1{-Xg8TCa2>g#qRCP{cZMo?n8=2!CjHkI9eVC9$}UHy zo*dI@hgLBOUL80*ETwl?^z52pgz~Ec$k6%(%t(uhia7%_*i}wnvXL9bwtRgRl|u-#5Xi#Cx&s|Zq?+z3_yM9Fu-&n>7!(i zkJguJq#T)ph&6r`(#s6I=dm(n*^Kq=tA~$FE@FS6ueUgROSL@jZSokvU&iLh@YXBEbb6G0wOT_P5XKpzMNo-d%wZNB9Fn(GN%Ro z*U+zhyQe(T|CnkVIRM8Y?qwH|Ut` zMKe)|B+$Is(4eM@(Sm=V8Z{P&Ky=%2jSr6tW$L?&{&a{8j?`z$D*K*G?@2!i2nY`ZS_a-jWKdtjx+{ zWmohBfoOscy8F&oxLBao+Gv(whs}QFLJi-|kuw|%%=q>#bpUO(CpV#iCjuC{P@?x$ zg3)-&3pCq?bu=l|K8@nAm&42#EA8-2-c@z1Y~)~1d+P7E63Ned zAWN9ILP42m9D1qK{Q{E1WD|?hz@@eeniJXL50Zu7OUh#ost($OH!ZnpoG`$QzusyE zu`+@T*;S;Doo-*A?!NZlOeVSRAWuEII-)T(Wfx*m$KbzM2C!25Byy~m#18m=YpQ3@ zR#h)WVaCA56S6Y)Bj|OE1uFgb7Yd?qG3}P@R8$`+*r0f_BKYq!4*-HXV_JXxlD`us z4>P_;-5UAAtk|Ss1{gzuec469+=fiEhe-hQyr|CL6Nt`ZzK|i&xSVk<1nc>rohp$7 zPj!JK>*o8Er!>Z?4f&c*kAbxPX3^;C;IqBT7+e7Q^2`<8|Dyd&2*iAYElqJcq9s_N z*#-iJ#MFd^tu~|a(?2qEGK__xiIRjsfR=3bGZ!w_xEgoqTx&>$TySp;hq<8j&)S(% z>f&jjLjX_?fO<;1qX~*0r_zxqJ^=C$g^)0`k8J>6{CGc1w~?aNq8m?_>`S!cog3;- z6V!KpII^k3jFl-`zn04VF)e{;=-sDKlRD;@L$g4~UZUw8cU}>K0{+Br<8^r_c8#Rj zXv2fgJSHY5S@wP@{CooA@L#0-Sr|d`URyv$hEgr~wl=BP*RaWzJhR*a=#fUlJiv70 zEo?d9U$6v$Vz=hmeuv>?(yjK4ixVi}#Q!m`?_XF^QK4`=OgrDC;4NqzO~*A1dyqv?h0tV=~YlK7rGvCN_*3DGd_)N8dp$cih(>jkLs!ZeKyWs>0;Qz@LQ=}Geg(j-R z&LYVF+hU3k(yrqzSaYUr^tRuTojC?p@lqwZ*X9+V;Dsf9k)azyxnC)<2S?4XEmw`Q zx{&4wm_!st{#5&szvsiQ5%W9Ri*~8?rAm!{YCv2~8=qP|N(`et?#G_oGQ6>JBV$qT zzP?0MImS3^hg~&Gh&rK#f3(*NWBh824{K3GG|1T4!V=H_7JA|4R=a*~YvPG|46?mzxx8W_z`AiiWFpnA?1AAn4N>xcP%tGXfafe>?5jRh1W~_x*p=*Hqg}e zl9brEH{~ikr`mQhdO85rBFBcn(b*&XHve+Wpz_OCZ)OHrZPEtE&z5-&Gq3-Lxt_L# z5tX;?&2Xgqi4>KP>8}doIn)P`#LA5-gxrB$17l0Rcri0XB6>B27R3*G9l4kmn^~Zj z8~_=F5t^XcdWh@hEbA4@ZM7N03p3`py^}b#Obb8h8pNFh>fzb^0rW(f^MXUg54kz| znf)Hg+hK!?iNZ^JJ&SjxKirgfPC?ueb?me^LZGLP39M+w557knqqW;4k(9K6p1;Pn zAjsq7{$GbYH9mshX@YzrGHIO!@;*I^kMpEYK~rAf8`vt+kR>I28(%V+p|9w5O=))G zt)YJqugU($PRrg~jX>!lW&d@_(nrtA6%mD@Z~h<@>JY8OwyD5IOC4X3g_aog%0r3s zpYn(gee33!lm}+NDb{-M9~)2G_s<*wi$oFf5e9KZZ&Bn7ZO#`pHlC+fk$~`izyHh| zo%fXfVtw6(itlgxaJDLo>60hy#JOf}KaL`k@@azaOP+R(jI-!0j*WHLgTuwdb`ks` z#Q8?rri63l4S}wSEnlU99snmhlp11`za`*_rOm2Tu-4wK#E5wp>!5XnLM$Wbj^4c+ za+Md*X=$mK%L$&oTOIZzUga3Y8TQzxZ+Z}dmX^VIZfkw9g#h^Nf{t-<@0311ee}q` z2SETTw(3X)#1Mo$I%f{zFi(4*M5LjS-^s1`nL{u{1h-mc*>+>dC|X9}+M2Z4Tjk8| zUR0h`k=*ui0(`Y&V8deo)sRf2x#|M{r&HEe&z_004{ZhlF@Q4DP`q$Rf%B#kX>?wv zq!rpHFO1VvNr^q0zy2Zst`d0t{c$f2A-Es=i2dgNBjLO$_MdP_9uqqo80roc>sR`3 zciCHc)cAYQ0!5p3%BQ`3!%E8J(XCE*ihAe&Xjxep7?9_GR=^8>%36)X=m{AK#@K%w zT&P1^T*J+KY#u1(f388?^W4*nURY+s4&|!+9?b^(p6&Hr4MG%26Fe1*kbb>J5FgZ| z7y02_<&G>5o(gu&`EV5ou@fr&I=rC^r7sru8vrfHC-=O}_l8*^9)MnSIh{9*X5$y;@c#K0Y$P+-G~< zE#NOpz}bgFv5KT=)iZ9Mzn_o);|PW`kSpHv@k!()pk)GjKLo(=+neiux1enX`5mPr z`7JUs0DRYKWDg-|{B40K_JsXQVEsjDS-cWynfvj(chIDTw>bpF+>OEhR2`AaD=Vkn zMxR>h=c_dCh4z_dnOlrXa*M>nDrxq!wBVH=56 zO!$c{!qY)`m&p~&?4rdUEB8d%)mSNarX9!MOlwU|c?;cMX6P&@Gudn8Sj%I}7(<15 z!T?qF_fcKXJ@I1fc*QNRF8*$fv#GELgTmW-*}wfpTu>ruM3H@eK46^sXxQiB*TvV@ zZA+b)pyLLtqRMGTeKi`&S);h2v4*(|5BWEkH+8!{KVKJT?pnXSvk3&h@a}6q z_Nf(!3wbObW9JY9_rG>xQDeDL2k@4#7_+=V_tZh<_0oe03Q{hJ-J1RqD>9rso_7 zjW{lDQb0+OLV9jc=s>R0WckxKsId?goiJ65jf8w6OD8h>T%B7zPe-yLlF*V{O2ors z#4#T?tV9XIJUMqkpmL3<+TGZ&8~Ki*`nR6`=be?v$=Y>JTI$T!#B|Czq5`?>0{Zp$ zCV{M#@Ft)tx6V2B-0(+7b0Xr{tr}>^^^zjt<>IAb<$lLP@<|-z{Tt{(rr;Quj-=$H zM=5z(hp)1e0<&@W-wc7{x0JGVrc9oyU6c)5?Q8|bo}d-vqgRJ-Hf1U6HMjABdWf{Z z%-mld=D;#zqx4@w=SF=FH|qQ@r8ymPW$W8|+`+(xeM@8|>1I{7XfvHkdA;+xJmOdO zeybcg;P?PRVH7=mtG6Mx)NnuT(Z7q#`$WLVV+5D`GEE{7HaV&)ZDx=7ie@*MnM-`< z*sDETpWLZ{7e->+rJwrwyU2SpbDP&YVbkk~viJa|@SapQ#nUTYg<72irj?qVa&l|H z_oegz_VInYg6d-VbN07d{QSS2bHvs)+_C%r*e@IYe7XdQF7>@LnC-Q+VtX{$9B8HZ zis9Q}@1qn1>j|B`-FL5*bz123v8CgIaVWl_D7~dxPw*x z^j3Mr+=m+K7_rmd(D80KFmgw$tmt^Hz_1xQJzwh56FL}0WUXlgWLDjFbS7ke}h-!{HF2k zt9J_Xk!?e{ssYOD*iF9s@Ah-#T~PE)E=Ktadqmb-BN7eK@B zVz;`wQ3BkHtA&yR*O_G)c~y>?^S!2C@%hU{Z29A@Gsl$%FQ|3i0_T18Gxiue6Jg)o=Sgq}#wA6P7f2k@8KXo>VD^Y{EBF01L!!oAp(_8oUe}Rr zw4AJtW2Y$X@iGZ-nx%!!Yb?ZERd4Y-<#jY04WcrFMD6d>$3NO4&M?}~K0h!rdZBNS zsTDYFZQ>vyayJ`vV9d$7au{;O15Lp6KV7O0{wFI6-w_}8I2I(wMQ1~z=c-^N8qcil z9r=D40mnD9RY~pYS=Y|d+rue#ek+9sZ5k}l!n{Jc7BmI^PU|waw%esOWa$VPd2Ef+ zd50h22pO;*PJTrtm%W&L@>y?Z?~NT%6f3}(*D*LaY z3R)DN-a6dP{;T7JR$1vGmc_Q>Kc$2psU!SakEkBch19QUlv@zvBP9Jq0Z@JYblZPf zduWZX53)z6CV!rfHhS3)CtuHJnLspUOH#Ila*8;PQ*ml`cEZDdB@9;(4`je`j0U~Q z^?!YiUBz3wE~*@9t!kocNFQ^9+!_z=P569`&P*Ns#v>+PXI5XuG&wm4!c=?6%rQ+* z6)mO4Fkjh4;wCK*x zS)}Gb4PZQL0)w27z^|kqtD!+Ui+_+L%+Tn(l&lQZ-segxoB3~xBbR%=n+4v6vT?#7 z_Spi)J>N;VoHl1^t|;pl;@dK9y>C+h<(yq$z83Q_SRtlHhwc*dO{NteElkY;gY=I8 z>ik&aN>XPr51GtGeZ4)IL!<-I&sFiiP~O7+<_YX7i$pypKPSBDEoZB7DXO#Bj)bsl zaN-#6Dw0Ppn6W1bITe4o;&sxeT6=ev&L~DQk{>hr46Kdsz!gIG;4xLq!TgBE5yh11 zDKiP}op}M{=zkSlB<&;C+L=Jc18Z3^NHv*X5qUgCelAO0_(|a^m%T?}3do)4a5=Gg zz;oHubs)FovnjWpY{ALa7HP*2P3aha5ZbYt8R`>*`&LqUS`S~-r^RR6Zy>;}4X^}7 zFHA_wj8VDdgw4Py*n&-;u%wu&4(Pm`LUL6>(bL!^YO71k3LtrF|)a+ADJz2Y>cK9w5P;9_XpBX6fNh%@o)bg9}B)c$vvTcrv_>;qiQB2 z4TXrnAY`^`hom}O{YZ%?9V2PNz7Gsu_4##0uSKEk<5~ioe;b3E7hXmnD}HYgPlRCW zzUjb$tW#hmAInwnUPRb|Lv$X6A!)?K#HvQv5s~+LtQx4RtST&~Yg)Byz0P@n%I(=N zGV*9@1!puoOEI-@+5o-Z!lX`5oL^XQJq+4 z;NptGBM8bC$JpX7rV*G8jU&*G6oy`)4e}N_8)dgCc1K3$r+8D1+7F3m)UQ#1Vrb$g zADYNu?p0k_!aI8O(*o??xP5MiL74D?GWfW{deTRaQd3h+X@`EQqW~`pD2nzc>=NPh zCbpd}?%Iyw>iNoKyNW0G0L>&O?Y7A_Rk5K}8$0yrB}q-%SO+f04&f*Py7gjij|KWX zCUhm6Glv0k|+(Msyv2711DFPjDtdbx`}Ob8X_ zSCDwU5kC3aCt0jTU=anM-y^t+mrQWSyaS>K@J!nz9c8RZdfVt{tE)7ic%Jy|B-g*_ zVBVi6a%63{<`RpL43gD>NR5tCt-AO%-lZ!f0m+$ZVA6KvAP%X&Rh?Jq(7zT3(9OV|_4)>ts#$=Ti1tEH&#Si11!l8AGDfkv;r-ywE2Gsudv zP9PPLzz-Pd{9gKl*8UbeUBFyjCED!?9eWQfA;*ebatm@^P<9Pb?LTwRMNVVK&tcu%XF zpPjroxf=!M%HyN};_^V%N=*avmQFPHT2TVchn%_7qd)t4yW5kcpA@Krzkl~!O^^U_ zv{)tZh8ic-wl$==OvtIRGyG{^0uX-HU6vntfDnO$jR9ir2@Zd z94ac(PB?ZS9Sk;qWdO)6A%;wt_}XcQ?wMK;_Y$gx*4iYz;R>o~W^SMGF3O>v00e#W zhE!I*$bRSX1Y{wxk&?|bV9N}{#;WM_>O*O*Y;h7Rk!yvG=jy7a{zF0wM$EdLKnfix zAvYV_(juH|(7L|J4+mw>Q=kU2&nd0FOR?IExR7Y)LEJut+8pQe7TQUf#uv(Wq7P*4 z(Q&bfKMJ`0br(O_Zm*B$GCVib8x;V(Sbymt=Hah;akfwS=#dfyue56BT_YD4*QC)$ zHgDdP*eV6nhg$}Ix01nxT%JaL7hxx+WqJD8Z^M85y9>ktW!$+KX-k0UAMXwV?x&lJ z*P`8yM9~Zr~Q+YHl*i1dD2t!KovlKY@(3zzla=hC54h}pQJq- z7SUs6S>vsddY&#h)sP=?694#kKW{Cx47{z$C~th2TyI!!oI(c28i7axE<8Jdw=PYq z>BZ|gKhn)w7S!i^7UV)MwD8VB#yrIN?Si~&=8qVEKbPk8HN@Vpx2@(mRtFou9Cago z);-?e7yvAPEUF=~Qx;k_y?sG%_vTt%&@lD@v>mAI)d|%4ft8!X$ci^MD5fuWCqhv4 zC4c9{BLgB!7+}Ll`qXm#@1(2iF6y~b?o;wT>ZHq;IoGP;!vU|PFjq(p-m!$l-hVL3!*T#D?fKPmri8EjR<`m@P}3b%1b7g zJs3TAmD7}XJ4nalv{#{VY`LC$^^GbvmQ9^DN+&dQ$Q9d)+2-Y2@at@i5w?5%o1@Jy zFBHgt$7+l5D^>B-zYa<@g~06{^DUI7`HGuqL6%C&oL8+O!3QB2FoT6(6XndOZ_|Rn zLn_HrS|sp@w-AJDGf%|{N{vS0u){zK6RgD(scEmZr*Ww9{ITk>U-f;2Q-HU}UJk&`0<{)9CM_(KcWX7~_ z{x86jJ#+U4;x^8_@|&*K{3UldcRx+8@ye(gL;eAW_p`OXA=;*Y@M_Vu{KWaOPwxu+ z<7x8kXQfr}Sy!*Yx_!Mmrk!q*xs4Z)QX-x!dZSivi_kFt*i98F3x?HoXSK}B(Gsq# zgAIBY^?CKO?fcRz0mU~Tlet4C?HMK3d3W$-dn zeEv!71jm=j>Ms#4lD7>AR9|DYk2HMSMiyH8g%fGD%RQY=9q&WvuuibqYo2Gc-bYLQ zxcnKp;kY6NZ`#&`@LF59TF^!u5Vrey>|?!`raLCGF*#fC0fcBD&odH`8XYwL$0uDl zvD($Mr$&D9RO~n-5pdyvNTwz2Qz=Y_sxlFPi!@Wc%7QIIY-4QVJGI#Pyl@8g?+E71 zr6M9_8XtW$9S(@lQGCLiKOHvbpQT+Ttn4RQtS$&T=JyA)#JIzTY>5Eo|Mmmc_KfrV zY;Dj+vh$Bmj_+H?aPrHIMV7kXxYpniC%wjWbf} zy;yxkpj_&yUZvmP=Bbe_?4QmYnzb97thrnd@^P|+ou2!H0usgx#@%n^V|99kZVRja z956l3VI3nfr-FIxjEq?Z@7V4}mafWfT3~*u@?v9J3%FhN7dtpDC65=aUu`ux1qP-o zm}oF+0?#~4Isl!zu(0~rbb<2uJj8hOj}KVqP{!EJ5}-=_OV4w$JL~@uHOiTaTitMl zs5TY!5&_lZmycB}ELN+#W2x~1)l0PI&~e8<4Kh(bx0KFZouB?+30EEt<@$!l5|Wn5 zzGTnRk-eCaQBo*Ngk(L8tQq?{gQ>weW^xb_hDjw`Ohw0#WRGJROQP)S$V}PhXe^oE zJLflle%E`w@AEwOb3NaD-*?~l`pAaF-ZA+9RnjJWgQO98z-%FfhwJ_nWA?4)g8|VV zK$Ov1AYHXza?5z?t)~1r9OMp0l}PKL-yIpoP;DY=UtfKv69#(ko0U^^ zYW*wo)&|a1!=qiz?Hm#Qi%Rb&yv_6aE0L|VJwQrPGB#ccO}u17?NHaNkC5`~qA@0( z)G#ac)$c|qFT#j?MS`SuRl#Z^qtAFMerY@G)&Qa}Ahh;)Bda1JklW>xJcI<2ZUkIJ zW}2yzmR69t*O=^k$@nhB^OI%PRl)e9La80*L_R7L7J*zgJPH>D-6d$Vvb9zF!BEwBkDDXWNdxBA7sXHO(nau}6>25-s@S zJE4(8K$y8uCH_G}9yJG`KPI<5OVIjkIs*7-<)S588hu66=x>!-``d8T_HJy4gI!4j zwR!eDgcW5|;An3IgCURM`Pt;psbNVE;kCKcR#;cqF1WsK3< z-eg7wVo$iNb)3F8u)kVzOTfD6h&)hE^O4G<9-f>!sF^x)t#-L@4-164M@vx5%;^FL zUr6_oKHxsV--G9&#n9=7WtUWma-i+RpyITg zsmAD?s61N)`aX!RjF@HBD-cTMIKMDECL?Q7j)H@a$+}f_Bdvh|6nu zVN2ViNuqZ(fuOcp6Sf?tz9G-aNiu6hG9BgquBn(*96>05xp=sDe53-i)gPA)F@$k~ zRU00;`77m+`wxbL@lR3UeNg6PXzxUd%(gx~{P93i>A*tSh8YoNqg4?ztt#Z}T+WrHJUJ(XBPth|tzufr z4G%x0zlqQ@Uru1Edj^9g+W$FTAlGwvyCS5(jX{w!T@w>+q5{ia>innH7C_pzHsiE@ zYjlBV@mS1*1}Y1^ZfzOZ(@Wir8<8|h(p=ny)tO8C=ZX_(4S~I)FP+=elhpB0CnZ5Yf8rmWF7{k!!Z=GDyM3{ z^@{fS1td>HLy_Ft-~L~oac2@i3h*Iq@6Z=i-$G@qy$y~-!T9b~KarI;5qJBNQ(4w) zN4Xz!VAo-KQNp*uaD@(KNC1%!@Ty$$B?FFvKST?)G))Wv^kk1f%=YQiY52=%d+z#8 zLp?y55|*Z$C3<{jezLiZ6b93432dbMxN-QYTmUzjd*vUHgxO4KrC@ltkz8NTj|(by zc8M75%u!)>WlJE$rIA6trxxV6`$7cYfSxZ zp;qLqGKzHP25J%bU-1HcnQlY_@%U+|_tb@Opmk`A28${#4*P6Z||kbud-2 z?~PGya6=!Fq~(tkPJ62H%4iES9sK6-989=*iv;V_u)PXTP=Yk`CUzyRxhGB6ndfC% z#lsClW_3)853b!H8#I8*xj%g!=-+~W{0GlCPp4d`jQ!gNGjaT}kE{D<1(xtH|?%yMze56Km&Ae|8RZFBR!ukBy zkjRh-P`7xQ87jaT9qS{dO^*ZC*lX`B+66js(kY}xTLkmU@f5;7|iYfRa^RcTbj)%Oohf8nGepkGt*fBnG zXCw=%7ZHG@-En(fh)a?vvgy|G&3D$o!y>XN#_@Ph&)R4 z^$S$OhH$UY6onA(o^Y;}R=&g{gW z0s1PTD<@{!Nj-{C+=2auRjFI-EB%<8A_owV>^lm0p05uQJx7M1mePaJDsoGhnx!5I?9xW+3 zcLg{D)p#;pwSK(2=_t#~6w_>*9eLE_t5@!X*E-a|U^YSNwHQq zXnEBLg&jIt$&$fh3EHeF&8$#6Sv4Ec%`g2!<-fKTb5D^&!KM|e`l){;^bWnnV#Hd^ zDcu?r-}J*WaHcLUDZh+`K@czqma9tlK1F!@7rZ_JP3Q%#L&ibj{qAzuR1zOk53(E% zEnfFiLJGb4qK{9R?1}7Rr%7x%zX~1;<3uvF=U*)r9OV*o#>W^t!DZGUh%*@}wMPj4 z+KE;uj8hRyM{S3z#%w;joAz3@v1#2X`}=2i??r@~6J%xKjGj69!*e;p6+1Pbc8tP! zHuJst!`ynD!31#biahOg`<(uuUq0G#$pb>*RBr6D;+!Jsc;?aJKe8>?@|=`6rDGyL zN@J8k(E9xazuod34V>Y^N!jiT9gOB)+v#4aEwbuLY9)M3IvpHTW^z8d;8rnknF@-X zuh*cXhC&~i=IVmAk$i|k>mLN80pZ}R>ekP@^rm58>gDd|QU%NQ+CuXAHdMakX5!qI zq!1egoojRE&k`)kvMo-(7p}*xy8qKTH^oXN%_!=L$srF~woZ!MuBoqCz>6kPlC}Lt5z%DE^whE=@MJ1Kl0N3-q%@b3LHH+FaFTEK zYK?Bf05M>`g{d;oZ05ZFbz-rll>b-KMkh!Mq zr?DDf;^gPcVW5{3q2_0n6dr9-_Y(J?ASaSUT4mF^WfKc!IB;0Tv*(+azfE%gsc~=h zELMX{TMj!1&kJev92SRCYH((4DYVYfs3L=thhxZe%Dd6uJ#`J^GD&XcoLUYEV=Jz1 zr)ujHynJ*V#Cezyhr~UDkJ?@P!)1Q^{&D0 zSn>knRx81)T&q-reMjY83w`V$zZ6-<%&G+cetRiFJz z$g*&}QpN4ya0k*N1A#$qL#{xk8GF4Yhg&T#+H!?Uwdg>NYZU$>bZ;DKd2OW}W_s1! z2=ptkX~WoSUyzZG$QbbdYz@uG5tpc6_Mz#seM+{yMJTW$ + + + + - - - + + - + - - + - + - + - + - \ No newline at end of file + \ No newline at end of file diff --git a/fxml/primary_tabs/Build.css b/res/fxml/primary_tabs/Build.css similarity index 100% rename from fxml/primary_tabs/Build.css rename to res/fxml/primary_tabs/Build.css diff --git a/fxml/primary_tabs/Build.fxml b/res/fxml/primary_tabs/Build.fxml similarity index 80% rename from fxml/primary_tabs/Build.fxml rename to res/fxml/primary_tabs/Build.fxml index 147b264..32752eb 100644 --- a/fxml/primary_tabs/Build.fxml +++ b/res/fxml/primary_tabs/Build.fxml @@ -1,13 +1,17 @@ - - - - - - + + + + + + + + + + - + @@ -41,5 +45,4 @@ - + diff --git a/fxml/primary_tabs/Deployment.css b/res/fxml/primary_tabs/Deployment.css similarity index 80% rename from fxml/primary_tabs/Deployment.css rename to res/fxml/primary_tabs/Deployment.css index 02e2aad..37a1e66 100644 --- a/fxml/primary_tabs/Deployment.css +++ b/res/fxml/primary_tabs/Deployment.css @@ -10,15 +10,13 @@ -fx-text-fill: #04ff00; } -.log-wrapper { +.log { + -fx-text-fill: #FFFFFF; +} + +.log .content { -fx-background: #3F4042; -fx-background-color: #3F4042; -fx-border-color: white; -fx-border-width: 1 0 1 0; } - -.log { - -fx-text-fill: #FFFFFF; - -fx-alignment: top-left; - -fx-text-alignment: left; -} diff --git a/res/fxml/primary_tabs/Deployment.fxml b/res/fxml/primary_tabs/Deployment.fxml new file mode 100644 index 0000000..6594467 --- /dev/null +++ b/res/fxml/primary_tabs/Deployment.fxml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +