From 2ffb897b11a720b72a16b7822616f98d52a0e9df Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Sun, 7 Jul 2024 12:26:00 +1000 Subject: [PATCH] Add analyzer (currently disabled) to enforce a newline policy for `=>` --- .global.editorconfig.ini | 2 + .../ExprBodiedMemberFlowAnalyzer.cs | 124 ++++++++++++++++++ .../ExprBodiedMemberFlowAnalyzerTests.cs | 83 ++++++++++++ References/BizHawk.Analyzer.dll | Bin 33280 -> 36864 bytes 4 files changed, 209 insertions(+) create mode 100644 ExternalProjects/BizHawk.Analyzer/ExprBodiedMemberFlowAnalyzer.cs create mode 100644 ExternalProjects/BizHawk.AnalyzersTests/BizHawk.Analyzer/ExprBodiedMemberFlowAnalyzerTests.cs diff --git a/.global.editorconfig.ini b/.global.editorconfig.ini index de595ca19f..88e6c82745 100644 --- a/.global.editorconfig.ini +++ b/.global.editorconfig.ini @@ -24,6 +24,8 @@ dotnet_diagnostic.BHI1102.severity = error dotnet_diagnostic.BHI1103.severity = error # Brackets of collection expression should be separated with spaces dotnet_diagnostic.BHI1110.severity = warning +# Expression-bodied member should be flowed to next line correctly +dotnet_diagnostic.BHI1120.severity = warning # Check result of IDictionary.TryGetValue, or discard it if default(T) is desired dotnet_diagnostic.BHI1200.severity = error diff --git a/ExternalProjects/BizHawk.Analyzer/ExprBodiedMemberFlowAnalyzer.cs b/ExternalProjects/BizHawk.Analyzer/ExprBodiedMemberFlowAnalyzer.cs new file mode 100644 index 0000000000..63ffcf1d7d --- /dev/null +++ b/ExternalProjects/BizHawk.Analyzer/ExprBodiedMemberFlowAnalyzer.cs @@ -0,0 +1,124 @@ +namespace BizHawk.Analyzers; + +using System.Collections.Immutable; +using System.Linq; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +[DiagnosticAnalyzer(LanguageNames.CSharp)] +public sealed class ExprBodiedMemberFlowAnalyzer : DiagnosticAnalyzer +{ + private static readonly DiagnosticDescriptor DiagExprBodiedMemberFlow = new( + id: "BHI1120", + title: "Expression-bodied member should be flowed to next line correctly", + messageFormat: "{0}", + category: "Usage", + defaultSeverity: DiagnosticSeverity.Warning, + isEnabledByDefault: true); + + public override ImmutableArray SupportedDiagnostics { get; } = ImmutableArray.Create(DiagExprBodiedMemberFlow); + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.EnableConcurrentExecution(); + context.RegisterCompilationStartAction(initContext => + { + var ARROW_ONE_LINE = (' ', ' '); +// var ARROW_POST_SIG = (' ', '\n'); + var ARROW_PRE_BODY = ('\n', ' '); + initContext.RegisterSyntaxNodeAction( + snac => + { + var aecs = (ArrowExpressionClauseSyntax) snac.Node; + (char Before, char After) expectedWhitespace; + string kind; + var parent = aecs.Parent; + if (parent is null) + { + snac.ReportDiagnostic(Diagnostic.Create(DiagExprBodiedMemberFlow, aecs.GetLocation(), "Syntax node for expression-bodied member was orphaned?")); + return; + } + void Flag(string message) + => snac.ReportDiagnostic(Diagnostic.Create(DiagExprBodiedMemberFlow, parent.GetLocation(), message)); + switch (parent) + { + case MethodDeclarationSyntax: + expectedWhitespace = ARROW_PRE_BODY; + kind = "method"; + break; + case PropertyDeclarationSyntax: + expectedWhitespace = ARROW_PRE_BODY; + kind = "get-only prop"; + break; + case AccessorDeclarationSyntax ads: + expectedWhitespace = ARROW_ONE_LINE; + switch (ads.Keyword.Text) + { + case "get": + kind = ads.Parent?.Parent is IndexerDeclarationSyntax ? "get-indexer" : "getter"; + break; + case "set": + kind = ads.Parent?.Parent is IndexerDeclarationSyntax ? "set-indexer" : "setter"; + break; + case "init": + kind = "setter"; + break; + case "add": + kind = "event sub"; + break; + case "remove": + kind = "event unsub"; + break; + default: + Flag($"Expression-bodied accessor was of an unexpected kind: {ads.Parent!.Parent!.GetType().FullName}"); + return; + } + break; + case ConstructorDeclarationSyntax: + expectedWhitespace = ARROW_PRE_BODY; + kind = "constructor"; + break; + case LocalFunctionStatementSyntax: + expectedWhitespace = ARROW_PRE_BODY; + kind = "local method"; + break; + case IndexerDeclarationSyntax: + expectedWhitespace = ARROW_PRE_BODY; + kind = "get-only indexer"; + break; + case OperatorDeclarationSyntax: + expectedWhitespace = ARROW_PRE_BODY; + kind = "overloaded operator"; + break; + case ConversionOperatorDeclarationSyntax: + expectedWhitespace = ARROW_PRE_BODY; + kind = "overloaded cast operator"; + break; + case DestructorDeclarationSyntax: + expectedWhitespace = ARROW_PRE_BODY; + kind = "finalizer"; + break; + default: + Flag($"Expression-bodied member was of an unexpected kind: {parent.GetType().FullName}"); + return; + } + static string EscapeChar(char c) + => c is '\n' ? "\\n" : c.ToString(); + void Fail() + => Flag($"Whitespace around {kind} arrow syntax should be `{EscapeChar(expectedWhitespace.Before)}=>{EscapeChar(expectedWhitespace.After)}`"); + if ((aecs.ArrowToken.HasLeadingTrivia ? '\n' : ' ') != expectedWhitespace.Before) + { + Fail(); + return; + } + var hasLineBreakAfterArrow = aecs.ArrowToken.HasTrailingTrivia && aecs.ArrowToken.TrailingTrivia.ToFullString().Contains('\n'); + if ((hasLineBreakAfterArrow ? '\n' : ' ') != expectedWhitespace.After) Fail(); + }, + SyntaxKind.ArrowExpressionClause); + }); + } +} diff --git a/ExternalProjects/BizHawk.AnalyzersTests/BizHawk.Analyzer/ExprBodiedMemberFlowAnalyzerTests.cs b/ExternalProjects/BizHawk.AnalyzersTests/BizHawk.Analyzer/ExprBodiedMemberFlowAnalyzerTests.cs new file mode 100644 index 0000000000..58581100fb --- /dev/null +++ b/ExternalProjects/BizHawk.AnalyzersTests/BizHawk.Analyzer/ExprBodiedMemberFlowAnalyzerTests.cs @@ -0,0 +1,83 @@ +namespace BizHawk.Tests.Analyzers; + +using System.Threading.Tasks; + +using Microsoft.VisualStudio.TestTools.UnitTesting; + +using Verify = Microsoft.CodeAnalysis.CSharp.Testing.CSharpAnalyzerVerifier< + BizHawk.Analyzers.ExprBodiedMemberFlowAnalyzer, + Microsoft.CodeAnalysis.Testing.DefaultVerifier>; + +[TestClass] +public sealed class ExprBodiedMemberFlowAnalyzerTests +{ + [TestMethod] + public Task CheckMisuseOfExpressionBodies() + => Verify.VerifyAnalyzerAsync(""" + public sealed class Cases { + private int GetOnlyProp + => default; + {|BHI1120:private int BadGetOnlyProp => default;|} + private int GetSetProp { + get => default; + set => _ = value; + } + private int BadGetSetProp { + {|BHI1120:get => + default;|} + {|BHI1120:set + => _ = value;|} + } + private int GetInitProp { + get => default; + init => _ = value; + } + private int BadGetInitProp { + {|BHI1120:get + => default;|} + {|BHI1120:init => + _ = value;|} + } + private event System.EventHandler Event { + add => DummyMethod(); + remove => _ = value; + } + private event System.EventHandler BadEvent { + {|BHI1120:add => + DummyMethod();|} + {|BHI1120:remove + => _ = value;|} + } + {|BHI1120:public Cases() => DummyMethod();|} + {|BHI1120:~Cases() => DummyMethod();|} + private int this[char good] { + get => default; + set => _ = value; + } + private int this[int bad] { + {|BHI1120:get + => default;|} + {|BHI1120:set => + _ = value;|} + } + private int ExprBodyMethod() + => default; + {|BHI1120:private int BadExprBodyMethod() => default;|} + private void DummyMethod() { + int LocalMethod() + => default; + {|BHI1120:int BadLocalMethod() => default;|} + } + } + public sealed class GoodCtorDtor { + public GoodCtorDtor() + => DummyMethod(); + ~GoodCtorDtor() + => DummyMethod(); + private void DummyMethod() {} + } + namespace System.Runtime.CompilerServices { + public static class IsExternalInit {} // this sample is compiled for lowest-common-denominator of `netstandard2.0`, so `init` accessor gives an error without this + } + """); +} diff --git a/References/BizHawk.Analyzer.dll b/References/BizHawk.Analyzer.dll index 34b523c4ee2338b559ffe6af78e5e4793130ca62..7ab18256e5fde39927fe5840aa4bc5bc2f2f3526 100644 GIT binary patch literal 36864 zcmeHw3w+#FmH+wue)CQy$xL2-clt<~Hcd#H^hsNqXB%jfwh5G%rqg7S4xMDunMvDF zS|=0`v}I)h6%}bIC{=vpUs*v~0aq45`Kar%K9&lou!`azT~X=&zvtZFZ(d2Yu)ClC z-~I1E?(d$*J@?#m&pr3tJCAO<;(cTgkqv+U{_jLz#*<&`r2O+m3gn{Me^*2gx}To& zWo_frb9#105`mF;Y%m@g3iO4BhhxdWj&LA8Ivj`$2U@$j14FU?aIM$tnQw~T+(xuf zGw3VtpLW01+w(LxP@vTj-2{w7VQW8zX8?aE@kdl5bzSMr2-aV{G$P>nWzhB;n3ey} zJWY^Mc>Ul$qAsqS#Q$uF{MYkDg}~Xs*OO2Cb8vvjl|^>}-jD^?Cd2!ZfH&WW0yG(` zsW%{b1&FrS#uM>AK%(18RCu88!C%&E9j2=`9*)Mq$hy+=_+weO;4ka7j;J{clxi{C z6))CJCp)DsB)UFK1S`I+*DO6)O5|DePW99)k6Z>}RTaiZ4nU-B(JB*fTZw*$l<+hsZ^xbv6o_ea<}6D~;lx2IZcrN_~GL zCH`GOOx3Sl3dH^ZODw?P?x~sb-m=v4~lpgeeo$ZEZ6YaJF zNU_^8RL(dyW$eb3wA~=Xv>Qt~i{1R_G(MM$wB4rW+Kt7qDqeo(PvKf1MU^$EoN-*4 zQH3dKRp8F1DlElRC1?H~V->!`#VtCDN#>7bupZO+Sz2eOHp~O2-IsVLdiCV^mZR)I z6WH*;O0gM^GY(9ZBQX!Qopoe8&)T;agAkk#L<~M!t^CPOo6Wh^XC8t7!y^vjfjO-_ zSSHUY2jRMaryhjE;5qFeycEyr2dBt$#zAV?(yUYbeavx`i&waqL>j9c-)aYO2Ny@Vn1qc-6fbgsIE#y` zxR`{E2OKw?AeM4*ITw?#u|4A7Vd4v1q=%3VUk?=I)8Gqgqx~KyG!SQFXsqzBh@gmR0DAi|L60F<#+cerEN6jg_5X=bxL zQg$=HpM191y0jQ{qsK6(^n zw*_IA>I2+Kww@3pulNsHyI*i|sL<3i&$n4p-0uZ(E*B{-cnRbUhx_8;VCz8O;_<*` z3BKw}j7&Bj>?ksj-8>MO8w1&h*{-UXUGdQvtc}bqRa;Rb(odHx3pP-&qXeJ}zG8Vv=!im#n`=3!uMCdutXkXdIUwXqbICS^%~A=5%2r80$ga*s3s{?257VSzAMQTb&9;Dj z*|*y8^ssMrux~kL2WAHnu(9U=wh^0SHnuheVs{ZQyNJCkXSsY&mWzXPoE+IsI&KgZ zK(?QZ1Dq85Npj=hrI4RQq}K}kDNV;58ZL&!U?Tl>$vz0x^TT3{D#ez38 zXw_sC_SIIs8zV7c7*vyO!h~l4#>R0h!*MlpJgTKz>|*%o3>;S5V0GEi0XK%1XHCUH!Fkc$P8LuRiD#T@Jgsu?LG~zWV6~7*!>PD1{ zT@I~cSD*-9i2|Dzyw-sYIoHy^Neg*EMwUxOGgFCMCZW!^sMU#lvF&NnW%;DxG-*vf z>1diXH~t{%${Wuz5@+lxj7z5a9jMeGU#!OY(6OI=Xnz2xS{FuL$fM5U#nHsGcup1q zi#(G!&h`YISeVsX1v02yiE~&YZ~h{&Hn9n)_V8~^taxg$%e&r&E zlUI{tk;BCoAf6b)oC8X`V*P*?mjcZdmqZ*c93X`)5?4$T!j}l)$i(}KW05;HzkJ~c!szvB-$+wn$ttN#elZ z7Wv}9wTUaho?3%hNv}T4IP!zfqCX%0ParxWmsZRF+c2#xe=Hvp)m&+!3Xof`gB(0A z#KRdMVM-jmAI98G=dfKJO9CvcUg(OAqT+SO_TW)!^V@=ZQJK=jDJSN<*MPc6E8(+#H!Z!1(;FgddGY<)tAPC&6OP&Y!JC9{ zVxnT#q8>YdqCnp-s;f0ptncUXI2D8-7dr?ZN9RAG??K;P|xR*^ZBa#U{cg!LT%N8|E|0d*^|#5JIq~se4bT%6nunX z9BxN3G1|(ILf*p2LSLaQL$>v*laPk16}eb52as>5S!l#8<(V-~%Hj@AgXgXM9V9{$ zM=*EnZ%_h=;t_lwiqax~QSeq&CeHwQgORY7bAbfrr~?xs_N8?)zb&@%V^5aF=$-FuI^Inc&)yl z9hr09%4)Yl;tFr^f?RoNVXup@nQ39Qi4YV>wLnICW$}6H>liA==}RDCILCPDjDLUH zgb;ZUTU++MTOY(FK8o(EQcMXJ!LkR|qvmkNe>O?;w%q3ZndVGU%{QRNQ50FqS)wTK zYdXhDg7acu<2cRx?p{2noYAoH{du|-b(zma#~`NyaxjT!i@Q7`GtwgNvVvK0mm{v% zZ&U_TsHlKDjujs}3UIU?HTVPaIet6Ev3M0Gayr_pq|KVg9GT98(8z=1O~LeZsvx1V zHn9^TQWv3ldUByV&+leDD|vpe21hy{o&y0YAKr*IRvL`Ag-q-wVA;}0ZO&q8%Tjxc z*gZVD<0z0!A(}W6_o5!e=E-j&u)XI)2P_oK$HzeN==-Hp<=0+)KX>L3Xi+8Z!<=*k z{8%ITcK zpdSAo1}VqU#fxEaERgIyNOy8@bkrDAs#73`9Oh<;GVD%$I>b0yMm6`=Kz&e#y*b+-V2If3B~gw<2kfCGNF}hO$hv7fLx3^ ziig^p__CY#rb11dmr<#4%2jN&U9M%bQZ_3}sikE)fUFj3?!Ks5Gv945gdgr{tgWkUsB5TS z2>>_tm|FTZ3^(r}(N!~W4~4&Z-N|@lcrd{nx37Q^usY{m(oG+{M18hl-ug>Au$j>P zfPYvFT62_7;qua9jcs?`v(SyLlm4JJaNx$&$j1+=@q|rjH~u!_4`brHTKX~mm2sb)0v-WrdK^3bl9`4)IoyezbgYH-SrL-3*h=acCeyGqv zPZxZ!#6dstaCx_s4@>!O!QbmFuD?Tot_E(h^ z(M{S@P7hsB`KI4NzZ1?YHRh}q%uJo@zpr=`Z_~U|xv$bs{nPeUdgw%PRhft0Sy5Hy zpq(z}x!uY2jiPe}TKVb2)Av<6Xp`o2_{lMaTV3z1D)ZByrm~zLh@6*1&OYEhv|rkYiNbu8MDUYF*gZd%OLstv`BU1XIr-uS1-$2`?Qa&K~IHWn~0*u8^H%gBW ziT;&Re^BImMDkpzKPS{8!F)&hY8E>&_gn7wnDb*KbF4fFQUJn{*==} z&rfH}%o(gt(7|o5^zqF81e|_a44DpUDCc?qxsx&X%ZR=px_w5!Yn)JL1!0Q{SmX~rv{<^9^>-R9Ws_LIA4KQAMm)qCvFx{8(v)M`QqzMyFZiiUFups&DBm~*K> zzZ7TzEf?qtX}5siF9YW^fzBg7hnCQ8fr7L~pnyP&_}z2R$b^~&+AB~sAu__Gvtg{u zX)(2vF{gz7U}vb7A+$p{1yn~J0{sNg0gT|{EY4*Nf%B+vuEZzE7%GR{%jp8zlEt|O zn2gK|=_-L>58#{VomreMv^|S+J%t5Qy?4-H7Ux9_rS;rMR|^yqnVmG81#PAg(ds=0 zk6{bN@t)l`N`F|efNm^&9_1H{Unr=j-pZdA%%MjeuM})a9kkE2Z%HkZ^4m797oc8G zci1eRdRpSO>RVFx3g^3ob3p1FqKMVXX8FNuyFRhLj zHG=2&QmR&WYb%9wO_!G{m%9(h%YX-6hc1 zU4hcwpxvh+8Y;Y|P^ah8oEko%^148`PWie&RcKIf4&ikh{ZhLgP>%^+sUI%1(M}Wk zwtj1&oxUfK>cLJwQjqlEAm3b;qQ>B)#R91wa5pZHYUiY#3X*m%`bbtgH$9lu&P_kh zYUie3XSMTC>%2^V1$0y()n5UfoX@n|@cGCO78cO$RSNnydZ4hFP79=TDWR7YB)a%$ z=7Nk&Kdlf*$@EiHpxfvZ`WFhZ8=R+Pb{T(HSW1;ahLp@Qnyny_Sx(&oDZ5lqR3Ig@ zf{tdjtDyU{+Evo;vf53dvW47(YBz;q0;&F{&^`r8e^cpUfmDCf=!aSDrqK$VS&80H zWz(K0oJLWBZlw>oo++F`A2w+pa{Y7RY&wyKep)z}zGOo0E&WYl6+I!4>ftF(vU1J4kfx_; zCD^?h($HL5M9n5AOR1)dvf5SC)-KNA>h%nx+wAsz8Tu{axye!)_%!TMbpjotMcP#F68e|( znWm&P(7y_#Y~4Vw3v>u~2&LWz>aAnWL-eXK+uKM{ffVObN}4p5xs*cn%&BP0C?e1y zYS(ML%jkV3^d7y@yPW=HLO<8ndRNkF-ty3c-FA_86{Sq*YGaG{0tz4@VA{uxE4^zd zWkO#!`n?y@j|Ea=SVyl2qgVLh}Vuwr-){o6xstx3`t1AOT^m|5@AZZKGuZsdnwO&ZLd$ zS9{y(mjbCC*3%nVoa@PUfs(>wSWnvpQc^b1PLuW-^ss?$GNCbjpSOd)Y(jSQa1m`; z%~Djmi|HzX4$&8Bs`p~LVr_=Dk@^K<+SOh@(XjmW!WE8f#+V?}k2Bz0%9Q6hnS4=JBk)6i*-Y(dY_{ zLZ>r@TwfvOR4KQMhSkEu7@ZVG)fIlFi(4uFi^Vc$?2J+MQH(-EhQQ^k7_~;91HW$8 z*T_gU>E$Q>4F098`byzZ(hTTnNmH1GB2$%$s_^r0_}1tqDYIJ{4ma_B??Y+FjUd3OAt`qY=LuR} z7NisOgAxs&BRJ__hWc2^YI;_G-PMkFbh*`Ydfkj|bSLUNa8me5ahzTTbss%Ta~(I( zYx?trhjFKVr}hDq>+}!P8~U%x@1_|d&29YS^v^@)hLVRx=C^S>+EwvuWb6+({|HXs z4ASP)cOc;n{f07!_J;m);jdBmlox0()3f#x?KPo3t8FTt2~5EGYh+k&me19u8iPK@ zJX3L)@Ttm*h_=vZEq}dgJ#7TjBTrK$3f?sXopYh(KHA&kJ{fO^= ztzQ4t^tmWsFZ{F?(QYVzP}?YNHxhGRu0K*d7d`$2J#Nvtcec`Zv>qAh2?~|`O4GFZ z3cKE9RQk&Fkhb16PaoH~)tHnW#=?q)dWR7&tJOb;RvIjJ(!WMOrR+mDIPLnaI$QWO zUGAKzeU6@R_2}cqH0(QU)hqPp=tE+MhwZmOlNV9mY}`<`9TNVnc&~n|VRIeOr)m$C zUa#M2oGL$|A2WV6{XvvJo&IU9N#lA{w7uDI%=nI;H0$~dhw&`gy$et-FJ5f0{!5JK zh&4Y=Eaxhm5-_ZqZH| zKf?DNPKjlXY5tN|jT72x=j+C;+HbtC8&4YC;|cBd@;?|K5eq+Q+*N7Uk7=yKv(TZ? z7ScAuhV|M#<}*`@F2( z0L*LJn`NJ}y(U!l|F7B}G_5yY@oSsg#(lkkl`_{J(c`Xa`xdROwBG)(@c3-{j5d3{ z_KA{e`;$g}#j69TGj=qSpm5Mw?$dCVk?{rP014ZW{dwRBbq10>fIl();wRlJRLnx=y zag_7uYbdMfDU=OVT2zY@^Fov@v<&6N)Pk~G@K>U2p*~1xLAG-Tc0HEgCzw9L^wBQ* zXi-G)hXl`i^&Q?rz&}xRv*3@JCCfQ3JjaFSICy?hbgxiPNO@AIkI`HzEq)B|j_oaa zj1n}p_(`F@Aov#q|AOFO6#UCl8XC7UG;U>R+{&%7w(|r(Pw?{uKVR_cG#QsrTZGyo z)a`-~2~SAseZtcxJbl8`kNQ)^DWM(`>LH;X66*ER_NY*gN&T4Aj|=B<;XE#!j|t{6 z!91q%OueA(qN?H-v_n#VFG@pajG;5e&>3UXd0YXV^`8go1;z7(I!~xAz-%dQ5lo9< z`hXcM?h{O(U=9h-A;BCH%=IGksK`97vn7w~Y{}!`Jb*g)eq1;o6Y66^eN3p23H33d zJ}z=zkRD$U{0o9N44EB#(ipR2?4o;%4MRp`$cPLXks%`jbxZL)q0STPI>9#yPm|PJ zq-=$>r;4{ry-!NSTUcgX>W8GfUU-g6{ghBoN&PV?pO^9lDPI&$vat?^lmRK{*jVNq zsn3(LMaouu{`9HhKB;*JS`Xv zAGX|EG)KyHE|%FO^^lY)!Hi4&n3Shn+~aAfYxtH1+Dh3ZWysCcaj74Z@}zq%cuqqp(A)I5{y{x} zUA4=&#CXD}xBbXww-?*1?C-Sq+Yj5Hz^#;qZxHDC6uyCXYHWyWc0^nUGBPLbcwLB9 zZe$7`-02qJjh;e8^&;elNH1xA>AR3mpL@Bm@FwtkrJPrOIImvqy4A$!=-q%uUTC5t zBW3N%p@ojsg3b?VIGRVdHN!n6H1cSIK!Lg8{+u)FgcMaw?gQvCqKYO#IEl z$Y9VTjRUvF<~Bry^VjkQEWiG=XwBkPyuwI1y4ZP^*_+toc1>ce}G z9m5+ViR874Ex)m}WffNB34scN%5N|UA9PoPsGm3ppzgFMngNIVN^TXhDV3OaT99lOGaYDS?FXe4yZdk5{ieC;r{Ni z;bdqZ+lG0DhDMXzuqhr7jWHq_9;&C7?)j_NuITN>_qIdP#3Xt*w`}Z*kF5_UFAYUU z!`HIzGM`H(nj#m4QMX4!gV#3p=HfB5C2D9(NM!bmj$m+0G8(oThZR$zHDhz!_t*?&CT_# zOP1z$zbTaL+Zj$kg9#*AA$ZfhZ&!1ye+*yd?(OYPhLVv!aR6S6J!2!`Zmh;N^~>_* zO5?VDBXMavIk~B?FPuogbjy`btms{lBSsb&P-}7Vmb>(U*c9s@jfU6K>do=U9yn{q z5S(Br42NZ(ZVe}4*Th{Z)$3; zU)I*x+TPgGxV*WwwZ462WBZc&x+RTG%Ntv$ZR^(FP2KBzH+FRQ^tN5Ld24T5XDhWv zLWA8qW24djo}Ka7-p-CTYTCNBYg=zuXB${M+Z4y%2&|jM*U{CM7TB`^{N26Vwsv){ z@9nu9KOtdt)xE8wr)5L$*%>bBgd%M%J#DSM9i1&rojpxG9bKL2_M6&zHgvUG?Jw!P zxU*|phMFrqpPCtFcTdySp0v!?uD0&p&aNIM)g0{Rt!=%{U9Fd=xiYQWHf`>?oCd?m z-VLF|#&D<~VYUY|6$uHlCywdKMS(95i?~RM;ZPsN@Yg+-z(THViAAGfS>1`+_2J=g zJkm#M4f2!>#}e>Q>48^YC>rjUiRg?W{;;=p4fBtCn3V9o5r_iI>dlCEL*ZmN-igQB zUA?`{p}t*EuRRiuf~?lC#F~l3blbDgyGKVjM1=b@3MM8>*%Thy5sptJumvxU4EJOF zLpx$osdkMZg0q(k#2i~gdrc+|*izlajhNOGisP{o-oe|`-B>4LTx1$3=Tw)VRlhQ@!WOBdSdD`OYkB_vR1tMhuik` zg-3Wo1f84&XAVHRYEyB_l*`6ZDs0;s9!3r`3a}*}Mo6PJ_(XqyxIeuCP)lrRBoYnB z#r1iM&X8KeJ4Ocw;li=uOA_ID3+5$5goeDEw8vvZOlXN=_?WN^L%MbePh=V*B~`Y4 zYZprA6B(|iL<0UB9qWlCksqWPTVvrwXDq3fPsc!ppnS5O=Lhb$D?^YymGhMh3IZ6> zF<@3Q6t!k1pqrvmMC2S9@WIeTY`QbH{8_~2lG^qq!@~(obcWj+dON1&Qmo)fi5g~VgUOvT9Lc;W)R!C$MFr6v9tt5u_962LM~Q!eDoV|fYc_=T?y9w1pte66 zwKQ*!#1qM`IL{AtsO>|^k)4F2S8KR08j5qC&wC4Xs7=CxI6zr-wt@u9Y=rC+UGZ!_ zneJ>vdQ!}WJV?&SP3us1Y&6~%#>DJwiVnu&k>t)HQ4-#iNXFr4;eHNUgiR_OZysw( z^g)mXwT2allLvNsCJd-Cw}uBoqtWCxh}*2jmq+Q0S@p%v?R;|iZyMF8jdB?>1VhtUV|>Pu+Fq-c0G`d;gDrSi8IkvHoc&~LN@G=bv3Q0LnBnF)QXY&} z*kbtzmaE(pM}WA=#YjweY_Dphk^)sXon5rZ4Bp&Ew~U74V_8@jc_U7btR?X=QYtJw zD<)A#+Dalc19foHp&Df&o8p5w=nf|{sIB2aEZs27$2k(`F6#J;^idJgtaEoAT} z*-S_gYR!aH=@pL*Mi7tTfyf?YB+zg2Sw^VfjTNrmHyV#a*|vS*zR~pPH;0l?cbG!Z zm?WBUCCsr0PZ*6olO31qa0M)3fi^|@;;}?*Achtv3kU?kJ6QgSOkQTwD` zZEj$c6^hyEBYlyidF_!Fz~N2>jWnuD#RfiYr*Y}Xt!6bA&!({9VgnN>X23LqN7pbM zo_9J+IrdnbW+UN#m3Xux%}5iilovNBJRN2N%usEgD&>(m190q$M@E>oBSE2XU&5N2 z3{Qg2GMCvbyig`PV^F9+K|}Zpg%dKn$cs9#MaKt_-KRUVb|>ZJSRLW`o(R)b;)mUe zw;KoYKB`Dc zmg(Q>z&43#a-91tc0#(WGOF;T-I-dO9)_WE6pAKDygor&V~Ob4@FhvyBd{Po4!{Jk zMl_uUf*|LiEJXT1BU@n>;Ve^`jymZn$vWc7yqR%88I+f-swpRAOX6@RhevZMLvwYM z+7OQ7q^P*li#9P~nIK=8xHjR>JYE5a&>msAFWn2=P*+Ej46iF17j87x~G!JN8e2bS?~3=brwvNbZeQ`I^WR(RmyOHS7nH`lFc zGmfVmHTl6yq(y~TRgb|y)DlW0;aI#IsGAAa&1#KA082$M5*EZ)5LB{a4dxc^uqWIZ zM#bC>dboa;nHCzWA{7$m~;Q2p5Y&e%fUu`XIJjgb6!UUPIoIEZ#nq zuFJS4i)?2bg>v{>WjC>wS?!MS4V=oL*rt@(O|p>eCuW1pdDlcpE|JL#)LGb~Sq@~v zk{z4%?z|kUDL!OU;Pse)+;8HNvR~c7X5?F~Menl^IiigX#YPhIh~lm!IxkYkSdC( zOW6rT9NZ#iJnNoa@nI!^;Wttkq2A3WD2oKB%}S=i8xCm zKqtp05vktnF+;yOYK}&^m~>P(IkKEWT{2lMd1JG@Asxp}qB>LOV`WzJkyeB^Tc-C6 z*3885w58R`!sqUbSqE*|Cnb>ZTLn_dIFq27hR5)p6ld9+aA!cVkzOk=mFT51%{=;XAiBjWjv=3h;iQ`Kt3H%qK7`|pwLp$*72NXsbpdmbm zfD3~!0Ir>&j^Yc9Ok-?-1^~rqugRZ8Jpegj$WEdbg(QXo_!v$MGPt)sP@*(OnsYxC zIe_0Cy9APP6Al{LuL3_+Z9`8H@Ud(ES$~4hGT_B04uYx8Mx&T zI%dwK7^)vCoi8Sip-c#k72YLM0(2$5n-qq+Neqb%^XK|}N0!3%ros=kpm7xc1t5a$ z-VSx*=m?u4o~;l$01lono{POuiU$!unLQ*{jMd^#9%;q?q55MVVAJuuu>mRd@&6mDvs<&{V$nctHB%umNUq_mL0y=( zxw1Gue!lBc3;<^o43g)b=i3@w943mvuuM^lhbJN~^g)^ZiOXkDr~!O}U>!c!zzc`H zE&vE$QCZ)ODGNa=!#pX@jpMTIaXR)}6=8k-8sGOM8yYeSp>a%!H*}-Iqp8YA*0Pk>?fW0#->`itUX76j!0_xy~Uo>J32cczW$PW zAwS~pkd-(r%2=HwOn+wu&pyEHy_2WS+7>%7Ahk1aDD8sD*;FbR@;aTkHJ%U0P%Dgk zWO{xqnb^kiUn?ADG$7}d&>EZJwl)}?H(;Ko|7hIWj;)xbA}cUFM3=N+Lf&2+RC`?Z zy4;?Y9KiR3-@asa7hZX4C$}P&(wz0~O*?plgn2}yZp$@mB_H7E5l6&ah@>PN!(PLy zUFps)J1AUMjORYtnR)x6%k$$@wxnjvhRW%JkQTs){??)lqsMHEWVf)m5x3Ls%;_m_ zQ+KzZTaE&|(45nggsg5hfLbpdNO3qYTUi*JXADE@ktcuKI!Tv8@u;k5jwC9m=SLql zCa+0Oeb`8uq$vnlth^PqSO-qAR1)*gl$xK<55qhY9{net{nStZZ2o#VA-*D z@&RNl$J;vsTj~yuY{U30B9ALuuu9|DdTL~Bs~8q&CQo7aU`tsWFfQCBvMGym9&0Ul zWlL3BTXMGKcA2dxBA$|h3k%^v^*9w|drTNMW(#uHyh&tK3Yz}LlQfws zmQ4N`0Nxrh>f~At8OS@%-DuX3&fQR2_qmO|Hf^r#@lQVD+!0{Cr~dwILs0u}EvYrp zgH^)wm_OIq)4}Gy&ldJ@b*X0gOkdmtQK5N}(k}KY^llV_fA_p7xOg1QF+IIwd%QZf+)8Ctxt(c4>E>Cc&93UHbDk3Vguf#E)lZ#N1_gycgovy|NQ3 zn$EWaN!(9xVB_0^0Qfm88Noe*qLGs=mc;KH@gBwzgPfdRVb}8Vyz>cyPp0Hm{K^%n z(vr-rcs%>?7f1g}n#HA{8pzGzDh-QFwhGS}F9fR0#&LRT;)f>7e)8?Zi;DMR-dU8- zW^AO+=DgRiRAp_ICMzG=Woowy99ku3Mcg+B_fg2?JAycVT`rTF=O(Q*$FfAm#(ASX zPgyXI8Hi!#*jg%m%?%Y)KRF*Sc-CiPaG}xx(VhK0Lf6O)P~=?f#a@!Rp?aIPiZx5G z8=&7_q#L!!Q-|`x5`USEFL>CChQV>}S2s-Kl#mSEjE=D(H8ChYGW zXsQAP3*ZIx*6xz5)Q%%BPoR}(t1CT@${gRVOF(tG#MejaSkH@yH{wiE!}$@Vp6h@h z_6fCShRhjN=R|eZ$iFtTBA6BP-s&*2W5oICh``4~j!k2d%1pd=3A|;Ce~X943o3Jk z`PV(5M|&`x)~W8T`QLxlT;=Z4RK%ip^b}4CSBTIGV6$a!gcrTM4Ya zbLFI(+%>yVynDCAieap4_C!7jD{rTnxmSv7fYtWM-za{o7Ymg7*Z+8o;s}?SOAe(O zH8}FHnbe&N=W3HhpSNzTw{wd^snc&aYW>v=vA7H7W^M6#EBGeO%Y}K_OxPP>P~jcAw5*~K#wu= zRF}Ewpq05jvpjyAPNj+}^wr`Uh?&HR{ejHiNb=7e{)7Ti*$4w-jSl(tkk`Ar2)&(*RE%kOG)oK(znmBbB)sX5*L zsQ2RA9{j|`AAESt^*{XDPuyf6O|}Iz&1Fa7E9YvFRM$8Hx>ht(fSE-OrjCal<^FeQ z{*WD{8B^TADY&2nHQyF(7QP>9^JxA}4*Yz|%vrce)QXA&ZmkF}-}r95NaT?}bzdPF z{_#=&CRAt6VBvtEN|B@77uF5KaFi1MH2i2AH*sqI)M4q{7r}RK!93&}zu8-->7sxy zg1+n?C^%l2)&wYz(^;hJx}p2VoaMgMY3PSOTo9CcNh`7i@C{vjn-^MP)H)Z23rH|K zb>FBz^-Bgu?E&(SyVp4jeW?!u=O3TxAD`nNuPXPAdo`DoBHKT{&_banKwt*pQ&9aO z|9Fjvxz(G)?+K9AlueEy2S|qnSTH0jF`$$ZW(Qg<v zx-}Uv3*+v0@;v!c&*JwDl*Lld&h(AfJDj>dHLi=;aTi8CzQvdNToD;4{o|W3ZeWCZ z!shUg-{%hKx_^8r{zrfQ5htXTQmIztbo!G1A>F^b$T#X66J1ZivY2&NMu)v`72kkA z7~Jw&VR;hs?oZuWlr}@^4s+D0J4&2(e=6nQ?N8n1PaT7jnL!`HwD^atksm36^qVn^ zBhrgMb;s-yt49n~Iu?#uq#(`ZVQw(G1&@kenx&=5tizu`g85(zQFjwcm?LAI)Exl5 zP8i#q<B zMKd>CgoVHbEMbgN!jy#6(?O@lpZcEkbHblGp{URC9H#E{r+$=1ose<7#HErfVxBX_ zJeM`Haf~e8&k2*^1g3AsDyOfg2on9Nm;I^N{HfpiQ*ZcFr!YhQ)SLcs49E_*5g+!A z`+Vc&>8e^un&@EXzQ)UQd~AFv<`k}vW@2ey+Aqf6WUGw7nL*eEVV_0tN)<&AUSObG zVdMMC{nueR7tNdjkM^f-hY_rqeo`;POk1A7mc1E}?slq4Nj>d%+DuE1Pc_Y`J5>BR zDrUPgZI!gpJ9WRf4~!|2MWjsQo#GC6PO*fV!>hNR)_Ch>y!8R6+dsb2^a@#KYy9I) zY}xTPtgG>I*5Eo{K|uFkhcQm|T{n|4<42}CU99!^QmZXb#xH%NMLNtZf)HnUN?qUF zU;6J)*ZgRUtNzgymwswl=Tg^aFYJAn?|YtAsjvQZpN3NZ#2YxLLI2%O-l=DJWSmO; z_c(Z`ZvTJr>gH0u?)uMvGqq>3l=s};b5`#~X5Z{v@1tJ!_JwkOdiJ+aQ?LBT7ZESP zzlNh>>iM_3to~X?XgFrtbqD@;84mv@ClX8K8=G{84nmR5;Y&TBeE#*^%om1SIc9)sG zAe%zce+hoTTf=YZXhkKyqz%cwAwTHuOClpPiX;V|g&Z6jAYlgy`}xcA7@z7v=8j#i z1Zla8umZ@1EdBLr{sumNABR7M@8c!`t4#o`___Cz{BM!sAJxP! zGU02$VSJcZ0rmI?J@6lX)<>gS0jm4Lb@h!a`v>ZmE?-)|a%tVblKLHejeYe?8g?vc zs9&^}Ux+oG~Y_;+mZcOL#81nt2r8grF!k@ecz-P+ys>IMJ&O5dYRAFA5ie5mHS!z^R| z{(P4?aDHsZ)#sZobAHy(Ou)s?&u6Y3>EA)!8=96ZT}Gz(Inzw>7(&-q>_0nk#dn{6 zG3;6xGVs$^)@vr$0~VC~EY9L1!dFM*t5`A#8uzWRI+WdPJgve0;Va};J z$$8(JbMd_Pxt_Vr^G?qFC0`hTFmE(@q%qr<=JlgiawR=Rx9Dj(1A2K-%i zlBge>l=bR2@Cj(T6!-4EDBJMsW!<>{?82LAy?A!wEzvGveZ=;wGir75>fo1p;`7w< zvZ3TPnf+=7pg}6`S(+~;q}fPY=lh>?-3LK|~I`fAbrnkKxL%PJzE2WKiup|KmRT zaOv}lKc;Pde(~_WXtHiHVU8z46LsNGJZ`4y_D1Rw>3CfjWm~+dzMKg}(^k9I<)9?rCs?RyG6T+6&8uuQBNJqm4i*6L7 z&^NypQ{iY>q#rKj>lch#vkFoTvzpW|=wOEyQ z5Jip43F!AW3W1|=N+5F*C5=q@hEGWH`V}@ z68drXgL3Rj5-o@sE@vB-4dK$KY+xaUf zcs}N(X}-g(!!_}F7fl8iGsT(sdz2fh8^E#z1dlV(=%z`t9_5vKb%WDfiqf3cey3I1 zZ7u`h{JOJR?ODz1E-!7mz^a<7s;V4*$N8nrPQbdhk~vi+jYe%%iNB=0w5+khS)1Ry z%(c>)ScUEyDzxBoh^=x4oWToFNW2|XTf>`~qgwfsPF)xi{L8PKSaBXtfPyPXKbMjwfKYM&u3E=FTjgHlm*y;jwz zL@hv;a*kN=ee{_4C4%sr3ZyID9mZrYa0SqCnA(v)CSk0?&u{@wsD};L`+Z} zW~EupimLLP1p?%En3y9=47$-x7~8XQp}NZaRh9ZnS9<)Vm|)n*i3!uq4cyy>09BrV zCy43r%xUW=BG(2l20eW#TdT}pwsM}o%-qNn%PC4-If+#*I>FtrOR+!MzJjrNjKe%a zvlB&jF(!#SvezKQ&GZ_$rScjyf!AD{^BS(ndJW>G8V{ZM)z36sE+=f4K+=eqr+zzv95aF4l;&yG_daV5WRM1Z7#}cu~2G!Epw>1d4{keerOh1p*h3 z2UA5Z9?$4(?DwJaFoRz*m}MN?CF`%za_Emu9zF%zdpwOUrz$vCx}E90&~>F_ zPFbT~ix~Bi(~8xIxP+|2Z=^9nS`%WgZUpFT&30hUASTaK7SMtiyQg8TZkU@;;85ul z4Bl>I#|BUa15Dz9RaNpd^LiNl<)=r2=GYD|Evyz4bF_@fxm4^A#O}s}M}?kC#RLUA z3?WksMI8;-XEQY>Bau_B9SYatv4n@sVDab-{eF%y^5dQPYf;J~RVVVqQb8Lgl z*%q)b=Qty{df2ym*teX9xfyt3Qw27?EhrsDxO6xVGi=ft?CQs|)rhO&e3)3ZisoC{ z52A;a{Wv-MS#6l`FwZUMYC%>7j`OF{e;N0WDMkPKQG{TJ(>RKd>~J1o7(~kC;Ygpx z+QUB9GzY~x6tO8(qX<94uF!OKgVV*zI~$yC^9nRE;RQ}8?Ka^vo|RP~bHQy6aV2cv zMAfie#RaPht|CH&4<6=hC^dI5-(qKJPV&koU`#H}6Ij6D1(uUx+x;$GMkUF!G3Nxb z7%bJq&tcIAgV!Ce5nZd|knw&9o2v@EZYBirbf%ECtaVK&}jnUf$U*x9sn)^_9m z!gfD3Zow2RIEL*rKkY{>aVD>XHp?%w$m9^!; z^VwToUt>K_Sr?~Ja3-F+;3gDp{op?26aBDiJZZSN=5fA>4xB+OR-}pf9q?LU`TRn- z+QWTY4s4hqU@NOY=7OQxi31xZ!l$a@f>m`H>kMv@FAm(C90V=XhFQt3KFm1wmJg!8 z3SNI$W!Nj#@_!YkmF17+W0Ce(S)?-Toyd833&or}T#0+QCXC*1fo&E9OW_n|1gN)h zh1(oMp}f=_$EC^&aE9cooBKVns5 zo!@C5WY*F^X>IU2F1Z_*`(5TCRa}sG3E{hDxYU>xV14buw0ka1XN!}}Eu z>uDQ)q{>+38t1niH|l6xYEE<49=~V9L507KaU`#4SX%1{DdKS^di`EmhHUE%ryvbS zCpkD<11L7sE;M46s@xc7Who7U!`bl*NQ9(o(5lqD0T76Uu(xyPzJM=yBMNfjs5o0w z4fpp~;KcC`5R*4COL?F?cryweJZhBx5amUk?-8+bu>Wm(;#BZQ;K$__xhy;DI)Os+ zj{$;Zn0$}3V_1m_U_9U(LXEvUIPZ&ROmBE!LSm(~p&T7>jp5g!xx6gAc zu@>C-Hjr_-T`mP$c%em^tK$ps0a#VEP+`s1!j-QDSZZIx@RqgxE(wv?;d!>^uy!gQ z&#kVuMJHNncmwzo)>$-FuI^Urc%y!p9eG)kWBHuMQboiOedY2(d0Al#YYTUi=Hw2J zm~iV{#N=H3a~LYd=}+!{-SN_upgA)_N2039)KJyg5MT*c|=yEMcict^WrW?-12}iCokY4NNVPtpr?CKfs-!72CWYIuH;rR4JA z%XkL1K-f{35$UPgChyHsp`2JcbWTg#mO5ydcSDZ(E&wD`d$_?pCI(^~2nmQ?Q0PIPba$Q2`z{!|wN@@v`Sc{tVvusyU%3(%U%-9m_8{FAL@MNLGUhgF z^Qv)IS5{-ub_BbY(oYd+FmKq8a8z(KHDouQ+PRi#6Wh2HMxQv@)dn9#;VAR!hx-a! zT$OE+nAw7Pt)QCP441)14k6g6{UvEkAfFT#qIf-u8xXt+(iJJ$08XChGK~1~ys<6;u?QYo+&2^UuLuJ;!`6 zF1Xj5xB-e6MaI|B>Z3DS$<~Cx{}+&3us89|EZ&>E%HAsety~4|7D2n>t)f7^yi6|7AM|XUYdqiYE7-B>TViLu(A##X#|5Lal9+?^oo3Ss}*-^ zU3|9|xy8y{T9^Q%NbXa58eGjfEg+I`*wKfhom>PnWo?^MPoj$=PS`due##AQHr~>H0fdZvcL!3 zkNc~rADfVqe&zm5nUlWexw*oL=*#e_Qid-IyiF+2xS7)GW(h{w*S$_!Tg~tf-Cy^5 z=pxT^eh)P$_tzt?w@|k5TtmP~MFBb<$@%JV)i2FAqH&c+T&m zGxJ`?hdlp2k0~AVS@ID`aFSllGwVgaPWmqR1GGzY`=V&|d4bPKzwecPC#tyLy%>>) z{x575pzo?$K+H}F>+=uJPVn3*x_#aGc$JgVeuih9-21O&9kVpp4Z7>`K85L;(%h$1Cfq2TsTH5- z<~ZAEi_~G`Mco=?e%x-gVC!%%Cdb)T6ZPou!ar9yebIA* zXhR{}AA>1P+!whVnhyCxr9U;L(Jqsr)I>HwpZP zaDEDqr9A_l&(ZUMpVt^Fey4C&3;bop*M;+&+1m4c++&Tvk@C|h-zG2xxUCLTNjJ{D z6{(&^S7x#AmEoC!EcPQ{Z_Q#{_s3ZbYnbj6>~rpy{jZ?zVTIAbvR{|!^g@_jWFiMx#_g0$AGHg12VJe# zd42SLgc$DO2l@rx3i^&T1XKOh(nEr&{t(JnaJ#$csky7YwbU-y?erk82eR0ZcM-kS!mbL8co)+N!Bh|RbY}r}Ujg>8!raYe*J$QZAr?g>kzJ zXuiU*0;Ygn6HA zTc=SI-7DB}oOo~aHjxWk647ybhjELynW_a-_FP5hS#=HC-QHDHitWnwo)+>8cARST z`@Ai*-oh@_AM&=+Ll!oz|CP6m{>j4LZ9ML6ry#aD?$0nj?Oj99SXig=talv+vFUN$ zi1GK{4!Th=HHHoJCxR)>HqgBmrw3!$K>Jp4J5_ffO$v6L8nhR@7t&j>b=q|o5#Pq< z9=?weT|^(l)@iS*i|Mn1DJd7zbAla5PH?05V!9tE18(<4deOU)PFdJjv=_aX(6)qFZh`S>}R zci>or%m`-<^->Zv+5w72yQ>Q6`8>0gKkv-(&+*C`2=Z-CMY$udFGX1meKh(@WGgzI zE#q>Rz$F4Vi-y03CK@qCCq+?ZMZeZ%*J@M+3ux3U{DY9G(RVOXjlK#V-6|uM1?8s| z3?KF9=pW82yM;$d8xlE6nxd=_nF^{}MX$#(P@|g!=C>LuDJ9+`{eUGnFLHS?pa(hF zt^P{t5ZEPfK;RVucMA*&i~?#j4Ol}r11_L@bf!EY@DYIrgy#_|t6D;j&~v!C;02`x z<+oI_`|Zt0AHy38a<$`EBOXJs&Vb(+7{nGgEHxS4CUvle?qV7 zLzPUqtLAxHtgowCrdO)7ZuRd3+$K@)U#dSt7fFxpLT?v(J1P1Xyp!4rY1^t# zRUXvl>1FeOLi6;Wl^xMKwBhQvX}!|6mzc9l|0~~5(BogC#}4V8$Nr$USw{K@ZLj#0 z1|!sbMO$pRE6-@H+J4thwcQ%G8W6a`_*M0a9l570^#B zE747Xx%w;gsPijYhjCl=2EEHDo8PNX>woXN3}t=(5v^2X%78J~y$zg+l56!*(cubX z$^0ojW|bGse+acD-X{Uq`TkaCt)ADf5KUesmi#KQoL7lu?lxYoavN6|i)$7bM`+r= z*0_PnYCc0z&0jrW+(JArQ6o}wjdsA$+^ji|cSIy_*sYAIOehjgI&gT}qWbG!BmD38()U7s;-Ha226dqw|L z^)trp27B^i?MBx%uq|6)O5^dqB6d5imAZY7)7tkcssY)~k859rZ!9*dE9X1>`WEjB z$8LSlx!&;*Y_d~(NM`>bnf+(AP1PG6&uSy^E5G>IQnA~Yw6}xug7#e1R>uoc%XZ%5 zc)w-Uftp(#Pa53UEAaMDL;hW^XB>;Q>cI1k4-3z;#-jP(cKne3tl}BRltDGeVUt1U zc_mMX4o`>3jL(ePlDd-dr0Vy2s|aVPvJbh-}e+gUwNtgDN51--?LJCM(AgRen#m3gmQhw z52e=7xRs%CD?{T}4vp=w*n+Hoz3|ivPrdMTYBDaN_Xxd5=pktplG?D;hNU(vwa0~W zTqwtda)a=n6#7Y_pVZjqr$oY2+I~9fdrCVD%2OILq4G0AIU|%aLNWCHbcfH-na9wX z$Dysh7-#VgK1zO>_v%$fv(ae`8TS|;H&!`rbbQTG zRWcVJj5bgZu#p@Y&Mxy`cfr7V9^uB4cS#QJ;O9%N*R8nY%f%dp=v^f*&%(Dvvi12G z^8&oj!+Rk{ya?~}(Yg-fUX1q=yz60+rFbuc6_#UGE|AYa_|}HAWEE}3_^-r>Z^L*u z;{>yr?nC)Qbf^9peN=yzf<_yC!B|QIj-_;!V}%wp)@VO*Xvk{ux@cp^$VmH03tco2 zkEWubSoHeH#=RD4V|ZkwH=3M`g{FF9p=46{iixdjidv74jP&e_g!d0khQj!KXdu2h znoJ#0Y{iYGEvvA;NC;FAQgMS>_@KKQMC;5!fK)7@eWZ{N>JB6^%5W$#%399SWPMQ+ zDA!8;>3DcgD-EV&vC!UF1jT{AczPm|u&}OhDr&~_$SE@cY$!4rN`z98(V?k$Ds+f# z!#ooc=@d8YN+d#4AoL6^y=de5kr90BD-=u4qH%Z6=HbNDrbudMD3*@kp-#&Pt7jTv z25GfYes!+f-l%9BN=)r3s#Hvy05RN zy}hrmZ!JpwJuNNky8G6)^!4|*wXSPh*RpPyhw(pCL=>wCKtD^EtV^d z`wmSer0wk0UEy#fnS_bfsVQ4Ovc5o!cs@uQJBrC5Y%xdEvB*ZcXj>wB5MDGeF&T?Y zMBqv6Y`u|GC>l#{q~5l*EgkLMT`)|?y6&~>Ti5ihYwumtzOJXe8+Phmy{@aPyLD|} zdvAYxPy4#=-rm;!j`sf5tu3qDyVkY$P~Z0LBU^?xjcgtm8XoDpa@+QizQJDVjfTdD z_L=F}=ee15FkzL!j4sIG5-iCCbyu#oP4oyN7 zST5Rz_%RVlMG}L!Y}`LG(j5x#ha&yaNDS3#iAhwLS($Bnj{2eWB(LDeXimZ8OetF; z6MG|xnH6l7%cJp8jDKRU8I$7HNkl|;PQjRCd+0igi34DkJRC}(c1t9+&m5(AB$Z5s z;-iSk%0O{O!x2FS@g-vf$bF&2qza-!h%HOD+=A0PkRCl7s7P^OB9cv^^b9 zMJFO+#!JyR_*q@HGHp^b(me(JLZhKnNT^)hkNBTOvgQ>E2m0(pi7cK~DfF1}gAulK zmNJl(DaqpCz+#TGgK;CCk3nU*BqE3|)Q5Q<9gU1;V=?uZ6O++cBq8q1+gPruH?lW9J`T4u<2#a( zL=Wa8R|yR{u=gj-39jfdG5pYY9z&LON3wvfq{`N4ZwT2vH`|7~l1cbvY-%`~!XBDs z>@_3FK{KV6#K2gtLOEMM&(C#cVt=kewlUt*b0i30!oZkS$knKIFoWC`iy=4`$bb)q zW>T}AvE|Ppwy>)2P%08nVxn{0_R#w=EjzI)XRREFkC}-HS%;z6Il16-W6|-nTCcet z3apq%&c?8=cqle?eI${q+a4Jk3XMflQ`@m!C3AG;KBC9=NGx*)^WyxHP1evaH!1aU>ey{aEO^WDQZuPPG+JGQ#n~9HahNXk18~7IGe8<G!z4uTbvnHG(w#`v0oSx{rgc_zipR5r_tjAkP} zS0yF!Vn0DfiFIF48I2#rX>K&T{}xn^A-ty(5rnQh*}P6zY{KN@fRwJYOG(h#yu;XD zu44U5Rm=?Bb~$X?tWGOEdy| zaT3D`h&t~fzf%=i)*^bI7BX6^+Fr(yF)L$KdL^RcQ3O}G98v)p3G|zNS`iX>mxOPJ z(}@I>?K>0+r?aEq7D_?gIEA1wNz~#(gkub@Fd8o`_Eauo?y+VC+Y${Y%%nM%LN<#* za->g2lg%pqvg6X`X#4;vXBWK(M$vzCEE-9GgGKcnK%haemB^a_nI|N>dJ9so4O<70$tN;#eDnMjOTU8w3gKCzBR7M47 zHKArAzlLpQj?JjCf}<5Ew#MPyyqVd`+1V*>2(YoOT$Qoru!3^QrQjTj646Pn+nc0N zB%HJjpW{i=Ic6%Kg{?kYicg`@Bu(HQiX>%fkiraLqfLw<2xmL9_Za2E@cl^QV3g}s zj)pylcMk{|1F(+R)*|hSo19uAO9Qv0vP|iX#3JKJBCS5{v@MxU@OVE=!bUhcaju!~ zfvQT$f)RNp)Ol$Z(-gSwIqZbYRwX}?S-Z2ewwwq<G{t_<3P6Ot-f2R8OLyQo$x zG*_pdOCvEH)D(AiT_$IZGXNy;WvDvegHtW$+T5ZbU0BM2zej-LwSxyn(n>{D#A z9JB2QoCGO%5nr5CdjxLQ;aD9)vdNZ4sHUy5q00C-N5)c8*d86`{?Zl}%WNdP2z*Jc@(7I_R@fb~9|~SR+D_B`;2bfRPtRFsbl^gOR}q z3RaLG=JGkFSn7D0N>y;@6*D%VqK3TD*t}tt zZJ$e7<grf(*VztY;gZZ+ z<)NaKs4FpH)xfJU&A97_TX&=C4rETg-CFcMM2`Ta_~^ zalDF-$9Z+nsFK?eGpOCjVe)e{Yj{POn?=pp3))(=?ocwKtgcQKlGIssI0?nfBqB1~ ze`d8B$xOO^8+K+5&YlQ`si~PYR`j=0DXV{8{)Lom{Iodorbpd*vFPfUnGKZ|RZLh+ zw8N#vlMTS!xkY0eWqZz}7j80nXHVI5WYzNBYANJqPDowxDSTeR3F#Ibqsg2cvGX{I zbSfhoiX24tmYTxNqDer!D!TE^?f^cOYQystEkv334AVYJkV)6!W3544Q>dPxNqkfp z!8Jm0P$GCFy^jvz(S-p(#?0~EgjiW_w5UtiA9`8X_41aYHYXbH|#RM84*5cZW zMq}VegCm97>!2tPtPU`Ln5-3&!f`pvX=OHAPbxS_Gfy756bH(pdu@?i8;3 za6Krk_5!N@qLw-1FcTYqH&9#6UPug5XgGUNmt<|OERLr^_wU32 zkn>`Y><{b%_TUmQkqN_c4G*$TCL$sAGIFhWUDz7(;#47kO`JemHTD=d!orp7 zJ!e*qD6K>nzy1;MDqt&*TXupyCSH%$#qIKS=kZR!sYY?NwU1#GVc=?g=0a7W?s(|9 zNOxW+Noko7m&=#KaeOaG}=Xdw{&9*@23u&E6^ppt#x@IFxRM$=OsY81g!u zxm~V;W2hCzJ#u|GCun<}=0aleZ++$zI^1S<*C?!^QtscP@D*KIBk@{XOt z9|s{03cM|GcFV0C+kOOE-h&G#kH2MLg38%?92~Fz z(Ay=>!C`1GWU`yk#Y1o@l_pI<)*CyfBMJ^cj4~si={diAW2bO?1LPs{rf#Pr?8%&! zPRc5XW+#YqS3YE`!w(;V+0%2OpEm%?yudjWZ!>Bs;FDJ1b~ddtvf>*K_S~z)@r@57 zKQ+zWq~Ii)Z(K}C5SZ;e_eL%LMIIU_V+s7J{QdWPK%XAQblSP^8?(lL)m#@ro^6owH@5oQ<<*@&QGi^^;h8ua}dW3fJsr@$Lf>E86z0_)1Xp3=k-KTI3VpJ%)9`kVF&r6qt#by-!<)j+x&gS>RcH=gA8+jV zM9D%4+tDYVJ^9{K#F`jB2t{S1z=zvn;Df-`jTZi@*Bd>4QRYX#dyFbfq&bx4)Zoa& zW>P0p-qB`@K5yJuZ|1B?nbU7JYW>~}v0^LC&D!EY2KXk`7vj9^iVuKPGb{CqLT{Wc zEO5BsJd;-sZ|7m)v!B%V5Yq0@o0Z7P4c|T4ik@N^)of=$>0!?7M=t6p?3v|_$tud7 zD4X$Ex4sh9dh@ZRiLIhv!CZ^L7|pgF`lqO>>t3_-nZ6lj6nBI$iTE^f{S6eXX-5Frftwlz@2N+)~gKURH^c{|app zzDMNnXn`%xN{tpS!i^TqS5a50`S9{jM|B@0Ib2%ch{*9z;X77ZU^?QTPM5c6x(M@6 zpGA@8PaWA!*??87r0!HwAX$k)4Zh4P%@>L;_o-$gn7O1-;?kfrU?B6( z@=8s&Ee!iG?OiT5zCZIxA7;ZUF7!{YaJuwB=4M^w-pm7^9`I-G@sR--nC`>CL6O?q z9nQe?ouzfU9++;zKc1SHXmt-X45WRf_F$sQN`Sa=@04ltI$eBPSCwR#{_6NqSm=z>aJ=h7k!0FbzjAyb?lum#XF z^G9_*ETDKTE}cCsDn^33n2A0>46Qsn(kNpt*v*=;%)?^156s0N4h7QioJV2DkKiAh zHjsJTQzvc=Q~01RNYhQ?grZwu`ce2Ln4uAL&wPZ(&LS|CwkR=&h*Iq{k6+;O1Ts%b zFSiFWx2ukx=BY>rGS6lyx624VDdrQwqR`Wpl&AA%?`8}t+s*A3gKGXX764WnR^53Q zy8J#Lqz5wJ3S?diWPTXP{5X*L0A?(Zc_onfc_8yD96{XDKV9OVF3lF z6*1G9kLUqRwdDo&T$j4k%w!%9xEz*2dF8RKpVpl|nb_M91t5l<7WB08oV4XRAld#U zo|9&8PtUcbS>s<}U+pojkTI@U?1B+mEuWCpvL-Oy!RDO47>g7(VtY;hxU3Fq>6O6r z&;8S{3gzg0mz(vSZn7Km6r4sIpAO@SD6C1IRrhm;tA6u*)3>g0w|;v4&JU~|T;u-W zB_nV3f7P=g^QqtOLrUf!cwgo0YQT zH>3Citm5N~`XD9$wxsRmRIL(l}GOzrByz;|H^X&{1-Ran+7s}~^ zp^ikI<KQ1rBfy#`#s0Q%W2HM-LJ&d9|FS2yGT02}sIXTR)+r}+364fsJ+KR2nf z+th&-KZ;se{Jkgq*FyMx418ZLf=BEW(u$wQ#vf6eM$LjWw&FY2Yu2p|wXAE6gvRzp z){nNVU$;Iy*4{DN772$#tu1T!wuW2B@N?QcLh@Lu16i)o4g2}0C5H8K`SRcve7`7) zCul(^9f&w;z4L&%LHfBTPv^v^v3Wo@nw){zv>e|`7UW&w(-F6pDWP% zyYZHX5fukpyb5pr0nT@#?wxsc%u&f8@3noXcW6)3A20pdTYoTf(|-L2m+Ne-@M`}Tzlw@)IVE~yu`T!l0!<{tW+D=iukA_gZw*ukT;tS<+p9YRUVSJh9}-C558@7yF-O0rd+(bMdiQ;kYCc;Aw`LbmqGh z?zyKld?(5vj*2SbXuPJYC@6PmZVXX)WKlmPJl(@8A`s5qkOpjU?vB%FE@CPWbJ>LAj z)jVv2O#a+defX0b#cRuA{ojVCuQdF&dcKTe3+C+C2wS$%T3B-pen)C8v~Iz*6`F_O zeSBMbJv6~@_JX<|N6j((a$pB2ZK&bj@e6^s1?~3Y8pa!YJznc&{?yY;>h?DKN*z3$ gy(Kr3IX!qT|C3&~$^VN;mFxeLHq)$