From 63d3f0f66b9905ca65ca2f82dbf0a281550a2dd3 Mon Sep 17 00:00:00 2001 From: slavapmk Date: Fri, 22 Apr 2022 22:34:19 +0300 Subject: [PATCH 1/6] Fix button text \n ending --- .../custommainmenu/handler/LoadStringURL.java | 66 +++---------------- 1 file changed, 10 insertions(+), 56 deletions(-) diff --git a/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java b/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java index 00d27ab..fc01a6a 100644 --- a/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java +++ b/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java @@ -17,60 +17,14 @@ public LoadStringURL(TextURL text) this.setDaemon(true); } - @Override - public void run() - { - BufferedReader in = null; - try - { - in = new BufferedReader(new InputStreamReader(text.getURL().openStream())); - } - catch (IOException e1) - { - e1.printStackTrace(); - } - - StringBuilder builder = new StringBuilder(); - - String inputLine = null; - do - { - if (inputLine != null) - { - builder.append(inputLine); - } - - String newInput = null; - try - { - newInput = in.readLine(); - } - catch (IOException e) - { - e.printStackTrace(); - } - - if (inputLine != null) - { - builder.append("\n"); - } - - inputLine = newInput; - } - while (inputLine != null); - - try - { - in.close(); - } - catch (IOException e) - { - e.printStackTrace(); - } - - synchronized (text.string) - { - text.string = builder.toString(); - } - } + @Override + public void run() { + try (BufferedReader br = new BufferedReader(new InputStreamReader(text.getURL().openStream()))) { + synchronized (text.string) { + text.string = br.lines().collect(Collectors.joining("\n")); + } + } catch (IOException e) { + e.printStackTrace(); + } + } } From 471140e70fa12615a6e0c0796744de5923deb0cf Mon Sep 17 00:00:00 2001 From: slavapmk Date: Fri, 22 Apr 2022 23:42:08 +0300 Subject: [PATCH 2/6] Updated to last gradle-forge --- build.gradle | 105 ++++++++---------- gradle.properties | 3 - gradle/wrapper/gradle-wrapper.properties | 2 +- libs/japng-0.5.1.jar | Bin 0 -> 68171 bytes .../lumien/custommainmenu/CustomMainMenu.java | 2 +- .../configuration/GuiConfig.java | 2 +- .../custommainmenu/handler/LoadStringURL.java | 81 +++++++++++--- src/main/resources/mcmod.info | 8 +- 8 files changed, 115 insertions(+), 88 deletions(-) delete mode 100644 gradle.properties create mode 100644 libs/japng-0.5.1.jar diff --git a/build.gradle b/build.gradle index 534c5f3..c728df0 100644 --- a/build.gradle +++ b/build.gradle @@ -1,81 +1,66 @@ buildscript { repositories { - jcenter() - maven { url = "https://files.minecraftforge.net/maven" } + maven { url = 'https://maven.minecraftforge.net/' } + mavenCentral() } dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' + classpath 'net.minecraftforge.gradle:ForgeGradle:3.+' } } -apply plugin: 'net.minecraftforge.gradle.forge' -//Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. +apply plugin: 'net.minecraftforge.gradle' +apply plugin: 'maven-publish' -version = "2.0.9" -group = "lumien.custommainmenu" // http://maven.apache.org/guides/mini/guide-naming-conventions.html +version = '1.0' +group = 'lumien.custommainmenu' +archivesBaseName = 'custommainmenu' -sourceCompatibility = targetCompatibility = '1.8' // Need this here so eclipse task generates correctly. -compileJava { - sourceCompatibility = targetCompatibility = '1.8' -} +sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' minecraft { - version = "1.12.2-14.23.5.2847" - runDir = "run" - - replaceIn "CustomMainMenu.java" - replace "@VERSION@",project.version - - // the mappings can be changed at any time, and must be in the following format. - // snapshot_YYYYMMDD snapshot are built nightly. - // stable_# stables are built at the discretion of the MCP team. - // Use non-default mappings at your own risk. they may not always work. - // simply re-run your setup task after changing the mappings to update your workspace. - mappings = "snapshot_20171003" - // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. + mappings channel: 'snapshot', version: '20171003-1.12' + runs { + client { + workingDirectory project.file('run') + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + property 'forge.logging.console.level', 'debug' + } + server { + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + property 'forge.logging.console.level', 'debug' + } + } } -archivesBaseName = "CustomMainMenu-MC" + minecraft.version - dependencies { - // you may put jars on which you depend on in ./libs - // or you may define them like so.. - //compile "some.group:artifact:version:classifier" - //compile "some.group:artifact:version" - - // real examples - //compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env - //compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env - - // the 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime. - //provided 'com.mod-buildcraft:buildcraft:6.0.8:dev' - - // the deobf configurations: 'deobfCompile' and 'deobfProvided' are the same as the normal compile and provided, - // except that these dependencies get remapped to your current MCP mappings - //deobfCompile 'com.mod-buildcraft:buildcraft:6.0.8:dev' - //deobfProvided 'com.mod-buildcraft:buildcraft:6.0.8:dev' - - // for more info... - // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html - // http://www.gradle.org/docs/current/userguide/dependency_management.html + minecraft 'net.minecraftforge:forge:1.12.2-14.23.5.2860' + compile fileTree(dir: 'libs', include: '*.jar') +} +jar { + manifest { + attributes(["Specification-Title" : "custommainmenu", + "Specification-Vendor" : "examplemodsareus", + "Specification-Version" : "1", + "Implementation-Title" : project.name, + "Implementation-Version" : version, + "Implementation-Vendor" : "examplemodsareus", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")]) + } } -processResources { - // this will ensure that this task is redone when the versions change. - inputs.property "version", project.version - inputs.property "mcversion", project.minecraft.version +jar.finalizedBy('reobfJar') - // replace stuff in mcmod.info, nothing else - from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info' - - // replace version and mcversion - expand 'version':project.version, 'mcversion':project.minecraft.version +publishing { + publications { + mavenJava(MavenPublication) { + artifact jar + } } - - // copy everything else except the mcmod.info - from(sourceSets.main.resources.srcDirs) { - exclude 'mcmod.info' + repositories { + maven { + url "file:///${project.projectDir}/mcmodsrepo" + } } + } diff --git a/gradle.properties b/gradle.properties deleted file mode 100644 index e9b9fd5..0000000 --- a/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Sets default memory used for gradle commands. Can be overridden by user or command line properties. -# This is required to provide enough memory for the Minecraft decompilation process. -org.gradle.jvmargs=-Xmx3G diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e18cba7..f5095af 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip diff --git a/libs/japng-0.5.1.jar b/libs/japng-0.5.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..3e25074e476862aed240d14d3634d58c08d3cf5a GIT binary patch literal 68171 zcmbTd1CS-rnk`(mZFJeTZQDF$+g-N0Y}>9b+qP}n)m5)=%*>m)_kZ)pytgAW&p8p_ z&d5CZeQU41_DV$=P%s!EASfsxn(`D?puY{|ABVpU`tL3$rYb}yB`?kZ3Z(c?f#^fO zTpa!eWdGgK{%fF|ki3+*n2IXBoVe{I6T$!yoZuXO1dl_2AhYQn1b(~P*491>wF!xX z*O%G({N&ArLBIrTn7sRCA(TYx>srS0kqXN5sZ*G!#Z)nSe`Hmj1p8Jbiug+b)&Lh66H6|lcoXa{ilr@Q#q82EpW z0od38oLubf{werh{~OeQ4Yo3JurvRsF8??`<~;0D0VojAEi4ca-v7CaqMbRtiH(u7 zbF;dh%7P#oA8a#CeR8CBkC<3-lU1)mQlzw!5X}!j+FoCn;tGyzVg`Ba7maTP2}|tE z7v)HYrS?3#;eiA}!qoA$^K_T{i=E%+=R15aTM`)ixL{%!(|M*-YdbUEi)1hO;=lviB_J&|<0KL{?(~6`9&oRb>-qfY5*qVeco| zN+w#<$jo(bxg|Q+xvDn#v3!N4^y8xZUyxI$hpfn<>PuEAzv7`>1QQ4lLQE9TQ>;^m z64akmUwRXV1`q*C&Mp&G&a_OV#lwLBZX9r1mQ8pKoQero7ZDii4pcwceJ0u~BnPNS z7o?U!tvm6-=IW2P;Sx%oU|jnQCf!rmAmS~p#<*tnE%FcG(b}5uc5BW`md0Q<)p?qd z30+{L%Lcz;i>H2wC`;>`co$9JcczZ}i9!78H7dd$cDqWS`a>p{>r6}G zfP4T~>gJkXaNT))JY*fCu4a8!{pw4#q7anj>^gw?5V+?fK;OheQk>>?V)xwrK2)KO zOt<5?RdQwS*`SWq@Mk4_PyR8m>kz@svIcZ2(%Z%9;y7VWS1O?XmQijt^QuGnt(oraNm&}1wBp*-Yk~| zj8dj^XsJE8F=I}N11!D~s1IKH*VUH@rS}qOp6+h&?(N=fh)`aL;!GpfJk~1~Fh|P^ zSx_I>B%&ri}WEGN0A zt)v6sannp@spRy_yd)MC;v|iTdz_jN%LU)@Il9ZjDl$szF^Ff(Aee3w51rus^b9L7x|5$E|BNqw zB2-rjf3ec#FStgfRZw?dCmu~k47Lh@_rdR{+R@7Ge)7d>hQ zFZzLHA`O-L%s2=$NJBb^IHfe>HRUQZo;>)Ij10MO?skn3khP^M{44&NoFzTmJjc__ z{^lk3rU$6Xm<|E_0f%|CLb6hGHh!>xQHH6ARhk}pZ~-ec*dVqKiNACoJE*%+rzVYO z!+xqk%`}b9kz=&2`=%w3d}b-zM1SJyE@P}K6xBmc|I6p{7<>3TS#?`;S-;rAHvOa6 zDP&q-2QE=#ZNEj2aR=QVWHBAIvB`c7&iUr!5{u9Ev&FkVe$4cvS_x(fkzS!8 zQC-n-1f4&?K|B$tKEihwI?t_sn`P9FXoX*>xx^G9!L5w7$V3_)AQWm^s~jr1Wbb5^ zGi_QcSMROrUI`5CA(rrX&mq37!1vEi6QdG+;?wR(aWbXs zZvN!LQam~w4b%d}V#rVgtmw=&rN*76zQ7)8O_gb4Hp!n+E@! zl>#orFTcTofLQ*HIAs5AR*G1-+F6U(oBl^es_SUrs-b<6qmBxO#lt1ZPzu{F#m^e+ zcpoW)B(byWlKzrb+8~A->y0l;gkD#_^V6FM>wXr>Z9=>PZNXS>pifnBJu{dmyY^*P z_8Jq`G{0$_Ir@0sHlG=Ld&tfG3GM)9u(FTUz@})}p!sMdbzOvwP3k#)Z`6iyHCjLV zp;$IVZ>puMWY|bg?Vy>8Wf(HVL%R)dOdevxSkdYn+4uESL9%HeIvb!i`Kc)5OgMh$ zOrio4JCPW%hz(BRIUwQWLz<%OARU{FO{g?WV{UB11nzsk`POLqGBLgAq1@+RRjL9F zUU~$c59#?Za^KHuANzJ20md*Ovzj@IEgxs36?%2(%opWFoO+f%2?%X0-kf*v+deHW zz68D@vQrn8i%gedVxl@G8)_=T&}Ey!^=X@LFv_%qR?ecGaKIa&m!3t5dXL;TIU7uK zv0+Iit~uvtG3N$F$>_f;J?SWcPVP!j%w=>Q_OSGvu2Xr>0x;_HSL-aa+csPwcx6{f z={B1=uCn7NVo1gh=wXsAlHv1pv6f(NCU;C4)26c1$+Xr=moY^pwzL)Suof!zu$nu9 z1+xIq;Jt^^Qu8u~in-q~d3>uD#UHJ7L{&h@Qg^^u7-i$($Bhctkhm1Le+f0yo?VO`XsS8CBtoG>4$dc)6(^j-ACMX1K)AbN3s^C%!;6 ze)V5a(;KS`KO`z4B+FWF*Qxo$GEfFHx_1}Jr$)BkwnQFq<`=|?2}A*7lxjXUa8CUQ zMMVKo0C8qDsOPNQCuP9(G1hvkqLjlPz;1c`0jS-pH$e*0?e)qxJS^iz2+mdNQGjnl zo*U-#u}dzk>~9p&TUeDLyk}}>Rc&%=TC@g)h43Gp>ubEUweKu}*6?4Q3u%l5Biw7j z$c<28^}hKBJ1=GigxydsO0W}&tzQqIo^>O>N#NWQ$twq?n!=8$FA{+Xtlv_{xTLi1 zbrS6nEJzlNh!UJrFdok**%BeWK@(J4J(2rt>)ejJ5Au!iE*W?07*-xN(?4@IQ+s>{ zsUoG7LA}|6kBaaJ$*cQU)j)Z=P>iln3#-F?9?Hk7=)@P&o5m9dWtW|reX~#Q9;7{i zu)NuDfM%l;oA9(r5w^j4&Qw=LNIpWUdftc<_7iG_F-Tu|tB$!B^ax>_blX|&+(BXA zi?B8nFnQv$aVWXN`my`{94{m{21jp*JJlYob*pHF5_>G;rf8{f23hzm7~6cnxShuo zcgqblbdvfdJ{y*PY^4Pzh?#`j>)kXi(jMe{3G31XnD|-}3$|~*oI2`mkwAC@KSOIv zCM`&EC@P2B<5m_UoXy;4F?whBV7KfQxg4au%go<=k-UW7@~NRPxjwt}_Sa*-&6cEC7jd;M8`7?wn&d_!j^b|}d>CWrC-HOOr1V+PrWsL=+f4}WM zR%nye>T~YJ&ye8DuQ_-=h20~PHxb>aUXIJ`E0kp! zZB5Oo{`2`C{Z>fosuvjQg>?uPkRi=FntbaM{Z`1!#8-87u}~N2S7mkDZ_6p7Wc3kV1eyfJe;Wm zvy?eGRM+aqQ+eE#jKa0sNV#Fn0AbJ5Eq__5v^&Oru(+!Xyhqrk}SWBgaO7{y^-Nn zKy?0Un{a{>^!~n#qQPQ^VrZhBsCfY;;daO=P&%SYqN0Nt;W|H-#U8^~k?v~3Uql}x zJq!jRLF}B%GSf43v$A4JP!0<3D8mjMMVd(}YAQ>zIet`1_i08C%B0@q==#|uV%D7GC+&QF$zomdUz2-CO|k+ceriT7h$|NYhcC zDrzW76my6#N#%NU=ap%7W>{6`%~gN&99qOGin_p^hnpfeW>f=b$B5#y-i#`C&e5%J z#PPgVu%HPw#+1{xsXO=vdS|0CGhK9L8|Yh@^UQ8wFrqoj)JP7zh)z?hQtFCV8y(?kYi^FykLtw~-lsMq{^&*k(cqIQ7a9Z0aCbxBrQu;XRw?EEidTF1cq?T$p*p%-jtHq?&MnRj4Fk#;BWT1I{lY-6D_Q$kDZ<$t$WqDPUdi1JHj-k53Qm5B^ zGHeFi2YE2{HS+DAEgPo`0Y?Zv_-Na2JWNVutB$gm%Fanu%KQj~#u1`slt$shRAvm_ zB{?A4`L^8|RI0Ho<<-ezi)k(1d?0a;DP6g?w-%U;wn6%-stm(;MuX{Hi7R*9*jnuL>$GjDGN+CoM9f7bK#d2+ zEeU&yNAv2^m`qE&N%iqVYfb|Pl190XHFJ9Cs54!~W__D_l_Q62N9zi~vcgSuChl=w zZ$oUw=Sq@=M%3S>wUVUf+R>F^!9`1jjHi8ONp&Wc|KuFF1XpKOOUM@456&1WNnnv% zK7%j7d)H553f1FUF-khMXy)u;;pT_<=ACbuV-;`&B46+evJ5aac1$nR{Y7aEi;^kJbz~beGDA6LVO~Lau#= zSf$y!l@LvA9=t?0TUdFj1JmAMh;RLJ5-OETGRU^F5jxjGl*2dXnh8&bMe#IUh5^~kdq%RSD_vN*t^K6 z)j^~l2|AT-!rY(@{m>27(2JnbK9OF(LC2-7id-s6n@!;f26;h-g2%c%*S4$hhg>wY zNoDU_fZUF|`SBMdGeWW# zpgn{+w-}^n_7iYfqxB=&e$3}ONS4L@@^9CMsULd~#|rnMd^`Lgxd{lKyqzwZRw>#9 zyQ98f_yGYKxI-hR&x&v;R5=CllAcru5lL}Ben~>3MGg8oxVK7I4MhO_-3l;>>nf`eq!t%` zItp9~Q4uGmIX`~>Wz7Fo<3rJM<^G2#H3RYgJ4LX!b9OPZb8-H+Noz>bjMIiH+VD)w zcZWPl7&|LfllP2_8kkUPO2PGVmNJn(X2r7tRe?aq#3R4$g&cqVD{baBpUEuL>bo z&)t3|RjI;}kA(dZavr4{Z@*aUHC@m-^%8P`KfsD(tBfVvrq9_L&Bb?>WKC^ zy!{!0ku!`jW^YAXQXZk1fn6qM`=vozLc^@ibfH!e^5U*L}J#V{9th0pR3=tu?wf zscWWkZTY#=7o^ok1og1ltMZ7y_83jDK=?>iK{zCQKhAq)jdxXGmObpLOEF1>QKes{3_LX#*Ey_@BU0KpgCVhr8Y-}-PFsh`Hl zk~g|thZ>lF%*3uX3^jhMw-Gy-)?fs`yx=x3efrow1xd5PWt4&|<2F0_ z8WpaBfT0vlurxL{POwxI{T{MTNu8c$SWM zr(VEg0*DDd$sI-|eB=8gn!9Y#yRL`f*`{L%WBTk1KezPXoX8+ z{P_Fz5Uk-tDkJg`%NpKIGLqvg{qUjqQgMxCKPUZ(*7Dbx1efKn0@emZqoLNlgd*ftlQo9r#ty{LTufKFPU zW!4Dm@f|zH>n99d@ihMM6RLux+;Dk14saNgh;}I$2}{!go)RWzlX1nia?$F4ZaPe$ zsT(Fn2L;R1i|c^dC$t)*eFMq6{MSr69?tn+jL-i06_a)n{rR(v4N21_(E`Usd`D!> z(POXZGf!Ezc-&>hVhg_d>SPrz6Z+C6MGtJct~B-{<=NEUmUgIgtod`n!X0g{I%Sng z8u@(8bRC5GnXNez)P3yC4IKcA79+`(i8_h&q;y~B$$^aqPrrqkY5QN17We5B?uL#6BhM+vFgEPM)46wg>>@HZg z_u8VH1RxN05I}2BA9zC`Z7=bqHx5@{y^*N8AVa@C0i(2#>m( z-gGd3vTMO%_HWH3sN(jqC+?jlej^YY$qur+j1AvWu@H7 zqEGMJ5(^|AaiwP??w|b5>l1KTZDhfres;BnLg12`adR)mQwYLXFpO<`7NW?WdgP|c zlv!zk_?X8Yah|7wUplBcSW~&^&E8q;3Kmhrcqy@|osuWFU6CnW7q6;cbkH%d`Ym8roB(z{jR3!92YF+j zMH0wwg@2Ag^KQdYYJOCA<$7{CucJNGfOCEMTf);oh6X-s>JPau<$p zp?u`{32@~HAB~@3C0mL{`#QG;msI*mni={Ej7AghZuC*_>928BhME|NiO=Xu-uMa|`lm)`>G#2FglmFE)#EN=8cZEuR31gM$J5Pp46 zdH4!(%z4<%c2tPE(+>p^S1AyAGjbyl32r=teEbru&|E5vI2FS%8mzS6Re6(*0SOK` zuVgd<y|rmPYm0{M5&)}!wzT#(pM|hZ*5=i9WqB9gUvl`P;iq)c5wXkZ$2vs$ zSgf=e$Tgw1EGk6oCh!&Mk!@l<(to7O{Rsdz7qS2*cVY1FYst7q_QeW{Oj$Rc?Xn?V zwzMK%W6hvHXH~eZXSULr?zz$vq!F@J;mYyo+Di!6)`qrI0rQ~RdFjHe56W#a&&9}*Lm;s@;{If;7cAHM|3kQ!LXFqTN7r4(}Jw=`I-0_Wy9#kmxKE{ zf>zB%d7!Ezzlq1Ho}~gyjjQH1+;c)v zr}0O7M`_I=7NR+?4o()C`@vcL08RnjOC=IbWAS^B&}w;~_&<u#RCEb7#}GySyvy0XL&s@#lBi z4H+~yet{qaiPKG$I$sM(zS_(6X@|f>EfsRRW?uEII6{O+si;BFsZVB@JDQoew)t_+ zOq!VJLV7*97@CI*HLEOmIjcAqc#SZ{K2#!H=hJpSfY0*+PxIp2-Io zpNK~zFtjD)l0_)1dZ357K{XbF11Z+9kY)?W#i}4?Ha49Rt&ofeKmO|)33L4@_E@J0 zLSI7k8;l|F#baS`+hh8}d^Q_F4eaCIV#`T7KsrYXfW3r;fo@__Ji~l@e8YI2)~lS^ z2O*Rnc#DFv8zt!o2B3d!HpkX@``c;CEJV-9ErNhgtV{i&oe@%ufyu_9-KkP02^J&S zyCD45f`FKmzl)6VMTl1&1esd+7BDJ;7nI+mkINsTs2SbqFUFzRT*`jh6ERDWYa`cx zxlJzX&vMX8mC5Q^?MeP)q`XMMj&3Z9 zh0=RkZLuaUORU*rHheZn{BWKX^LhyHQiQL2dfr<*!g?GSU2iqI))+Em%BcLMvS1@C z>Xkw>U?Dpc?DYB-V0wdvbIVSRL{ctxo+-}x-zB26d2P0#v80{5}9%mB3vF{=+I zXQpr=8sZN^2JWXjqk;U1f}x!^AgCw*o*IW-vHbZwMrLlf(&Lqmbqq^i+o7uaoBId< zsM*2b*3X688M#fqEdmRurVm_@){V+>e@JKoT44LKcDY3Ld8Vt+88iHgPpA>wB8mG8 z6V?;8tU+9>@88-dcxw?j^T6cpSsbX**&-CN@e~ufxO-Pm|U2&AcPjg(5IVNwyS(6NFDyyf%7OAac4V z#PuzAajlvKdditBIfEa+3yk;lU|?i>@~2xVzqr9}c)(%Yh1+3#{k1Ox#i}7-05#PI zHAS;i!v5;jah(HCmWN+w)a6CUK~spUGdmBc9&Xe*N@}-7?MVlu7_z(Nkh$z~h66zg znG~8~h`he0fru(+qszzTZNVGc~ zP@+nDOetjE;{%A{oY9^|>${HL75~7~ZleM&-az1O_G+JS3KsgdY0uc6JQ>rur1z-b z_NNDOij@48w!>Tah1*Hz*0A^ye;$zW;YrCGpW$@r$B~wJ$zA6Q$hEL6zR-G)ZA{iW z+W=0ISC_bY3s#RiH7(twjwligI2Qy|y}F17(q6-cCM0wQjb2or+^w`aMIaMkao)2b8jeGnCam?lZIf3($O zYRt=G8!1TWLO9Lk{OohWlbW8})8hll7$?CEx4DemXUe1HUi6zrOjd*!L}nl<)^c-! zDJVFW(Tr`=9LjO#APmlSgNpld!?S0!cN76LM33^_l($81+`EKE2( z%MEnvW@UAcTF+%-1^f1_gK6>?8&5mVAiud9X4z7`J&NE1s2PTi2t9pASm?^?2Hm5S5?lSAgIz0{Lj}Jan#;& zqV;{VcjEDF3o-q)LK_f-wedkcc!c`#C=SwuqK&A<=OiNiLWvKdr~mltvUC9_5DgY< zS+eO>jW8m|-?zXS7eey9Na)o%7>{(KYGj|=4rn}~Exp0?nLXLN?AJ!VbG%EBYaqMz zITkRDS9BhmSM)5`2$3+UH&p}TRqzF=Jt31Me`T!w{ZnO5T0=WpZWF1qf9C*}B_oC8 zL|Ob3c0eJynkHA6npGjetmG8ZkOi#6?E%@Xrp({X;gs22 zS>lclV+Lvae5uJk+y-1+ey+P7J({{$T2)X2jqaKF3fxRGxJMMDycZny#7|_nw^*7XJ>CYf+fmy%=Hl2JhuRTP zjVbdnSyl&;P@6zgM!RCPfTKG`w4`oLplx*f`uJE*dF?s3ry4@YSc{HGl^g>f?!%i+ z|Ja5AG7E^5Uki0Jv#$(k`FUO$1QbJEd}#86@ik?MTsoZ;v8R2eXXwR>s<1_6Wy_Kz zBn$Pz+j(oKYDJcl8UlS4&CtqA?_g(fqV3Y%qA~vDZx~~ARePa+yAISOG{90tjIzae9BlAiN|I9jN| zTBI5_Ssyes6`F8&*%iSbf?x9OdX*V6|K;{na7#|Ifiv?=5$N* zchFZQxEs4*6TDWrGQM>^{OpIUIKGaX?e8}Z{|k?VVMe<(tbSWITJ7H^2e`E5MqKcy z?#Uiv@GrDg>zV_9Sm!l05+E_Uo9m4BctAmM^DQJn<%yw8e_uzb%e251ohz#XEDUR~ zMn{vo83xL*e{UF5l(i*$@p#NR5kfYHY1>9TtG($q{VAJ8V%w*GVnH>k?i|hSz+kxc zRuZ|KgdRX<`+$8K`wFcX1F(k`v}suWS0bZEu{QNibl&s-xEO3FWolD$6n$qaXnz!H}xqM(fYM5v!=rhy7EP` zD>9^>A2<9PGM6=Y1M^7%KcBO_LBA2ob?zN4W%76x&$70e(7y@?i&m`Q-dN>wkPN$e z?9@RRc5SnM!@MZ-u|7x~ihEH+CoK58(RseujHhZ8UIF0J(({gfG}lK;z|9#04Oz$u zAo}Ujg8_rkJ%Wf3X_You62uhE^NM1wIT94S+^^WFuBEl=bZcSoRv*;(8d>f1De8&9 zwu!mutGbJO@sL1u+A&?ZbmmQ@LrFP!WYP?E6Pvg7 zx{76%0wsHwf`2T==O4X}Si@XVk|ozH(QR-(J+lB`}Mf7!P-v>T8~Ov*JqzlMj5*>P)v|CuJQyw^B7^oo8? zS*^Nl$_?4slyW>e;a;zduO4~tIF&I{oOX2Xp2GEw5wXKvmV}|djAd>>JnUf4Gn~1o zzC#YDz0vcdkevJ-mi7UDvS^>I!vj{YGa}7htP%B~k{SV1<6{u;y^Xpu)$K^Pi_`2C z1L+-e^T@PqpMBwDce*4Oed=}ZE~Zy&*lOU4q4|+R2NzB7G^u?gq%4Q}iy~=j*CnTxC(W!dJ`n^bab~dij63bblOmXqB@ObB*Y`48kXOHcCf8J5}&p2QWiP4HX z03!kt6Q&9oQwl5woPsk(lzbx4xw@!NmQ5c>BVB#ahal#Sc&~a_lw6Edr0rdIGZ|a{ ziootCw|qHb(61s`0-=4_?aUb}yF*PL`Y55)SmYXTd!!*XuoFx%hXf2bZ=|jF>6Y(g zC!KwtREuyy1u3*LSn}ih;KtbHBL&wf(Y`!wc87Z9;0q44DijVMHM?3yOq;y8Er*d( zy;Wuw)4rjGJ|2n0O@?MtmM@WJ;myj#Bvqxng$uGfk>yUli8>iRFXSTAHD)Z6Ep@YE zQz#WC(x}{)q)njphw0rI_M^{U!jEj#P9hW+Co*k#Qe$Gx=9^3dBQZu;1&BYD#pdQ@ z2M|aGW}Qdj&6N&4q})?rc^PznUNJsSAUcPt?<%jtLvR%_kT{i)$%9@GhvD9<45hhF zsD{{f(4W8Px@0hEttj0%be=%FPcp8MpeK vyoJ(?~akrQPh;l z`-EP4PjWWPX~&7!H#;%FWLt(+epGgz+D1z1bK>@wFfwi0F&^8a2LOXy-+|^Va*YX$ zUCx>1pGj&@;BHcB6-n?Udgg3oXy@13w5YS6Px`hI&YO)Xi%BQK;&FRR#7T9a>x#+t zLB1;XN&GI_Wv)?dV6D|hDTirDgA3Ak8l_ncDKW%Dg(-31iRJ_Um>r;`WHe;f<#XI* zJ{xz={&5KPQ-(#>HfbO&=1x;Sl(}R~a~OfmoWm?_J1ez_X(}AuRiC}MY?rGnftNq1 zkCux`UrINZ%uYL}sAg?C$S60(sNJ)5^Hx5Ly;dUyUPKd?yVcf6Mx@-13r3n#@s_Ks zbH}<%lqH%Y+tLMSsSj#`nXV1L(iqvkYJH+1-&7&Fr(Qhe@J63{B0md&fu;YMdm^KP z{`;xjWJR8N(=y$*EZ|6`dT*^O;i{;pCgxjL|3a6qM7tqZUPFxozFv&SRt|648*;r7 zVxbIB3O`&4r5Y{5v3XabXCyRZ@HYjFjT2mO@;gILRZZWDL8oK~wZHb1WvV6*Eq{@;0UgKgW0AWA4ijf!=bNMDddT1u>q~3MDEkpWTjNl0B*G9?it01O7#@jXxk4E9#R#Q7JN`{s(C+RqkMW=@a0&t_K^<5ILoxX*6&HOaVRzVNoI!2~7YBoV`p zKh2^3&_9C8X0R$NwG3!fTMXiVB2qGNDmVWO`IenmrXC7seud@U$+PaL{lMb;S?|>F zs80TISj6!H@n-`?FrDp|2Lg2U-kJS$-3i=i1ra~3^isR%w?GjQZ$GAH!JJdFFV#+W z(#e<>M=6LeC~HY!v%C*z^PQeAPdA@4nBOhNE7XZ~U$$!kiDZg&IahULY;pt9wuYcKY>fa?w=Kmqy{xia6t8CaU2qI_+h)Wj4uK+*`uWkEG0jI-;cZ{(l zifjQ-m7-;u^yU*@5@0Foej{dNt4~OWM8u}W1lQpeGKudyC`WILZJ#*>3mYo#<(a-x zr3uhlp3^m>TA`dun||mCo+=T$k}cS_`b>uoWY)YLm@ROlP{PkHRE!vxii7F9te;K3 z(aj*ayyIn>0*(tmiZl=~soW3lxQ8u@b)x~w4FcNH?jX^%zU%NT49xm zA-3yi(`x0sc%dX4gI$bh0}&+AILR@dFGsUtR3{Ju+^oJH$@Mjifz6l(>TUJVl*6cS z1Ma2OAxVH(Gam%zZ$;Grwj!N_Lz~LGVl)J(#c+dP&ffBuGq>+eY2+~4Sknpl3F#KG z$Idj>hyM<5@4lDQ=>7dK<95v#-U`{@aa-c=k`dGYFpm_CYyd7U|1nWg(^Em!!19xC z7$cX7Cq)quT+dTO4F?mV0x7;PuUAq`id>D&tP38hGh&Y->9WXP{<)Wp$-QtE@@(R= zxc;I4T=TOSvv`K93T^f*n#_5+`^J0vBkRR;8nWm6&pw;K{wC{ecs(U+G$aSs9Fx&( zdeSfFd2WX4z)SkkYZm+=DEjl?riL&J5cCI;0T7c=r0Q1k)t!gS>Q$DFR-QRz4h5&0 z`r8%ibSsryZvf||@$PgWHpz7WwhM3gi8N%DUuHi@pl) zkSTPLV!6fM&oV*NX7yISj^lXKB`50b1pmFN>gc74X13JEAFi#R2k1j6ft20#*9RO=J;U!ny;*uz~7d$|<3St6J`WqqK<&-fw-b^!KOna+Q9YCDv zT{vcodOF?7;Z$VmeNdHRLn3li(bKUBbY0CPatyGZPXTb;j9+Q9-=s0&^{!z(ORZ<$ z)Ynb&V2OZ?VZGlv!g&`j(RQFE{Pi02Ht4nZQdOg+5(V;cxZTNS;vj*|vZ)sa$u^1FXnY@;HHPLM zhcJ!lzQUL0>zyKaj^DPX)$|ZydB}nmIG>xMY~Y*u$6neO)yZHfi0sg<-aelr0_dmz z+#Os&;R7aE&OB^h@*e`QwbC|Wo&wHjk;iA-Y4Obdq!iJkU&D~Evm-HObsm|Dq);EQ&u!R+VD=Vt46sz;etch#RP}1Ou;2k9SfQ(RjFibl>^2Qx= z+U*A#*NYjG84G|A7xI4q&iSeVl( z`Q)=pn1FM{o6`<*o3%;vJaLa@fkN3JaTXLxK;;*v^4(%u^9(7){4R~?$Gy54Arys@ zv7@VvjvCu_s8fJ_4pGie3FFL>30YUpNRU)Pv3w~}*1n)4%NJ)NwEv_U8o!!7XIukG z{k@EqE+_Kky%|MgDlh=U;Cy5)ooiIHA-Vh~GDP(Sj*ik=kSfn89MWC@eU@vv8jVr& zBfkAdf^DPeM)<8;iPq2!>h~blxf2kgcDKgrPJ@)ea+*2ri^S>@0* ziHD=%?VW}Hin)E{!LH1IRjR(fLI>Ob6my;IO#sf$_D-Zs|E~QiTmM7*nM2V}dHY1-cj^9=u|o%;KZ}Ta6AL~tDilHdXYo#VCnkr5^q$81?`w;* z`9shXPh!R2C3O7|_TGo-O(0?3-n=ek01PX{H*5vc43r^->23g>g(H*bjzryjl_u6QZBt!fB7ah-p50)KYlC zt>qgx`;umb8(sA{F(1;0e^&#Sqh3E1ZyNg@^}g$TqPAaY14^4!I1JW?0s+jE-xK6y zP&_p=UBCMl?;O*MlVf zaOPQ+0Fo@C3rv6fl}sJbSD;Jl{mJ?PHv7bTBxrSF76lNQi~$p>;?(rV*yLlev%iH+ z5YD@WwZ<{A*4^k3vVR~GNiqA&ixi7e6E~dY{xgAe@OzV;_&ez9WB+~E?f*6j|1AZx zHKKl^EunvrXPUB4fF%G$BuPL()vbkqg;U0d#}n1D@|vnp8(ULkW^M&+r32hB!mBN+ zEi9|ot*raBbvC4%8B9!wl$&qDeAiz-{#@kFJ#X^-wVkcStfhUrJx@<^o%o&b#CbnI zeRqFS`xAWf1cP%f`O|BDCLCa98r&0S4X1l@M%5!-_j|vc`@*k=ci=i8yaYQiY%?5m z6Y&!rd?8IA1RxO%LW)=ng42Hx`@J#t@RA;o5I60sA|XE9NZ?4mD0RP6{`^yqL@;pR z^W=z~3$-7CwC)&i^EHMHw%-ev-&EV) zFaTP5k}-`fe%XmDB~dZgcpa*dvXY5*(+CFR2m5@E*BUrOG z_^mD2tjIM8-w}O9U70lIH_b{eAwGJ>y@S32Y;uh>bw)DYw)D@fj?E#vEo117!wPsu zK1&O?ZDW*{DXBL5Q>clfg=fVZgoXuOpr5PEsI;jp(33H0Yf%asq}ETq?fDx#q&6@! zQ~A?{C{~b@$oFP_MA&?3GjJ@{lDP5s-r^MOzX;S7AY+B7wC%12Rp|6^j zt24KlNHSXwT85frZ{V6adhZ^@jq*9Qm+MLu2nR952w*aTuG2Xm} zI4yt@GMgMSs0B7r-i#(@9`wdPa+7FU+a{LS$7^R9;Bf}phDzcxkA=>P6mEa8e2{4k zQCXEoP1q+Ulj^YPE|}yC5XwX&jE6e2Yb3H+#%xMoNoir+xqm5GlX_dcf}vAHOv1W* zJy97o&FI-Pq;4sFm7&1MBvnG1h7zDeW_r@}J)iR4=}h3rW9~=`5$0&rVe`S%j9`Fs z?23bL2w}gHfg22KnEI&ot=tAiJAyOpU%-&xCIm|9{&H07L(@-jl#GwyXVruH>2jMB)fb}J70X4 z%Ur1pwXC!jrz|ghAUjY4uieXJ?k?Wlctvo(?SSbHyPIkpiRrh00zpQ^$Pc24=0=Tm=}5bYEBr}C}&r&ynX=jm4{ z2ihmTJM}B%7nPBT>oM3?0TdOCODN+XR$QenguPB>RQaj$0nd#m?_g>f}lzcJJ-Cqw8499Bn>&*V?v(Jgh@I-*kp)= z**I>SbZV?y$Z0usG8fdkiGTULcweF!M(S`_*izNK zf=7D=rOQgh3%!67oy2W0m(q3+m5IDT`P5dimkI5KE(d$;q`8C7M7-6LEsfTQgp)o% z7{KB@FO1(0?*(YGZgc1&S50&6Kx-#iB>bwAxdxt1p&6IiEuaT&!5vBh)t|yesd59f z06yhMsqJD(DhEUey;EAS4BDyjO)5-zF!%O2s0I+)sS96_7ey^qF~S!DygyZ76Z{ig zJGxvqxRP3CE#RKoS7qjMwA!-`%ff|f3UUN9e;Oe<@%r~7AO48g)c{9@=f^298}wl4 z?gJ~^0$QXgbNE62aM^j__XM#|G=cy*%JG zknJ#oRp`Nw1ty3`9Ut)(eVJ6>+?J1!(Yv+-(fn8{OhkG!Z!j#Gd0+;^L8G z4_x-2AdhY1zlcGY02&OXmp{@c-q9^b0dZ z0H^hHkbdCs9!GXf&%&CPuU_4uXlI5tM0d_gL{v|O68$J|BH|hliVWOmZ<)Awkkcv% zIT6uw9vnidz8xx-9xP5A5w0ZgQVu$Q7B-ILG%1*}TFoQ|n zA;A~s)nMx^+5P&r*#E6Ibo}oll$TxNh+00%b&#lGA;bA35X?Uk zcz+8})`y%^FKp;P33w~Q>4zV{UJ9dJS>hrR$}+PZPd3v%XR_PwKSoyY{X$n&=tEzT zm8go$TqNg(L0X902=&GLwIL=TRgfzgtWKj_T+ALP-i2I+%b-ROd`{cm=y~luJ*F;E zxJIyErd&w_^e@Ur5KCFl`Qmg#2;qrK1&u4(;GB+-C+=@m)ccS$XiDS&2*BfQHCKY_9FA z6)$C-mbDcsWqna69?m5`(}dQTa}L(EbAu1_!{<(@bcqQ@VL1GxB_Eh42IzVGX+NIr zzom7EzoVmK=maVxBsfWaU`>7Xz_LtOmsP5;MkK*yYzIw zXxye$d67mtmF<$R@vHeabmIJ4Wy_@F$focJEyld$gF($Kl*yU;nh3ifVqzLWCJBpB zlnLKC)ap&<8-yX=5#FCDx6U`*TQme|cpN> zNn*s2PIsjL8lgz^=RW-YK84la=}F=L{V5c6Fm`t|{7zNUv+!Hlnd$$%F+fRM7D*nS zTXB8Mg6m+PP5py#+3L)@O zzIpmKp+HFsogs$KI$0{rNJG^_NST_Y`CcW;$gB8?h0OLtvygFttv`HLy(+Z8L6kX0 z!-l5tfID%7vCjgRVXBZjKU+zZC2in#`x&BvEVkjyQ6qiP$#}9ee;DewaYo5_zcWnr zsJ2-Q`v?t2wI!#`OfC-TOUizZX{%!hqb{OK`U#<&{~YSa8ASPno^e?6Z)?-7r0pXw z{sg|vPITa8w@bwSYQ^!12?+lquKb(>_6=t4g=X-0lz~Tw7{Vu`3{uF;G|Fv`eEku6 z?t{u&{cWV;sgr{JhLMEwQ-!%HFbQK#*jf+qE*d4Tfa@f!VI5zABT3KDys3>1nXxpM z;v#C_NcvX%?Fcf0*@D)Hpolp#Cnr&Rq+7CKcvX6tw0GHHh{7-6(6~-E)5)eX3gJ#r zT2_Vw5@IuPP~IbKY*tLl_J$c%RuiVTDk zl6gauwhTKM>ZRs~v7&%tWCVuWw88QT|6+!3r1UbaM=QNvsd*2g&zxr#Z z`RnEdRJIYD(JGhlVhA)>R<1$0z%>;Om0haa|P{h}S?3#N2ID#K+4h%K|jI_Qy7 z+MJ#UPJ0*}tBOS9iYnMn4k2FG9Hu~CCP1uSPZ>WCO+$aWsvXAI2iav(Zoso03;v40 zMR64y(k8gNNo>O36ttBtFZGg>$ny@YCmK@V&50-;r8K|Gl3PC$!+f(4FlWvO6ni86 zgK)odw*wY37dC49uVBhOAJwAyzRq91!6ft_fQjj!v81SNizJH7eXxpqJ&aHCc&80$ z4%ru!25*oDkwgSsYtc&}Uz7x7>rJgpK@|74D#16Ay6c}i zAKIVZ1W|Sq*DJy3cs<$WI^AaawCDT$^@Gmu+S%-M;ivqf9r}j_N5Lilj3_;sy;SJ} zslC=u?h7{=Cy8A<*|z;P`8gMD&M>bUw}DE}24TjuDx4ElY;(*)8K;HH?@An^Sj;P9 zGoR_5sAMP@yj)7VrL6q> zW(sFekJo@*RE+>`*~8$RqL<cG`NXN~dCTgui|2Fz;c<&hdIN2GgU!1SLUqOI77kxyQ0;7RJw$IsD%j0}oR)5y%y>E| zqk-ALbWu=zV5!7*cY(B4?M&KlGaRwHKCl4XpdB$QY?SGar%S`x80g$?UVKAM*g|+4 zQd~616aFDkAPTPXg2r1r3lLyN=8_XG0r>%N*oa7df1Y7>_Al;{=0Zx3_`U(GgOa-ZjRJt- zc)dG6AaKd>r~&c$r_!4afNv9=D%%*p)5F=0GwF{la6NCJy}&eTr+q~bNTtc{>gnW2 zrZ*7`rVG?L3f+#NCDbvApcH^E+B&YZ!Sk^h3{D?ve4T`Gv94T^4pnP*XSpb|Gj82z zxhUvZ8QJ$+t%od_Ht1kJXTPl8D2Xwul}Ohl7P7^MB3FzYEne#VSdgd~qq$FBuZAow zm03H9Dk$vrY0AcijWIkdw(KqJw<3Wnq4GNr>^HKJN2lJpv8I`fklQvh*O3B(>B`#V zk%Q*uvb7Wey_cd_qfs~Q>PS97>Fe4p0#x*jc$?~qO#Z}Zr-!6aH2gB-UN^B#?i%(H z{D~FZ6w$8zvq=cXqg4l-fc6Pcw^z%h(2WE7C}f@FEZy0bz1lG;+C&@jp*mFO;tKeI zX1Kojt;C9CQC=HJ6dD@x!PV|Ep+yp40Y;eu(!jzwtCqroLBzHSp$w8|wY1lhqf=T= z6)9n*p=v<0kK<7Xx;mKoxw8}=_pK+SQ1!?;T@de%{ctvO0AQ7!E7%8!k-amd4_ikm zXGI^2jn?ihJ~ym)Oq4=Auhn%ssm!_<=46KCaIaxl01T(kNIJXg*s3wOvyX zlP_QQD(@Y!5WP1Vx$%51X&;z56f}U3U(9vdohRs5*vP4SH4ZqKEYaD$TLM~`k;pOz zHJxAS23okQy9U5I)waJ2SbF58Jgp^2Vb&hOx!GfV4h>e!o>{H|P3&@=e^pXitNOG9 z=OaBVheg6Ca0;dk;epYFNuS+hcQ;mxS;P1?h2{v3wIrIJdjbV7NpoPBnZ$ER17c zxPh!QG7>3EYLY2THWNJ|bT*n*zaDz3k|AC3WBDYGgzl~QMH&kUsXI2id)@$CvF5Km zW;k}+OT>jMz-Ic8Ti{yh`e7t`QZ~#`#_?b&k zbZ-D_himSWZ|_s?o#&>H&-;7TA4qPMKLebQ5r+#$e^QoY+2M_*$+<~SxCzCXz)aj6 zgSW-^*B5)LZ!tN43)+ijm6qoEj0WYLW73XUCR7+()ry&@Y9s+k7iH2$TC9}r`WDUQ zY*mf5!|WL2j)L^_3`6jqHjF!qkcqh&?2p+aLvN41$`vMoNTj$fRXC{qk=oPa3kmTTA9aow;AHf`Ij7xfuT3K~@4kY=G^ zhIx>&Kmvo#6p{N50(p&MX8OKME-*8-)B=saI<^B2%tH6mI3cgGlxsxHwp^iQd!Vhf z?;FRbp{lMNM*_ysljsK_P!>>OtaKEsC_!=$I(Ad)TCxyPqr$yn%=A+x-V+!8QJ(LbCcA58wadnbWP5*S>mn3A z=n1RDj?2ro&rWb$=;fpZgBL0u-OZJ9`mxrs2#N;X^%-^(4kz=FbL)A^7nC3-NBSl< zMCXhzx|LRpi(HOIyuDC{$H}yNuyN?)h%N|Mm_Q$yd1_1o}x5eXFhBM5+hL&Y%41=bO6$hqy6>jH{d2^1871BZzQy%6A1jAM`@!_!i$ z-A#5mUT?OYWYzWf_Me0q+lPTho@h4mD?XMB5M(>zdw>1XRee_Srn(8>#OEAU_0|nG%)t?kxK*6^ zZ9o8xjUvpCe)-w3UCSqW=~Gz%fg;1vd|k&1AWuB6G2g~_En$bKQ|P{2V`1{VXvU16 zS6!g?^WZnC8|01^GDqQ?m;d5o86Vb1_)iBz)*BE9j{!0C^=IcaX=9U34=(Ci9;EiV zx8zkGjE(6kM;Ai;*a&f}L^6lK1CaL6bIK%3^)X(2nmWlBYu>d^^ht2FM4~l$Q?07g zx1Ocb9`l{1dow|vSZ6g_d!|@Jvg10WV6KoyJ8V)SnPYoM;qV1O(oacS|ADU{sk}z7 zH?fW_Wa*n^m<>gHDZsZBSJlk3!+KMYvra0G#dfL>NpIy|4#E@ABJF8OF;@o2@ z$xP23fyp^3eH771#v5=FTtnt6oGB(JJ!u6I18PXB0&2(!D}R{PRVvCDdd`tF#SBpk z+_U?swK8-j1`xyc1aZ~L0ChTCgEFK@ZcP(KgByNf1}h(t)SP2{sQR7+Z$L)vu_qLU z1`PR8oiyg5#39<^ib_K*&%jBo0Pz;DxH7*|p*QGkw-{+R|1Gz0fX;sSV>{5A@Mjnr zhY!f@f)H1T#&clKVa!Z$vWbiARVhgZ))kG7@yzz%lyZD(`CU72O#%PF%cznxcHx4E z%B3+yw;}yn0hA6i<5ehhM$|TGiHrDEN}?x-K1irjR4B13YB8tvA05 z?eA2bG$ZDfxUlOHNlPj=)Wi2>SJ6W*rE<=s) zkqnXl5OLqbYk#*xDpvlxV7(5#tQ1G0BNjhsmNUEXLYdDHkPyQ*J5LA+%i}}FcfPbb zkj~a_=r9)}S0<+NhsP73M!Xr7)D2H6Llon>>*W>r1#UWA4fQ=}nBsMvozD53!~Q(_ zc~GP414QTlicHm+C4gy~7^M?`tZYtF%uYIGDK53=Y+iEYKoU-1BHd}e-|46Byz)z! z6%n2oz?6w}p$nKaDH)@!TU)AGQjR)uF` z=0%E9uMMVyN1dVy*-?^;RwUr3W+l+00^7CzI2BmvtDK4P}!F7>lTGScVDsdwva=1U0Z?76;$rZh%4%*!Taq$^NL>u(M6?V zg5;%Sgxz67bOLt=a|)*HngEbMy*YU47}Dn6ob2%oM2mT)GYeA1QMs^9n3kl58PR_z zIRy;`N3dBZXRAaXP$X0_ql_K5TX;7vy?Gv|J*YQ#$Ex|*!QFa^Yy_rUFFfa+{E6a5 zkF9;E*v6X&Jrx*@K%lp-zjhA3G-%Mk(rk{V-WX1?Hk@d#GuB)+5?ZV8?rm_Z4p-PT zk%=&key5q#COXdKQJ+OGV$f*HGku71Db};Yp-t05=jAss9}p!ueTZVWKTyH%n|;CQ zn!hZdOhl(7y6y`@ODM$X%8!(~yNr4zY{#OXqZ%9tY4f%9CGD9MSx@FJa#_?PMoV2J zv;FBG8~#bs_8K&5yGLYW2n{23z^K)GqW0ZlJe*2)Kv}tGS$TlP@Jx--5oo zW%;f*%t(TP+B{`Yp@X;O(SR(7x9l0ma@(RO53f{n{nXZ+Fof~9i9e^p^SkR1)~Vp# zza^>4s+HyNzR7*#TOjlQ@2?sq2WMl$|6+D}mcM6v6?bfrzb%<|KGQlFJA$n*$?i4+ zG*ae^kx^@tMibCk)${6tf*t@&OATG^I2xvp{1aHdn7}){M6eEitC3p@!*W1 zu3vTGJey`AIvS4wy^#xKmD^4nds<83CmN<~ztEQXwq#GTrw8LL12%`u zmXR*3-tt}D^}COTRI^oj6a7sNIr^AMpPV~g(j+&02*|Xf(YRP43xeG$hief+biC;8 z5(W=04^!BrhT_kO#gR!vSyeOPlQbvFQ>EN*8_$CP+#!nkXf(B#1L7|qMwdCdXuGOS zpl24b+TFw1PuMiGXigIH;s$NBk>HI?eg_a7l#|^m@Guxu-_DfX*FC)zOAcJRXI+tnxIw9A-u<4o9NQC`prG2KS+R>Nl9ua>9NWA-jHy&#?Dr+__xEUvE z#z>kpqLx6a4bW{MXvh}bvgQJi$QH3BM1sQQ$1Q|vL$@xeRJ5L28!KiG!9t`t>~k!E zhI42g;@quw1)u&@Smhf#DnF@?O)}2t33`o);TCJ_Lf9~V7|{PG;t(YU9PEZQqf#9| zH>VJ8flkUG& z{ZI<6^60+NC;2U{|9=quKcnwo1611u6?AUhjMchCf&SmoJ3#B!#EsJGqM(gGF@Xsb zM#eSr^RM({&YPyAaMrHYZIA>Ad?9GLdV#`n1EbBkZfbeW;hauL%+CfTIjOchXH0#c zU;a$DJ?+@$^Z?U^G>||i!5Gn7?6UEwE~G*B%*xZ}=T{yS#V7(=_d|6aR_Zy`vY@nz zuRVIRO7!P#)@Jqzti_=ICUs9H?a2F0ymEQ`GFK7s@M^b>a*=fh_>i#r>mGKFDsi*S;VV;=9M+Md)Ep~ak-$4_Ofliu|K=u6wY%&DfH*5 zwy6l_ldKCaiG#b^i`>W=*YI5K$d9+XG``#z#(>-B+RV_Cp1rnbZq5LtFG*~E^K;m; z#Q9roHj!pkM%a5vmb_}*Fojgd9QkN_IMuF3+f(vG0DZ`=Ea~dFj@d(87doCr@d23& zi-psdAKparVLbGiE(WflDn9zn1-8k!_>bV+shpPW2_&OxXG0Ptr3LC4$=%Vmk!qaH zz850Gw#5qPY#k6-nYH3p>A_o+DLQ18n~n9sRHg?e#H?1v8W?pBx-Cp?4KAfl(X;>MlFc_7eYU+`R%IZ~Rbyc|^l%J|lR(WN zKq!EP1%xCdMLR5%ndwI!F&PcPHi}`;!XiHtwk}YKn#D5*;dV*w`Q2p@C5pEivre<_ zyGO3wKfKs%cfS6B_9B~DtCeZUwVLfA(wrMp^h}t(S!v{(IMz^Tp`bVLBO9@TppE>F z9-aB+gZ?ItD!L?U!?|A8J|^NAQs~ivHwm(4*y4S#8Ifm4s`CsYip76OYsF*pHdem@ z?ar_m#?7i_pU8LeF(9xEslac}zV^_?7R8!~!QX}}?BhV{w6J(Gum;4hCS@=qyTB$s zb7AQsC}-}%z^na`NIVlQP=F|wjh(4I84x}|M^xu>Eu7nqVQA^-EUk?=4KqzrI?_f> zw=kHw@B_H5iJif?8@-etbuhkH<9Xr2C7~7PBdsh#v(ICB|0?7%g%W*LB4F~%NnelL zv1{jK%SDwpqr^@^KMAdqZduQVv&ayP;&aql*6_F78`*iFo1`ACy!A{EmYHJg$4=sy z=#^p%G*&SKwpTfw;xKbm$}LXFL~D#b$W!O%s|ZxJ7b;TUOW)Ca_roOO^w>cDP|Lfo z`Ya*boPr%SV+G@kqv`=E$)|s(LE69%)lAMqT2J9iZmgs&obQ2^Tc_kG^ zPp>6QN}3AiKhrOkhdP8kvl~!N{c?3GMh0xbDpR8?NrhSccx7+~&+nr$G9@`Hliqbr zw9TOrG3w=3J$985V@p2rl-hPtID%R8A2`ImSD)P7f01-t0$@VXU9+1(%_# zzl~c1FGNJi8DWh|D(NCs1S7ToMX4By2&+hfB&)_L;S^|gCJPS&*&4$b6;Y`(@Eir5 zb(DQDdRf1!^umu&+t0rDV;cd07dPv=!!4G(k^9@2rD9#|{wOCt#HZuEen!X>E;~BB zJKSYw5SzxyRt7Pf2j#9U0J0M9U*p?h3nX@+Z-{MvLrnNTg4n;X-gle9cXxhEW5;E) z7=S7dijWf7tV(=<08{YbEO0zHKBAXhN2Sw5y{2nwEG9G2Q|e291ra)u^gF;O5#Ast zHC}YLpA7@!$<-#i<2C!n=gZ?Gr=PqO1vnvwe~=Qe`6j}GHbTrex}ux(_$Yi4`2x#F zXwUeZ~TI!|IIS(vBt8leX5! zFs|Ygn(rmX({s$0>WAPa!X8Jcl1&@at401xXIb$6 zTDa$2cU-L)^X?aj{W%q~kp$rWOXdPe2OuMi-V1dQ@yrAF4b>INLoBMO>+~z{fcf?# z%-#o7b@p>B57DF=<-Z6tNee|q@bG4-MUn4*2Xtpsz81|W#;XUOh8N9b;RMu=I-Cz1 zDynTfwUCb$G*=D5`y&n*moW?*rt#@Qv(91;csGu_@wq+Z${-DYmg5NQzh~4fYfO>v z$9JlYwNCRk(G4#AK=io5J|Y{j2dZ%>uzZ0!_0#`BpM#?F8W|u2!sM{2DLFvQq-t)| zn3pULY+%fuX$NA>tg*gp)u$kiO<)%m^16;W35*f6sE3baF)H?}2$Xl>lTm_Ti%jZf_!k=QFkSM+6Z;niZV1G$R zS}+tK)x(!aGbKjLP~_+85K7aOj1Ew}sufTpn`7Z#C!3?;m1$jm!7vul2fAEo3?mQE z^^rxXL+2;T152LrqY;7#$FySz+oRCBHP*jW4wbv0XdP(%D$v=6p_|ccE{i?43L)i@ z0ZwlU^AW+{Je-6Dj!Bb9v6mdSPN3%-gyyXq7YY=^{=+^27A!x`Dn{9_@VZc5oY0!E zy|h-Il~QDf#mt#($O(jAorBHa`Iho!Wd|o6_73{5C>sjmfh_nImTvGrelY#7QTF#} zPW5k_7G#2?7-Ia&lo2Mt`GFh|1}V3}DM|_y1mzo-V8{3h^hvVQ$sQ~$H9dRGEw8J( z);0p$+Xt1`-V1WH(J;I6kfY`D@+6G!J9X$Nd5AkL3d_ zgvhy*5d`eVLYR+ESE)gJu2D}o2)4ZuaV{!>K0j~(d7h}-R0=)0K|pATus?C|@)3%F zGJoQb>8Jz(X$XQvg_0b*@eMH0n1z+>EW*nMCV2ZV7^6ct;u><`AZ|2;aQeM$Q&C4@}*zJN-;SxJG^kGfOjbBu1G3A{pq{A*>R4 zEXrZgU~wT*v=0_?aECTV8knjce8)zGaKiXqhM}Bbfm*;cF|m5swp6;#)*Cma{h)M!SR?Tp|=Gg&7FpeD;KR}{8K#Z&L+F|4>Doj z2u;Ii1SzC`L8N zeYwbi`DNqUW+BX_Vse^A;|Ws1nwZjD!l4-%Hyc~@A~LPn(tyOTE*q783?TKDF-P0Y zr|^6im1;#yDYT>7idGMo34BGM<_2h(V5(@AnclME4DMg?{6>2EAs`5n;W<2cMVlAl zo+1Sn;}WMCOI;8=ZB7>J88YOi$PgW~_`3l?XtRWS!kt8W#+?Ma$`Cbs z&Jeb{(jnTx)?vL#(d4_-5NP(|y&H(zea1FV+7Q=!2|>^H;rf#Ps3b9vp>KW$8DM9%dp*6Z3Exw5^JNn+mRoT77}K&DaoWA9Jcs4rO_oY)nWBcU+_3opsoZr(3x?T3*K;Fe4EX9|x1IScDn?Py7Wv7yL!3 zAH{39*05TC3^|$|$S7idx((3idpIJAk10o5?N%gMRyGDA_VEOI<7>vHupfO?O^OYv zUNQ7K=4%;nO6u3?rK8F*T1eLI?0Eh4Q}t}GY*zpzca!^7Ta)|y;aK85QEbHIU`ULb zhyWI3F_L(Ph>9!r6{NkRgOsYYb#yYjv%^duje8mmxq3g^i$cF@E5)9r)|BtQiCykh z72wK-fUs|gVzy(NrHMW3Y<4dBV(4Q7atB|K07|rCFl?O1&qCbVC7_}ctJUo}WE8U* zdx|pyrcg!hsV;_mVb{QST?Xg?n?b~kgvK6-(XiP1=1kJ)>Uj92@-uj*1qG&0>AlDc zsO!t{nX7si0JCTbI<3)Q3|Krk6eE9MGUMe{ zjydawZ0b|WAiosgj%ywemL8)3EX*T&gj2oZCBZ=G$bkIztFeX4L>n-$5T2i8NdpnW zEylQnBOTY>GVA9h67-EIxYAcWs^Y~;(Xj4@-5@ghZKS!rm=@!7)UNh)HLN_6u5W6> zJ;;%LcyQ=n6#1@UB2z*bbNg@fwdYSxq+MMs4Zs~|)a-z(fn7o$r~Nz$1V`@PH~C>o zBENn8Oh;fQ2{oLMhNO2mQrb_CP5}Wddgg0W)}I$YNz|`ho3W=m7_^$Fo&b!1urqz| z_*8ymYhX0Z*@J&jVvPqCVBMf>1^7bmGl!l$Zuh?Li&qxZ&tt^}QP~3A4$BF2&41q2 z(^GYF$J~A12@CTY+Vi^ZctS}MwAjs{r)*Dqv_`ITt>jv)mCprv_eozmH(SoY&Jw;JFj? zA^8~=?0f8dUuz$p-`R|QbXN_oAK*`gnJ0-JU}T}V$evQz0&uS$ybz;m_F&dl3k7$= zKEA?#?FT9*F8++5_^qrkpzm2jFC^Bo5_15w%J+bNym10#%v0Zvi*?4djJPGlB<938 zhgqN*rh>R7(HLOHIR_%tf}kzp#3`SC3R?g;mwof~Py2-a3f^}8*BQyal_mUl<%IM9 zBj^3Ym|5;0^Pd0c@A=!br{X$|HmW-roG^lLZDTM9B^-c!1YmM#G&4F8eR{KDhg|cN zOZ*MiJ7e077}0GZ-n;a$o2i+9T1KN)J!6CGRonAqo9oF+?ltcZp<5MEtQ_Fkh%)S) zaeXd72q}xSgnLGIsq-5{kD3m{w$dRD06r6=VRtUCMvoY#gvYTNa%QF&DN69 zli&kXE5}T<%gV8AD~kwR$L`KB@@ovxs?qy?XOICq>E6LMPW&~1F8gsV%e55F5jxDM zl|)aoz`hQ-(eHJo$`h#Po*m?SohRj7>g%dd<~cjNF~mI+A~l%}63~gv#^NPy*`>7* zrE#dm3VrzFRpmgcNr?UBRt&)P{n5$ASP-yFq&YIXLc+WaA`is@9%qnVOloKvzgBXl z(X4L!930OLdK|)Jl@E#>J)dO8q*m9A`xyJv%cCus5kA;a{Ppungn;Fk7@?=cQ%hZ! z-Q<@NIa2cv_QA)nU4=>)mI(o4dxP}m;dO_#9My`W1S9D0%e~v z%*JGb+T;rkSOP_!8h|fNukNbjI2J@H|5R4hK2O%6YcN1-e`!KsIBL?3uYVX|N1b;=N{x)sj8mhxrb*1Q4qQcM+ zy6o*HH*Gji_3V{T$b_u}{7iWuh%(FON(N?RbXf!V^a+Jq30cBI9(XdkLD(g@XXr*d zQ%q?YMyHRGf4_OY&*f8`Da92wa-^m^Mj?v>6CAtC8R(m661_dF2rQFVBObszhrlkl zP@;v`$0mFaVIu^qEKdWH{ZpJ&yq-Kt|1BbK4hm2nn7$}tNs!4iTqmtETCaz`1Ydx2 zKsD^O8a@$IH7q-?n8!de$u2!?D13F?IZPh@Z9o}CBzfKN-%V01t$l$?zDt*X&AGDv z4*(Rt@L}A1$ySlP%p^SN zp4}WnZGz58=`v#vvsw6&zD?Pl6@%lxTF1jpw#I{k{3VUQ>#=pPqQAPt&+Dm$amW4z zwh9fuB5TwL*l|}sf{YPRiUGQDhMdh=r(U{428vQDad0N{v`9!W5fH_n0uTj+0uk~g zI-q%_XtaWnMQA+^i9KkCb43cbtKms9&e^Xpa~p zfOerv_^RUTT(2-#{vdQirmB&P2&u4ibFNNkB4er}Mqjy;QQ#MbuH*G#ku)|p(`^b& z=}+WerrEUCv-+u{F~{pv^P&=K4^o;w11`8{Gy~B{ZY%38GiDtq)}rw6!`%+^P zCucxK0n_&F#C33|2Si9E*8G>54@|P$NQH(oy*~KxgBTWq+j{8s7KGA3S;D-JK%yd` z<)&^>Ctj}Zz^4W2hO!9gJHj`!#lO2w1;E<5TfC(OcdGa>rxP;;18xBN;A!HR5o(c< z+xi9;5O zqoIg|ulLnM+ZvH%7BWKX%xfw+;`gHn_8ux!IqR85spo+fc?>i+E*=;){n)0}Z5-o3 zPYfFEIAxddLEtXx>oy>$@xCJ~`F^Y24*|7FksoGZ1QJ3`z{hYUkRY3YF|45&{M7pa zIwRR@e6M-`HQoj!qaacG)*dF`tLgtIH&h{G6MbhZCvj_iQ{(^s2CP#4oBU`RJMq;fF+mPz<|>LVEd%ZsN? zGTSTnjLj@@!O=^*qFtMA^56`dk=8!S2&``ZtBep;*+KV}axt|E&JvIaT>FlB@v;!! z8-~KAXt@5^AcKk&my#f!igem(^j>`U$Y`2dKq*Nz;S`hgeH!-14MoOu9(f`>wK z&o&4;P1BqOdOI&0`?nD^L%TG4FhO?2l@UoHjd**u*Ag6QQ@ogthjB>N*BT$^Z}iY^ zmB8d1f`Li=H9E*gQb;+0#eDpVP%DlACfM0bVaCEX&PSLFMhs9;^QhlLI?!`w%h+^L zg&C*lF^Q>wXl6~3$8(Fa=(fWxbHcKRSnWMOGca?-tO?(6>S)>SVq0Z_LYUXU<;#B% zGAI1>tC!g=g5`)%WRo6cG!ivCqT)WWai73h~`250@z~b;oHu2u_VKY0aJychcyu>61e%vuZI8^l$Em?)aLY- z#9Cph<=^`nw^jiBaK5F=?RTs|`9DY%F=IC|W2^7YR)32Pl9Oz|9k`H(bER3cWNkkIW+Op>I6RmhFmLipVZB?)Lt4?_oT1Io9}G=R zM|$ByU^e@$>+FS~U7?u_lt$8Gf?_)MFLPq-VUQpLTCxHTV#sbp*U^y6Tq7x)0~W|j z^=7Opi!bjwlcyOGB~TbueEKLj_q!04wz3+kcRhaTb
  • woKU6!D}{21Y1o~m@WXl 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 literal 0 HcmV?d00001 diff --git a/src/main/java/lumien/custommainmenu/CustomMainMenu.java b/src/main/java/lumien/custommainmenu/CustomMainMenu.java index 15b987f..999eade 100644 --- a/src/main/java/lumien/custommainmenu/CustomMainMenu.java +++ b/src/main/java/lumien/custommainmenu/CustomMainMenu.java @@ -25,7 +25,7 @@ public class CustomMainMenu { public static final String MOD_ID = "custommainmenu"; public static final String MOD_NAME = "Custom Main Menu"; - public static final String MOD_VERSION = "@VERSION@"; + public static final String MOD_VERSION = "1.0"; @Instance(value = MOD_ID) public static CustomMainMenu INSTANCE; diff --git a/src/main/java/lumien/custommainmenu/configuration/GuiConfig.java b/src/main/java/lumien/custommainmenu/configuration/GuiConfig.java index 065b2f0..f45a623 100644 --- a/src/main/java/lumien/custommainmenu/configuration/GuiConfig.java +++ b/src/main/java/lumien/custommainmenu/configuration/GuiConfig.java @@ -645,7 +645,7 @@ public IText getWantedText(JsonElement element) String textString = getStringPlease(element); if (textString.startsWith("web:")) { - String url = textString.substring(4, textString.length()); + String url = textString.substring(4); TextURL tURL = new TextURL(url, -1); diff --git a/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java b/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java index fc01a6a..91e5702 100644 --- a/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java +++ b/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java @@ -1,30 +1,75 @@ package lumien.custommainmenu.handler; +import lumien.custommainmenu.lib.texts.TextURL; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.util.stream.Collectors; -import lumien.custommainmenu.lib.texts.TextURL; +public class LoadStringURL extends Thread { + volatile TextURL text; -public class LoadStringURL extends Thread -{ - TextURL text; + public LoadStringURL(TextURL text) { + this.text = text; - public LoadStringURL(TextURL text) + this.setDaemon(true); + } + + @Override + public void run() { - this.text = text; + BufferedReader in = null; + try + { + in = new BufferedReader(new InputStreamReader(text.getURL().openStream())); + } + catch (IOException e1) + { + e1.printStackTrace(); + } - this.setDaemon(true); - } + StringBuilder builder = new StringBuilder(); - @Override - public void run() { - try (BufferedReader br = new BufferedReader(new InputStreamReader(text.getURL().openStream()))) { - synchronized (text.string) { - text.string = br.lines().collect(Collectors.joining("\n")); - } - } catch (IOException e) { - e.printStackTrace(); - } - } + String inputLine = null; + do + { + if (inputLine != null) + { + builder.append(inputLine); + } + + String newInput = null; + try + { + newInput = in.readLine(); + } + catch (IOException e) + { + e.printStackTrace(); + } + + if (inputLine != null) + { + builder.append("\n"); + } + + inputLine = newInput; + } + while (inputLine != null); + + try + { + in.close(); + } + catch (IOException e) + { + e.printStackTrace(); + } + + synchronized (text.string) + { + text.string = builder.toString(); + } + } } diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index f04e323..f7e8e70 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -3,11 +3,11 @@ "modid": "custommainmenu", "name": "Custom Main Menu", "description": "Allows you to edit the mainmenu using json", - "version": "${version}", - "mcversion": "${mcversion}", - "url": "", + "version": "1.0", + "mcversion": "1.12.2", + "url": "https://github.com/slavapmk/Custom-Main-Menu-Slavapmk", "updateUrl": "", - "authorList": ["lumien"], + "authorList": ["lumien", "slavapmk"], "credits": "", "logoFile": "", "screenshots": [], From e9e49bbd6e18fcc8cd43dffd210d3e95c9178293 Mon Sep 17 00:00:00 2001 From: Slava Petrov Date: Mon, 13 Mar 2023 23:54:06 +0300 Subject: [PATCH 3/6] UTF-8 --- .../configuration/ConfigurationLoader.java | 66 ++++--------- .../custommainmenu/handler/LoadStringURL.java | 96 ++++++++----------- 2 files changed, 56 insertions(+), 106 deletions(-) diff --git a/src/main/java/lumien/custommainmenu/configuration/ConfigurationLoader.java b/src/main/java/lumien/custommainmenu/configuration/ConfigurationLoader.java index b049449..ad027f4 100644 --- a/src/main/java/lumien/custommainmenu/configuration/ConfigurationLoader.java +++ b/src/main/java/lumien/custommainmenu/configuration/ConfigurationLoader.java @@ -1,24 +1,18 @@ package lumien.custommainmenu.configuration; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import lumien.custommainmenu.CustomMainMenu; -import lumien.custommainmenu.gui.GuiCustom; - -import org.apache.commons.io.IOUtils; - import com.google.common.io.ByteStreams; -import com.google.common.io.Files; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.stream.JsonReader; +import lumien.custommainmenu.CustomMainMenu; +import lumien.custommainmenu.gui.GuiCustom; +import org.apache.commons.io.IOUtils; + +import java.io.*; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; public class ConfigurationLoader { @@ -71,51 +65,25 @@ public void load() throws Exception // Preload Main Menu so that other menus can rely on it - for (File guiFile : jsonFiles) - { - if (guiFile.getName().equals("mainmenu.json")) - { + for (File guiFile : jsonFiles) { + if (guiFile.getName().equals("mainmenu.json")) { GuiConfig guiConfig = new GuiConfig(); String name = guiFile.getName().replace(".json", ""); - JsonReader reader = null; - try - { - reader = new JsonReader(new FileReader(guiFile)); - } - catch (FileNotFoundException e) - { - e.printStackTrace(); - } - try - { + try ( + InputStream is = Files.newInputStream(guiFile.toPath()); + InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8); + JsonReader reader = new JsonReader(isr) + ) { JsonElement jsonElement = jsonParser.parse(reader); JsonObject jsonObject = jsonElement.getAsJsonObject(); - guiConfig.load(name, jsonObject); } - catch (Exception e) - { - try - { - reader.close(); - } - catch (IOException io) - { - io.printStackTrace(); - } + catch (Exception e) { + e.printStackTrace(); throw e; } - try - { - reader.close(); - } - catch (IOException io) - { - io.printStackTrace(); - } - this.config.addGui(guiConfig.name, new GuiCustom(guiConfig)); } } diff --git a/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java b/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java index 91e5702..b8a12d9 100644 --- a/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java +++ b/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java @@ -4,8 +4,9 @@ import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; -import java.util.stream.Collectors; +import java.nio.charset.StandardCharsets; public class LoadStringURL extends Thread { volatile TextURL text; @@ -16,60 +17,41 @@ public LoadStringURL(TextURL text) { this.setDaemon(true); } - @Override - public void run() - { - BufferedReader in = null; - try - { - in = new BufferedReader(new InputStreamReader(text.getURL().openStream())); - } - catch (IOException e1) - { - e1.printStackTrace(); - } - - StringBuilder builder = new StringBuilder(); - - String inputLine = null; - do - { - if (inputLine != null) - { - builder.append(inputLine); - } - - String newInput = null; - try - { - newInput = in.readLine(); - } - catch (IOException e) - { - e.printStackTrace(); - } - - if (inputLine != null) - { - builder.append("\n"); - } - - inputLine = newInput; - } - while (inputLine != null); - - try - { - in.close(); - } - catch (IOException e) - { - e.printStackTrace(); - } - - synchronized (text.string) - { - text.string = builder.toString(); - } - } + @Override + public void run() { + try ( + InputStream is = text.getURL().openStream(); + InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8); + BufferedReader in = new BufferedReader(isr) + ) { + StringBuilder builder = new StringBuilder(); + + String inputLine = null; + do { + if (inputLine != null) { + builder.append(inputLine); + } + + String newInput = null; + try { + newInput = in.readLine(); + } catch (IOException e) { + e.printStackTrace(); + } + + if (inputLine != null) { + builder.append("\n"); + } + + inputLine = newInput; + } + while (inputLine != null); + + synchronized (text.string) { + text.string = builder.toString(); + } + } catch (IOException e1) { + e1.printStackTrace(); + } + } } From 0777bd81a3048a496636a50e30c8634337d71c0c Mon Sep 17 00:00:00 2001 From: Slava Petrov Date: Tue, 14 Mar 2023 18:10:28 +0300 Subject: [PATCH 4/6] Java 8 style --- .../configuration/ConfigurationLoader.java | 179 ++++++------------ .../custommainmenu/handler/LoadStringURL.java | 33 +--- 2 files changed, 58 insertions(+), 154 deletions(-) diff --git a/src/main/java/lumien/custommainmenu/configuration/ConfigurationLoader.java b/src/main/java/lumien/custommainmenu/configuration/ConfigurationLoader.java index ad027f4..f0861bb 100644 --- a/src/main/java/lumien/custommainmenu/configuration/ConfigurationLoader.java +++ b/src/main/java/lumien/custommainmenu/configuration/ConfigurationLoader.java @@ -1,6 +1,5 @@ package lumien.custommainmenu.configuration; -import com.google.common.io.ByteStreams; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -10,131 +9,61 @@ import org.apache.commons.io.IOUtils; import java.io.*; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; -public class ConfigurationLoader -{ - Config config; - - public ConfigurationLoader(Config config) - { - this.config = config; - } - - public void load() throws Exception - { - JsonParser jsonParser = new JsonParser(); - - File configFolder = new File(CustomMainMenu.INSTANCE.configFolder, "CustomMainMenu"); - if (!configFolder.exists()) - { - configFolder.mkdir(); - } - - File mainmenuConfig = new File(configFolder, "mainmenu.json"); - if (!mainmenuConfig.exists()) - { - InputStream input = null; - - OutputStream output = null; - try - { - output = new FileOutputStream(mainmenuConfig); - input = getClass().getResourceAsStream("/assets/custommainmenu/mainmenu_default.json"); - ByteStreams.copy(input, output); - } - catch (FileNotFoundException e1) - { - e1.printStackTrace(); - } - catch (IOException e) - { - e.printStackTrace(); - } - finally - { - IOUtils.closeQuietly(output); - IOUtils.closeQuietly(input); - } - } - - File[] jsonFiles = configFolder.listFiles(); - - - // Preload Main Menu so that other menus can rely on it - - for (File guiFile : jsonFiles) { - if (guiFile.getName().equals("mainmenu.json")) { - GuiConfig guiConfig = new GuiConfig(); - String name = guiFile.getName().replace(".json", ""); - - try ( - InputStream is = Files.newInputStream(guiFile.toPath()); - InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8); - JsonReader reader = new JsonReader(isr) - ) { - JsonElement jsonElement = jsonParser.parse(reader); - JsonObject jsonObject = jsonElement.getAsJsonObject(); - guiConfig.load(name, jsonObject); - } - catch (Exception e) { - e.printStackTrace(); - throw e; - } - - this.config.addGui(guiConfig.name, new GuiCustom(guiConfig)); - } - } - - for (File guiFile : jsonFiles) - { - if (!guiFile.getName().equals("mainmenu.json") && guiFile.getName().endsWith(".json")) - { - GuiConfig guiConfig = new GuiConfig(); - String name = guiFile.getName().replace(".json", ""); - - JsonReader reader = null; - try - { - reader = new JsonReader(new FileReader(guiFile)); - } - catch (FileNotFoundException e) - { - e.printStackTrace(); - } - try - { - JsonElement jsonElement = jsonParser.parse(reader); - JsonObject jsonObject = jsonElement.getAsJsonObject(); - - guiConfig.load(name, jsonObject); - } - catch (Exception e) - { - try - { - reader.close(); - } - catch (IOException io) - { - io.printStackTrace(); - } - throw e; - } - - try - { - reader.close(); - } - catch (IOException io) - { - io.printStackTrace(); - } - - this.config.addGui(guiConfig.name, new GuiCustom(guiConfig)); - } - } - } +public class ConfigurationLoader { + Config config; + + public ConfigurationLoader(Config config) { + this.config = config; + } + + public void load() { + JsonParser jsonParser = new JsonParser(); + + File configFolder = new File(CustomMainMenu.INSTANCE.configFolder, "CustomMainMenu"); + if (!configFolder.exists()) + if (!configFolder.mkdirs()) + throw new RuntimeException(new IOException("Can't create folder")); + + File mainConfig = new File(configFolder, "mainmenu.json"); + if (!mainConfig.exists()) { + try ( + InputStream input = getClass().getResourceAsStream("/assets/custommainmenu/mainmenu_default.json"); + OutputStream output = Files.newOutputStream(mainConfig.toPath()) + ) { + if (input == null) + throw new RuntimeException(new IOException("Default config not exist (/assets/custommainmenu/mainmenu_default.json)")); + IOUtils.copy(input, output); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + File[] jsonFiles = configFolder.listFiles(); + + if (jsonFiles == null) + return; + for (File guiFile : jsonFiles) { + if (!guiFile.getName().endsWith(".json")) + continue; + GuiConfig guiConfig = new GuiConfig(); + String name = guiFile.getName().replace(".json", ""); + + try ( + InputStream is = Files.newInputStream(guiFile.toPath()); + InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8); + JsonReader reader = new JsonReader(isr) + ) { + JsonElement jsonElement = jsonParser.parse(reader); + JsonObject jsonObject = jsonElement.getAsJsonObject(); + guiConfig.load(name, jsonObject); + } catch (Exception e) { + e.printStackTrace(); + } + + this.config.addGui(guiConfig.name, new GuiCustom(guiConfig)); + } + } } diff --git a/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java b/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java index b8a12d9..1f93bb4 100644 --- a/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java +++ b/src/main/java/lumien/custommainmenu/handler/LoadStringURL.java @@ -7,13 +7,13 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; +import java.util.stream.Collectors; public class LoadStringURL extends Thread { volatile TextURL text; public LoadStringURL(TextURL text) { this.text = text; - this.setDaemon(true); } @@ -24,34 +24,9 @@ public void run() { InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8); BufferedReader in = new BufferedReader(isr) ) { - StringBuilder builder = new StringBuilder(); - - String inputLine = null; - do { - if (inputLine != null) { - builder.append(inputLine); - } - - String newInput = null; - try { - newInput = in.readLine(); - } catch (IOException e) { - e.printStackTrace(); - } - - if (inputLine != null) { - builder.append("\n"); - } - - inputLine = newInput; - } - while (inputLine != null); - - synchronized (text.string) { - text.string = builder.toString(); - } - } catch (IOException e1) { - e1.printStackTrace(); + text.string = in.lines().collect(Collectors.joining("\n")); + } catch (IOException e) { + e.printStackTrace(); } } } From 66bf3f2d477b2552156d7f0ca7a88fe278119be8 Mon Sep 17 00:00:00 2001 From: Slava Petrov <92324273+slavapmk@users.noreply.github.com> Date: Tue, 14 Mar 2023 19:04:03 +0300 Subject: [PATCH 5/6] Update README.md --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 55373b1..a22c094 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,6 @@ -Source Code for the Custom Main Menu Minecraft Mod -================ \ No newline at end of file +# Patched Main Menu +### Fork of \[https\://github.com/lumien231/Custom-Main-Menu]\(Custom Main Menu) +This is a simple set of critical patches collected during the use of this mod: +* Uploading all file types in UTF-8 format. + (Previously, the standard system encoding was used) +* There will no longer be an LF ending at the end of lines that are loaded from the WEB \ No newline at end of file From 6ac3faf89a375f376fafe5090626a39abdcf8820 Mon Sep 17 00:00:00 2001 From: Slava Petrov <92324273+slavapmk@users.noreply.github.com> Date: Tue, 14 Mar 2023 19:07:54 +0300 Subject: [PATCH 6/6] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a22c094..00352af 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Patched Main Menu -### Fork of \[https\://github.com/lumien231/Custom-Main-Menu]\(Custom Main Menu) +### Fork of [Custom Main Menu](https://github.com/lumien231/Custom-Main-Menu) This is a simple set of critical patches collected during the use of this mod: * Uploading all file types in UTF-8 format. (Previously, the standard system encoding was used)