From 710317e147962a265b9f7cc1088f7e0962da2738 Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Sun, 26 Oct 2025 17:21:30 +0300 Subject: [PATCH] Refactor AIImages UI to use localized strings for labels and descriptions, enhancing user experience and accessibility. Update binary AIImages.dll to the latest version. --- Assemblies/AIImages.dll | Bin 13312 -> 14336 bytes Languages/English/Keyed/AIImages.xml | 28 ++++++++++++ Languages/English/LanguageInfo.xml | 6 +++ Languages/Russian/Keyed/AIImages.xml | 28 ++++++++++++ Languages/Russian/LanguageInfo.xml | 6 +++ Source/AIImages/PawnGizmoPatch.cs | 6 +-- Source/AIImages/Window_AIImage.cs | 65 +++++++++++++++++++-------- Textures/UI/Commands/AIImage.png | Bin 0 -> 1640 bytes 8 files changed, 117 insertions(+), 22 deletions(-) create mode 100644 Languages/English/Keyed/AIImages.xml create mode 100644 Languages/English/LanguageInfo.xml create mode 100644 Languages/Russian/Keyed/AIImages.xml create mode 100644 Languages/Russian/LanguageInfo.xml create mode 100644 Textures/UI/Commands/AIImage.png diff --git a/Assemblies/AIImages.dll b/Assemblies/AIImages.dll index d88de2c7b23b373975f527dc0b9bd38eedbc044e..ee3bb26e3008828eaf59ddd969ac9e95b336f9b0 100644 GIT binary patch literal 14336 zcmeHOdvILUdH>GYyLTUY*t_x*8+-j^Ey;^y`5}WbUP*q4Shj4*FK}32?OsV2ulBC* zU0Ifeh*S#1NmFnsB_4(hq$MqBUbLBnFk}KP%|H_}r9+cI10fG410<8AAz_jf)8BXQ z?rLQVaQatgnrrQM&-Xar>wM?jbI-23uD^?XM5N*K&O1bp;?CDL1>YM?fL*)vv0D0K z=-FkDirvpH>m9V*Sl+P*9AhY!HgY+;5bHBz&TuYf?G;)cs}fB__#@q;KDGz<7(U1FA)2k)(({`MMKPiWfPl`IkB;5OqWm{? zFQQDsH2}SPxp9mr&xyG3njoqMt0}ji{{xRn7Z2uejJZ zNq%ZtOVkk~5={JGT+3yAAyJs>w-y`HHx6A|J#^JI30jIf@CZ48dG|8NhIM-pcX6%& zCB9hozJBR>H-b@JCC5YPy~;OU;Rb8;jUuB>XMTBC31|FdA|GT5bOevkc_W}AjRQu z*p36-f(p}Ct)0L6mRV?=*Aay7t^s4!1asnuwIQrG*6N%VD z)1oGw79$$`!G`GAP#hX~JnE{H%>tVN`wOV&xoswM-ioJmaP%;;Z78SA&W19fxocGm)8rPBT%oSyG zW$sujtC-1TF(ws^y%|!g=htZwtucEMqt358d!ak(zxgW2IUhwkesxJNs9R>FUUM-u zzLk4%qP(yxO^sa(GJ>hoBl_l-xTtjJ>;)0A$k;a4F;hepnX!`)LO_8?VDnv`u4kv~ zQWAB+XmF;OF4UytW{7e|xl4(ATHtN)wNzT|Xg4md&^yN5F($`RSq-Sux=$s;me3x!H1AaBOp(1P>h1FToc)=WhmONOGd6g7H+Uy9;#ZCdOhu&Ub* z*A!!yaXi3vek4rw|3&ghd=OUZ{E&U1QZqOaze)~@#bQT75l`sw;Ti~E=!TaBHknTz zzBG4J@8fP2yNjtigS&y5+zoi{>Ylsto7ib=F6yv;p>hdxy;MV770683OG%Z^>S7%# z6H4*n!(kRdBfx)O-1F{e}SyY_zBR*(G9z&MX-m7Od;5lW6Tcg zOW#fe8%Up@kPX%JazMuCK-u>iNX{9@I*9$;c#U^M)oF6+d8HM(^47h%BYl|hWp@mUv~i9Z zLUIf#((HL0igIV^+p1f`7O;=v&Wk5OMrQ89(u|ZZ)T&66nq~HxA93KWy+exg`CrG*{fvipaNS^4D97O#S9{$F9&5D!RYioy`GYbIT_wH zibV4VNmQ3p%DPHGV|6iy>H*JtZMIN3a($vH(bCk?yqPI}!fc|aV0^_bc%_5Qzk~4=Jq5?g z4L~Q+cjpqVgu5#a^w59f?FUJw6*~`fcHmwOpIVvMmbLp>7#GS|9Gd^hst|P1??els z7}+}Z5Imn$f23Ts(Up)qT7nPEmZt!Z2Tv9r2ky&qJVp49S4_VbjZV+|qCuTjYYbnJ z?*wMiI&{%#jqj|cQ;qgHzfSl27+$a7h=Ol=P%{0qlKWnzeF*Jmf()OQAM%IkZ}c0b zP8&iW^4C&l)hp0hujo0@Yw0zODOIpuOB)pT5d9uA`jqPRZNYkO3futq_qx2c7gZ^*mzY0g`NPydSLGn&|5n+evzR-vW(@sCbeN`hON=>0U8K%G2 z*ejFR!+%3NOiwEKVZrU+1X%tFKey+pb}GQ_7vNQxZiU@2eLKX^2r~SMq94_`*SOOB zLwFvh6N<78KIrrqG7~1Lv^}6SoP|GO`lzxysNnCytnFz9pH!MP_@E=2-(&Ewdv62sSU<%8HGmPvLVBOPF1VqLJ&yb{ zCTSAvkBMY(JK8>Av*~%w!!+<`)5GA6gXbq7cw9Z(G3RF~tW9Bl-h?ijO>Ze|7F|ZG z>7#z>6XfcCz!&`?pH80;+`e5h{U5@$fY%6aKN*UG`#7LbGCG}8lHGI}C=byRz%Np* zZzDZHt9|p3m3m)y45sMz1+NBlcyy$UajaQ|on7!o;ASc4UWNS?ZK-O3o-dRoJA6Kp z%Lv!kgS)lsd>Yj$>~`wbJAhs8VZj^pZl9mxo+R1Gv7i1-VUtv+-!A<0)JoPeNsS77 zdXI=vB0`2zH(Ydqd)s7(gx4TX6z1nEtM-Ae0G@j=>!wa1H30Lv)s z2cjL;L-a%udp#TnmTmNO-iv-AI-{^3gm#AeeIYvQVWKm{ypI=ocZ6GkJy7JG3>=5# z&x_cjf!*M}r7$mpA@bpgQp$CRsugxCPIe0D$JO;DZW1HMZ5NBWpyLX@39h8Qs6;^t z$ne-R{Hh+rEDh2yJ{+rs&k(G>8W5->9?^w>VOj$?o0=8etYA{XP6hWVctk-1P^VGA zxflm-KMc5t9syiVUs06j=peH90&&)==~Lkrv7eh)J>}UCQ$WMwN2d@<`h!=w$VpMcg?Gc^gTmEBWB{JiRMwPcU;to{$ z55yIrkATAYJVTFaw~Gfc)}IltiEI6ji1qYbIHdZ118wfRMfKgH=YgFYMGqvKMd|&m~+cyO;rlLa-p1(EC9X}zFD48V{HlYe@w2C zi$ZtH&2p){AMmrG&w;XEJSLNJxp)Ga{}b^Fc~CI?r2kv8Q^o_&%YBl^>xgVbCXdK@ zVxj1uEukODBl33t>v9y_J87T%TmR4Hq>{XXqO{hZz;pZ0eF>_gdjS{GmjGAL*8m&v z{7p~`Edsn6&*%hpMJ<3IQ1l+acDzG;954)+R_%1Lou>P>2^ymTz+1t+m5u}cHM#VZ z_9G?f6Wn)&f-(8eXm3;S0R^8>@D&Bg$K05L`{)FHj_wjKi#2jW-XWioPs=w^)x1LS z{-Rqujay2e0Q_<2Ho#c;BR+{aj+GWNe!#idnMj(C*&d{oh&6~O#VWvhx&p8fb3RBM zeUO@HE#Nx364Whp2i+vb#XpJv5HCuE1)G&ul6QU;gx|_H6eeK%zLl$YdaS?1s>CZ2 zKh;XtF5Wm@aJ{D3)Ae16m5X;(e)!~v_c|TG8gquO7iZ{k@e(~OzmE?@wrowOQXQ6? z&l;ocS;KXkQcWOkPNiD8amdPL?2!Zcj8QPR_7#cUwp-}8PB9LV5|&Ze*49+2nL4-U zhKEeY=*ybNnyK3{GgcZJ&~CSL1v6LJ0llUJyd+t$6}H=Q3!rYi$z8FN#q zb#%~7Luwsu8L&n@U+Zt6&+~GBKISs6IV;V|Fuicpv7x)7y|V+;&%n#+k) zZ5~kDRrDTg?ZG|(H%GVU2CSTkkR8*@8Ar;_Q8J%5bD7=XR!Y*|{@&5NNqu%^R5i*u zbIek^vYGIjCPvJ0P3pIuwApP8qgh!_)aw{IH;b}Bu+6Cy0!5S4Ju+yawSB11 z%w)_=vVhlXi3*Khx)Rky;dPxA=+6$ z!J@!=*pDtFJ&0sXb?P-7xV8gd9GWAxb9{>7SumYl7M#sZ(Mwi#z+=t>3hZKLXAa33 zGPwGT?7K=~&h%RY!|-mJlKp0XkI`=yM)#xo-6`c>nw0QrSVN|w7py)ji(0DSny#Ha=?z_{Hye7a(#7pfo z3p;t4a8unzAw5`H2s}g;nUyIFs&ex*VA#{giS_U-*kwD`X)IMnmY`|3(Pw5$tAdAQ z6^RvLBIhuD41B{$M)9u9B(vG_lul%T>`-G}ltsA>6{969ZRgZv!T6Szgj7;3O3K3> zhSx4mKMZ_v$%1pasRfMed4j?rZ+kv(>yXE>k7 zx@2aypGuo~MMb>48W@g$Esv-oR!q#Qrk9MD8Q=sq~H-yju#hBh3Cu>bQ`NEzUen zWSGTOJ%w=*d01(QgIL9buH^RA$dw;GiINzW@hxikOsG_C#j~kUe5k^&nKV@Nyg)d? zNuxws-Pqk8lj~=BfxiziA35y6krQ^H%QUBcD@*|)$dc()GQo9M+Ih^KLvRp_>@9HcleUB;>D1h0q7 zyB6$U$ja?U-e_;%O?<{O0 zk<4BUdJ;-CPwCE~eAY@^1#A)=x3HI&Pu`uBwg`^tGPXT;(sJzF5GFbCBR!LJ2CxSM zHiK*G32LRw)dm-*S6gx7&eXRutoIOmUlSbad-Sg~Qz^P->$+4b?QO^iNlop*GEF-X zv1%w$8_z2>pq(zy!yGo1)McME_wbKeis|6ZB9fNrQS0PE%N(IL6WgN-+~{*{r>`@Y zA1)*v=*)QKP=1zp+h9uOMyaW|(WHID20tC!F|q?#KgdODM^PrDJIz9or^YmAp7115 zM!ZrTD5$4usecLGjt6f6XWz7{iyWNZnq*Tm6LEv5Jm%-gqeNoBilLb7DeoS|9x{<~|*5Xn>uq^(;@CMdbsVxBudHge>0ShVg zajyjJfrUSK@-=#O(V#5uhOe(V}>ZE%XY(; z5%k@yeB#lf_!UAa=tz#+A&ao$`|rrRaDd-j4^i|)Ct^HU8cKEHSJ&TB}E2@&+6 z;QeSsB8=9m=4L%6MYKyH(Jn|xeQxxGh?-gqXIsD*12=#NW5kR)sG{hQ77)=+oW?*4 zzV4ft)S)ms@rcx=ANs1R{Q()>C&7zOdfBDybt`@^`i%;E)gvxQvZvDEEh zu>{{YgME3RIy!Nitd%k{amE94BNJy~;2!*GdUWDR99=~w9;(Hy7I#gLOgw|rDYT#A zQ?1CvbG7)n9!sDJ-=MCR`@MjG@P!l$1Q~xx>WCZxoRNApl2Thci?m`l$l#BqUSsgH z5E8*rOx#m78^@XoSwem|JaJFi*h9gR5J$~U*HN(KJd7hf{D;dRCK_GeQxgQZmC;ckU zhk`12bXVhc2HLm}{#a<@wn!jU9hrC#f7P}42RY~vk;xkPULA;O7~1M;bV3Fp1g4KE zwWKitCMR*juuJsCcrdXRhlxTDXw|i~swx(!s+gRss$z1Xh>mkQxyF`IbeP9~0TZ|) zn8ZaIyYjV!zw_#q^A0&ievh3izj)#V%^qYA9(=s5eJ!^(xOE8m1qSqHGY|YW^mZPj`D|4Gs$IkuGfFtvpWZ zdS$3HH;8jcyeiQkzAW@!16gxp?1FdW##kvQ&54bP%`Kan6V0vbn%6hR+My0-q1WWh zVZ8rj8)MzWeRzxbfH~T0A2)N?MDiy;Bhl5(KH_H>^mG?K zS2D-DID|TU`0K)Ld+Dlh)sK;^Z+r=#bKk01K*@Xwa+Ja_spo;!Yb^XsgmS~@8`iq}o|s9~+O)Dh{?9(x$4ibqR{KWg{g zbX1LKnUu(9`lx4Da@~fFR5X3X3q{i$-i_COg<9f=*1x*?+NL`ZLg{*#+p!Wh{a*Sx zx<^gnAhjc#?J}&Kce-qv>YPV$-&qAE7p7slwm)KjUcs!F*aN&1aEJH5F6gV;&(C|`-f*?@<=yeS zYjtUWJVz?84j=+rdGE9XJ0afJmEVlOTZwOU2)i%u?a2k7cctE*%+vD)tpKG0J{8n% z2#0AiXyVB!@V!&%-+Js(kpsM)gh1#0=Mdg@_zi6o5gEWtrGEOpN&W1Hu2OwU-oDFD z483RS+k}N(l>IvhEBv-I6;CsEflcKP!B!3AIV0X)JO|&h6&_w_BZ2)Mzm4)0N45p_ zlsIixy*SD|;^Q6t0NyUOUF>oP01TMeH$54^eM`p?o9-sfC*Ea8WY>)E~ MH2--0zstb?0H`{1tpET3 delta 6145 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 M3)FweMq|eR0%}_NkpKVy diff --git a/Languages/English/Keyed/AIImages.xml b/Languages/English/Keyed/AIImages.xml new file mode 100644 index 0000000..24da3ec --- /dev/null +++ b/Languages/English/Keyed/AIImages.xml @@ -0,0 +1,28 @@ + + + + AI Image + Open AI Image window + + AI Image Window + Character: {0} + + Appearance + Appearance information unavailable + Gender: {0} + Age: {0} years + Body type: {0} + Skin color: RGB({0}, {1}, {2}) + Hairstyle: {0} + Hair color: RGB({0}, {1}, {2}) + Traits: + + Apparel + Apparel information unavailable + Character is not wearing anything + Apparel ({0} items): + Quality: {0} + Material: {0} + Durability: {0}/{1} ({2}%) + Color: RGB({0}, {1}, {2}) + diff --git a/Languages/English/LanguageInfo.xml b/Languages/English/LanguageInfo.xml new file mode 100644 index 0000000..1e247e8 --- /dev/null +++ b/Languages/English/LanguageInfo.xml @@ -0,0 +1,6 @@ + + + English + English + true + diff --git a/Languages/Russian/Keyed/AIImages.xml b/Languages/Russian/Keyed/AIImages.xml new file mode 100644 index 0000000..3a260f5 --- /dev/null +++ b/Languages/Russian/Keyed/AIImages.xml @@ -0,0 +1,28 @@ + + + + AI Изображение + Открыть окно AI изображения + + Окно AI изображения + Персонаж: {0} + + Внешность + Информация о внешности недоступна + Пол: {0} + Возраст: {0} лет + Тип тела: {0} + Цвет кожи: RGB({0}, {1}, {2}) + Прическа: {0} + Цвет волос: RGB({0}, {1}, {2}) + Черты характера: + + Одежда + Информация об одежде недоступна + Персонаж ничего не носит + Одежда ({0} предметов): + Качество: {0} + Материал: {0} + Прочность: {0}/{1} ({2}%) + Цвет: RGB({0}, {1}, {2}) + diff --git a/Languages/Russian/LanguageInfo.xml b/Languages/Russian/LanguageInfo.xml new file mode 100644 index 0000000..ac969e5 --- /dev/null +++ b/Languages/Russian/LanguageInfo.xml @@ -0,0 +1,6 @@ + + + Русский + Russian + true + diff --git a/Source/AIImages/PawnGizmoPatch.cs b/Source/AIImages/PawnGizmoPatch.cs index f4e0850..8c81a97 100644 --- a/Source/AIImages/PawnGizmoPatch.cs +++ b/Source/AIImages/PawnGizmoPatch.cs @@ -43,9 +43,9 @@ namespace AIImages { yield return new Command_Action { - defaultLabel = "AI Image", - defaultDesc = "Open AI Image window", - icon = ContentFinder.Get("UI/Commands/AttackMelee", true), + defaultLabel = "AIImages.Gizmo.Label".Translate(), + defaultDesc = "AIImages.Gizmo.Description".Translate(), + icon = ContentFinder.Get("UI/Commands/AIImage", true), action = delegate() { // Проверяем, открыто ли уже окно AI Image diff --git a/Source/AIImages/Window_AIImage.cs b/Source/AIImages/Window_AIImage.cs index a309eaa..544fd82 100644 --- a/Source/AIImages/Window_AIImage.cs +++ b/Source/AIImages/Window_AIImage.cs @@ -79,20 +79,22 @@ namespace AIImages private string GetAppearanceDescription() { if (pawn?.story == null) - return "Информация о внешности недоступна"; + return "AIImages.Appearance.NoInfo".Translate(); StringBuilder sb = new StringBuilder(); // Пол - sb.AppendLine($"Пол: {pawn.gender.GetLabel()}"); + sb.AppendLine("AIImages.Appearance.Gender".Translate(pawn.gender.GetLabel())); // Возраст - sb.AppendLine($"Возраст: {pawn.ageTracker.AgeBiologicalYears} лет"); + sb.AppendLine("AIImages.Appearance.Age".Translate(pawn.ageTracker.AgeBiologicalYears)); // Тип тела if (pawn.story.bodyType != null) { - sb.AppendLine($"Тип тела: {pawn.story.bodyType.defName}"); + sb.AppendLine( + "AIImages.Appearance.BodyType".Translate(pawn.story.bodyType.defName) + ); } // Цвет кожи @@ -100,18 +102,26 @@ namespace AIImages { Color skinColor = pawn.story.SkinColor; sb.AppendLine( - $"Цвет кожи: RGB({skinColor.r:F2}, {skinColor.g:F2}, {skinColor.b:F2})" + "AIImages.Appearance.SkinColor".Translate( + skinColor.r.ToString("F2"), + skinColor.g.ToString("F2"), + skinColor.b.ToString("F2") + ) ); } // Волосы if (pawn.story.hairDef != null) { - sb.AppendLine($"Прическа: {pawn.story.hairDef.label}"); + sb.AppendLine("AIImages.Appearance.Hairstyle".Translate(pawn.story.hairDef.label)); if (pawn.story.HairColor != null) { sb.AppendLine( - $"Цвет волос: RGB({pawn.story.HairColor.r:F2}, {pawn.story.HairColor.g:F2}, {pawn.story.HairColor.b:F2})" + "AIImages.Appearance.HairColor".Translate( + pawn.story.HairColor.r.ToString("F2"), + pawn.story.HairColor.g.ToString("F2"), + pawn.story.HairColor.b.ToString("F2") + ) ); } } @@ -119,7 +129,7 @@ namespace AIImages // Черты характера if (pawn.story.traits?.allTraits != null && pawn.story.traits.allTraits.Any()) { - sb.AppendLine("\nЧерты характера:"); + sb.AppendLine("\n" + "AIImages.Appearance.Traits".Translate()); foreach (var trait in pawn.story.traits.allTraits) { sb.AppendLine($" • {trait.LabelCap}"); @@ -135,18 +145,18 @@ namespace AIImages private string GetApparelDescription() { if (pawn?.apparel == null) - return "Информация об одежде недоступна"; + return "AIImages.Apparel.NoInfo".Translate(); StringBuilder sb = new StringBuilder(); List wornApparel = pawn.apparel.WornApparel; if (wornApparel == null || !wornApparel.Any()) { - sb.AppendLine("Персонаж ничего не носит"); + sb.AppendLine("AIImages.Apparel.NoClothes".Translate()); } else { - sb.AppendLine($"Одежда ({wornApparel.Count} предметов):\n"); + sb.AppendLine("AIImages.Apparel.ListHeader".Translate(wornApparel.Count) + "\n"); foreach (Apparel apparel in wornApparel) { FormatApparelItem(sb, apparel); @@ -165,26 +175,34 @@ namespace AIImages if (apparel.TryGetQuality(out QualityCategory quality)) { - sb.AppendLine($" Качество: {quality.GetLabel()}"); + sb.AppendLine("AIImages.Apparel.Quality".Translate(quality.GetLabel())); } if (apparel.Stuff != null) { - sb.AppendLine($" Материал: {apparel.Stuff.LabelCap}"); + sb.AppendLine("AIImages.Apparel.Material".Translate(apparel.Stuff.LabelCap)); } if (apparel.HitPoints < apparel.MaxHitPoints) { int percentage = (int)((float)apparel.HitPoints / apparel.MaxHitPoints * 100); sb.AppendLine( - $" Прочность: {apparel.HitPoints}/{apparel.MaxHitPoints} ({percentage}%)" + "AIImages.Apparel.Durability".Translate( + apparel.HitPoints, + apparel.MaxHitPoints, + percentage + ) ); } if (apparel.DrawColor != Color.white) { sb.AppendLine( - $" Цвет: RGB({apparel.DrawColor.r:F2}, {apparel.DrawColor.g:F2}, {apparel.DrawColor.b:F2})" + "AIImages.Apparel.Color".Translate( + apparel.DrawColor.r.ToString("F2"), + apparel.DrawColor.g.ToString("F2"), + apparel.DrawColor.b.ToString("F2") + ) ); } @@ -197,14 +215,17 @@ namespace AIImages // Заголовок Text.Font = GameFont.Medium; - Widgets.Label(new Rect(0f, curY, inRect.width, 40f), "AI Image Window"); + Widgets.Label( + new Rect(0f, curY, inRect.width, 40f), + "AIImages.Window.Title".Translate() + ); curY += 45f; // Имя пешки Text.Font = GameFont.Small; Widgets.Label( new Rect(0f, curY, inRect.width, 30f), - "Персонаж: " + pawn.NameShortColored.Resolve() + "AIImages.Window.PawnLabel".Translate(pawn.NameShortColored.Resolve()) ); curY += 40f; @@ -227,7 +248,10 @@ namespace AIImages // Секция "Внешность" Text.Font = GameFont.Medium; - Widgets.Label(new Rect(10f, contentY, scrollViewRect.width - 20f, 30f), "Внешность"); + Widgets.Label( + new Rect(10f, contentY, scrollViewRect.width - 20f, 30f), + "AIImages.Appearance.SectionTitle".Translate() + ); contentY += 35f; Text.Font = GameFont.Small; @@ -245,7 +269,10 @@ namespace AIImages // Секция "Одежда" Text.Font = GameFont.Medium; - Widgets.Label(new Rect(10f, contentY, scrollViewRect.width - 20f, 30f), "Одежда"); + Widgets.Label( + new Rect(10f, contentY, scrollViewRect.width - 20f, 30f), + "AIImages.Apparel.SectionTitle".Translate() + ); contentY += 35f; Text.Font = GameFont.Small; diff --git a/Textures/UI/Commands/AIImage.png b/Textures/UI/Commands/AIImage.png new file mode 100644 index 0000000000000000000000000000000000000000..334dcd4e4fbcfe42b7e04f252814fb2f22deefd2 GIT binary patch literal 1640 zcmV-u2ABDXP)BJr+wtz{0s;Zx-P!Ev<@fXN)6mS@*V7LV4Js)n$;H7tIyW2} z8BI({UtU|hxV5dSrfh0wpPZO=ba9c7i+_E3h=qdw{P^ZXyVC#w00DGTPE!Ct=GbNc z00q2BL_t(o!-ZGbwxcQ#ZN>r=5NA#D|G#;6p*ejY8V_s5Bx-G{c8&b`^Ruk?7R!6h z7ptwtQc5Ugty27lpW>tapMNgPFF>javM4WzYh}ICKZ{>#0q|424q06<{Nbzhn!iQ8 zvO@m`V0o6PyXt#?Ef@noM7@9CYysG7&+A12q3@myAZ~luntua)x8xB(CX)nh6z6;S(+fg@yp(@)c1>2AI$ma&T`q1;`&R{kv`vtef^JTp&S^f5ZOYEgu^*Fr zb@ppP3qXE3?4}V`q|xD1j)7!%x*vdFNMs{egKl?w=n=@FgEzte8sNx_q&A7S4z@eo z!Zb+gjIchCj2X1rnq$9eAXHeAb7Sg_SzgNMu%8r>6?Z&i6Zr%nB`8SCh$MP(0EUu<8mB26c{x$G0WON5LI3HD7RC=o1aKMrSjLI; zvj!J9UZB;LwU-Di$!25|m_)Yb8|_afU;{;mtE3|&fVLYI5J@MgU*kYtRzQa#j|`=a zh{g!k>HVn&R5hC#+$Kn2KYOhJ20JJCqh{xAqG@NN{JVt7Zb0nD*LEB`;I{6LLI!wD zrZ16;OKV2~`S|&)E_)+xCj!9y4!{Vbn-_&J=6oJVResoqrUh^t$S;6654{o42tenu zBKu8M@fb)I085$hK|)OLDd%ZUZ~@7`<>XfqQN_Y=j(KuNN92pcj{*0zP&W&00K+O! z|3*`Bb2q!9Q3=)+|MDw#6+k>`U@8G`^r8*C9ZD3`7At~1P#5(>I$tfJPen*BT}U7l zRfT{8mpmd!KiB3UTgik;NNLoNHSny0oLslvm6Fyo*1oIFnkrO_1D=kg$OUB?EeY4q zDMS%csm={n%Q%fnK9VTH;@+g{qz44kyJJpK0ZmCXdUMtq`M`ljDM1y~hz97O0e8M} zgNH9YuOydoMuU4I(UhW;4}0;#qpk05-Q5z<=0ndlDo$BErnBkOM%EL0v0(sgzn~vr z_=QhEpnRo;9y*gIZfG6=DGFPG;(+l60DuMn{BU-vJ!Dl13;^aEU`i??C%pAHz>qiY z@~tsX(=;>?#2*#qC zk?6gM;{*z#o<rqx%h)XfCghi7=r`Z zY;C?eeqlFmkc7|zP2zNGkR}pl$p>1bY;k~n+@wHepR(jQc)4ljK(aOr90z_&Lr|^0 zfY&@IJ9(&jv);;bn?4BsW$3LF1KfgeX}Xcuwn`wy_aI=BH^%`y{IcR)f{JG}NNxKB zK!!E(#4wNx!Pbde3F7ul=3&gc0AiK**S6miC?<9+{(3sGRH5r^$|cR#vc!j0KB$S> zT;+9X0^BEGE`ZUqoUpOCJS;&9Cl6d|lUGeIAb$JE=Nf$B*ry@i_qNt#*+-lJd(X38 z697?&>6pC+u}eNG=unSQ3?O1u@`(dTc;*W*0)*+l7e)bu*#Lm3nxS$%0(e%VuYBm( m<85feRk;G_7;*dmaqu5^TTwiAkL3dZ0000