From bac4e36aa87feedcef2b9aba33c1cbf2bb6e938b Mon Sep 17 00:00:00 2001 From: imreddyTeja Date: Wed, 10 Jun 2026 16:13:08 -0700 Subject: [PATCH] rm unused fd shmem code --- .buildkite/pipeline.yml | 11 - docs/make.jl | 1 - docs/src/shmem_design.md | 74 ---- docs/src/shmem_diagram_example.png | Bin 219912 -> 0 bytes ext/ClimaCoreCUDAExt.jl | 2 - ext/cuda/operators_fd_shmem.jl | 311 -------------- ext/cuda/operators_fd_shmem_common.jl | 400 ------------------ ext/cuda/operators_fd_shmem_is_supported.jl | 199 --------- ext/cuda/operators_finite_difference.jl | 174 ++------ .../benchmark_fd_ops_shared_memory.jl | 114 ----- .../unit_fd_ops_shared_memory.jl | 222 ---------- .../utils_fd_ops_shared_memory.jl | 393 ----------------- 12 files changed, 45 insertions(+), 1856 deletions(-) delete mode 100644 docs/src/shmem_design.md delete mode 100644 docs/src/shmem_diagram_example.png delete mode 100644 ext/cuda/operators_fd_shmem.jl delete mode 100644 ext/cuda/operators_fd_shmem_common.jl delete mode 100644 ext/cuda/operators_fd_shmem_is_supported.jl delete mode 100644 test/Operators/finitedifference/benchmark_fd_ops_shared_memory.jl delete mode 100644 test/Operators/finitedifference/unit_fd_ops_shared_memory.jl delete mode 100644 test/Operators/finitedifference/utils_fd_ops_shared_memory.jl diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 7fdc1b51f8..84f3382639 100755 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -773,17 +773,6 @@ steps: agents: slurm_gpus: 1 - - label: "Unit: FD operator (shmem)" - key: unit_fd_operator_shmem - retry: *retry_policy - command: - - "julia --color=yes --check-bounds=yes --project=.buildkite test/Operators/finitedifference/unit_fd_ops_shared_memory.jl" - - "julia --color=yes --project=.buildkite test/Operators/finitedifference/benchmark_fd_ops_shared_memory.jl" - env: - CLIMACOMMS_DEVICE: "CUDA" - agents: - slurm_gpus: 1 - - label: "Unit: gpu columnwise" key: unit_gpu_columnwise retry: *retry_policy diff --git a/docs/make.jl b/docs/make.jl index ea10d7ed2e..b4742b34e3 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -106,7 +106,6 @@ withenv("GKSwstype" => "nul") do "Developer docs" => [ "Developer Guides" => "dev_guides.md", "Performance tips" => "performance_tips.md", - "Shared memory design" => "shmem_design.md", ], "Tutorials" => [ joinpath("tutorials", tutorial * ".md") for diff --git a/docs/src/shmem_design.md b/docs/src/shmem_design.md deleted file mode 100644 index 42250ddd99..0000000000 --- a/docs/src/shmem_design.md +++ /dev/null @@ -1,74 +0,0 @@ -# Shared memory design - -ClimaCore stencil operators support staggered (or collocated) finite difference -and interpolation operations. For example, the `DivergenceF2C` operator takes -an argument that lives on the cell faces and the resulting divergence -calculation lives on the cell centers. Such operations are effectively -matrix-vector multiplication and are often a significant portion of the runtime -cost for users. - -Here, we outline an optimization, shared memory (or, "shmem" for short), that we -use to improve the performance of these operations. - -## Motivation - -A naive and simplified implementation of this operation looks like `div[i] = (f -[i+1] - f[i]) / dz[i]`. Such a calculation on the gpu (or cpu) requires `f[i]` -be read from global memory to compute the result of `div[i]` and `div[i-1]`. Not -to mention, if `f` is a `Broadcasted` object (`Broadcasted` objects behave like -arrays, and support `f[i]` behavior), then `f[i]` may require several reads and -or computations. - -Reading data from global memory is often the main bottleneck for -bandwidth-limited cuda kernels. As such, we use shmem to reduce the number of global memory reads (and compute) in our kernels. - -## High-level design - -The high-level view of the design is: - - - The `bc::StencilBroadcasted` type has a `work` field, which is used to store - shmem for the `bc.op` operator. The element type of the `work` - (or parts of `work` if there are multiple parts) is the type returned by the - `bc.op`'s `Operator.return_eltype`. - - Recursively reconstruct the broadcasted object, allocating shmem for - each `StencilBroadcasted` along the way that supports shmem - (different operators require different arguments, and therefore different - types and amounts of shmem). - - Recursively fill the shmem for all `StencilBroadcasted`. This is done - by reading the argument data from `getidx`. See the section discussion below for more details. - - The destination field is filled with the result of `getidx` (as it is without - shmem), except that we overload `getidx` (for supported `StencilBroadcasted` - types) to retrieve the result of `getidx` via `fd_operator_evaluate`, which - retrieves the result from the shmem, instead of global memory. - -### Populating shared memory, and memory access safety - -We use tail-recursion when filling shared memory of the broadcast expressions. -That is, we visit leaves of the broadcast expression, then work our way up. -It's important to note that the `StencilBroadcasted` and `Broadcasted` can be -interleaved. - -Let's take `DivergenceF2C()(f*GradientC2F()(a*b)))` as an example (depicted in -the image below). - -Recursion must go through the entire expression in order to ensure that we've -reached all of the leaves of the `StencilBroadcasted` objects (otherwise, we -could introduce race conditions with memory access). The leaves of the -`StencilBroadcasted` will call `getidx`, below which there are (by definition) -no more `StencilBroadcasted`, and those `getidx` calls will read from global -memory. All subsequent reads will be from shmem(as they will be caught by the -`getidx(parent_space, bc::StencilBroadcasted -{CUDAWithShmemColumnStencilStyle}, idx, hidx)` defined in the -`ClimaCoreCUDAExt` module). - -In the diagram below, we traverse and fill the yellow highlighted sections -(bottom first and top last). The algorithmic impact of using shared memory is -that the duplicate global memory reads (highlighted in red circles) become one -global memory read (performed in `fd_operator_fill_shmem!`). - -Finally, its important to note that threads must by syncrhonized after each node -in the tree is filled, to avoid race conditions for subsequent `getidx -(parent_space, bc::StencilBroadcasted{CUDAWithShmemColumnStencilStyle}, idx, -hidx)` calls (which are retrieved via shmem). - -![](shmem_diagram_example.png) diff --git a/docs/src/shmem_diagram_example.png b/docs/src/shmem_diagram_example.png deleted file mode 100644 index b079cbd2f431bbfef84ec08aeca8271caed41f4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219912 zcmeFZXH-*bw+0$|Q9wmNN&rPgx=IgK1radx-c@>N5_*6Tu!7Qyl+b&Z-irrzJ205%drtpzhzbq)y=_z-X?43 zTbJdg^HZOm)URUu_omd}8G`FQE{&?2#PtZqc_b5S!%s|yQ`!?)PB23cJ~A^-N4$@5 z456C3#eUD0=U4u8LuXsypkRtra*SotL9D?5wf&nKW&RwgU0;g0V5_3appmJRVg0!8 zY%7{w&**Po3)av?kdn>7j|W5LLIqs)Ei?qfi1|AdlrPhleZ%&pJ-c%MCFO&a@EYi< zKV1>N-O+KA;gh3FkI>lILlOyOTGa6Pm>20a7J$>rQ&AnIm9+f@*A_h0-A}}CHt&=_ zTljL_69&Jy1e-a2ad8Vs>=A=4;p$mud7XmbJE36Wv2V~Of6z(rgM^iVvNaeC;3Yh# z1Q5No1CSD)5fL6Nga-gXoJ#y(uTTV}lKj_mQi=07@2Lr_008m;WrYViUPNn?6uvsT z`z_lfX>Swy9#W;n^+nuPyjqHDS~1c`yStm#LrhOL^C8A~Bb1rG;u_flo&ngVOtd_4 z8u!qdj8MZ&cY}CT{N4DcZ!mlG!cg=2O}sUGyd*B!cq5$W;R65>=_UF9^>7DEJl}cD z>_SY*836c)Lo9&E!i@4CKPVqac?qBvexcp&pMR1xz?@viMDytv zUrd$(KPDv0EBY2^2$IO^uM-&0^;jV4q)~ncw-FQAh*#J=p`c~I(gqx4C7N8DXyC%(8XWZ& zlQS9`Rlid+be%N35qXj)V3+5fso8inPgh1VF!nR=pWx7zEiZ|kSzVH~0wy{oiT+2# zcy&EBqcPUTF*;_o+zPyJ4VlxwmI&PAZMP;hEPu0?sW|&4GC~hSeS>XJZItNz>jCN( zi^;xFIL2ZUQ!Y0Dv+0Dww^L;YVeMy&Ds8F|!QrwOWK(pK4QW*e68*T&7ak2JB5tw5 z*7e)}y%zbUCqL+KuVHc8QCa3OyO6;?1FPW9=XzxPH+s+FAM9gySlQjG@ zzhQZk0e3E91SFcT+C7)Am0_ftr&SxNlc%H1`zfM+o-Sv9C?F`59~C_Squ%cborGE9 zizmyzcU?Cr^)&z1HXNM>Oc0MTi+AjLS)kY;!+KsawFS1+b=Tgvn|f~eqD=B?&XP={ z$4ARmS>wsf1vCscufouMBGaDfB*+aCPn*Kv)-lc-n|Mpl2Z*&1_qo&Jy@*&9>#1qM z>rt)Us@Q0F`EcgV?wGyA>Ys?9nU5NL=EX^F4x>+x+#L8o z&Ub&?TK*sF#kKF+f8fnrelZ|P#Pf5P zQQbpYcK)M8FCY;r-!36O=N?#Ot02Q!wQLOomq$5uL|9p~KSzcbC|zXIfTv6N3M5yvx5OM2RI?;+QYgu>0H;Cn7-AC&=gQb8rS|&Zq>ODybs-`j&FATD4OF^T4gtO)`T2a?%gj^Eqb9756tomkA*+6K7cj$M_<qVDp_ifQyCO9;_cskMvWjd{++eyAwl} zuVU%z+#{VFjlBeOuKW(dh%#PzKuw{UP?Y2eh{cBse|WX@BWd^|lNO)m&C z)0`)Lg4zFdNS!0~*qGw_>W}0!u7ZWd+H1)TQwQp)_j%Jps~zJuf2c=II7&%Ju%cCC zpz2EkF;6cgokKhN7E!lHDh@Y!NS55~6gBna&F&g+4BxGV69I^J@$ubf32P!)QdkUO zD|a_LPj;HrK}w)$w13V^+|oe)-xu+FIW1TEBZP9; zb)}Qr;~sTE&C2tgo$ZbF%Jm;^-x>)#7~dNrQ!R?_GZTP(GEx$}`(RpyfzL}I`}`u` zu@V6f@$t3IFfuq_B5cHv#OIby$71?49lP|+X0;S9Xl&7riSFP@%Co?h_fw}`KGU@S4?mQza* zWVuVp4_-mXV9EC)sFk~@*lfQ-32UJvLayTATy5Uje#OtU4pZRI&6V>Exnx;bXZ4<% zS3LdEleFnQw4eQTkjGkZ&ehsY;^6wb^)D5r}r^hfmVND*Azw=h>>C;iotf_9iTTiTSw5RK`${ z`Tq1Ln$vu@FpnZj+mhnsr3?C2?XM(5q~kRII6~g=5&^Z0#aA4Eo94fx_7$mrva~A7 zaq8DtJvm&6WkP)goi}gfQK)N~IUI-Wx?>A|4K#3jwe_u*l#1BYD-=MS#pg0T{ov4N z;woXIArym}ndp{aTbp14-`MVPBT#?l$J{L_13B z*-1DPobiYV?AYK0EiSN1*gyOdb)@V%%v)^LX0M1}09(2A3MS{s*{?XXPem@)eo*;? zfnSD%yeVxC9DDO0_@pWn&+u>a?(#Ee@|Bc?SvcpVXw|<8HSzEqZ_p%R9;;7Wq&gOP zSvR-t7FK~Zi9i3vR8le#;nu=id?re{CZE$q7lpXsrXmBix^H%uM^KgWN?LIIxK2B! zzPIuN^*^qF^6J_+x7^dD+Z1#_*LBmyM-E!e#RbX14-vH1nFgCrJ;PHiF#d-xzqmF={gMjHoE10sd2U~FHFUjXq{BISxo?~qKYbvQY@IzzFni2 zN&MT}2#L#_05)!>KAx`jgKXdJ%Ca_|Iw7?`3PC}Wt7fmXd#L1w` zs~fEizBKYJ@FX~U7^Ra2x)OG7%5N&?gyzt3pBO!3uT#ML$j8HdSo^X`s@|R@^F(y|g;*mfGx^5RH+Eo_o;%JK)w1WcA=H;^7QE|# z8EYPpHm>##;lHVy+xeP+qdSs_m*oqvY=7A-bRdfV~B_Z7;{YhzC~*H^_B z>sIpqY;w-2bDlBIkS6oHME`Gx=zx|U0%bT#w{)h{C-lEQ3SeA zriYb&NCZ?gE%5-O^`aJqtgn`;p4*=QK`+8aVpG=-s`~pyY7n1Sa4-Edi=YqpI~A*(PBPzRx6FB~n$!=5${>v*$1r5tAE+Bk=+;pE zl~x;7z%n<1i~!TSe-QLPv(u#u1f*}Vos4Ig@(F_qpYPIneb~?>5nLBesO#}xh-7fx zntq@!!$5FOOFy;4R2`T=GCbC^opY+RrZNw56qMx4rA3P4R>nqm6*CV#(=>kXnM>lt z$G0wt#|6Im`!!zjL)3QawIc!mmh-_3ii2|6>3n@saYN_fOeH<8>*=ui*kZTc;+Wib z2J%Wo=o0PDN+8aYiR%3F0mLuQdje{Lq}~551^y0&oMXfgF{fB$J@&+-0L$#*IQgX{ zl)In4Z(7yDuv$`o$76%Ka6ys~b2S_g-yx{la;Z-hr$A|~ekMGp!xDF2Q4t=~lLbMy z6AG*o)GXDXJikro1W2$K6FdI>e5s_QjD<$4V-Re`krr2NJ|WI8Q7%bG@Q6ZcJgQu> z@J2Oy>E}CvQrn`nL$p{_O2nC$f%j(ZO5VHBfNWH;$>%^!&;Gic#lW%iR>41>kF$fA zf|f0s!I0Gy*6k3nk)Ls+jyPT*q0Zx{bc^5>f*Dgk5leY)M$kxZ)Y=FqLg7NU?FW}~ajSdB43xXUp${HS97Rg*Y)S&s*mLvFt zjIshtd1=mR{JL@V=0$_39KzS+=ZHJYCb-nJA;aN5?9iddO`cVhxB3LX0s&@?&!W~Q zl~|TEocMp&4euHW_!voy`+1p;P5O?M$3}(!{`$E7jW$Zp95OO8J*oXUe6KLW#(v@3 z^T@0ycjpyg5s%Ki*+lKqs!*HmQ<*<-w=xt` zVut=!dF31;@|TItaFKdo7KYCZAsN^Ea-D*83baO@^^Y3Yj0Ts3|4O9NR0rxtm(&F^ z1TIrqS`|e}ZF={OEgV5gqNCm>U+v%TH}YQWG1ZfDt#*hw+FR)e>6PJ`@5IhOtneMB zBhXoM3&@n%YEu@{W~{=ACrs8iYB8_lVwu!##UNU`mnd7*}XhIx! z_dudbt?PVx?P|st`kS)$EtvL9vvVVCKfI!1DcMu=qxOaMr=re>_RYHb&J+9siJ6Cg zf)gRi4V+7o2}hdJ9u3FW_mAM1%QUCvSm)zlz$&;uWKbddt84!WroXKmvcNphxht5-si8+Edo(9(*kEb+ zInlg84_vz!E2pd#9&rK+-p@&aM`Ya&ue;6H`CoG zjyU#3cdNz}k-w7(U(Tz(%EPyMa`2D6=k8w>((dO#NKmyv1GGI(wQtRqFH&nf9o1t1acR zVamKalI#MLveO15cG5^C7p&qo+GPlxi_ynKH#m-~>`KgRNH-$tg@+mGQ&ITFDICwA z^?VB=Z2xN}WXMF^W|*uX3~Vvib~$5ielaDMMKr%{`sZhX(wXU&tM_? ze&w?J#MepnO4@@D{OD`y6HgB)l&L>$K1Rn&IU^dj7wXHNWx$GS*|5(v;nv;Bd>CI` zM$+ABuiBo>f)b-FmFbN~vMJ3LX${z^wle!Ymfk%PK%=!|>|O@n#j_Qu!R?F~6R*?J z+t(&Wp{zwiq1WL}+jOpNlXO3OOzY>q$C*bhruaRq;G+7&7zsh^P6#m~@9iGjz)Ia> z=Epc_fgOltOfl!O%BxF-vNd7%hD?hmD#8_iNYVJlLfqm?-k7@%5_wj?BOxW3}MsZm8GvvJr|a94%Q8o zC|7*HjeD+z3m8`&1wI&yI{sKa6%}@htGx*HO*iqKsYShe(EO1kd8u-|5mv1W+v>YM zY8z<$e#=Us#cpT!+Et0!-KeajL!p64omLsSjcUx<&CRB>&(8XwfodgO@xX{%T_5Ml zk2MFw3a>od5>tT}KftBLUvQI9n85=*KaM7+0rijU_{7a?!})rZq5XN<6vAV2-&cmx z8Y9ca37)XtsCiGHV}QE_6gVDfPL8?IBV{aDyVQ`{n6CYl*Vc4#l1{d2Ol&9ao@?Fm z-G9$P5Te{d!+NoGPRy?*0sR-myn>BOzL&Ays&aC;l~GfBbTLEe<5A!I2e=l1OK4jq zPoj-d!R2$7BSG-4e7mK?g@=NLKj z;u{~y*PTLs$*|KHYT7+zzXq5}s{ROY(RATgI?rM6;^o)Q_CiPVVkQtxr~4HBwRi1@ z3wh|KJmYTOstvl{lOdjKuHGYqzZgaA^Tur@nr9iDD8UqW*v8^=IGhPbMMgvjw(Tu3 z4np%SwVLevBy~os{OY@q^(`vkdfV+Qqm__q-@`r6GS^}IT6}2ptBdl>l;1lA8=v^I z?-f{P=BUQ?03QK^ttg|J5w;(P%p0wXd=Iv5P~Q6YpeJUo+lT2qF^wA^p^M#d`sQ$B zF~^>W!wZat$a}%|ZGwYDv&%N-(cah#i|T_fOe`MnCchkO-=JkH3fnT@t`AY%M9YO< zv&*7q6FY{CI)uVHQ=BErv|2LK9+9_il{7OTjhFbKVb?%j;rMGr<6BpMr}cBYC?N>C znn`!QG5+TrWAqoT;#@NsLy_rl+pJkb3rb!ew%Jpjuts`=Fm&CBv}zg-<-}WPEij{4Wmw z{HBKN<2L2ouMWZ-sIoGYaq9&z9h+M1+Q5Z*jJn)yw3)lNL_u7hyGVFG_L^PoRs-}` z**Z(%CZ;6p7=ziQ2fj2YaWXAHmM?ZiaVPuqboGB0x2$)+I^CS&)79nYlVPL5H}`{I zffGTt`*krys9A8oaVt#RgbQ>7!*@_{5ec&H09H@(C!o|rdiJt2_JSBrN^xsYA$(vn zm__`)-3UiHXn4uDIW0K5uvo-%OEZ6|$hG?LIZY zoqSxqN!RJ+EVurMGnsTDQL`3AY@piQ)R=X)?HBA|M#!g4LmgyfFsqKCnm-hgTGfHi%-&dUrt)RQ(i2zY70ePS0Y+vTj2gA8Co&-=_;->R-l?4EB9w51VT_q>E%acDqL%C zXy^a1vfTI3RjbjS0WIk$KA5C&&Vrwi1-fs&ca!^Ua5mlg$hF1t;!w(?g_kvo&BhMH z`LCt-zGb+sv3TEm=7AbocZ}2&q2rV*N(+r_80i^sYcMKr}oTTIMubrt6XD zrkls(ep8?bAv)Hn#+1K~?l-8XgBuLga)zjotVk~wx~~>Va$>6-qdH=ERqgG8cG0m5 ztn2e8=tBw2F-em%{8=irgv+!vTW}I40kAJAks0DmKk7D~mh_2k(|YQ1y@Vs5PA(_N+$Hn- zRCSM4;j+ymhLa5M;e64^daIBaG5y}_S!zJLfr`(oqD&5Q1RB$XcCfe$9z1Xw`Q-R9 zv}>(Ta755|50tWUM8j%D;0jpTLQWc1k?@K)G$ti6GKYtH!P8I7;dRJl=VWHPrnUx( z)lV&c`QCK4EEbD0t!U0LilZ^~>f9a+%G*rzpynPdsplDP!f?9tw8(aFlrRcP3dxA)30-&4DdO0Y6oz@TOX zq(G=EZpz3UA9g2Rqpx4`Z84heN}yq((9F~0e^H15|G1Jk`|%&CRn_9laE zUo9^zzW-Sr$6~I?q8i2*@5d~&FK!dFckm<8*>iaLjsy~mHca+iAcN3$KECaRKQ337 zVDgql1#IFuPSvy35@+nvxeWFs9(BK~N++JK@22QZJadhs%4hPQ_FX!y@0LyiN{6i$ z4(;}MPMidY8Wra+e?A`L>pdis5S5T|J|%|GgUB0Efk+A5h(ueeOB z+hZeo8AO9Wf`spX#Z7GqplJbU%mI_6?ZBXjgNC`8?}jp_%!T849igNkb^FzrS$bgp>O8uy)W`mE1Xp>KFOe0TGXC7wrDcI0q0I({5OMZ~5gM#R!{ zt5^D1uY3_VhiUFMF6urGI|Mh~;~+&9cJCPRgXB6DnUc61jjGFHn~%nf?>`&3%I9^u z&ng6Snk^hk-GOoV-T*0;%TyOaz5VF7hWeAZkrEni{)-y(X-e!-qL8vo({YqF?GnC7 z*QP5;z}ycT#BWgZvog=4un*s|hc>k$D>vnPmD?9FcZPSU;WsQB@&QZe4+pqsJf_Ji zk0;T`)E}|aRxkNYL!+p@zX$6kCoa`4pA@KXCf`Hils1bxV@pcMqT@#e(=P(Xm|FzR zWDw$ua~;mJ+(reqN-3Q}jX%vAN1FHc3^1f!;*Mkd7Z~}=7EWmy*PPMCMWW87*}2J* zu;N4FoxtZDaWsGNcmTrS!W`384>J$;YJ00QwT>RE?JWbjl2B&xR{LPJlZYoo)A>Ze zZ+kbfKw#%=Yl;{_gc!ZlH~rj#=RLmOUmt>rs(j?nPtt-|Wa{l5mc0uov^yne0$AM) zM*>A^`OKxULNtx}p<d<Q+bRiwRMdm?+>B^CpxaknRDP@$suXWUtN;pj zn@RsZFhv^rMSwuKO9Pwh{7YvA#ah2Dn)&LwK9%n>6xk|y;3WXMaf;`F$8z|y@Q5GJ z*fYBhQ1$3Ol0|tNm>u@QO^H-tb6JF*`FM3F#JS;x`%@Pbq)&$=>Bwv#o&D%MQGV*V z6hXG(e-EnCythHogpT!NTRgN^3JsGzoFIMK9EabmePmSaWLLttgOe5hawxapF0((!PWT%wy zB)D8S)LN91pCuC=%3#!U9~h7>is@aiJ~ecOLKVkZ`40-(3T-!N#x$)HmOo`8aE{|u zszpX=QmjiJ=lz*KiY7bh4jo+0r7FucE4U{|Iy5Z+jX{#ZCLbJK6MO&YdVoAL!=33< zc76Tgvcn$kQbPBM!{9ri%X$8F6~$B?k`|VCY{DK5o8KsQS0Rr}f!xf@%UaE5GJIS0 zKHV(zPZDg%7Q`0keg;{KU^u`5d`b7=tq;AAM&o?BZi_aqzP>&0j9ut1jPPT*Xyp7@ zwkKW+!*Y_F5e8?LL8-*~t_p}Beax&sNXPm%PB!6ZxXp!X;L-ha;JF@rp?d4twY~8%$j3y1XuAK!kHb*UU#Ub*ZTmr+U7{#JDv)xpYUPf(pUl!b2oTZGlS#@B z@#%nsYXrrW#P^WYciowR_JAg*zTc>AR11dB+3 zQ%b{+D=EH5-k8b(wF@9;_rdIsAFYBN?qzJCi@PJ$WltW)mKfNPq4!QkMoEcSKlM+x zs#Gz9k4ETw4K@``bApvg{5M8(jJZPhKz1FT>)*=UMqLXg$6h|%6zxq+J(b0#$tyX* z7{IvWu(p&k;vaR=lC=rUx_-spewCk#)xGIky2OyQ6-6BI`%iaIbHm)fVM%b44CR*( zzprmSZ?@T;5Xthi=Tt` zZ3Hk-0*S&pZc6H7eG9R>E0lUt zrp4r61)H`^UXt@wFgZc#Q~Oh9!2!Ej`ctJ^U(}NCcPA`99IP12GMm)t=MboTI^8MA z+?~KE>0Hq0q}iMUPFcQiswa#UKAEZGGbN$`dyaqqATi8A6Wp*hu!{OQ=sAVY&7JJ5 zM4Ma>iRG^x0Iu3DnuE7AN&FF3NM)tM<($f;T!IqiWjf7^!qTvcAFUWyI?TXKQ0z-j z{8vGY>`~mxwT%%#gVV1KSd4lu}${!dt(J~=PX{&;@Ld|^Nd+;MslgjLHX3Q z?AIufpDf42(`%Lbrq_eimNu*TfRjbgsFmIpqBi4<2548VC-7d09U>&5T1VR$GOZib z8)xeJtgqr*!kfb^easd?2Ym5m4{bJ2eFbt?7w#rF-z$5j)pT?u#kZ6P9cI)O`CbP+ zcC=l%+;pf8cd0bTWyl>JaX5m)Y)g%m(&VrcojWN^DKEQa)}*sTGg0Z#;VIw2y<*K( z77a89@O_bg!Y`vk)ynqW8yhWcyp1L$9II5%5MO^3cHH=$)eso;6H$+074SkE5H9j*L-H zEFiNI$0`1!RyjjxS`pJaH@8aH{$IEBkWD{Czx&!nFLVq0zU}UrT7z|w{41DFku?N{ zkOru3=G!eKwfthpq%(QDcn-bP02%of!_B1U?S{RxkxX~YPk-*}?e~8HQa&r`C5$Qj zj;1OtCp?*%p>rc8}x;ff!6-ie#{TV7n1~tN6Nmu30enA$W z_qLs@gG48IqX(xN(18_vJMCjyvE?k$k51E+&lZV>6c$@gCueF)-RGQg)3G|MY;8un z$u4J&o;88Zi1F2*hTwZeirN-u63;ECd6Rq3o)cH3X~nL_36D9gUrkk9#L(>f40Be5 zDiGX1dxppR6;GE`_H8#uJuNleR5IGZVyzD1FrZjQ*`YNukWE=EW4CZ2z|CR{ZRB+T zKRT`7SmEnR>J%tq0h-oNWD10$cd)(9@BGfLS%3tGayL@Sj5Z$~ZN6dznik{I2kuk? zc~Yw5d#?XGJQY%YqIzTkmbp1&weZsM$#=~QwmIW1T1N0$@~R*LS~RLiCp%3?}! zmO)JqUJzer^9dAy-kw+POW;~(@mF|08?y-PvmTltidEeHD;Lwafm35#LAMX zO~2-nhs9^-&17o@NA<;DsbQj&qnig)s2!KU01(T50-q3Fot$YZPw2Wu8M&Xk?2=1o zd``;qj~W8@C+cr$a32LxIE$~Bc;b-w0nHIJ6b&KYn)*@VdOL~<@ zKibwVCc&R*`U~FFuJZNl?}7SrDKUc5>*M|&3jWvxa}Sg(R7o#M=#fS? zXm!9cU(4!AtKg;Syq>~h=kD>=RE)Q8|0V>XV1$-3k&M-to2oI1xDC?VUSWqj;cAWC z@ou>&ol_}I&Qqjdf|>rgz(B7DGJ~0OCmfn!q@{PXl=AHXe2m{|$?XHy(=YVAUkcAj z0qOX&Y=?+a*h;Y4w^;2b9o|3Zf@TBHzBY?3f9|CRN8q!ln(XcRZ+vCCLtEAB*aX;$ zh#qN04IkB7(}H2Fz|jJt4zVKRS}|taxPtj)#d3L}PVKEpsk+vg{$w8uij zFFP(saqM+o0@>uaV<&H!r7ISo`50cs*?a9D)tX5|} zQ1nm8;r}(XtD=(nkj&G3(+?jXRhrolGFB4Th;E2bTz@-H$P5AK#usOZCAX1K1yAe( z+bX_9W1RmU20WseBac;i>nw!EtdCXF!otI$^#i_Z!-i93vXP_by$raTi;z=L9yuUEoc;PHTef!Jas#av^azx(D7k zub%!O-@+@TXe0Qk7o-n~JW1?eNXEv0H_^zAiV9J)cwtc^}Dr_~l|_*T_tgRd2H$Vi1FtMV`s>Pn&=i zE9vv@Odyrlq}0v@YN>UK@$8!`ae~Izg_?GJM(RM)3Af=V0T5J)gDU5y%%S+(Vyo0MHA1iasF<;z% zn5`<7_Z+fNC54Gh%eW~z#-&xcbUcz4_`WqE1FF8dDlj75(t~d9dBnDS z2nxzc6mz6TUF^5;%vGa7u-e;08~w+gJ&=+njnyqc8|cP7-KsKctV4u^_!i@0ZiWdh zBmoWV6Q^HfviD5eRc%wcceDE)G~F0yE@GHEnSOz3_%YVL&@=8t%d&^%egDt zGG8{n8dg2`zS6V#{JHmpmlTSf4z{tm?Ga;3nB(AdS)=|Y4QLo+1~?7W80;vLg{}jF z$y=NnPo|y&ABhi$d^dKjzRFia-~M2|zqk%O`*IwZw{hvd# zEV=5UNOIS%6aA9BCXRGFw)Wc5)-(I|;TxkL-2WwwX)!zz8#Ew|1>VM9&2l64SabEf zvsd>xYY-F~3?Q~rZdskuWWnKPecUQ#$5%abT06eAYtN(mXA8e45EYiUlQQR9im1|6 zN^Hb3d?Mn6;SO^!sGd_ZWa+QsZ4t_I7f*k>^v)aLRsG_oX{EhV;JXOhw<@eftxpz@ zBO=z&gweoal@hD|{7x}!$XM2cATB$b^*R@SbU_?TkA1Pbo0^UdpvJ$^r`WxLSLBI( zSZLRHRW~H&zIIM)0}X4~hbuz%ue@{VSsfO_s}{>ohBFcS)PV5}xVs#8LPbBqYH*=1 z!-E7(x7U!1cAmfCgIuNb0>cZkYBu#J#fE+wBgJnUW#wW&qFxStqa9!pHIf~8@pv$U zv)QG1^2zw6?mhR=Z9+2t?2*USz|nB#q%7*jRrBD#{tMv2bh?UPRG=|QOM< zib!BbMpbXRdEVz)M%lhSOed}zuiD%q3vjO^G(M!_+{&NV!G&-u3-ucoK~&GjBxwH( zQ3qTm*tbRv36k{!E~C=D-)wr<(CL*3uth9YHf75V(`i$HHA)CGCa#21-m8ew!<1hu zK|-6*H0)Aj_2B9bX5oBavDV%jr*8)9bS`&p!fU!&x{Qkz9j}n2EO7`Y-0)mQNehcx zFZc8_k5oNLS-sO9_?4$NAwhHbJD8}bZP*(u>R8^xAw!tv;d3uVKGcg_olvL0t%iCV znLPCkySK?^>UUae(@wUCv??-BIs>kAAjhDZCFN$b?yF)~bEr^akcSO61)!#bgYn7g z_dR%%i7N$~=`0e}o5Dwk+X-30%JD_FczBej{ID?@N7Lb!j|XC{`|<7EDgMtyA82cy zowUNh3HYrt29aEIeMWwMhsJD#pjv`s2^4*~QP{etigCGFE+G_T(9eIxgMyOA?B9cF zWj9jI<;USAV~$gfAc}>=X6I}1mLcC3aExKS7et>1oZ8A2e9zuvBg}>T0;gKLdwS#x zjE6lPWOQB!&+U8FqIYU!-#fI_{=Tc}TebY5fp|&Ni{htJy3kBV1J)a#G9N?@4Sne^ zO#tZx6)0ipL+Gq}G^a3kEbcoo=v_=d%fZSCND9vc6&V@9*E zNAg2Rc}a_-$X1@>;2p>DrjuN06`#|cmMW}7s%3gV}r7vzjm|f}Y z>Cth={JW;~L3abUx!1Djs?DRz*soGj)k7fPW~tyu3rZrD|#{Gm%NFFZT?8La-ON-6`_sJ@2H|Z9iN4B9?oS zVibS=6@!xv@rfdU6{N*hVo=MQBvywqEOU!5=rMdo(dWjl2YkuA`8$Zjg-|~sm5O^3 zv`oNZgn8Ss^?EU^TF|u@36Bw0lN$9YMl^|^;+;w#9j>fjewl!RVf@b|g?#zG9|mQ0 z>izumlHRw74RoM@nf)azvHj|_X=);Ye9Uldw-==4ZgDn?4Dk)q?z-cR5A(LMx5rT5 zBQ%P7i%lv)zcPdj>!jzz_VK#K(8Z?r2@@`;FyZy; zP|oTQsFQttG5_%?VVG@aVSLjV488|FJUvNkel3crz)q0wZ$duGqU*M;hZ>snGc`K1h8ZRVE{2T;cn?mSYnyHK_D`hsA~eHxuq7zDEZTcba(OHbo(DJ{@uB z5!&0gzAFF}_fO|HZW_Q%tRjT77Sk0~8}!~6fNWZ9wj=vm9ZTM9inpR)hcLnfb_xeI zvr0~IKuCNxu5mdGZ5SqWHmMjnRq=k$fJ6|{stQ5O!rfOHLn~1E8X0B4#Baloka!#t zC%apjS3pHB>NqxnYp9`f^Vf!LnEMqKcN^KP^Ky&pFZ38&$ZSj%l?&A{c(KvYia&)| z=&n{tc|2w}xj3=dFD=*PEQDF$@Y{*cHLg)KPu%n~kf0VB5woLVJtAJX(Ak0?mJMU< zP8=m{z=p%7wi($^65a_7`#;7}y@GAN4n2~&T;AqyVH1&N&TG!}bGlG7BQ0&MIl|PX z7{9NKlB)xd%Ks?ukzXQVH?%diefLWRURxVozNEQ(O|X z1%nHO`@Gjdb8nK02*c7UdKNE=$0t_Dq8<1~q=+eRMh2i|EMKV2X@9*Hsce^Y0f!sV zSo}mFAm=QXP}vlIg!<>55oFQ#H~=r9){r9P_m6t16t)KgPOu82GGyW%68J-x=S8UqQBsCAqd_dil@HqZO3a z?fa)o$Ptycb<@Vqwf#p$y%--n36}_~_LIr{Kyl!r1NnJV7-!TXY92y;EX8O_WdySE?I~dYg1p zmsh_^Y!E#)$1`|i^0l)cvKKdhc8ta~z?++z+FIEqHX%qLuHIr*`_Emh=QA@=@BsX~S#>4g_R2sRLiL(Xl{pN4iM&FXeOG?3XM41G+=xF8 zO&dL4iTs7>eZ~FT$60(DyhPKdCr9sOIvgjDXm*m~p;ft>p{v~{AH!r03mq_@A0=Ta zVcV4s5!ZoZ)#Z%Kluv0?UKzWQrjw_+MZd6qyPur6{8OY}fv?52$1rESJ{l)?tRrG@ zS#8u|;VHpyC0`7OjTS>@%tOevDw14xEcj|{WF(K}fJDBpnW+kIVMr@>$4D>qd9Hlo z0Wsyr#+NS`HFtKL$r40E^I#)K>~QlL(%I5Sq-REg{#${W%;?y#LDX}jMJUjbxW&jG zl{@2F%_wmye((*URb;PQu<$nJaj@B-MYN^Jx@4fOxXqabn$-aqEA*cq9gI zCv{oZ+->T(%f7U_{axQI?z<}WrXLdIac8G8-EMsm$o{#6$VY14@7miJ41eThLU0u% zb$exSxO1ex6Hx|HZ}RF^hFQ|E6V%f6Y?D=I=%Os-wm#uTS8BOc$yM(U1Ps06>&s1+ z0u(Z{?{8di4glA*J!_mkpE&mr7z))#oNd(ox&43;LatFqs{jm0a&eP>i42s3&|yu} zYK(jHo|H?E8PXhE;M^2P7=PD@jhEyUE!}zxDdCS?`hxA<&x-Mz%#@H4suEGoFPG)PN`bi058A`Q}|bR!)S z3kU`wO1E@(x1iG94I-UN_dAQ;_pLtH`-RI7?tjjlK4;GShR-?SZ2!@NpcBnX+fu>3 zeB&IwgxXwPu}kqLTXS}}Z~OZ`rF=a*osU4vQ8?J)eD63Y`y>YpuED#ql{qLh#>-3% zSv1TR45upXB8JU89EcP9R&$3wv=z-W<>1X8O9wBTgoDB3_DeU;mCp7@3F{`~-S&uV zZQq)&Yce*XM{5kl&+%A~a~~dfHW|##9$J=Ox_`M?P&w1gyWTiX{U+WZ%E{chtIALg zrqDZ;eIES5xk3-8OFh#>aLEKW@UH|m5RQBU+x+9Nk%<0ixM0*S~ z3E}}od8P^?&&Uubq0h!Gr}Q_<@W3S2cBUT{m`DhQcId#uiOdrG<|>`lZo* z8z~E}e4^mkyiBG}zELyhny;|=kZ!&#JWYnUJ+6H6se=X7VT0e@%h9{HFV}ogKD!9q z==m8}UOqxSmF{cN4;{(E9DO!Ab>CtjYu9RZ=gKb5cV#|$Fq8QKPWGNFM;tDJvmQ`O zH%=BB@T52>Q!ICE=1k}P@$ubVoEZa6Sd10=3847l5?^B ziEVm&2UK-kq6Ck+>DM1?)jLHcPJ#(iqswuew6D@!9XI+b5oPn;o<}|o&t>ROI-Txm zpgs{`SkqFyL`|$bc#qS#JC6SJXwQ*#&n-4Vm(sItmzAj?Jz0vv{Xke3Wwi1u8;8{4 zd%0_uO2EYK?fr>E)y1y`qLSrd9PPC z-(SHD-Sj*e9ZSE0zHXaDEmWetxT|?7{b=gIVTae8{E3W=$7m{{)cM?Tg*f#}O;>c^ zkpKs=W4((^#wMm`MOF*Ec=(ym;4*1%bmN)?$1Qcxskb_PD4RzIdiXO49~FT(5w}V4 zX}fc7)QY4wGS6Cd^26r(`vPQ3CVc`ME)7+}WE=u79l31?)+x8ZS$3Om({dlz2w9Gp zk6pFNy&<{6R!F?(0mU@5Dy{&SA`H=JD2>hNwtZN`U*|$##4;#A9q} z^Q-j zC&4pJ+T@zw8-#Z6R8Wd@w@QbEh5z+_otw2&ZG4SvN7UIUIhYS6cen_g;168z8mGCM zZczt=vax!ZqtA|s>PW~iI0Rg}x@4R-zsglT!N1~p?-bg863{}ch;xgUtwnng?TQTRxW~%)|US?zk1BW3Luc4T` zX_T8$bqk+HJ~yfxIRA*&##xc#iD!_jxj8(s(%Ndo`OVZQWdfF|k^0(Vl6a~noc~64 z(Chw?m&7PN0~trjc2eA2nL%7OrJvW#=f22zFh+Fqo_>3~{gK;pOzjBFSfqvzq3lk2 zx=BWJJ>oGnztM8!K$22Oq<#EtF8Cl$j8~46?R4wXeoK?lPD&8*pjU7IxrahdqVpW* zdz^}Be7s>p$JQ3fa>#=!tBfBYXN=}-ZdjFLCgGJi2e$3(4_uYclxqI)T zhPRjL&*jVpnPcyaOqDrxlMg|koZ1N34n)31ovGYjI2LzU+3oQP7xD&(j%Vceo)m2^ z2SnLj?LX#+?A5*Sr&wAQUlep8u$0T_1IJ9Ztq&HfArc?TUfHV`8_A@;cqmc#^z-fM zG}qeKMdhkPD6@gXy42`<6a@=qgAFUyo1PY@Cd8)hWM+vx!zmO)y`PV!dXw@a>Zg9t z_f{GttCt9YIqu5qY^Y1;b*FXs8H1;rW2NK7ahrnSS1j+;9thgGYibUMwY5CL; z?>yfrq&EZ;o(t~r#tsubWJ?)+UlxQC5w)=sT1*+%6ml%&t}|Aq2HriX3MIIokn`L8 z(?xYRxRgGg-Z&L2Nq&H97igxOZxtBYbyvjon0OgIAzOOvyFB$HP0sED@37#QnIdBI zl|8r3^Xf21ZGk2eZZsjCGNRe6II^{*?N{fW_Ia;9`)7ZC6dpCRZ#Pt{8Jr*IcyOOQ8KFCI$GjlP8?P2zN8yP^Zqie z>*h7%(2BaQwaPptCB>A^S!wjWx`Tf~I70Ce0J)~^fbZIAbhWVYn>EhN#B7Q#gSqmz z^a{B0#xj-b%+bW0$=Ilnbc|qd7s46BBAv*?hEmgL&(EjFzerCTCe#^<-Q;A*oN1wB4ftC8q-PM8HtLfs$7gZ&WG;$WnEHha?zhdoa<&w8u4t8|*a86jR z5$6`w_6<`FjZ5ZuR@G&>GSP$7)F=)H5!#AMN^Ab{^>PA+FS({y2#q|tz#O(FqZC)} zVxM8V_UdZQ$HiC&jgal)6+cf-MCBnY-N{x&pk(|YN7is&cVPs?T zvLjIQa8G$HiJJ*dT~W4R7&14}Ul)aU<|e;XKUS8RUKiiASw`88U|!61u4H{r?&LtO z#2*R6Q}5h1e^3NwQ{Ow@5$?L`*Bw*efR-692~O$-ow5Rx59MmM)sr7rb2TbTJT^zs zkkBxP$tt~BeV$2t;u!9brteFDnfBs#^xlE)`AM~OB=6_w@iC8l^To^6mwak#)8vMR z&zI9N@z)FF?J-WLw#S4gSX`rmV6Nu}Gjno=u~FOV0<=r+B9}%HhVc5jBG=;a=ksVs3KP$-X}@;+UfaJOJ{&h>n|8lB%UkBka=SLfvvF2Ai>F@*`={#rk6YfbsDTg1Ri zs^dv=c_y1@_2l}WmlbwDnQbfWD;9fVEK?mc-HR_j*N{YA#MHcGz1yI_O$q?p9>FD0 z%(FZfcO)+_RKJ{GIF8_6o+84;eU!M<^=0*JD$7(uZCW>6C!3G`=aC$PeAjdJ&1u8T z>kQAgdeet$8pa0BYj&j7sH^NJ!L=t1Mn#^;-go?pGM5+`86EEThp&)Uea47hexANf z$XW!^tGb8jZQ4`xxShaNQnz>4zN9cnu^&Z)*DyG0)AsD-#SnB}CWc2-L{=s)*VLGc zO*vJ{aN3G9ur%%IU{ZT5V+N1K$kMfp6?RMgiU$(%=5OWR1VwhO^-Ps!URietGGZC4 z-u!sHVVkS3n$aZ9VQiirw4UoYw%axBI#nN-V8D+`8tP$GH(`Lgw0*lQbC^B1pE5E? zP32AWLhSC1xvvD6lB*1wWT`8LFpGLuR=XSMmJV^!+hb5i;g5T>Im3o&iydfrQX>e}cvH@^^L1zm;l zOKB+y<@4BuW}brkyPf7!J78E^v-`x}WO^uHU$P)>Wn!2(aR|GZI2KgjD>iXX-0v(M zc9wER?WE~^FzHgC$4APcsKo5LXYWVZGCMXa8*cZE(&9qJ*jj>iHuvr}aAxrabIBS0DQUpR{c zkXIK)*!^2uO`n#FOdf|%(-F~Oes}RXIvT`ZY~3L${`M;Us>G&Q`hK-leJXD?V~8cW z#|{Punf7erO9AWZ2d?`o3b&fSk1ad)-#zclzn1Q1$6D_!=?Rd&s`{Vs?RV?{%++60 z%b&bddlqC=)>~;}eX_mIZ=l2Ziw)(Jlm2W?JInTkP-RAWbI-k^&L4~R#rPw49(NnQI%DoMhc^rl-_Py9y$h)W9 zMmh%hI6)EdCF*oOSEMy+e^o!w{R#aovOh&u*`6$*wGGxYf*O!Z1CXh#@!<&XOt%o3)A z#BvpL45KfLT-uW$DY2faiHb_#Jz0fi6{ZUDo_-+H(g3@4FOXrG=5%bdc*tKX8{L?5iez> zBtF;gPWjhaI(Hv2IK%uQ{F^%kck0VD(w5u&eS5KKvE+Q{{)H~{fRuI+_5+Bb-RypP z4#GQ5gJDK5WN$pKw52tFP2KrPQRNMtdQ7GBi|j+oev${V-@laNUQp@}@4w=ZYV;$7 zaeM7Sad^e1$X=0+r}>pKsfD_nd*2=9@^osW^DSo$M6d0~zR{2?7U<9}8!Oc?YPVM< z`w5}|E^Wa(Bv4i#Cg?3>XjPh(hV>m}g1deG8}*tXfze6v_uxBUA+gq6UDm21jQ5lc z87~mEK;wKce0ed!vQw$rVA+=FY@SCeVWcPGK!IJLq*%Pm{OWFDz06z3^)X*AQB4wV zi-X~!jue)mq|9C}OODG3XS|*}D>_HrBt>?MtmaeXac-LRzA68na=oJL$(6Bd9Sfav zy3I6X{781nF;i3EgwgxN5jIcH-`S47SwlWw`^CcvAP9xB81aWR^pyslb1ER(T>zvJ zIOI>94g{zVqF=hAH_MkN=Ce~(jYu+$*hBHlmz+c>>PQmyzg1fW3&t2cBa0pHR4RyYB5vpSgb*P5OlyhSrt?fAhsOKKT<}r>2%sH=_=T@Mx2=gx+wr5|d7h zbTzp8b^V$_^o;(C6qN{&m=Nv;dHpayB)NB-Tj9TT{NQ(?Uj_29=OTlM}`&?8}w0r-y@T7?OCaLzdz+3 zQyOHgPyXqJSK3b9YP`R}e!P%M)~0d%5xr^N*RO4)?$qG!Im@~Gv3qYxmqtl?W>@}r zqKHtY(L(wl{QE*DU(vIEI`zV*VWmN5`L7Sf4$3sG-)&4*9jrKm`V7NjyiVJy>JV$x z-1SG9>7*hU6cB!R^#FxTZatOd-#YFYn*CIxZd&Iv%cJV|=u%As`~a!s79kSc@Av8 zv2iR763pXYARclwDHfC*`ugF3wbRCwtK@fos7|*`$ulf3%X}+(#2N~QTKzNv4O5xl zMwH8N8yRcnnhX}bP|lFQ9rfjrI@R49_0Fw|hsax%)U;x8sU9OY`FCh48v=&%A2SK} zwY@OA(;j4rSX+}xs!drP$YU8i@Oo}hf0NhkXCS~)hMy0)tj1jQ2d9a+^CE5o*se|0 z=Jzd^2lgj7JwgDI)UjpGM+eNJ3$)62I6cQlG1Dg&{A(0D0{8tFWadMKCr?+LaVi@& zP9QGhC&!h;9jI%}mN8u6{lWLT)Ia}sEComC!-P#L37)@4yKCj0S| zib8y&0jxQ9FgxY?=>k(9Ee55$E$uxBgfm_RrR<$;Lgu2WeEt=;)gjBG=@Tlg=@jn% z{p>nx0jCbUxaK!M@i&0MA}#+r70d!}%hcWNWm;hho-VxKR4%r$%Aw5?E~crl^n{ir-Fx`)7yjf^ z3|#Aa=fFUryX$@c56PGh3Pc1gn$wErNbGlPd_)m-Po|+?henZTnZ@+-u!#&sbZh+Xst}=hHW?epAO(j|#9`2tYMw9nM_qqy9h_;3A%4uaw>DUjX-f?3 zgxAZ)tY)PrnIL@7Z@db^60qsHw`=CY!Ed2g-jU?gfJB&w2to^mVyeMQaTP5VZ ztG(m8cE7gA_PFwBxo5pO5&jvZdhc8N{#<$+RbUQUsM3*R#8v!v5HlAr!~zYifuHi1 zN~4Ez=UrMKsghxn?2; zFNV{e()DDEX_`iAG&|G`l5n>ok+pV}Nx_A9A>F_@n&TU!yo%tid*VhMNOBB*$_xxWy|kD!!BGu8SYDPHmUnXrW5x$7yTNnA_$>Jk_$b zNa)9|hAG8D(aXc^KXXdhODBLn^WEcx3B{i_06YmpPn9Y4@^q@tBKDU~4N79DaQK@v zck;U~X&vfiZSQ9XgePfptzIv(-$u6C`|x=4+?kdKilVYH(&XMC!y52HW2I|qSp^IB z6ddX*dEJh2j_+ERY|1dsTxG&$eliW2*vcafQ3o&jCvNqB)(B_5?CNO3qOHlZFPM_% zP0r;|W}jxUA6@PD!Y_@7x4?BX9Ny&$*1oKV(Z+8iq~mFo z2$;WXg)fCwZ(sYitxM+|bi$(A)sbwGCTVhiG5)?Mk&Oq^-bImk!b<=z^nX;L#On$_ z&!Xjxs-z%~Q?oT1#*ykfOZ>0O^qMz>ek`|48@y<4VG|nmh#P-2%*}$cUcyHKU_sd~ z+~#sK1wE1Ju28qd$=VB*aGy))Sgx#cpV~;bHz%8^zqEXr$c;}=SE4SlnCP)13j65- zLh+HHHAM`sn-V{cm=4(F=uGh$|vhRz_+h4G= zu6QcVqt~!AMdkbUo)8)ily(OVf*OEI(oe>J6N<*BXOmx1zFIrIyfLtvch=3}l&rbl zvC$<}tyF&}HZ?9T&Sh~sPdxju^SJJ~^G05EFDdVYwtX$HV5R#e>bB3l3B5f+zM;I0 zsr!4cgT#()uS02M;ET8GrCm$PxOghbkEmnHV-ijdjrzy$Ege0NCCHnsQfi!zk(NW~ z3)$^nwfo90?)XwE#*P`uc*VQ9D*w1H-O>71QzYwySS(=M^75U;Lw&@Ltz z+FKn|goX6pwVSKG5ysgwH?)1k$Q1r5&};4@)JjI8pxQJN$2R>9SP8$JhI6*i#`1pl z{vEzeX^!MnKBs2}^}|#m`PFk%Nwpr6SV6E6nHPq@{0LCvvway|R9*dR>#*py@OETDu`venVVx(z85$Q}VtDyP% z4x+StxLS7ZQp}%2>HK|S)Jo3Zc2tc{e?zl;bYi!~mE#uAp>#S7A}0|%e8B`XMmP#- zitzE@Ajb_7sFvzM$Ts$botNO2A3EJ5u6eM5&?)Wj&ykj{fDc6o z-7UmHI!Jg68q`Z{h*BB-A3u$(%mEt_W>9IMu;7OGJW1U7e;QJn81%7BD7WXFTy2*tok|h7CdQwOYeP zMQg)l;5pH*G^wjx`?}qsQF(XaiyH-dQ}SoGj+H>+V1Z|0d{0_Mm6$}#Zc167C%Wi0 z5%4uzbBR$WKgcez*<)tv8H61e4^NxDo`i;0Q;E)KVb=YG`SAuCkEij9|KIB-KYb4+ z8zw@^w|;L!LR_LVm)+vWDNaiGZHHwICYl~T8i#`(<+f=T8i$)bxo&$g&1GwBF;1JM zjT28DhFk(lhc_$f6WAC>DA8EczStp60+H!gzel>^YS)dqFKjX7c5^qeu&yh%|*ke@4 zOhy^$?*FKZ51h7XdSY_@-h`#qyC)x<)&wG}D`xhI2~6aQ4YwDgQ@0l*jfiYZh*Q%& z8!RH&;6BrU{wM_^oPkH`#r7X64?2{jt2>O>RG^4SWi>Ey`UE@D>LA9ARA7(n?e;OX zc=xuBl)2Je@Ak2GrO~U2wSLOQW3x~(p<3KUC!ua*1Ics62TeMd?i8L!5A*7spom8p zKLjtdMfoz+D|yUzfaGs&!GR23^|W)!ZW5h7>(MCQ>?b+Q08|#GHk$zR7bo2ZfzP-cR+`$q_$u$Q&=;`F( zB#++u{!9pYv93q`+A{x|OP5adJM(bXciYFWjD`ZZ-9lDXMfFq(2rjhcz7}vDUojn3tq$0t+rs>X5CyM77J)E{`v<(3P5lG!a_ z=+HXDvtR1lP)Yp!V!R0k@b+eSOKvs)Pud^kH9c$Hl^3`-^+Bh zcJqqGOxe3|C}|o&D(i)X_2W~b#OG1wUs&NU$AQ!g%KH!zzxvAS#8?(%mBSVzh2u+X zy&^9z^ApbBj&f7;hYTM2*J6o8yD?i$<3g%43&5Df3C@h$4JK-dwZ7Sp71=wMCe+D{mTN|hMuGN!=vX(uL9M;)jssEE2wkW0@*+fK z0%KpO+goXtIx0L&^K_Bztis*fq^t4Vt`@XpdFtJ(dxxiz)}DNK?wC(%L=otnB=&f(CH;3J(Cejhhan4PF*+8(sEACZ9&Jf?zc1LlO~jJ^Ku>BWw;0c#bRNW zAW5V`u)V0aau_%q-FGA_>)O=DUECKjKXWYKoeWkEKjfYvDBQlbQDyiw5oo5&w%NqA=qkKOyk$mm>cOg>$`YX7pgP+G;0 zpi^UYAWbn%#d}hms89WTnKXECWmF(jk(?X`af3evQ&y2>@R6qJr|22=>71nG?>t>S zx?2i*iTLWx&$Wf>)BAzdPVv{PCL3E99#slSK-bb5*)IZ51}NerQd2YNk^K8FcSeD* zLY`rGYGbh|zJVgB2ep(55G@$@`Az~!9c5o&Ane!<2rhI_5t1o67~b}GEbwaZMVZ}1 zdoVMdqR6$-cdh#_J*(!oOjh&qbOT>85oQ1zTU9B-@+TP1e`LzjqBc(7{wS+o?Ay@aFqaCYoVg7@ zSZ({dDk`d{TRBQ}p%gDb&}BkvHTpYU*?Q!)HGF6J$G#X;tBxoiSd`Vg^x<3hNB3Q3F-X(kcn3}#J679NA8J}Z-WwijuuME_Rwp~2}gnf$izR1C<6_- zwwDAdL@!uA=YP=Ld%&+n%DwhaaUpKyPeCIkk{Ny=FiI^Q3`H~z5D#2nEG8mz%e!Rp z7bvs88$1p8HI?a0_AC*o))j*6TV7tY@B@-F9tf4q!T3w!3t`+8L+PmgnO*!BJ`iuO z!Or|@5U-VkVHHp;IV!IP8o+$C&UY4NDTBpS1o6KV%-u&32fxJQzA!mmRX-;S1!$JB@R^Tn3nLZ4< z^dEyRbeaHAS7`Dj2_3LE)Sn((66mt^Npuv9*8|{hBda_G0${_os|rqk+Au;519tW$ zi|-Bj^g{8q^cFx8uQ$cd!bE8*;Z`*MLaXIQ7+$TPGl7x-d9pH7}Hk z#zc#My7T{vC?9N2C-rMRIhD=HcqFxS9$=I0csz`^(y}`Q`BM>48KX}^)+qjBa0vL} zD~r7(beW$FewhM(NfVQs6h?=Z$3RbVq3~M_aFjLd*Mt8q_lwsVq2NEK(#(~U0j`!Z zN`z_wn!lB~pM~H;7T;{$M6Q)M21GkZV08SKB0|4GVP^|^Te;aNR0T}eu3^7Kek>)r zJ)#Wtw_c)0V}1DP zCps-Yuz)-mP0a6Y*b9Op!8*W{?Qkj49F?9BL1ux-FrAKlKREg}JTbYvf^=%1bb)T1 zS$1ImR`bl-X3w*lKqFe{!HxiZ&b=#5C2bDMq5#cLG}zzzx|7*zgt7J9b< zvy~L)xGEt(vluupFrlVV)+c%RR5p>C{#8hY?gj0vAP*8-w7(ceg%8LyZMt8e0hYGl z%!<8T_i_*%b%@y=SKVBHG^lzgxV zmwfyh#;e%*z!0gKEy(zjmYKoumu4yh%}nl7?9HbC>0X+VI$dYEx*viKIcDiP1A;;v z0QG9F599;M)E~m402_4wB)gOcMc|HYkve98Z;1_(7G?meWR4E;LH=h^;MYl`(-Lp} zwP6K9;3ZtIiKm|d7h}p~Mtl!!_@LBOE$AhTmzhOG2)XbQSXiPSlMnLe!U!19F26)< z9F@zWGrnBB{v=nykL5YVa+pM*q^k?_Ge|n8K{#?xHj?;j;b(x;f#&Ug=M^9VOp6b& z2?K6@H*GJVz@V}j(R_J?6w@pa6P725g4o{+|8&hbiXgl6<>d4y$^hz?c=Bq3kILp& zOq>t0?72+`N71?~#r;>C>@6ptF{RYmIXD8wTVpBKnRF*{c5~P1o*wyBNoW7Z94*di zEywRJY22SvRps<@l;yo(6_l8A7Y->DHlrkoK^gx)WtGf~$$?w?Xk~r-x@mKfot%zk zyz@|I&^$9dQ4#22*gFFOC@En<)3iU-GdOuG4!DwrI@@C8LxYsuz;+8wrLg{b<*wll zVs3U*M6R0VWcSl2DSQ~nO;K*efcujuvv;gt6hJ}TO{L912Z{tE14;T)2|m|fjuND> zv)0HI77rg3nr%(*q2QT>i?0b^g+Y#AcIF|adlRT+b0Rh$+Mi5D^#p2k`poD~KOrSr zd>xgh({o^te(atl6--=CnA|tEWye^4>m>WtWMcy%%=L2N7sTa}y z$uPuCWHijU%ZK;K3l_-(fye>}nvU@(i5BDrd9a;^!5exzELej?Bl9Z(QsFRrt%29wJGUdPKj^i-CAQzDIia z3~2Zq!E?eJV8hNO)Dp<^3uP$~)D+)Y{MCt}`~l|>4z^T9zC z)tkC72hz5M~SrHQ0Y}7>t)O!4G0a(iR)G z(V&QJxbsaWK!q9?J-U(~3Y86!S`PAT=#w-ENk*7$vws!`P-k3VHw&LMfI6Vb%4*Ut zOJaDw9~dLejsa|oxr&@-`TyKALJ+JY2qV8`19lr(E*cBWYHlE!wA~)ik)GUajtmPX zAYqXxp3L~`anA-kpa$vC=5`!vI5ajgEoc{kbM~dmg|C7Un2{W6U<8s*Y-Dz3GpFG2 zmxO+RmD;zTu73l@PG7!0XYxpbx}A$p+;OV}OW|(a{S;$APQJuzeBuFa9Jp z0>!|;VrW+gtRKj;`3DMyr~YUTsq$rD8B8x*(~w&RDKd(G#j^}zU=_%S{_79i5Uk8J z*P`-{9*|wb9sC0u_e{KUH={ZMtn6V{dnKC~=F+W`zy}<*FjPPZ`pfP-q@Zpi zOEc^UnZHUiG-{Bt1PHhV)&pHS8RwOfkUSts9ZJf3LO_XzWw$EN19q%u2J}+NZtn3v zeEP+)UrC32?g$WSa~dPHJ0&nmE8*J|qDYs;ef2TY$E8t$$_!Ib2dSpNF&oAT$hIj( zFMX8{mVQ3YeN{sIfaHZrQjh{3klfR31!J&ugSHpS$m9!9G5#hdpgBOT1J!&KCR?t- zAQE*L)GjDsWee`xWK>{fC>OzFWJGxl0tDg5S;jvU1n4Z%XC=pF7@hz{o*PbkB7CcH znynnm;mvzMNvy_ueeeiG3g8!g>HJ?u7L;^AP~eM;ag zeZ;@PfP(Y_cD=Ilz#{)cP%q1XhbkEl9&45WauT*A`a(^0f~lV^pH2hVNB<#=PaIT9 z;HcC_OEY}#&*<=!6^Lp3%EHzypqQkUbZ_pz!0@E*l~!i|0_eDFrGReZ8|+Tor7+%97A88u!fa1AfLO5NkyBK&(L;<^NOs{HlBf;gmaI;SbhH@+xn) zctSfxQ(=)Hw}?-iApx7E8~`hSup+;We7og0Wl027*W3UPBmvQKj4JSNij7sIMZRI^ss!(z@IiWk!w*t%JJi-})UE$KN&yK2zBn&{S`%4&WC7#Q z!hBrz*E5G~mcTenaf?8}M+V`n1*nW6$c_8)l+h537{G(R3M544nU6u9na6)u;5P>d zJ_=(1NqD)|-607|q{r+vp|3Z4c(5A5c`SnTGz~~k19;Q`a(A!vq%Y=wQJzHy>H#hd z?f^IgFc7ic>j+ivEuJm9L=cUY0oRgZEsz(uB0+fFD!~~2liyzORHP53ZFPh}%K^_T z#?!}2sZVmt*v2J*=M??NbI#DoQ&UuYnT*%FX#V{E5s#}T2gj>18=Rmszf&^)Pf{8` zWC#)$XgZu*!0ODVS;%OzOgsLzb6?Tt1$9E+BK{j`~o;83=EH9bd7(Ev04!pZ=*P%4nzLbC2ZPG(d9d;R=yloAqx z{n8v7+iB2Ianjz_$#PWd!8Mw5a!+8{{G%T~0c1GE0Oj6c#5>O;_uFyYT&1N$`=xx- zgcGta<3UoUpf8V)mcahhw6v_}^QZK(+5YZPdLtg}HVKVFMJxKU*jR6I{c7 z1kwPcq5Y}KA3*ku`PfdL2n~Y&QVJ@FeSmc%rtkw5(*akd7%zI3^Yg{AM-?jGdYC@_ zfq^Q)vvb`?$7Hkl^;2t@2sY&BGr2OZfzKmP6d&ex7XJBpD&*%c_9=P`HUx9la@{tf z*&-t&ErEa+68RJ#_`R1UTP2FMGGj0OQLFm`bn{I2eBjQ&h?>T^2Y@ntWdg2ix@^AX zH~s^U&;wkTUzusfO$g$eFCALAPVHEelYw4Cz{3M3!d^&urt;+yr-CaV9f+^A7xWI^ z20`?lVKwwVux(yfOYuP9kdO_AUaNa%e>$Z5vcMtP%80+f-qNOQfvGi3-NkU1pgq|& zC)b@u*g2|E+o2Damqb=AEWF0Tl{tv<=_rR%>H$t{iz7AU1Q%qq-O)lw8~jg>uRu*I zbE1iYf+l$FfC#b*>*lZ7mefrkq9EDUYF5i-Xu5Bn4|tqD&J?-Dqq2D&>k0yt7ZBCZ z_kqYSfegj#THn@1NAkb#!f8P+#gy4v29xxImx}3OdT{LwdeVuD3CitHe%QV|Twba! zc0Zz;rE%K!vl;~g)Ep4{{7$~7Xs|8Ns2K6I+k5%n*TBDMkeh!d(}hYce-~lq+n~NY zpZ#GoV92ruxKsl~Ordsw_Fb65( zRzx`{jigl*6{)tI>Gb{F+%P=aE#8K9;WCR9U}0-BK|vsNDnD#b{-Xe5MzAae%1=XY!UAka=Z0j_s% zI#%dUQvg}#N#I2lfkrpOg=Qr=9F0$wYoxv?UF^JJK~%+CaJ$*A8KN;fW@e>c9ks<1 z&(fhlHG^z(JEcaf(f1oL565B1mSd7GtV7cwQ zwXGS`v24dLEg@FBys^q7uul;hpLJPv@l_@ix-`_O*;%oZXO;ITVge%M`3R>F0(nJX zVrj*G$L$DLTEhGdz5nV)#jxOiZG6cj6d|woBP*nTJ}~>Mg zX~Drkyh6HK{wM=3r-$AiO1K6N$*}f!)boec!<-!Vql8YyhTirZlF*)X63*U*K=E)A z>20Wp!jWm{JO&IUV)66XZ?Z>f!DSFXt~C^Z{$Li}TM|gOl~sw~^E?*zAr2}V!{}Q) z;P~siV#8MBC}r8$51UHYow2N zhz1A#-Y1_0v7{T$$jr|zAKUG0-pLl0NXX9YoyPo8dm=ovIe&-qP=hJhu=4r*zP(;x zbC5nb3m|>(_l@m05Bjpcp`tYillVPRcs~25l;>pKK^o@qFTF*c0cN-~D8}0s(ZPb<1KvvII5HV`%g)aZ$7zCB| zVjPF8niWCkvi&$-dlEw;m5tOwWd6hUVg6R%)%om`Y|FO~WF+csIaKj9!}*VCK$`@Y zv-t-{Jdd)YAm0F;|JKy2puhdX(OBZ)*ym-RW`iG zsW{=t&KhWgK}F#b{x?bT!g{F;f*K$%KyKQBM%@7g2F*+ zrmoehqwWFrYl!!Hp^}bP$cGV1^B6?+Za1ae>G{<3w9_I7nRO^SDH82R_{`VgipBr`EjBy~tT!zw?(XbJ^Sx_v8g3?7R zp3uB~=VPf%TApPgTI0G6aRRN2_+3;)s`sS>}@!VlpMG&mwL}eCSE&*wOL(Pq}TW_=8 zlYg{)Bz=35Gc0187!90Lp^&y3CHMX28Sbm<;cNRW22UyEQWm7hgg`CTPR)COR zT~ttz0uRizj5c4C5#>H_bnH6@Hf4t?1HG|Psg(u3C^u2*~YRY zIa>JEE12J1c>|Y5qd6rb3Vo8$zH}Jl`OUZC@YV|oRe_Vz{hVVk`xI#}B!sZU1>O(t z0(Ly_Qn>dF5p7?bX|2oHB*sIo+u{WM1m-Sz{Q}#leoIzh;)udCAtU95qudZa6h>K8 zbLalTyBy)I(K**0qC1Ubq&B4GQg?K7Gan5{kA?1kkc)GRJi=+522D*Vkos47aV>6g zHtD);KEXunP9%_Z6Q5=^o8vEsrqr75I>7@^u(rmEhlGbRJ%otQ_8xUlQ_00JlrQGn zB{wgi8S$FXV}g>e;XNErOiyTfb@8-N`pZ#Ge!_7n>FGp5k??l9xw#P8Jti5kMDepa zGwoYK-o|qJ)HQer8)WCE+C2mLXf^Or7k}=;-nx*um9@U@M%TAt?iWC-Z2)tLCa&mL zWD-tRDTvv9ny82B3k#)N1Jh|xtjsbZJRQ<13wukrxuVO$>A=X}sPd{P_N;ZQ(Gzew zlJTx#3of(S8NZW)r0X$d4%JpePr>psMS)dTZ};h* zvB#-9aDs)3)QhKnMvA_YRm#mHomD1U2MaXENA9C3igJRg8Xo9 zB#RXHx4l2X?s+pc86)HPO;XM5o4F9@)}RaC4f5r?{#D1)PM-A>%ep7t-O5ZOV-qGu zohBT`0!C`OrOjLR*Jd~EFS~%Jx}+cL*)tfjQ}^Esp5L4fhN(%|+$1LB60`LQCOcUe zPR0p#*lTpffD*5+&@g21>^dwn?h;_#K8a&{8zQoz$<99Zz`^65?3%wdNRY}PPoM~g z9pB`HL${9EDUa0?UCb@NBYuwJ+(CQCmPL;!&)Uku55(0E2e{2+79y*_qY@n**J3mL zTG)^MIKm#Ci5{*CK5Vnmj|b1~Oe zdozqFsY$%*VS`_S+^O}sbi*@PB=8Y*VuYPeOb4B+8B7*XVnIZF8zhd7I_vV9epH?p z5Zxrk@Kvye#L*}06L!R#j-^Df8Ja;d{i4#W{5q~N*FR!}etG~bj+LeL*}obJ+61=| z&p2!il#*P}R$$hkvgNG4LH@3%e8;BCgDawog3rmQTAkggY*1jN{Q)NE6lnOLf-Ywr z+^FPB09I;XdSS@6uGW`1Dc^=FOtQXWT~~L^-~g5CHbc_55WYF{AQ}7~N->Ey>5niT z9hj@;rm6V*kk5au#%u)rZwAcJYZq=A6K!|Nht{Lj>&p-eXRUDKE5>zHj^E0hVHcrij_x77c z4-Pb?LKeYPsRl&7(#goaK(@<$aIERux-1vkkX@l)UF{_?akn$sbd!73z)5uSsRV0l zQ&LlzPuepqOLY+UFw`PSRn<0XLY`dnv}}sD|H8>B*F7*rpbO*{1xD`>4lfs3s`sNN z(W}ygQr~!B4OdR=p5!OptK5i%MDi-&P>?(V=H)h{{ zD+a$AOj3O_D}LqigjT|sG>)4 z*v>Z|f&nbP_uhJq(?vJciNHx9L!!u{iKj-RuBX2aGY{I(;oz=TCgDmuqeE$Fnrzp$ z>-*rTwfC|B7HeAh)!pEAN@wZ4OrA^2P+V$#{h^6>^Ftz@-6orCWaLLLJLEE-_(k*$ z$kX>DT!DQ(?~D#=osJ%U(_^`I43BuG|5@?Cv0hLb!snWH({b2Mt?#b0FX z9~FH9cf0G_2HM{C;GrcUCr5S(QqF!;CSOUt=N1juDO{z^zMVGSf0?zJdE4LZs6&4o zAf8k@Z=|O5GZML0PIiR9Sp=h6LlXfyI;vg#)XB*UZwFSvG@~8-472s~tve6gUgWBm zwJ^sDwXd|=bdLq5Wsi@?b}|uma)5cJHA9{p;Yq>))s`4wIuxOd}m$XJ*oJ-f(%OP>Tan zPg*Z$;@?Zb8jOJUkvM993XVADNN+M#uI>#PVccHns1uu{9UjDodj1@GcE-C&l6hC3f79A4 z6^E+eN;V7ofJbq_N}`zCk-EK_8K!{!edzjKl~+rgFSmxdN%C8xzYGNg1U$Ke%)@4CTMvw5nLk>-A1!mLSFd+3=lUv^S=$xcd%M;`ptDAOJx#~z;Cu1X_w{xDrbR}54=^b~$PY_!5Z6iWJmaaoqsvjTa-Gbudq+dK<6Zw%P8;)(ir z8j@+vhd)Vc=Pm?FSFRnS!r|q&UF`&2rLF^Mh85k3Z>~VlgY080-S!^IA-)Q^IlSbJ z3zqgLWKn^7zFFP^5jm78ar-Rjx}+LE`SU)WL719P-%uKzxrw1U`Lr$e?HUgiI)x1i z((or@=&2D~0}CP7!MH7-qC+2UMdpr-^xn}$Lu3N2#;<|Npl;%Uoj|7#Nts3yOSNUY zPMX-^oe)09h^_>suwM7I)6nfwRX_i!x_z(FO5H^UR*#JY+GL!#Ix}^X6`ihUN0nAp z4uubSy7%oO)~+F&LMZ<Jk}h?-@1;TrY7fpCRViU z>ezdlefcO>2XBmKJ7S&ju4fb$wyKHM-NtEn%-c9>m;h?+Lqmgtu7Kdn6lY@<#E{jV zXfgI3|Gghp_X_wG4cNRh|Ra&(Y-HFpH5r%)mg_L z!69h;Jj7$bhun!E;dK}}+Z}gO?@z*GH_MQV3A?r!L%VI%9{B#_^xCqDoY1uSjRoL; z@oNi}tWN|DKjSQ83XWTHFe@RVHHfYraUOoP?zY;(27^MVHmNkDSihw;7z8(kYXGqX zn@@I1b= ziE;8N8-cFFL5W292Ez!hiod(SL+|O&?9#DVaipJZGt!3zi(IOgNf?BTIcBZ#G$Z+` zVOFSQakdqA$f6UUY5B=)tSlG1b`ZSFj;O?S$dfoF{tRf@jh&vngX)Cv)$~kW?n&ei zex@cR!*5O;{YFj>7G9-z15}CSa1UsWO&7DBn$;00DKVqkGt8I6%s>-Yl3X^1^>wNp zz!Mx^8ZjiDeDt|Sk|x7WB7r*);n9JV80`c@DhN0mMEU1z@Si5zElRfkW9!Ysp^U%3 zab&4%?XuHeLfIzkkWgePvM(*R5M{_R%#flel#p#~Az8-K*vF7$H};(&nZX!?8OxaM zx%>Q{=X-sg>-qiRU)MeN`#$e;&TBa*Z26vOGem|f;hnB$c*w>XvoIzsVPQV0ht- zjtu2%Li|aDUyXh!qecz%=0XL+jJUEXHCEBsd2O5|-{&69;5R8ws*mt?Gkf@-V{_uv zg!iBldSDP8gKG`%6`A~ zy?J&dDDz03*u9h7O#mzfg*=x3uQK$=^P`;tK^cSVf(qDMe)kL;^0g~qkk;If#INJz zV*jI_dW7C(Nym3$L`I^p&&2%-P(?o^gmu~buBCqXJNZqOe>bGPjI#X`L%z1bBx8Nt z0sniBaK5_aP@odERA3pQ#*x$4CwunYj3e5@!+D?wYCA2)rxw)(+Vm2New#k&`SQNu z(KrGL+y*TpJT=_|o!)N7pKs>NUUj*FEwyX7rqrelO&)lZD?MA)wl;-Z+W%zr{dZ=_ z&%?^#XgIk}s$%?&Kl`3Op?HYDu8SyVD;#M7u%rJYfc@W{)ZmHJ>Q$|-Mh*FPv`l-C zzmGe$iE3#ID?IboQ`7dni-1u{jJPNs;kCE90gR*v9d(O=&CugRO@LhjH7Iq2<`(SQJ45T_ zRko5j*Xfe|Pxh``9)W;#7-kVtW&#;|&N1O*2#oK7U)ju>a*%b*Q(w=G{42Q=My96S zhnqZZ?=4vK#u)X`Gd|6hl8RL8ov>sod7Sm`ynQ+*Jv)Ym*y!zR%EF_Q!wBX5E1l;E4VaI<48 z`wsv*%UD>+XkH%1bMt{5rbP78ur_#t1+6M>b zT8%>KCeI32u^vWV?*nZAv-R8U(3*PiL^^$pWWZ18RU%}b1A)gbka?5#8#ExTm%Uv( ziK0Sck^;+-+YYX=5(J!aeDd)snN>LZ!q>DLy%GTGBO%cIf9c%(xE9l7lO)AAYW#1H zPgOjros<)a+A{e-WobCz=}y<6)-20+p`~apDMi`m`2x%|mwmpNUbK=&)eb)YUu)^i z{kvcn|K)X%UP|e?7{0$ZYx+YFE~`L`?3hNm{*F_(+`!v1DNQwBHE8hHZn*zCSyCc1 zSfUrSrE|FT$e&gTO{f7!Wbr|Xb&|4hw`sPoK~bo>eze9|1~|#yYYBf*azE7BBPL4M z@5|`mr+waN3GDe7dhWKN946+#ZF}!1pc61Qx%b~Lj+^HaMdNp}<{O12lrmnf2fkfx z&#pGNeT47Y$UgC;ZyU-g_I8AFNw2OeC-_VX{X;V5@5m^hNzFOOEmXCvRh$2$pTBmB zVgm(_Dj~B+wd6m17&<l~{>dSmw zG;lQkyT$@uX*0j8Q9eD!4+y~!&tWy2>R}tjq(+=agHGzm8!_%oMg6vd;eN1m(7LAQ z%XPBx6~PWb(aib^V&kW2u>ncF%ccO4qi9yGl^DA>2T`T`{0q8eX%=4 zn|Nlv2$1PzPp$nIzz#?|-+L@6?E6%-fz6U%kZQ6F3CKQ0es`=&iHKsaOYfpYWPiLU z{&TX4e~JXtn!wo%Z?n#ixF)aHQ%}r$w$6q#-R~O0 zI~A3`26$4t95e|)f5gS&|H;wLm>3nl-MOx+Tlm6TX6t#P(7(HP*XVifwZU3oQ z0TflM?rF&ran+9K8|6sI+{hnW^#%TPaq(W!i>1#mz3=&uE!=4_@UD3iqIEVu{k?{d zZG`S=p3LmIpSC8e|Cih`_vmS?Kun>6v)reTve|*({xCj$s+Y#5_NHY2dBGWJ zX>&DD@>l?+Jlv3A^PgL?o-1F;%Fn_e2DUC9!0Pw(j`D~H6ED!o$9|AQkMAf z8Y$H|buH-yagJD~cp0WF6J&c5Xa64YVL9OTbuUh#_WvL4e`G$_J^l#37^B`(sp>86 zsM>#4)`3#XBLfIX$ti45(-vUsoP=ytJW=Nd0M<0F{QS_#%U^OH5TMe@k8~*}0Ev4? zc~xI0uBb!VKHb!5O8v260=I&l=+m=rKS`E-3~%h)kht}10&tFT%Wq7KNycAUzQpTM z>bzbTGFW*A_#QRvKV@Vgg2tasFWG`G^PlF@xGXQpTs-&xI1TpXuB}Vl@53GbTwA;C z|Kbe$Pla>u4ZsAcz@2QQ{*;s)htEj4;6YvqoDLF`^w0P=W5-pwzhXc*c`bO%Q?Y_^ zA1DhOvud}-7b_bhcG3|`N@3soc_x+TsV{NH1*ygyrIfqC&>)#jE_#DdV?3k6z3XNg z1+BBGW63j+0Z*x?BIZiw{3#yCdV(+5!-X$aez<|p=L);|C+mO8pnvh?cF0xviCdZU z-)@bIr1hv6i3bC;QhTSLCLOU?FI}>bLti$ttNgXe$PqxHz2T|<-@CQr`qbLJfo+wj zM$lD1_bMu%Z*pBGge7lD5iJJfKM2N)tYjvpl~#A4p0r=NdRlndFzSlL;fz}xk(UoI zTb&~Yt-Wlr2a^?DItQ>qUz9{j?W$T-Mv5enL$s76+hxwoU)Blu>&O2e!EEax?mz?h zVWU!t<&p@Avk+}_d06Dj?De+ZH1)R1T+_y#8=+2`){lWi^~?UD&$%zT*{EH=Z0;7C zfqu{a56YiFR;ZSO{D4B6C&Bc9qOyYc@Gv<*5sg|wUcVq&xn;Efg=IYns55Tec}UJZ z>%T7TZ$^!h0DJ0CCs;hBw6Cu zEA`*Ba&k+su69_rfy8MsC8!fV-w7SeNdc$C*|{R6$heu4xYO$ zlOgE7N6<;5gW$%tAM&Q%*8Pp$xC6M~*5EI6{0^8~lEHJ0InN3lAbAR%l1aQ2X{x!a z5g&wqZ(V<{a<(#)$MU$XO6_nU_j&ZD@>4f0@qr^3??mB)ivYc&*0Y;x|8?-XL)>}S zF~l)#J_*5L3m1=5*bI_w|Epqt&x6;H)oqoL^3WailuDp!{Un=%z8+PlrlG*Jm<^3s zX~Lk2A9AhK)zl&AmLXY9D3J=@4ZY7kDJGeEb%0Uzr_6JpC8zFa5@f-8(ei~>W;uq@ zFx&H>A$;nA7$}$KE@8YK*|A9F*ojML-nEP{HyY;t3-q-A^K|F#=n}@2j_ySTT}`?U z$TR{}`eJz~=eXywGJL%%BBl0!n@)d~y_+h)Zv^O10SepWeq=97^M=+L%79t(ojc0L zwR7LQypy}7UVI10+SW{Tgeu3F%pCcXXrDskUHzgxtO6R-bgu3z5R{N>e;Rogq^Ac6%^YcOZ_3>>`mf}5^NdW?)#$Gm+DmeQ z22Lr7Xz!4bx9j(!<}$cMzhw0ql-4f)8tW1RGz&+-kvY+eqq1))CQtOW+gOBrtK}Eo zkbG`tQXKCFK>R0(>~DN?cht#s-SS>+i~py9=Du=GNyBSLdiCYVqxu=@o#Lj59WLjZ zhviS&06xTjCSu962MezK)8#|Byw)0+1R|2Yfo8*tIYH%gq(GpZoD1p9&f-dG4e`PMa6#P7C5+ zB~1~bZGGXG5OII`O7|PLN^mcmeyb=fjjW`7=i3#jh3=~e&FQaOhE`(YJ$1aBM|FDh z9tc1F8kcwS&mHc=|CGfMkN))*|8u@Kcz&OKUQ0<7;0&#+#onUev3R1*WHblwKtc<$~h;c>-Zej66(CHD{Q! z3`f7;A*r)R;E}URtLCu53>{R_l>!YeU~Wjhz8)b}n=cDAk4GNQ=-_0;$9<6G`va(l z|F@3l|HNygC;tfdHKa@ZW2msYBKOL*WXUr5CEwWXo+Gyly#78OxY{AN6R1AjR(b4S zdQszAIO%3!EC7IMV6(tMchxVZJOH0XDv6*x&4)9niAMyyEMF(Va`98@3Ji7zh#z@ zhawrWV;2wy2SId4JZA=OrO8D5)`NJ{2Q#4uY(=8JUcC12C}k5xDeN18KOz_I5#lq% z#2CoCKX+`;9&OB^%qJ=*A~ik;Xqy$4ewV9002sz9%nQZ36hntSN_slEX~fOoP_AnC z9~y=eo$ehUVC&|_?|$Oi?>yy?udd)&oIg=>Xf5r4lH*T57#-@(HV^x`*mvk+>ETiZ z40ATnoy|Jn{`MPMz^Fd<8$DIG zQ0UNy?{g@v8B^P}_pRGJRUOh}JuD+)?aUeyNpEP-Kq?9bpdZznQ2QHM?*Ddj?yS%H zWliII)1Dz{?~BswA$V?k&`am=NHAkFv>LiAMVnP?YofMeku0G}{i{6G1T+%9IPHF` z|02IgZz^OyE>_CJP~k3|+3lBpz5Zh6q9XSAp&3#Rx;u(42&<@l<4}lyFn!t%?MUr)@lil(ocF> z@GK8<&P#XAV{q5ySu7wKNe6roua4cAAPI=mddcSA%SWau?txz<=|W~x3wnnll7@I$ ztd|+TfUVbB{2O;Bl#}6dJDrM1oXf6sB*xC|}<$7w@ImB_Lg1x*is`i(5ze z`lo^6Qk>5PrpJ-`L*QU>aq&JEzq-k(B}NFPHwh7ZuXT33@cvi`Fnr!mxi($%yb8iY zp=rM96_N65gh%Mkzzv1SC%#WVFI=8Z&+r%73{U2!dgw>Z&GHGEPDMEjoZ&#+`gwr+ zvD`JCb@oGuhJYvR>1T^ie-a{u4#*e5&%(vbPB1lJ1YCWxYQo66vH9w7cz&Dicp>D< z{ajL&C~zRD5p#*qZ;j*kiq&VHFJCJjd!?>CEy?*j)#Q>(8Iun^`$E(|ukbe;tEDFm zq9>#PK=X-d6Dagoz0Kd&as@e=dkFPvj|>oICD8Ko)=m{LRXQ!QHS&zy_?P${QA6l* z`y~1xhq)}kOS2+5DN9I4w>Ox+zCOI9AJn8P_`a+s z_`VEpe76m=NcKc~MntoD-cZTx^w9@?WoY_N2FiOpLw{>dGi-0!F`NI~Ll+tCC#aw` z9~x6TYZt+K0k<%`J=y%EXi`>tHz6QMT+lJ~sPS4=<^~H`nKDvHUyDyRLI`Pj$R#6r={)^%oA&* z^HcXA4T9Mf>i)o0EV@BF-B=R&)`5&OQ{a~5+gi}9<(MdQ3j21r5oj^8c}iW5a^7Ww z!qzC^>kF%W;1h5_kmeWlo;MkH9BK=|5|SLs+&{q2`kntxH7Nof-X>j3>7GWG5~)mH z&qn?_J^MU7hS-tbp*pj<&c0}MYIAI$1_|3u5QW^*Y`7r2Q^g=vE8QEut9=PHBydXmbDBS^>F-nX>)7CZ%l9zz7b43mE2`OhR6?)NA#s-r zZTm`he>5hsuCBa251I=rnQRU(q8oRlcqNt(+iS5yuxfFq6fQORvXT2>4*V>bjpWA_Ds1~#+OqSQmSB!HFj4hA<5TP6M2kfeYDOev(vD?<6ENwsr@Mg(!hp|%gc@|CHPnB-dl(IJJA=y?uKr9hOAd- zU)FXq6Bw2CBIg-NJ9syTE`j`wdNSs^P~@!twB*=*^ie~f)hLNzxLOW`k6c-rMNtE32JVKgz1< zo-Nn-ylv-!@RcN#+9{hFcRWeTL((P{VQzD*_1z32J2W5lo_&L7J&~4M`waJJ`#F0F z373oH5lP%iUT>gF(IgpqkUn9U(ovSz+v0`wr$q=Ko=Ql;I8xHb%a)NU?yE$m5ros_ z+~#KPtyDUH7Z4Q8kZXpaXcHH~nwJ?QK&)+&s-R|S`r&xS0MrKitwG%e`%MytX99n+!Y39rYvc4J zpHaCtDB%SVy|Hog<^_{B++5@z&=s1U(asydMsf7u84jr~`fRCDp-6$HK#y&fp+d!I zX#IjBrVeGw(nyA73g+;I79>Ohb8U2=MxIsRyp~NfX?zeW2%?+~iF{tLD~ce!VJa?e z+`gAI&wYXYK*~{@YnqZ$Hr+dirklnH@Dt82J65??j(Qs_<`FB3G|s)qG&WT5ccGWy zY-2`bM0}m8uX@6?wMZX#w&hsUmDua`&u7lJslDtP7!lTHe518VBSBG7`eV_?Do5Z6I6p-z?hx!F?~tAK@6l{Q7k3g6wj+e zFIDcP5wgyTxWu!*7n?|6 z%cg5G*n4Ymhc?n`GfL!7HDXi6+coyMH8TA)Vyrwh+OM{&Y5hNS4{?lSt+*_Q*_5n) z)OLX~R@>B7+01PC3e$Gtx+|!#jc)Q;`Sk9HvXGR&u>s^a|KM#l;SE zY(jB_gF58lbO!wxtM;s{Z09l2`$AIXPpS)ZpWRCentLYS$U=hBoEmq!%Epyn*vU*y|blEm+vj^9yHeD({;a|J7 z!)(OS67ZST*Z}DFWu@BUOA65b>RvKy!>GgtIj6EQQlwS6EOG8(9Mfuv*OvKqrcgN_n$-MJbVaIT9Bp{!-_Z@w& zy6$?HJ9 zgokd1f1t_?cf7b#I}0o7{ZNb5`0Am(xbmBr8Jes#AiV4g;T}^{v4tG;>V)n;EfPaN z-*4~1_-^Bg$&b$e=)gj8%pKzgQ6vCbpMTq1xsP*UeMhYmUFgP?CW7GyY$Gf!L*=_cIG8f2Xy4YidR>e4lhP~hyz4c5Sv#Enq$F&& z%RKDWHu>eDSD349{a)9K^fLPgzZ0ywUvR3@Mmls{g{0NbpzX}nS+@k5d%C4B?Sv53 zQ+3*!Rs@lkiQfXcc?A_vD&1r}sA>HH{;7HR{nm~9F*nDgR>uvvlc%pk2MaO8wwM_@T6!?)hF@O$v%)>-cjW~qnHEMp&p zNxBx6aI)Klx<}zJ#~z>KnNi?I8Pk_dO-{gh0&dhDh@o&jOyv(`jm4sYJ7$#UTo|RX z?!(o`xYw&ePM?}EVk}65C#LXigprR?~X4z3a%5`mvkfyfI3PKzaHV9`J8Xeif0;RX_e| zyUpWR>@3|TVf(xyteGh5@mDxZ67j&q+z(0X16C4?m4}lW1jm#}A>Sdz-Umw`eMb0E zo9s!CUd9+1mNAKNV;=qEa?xwzlHq^&UG`UR?a_gL3D-a?u-(gmAKa%C(PY^4t%tjd z*^Hmdo~J)|ab3);=w59tZ*|TzUdLTrLe#SS+xm_#AbG#ASs&pj-}Q=^5QU|$=wk4m zBHJ~<)?Yrz_ZvOe4# zhKy{8?zS&yj{1Fw|9-zzi(F+=M#(Ox#JRAL)c8BU$sZqINDlVZjTXWxmZ`VBA%Hs; zR}a-W39JS^&0ZaikOwwj9^uksXox3?i&Nr+I88TQWaL5YC6U^lE|;RAgpN44KnZny z0vKqvcNG9N@O9B&K{+bFOY>8(rIu4p89g}rsJ8rfd-N2{LJ>7(!9WL)F4G01@Uts3 zU#9pC;&y&{`(+=+uiB%NviCnHAbpZXpupY@<{1U z-1A*}KWwh*vbR>$JFdWPqBVk=$Ceivd2MKytsg~SgqzsfcugCZN388|GUDJl%J|ae zi%7-rC1RmND8jqmDpa_6YpGwhE&=JZrzx3EM-dHUL z+?oTfF0m=g3|`w77ldyUoS_BYwAKXJ1xt;)&6>6Z7oBq;P0x@*foHHk>7!%21uV)d zf;73S`O#wG{Sq5S2wL3~y6rW1ly5!NxwqYz{$3O>Y7UP@b?-=OUNp41v?GR)lh4uD zC8Xki2Y;AIf`>f{pE;M${Wn!M6?nV<0hgXd%Dk#&NEKcA*2cDEh&<t}ER@9$ur&Y?`>+luRs}OJmiBS$UMbh9(B?=VqFn-r1@PUjmuV*sCBq+AjVH zt|5MoUv(CZ9aRv~W^vJ{E#OWsOH*^L{mISD+;X{OeVJ9RCB)f)c&bNFQ;u|^6uc)@ zJ}Y1k8Ada4U7rM{L!^SnZVA`jk=tmI-S~$9BexN(Tyh+< zB@3Lnh>0~CJ>uzKe~>VyGdcm92B2se9tK8YRqd07M*C8^%pA|u0Y%L6h%zj7lOy`f zF8wrMK)!S8d1LVa3Ey^3oEEa?tBs`1kUjV-6uA%cTe%6%OKQGM(_C+u7Mn7UDH%aX zR(k|>OZZZHS4ZW_LMGShA;J=CN*Ef6TqdToc_;y-@%M4@(D=CD`u;T98hbd)qpY#0 zBR$3pn!LR6$~<+hL?hcZ*FUP)q&|dliujcNxIt%cCy4Fw=VvZ+sv4`&wv3tCn#MU@ z6geeqtADzAgNE%3|31Gv1zGgEt-M6n$T!AIoJrb%$@d4)45#yp^ zYqFxG&Zx=Y0uPE{8#VKRy_MShJa6{{a|)W^6zr2Mb#=<@-lclT38H~(t~Nl9dJ0 zsb<_&NLh$TwdI@#_QEf(g!@X)RI&v+9bed!q3eyfh8)~kFd3i+8(8m=_VqtK-;PcM zQ-7BCyD*_y!w&Hz9;Mgy(_tTXYK+cz4nSJ%X=x+lk{SUMO629`M0K!vRWxk$WuIa_ zp)@kn*&ANB9!d=V*x1bSnL=NMq!J2IW!3*@761%MF40`tlM3FD4PnaWcN9VHd(Enz ztN*)Vt_C6Wc7?wyB5&^n2$>2B29f5x%)lGCDvC#Jt^{CF6g|3?LCrn&(1-8x44q%OA-OCG{Oxv8ebYY zu$IcQ%1&+G<2jB+;wlD1;iQTB>HS$+Gd#587lekhA`&L%us|C{%MiF+-WE%qZNzEB zsNGJ$@K6X2o8RS6N0zeKsAa*S9`^u=`&6_3if#r_1 zdD(5SbNb=lU6Ogrcn7~AhuNleRpb|{s2=>KZ&H0eDp(y^@2ldMo4&f~IhbMMkArGp zQKz&$l8>tp_a#ZBLgGMfK88?QwnvxN_VbpcW|k1<@4J1V`ue84lt{$oHZ)IJ7G9iJ z6L!^~lUx~|K7ic0Vxb65qPe;DvX97MgtQDfB3BQ)RxcJBvIsU^#;J>pJ0}9j8q)IZ zaL(FdJ*BO*3G%TP1*XoeofzFbp1oe_a=hQSR4kL3MEpBum^3~Q$Qt)#=NTnoV$f0k zPL0nvvPwjk9ABf5T_jN5&OU~*;#^Fy1wah_-oCxJNhh*=%FvJ7t3Gj7I7>ACA=;SS z9?GcYJKH+xOT3A3o&W=IUT+4Dsxi*rEPOlRy@PLK+vYx)MMK8Bm6esnbJ!}{uD9~l0Y;+4EPl8^YeiNNPx?8}Ms-CuN+ao(soGZx zxZap9GWB`31%lIvrufEjhJ~;D^XT3k`Z^oNHX<^2cHj(Xwby8Dm-wZv+awGlS*{N+ z?;z>Dl9;H0*+jB;*}c_nzO6Rst%3_@Mf%qk2cPGT41Cc5Z7sPlqZtfI@;x_lr&!*7 zm=x7x=W~*|5*!IuHp$E_Lc?;AVhrc)KJr}wQ*Y$O#+p}P`ljQ`(fxEA^o%1=e3A?d zFkYVF?c>eYub=pau41kE%r%Y9g!Pcd1dk#^+fB+I^{D*;)U4%dvQuJjk=xU zK)yE4*tlrDthsV1B!@)XIGd23%~(stR}r*&UL+aRI*!!tex%!nD=sOH$L+Us0V~xp z!(of7}pF_|(4Osjn<=2dljv)or2Uaa2PwLECNq)VZ_qb zJaiNmjJEN%PPMT7e5W4@wYU(K;2|=k2ci(}{(zX&i1cs9{dgL;jTj&IOr*UxLD={A z@RyfF?%wGL^A}GP_%&iZ8;n-046mgn@m`Z?PtpA063`>Vq)r8yr zUCOAk{P|R#EeD{-dWJQ@!{W|QcqVDYdhN0Lr`v{y(e>Y~I7&g$j*N-WMXe|r0V|ECP1S)%wnH7Edv z%t|tMJex~%BpPZWLG>#-sCW%>UCPTtkD@Mx9_UK*K)CyU7JvVPwA)Dz&RT4;7{oew zbQ2V`FRp}OOkkLkjUmMYFKuCt4@b^Fbd~B{)Pcc@+K`3!RkxI3jGyefFeK>51bUlU zDoh95EpTpz0DSwcKlb|0(S|pPJCLw4Kn=J{F=2V28HE2VrTQ#4&q{-Dq1OFtyY?+b zzLf+{HKGPbc3b3*>OTC=)t}ve+4oMHoS?*-l=Z$5n)i;J>jaiIbbydZ{XJ0?*m#on zDe`SeGtKExpio9fR(N5N_Nu`Io3>zn@l6kZ0pGmw%F|qJ7nLv5C}^!629^}KN&aXw zo}K_>DC66tgR{@Rcesq6i;hm<4Ve-jYW6JE|JWVac*jixeMa^6ewE{qxhoxI2JC}_ z4PNBLH~gnM4Vo2t^nvx6S5}K!Yr?O??i<8w5Aes4gQp#O>8z!*V=q?UOwTx%`6377 z5^zZy_e~reN&hD3Em_FxXh z>yX!4#69RqqD9lb)W}?zSiH|$`v3bzZKP{B+0)PB8P+tT_O{n%iQkf9eVqZG}4|r>hepu2@RKJOhvy*>tO`MGo`aNhME17F9lwB~4B47a z!trNNw5Xn6?A~$=I(xD7L&_eOG^D&^jQ*(KZ({HM17(-3nPNhIDX17^A{?gevVx6* z&F#g`BYi4s#v!h(^SrQqS>R<5sAZXS<1NA-H)ep8vbggUSmsA|p zUF8Gs7Z1)gO;s;F$=)vo041>N8^fLMDNRH6)4`4I^-2b7x4HVU$XTJDfduLO&Wjgc z)h-Q*Z_bkUjK=vtISqMl{sWM2jYeOx@9iY8TxgSd_>EQ&`aax_6uW{lp>J6`psUqcXJb9UU{h%LQh!zwalnec-|9`24i{G z)fNx#qMJn>4EOUUo0IhHzcFZvAp6z=9V8u|`&vVz)SJa~on%l>USZQ`rORY*sLpTP z5AZZc7q=*AsO*co?5@6B_(WRTe;|+YK(oSNtIFB6(cu2@ITDnqPY3Jlw!cHPYs^p_ z*sKpqCw6G@qk+En1RJ++P|@F>8uHiOM&@0{@P16ChwGm&jE ztmTVfP^u1PWz739(+CR!i~+=Q!bdob5R{Q*Zog<7K3yY;AI@gJTFR9ry%EU-y{L{w zjQ>L=DxLEQ&9xXJb8OcfDmK4iMeq{MAi*4p@HY1#&6a{t3_=kb zJ)bx*8{b@n@D|)f;1*qW^B+x&;`WC%i}8szD0gROCtG;v_}r6NA=@65ivsFbZfeI`$@n+#`Pq~vF_e(p=` zc&G>IP(BrziaDbVe7P&J4pZ^S;65Bcl2Ocx@7)Uc5-K=^S{4i#U90pXxr(s|oyT5Y z_Bba*S54jz{r$Aa%*U(kci(ZG$Ugr4aDsVj#f!zlR~T`AG-4@9W3XCbD8dOVZW^f{^qrtdU-M=S*QFX|O={|5dA$#xG z>($PgwZK?jz=6XJ#I(Z`m0JU{j33K93+7>K`sE8q9ps}943h}$%W!6Uh2OZY@@+e( z1sL39bJv7%jCM-}+ z%+`A_r&C_$CDhcSM`dJe!zxNkeyW5PeryhU8Qw^M$uXdV{0d3A9^ec5Z?e~x1)upD z9Wa2tUG6a9*rQ=#L#m9??d`{Ga3_8J02!W88FO)3o-{%{1B$^_E9XDFl%+`ME8yp;0%g=rBT`sFnG zj%!KnW;WYDNK z*`7*ZLfD&!#y4!T$FDJ>*jwgGrPLnkqdVeRHus@jPY1=7W`4San-K~|NmB*~CX7#d zBV1P&3fxcvCt2<6{U6?YC0ODnnn?1?I&El=1C4iIL;4!TQ6fDOE>usZkAqdLdQk(&awRmzx?VwjFR=hH^K?A61|{Aig1}ACu|FtsNFD zQ9p4rOamqzPzcz@T=UpjYl)5-m0~#5J_AiVjC5C)O=X6Kz}Bh6D9j3A3r|wd%l+FPpP{F$u|bBRNQWSLEqI3cA;|jd0Kg zbdtG7<^7DZy_Y|<16~Wu??bW8oB4kAR}K@}>xYts_) zak30F6tMe~i2er?AC}?Uu(lh!$q^ZQu+Hf-vNM|B_ZO+j<+&T;TUCU^+Nw|P6`P+^ zVb`GBi=7j|uww~HPDNZKmO(qi(#9)e;A3ltBK>&^B{_%^DH`Slr?S8nF@Y#($jOrT zLS%y5>3gK&E%_C}ZwBTU{8AA}4J+^BJTwo9CV+}b+u7eN(b}KTDCt0~n?qTvJdXr7 zV^3d6x(45spVHsiu7c(I-@554?~8uRk2Zvg z!z`jTS@@vxv^q{1xRW5i&hDF@vIS>Su0LhGE4)7}3CIql!`R@i#3>2{WJ!gRTEA+yALilNf1G7Ggb=w$K!*{g*{#b1n1WbdiiSDz z6#5{t?M1^$l4!B^2&(D+>L0gnFPI_qRyVB_4g5j}WDS7>{6oQN7X9s^zC!K9GT3Xg zd=Y1Dl4};^iXpqN5s1trNQ+uO=aWzGem_*YTCv8(e|iyjwBovG%K6f+r(J31+df5g zofd!cWKjjN+@&56&!&AZQt>K2mt6Ioj=tuLvijbz{n_gNcs;?<%^UB1m>1T*qh~7G zV1r&)&3$#hTLF$&{;fQ7ve)XG3hHu_>G=|79Pg_6mnS7H<~0v}SNF-_%$0H-0>8$U z&Lt$!(veM^Ob2Tpq+5xiy~KPr#Y#Ts^frZ&imfYkMTuS*)NY5boOJe_m3E8tTS}gY z&PA&n!?f4kIzqz?$m{+GkE#bAl<7tWxEU0Jc!Y4Y8gXz|fpbFo8Z_Gz(4*Z9GR(5{eK#in^jWVe2E^Y=4v@E~CdRxvW$ zFN?LPENpXr6CB5+N5NLZRY}hS6RvSC<^(>+9gVcTO2LXNnI-I5(Z_6CI@vk=w?@}R zrU991_aQ5`HbT^20>aI{67(8^RKKl5Ik@C(q%Kv)B34MC-6a8$q_xcR<`;&d(Mxi4 z|AzA9Ifh>U$}U9{@Cw+-1X(HFa%p~~r>>e@#tdpa=y02E(|810n~adGdEf723dy5E z)UHHTBytpUA;+6p7yL%SsCs{wqe=rG%M>4x*+Vv%kB(FqK>v~%`TOsy7{4Z}3xYfs zJUl&27GgL}p0{bMU`OsRU2o$yV3NA^3UtuwUgLfhA&%1N*Fa@TReSN6V%r_F$#f+><~$0&_~79gA4_+FrO)%|SM>UH;}83y>)0mhr&q7;Cp64! z^>nilwV^!L(%}oVE>k8@<5Fh=Vw9}fdRK^GTDxK>f@fe3&lcMoX5Y-)O4NgYDFm;m zs_i0Ql?@lYfx3JJgPFT7cJ9?+LS4Mug!+~3(D2PTg!h5VbHpq~_-2nolTtNnU-h9L zM7-o_L|eXe;I9#v3)AMwdMPO5n*=Yq@Ouvq?;PFo*5mbK*H22*OHGw?7V`^3Ji&Xc zAdhRF@fHufEufuTztfZUOO+D@rf#?vv@j`y)D=llED|rN0p5!`TJ@}Ui2OuQVzWdz zbL(x=r=`j2?Tgzm!J)wjaW>@gcI8c9Imj*)Ck;05&jw@VP*OXz@4s^)Kky~YcgcG2 zls?hylBeBq*GviTl(9GZ@U*!W75(b^8^=uNs$WV_`Hk(gHoH3MAL=f+?H!OE4TlU7Nkx^7++E0d=FPHC?zYZ& zDsr{$M>u`R_=G!+AFC)|7U*tw?g^yf3u17sD_wY0SY!2tTOekqn>Zs{l)dWAs!Dy` zZ9MYkk=skW*WsLUhuT($zrT*h3nv#N8gzI%thTI0;a-P%i+Gj%*wY_N#{tYy2``*_ z%go8BW;(srnsbpXC8WhIU(`$&(NL^zxmk0pOb$OqHG$+=e7tY z6`POD=1w=&L$svbIEqq_ne`onu_(W*|Nblw-u|BK%}Z zA|7Fn9@n_>20jU|Yic%1Tsrr~ZY%K5NjbDL)7o>xDSJ4Z{b!s}L|_(EOv>vm+j@_> ztn5}A-=LdPNT;T#p^B;;O?G-?Z5>NjODZfnWn_80w$pMrHd^&#ny@uKcH59=7G__* zUuDd zkIkK&31gfQI zM{$bPL#%Y+rY@Z}#t>%ZRQC>(L}ooq`{|ALv34sitQq0Rajt&zLyv!sc9QR>mO1B~ zBj@}z!hkU*fjQpDi#eQ#9bcAqc#q{e^=@h)i>P#07QJ-kAN{%WePPIBsh zDP*p2WXq6Hn$~r`mV8>8n%b2A8>EuJXq=4oXhId(JyOQgZm@W{O zV^eTb)64!h_oeP?+jwy}H2e6#4+}Z{7=XP=lag_R%-lWd>C@YET17=Avx*y3a{ii@ zQu=icm5*;P5}L}b!4tro4=bCNp3bZrh{`<4gJLqpvF1Of4(>$_TGmRP_-Y>BbgcG( za+_SG>=-Z>TlL?66L=~h=*BDSJyd_WZcw(dKYdP2l$vJtlYDUGmJG$mP8X!+8+N0f z`p4jn(`icfH~;qfDZKn*T4Q<%VdfF2*@STLx&Bb?EP5w1jbK{|z>Lov( zdPRE!Hir~AhciFSH6dXeHk0SlORl?!n_g~}q;^;iP%<(yW(AR$sh(qfs_B$4egUFO zy}h@038*6%uRao1=R)7FZPMKUl*qF&Iy-lEn|GVedV~-RWaICw8c^ERbaTHH!oD-A z_E8YR`k|7Iahz*GJ)u{}zY_NIe=+qPeo3}{-;UJM%&vxBX^w`KyEHX(pbaa{QSOOl zhQnG^TMg*G%NZk%ALprWFppd#>|J)ie^?)x7&;XIGy_#MCT9k(>X zA05AHWf&&7f2IPRA_RLly}?Ll?Meu=Gs*@_5$q5>(CHaUU3H0jtgtXChtitI9M)Qt z1($#97QM590I|~TyrT`{tB%@17K{5rKSO>-(=Ic0ARV3>p*m*WJDC8DVEgVCt6cYE z273hY?YmF{GU%qK&Tr53m#k{w;rGo7K7)tOg{6;z{s?qin}D(A2M*LBGPqo=Ebn_O zQ$hWiHd40PJeqe~qdv^;31=fO<6E{*{0qUan;?(qo-2D{I1P__!DHQHC7U`l>~|K z_&j>^a4k1rp=JoG*t#Htmx{uMvwHCdar}o+p7ks@9b;99z0PnoNvXO$o9p|cYmYsp z!H?`d^<0LelI&@<0W>kfbxSAoF0UjyCKQwWXG!XhRFL~uWB{KRRaVz@?VQ5R0Ju~IR?PtytZP}vhVMuhs>WJMpK(*<9fX7<=$OT;W z7KGnuoF*8ZnKXYjYauiEIVo~&YN3+ne5U7$pltw;e(C;g*vP3XW8R`~bb-31TkiOF z_ArL17D8_dr^_$F5gxA+H&(2obIzH90lmBkvl_S4qq3Lyf-87_RjWc)_r1y;BD6@Q zDhJ@${o>L-fWwDxTex(c?R!l@;%b6k+Rn^Q0{oJEK{Ya=b?H$EDH~u{2lT8ChrWK4 z2{*m~1JgcbN#K%)}zvn8(KOYVB!Xy<)MG_9sRd(-=?s{nNDa%+4 z_-k?W9VE5ERS_k%6sC~YlGkIKv?tu{Pxc!jpfQj8@nEypZu%S(EMB3W<0!Mb2P0*<8aK??fo0?IkGYy`hducsrw-Q^ z*h6>VgX&ior0qw)thNwhig(Q>F~zuHNG^6US9vzE|6bjtt$U)ErX6cQk4|2Z;mESh zFqOWaph-)Mq9f)D`fZRZUbgp?uNDh@=%JO;Q!<{E#BTq5_F*6LRAADopN&#ZDmFUv z9?a-$n8mbgpo@d}@Rq_G<+IHSc02bw4d$W(f(w;JPJ52=?5#};WJ;>I1~okoxJ0qE z83hWd9b`*LZ?NgzNHECEEI~%aiW=;$hMYiPaCR7*MD3|6ulw) z9Q+uWw|Wa>(bEaWgv+Mo`(gJB3)++MD*U{1S6TvRg9GP~tSu{bE#=kn))jsq^i#Hq zT)uz#K=z^*Qo5IW`s~8bdiySWvbklg^2_9N6&&_yPEJ)}zeCcwim3_ij*O?o?0$Rl zuD0DVBx>7k#l^aQ5jy)f_3eQ$sKGA1*4Qx+y9$_p?5oG_PmTpFK>q+>;LvXGy8&O` znPh+vhwWFlxt1L)&#;i}Ep_~?dh4cb>VB(om<_XB?Z4r(=675#N4?H``oT$7${M_wKhtDOk~u0J)s7doX<^|+ASH$r{ z>G_RlN!E{mAd&F(!&C3#3)$&;eg1+iviTPKVWreo&^`Ki*-ybQLoNke>G`!GmY=45 z@(+Ds28=SW0!lZOChrQ$%ULn@l)~4-EZu8;S6qAs_f>P3qb2uVjzp-}nMu6()Xd7j zjX^f7m{g3(9?5t%wakqzB%ydl{P~_I`8VrDWPF5xPHResg!!ivH9h=ikKVxXiX(ey zQFTB$KE@M&O15OGK#Z&8SqSG`$xeje1E**HKYH5?$4sA_*O53Z|MANVmZ=k)0U%Nj zt_%*P*o06`u^)S~5`9z2eyPWJ4n-991%-#r3?46nMtIr+xz6H z$sTL~Ry4m}kG6xVf+{~p++LZ9Lg$$Eb^#M7p`VUfG?K4ijil)8_D5jyy+`eFmza|_ z6rQvXuDJhvDQsaLSzp>ZlinKs`dzha>=A?4%O29HLt4%5i&tWsu0Ym_f@12Y$Gmt< znOh?KvIS}&T@>S8$onhPI#!vxqVl1~qvA0{(f;v+xmXFMg}RI;oqqNG9xL#2dCR_F zanNPb5*`grP5r3(yW==!q2@@{yM^;T^6*6r=K3C^X-Di+Lu~6c`bKVgws0D~*GQzf ze3Z0TA(Jii?ufouT|1f$Gji}*SsRT!3a76chP|1#I6kPc|41Z@?DYT{L)gO$^;VA| zZ8!#$#1MbpcBMkHS>&q66leC?!f=L7;wyhG97k#;d6Uo!h(EsLdD37Z)T_OIEg?`A zQc5G)`9OuVc0U9)C$Y5}iRUUrUyr|Fpmb(EVW1G#}KGMC}$7}hAi2GTy7 zPbeS=ZtA^EhY#zICy*A%ZyiVU zIOp8d<`Mv_*F-xhVH9g@u%HuA@R=Lj-PTF8Yi^@?OSRi`mpNM~ekk5UboZ20;CNg0 za!+vS5#)rD+$uw*_cd*BXi$47tUY(;0h+zTaM}F2@VxNd->adtx{s6%Pia`3O$ng^ zSzB(dW9YsL*njVmD`@lO{3kLn(M4pph|@YL>|Gan86}i3yEP4Z8D{XHSD|+9GstHZ z%!0u?^vHFVQ8XkSFWDpn+TX-}%0DhiUAl*^8PJ-AuOI1>Bp-wvQAHLb&t-Z2L|H1D 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�%+ec{FE7`1rQA|coHC)=P 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�!e7G0Fbb(MXwjQ>P=8g=v!8J8^?3my@P zGn=M7wmETAoMQ9!}}hq*gp0^6hp`uyacn zItz%~``Rxg?cK#c{sQYa*hlPf11h7^zY|v&(vGcX%wtvk?5g7M%!P}tZk>*W;A?2r z$0+sK+n=SY)Dlgd0vD2(;ro)#^hqbcjF}j>*CF-gCT6h@hA(mWMLPE)fWg=4)}E76 zR4R{TwkLa6BrC4~i1-^5)^y+7v!LV6fbX59I^K2$8GaX-lF28L3hISLl6lZ^QIA8K z(FZy)xD#cUml27#Zsb!Ul}#HD-@biY-8134Jk|@La`VG=y)B2`sQ`@EQT(J%EsPu;Xjbc&m?o{kYyDLTLUcliFs@lPwRU zPolfa?Oz5T=!F>vZisl#8$d@>T|Jg=Kc7G#mrmaEtrBz)9g{S|v z`3Zog>eU+6+J5odC8B+)(EIZ9@U60wpAqB}d>fc|M2z?uX9sM0?`%7VPHHn9Lhi0r zuQojcte*B27r(Pwh5y1JPcRQ20+t??cZP^7;OZiOBg{c&&o(f0cAdbxMK zZ0WMX@093{=>=y*eSNMA;^xjzTLQUc!i{qmW{8N?GILak_1jFOtrwd)GoGj#Ho3a? zT-VaB?^ZO1)xR)k%y7L@fV?+pZ=5bSpdLMy_Q&&4Rj6z><|4^*ef|2=g;~Qr)tF8m z90|{Qs3pfy_IW~d@v)55l9fsedr;Q&hnxVRhp0MI3%u}H1E7duPdcC4F*px?asP-e z`&vM0AJ830GcGse80yb2{}mVd?f6{+403!ZA26i@Zq^~BAhMMXr`<#*H}aP2P}cCaQR zPQl0*XF>-8{oOxhk{fB85u8`&o`E0Oh$e|HirZYu zlp*i7!j_g&i)S1%_kin%Co*(MqIVsxbL0FpB8!w>B3@`{8!7e=!cZla)9-#+xtGS2+J178}mq4e>sI(|krE zD6;ECx?nm}pMKO+8m+T&g5tZ}_GECgVq9J2O@CiteJK8M`)on-A}wxU;`<-yVw0oO zLfxds^4`zQ&8K7dQv(jh3r5U!7nYTNzYH15jTh2+p|GI*2{$-KyXguCU#*_Th z7q>X$5*B`2q?Go2Hw$Wi!nxPJS-w8y0TJk5`)$UmDeaCor!R55&g=iCEC&6-e>Gq( zJ-5F`$G))7zhXF1v5LWn{!==?DzLv?a%c7hx#|``s9kMf-4Y%~iG_ll30c|xCVpn& z@DJ5u$Sq6dste#iP?@rnfLoMALUBm(Oxv072e2#nYH#v8Ts_jyxZ<`&ZIUD23o+p_ z5aA`N1+=i~L;|!th4oWhfF~){b$}=?${k~68c}G$CWr}13CbXn4L@g) z7bJy`t@QE{E*GXoNF+LAOWt2%AdC_;B0pdfl({*{l$S#yy7? z3@%dXukA?W!}}&Tr>ruk$^7^fAS$a8Ki40w6PdEOaB! z=lvro3>zH;81Cp47|wJuVN2V^(+XEJ9g{~~Sm zMSRmy8IDfv-3mf%ihe?$f#O57y2SPEvxrdrG-1D+aR~1fi`5w#niSewnO9oIdC7S= zov;8nN5BYxv=C{id-tNZ7j*jN_72VB1kGPD%d|IC$iT}2E7&!#B42snv+tf+69W0 zx=Z{7s>Kn2I@&fu_F=(_r2WnxmS8t!vf}^k9-G6*;t2)>Xi0$R$=^r&(Wq#J@t$Un z3P801ZKPgEuE;Mr_g?dB7Jo~rep^QMsxOSoy{L)?#$MJ+2<32m7pTU-!yE zKAzqT&sPv>56ZoJork9LW_u*?OmuGndU-wF?>_zbfO-6;#VPOt^F`d~z;s2!FEKfa z32Rytk`)wx_TSVLCy^5C7OnqXhECJ&*zgy)C*dg70&u-|Z~4MxvurT(Gb~`Szxm+D zTL2qJft*oN77pzq32MC*yqBm+nmOuEN8_$*2JxT<7hYNy>??>MFk{H1cmj{p%%iD%k6$lj7vGaL|oKfqg|%Ta(DCNe-dTNPDjqGs?2gK6Lyww;Q$RoGvK3fD{FC~V~ZP}u*_>l}q%rdm$1{Py0_KmNGd(csh| z&L8e>9#?Lq)23t5g#S|w$UF!Rx%5igtHG)sAj7tyAO~av!xS4`=tSw0oR5l0=l|2s za6bpwOM`{XTvbSMcfHS}Ghtm4wWCXRz8*zIjEdN7rhY;wdag`p7bx{Y*`MoxPo3fG zGLevT&1=4AVU5<2Q^HJ%?NQHKs0lHuvd4U(XAK?rKk+0_Li}KulJ!YHky#Grnu#~N zf`MNv1NRU*Bt|lbqcA87IeEy7{W$%mfwiGuKjjVsIt$30OpRDCf5rtmx=dbk288;m zM3ahx-_6gh_evs?`E!qZyw;E~f8A51*fhW`@yRey!oUPT90K9hR-JSRi@i>&<`o0A zEZ17x5y-Is$_oXbUA_M)Kk|aRG!lKM0C3o9BS*hZ>XV{rnD^oN>G`!=`iJb1>&$y1 z0ywej^eslh`$rpH?SC+$6z!3K2gUjWO3=D`YE zjXGM}_Nv6)K-Wq$0i(@OfmW{?ZvhtE_HO+8@Vig(YNzFq^E=~3{pSa*1+B$$?Ch$2 zM5+?NijV!|?l8p-`JI=-&PP>kO=gK=Co`QJK((L2Cd$s$c~e6o0z0d0m9A)cZ^T+8 z3+bl&>PV=o%1r|WI8yl9mo^>K7K)^J`Eu#8#Gp*zf*9qG|4(Lz zRlvyd_8^Vf#@^u~O~v0e>Up}b_UfRh7>^%l7l|n8YqY<3Vqi~Z$Le@b)8WSc{U_$7 zvC$S4?CyH8Vo7xOO9(iwE4M~r8Vm1QlrH@#;z}r1Ziwt$L zY{7mb?VDYbz`Xw7g15bP1x;QGf!eHb+`(tM6^W~Peg7SO3|wzoH>2rM>vp8jz^EE_)G!M^ ze%NNPyG!{25o@GjV88-Uh^C4|31|d46;I$UOd~f#Y5ba&!|P#NRh716BH!MQ1RBn!Tl}j*FwUuLcn92X> zih!RlVFCd5pS_|BT=n9RTj|?<2U!t35Ve2yMv35zP!`1ETvVuio|Nt8R^=>PT|h+t z>*u`)PYBHOucv>1^=)3ZJhbLa>bv#falvmH*!zYDj5)%5z&L`coU6O5_h$%7vR4C4 zAT-{%{+@5wY|P+eiaKpin$Yg*i|8K1 zKpmqL-6dFO5MpC|Iw14nu6^TsdFzI|JuzmP z-uY_P`@Jq&nOqmV^?U%3Li>~+lcNQ*H13}t*Nt)#DnDre^ro1jl**`YxKuR-L}O1d zs&1dEF&&A(+v6U`Ndd(668aLOqIC;%Q@gNVfcz1k1gw*Oq3RAkQc=un4m!)aOQ}zN z^M}gZo$$a)R9PmxJ9ek+!pUqHEazSDNd6(g4oBA|$}azVig0j3Omb(2oUOELnf=_J z-&@?(QHBN%WbWx@QC2KmQ7JstJ!(_re?qu&@Pw%aPzm*(o@d->1KSd)H;6CgOqZ&8 zgte!aOWNK;mBzNI?z<{A!f#*G=v@_Y8=!?feE4} zzhlF7z%l^l)G>Y+yp{|$i_nN=|{qFZMUEf}sueXpyF%A3q3=D8ZiPe~8Fo@N8 zQaAWxZ$G*P-!j~^gg-0r-XI&Yd^%=-Bo{NsmN^kLRocb z=9`RKd^3&FrYrOq0Syd67VT%CIm!h~ zX@NAd13lN01MVySgS`IKvjNh%sC&Q1cL7CgiXzhoo{IL2v0}v8&v3T4Z&CNMI zFA5%t?h6SGhg_K05Fgw-jvl>pcWGhX2xhBTvwP!&VEs(gtS5by8H|1`oWdhbfX!s$ zh&LSr!g?bz5S7J^sV@xd-4|T`l(bL-eoq63#lSV88QsTV<)lZ2si&}u$zO1M70K(v#_^YYsnYb*d6Md<;48$0V z_d22Gw-ofN!K95}nY(0*8meatFy^;yPn$hfsMrMd?5pWmgUnahU&{UeuYp?$)WUkO zxnVIS9R1HV1K6@6Fi7yewfP-F@^n>4Si^WjC|+po*mrM(!zl2%F#CUt6MC?K?Lqnv zIn!H#qJnfEqS_w9QiYyxgMNEF5w*HWQiOAwp%j93U(D6vvvT7o@*h=4u?zE0M)>g4 zcYw8o56=yx#M_L`{_Xz$QyqP%7%dJsTnd&o&9W{<{yCsR?X4S#HXH4xY-nZ|rB0T6 z6@2^fI`w79!S3P5%yJ6<9u3aROD?jHnHcxg)c^dPAy(?`t88qe*=JVoGMgPH_q5^q zF+HQnyNgB5PW`sKhLu-CJ)hrSuY;z|iBWHo3>)nBszgXq?nzoWetUaIZVW%yOhhTg zp09J=WW=m>|MUw;|kGt4UqX}RS#<66`@71{8Rr)?J_1`!=g2^`yc#1CWt-IeQ0a6 zPl01M_~M3gNMvk>S2+)7c+CDN@A0AcH4_oW_j$^=`tp&<`AR(|TPaEoV7G`)1u^`7 zB6%MWx*2nt?X1Y&6m^W+k}0+(K`LsWMrf(;Kjj%V4rJUHB#+}XnwUP4aC8AS*6=vl z#?RB=3ml?ZLAxt_OkDE{k84*yhevjJ`RKA{&{FLJDxAL{%@Z{8&=7C-4`O0L{f0kxi9kIL4Z9vWs_y+Bt}^ZHWg}~Ln{GGV2dv}bQm{vvNH{0R7ENT4mD^ptby3Fc=&3e{ zRzSh@%yII|!5A~e@#;r7b?2Q|^WJxp>JJ^y)Ad(V2&7pKPg&JPNy7pW7*(Ki}N;I=oi)Za747Y7lZ5O?H^v`jY<6XjBX#UH&z&q|z z1yKxJS*qtIk5uJ0PmYxy*cVd?shd5mAD0Ovi{=~i>l}g2ag7|zY+bul3I{s9t2NwI z?S^|682JvPw1SyZMf%HXs;0PjrTyqm$04|Y2MIvCgc$_hg=8<8Q+oa#?mnb3+dVGJ z?p%}0{q-9WUBC!vZ3G6JwmkA=R%@)|SsHzU5A>I!V-!9nhauNj<_|04X{{pDS| zoaQ`dTAQ3i2go{0$E-rHVu+)7dO})``1fM|)SBMwB>(5o(#$!P!CYi-w$G(|uN_34 zc8Qy9XF;{Bd_2!3?I6!+*|T)WcFd6%Y0sw1 z^~6@Y18hYy!;BZ6y*M~rf^%$*BmgC{EbPk%OVsQ6Brg>sK|5PDM1bt&{arIVZn3!9 zoYy16pgdex*Pq|B*Vvh4dJPRM#zs&@Wp`%VeF4o#e^ULw$g6;j8gZ<5%#Fhy-RTjX z%O!WUuo9Q$HB*|*xvF`jW^Z2*^MU^z=vMGtIrAXOyYF2-KO%_z)ueQ3$M-*Hb!*Bp z5y^0?{>bK9MhS`GdX*oY1sg-2MY=rMO(q95!Yq|}dcyI}|5{zVj zwJ1Z{>ZI>G8_s(;=Bm9mZ6v3n_ps_5iKrf;ID!jALJ(n1yoAfLlLSv(=8yiHJY;^BioJ(U`IyNR7Cx2e(UST zz6%2#%`FjkWpq~{R2Bq%ER?1PU||ZZ62X07Z(hn~gU9qZze!?^+mxGrt#d4i@KC+R zV`AH+e3r(;r!h~aA=V;QcFHo3{b_nyfa3Fv-(Dkq$0Z1k@xOzLHTeI70wuYn(q7OcmZv$QdCI3sH6 zmI*8pO3~os3Kj1-74xJP=A=BQNjl6no>nY;nA4cH{Y3Lb9(@fb9Ee(`6ZoTlZQ>l} z{y+BKx+{;a=^jL`;1*m1K|^qN3kmM-5+HbR5AN=+!7aE1w*bK*KyY_=x9JP+`+1-F z&8#&aVBWR*FQA+5I(2sKsyb&MecK+MGblHb+m~)u$eKf5fT%%Bs^wM(4R9xHZTGo+4duvqJv#vVT3|@XReZ z`i$}ZrmBG@hdHzHJ#<8Ral#K+i92NPT`tscXPfa9qnPA`UFubE*4`dOYQ6liVFP|r z7fy;#{lf20_v3jbHIu_3Re1CWkdLEY5B^z#uGeW*V8uduF)&W&M#)M+{^%})R;%qF zIKdLB;q#g9*c^@5r6Ef|Ij}$DPwb!Zy{~ZVT$!m;^oeThuC`5{@(@k(-+?_X&)E^M zsm~V5a+Bg_<^Ygq$$pB;eDg7dOzjMMggTipI&tHT!H{RwZ4H3jZ+C|rS_SNeLosB6 zA~{0U>`IS6kx`VUZ)qI=vtH7E#c;f}tLkBSOsLI@O*ctnbc6{}7}(nKTHKUnMc{(# zyUP(9=C)u=l3oS|BHR5AYql^FD8vB#@g!L*jKoC0eu^$-;tbJ74{Q!b)x1*$nbS*3 zKiL+S>9_Ay16ouxE#VmiFW=q@+D+9cHTLyDAy@B_vpp#-s?u|{ z*HbrYbMfHY${T@}zKAg)eF|e0g5>>E_HGL-xA2mb_=shd=Bs2ZHR!^)?OY)xC$p>M zOTS0EcuYx4C90Zd1Xj{2e6@8pJ!DqCMKSE#Nlx`B&UQ_Qze$Vc{@e6V&j#4m?oQ9! zVmXq9xIg_psiU35@s!{H@Ir!<}==;Gq)jFDbRxn}lA!zDTRYFEK0A z4Zmekc=hU7tfeaLzeLB-y%WPl4*(q6%zFxAt*^aXDA}BtJnje7*(4+2%kvqg*8Yrt zwClM}wNe#EsjbV5XQBI{a$PsuLkSQm!U?wl{ytNYlZr1Zgni*FgkLW0K0j+60y-{c z*z>y64uUE7-}tw$JRg7AD8wbw_;XJ9$c(mKgUr{ld<+S2 zYqH&es@7w(#qqi~5(2oj9yr2{0$6o9a9z#l=7aUdbu+HB0`GFVJPe=A6n773pnuAQ z^bHot`#JCI@+mfPR?lt|*p&syZef^w-HXC;I;xK=c^v$d^GiB2&I-@V%;Q3@Wv?mx zhxsS7?IMv(ph_g|vE+e%@5=VqxV`vQwP7&R7X{(TXxevPqNkG^^Z&`kfnKi3;;$~s zZ^MqU0(oDf7zLq`35>Cy6k}p&kCt6yaGqrYaeZg)oW)1Zgd ztIv1)k3Y&HjMY|xJy?fb)V%fUdDq04gkamaQ+!4R zZ!55o9yLU$r8#5}>d78MNGJ!w2+wy!E|?!yN&JVrSA>d^B%pVuD_m4{TWo|#n?u%y zF9&R;0^EuabbhC52VIgqsmnCL+`~jNV2d<*_0<7fEBpG_Bj5`}afr6G@?X8ho5|~f z9_MS7YU<=05Vp>lQl|Fc~pKDe%Wqy04vk!ltnW%9Qs(<17a&zK#3 zl=yPl^1~5KBAL5{SvxRF6L8|0pNg+1e_MN(@fG!!i+HKA8#iJ_(~olXe&zu*V4WwE zSpM_5LFiEFoBsD=H`LT@E-LTC6s9w+dA=t#24Mb~@2U=^QqO>W3`j!h*4lol*#4>- zB$iMcwq_h)mI!tk&sS^cQxfui2C4RC5NpjTN-VVP$QTB&hJeKxIuTzS{)F=CP|bWr zduc9qP}hh4TsQ1EEA$})4wWcDvygrjO9J3#Vx(uBpMMqXW|IMB5S;MLHOs4~n?y^l)9V;)npHd{<; zK3OC0a7O<}$Vn4WWtq#H2Rer+m1Y>j<4gD9k7;?XE=C0YR^Chqf7-H}Eod?;1T2eQ zqRAu1Xw+aa62DoP8!M|Z`6px{HiXf%)xI3c0t0dvmggzz4Odth#r-NSS?l0-#^S?G zpu)tps3M99%56+1uX)S6xV3JLC7{r85W=MUZ-gR2%K=L=ZOBIQ%^mHtjQ8{d)gf`8 zzK3isJ)q<%t|1|z``=mzO+Qra^%`V&ZEq` z{sAU=FI#E9Kwbu(ku~f{0!YEUfU(R)UcIN(~+_@yXd~T zlBFB*VEF72NC%YPj4+ug!f){KAu-#9*FL?h%J_#W{X-i5jRzI4N4sySDeqe!U2^;V z?w{t`bdUGB`NzX;^=9^WR9tb`;FNud>BhGO#lJlFOo8oxpY)1@554RJt;@I&mY1z_ z|3{w?+_QNZ!+)QDOq%uf9yZ1v1M>6DJRY?23huv?5fUv3F$?**3-f>6^Z)XuBna>T zukQ@)e6CvmfBrq_0|c;qXu{-wNYcOW^S{sjUz_}ohyJgh{6FWz|Jvk#ZSw!b@&EtY zg#6=5S`zxdQ43&j@5rs|_R@gzp#u8q8U+Qlyh2PYxw}Qk1rAQ&!s@$b3QnW{GYURi z&l>^`5XXhU|L>3o$k_v1&x_2>qEiAyip(t%09DK)jyq`axfvN3v%RmP@k|CEnH75b z{RWZx-Xu~tto4cuT{`zkNjgmA{lk_*!3!2xYid%qx|1QP7EQzaJnlwg6Qbp8S6`8R zuZc6E#W!d8a7k=LZByKuKF3DClQkC|`sp{J8>j6m`#7BcV*qEQu=)ajWIx zEHOJ?&0v%YxQlF8Ka1Q$cyCjTI+SSwX&2Cl$Rn>DC2mm-O9q#^k23|!xnXe&yvB`F zXnVZ^HnEG?+n`}$hVCLcQGjJcgEf^29b3Ojr3SbldLdvbMLUub!#O3MTY>+&w-+(U zp6RhY7=ijnA-XbzsKf-fy@XEPAbkcoOMw(~LiRM5$gTz>J$Ue~pc>b$i_1D(Wzsku zG*aexno$G4Y4Z6NNcVG$1bhGlnCaKon4W3qm`qkllco#@YqE*p5G9mciTb%!4faD| z=cgPlK*dzz%dI~gs@Z%jhki5Gfl#>nKPz`+pl%P#`xk*W3^j*HX7Ro#LHLt^L)$cfLcP05$L;o@kr@ys==|YfeB07g%ih8(4mk$JdVIdNCo* zar2FhykOH>Tt=d%v!%PcJ6I#c>~Q&OENT_7LV(Nsl&=m~mgxaW2|*fn6zlAZ#-gtG zrO-1UMmvu5@`xlZDNP^>jMUU=d#nwS`mxhP_^>oUpDIR!S*OjO)b)3zM-GSsZ$m1 z&>FC!bX4-a)p_q4U#Ic=j9-+wMb!tm$&`_^t%niA>_tc*6^Jj|?EZ&eF9XG*HDM#H z?3+fIf$=@|s?D=MS~_bie<->v_Iz4_5(|nLGBmyw9(>;`vbV9iIyk8loP|HS)&q~W z8ApQH_wZf^*~A3+>$K>x2YmR76Tl3fe(X@dDm_YsQE@H>kACLa8ls5pL%%`$WPu-Q z*hylj)SGxd&$L?51aAB8vCcQocG=MX{1WEPqWaR6qBNYb`_>ez&Mt12478cjg!$r4 zQy7L%>s5)UP2>!!Qk4|9w^4P$0C0vw0`!NhhhLwYo<K(KYucHmcvtZKbe@cs1T}*GF zIgl8*`~MuUL-=dy-`>|1}o!f*~d95+q765Bt# z2plk?=KdC|{ zD~!eCDxJP+=7c5_ks7`-j*Be$3uX7&8K=%Ue4Pgr&t(v_S{jBzMpnvRL~V`J?6(?D z9}Ze|!JR&Mc4FTM5(p@gWmM2Qhj;UoBxB)(ZCXgOkK4MtK-54T2u6wweg_lQ=UZE% z-gv9GH#Jvc9^v5pzP$!NN91R&3OE?3=lgM?4i@IH ztlcoA#6qt>%&NpLk2nr9C;akKp=Tq@6s1$;*;mMla_tz{+8ocmw`dx++#}?xBqnUn za8_lc`Y%hdKo%`r-;S}6J7`fd_wA==#`dwP{9$$33clqr@Pr^CdUt8xfiF@`hNQsIR#)>h1LEPOnuQWbT+c*dzYrmc z^Yf<#AtfRUCTiI68A}D{?c98t0}Zc8L*E&*({xW66_^sT~(9_5w zmc|qNEfqc^E-$};hvvhL=iH!UIC9uyk@4 zGt}-gZ|tW+O;v`C+sNQGhc5mX%d$Y7^3x1^VNe*cE^he|l0tq6{dxE|t<=7Lz$Qei z280l7Z;B&8JmTXERa*rq`DKe+y6Ax?MyE2q3S)crCC+?VZjb8 zOD5O3lzElLT^_HSZ1T0Lj+ueV_e)-$LZL6F2PJpGjfV|{Zei)#(fuTb$5P_jpI8jj zy^wCqUJB5+$z_PkNuJO>;LwzRrxg!;P};}Cl)hl>NOEL0u;i?|F}rHAj?2$%eU=ce#v?YFoNro%r|4>Qc&siQ*721 z<9YA`#N_Qeb!?Js!Q8Sh}!i&99C zoLP6})5D43WNzKjZKn(7mQig@zgpwhqn*#Yda(6u7{QG^RvM6fvgTf+D8Pij0?C|0 zg-qOH!4|W{7Cr&3YBRRh(u_CB$DWb>3>dUrtc=XH88fWPF|rMo`(= z)px(tf1n&WPbFg#{D@bKK4rL^up+b?EIN!8{L7MuW#8Hy0z(xQoDfzHc%6{-h|>2p zXW;Hk3hT<^1VX<^p=A_F2&+5)m>YXMKz6I=c$L+@w?Hlcc^9d zZK%w9WjMVKy!^}l%j-iyDCtdEM*SL1?0x50>S;)2E2}@)d6_>@(Z`uiaq;qIHzVCZ zR=Yn)4C@^eikokI9D@T-8G3RO#GP^?zV1-U3zd=g-a-Tkg9Tb;M|+l(cu+BXj>}R^ z7w4#I>5mF!L<~Z5kaD3F{ct>hb(>?oCLHG-_6Pk!*G`Glt8#he7dk%b@K+CO6_2)F zT_Gc-q##G4&sV$Ld{ANkz+M4~f)CtwpWsy*-|TXlro!Bf4}!l}=jV{UL)^SluwtTq zP1#YZ@S#0Loc-*Fc|xUM?bSnmrK7YpgeIA<bd7rKq1a`1oN@-T{0;vng()c`(x+<6N%Vv&N!0@p0`L^Q#)6FYaQiZ%U!|g` zy~v_EI55=@1%h#{4|{~*5xlI%P%{H*vP9Qm*9MI)>zQkVy#fMC=aZmBUUS70uEXWI zMtZ&Bec2WXanaEp9lQMjK94uU_(_Z;tG(s)ZcSdzP{Kwib&z>m7uX5gGvV#8F2?QL zBEvLEjT|?nW`8T(Mvr&3V8?TMEpd7TV6B#V9{xxX0Cw)At)2dX8TLYetzaqqEcIWX zYYl}?^fcc}rZhfLoMtNZ%f8X_fEgW+P?x3eGR9&V+E~KGFSA6-V}f>Lw*AE+RiWs# zj+|h5Jl&j`#EgRX(SD|rt#6Damew`I?-6E_+jx}FzNHK~oU4JMfL5{|1t#CJGAN|K zq;^nOzF%Jb-PEAAE@vjT^^lh8)Rpp(F|*|a^rV+6o+5wm;YXP0H=vsN@Ssri zO6qaJPV~>!&H*1ZILBi3COe?6q#to`gW-bI4WlQNzt!U6hpGvcF|Sx|Nk93jqT!() z*yoq6K={`WHn5&DY9)wmhK^;Mn8%l;y5?67dM09uzkmK>TUW;JR!2o$Y>vqN2!#ax zKh5D@AmKN>Zr%~ti5lsRwBM|B>Z0-k{WT8Oq)NL*VTnGeU@x5Hd!JI)w)VGXuN7#dD6n654Ew;=m*!k=ziZP2^lgCn3#hr1S&fy5 z$|#8EHG;w>1e%j6qTMSALqJ#i{2meIEg~)~8!TUegY=B=!~#-JNnhss7ts5?)a`}` zQE{`UT{;pyd`peSDD17RZKs=wI&!gQ+ig%h3u63GP-Nbn`U4g11P{@&x2}PrHty{I zj2AHGpxXU5TSy!5X*@GJtI^j91@ni8WMacP_Z|anSO7Yc%SK2OeJTn~iiH&_jS+s~f zdQs=LttIqE-pIL2cUY0_uM=SOGlT@OubtlT%H&O&Iry&s#Fbtk;o}-(q1<0q5Ax+; zAXAQYEwixLTz)g4z^H(qUy~p4aaZ^8#c>8ex!8x*TG&!hzUP$1aI5Eo14%_o8+LQ2 zGkOSL;|0}P#HqcDd$7@skaqSgVPGrj7nlZd{`J%6n1aozv;KEinXJPSwfBm5OluX61AN?d76dZst4MK_pti&%WNSHoSg`QFj z(_HG#`|CZ20`Y>b)b70Tpx8uz({Cp??Qdwowpv6~ut7O$e@B}80NRk>peVI9P=YKf`OxFWQFiH8#B$S_nVRr{^eHE%H=(;~FpfN?G4cg;*r2Kk-wx}# zOlYDrJO)kJkQ+nXm55)S(LRQ~D=}x}M1;Av6W$FRGNP&gVRnGMseK$yjAUC^r3{|Ou+NGk8*UR`xf@Zn7Ype8b+eI2gqInXI z9!}rvL?&PoJpFH+h|3~tW(VKBixjT@AJegM?({ri*{G(Tb5jJGlcL9 z47lyzkh$gVY&e`MJy)V*u?S-E9FoTNE3>7Bj1G9Yso?dr`zj%pDlW8;QHG`pZT^Pc z8LwqOeRAZtg3PWNEo7}X1=R&3t7%n-3^L2KC=lTvAqrm+Sb&F|0aBii0Qr`XRqLaM z0`Eeb3vy!n>99t90Ah-vFhH~OC@7Ad9=Uya9o?KzFOZQ;`k-S87dHam@=k92w)yZs zA8SqI{r6JF^)yA*O^>m|pjd0;G6z;e-%88Rlh{*SiPoHx>MC-_-xm zkqAAliod(hV>V{WLNJctN9D4q2Wx%LO2)dQDVg+i77vn2%jZo*zt8 zN)K;cvJKP_3%R}_J#)Ff|K!e6Cj|B=8u&P+zwdAu$>%QkfrH#j?&q926nC>1s^wcq zY9a^des6)E!vU|ipt1qW0hfyoSG*?YvdveS0NczqHkenh{w$P+kRv|2#zM#y#kw4% zoLt4VGQ2!I7Ji>cTk4|JIjf#Cp)oN_meZ52&u~yI8z7M#d%_98&KgP@^FoP0Jh#TS zS15W{OTg)h{{tRrAC}vb(erYRAtlp)qzTMXZ=J^r)%ue}T&KPH6354rtQYc^Q!92M{^5_{A$- z=0x&UVs<9)-^YxNb_=$2WYf*{6Ck&nV{xM|wJrj@FR2U#<8C3ZxNoCI9rKd3B+ehH zGDsMLOfQfkT{_FasQ9j!gbKv-kj#J5GhC;WepTo>sRS15(~A6S zQv#h&MfGR*RgcBaW!W2U4f{S-27;+qfce%y!`fvE5?CXB5>z%Q?G|Je9w)pp7J4ng zIfA*W`p+gtf$Ei@r#9keQ6EjZS245}M2+Pu;2 zWd_EDR_(ZGHLccf@+k1~j`&XS=lKeNwEMlJAC{_;BA2nMTNR$b5U)#J(leR;7pMI| zGCDt{RJogw9)L3kC4(!+0P}>&>TNVbNr(rr*mJ8WNE~P{06%=T6BWkx&R)SoK`4@9 zSjrn2j&e0a6H#9WC`dvz2ZE_E)mJJ9pIr{jy9)74)8AYIw{ZFj4osqOe>?QiH|aBL zF<4+mPxhR?2F0ksxDK3l2gqcnoa{!&{`>p_^q)Y>+~~fbemP;?v_;f>mt=`7I{bnROHFp&%lYAHx0?G3{+heO?3_7d08b$2md^q z%=%!KQ4*72AVzFqNz>UK8fcp*{f66cdMsPy=e9r0cK2o#~iRU~4*?-l(Sm>BNJ%rLQra9h>x zNCOApmrD;F)aZJ<-AqdAF0aEL9EWFN22vTylvcozvRbtdd=7&gXw#lOg&Ju1=u!j- zTW($Fe6A6is`$`9KB63oMQ?opIkU=1p#T6(4+Vgd{jo*xN)o_UHLCR@0Kmb(KvNFW zRKddMzC=YCTRC&K;_woJ27*p6T2u^!0;-OcdQqQJRD8ZwPaP4c&f3<$Ri?SHi%9N% zxXM7Sz`-AS+SG)J@n16orIv*Du~mf_hKx;Ybi$A3*w{%ND>vluAOOAr^(SP}Db`w2 z#A(4-VA#qK5v=NbPmqE6T)Wz)YBOb@`DLNJOb3|D_!j5A?Yg5#0qHKO-?8U zS(nLg1|kkF?ij|9&R>RbdbRmPfI`!;3RFyV1k$!T*ZGH>NV`t|G{W&(jcyjvyTyyv9 zZDV?6{4aF1o?Sod$ObDxUySqR?LYq1my7m!F&!1UoKZmE-SqrEl5AR;>WJx18gI-e zb~}P~jrRBPC};f6&uM?`TasE&H4kpuFFg?M&yCFuY4H z_P=S6;Uow^f|IMJD=J;VA52i6&H};<1k@oV38D}M7F&QR=J0SHgy9qZPpMiVLXZNz zpw$*9;!C|Of|3LQ`j$H~=AkLfS6(lIjATZK^rnd8=CQoErSvH9nRr>h@(xvYm=NGJ zv3alFrq&}w%h-z^Sw_J=OqOdA>XsTAN_sT^q!`#rTXHrTJm8~j=s|1YgZQ;xs3CR=R-lpuSyAh z;pWFkv$tD6Q_&^!2#WXoh%l>&grXqb|hehP*tXnC`mlk<*_dXdpX+~~)5WH3CCFseh< z4p~l&jhl07VflUD_Je7H7sEdGQSVu%j_>L|?67$Tcd2MWH&xWh+8R6&>a=tN6JcKi zxZg+A%Hl+_w_0A%(@ar^Tm8*~mvn;Jz_< z2PcMIu~_Elpy$04dCb1FM|PH{s1Na)hzIcJUvHvk5A_nMh<{UuY+XQ>ysz z>vvFIm%O3Scnmrv6Fy31prA*O)FW-i7n>kj5SzAXy-61g_{mZMULeAdUu}zx`XNo3(Dk}Y{J|9KI1q(DYbM+Rn+T@&V;PVo;g4toaS zSd!6&xdJ5S!I3ns;4$l<7LecBShhlF*DuIYh46~)bsuCyh$e`t9GS5`l)Bv%jRRSR zi|s-?Dc0fNzu_M4gLM^MK2c2mogDwu`3XA^DdgAm1(&14mD+w+z!|)~qoe6PL%eqW ztSw+o1uN3;MnBVbUFGxb-AVIwm&XTBviN+<6t}NAn01W@_6S@f9 zfMC-=ps`2yZwU4RrtU3E)v_4Q-c9Q-hSt`{n4)KcU6~%6uiiH>;tw6SyE`d*JkpM& z6^2(A7Zv3Qi$=^&Yff6?FH|{TbayZQ?ny|I!I5MzovAl9eZ(?4D|6!gXgq==PbbR% z_!#+AVgz51p9Pb*8}G{w#%*hmH_WFWMH7C`2q>MZyrRdoMq#CKQ_%WYO^}nIJi2B&esZWcD*!8tX85WTjC16}*xiOvR!S z;^-~^bOyIKqx8z#=yMbt_{Nmio(AsLyT+YxU|`ZCfK(neW}os4YzPok&_a?%Ma>J=A8@eTj`v-i+weLiSM2VrMr*z?mCO0Ieq|+7jpg2EB~!-r=7W(cK=jvnq6crZ$ECVTC&kg_pF_yGIQHx17X zx+M83#L60IYdxjeJBiU_C<3?#DM_7yDrZF^fVmu=SNqkRQn?QcEx#?8-V!hUmPyyQ zh6ts-3URsN_t^N!3r+^ey>g3jY%p0AVi7q%|1h1N%;$@h!ONW*D+Lc^pNrg#ufuKMZL-Kj_;Dhf$g_QT zsCDhEGZWH&z{Ixz=iov5z&aeK!M9rvuRg25&voF&vnwi%xR6y=tJK>J;ZM3 zuVd~wm76T*RBrc{GIQaEVKf>(&nN|+^{*YZ?m4>NOir2V>B-%BR(>6NPe(RO!vGWe zTxCF|An_If*K}uw^mg!)%;Cvd?A&t;b{Bs-s&E2HsaG3@iRBS1iI_etNDsX><+v@`xA zY`0}dmfu~NQr+ySvlQd!(_+*1UrlyJG*O*^D)K4;4OZh%R&%Z_d~Ih&Ki(X_9u5JY zw8F8Nv1?c(LW+#TfZWt;kZnMv>KAYmD^XQhoR&O!m zGBV7S_KEN$LVx{wrG8jR`-GenDW*EU*vj@9=@hq<-7o0X!j=B+GS4T<+Ub+OJX0Uno$JkdT--Mp^_43&cDD z>9(o>jSL&Tf^~MEN;SZ7IlAQO%~*qn3lk+_XAfZi3Z!yH#bw_^`ioB*UwY8Hcv9}93nCeq}TG$^mzaK=!>Z5_-x5C@26(xxfy-TQgJYTwc#l+r*+&k!) z5n=t+TRQ^6#xHLP%vw=Lz~w(ZUZ_(7!6zb&_kwG$?H2jtiv!+cjJU7>=LrHIFE}x_ zVBQ|(wGIJ|p~_lFcvO717SfP3tbarEYhri3cP09DqwU7~+FI?Exb4>kX+N5p0s-0e zqWby~>NOr$IXlXXIBIG;F89qe$A%M|N>+1~2x0n`P_m4V^ zMg8z7++A<%u%2iBA<1aoHBlJJTc>&WKWT@>f^R4JY)6o6RDgS}NV7D=0uZ9y4)vNp zyb^QpoM+)l!vcU<7tWsg?@116*6muv9dX_}aV$Ig( z)3^H^;@tVP{mOj(vW~0d5l`hg9nW$6#;e0%7NZR<2IknDURgQmA!N!9EgqF5TJ5T& zk0PqOMKXp|G8y@8_XpxXG;M9s`5up+J_j+Ygv)EH$_hNpFx1{fXC_L5;~Z_HvWkkL zn`q!)m7mVh-TZFs>yLzdjy^gb7szElw1m^swP#oKX;ae^*kezx=dYNm{rsHW0xo{H z0-A3*IF1pmj&0Wsvhv^Ve>te-iX3LR!?G0}cvQc77#&6H9~oG4ZA>-oKBXXk(j~N{ zz@h(B#&J1XG`>|>ZGPVRn`_-6arkQUuV$S!(LPpeKeig9XBqpJ`Bd4-weilQTRo5K zEiMov!L4t>C$GGk0x!6&5#%H{I6o%0zFW5X$Bwrl5sX$H&ut28WN-e3yXZ7!W_kU? zwTw)9JAM**GJ>n8wj*eW^;QNwJ7|KrhDt!lE6%0Z*av(_$3EFHOtw_lRhtqvdIL<04r>)N2W!nuymU2Db?`U2>+va|DYI${f`oJTtEW& zh;^u|*;4SzK$?GE`k_q6lH;iOo5$w9%WXGCjIdUTc-s2uRewp-cFU0q z>_U}MtP4)pS!XxmP9G4Y)YTi5Z zu^9KxCScMNx_uqNzO6boGa*e&GWupL4nD)CksA-A=8w z<#o!<27ZQQ{(+Up9Tm6pb)kMHE0Xp1bqoJFLj-K z8NGJe=^<7PH8{d{O6)QZrApNWGSv}8U~4bhu`Cq2S9X0xl%6|Ao%TmTAHVbbM$vyG z2_NL-2SD{f-IK76NR}i{KvkGi-XLmfN{SL8^5LF`E^VsoB~P?~Qcy7jYU82fAQ%|A z3XGWFv@$-(6p)i{ZB1=wJd=>LDEUiIE1o7eJeN|G!&wb>2=AzPVsk}IwB5;+Rg}l0 z$$GaDcx0Zoo*qTq32V_luSF`_&_3)3>qc@VVsQD|FU(HHrN@i2OwYJ&>?#j6(9U!? zTp&*jp4NfY$hSi?A22tzMwq1~-M-BUUyZe2i0v5bI?LM)hjd+ET58hWzIp{~(^I@r ziA~fq6D76s^f0i*)pRpisbhz5IwQ_5YCtN(Z}U;IWr8e?iDr0x>HbibTxR8jmXR@v z|7Kcrdpz?lWb@c#cW2AwB->w!ajvoYm{|4@w`71jMZa;v8o?$dRQ&IGr~eu99hKR; z204kPyA@gWkS0|EgP~%qlrVco6&UR%cBu`l`2G3jEH2Is{7m=9Ppz^SX&v|Qsmw`K z+-+1x3@u6`0xSD_fB&*urZ6#$)p#u6_isKCuqZ0j=z-wFIPI^K95dHzkHf8=y!eMK zuo*NM^CV-R5Cv{Vp78DZ11q}pF8Vj_@dvYMTRBLF=*xv{hKc!Y(~3*XcW9Qb>D?b_ zGVAY}B{}W19y9xsj7PA{XMQ=N`ar*U3lgY|y59tJb_EFl00Io>+LWC z5S^t#Fj#HGM&I!_-#{s3Dq0o0^`9oG0R%UzRmtt3_4-fAdA%p^kIMT+RF4k=w;lEGEWZ?g($(Z3hg%Wwxc#M; zP{rvka5J5gf?0oqOG$OsaMrC+*En&Iuy!v0X|uO5BlNzp&&Tkc+_MQIR2`Cq(Vv!sg;-46w<@yAV#0XRT)8Ol)v&@CDpHW?afNckujZVu7 z)L@E<`|=QLXW`7P!RD={Y1zQB{$7eVqfG5z1G}7CLT9dUvM##ILf0oB=@`ezL(!tjxnUIUy z9&hBMqf^$8fVxZ00k`XZZfmH%+uE&zJ%+JhsCZp9=i~+DaIfzDlvPa%rh?+7?$ZWv z?8k=3Z~(TRTH}nlA}-oQ2AW*rZ&!OTTje*-sT^emM|PRVdk#g5&UOq_U3APx zpHH;bOS+@EqIdEdsdkTwAD+JL&MkbZ>VefBVE=H2GvgGPOGv)1ge46CM8&xn}pcw_7B?bkB4d7}Y+lpV6uzY39R z`zwKm1<6I!?BQ-t?sK)X-RusVGQ_Uy?r~{xg$_&AR}e(JhU&VPsGhehY<7-i({775 z?9!*IbE6OAV>UVbHd0byU&}31$GHgZx+0r1eSE1RL@?h_8Uw4}e3GSrqm38W&2N`Q z`Gt-=*A28dZjsNl4My&g&JtU1EnTkwKFRRyCRO8LrZQb6BTiMt_VR=}^^v^ErAno@ zYM7z*KE?4`YIs$7Qb#4c#br&JwLp(G)p5zYYhq%ebeH{WstcNr;fCk3`w=BPRMKy9 zJ>am?s$W#x?3CPQrJ==}7t=ETP~(bFuL*~-IY#op3o)&_aAF;L;cyI~4>c{Qm(n?N zmr%x^gxr-C>I?T9KX@_!t(jyb2;2f=N0W13QhlJW(0^xd1K};$y>-CIZ$%`CEevF5 z(;py~m@L1qH}V%BT@|~nH{#itsv4)2*41T%NYa}LGpsgNf>Y=lR&+cXg)xkoGalVH zd#C!2&c)>MJ={rr(Had`OHJD5c!m!LU80ex2M&vhHn@kti2yv_oLN>gjWe6E;;hM> zW|p-(<6S!#TBy^QM)#>pPr6$f8XmetB+dGOqN=ZI^f zW-?5|c)m9ID=2<3S&+%#7QR3Z4-o!Hs%6+r!81c{@Z*Tw!Hyw8=T8c_T!+E?_ami4 za@$kRQ_arNM6w+Qva!RHjN@ZURpLhN*HAkxm{^V|*rPU00@dtp>2j(PDusRLn@Md0 zAvjb%Yt&DvT*g=nbSdi>q)(X#Y&MLdwgGKPE^^*2Ygq!|OxDW_AQw)=%G!DZITahU zP{poofW=DB479+B3nLYPTJo=olZbt{hRL!%mp6(Ir$UMV+3_(JRF5^f4#R1D=vn99 z@vm+VhF?L{0G3I`c)f=Z!+OWsw_=k7WPAt$l*H-j!d#_IiiGXTlWYbU^HnZu({`Gf zVhINKAiSAKodPd)pdu3OdhIPhd z{PJVutLn4u@34oHjltFDTeLUxJ#1Q@7jpt;mQ4Gj57(mnoQI4D2OR6JRI!kR*w`X- z`_}dYhQHK*TJ8-QoPq0xVvK*=Wj_p71;>^dbEh69Zf&|7&c(f^8(FYqW2>FT%!N5` zZg}M=O~pawR_bYx^MKc$|CG9F-)cFRP+4i=&YWR*<81JIPZ|k*bWOhVc|mzaq@YQV zympSK-e{}P=$t-CskRjWaDA#@f?$kc1d1UC{Uvf=HKQOO9Kuu$I{bxFlu@buKlz8$% zNd|4oA|ZwdYTL zzbCHvbUSlDf66;4GGqH-BQH-1y|Ap%=kP#SfeeP}RuPgg=-~5w+Yh^UdH^v}8g>G* z?4cHDR7jY1#Rauq{Nu}#2LaUJq@}ErSoL?Ka zm5NiQ8U|88H&~x^!pjo;vYnwMX#L{3F80N>amTvp4INRt2(0^Jsn+dzo9E|wrj6O9 zlVj+$%dw-hO{g)#BJa6{@tpMAZ}RZ&+c}qQj?xbH2go|OdVLn-d+wW3bGx#8czIfh zTYu|iYxwLRo>KW)+_Kjyh@S~bJGXaGgSc)t z22j#(Z+U>0;lv22@%IXGS1V+S8c3)d1(w&hx4{=;-@#T)AJyS>w_jY)pTYaV@EA2L z++)79P4OY)?d0Q(e>t%y|Kin4$M@#%-m2Vnnwc2>yfh|r^O1QnH6CfauOB}=F}=7P z(cCs@#%U*~rKz!z$}VZ4cVd#mq*n~a*l^v1Pst57IqZy%>8((#{^H60aOL=d#~z)* zNUs~|=`1BnIjn_Q>b6bQ%#wI;u!gpl4St<=1M`?^vze!Gj*;|QQL|&y!MB5yr?zN| z(>}F##;L))O||>q%nee^o>JQKOD{h0yuh6$D4VnsnW)Ki8G>EVMo8F6mv|@ss?$YZ z;N7+eV>)8Kw;~u8+i}6|IVvB&p6j2t;svW`TxN|YcJq^Goi_j@YmW3Xd)t6&q&M$K zro8`pd97~F8^hOY>2(zMdevo?C&TXH9=I&-(c86vGymhdg^h2pMJQ9o1|l?8Q7TO{ z=8{&1%UugD zJ$R(E+dPRCA)qG$jvdxmkm_!uJYE#nXy)i;jnEv!IS9A*SMJs!(41V<(IMB3ORGvj zw~a9UeSM8W9X-HG*IE@f%9CqKL`1|K3ja{4)HioYadCoJ@yZi(bCRo4>0xB0b!CfX zdl-+hz)9-{4yxTu40t1?eD}afihusEwyrWNsYVB zNJzK9kPh9clr%_7cXvsDXW)6>_xH)(f}M>NWs{8W?|T;2^$Er(RX%n57cGAqo4{m@aIN!)=8H4sfl|60}_--X9L%lAmr3?X|`b))Yh ze_+Tg9HK2H`RCV8BRNG3>oS~%d#no`E_fJL#+^9L)E#Z`C6c6*cgJK>u=Mt+vtV9@3^J68@lxfjuyI@*#~(vE5m_NvQhvVYnm zS+ISbD3orz{<5^FCS%UlPCT}LX7;zWU2S%AMN!J#&7{BeULhUF=IwzeZD;w(Q4ZN1 zc!H+??qs7ix5cS~uk$Sd30H&1^w_KkZ?`0x+u2zP;$O+z(`)m68U=+DCZsaP4%y(Q zBt+12XGj7A6QAel?10h$Co8MbMIlR~=9F)QXLNAWQ)Af1fdfTRMiX1AYgpMfF4tij zQKcetRvB=es?8DoCpe=}bx9LRJB*nl;qzzxSVAP6VdP+6MMPoi@?JT_HWdZ#V5m376@B2)JF#sIbeYN^WY=TM^4HAC zsjtNgdTWy}oX%bHdBG73KP>z} zxla9n(LGt)a!q-4RokLcI>p9w!nW(%V)Ub_Tq48!j+zkonyFdq$-L*@?yt@()mu>U zKUWwCBmKovp(1>aIe0_-J+IN^QuUA535^}T)Arr@i+hg!XqWZ=iE{-FXtVMnJk;&< zG-{)p#IRLuommXQg#F^wb-@{~&+WT*vpDJ0<-7_@YlDKf{f-F5$z>4Py`uNtzQ_3! z-4{eVwTD+bZ*mtiJoh`x-E}i$F@CzRG?^)Ah70FIEwdF?ZaiHW&y5it+jVP1RqPcs zgt6K-cw6vt$J4@Umv^sD;$ks2Ix0=9U@ z8Ufy)0;9i&u&8rY16ZOr=2^~VR9)gvey#CXrpr#pIc4#R$lQDCK~vern0e# zf}E*e4X3ZaL@Lu8Zk{>7Z-lnq-O|xFt8>@b?aA5b5x2)+Sa+qB4x5WV-SmoBI)TU_6P{Ec7Kf;F~Z(fmI|hqEr8}l;#BS4lNew0IDw_J zYW=}bS3;YBJSzP36VV4ur3On@o%x&yFT;-H#Vw7DX!DeVx>d^TChxOezF z+YyOi=(J1mCu$v3s+gxBbA(k0`rIPDJ6>~t-s#+n4T}3OC${E8_rnN!Y_=nLE~5CL zc0$=V{&DvbCZED_Bc9kzc?n)U4!}mJh<-z9mylrO4?DrrZo`#LYj`_ub%P$yM%h!i z(Xj{%Z$_vARCf``ONwkR*xD5|8Y6-A!Qg80>@tkLA^XYxr#&FiO*j{ zYeyTnat0xogBr6(yUJdtruRiXED8xlyp=5%?U}!G$nJTrfWwh<<(4gS^GA4E&!yZ| zgOz?QQ|b+Ib5QE<)Orv3UG3tvN&^IQ?@I3a-Vt{GX0hQtvwrg*=vn>!{GRFWUsplE z{O1b=re%NO%Lu=V+?tI+Iv9}xA(Xo< z<@Yt&C4Td1?@keOio`pE7r-fIrl(s&zUHdQ#k~O}W3RcAEjKpa=a8(G%y)Z6;VFE# z>ei~Vm}i$e)LR=J9hY}cmWjtpP`hT$BM1CG6bdb>iR>w)3AQy}LW*)%J8 zZ~bXDAJq`+r>?`%NX*NpIOIaO50e&PFghJU=aB$v@&5vY9vNG_5v;Y+42y|}3JnPfskhZWc zyL_kc=`U|OIw#I>ZJReYl+!;f2QzY(W5djUr3zvRoM)p+T)xT3t%oU|sGfbqW7 zHX7TFuWN&N5&p*AA7c(U(Oujo?xx*c#|d!eJO1fcAK=q}t1WeG**k`|ZrUN{d1A3M z{awZBysGEz%?&C`oUGK&-f+x{4tIT(CO|9oj9OZ?E7_dQ&DJn!PZ|E5Z5^F#xfCiY zDVZ=xHN5*%OJ^?4E-=e6wUh}lpOJU>b~^gRCg+fR$fV0X(ztM0BR3?(%$?A3o;PHD zkyoD=4|Np%h)5Z#STD;-OG~S2X^Hoal?SDOb-dVbV}>lZ@t|Q2nlcZ$nmxYvX0wEA zhr!^0Q>Y602a9L=B}J9^TEuOsiA*1l1E1h@JA{5M8iV7m6=kMeMln1d*!Z{sgdkuM z32;qg6sUH!0zSkkE3I$zT-SgZRQ0!$X1uz%3)l~nsEVJ!W?o_JX`a(~m&$*ftAk>3 z&KB~WnTd;OvYbnDPrL{paN}7q(ZJ!0%yK~&B^L&?GBWzFw@j=XSal_`KQTI6wssMm zYx&0EZ5w!<@R^r%DqxIuT>hYybNe1i`pZG>mStD@jgkc=qRALJckL(+bN=2FWr}PcA^{$225$>VD1MN%Xbnx1l5V2HD(69p z=s516pdyI&nCtG=4sDpcra6*;4e1@PyA(`KoImQse_eGRC5gFf1ip>Re>B^Qs!>>K%qWyuH$NvK6^&gF0E-V^Roj+k` z7;S?WB<1Vgjr&NN_Y4E%LyUkA8~>eBA`i1^mvO9D(?(@aew`r4x}3KA)=g7QfRscf ztE8*oXQF^h@QMm&7^eO*T!Lp_#!88kCmVVyEGGzt}8)##SKCteNUM+j-3+ka|wSD@%C+a2N3UDNy?(V2VsNRZ(d#K&K2Q~?>>qq9pspUiNagzaAh0%&co+Cde z$5ci3fCIBF!{k#AArz`z81RvsXr zR51fU#P;1?|4(?DL0bS*_|Dz1(kqW9ooRXub$y7kXI>+jH&y9mps(+pTY2MmBliq$ z$gJhbbv~gidjK`|ZH=Ao`-8h6LQ2m)dC28qweemxL+QfwWu+C9VVv3TC`*WoLS`5- z^oa4`Hd|)C`>f_*qGEWhMV4vv6%-Y>vvZ}>)3EJAQtN5TZRT{9laPY-hqzy%Uo0Uy zGso?c@4~&BOv@hzHbmRpL0ALH@v(|HX9?QUQaIy|a5GUO`xz2V1%^6y&(l)U*+%!v z9RXknm}(3crAi!+Q7rG`?rUi6ydfxWacrqn4tGixb@HqZ2r6(7Reh8mLgdLq@Dk3@ z7Zte9sw`f;B!%?4e_J8aDOFXu2TSp2^Yop<6{>{G!5We_2joyP3KpSwz*V8F&H_az z1Yrsk*3Kh&R}YzHCs$C8-FRgqG0JPb#Ux{R#+RUrduhhz1eMb$6rxe{IzSRG>bZex zwR{ymDO8zq;l1Jy0ROTQIWNr|VVBB-9=vF|KBKeD<~L5k|1E(mEBd3h^}^JSn?n0` z=|#(eghlXs;L5;Y2dwDM47_u)$~s={kAHzK<+UK^*f$cQs8^0PC9&=#mFk=^{ZN^M z=17DZ5Qz&`#6#joCwJUlHupNoHAjIUqf7d(X4v5dWT5ln1lK8NC6XYt`kv#Ux}i_I z9dwOTDHA=$-FQ(=2eRA!>5*#9lXBp2R12(WIbgQ`mjm1-lac-LJoCZPBaVaz|2DuI z&{N~)Teh)-g!k(aIe2i%!7wr7T*Y0hwq}7Ir_zlV+xY2Vga7905m+6dLsDK=kE@(psIU8G zQSvceq}*}5TK;gXZ8*Afi|P`P9idW9!H_`&_?Uok0B7dT31DOo zU+e7Bc60UHQvi@K-zU5AKOk-VXef9@1f9O3M?*)Cs@}?sI1G0jYC$;NJGcvdTIwI& za?pH`%L$cucJdqq*6%XDFSfkK81$9Q5SXJ|S*@&AlGz%?17S&r^d zV?rg(KZQlv(+@X_*U-Sc0F4gS85t{uP?H#7DvYS!M8{i1A0KQ~Pol+Npb-4fk|g<8);h4I#)e1V&LKZxg4=qd8v?PQr>mEhi6Y4txw|mj1lmtH*)8H(rLCDQm+53N zh)9w$QX`2ihrFLcbbFQm{v%BmZNoDzPAM7XTSWW^jYOKL==Pg;jvu{L3|l)lvC5&U(Pf(-(Na-l&kqI>y7>xj zQ##oyIV=M!pJ2jd@VtRwvy7S#7jG0A*Dme>?JYWg4>vD7v6HetX%66G66O3|rrA!v zJV`S4aX4fxc-~9=Mh-wV4gx3@9nE{i`MnYwPvAJiWOy#Z@bEXcjjoo{CKr z*7@0ELd(5NLw>f@=p_^MXW)eapF_R^kGZdGfOo0l?OOR%PUkr&jrzWSD~Z#-2O2?-U@5>t|o5CbY4GC^Gv{8xYx z44`ItzPE4dScIU(Y&+g-UgdL%#qYk0NFv}T-$!Wo{(Uxs=1g@cf)n{*Qj8+qjV7R< zskNQ%NN#_%Zx-mHB1-=Hb!g3;^9f>e*~|hm;#0(7NF>kYjQNTe4E$}&LGF-|iIM#Q ztI?At!%)quz&03!EH>pAVDN9>f9KyQ@kOkq`}i$W+Uy z6wFRWOnPjExviacjED7?He44Ld?l|aGBrr>X5H9}e6bS|sEm>`(qv=Pt?idf`hgnY z&&v86$e|v4^Qwx&vQ@x?j+GWTx-m3|G2zujq8FdXeqfEk%l;OUsWIfQPSNp*zqjqi zZ$MxAD%^YKaJz>AcDYIf`|B&{3B$3hv2iwpM)1D^Ie^rTX={)=DJX#i1oP>Rn;oay zOdeIb-b1*6_x+K}D$f6ce)NK-xhIgQ!v9PiMp!O}Axa)Ajge=}d3Tt2QQ&wr z$Rrd!!584^h!M_;^Gm?8waIQXrj>IA)ahl3ZPps_UdLz(8@a#y<&~W2o*<+W2Gq`b zg`a2eJK$4g^tFa|h&=Qnf{|^&Nr!-C$=5(k0`G!$r9FFnB2q~6O|v0Tm+ypSqS!M$ z#q0N4b-dd)qmP@4R9InnfqxOW%I%v%1X zF$xi>jHm&*vawfeJ$;nX)GD&ZQfYdTpJFYGWi=-V$vKKxDU|daI)vXe^0h zuuDeF{-91hCMvqL4p|~s=|5#x#6knsrk|W>?$!xM1U!9ry_9JA70e}PJ#Crr>LbI$B`!x1S-f(dE_HvS9>e!Zr zmEC`(#)mP{a1nvBDNEixYsU_-6Ofx@c?h%~*a49WxcIoVl61@Q?X>TK!AggQmtT^0 z$cs~(o&SC{X3qX0R)tFqdan17(uqMuSsn9t@cfRDDL&fMxVKXC{s(lX5KU*j2%5ZY zT71W3;7SZ+7a>1AgW2JZ_3zJe^5wpw8J%NWEg5C4;4u@R_pgdF(iN_R0gs1v9;YAW z0cw6|ULm5Q)(wE~$uR3ras{;(*F!{>!-eP&ZddW3C-8;wg*vBU$S-o-!Z&nIJ0C=L z9tiM-GL7olFJHNpM8$vgYNz%XBmR)dTlyRd%s#-aR)QXqIFy{6iww2m_w#&yU5%cz zfEhsAUKZJwN;~9)dzO`b(v{a`ME@`LLWI&GEj|3X{xX=rYT;7*8KDIk;FIOI6q*FLWa|ksr!|e z-@@BimMgDDbMsf9oaG)HYY)l*uC!!AY_>U8w;0s#?<-0u-*0{lW&=@N>**PP^~>m~ z@J6*Xk34I~hCOINyNX8aK@pJU<-K-@f>jMl@`Y&~H^t4rFOfS{<N=1lK(z}H0i~4 z^YE{#!}-h!3^q9Yb`%D@Ws+_!9*exyABb#Bn0x!qwLHmKBqQm7%dQIm^CH{pSB^Pa zybba`T6Egp-s9Mn2%-*HXV|OS`Ag6zJ^u{-+1QkFD)&IyqjAQfA}B@=WHCpPBd%nr zLe^@S?zUd&Yi~=JdUD0K;@yM@w%6INPc{(#K zzXHPX=hwqVR4}(V7Y6df8-RTk(G@IP z?Aav5@JwY^07mFOE2G@2^uBV2p&+RXpd$U}EES{>EwRT^6@ z;AfXtm0^O<`S2;-*jkm2%zauk`0I3MLmx=n0;A!d^MpzmAqo8QzPdtd+*mUkzR{Bv zA!^G4mQ0&DqNML4w}!_XIWYw=jir4*?B5{OD#>bsrstU_YzxTQQHV zMHDPKpQ+aYuP$e2bM9spm!D)Y_2D7lz#eg3y6E#s@7W5U7-Q07zq^|jO4sV*8DOpD zAV$56r?+X8DQ`NT!14Ify@Lo`rT_{sHa@Jsqwz*dHgpN}nZa6id*&x2N~qxZXyXgI zAYn^O$VhCUULS&>D=NCti)OYY-2Yigv28W+3bGXeXA?uoiuY61WXWyM*O3MMzTX~B zSGmHkLGm__jEP{|sVM`%NDijUZF5gdBR0`f$Hg$XOF{P;l4Gi69gUw;v7zYh3s3?4$Adr|_@`9Iu?kgn*V<*uKb-{#hw>kgw zrqvNODl;U~JWZ_G>j&{D4e3KMvwvzFNq2Fd ztY51gW(ZNCS7~*VdIb`THyZ|c+C@7=$yeen7l{B~4lx*=m9OBA1qhY0p-e)rYoyJ> zIi$ihAg5MPZ=Pf`?YtHo^S1uc4sTl*`M=q6fr>m?&a(;ZUtbeL^=)L9s&NOz;`8fE z!0KPE6Mf-Zy;Z>v6&>%Lq^ghk@dkUp4Lm~;GPmS}6+2)&?9eY!xdmIJTNNf^va8}d z9&fEQbcz)l;1hT|I1>HDY=DW**xRea>Z|me|eFI7$ zUHWaJ>V>BOS+(AHvtR!!v*o8X9=$H$m#YEb-+ST@hBhA5@Y)B)A}lbG{W^=?@nv*+ zilVC8{6a}(zNX8aJY31Vcwo>bJk#cAV{hOO_>$JR|EXi($!N$8bxzn-3)Ap?PL+-7 zZNm`bLuGpKqopVfYuw$fWTiFrE003H=v{!^@8rL;_}?t8^j(ll0{PM?UDWwOU^~v< ze%joi#asncb?j=fRl--dEp_^RnJ-jao`Urn=T|wLuay|+yw{)KGQ&8B2Md$u3%g?k zt}!^IP_!4i{R-*<%#++!2c}DY^bS4^RcQty?p=Z5?q5fZG3X%=}MjpNV#Jr7Xzm$tJ-jy6m$y!da7 z0RjgtNXYkAgOcb|`}3%0&8BqbeEcqj;-31dq!t2`A{XOauTH|5=}RH{-9yn|WkyqP&M`a5oKn1VfCw7-0nOz> zV)?jJkuaj4FK%3r2Nls-!Q>cBx;Le8H77nt~3ov)nx)8tWD2YQIA z1}_PLhj9Zmn>=Af0lg@UMNd-`m~%TX`GkkQWpZR13c3asl{5{7pBD1^uhn8a+(V!A zHlQVOZOT>jOg?VD0NgIAJ|nkSsbcLaxd&!iB9--uUtS%|R0RWr1n(M~zoDTUmDVXG zQT&qyikb;~>O+I~;{d&6rRVHNh=^v;>GQ68-hnK4SIzBOZx8r!^ zMKU}rhW!;oqhln)fanJBN>l_+Ud%8s2`OkXXxfUU{3-q(TOgoWh{z)vLH9)(Q}$?{ z^_ETjyqN)BgXN0#=hJ|LTSvH5gC8)7`a?Pa{uH4lkNS=Gg0!{)pUOiLWQj7_9WPRd zx86fjJqRS_-_&=nI5GwX)8uqDUtXzm?s!aw`@(*8BNq6=#JfKuYU(<6x3}sQc?knO zIcql?Ow;glj2AwDc{u-v`rkzoqFQqLf6qRhyg~gvkB5E*gdPvZfR+GwFZTmXYpZ5! zwBAWeky8h*U_Gip=p=Q@*ae{P)VhXxXMgtHRNPEpY zh1Ztr&;Mh^t6=2eA?d9m0{9u75w7|=?tQE06rmm6VK;5`zOG^{HA%RrwOF2QF&$v< z?YeH_l7wCMAqNN{NP_sUr`J!>t9m_lBcRLw93FLQCBFQZsn{+{VuLw?2${-lfx2CL zjNAw2g_+kFX7i}ieR#r1m<9H>+4|jsTHixV_|X_7)HLMT2Zjc6XRBVuvJC9AYA@0) z5w>EDcvkl{C>FlAza-$OX1Qn~-!g4@L=C_U$g=4rfIl7N&-#Ru3LZX&Xa#H4YmpED zt%;hM#1Sw*$_Grya#zK)?QZJ`TG`3ohSVkR7zKv}H<)A{!-P^V+Ph895P zx`##85Vyqk1tae1=*ix(0{x8A-0naJ;3b#0a!8F1-#~_H~D!N zwM(w*uKElROH!SDpum;^^ZLb{31HH}tkDmtK@=C4?2~?Jn*!BMnJlRs;m<05&*A=k zAK8fbI^80_v_L?s*qE;SGlDm8IB=D-LBOOrmu{mwaMmS|A2^U*ow9E2(J>nICV7_* zmnGvnz<|*%GafFxvA?BTv>U}`I>q)2>|5m+#NcYw4J+zFpXxgS;XtXfk}fB zRQskTfw4?D?$({h>F<9Qi4j2LsASd*8+NFQR!o_ch6%nIJKeg$gWi5R`uP@ra_-sl z=UHv<;i;hJPUN9CdLjZoom&i;`LX5HL$s#H=6;v6f=pO$6@wc+X?WeRP7o}D8GW&3 z+L^eE{t`?2NRNk+jybr4jj_V!xP=K-YAKD6Jo5#8V;5KGfCwej)!jx+d?0PlMj@f} zGU=N^xtTjUQ+nJ+Iam0=MmTH`fPB#wbbRZ5PfpKrZ;2V4)OTT2(FM^9I{;5S3{tVdJ970KkRb#U~oV2 zm3IdF*oT_A$~tDP%H_%H9qpXJ-%5pQnqiUVZb%*SqD92|DMh(Ed!o z?#sVnrVi$H@XyPU96shxjFm#+cjx+qoCA`wDUtXsIo#>peom#&%rwqd>cKzDA1_J` zaEz3|E8gam8w}f)Q(oe9C!?2tnM~KChfW@6k(VFEm#{~QjP$Um$S?~mrP@g=s}W&0}$q2&Dl94SfRSLxrlS4wm-F_IC_@2d;xQK@Qu*Am26}^D6tG{mi2` zRA4Jiq`#q9(TFz>%pNd~q9Cfi1OusFCZb1^lc;c_P{eal&>c}w!`+MknWeii%I1H| zTKk;u447+swTtk(Ej<{o%G>BppAmrpcoIcx0ml!(mQ1@fC`e+DbvXxFH?D zX1Vv=;@}EXwVZr)!g!U01}iUlqri-ZnGGJ=alr`(cNtc(N*cc^?ochv-xHW;@X9;_ zk3Ny2Hs1NTe?4PJet!G2Xs=-Y+O$C}|=hEJKhg0NK4LRi~h#{N1%r zUGJc=Oe(JrwwAN{stmR0Yg6gi1(qA$6t*s)pgnW|QFMD|7ip-$AAc+WJg{q#e5n(jdxnC5^+)q#S9^JW71D5aUEn=aOl0u2urt3TFm z=_LuKa?H(ZWupg(7z{qZz$hF_D9#ZR2Ygkz>Q!QHcGtX2ZuL$SaAVYIGLZmVb~B+I zz8QuT^Ly-XIh@@Ns(PGHke(ExOFXo)U~mx1FYlVyg6f={@3BUXo9A(G`Gg`Ww0`?* z=sYt&3T(ac13$uC9=PzA$}DR}RKP57@E`t$s)I|loNC1!O;Tt49nyf0XycJ zUkk&%^rC6-G|7hg&AuAfGYt~+*DG8&Sz1`yDs=GJLt-NTa99VFIg@@$NK|JH6@+fRY!AppzAC?M0k8)FhSUEk zjQ_iZ|Ff3?M;FB7(AieAXCKP3q6^@9Ozzu;F_12r@|e!UyS^} Spaces.nlevels(ᶜspace) && return false # short-circuit if - Operators.should_call_right_boundary(idx, space, op, args...) || - in_right_boundary_window_range(idx, bc_bds) -end - -##### -##### -##### - -Base.@propagate_inbounds function getidx( - parent_space, - bc::StencilBroadcasted{CUDAWithShmemColumnStencilStyle}, - idx, - hidx, -) - space = axes(bc) - if Operators.fd_shmem_is_supported(bc) - return fd_operator_evaluate( - bc.op, - bc.work, - space, - idx, - hidx, - bc.args..., - ) - end - op = bc.op - if Operators.should_call_left_boundary(idx, space, bc.op, bc.args...) - Operators.stencil_left_boundary( - op, - Operators.get_boundary(op, Operators.left_boundary_window(space)), - space, - idx, - hidx, - bc.args..., - ) - elseif Operators.should_call_right_boundary(idx, space, bc.op, bc.args...) - Operators.stencil_right_boundary( - op, - Operators.get_boundary(op, Operators.right_boundary_window(space)), - space, - idx, - hidx, - bc.args..., - ) - else - # fallback to interior stencil - Operators.stencil_interior(op, space, idx, hidx, bc.args...) - end -end - -""" - fd_allocate_shmem(shmem_params, b) - -Create a new broadcasted object with necessary share memory allocated, -using `params` nodal points per block. -""" -@inline function fd_allocate_shmem(::ShmemParams, obj) - obj -end -@inline function fd_allocate_shmem( - shmem_params::ShmemParams, - bc::Broadcasted{Style}, -) where {Style} - Broadcasted{Style}( - bc.f, - _fd_allocate_shmem(shmem_params, bc.args...), - bc.axes, - ) -end - -######### MatrixFields -# MatrixField operators are not yet supported, and we must stop recursing because -# we can have something of the form -# MatrixFields.LazyOneArgFDOperatorMatrix{DivergenceF2C{@NamedTuple{}}}(DivergenceF2C{@NamedTuple{}}(NamedTuple())) -# which `fd_shmem_is_supported` will return `true` for. - -@inline fd_allocate_shmem(_, bc::MatrixFields.LazyOperatorBroadcasted) = bc -@inline fd_allocate_shmem(_, bc::MatrixFields.FDOperatorMatrix) = bc -@inline fd_allocate_shmem(_, bc::MatrixFields.LazyOneArgFDOperatorMatrix) = bc -######### - -@inline function fd_allocate_shmem( - shmem_params::ShmemParams, - sbc::StencilBroadcasted{Style}, -) where {Style} - args = _fd_allocate_shmem(shmem_params, sbc.args...) - work = if Operators.fd_shmem_is_supported(sbc) - fd_operator_shmem(sbc.axes, shmem_params, sbc.op, args...) - else - nothing - end - StencilBroadcasted{Style}(sbc.op, args, sbc.axes, work) -end - -@inline _fd_allocate_shmem(::ShmemParams) = () -@inline _fd_allocate_shmem(shmem_params::ShmemParams, arg, xargs...) = ( - fd_allocate_shmem(shmem_params, arg), - _fd_allocate_shmem(shmem_params, xargs...)..., -) - -""" - fd_shmem_needed_per_column(::Base.Broadcast.Broadcasted) - fd_shmem_needed_per_column(::StencilBroadcasted) - -Return the total number of shared memory (in bytes) for the given -broadcast expression. -""" -@inline fd_shmem_needed_per_column(bc) = fd_shmem_needed_per_column(0, bc) -@inline fd_shmem_needed_per_column(shmem_bytes, obj) = shmem_bytes -@inline fd_shmem_needed_per_column( - shmem_bytes, - bc::Broadcasted{Style}, -) where {Style} = - shmem_bytes + _fd_shmem_needed_per_column(shmem_bytes, bc.args) - -@inline function fd_shmem_needed_per_column( - shmem_bytes, - sbc::StencilBroadcasted{Style}, -) where {Style} - shmem_bytes₀ = _fd_shmem_needed_per_column(shmem_bytes, sbc.args) - return if Operators.fd_shmem_is_supported(sbc) - sizeof(return_eltype(sbc.op, sbc.args...)) + shmem_bytes₀ - else - shmem_bytes₀ - end -end - -@inline _fd_shmem_needed_per_column(shmem_bytes::Integer, ::Tuple{}) = - shmem_bytes -@inline _fd_shmem_needed_per_column(shmem_bytes::Integer, args::Tuple{Any}) = - shmem_bytes + fd_shmem_needed_per_column(shmem_bytes::Integer, args[1]) -@inline _fd_shmem_needed_per_column(shmem_bytes::Integer, args::Tuple) = - shmem_bytes + - fd_shmem_needed_per_column(shmem_bytes::Integer, args[1]) + - _fd_shmem_needed_per_column(shmem_bytes::Integer, Base.tail(args)) - - -get_arg_space(bc::StencilBroadcasted, args::Tuple{}) = axes(bc) -get_arg_space(bc::StencilBroadcasted, args::Tuple) = axes(args[1]) - -get_cent_idx(idx::Integer) = idx # center when traversing centers (trivial) -get_face_idx(idx::PlusHalf) = idx # face when traversing faces (trivial) - -get_cent_idx(idx::PlusHalf) = idx + half # center when traversing faces. Convention: use center right of face -get_face_idx(idx::Integer) = idx - half # face when traversing centers. Convention: use face left of center - -""" - fd_resolve_shmem!( - sbc::StencilBroadcasted, - idx, - hidx, - bds - ) - -Recursively stores the arguments to all operators into shared memory, at the -given indices (if they are valid). -""" -Base.@propagate_inbounds function fd_resolve_shmem!( - sbc::StencilBroadcasted{CUDAWithShmemColumnStencilStyle}, - idx, # top-level index - hidx, - bds, -) - (li, lw, rw, ri) = bds - space = axes(sbc) - arg_space = get_arg_space(sbc, sbc.args) - ᶜidx = get_cent_idx(idx) - ᶠidx = get_face_idx(idx) - - # Here, we use tail-recursion. We visit leaves of the broadcast expression, - # then work our way up. The StencilBroadcasted and Broadcasted can be - # interleaved (e.g., `DivergenceF2C()(f*GradientC2F()(a*b)))`. The leaves of - # the StencilBroadcasted will call `getidx`, below which there are - # (by definition) no more `StencilBroadcasted`, and those `getidx` calls - # will read from global memory. Immediately above those reads, all - # subsequent reads will be from shmem (as they will be caught by the - # `getidx` defined above). - _fd_resolve_shmem!(idx, hidx, bds, sbc.args...) - - # Once we're about ready to fill the shmem, check if shmem is supported for - # this operator - Operators.fd_shmem_is_supported(sbc) || return nothing - - # There are `Nf` threads, where `Nf` is the number of face levels. So, - # each thread is responsible for filling shared memory at its cell center - # (if the broadcasted argument lives on cell centers) - # or cell face (if the broadcasted argument lives on cell faces) index. - # We use `get_face_idx` and `get_cent_idx` to grab the nearest in-bounds - # index, and `get_arg_space` to get the space of the first broadcasted argument - # (the space of all broadcasted arguments must all match, so using the first is valid). - - bc_bds = Operators.window_bounds(space, sbc) - ᵃidx = arg_space isa Operators.AllFaceFiniteDifferenceSpace ? ᶠidx : ᶜidx - - fd_operator_fill_shmem!( - sbc.op, - sbc.work, - bc_bds, - arg_space, - space, - ᵃidx, - hidx, - sbc.args..., - ) - CUDA.sync_threads() - return nothing -end - -Base.@propagate_inbounds function fd_resolve_shmem!( - sbc::StencilBroadcasted, - idx, # top-level index - hidx, - bds, -) - _fd_resolve_shmem!(idx, hidx, bds, sbc.args...) -end - -Base.@propagate_inbounds _fd_resolve_shmem!(idx, hidx, bds) = nothing -Base.@propagate_inbounds function _fd_resolve_shmem!( - idx, - hidx, - bds, - arg, - xargs..., -) - fd_resolve_shmem!(arg, idx, hidx, bds) - _fd_resolve_shmem!(idx, hidx, bds, xargs...) -end - -Base.@propagate_inbounds fd_resolve_shmem!(bc::Broadcasted, idx, hidx, bds) = - _fd_resolve_shmem!(idx, hidx, bds, bc.args...) -@inline fd_resolve_shmem!(obj, idx, hidx, bds) = nothing - -if hasfield(Method, :recursion_relation) - dont_limit = (args...) -> true - for m in methods(fd_resolve_shmem!) - m.recursion_relation = dont_limit - end - for m in methods(_fd_resolve_shmem!) - m.recursion_relation = dont_limit - end - for m in methods(_fd_allocate_shmem) - m.recursion_relation = dont_limit - end - for m in methods(fd_allocate_shmem) - m.recursion_relation = dont_limit - end -end diff --git a/ext/cuda/operators_fd_shmem_is_supported.jl b/ext/cuda/operators_fd_shmem_is_supported.jl deleted file mode 100644 index adf0310de2..0000000000 --- a/ext/cuda/operators_fd_shmem_is_supported.jl +++ /dev/null @@ -1,199 +0,0 @@ -import ClimaCore.MatrixFields -import ClimaCore.Operators: any_fd_shmem_supported - -""" - any_fd_shmem_supported(x) - -Returns a Bool indicating if any broadcasted object can support a shmem style -""" -function any_fd_shmem_supported end - -# Main entry point: call recursive function with 2 args -@inline any_fd_shmem_supported(bc) = any_fd_shmem_supported(false, bc) - -@inline _any_fd_shmem_supported_args(falsesofar, args::Tuple) = - falsesofar || - any_fd_shmem_supported(falsesofar, args[1]) || - _any_fd_shmem_supported_args(falsesofar, Base.tail(args)) - -@inline _any_fd_shmem_supported_args(falsesofar, args::Tuple{Any}) = - falsesofar || any_fd_shmem_supported(falsesofar, args[1]) - -@inline _any_fd_shmem_supported_args(falsesofar, args::Tuple{}) = falsesofar - -@inline function _any_fd_shmem_supported( - falsesofar, - bc::Base.Broadcast.Broadcasted, -) - return falsesofar || _any_fd_shmem_supported_args(falsesofar, bc.args) -end - -@inline _any_fd_shmem_supported(falsesofar, bc) = falsesofar - -@inline _any_fd_shmem_supported(falsesofar, _, x) = falsesofar - -@inline any_fd_shmem_supported(falsesofar, x) = falsesofar # generic fallback -@inline any_fd_shmem_supported(falsesofar, bc::StencilBroadcasted) = - falsesofar || - Operators.fd_shmem_is_supported(bc) || - _any_fd_shmem_supported_args(falsesofar, bc.args) - -@inline any_fd_shmem_supported(falsesofar, bc::Base.Broadcast.Broadcasted) = - falsesofar || _any_fd_shmem_supported_args(falsesofar, bc.args) - -@inline any_fd_shmem_supported(bc::Base.Broadcast.Broadcasted) = - _any_fd_shmem_supported_args(false, bc.args) - - -# Fallback is false: -@inline Operators.fd_shmem_is_supported(bc::StencilBroadcasted) = - Operators.fd_shmem_is_supported(bc.op) - - -""" - any_fd_shmem_style() - -Returns a Bool indicating if any broadcasted object has a shmem style -""" -function any_fd_shmem_style end - -@inline any_fd_shmem_style(bc) = any_fd_shmem_style(false, bc) - -@inline _any_fd_shmem_style_args(falsesofar, args::Tuple) = - falsesofar || - any_fd_shmem_style(falsesofar, args[1]) || - _any_fd_shmem_style_args(falsesofar, Base.tail(args)) - -@inline _any_fd_shmem_style_args(falsesofar, args::Tuple{Any}) = - falsesofar || any_fd_shmem_style(falsesofar, args[1]) - -@inline _any_fd_shmem_style_args(falsesofar, args::Tuple{}) = falsesofar - -@inline function _any_fd_shmem_style(falsesofar, bc::Base.Broadcast.Broadcasted) - return falsesofar || _any_fd_shmem_style_args(falsesofar, bc.args) -end - -@inline _any_fd_shmem_style(falsesofar, bc) = falsesofar - -@inline _any_fd_shmem_style(falsesofar, _, x) = falsesofar - -@inline any_fd_shmem_style(falsesofar, x) = falsesofar # generic fallback -@inline any_fd_shmem_style( - falsesofar, - bc::StencilBroadcasted{CUDAWithShmemColumnStencilStyle}, -) = falsesofar || _any_fd_shmem_style_args(falsesofar, bc.args) - -@inline any_fd_shmem_style(falsesofar, bc::StencilBroadcasted) = - falsesofar || _any_fd_shmem_style_args(falsesofar, bc.args) - -""" - disable_shmem_style() - -For high resolution cases, shmem may not work, so `disable_shmem` transforms a -the boradcast style from -`CUDAWithShmemColumnStencilStyle` to `CUDAColumnStencilStyle`. -""" -function disable_shmem_style end - -@inline disable_shmem_style_args(args::Tuple) = - (disable_shmem_style(args[1]), disable_shmem_style_args(Base.tail(args))...) -@inline disable_shmem_style_args(args::Tuple{Any}) = - (disable_shmem_style(args[1]),) -@inline disable_shmem_style_args(args::Tuple{}) = () - -@inline function disable_shmem_style( - bc::StencilBroadcasted{CUDAWithShmemColumnStencilStyle}, -) - StencilBroadcasted{CUDAColumnStencilStyle}( - bc.op, - disable_shmem_style_args(bc.args), - bc.axes, - nothing, - ) -end - -@inline function disable_shmem_style( - bc::Base.Broadcast.Broadcasted{CUDAWithShmemColumnStencilStyle}, -) - Base.Broadcast.Broadcasted{CUDAColumnStencilStyle}( - bc.f, - disable_shmem_style_args(bc.args), - bc.axes, - ) -end -@inline disable_shmem_style(x) = x - -##### MatrixFields -@inline Operators.fd_shmem_is_supported( - bc::MatrixFields.LazyOperatorBroadcasted, -) = false - -@inline Operators.fd_shmem_is_supported(op::MatrixFields.FDOperatorMatrix) = - false - -@inline Operators.fd_shmem_is_supported( - op::MatrixFields.LazyOneArgFDOperatorMatrix, -) = false -##### - -@inline Operators.fd_shmem_is_supported(op::Operators.AbstractOperator) = - Operators.fd_shmem_is_supported(op, op.bcs) - -@inline Operators.fd_shmem_is_supported( - op::MatrixFields.MultiplyColumnwiseBandMatrixField, -) = false - -@inline Operators.fd_shmem_is_supported( - op::Operators.AbstractOperator, - bcs::NamedTuple, -) = false - -# Add cases here where shmem is supported: - -##### DivergenceF2C -@inline Operators.fd_shmem_is_supported(op::Operators.DivergenceF2C) = - Operators.fd_shmem_is_supported(op, op.bcs) -@inline Operators.fd_shmem_is_supported( - op::Operators.DivergenceF2C, - ::@NamedTuple{}, -) = true -@inline Operators.fd_shmem_is_supported( - op::Operators.DivergenceF2C, - bcs::NamedTuple, -) = - all(values(bcs)) do bc - any(supported_bc -> bc isa supported_bc, (Operators.SetValue,)) - end - -##### GradientC2F -@inline Operators.fd_shmem_is_supported(op::Operators.GradientC2F) = - Operators.fd_shmem_is_supported(op, op.bcs) -@inline Operators.fd_shmem_is_supported( - op::Operators.GradientC2F, - ::@NamedTuple{}, -) = false -@inline Operators.fd_shmem_is_supported( - op::Operators.GradientC2F, - bcs::NamedTuple, -) = - all(values(bcs)) do bc - any(supported_bc -> bc isa supported_bc, (Operators.SetValue,)) - end - -##### InterpolateC2F -@inline Operators.fd_shmem_is_supported(op::Operators.InterpolateC2F) = - Operators.fd_shmem_is_supported(op, op.bcs) -@inline Operators.fd_shmem_is_supported( - op::Operators.InterpolateC2F, - ::@NamedTuple{}, -) = true -@inline Operators.fd_shmem_is_supported( - op::Operators.InterpolateC2F, - bcs::NamedTuple, -) = - all(values(bcs)) do bc - any( - supported_bc -> bc isa supported_bc, - (Operators.SetValue, Operators.SetGradient, Operators.Extrapolate), - ) - end diff --git a/ext/cuda/operators_finite_difference.jl b/ext/cuda/operators_finite_difference.jl index d8f49ffedd..b72cd9515b 100644 --- a/ext/cuda/operators_finite_difference.jl +++ b/ext/cuda/operators_finite_difference.jl @@ -10,7 +10,6 @@ import ClimaCore.Operators: StencilBroadcasted import ClimaCore.Operators: LeftBoundaryWindow, RightBoundaryWindow, Interior struct CUDAColumnStencilStyle <: AbstractStencilStyle end -struct CUDAWithShmemColumnStencilStyle <: AbstractStencilStyle end AbstractStencilStyle(bc, ::ClimaComms.CUDADevice) = CUDAColumnStencilStyle @@ -18,20 +17,13 @@ Base.Broadcast.BroadcastStyle( x::Operators.ColumnStencilStyle, y::CUDAColumnStencilStyle, ) = y - -include("operators_fd_shmem_is_supported.jl") include("operators_fd_eager.jl") -struct ShmemParams{Nv} end -interior_size(::ShmemParams{Nv}) where {Nv} = (Nv,) -boundary_size(::ShmemParams{Nv}) where {Nv} = (1,) function Base.copyto!( out::Field, bc::Union{ StencilBroadcasted{CUDAColumnStencilStyle}, - StencilBroadcasted{CUDAWithShmemColumnStencilStyle}, Broadcasted{CUDAColumnStencilStyle}, - Broadcasted{CUDAWithShmemColumnStencilStyle}, }, mask = Spaces.get_mask(axes(out)), ) @@ -42,99 +34,63 @@ function Base.copyto!( fspace = Spaces.face_space(space) n_face_levels = Spaces.nlevels(fspace) - high_resolution = !(n_face_levels ≤ 256) - # https://github.com/JuliaGPU/CUDA.jl/issues/2672 - # max_shmem = 166912 # CUDA.limit(CUDA.LIMIT_SHMEM_SIZE) # - max_shmem = CUDA.attribute( - device(), - CUDA.DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK, - ) - total_shmem = fd_shmem_needed_per_column(bc) - enough_shmem = total_shmem ≤ max_shmem - # TODO: Use CUDA.limit(CUDA.LIMIT_SHMEM_SIZE) to determine how much shmem should be used - # TODO: add shmem support for masked operations - if Operators.any_fd_shmem_supported(bc) && - !high_resolution && - mask isa NoMask && - enough_shmem && - Operators.use_fd_shmem() - shmem_params = ShmemParams{n_face_levels}() - p = fd_shmem_stencil_partition(us, n_face_levels) + (Ni, Nj, _, Nv, Nh) = DataLayouts.universal_size(out_fv) + # This uses block and grid indices instead of computing cartesian indices from a + # linear index. The launch configuration is optimized for common use case of 64 face + # levels and Ni = Nj = 4. Periodic toppologies and masks are not currently supported + # `eager_copyto_stencil_kernel!` requires a block size of (n_face_levels, Ni, 1) + # this block config is better for VIJFH. It is only used when the total number of + # threads in a block is between 32 and 256 to avoid underutilization of the GPU and + # errors due to too many registers used when the block size is too large. + if !Topologies.isperiodic(space) && mask isa NoMask && + 32 <= n_face_levels * Ni <= 256 + op_matrix_bc = replace_fd_ops(bc) args = ( strip_space(out, space), - strip_space(bc, space), + strip_space(op_matrix_bc, space), axes(out), - bounds, - us, - mask, - shmem_params, ) auto_launch!( - copyto_stencil_kernel_shmem!, + eager_copyto_stencil_kernel!, args; - threads_s = p.threads, - blocks_s = p.blocks, + threads_s = (n_face_levels, Ni, 1), + blocks_s = (1, Nj, Nh), + always_inline = true, + shmem = n_face_levels * Ni * 9 * 4, # see `check_if_fits_in_shmem` for how this is calculated ) + call_post_op_callback() && post_op_callback(out, out, bc) + return out + end + cart_inds = if mask isa NoMask + cartesian_indices(us) else - bc′ = disable_shmem_style(bc) - (Ni, Nj, _, Nv, Nh) = DataLayouts.universal_size(out_fv) - # This uses block and grid indices instead of computing cartesian indices from a - # linear index. The launch configuration is optimized for common use case of 64 face - # levels and Ni = Nj = 4. Periodic toppologies and masks are not currently supported - # `eager_copyto_stencil_kernel!` requires a block size of (n_face_levels, Ni, 1) - # this block config is better for VIJFH. It is only used when the total number of - # threads in a block is between 32 and 256 to avoid underutilization of the GPU and - # errors due to too many registers used when the block size is too large. - if !Topologies.isperiodic(space) && mask isa NoMask && - 32 <= n_face_levels * Ni <= 256 - op_matrix_bc = replace_fd_ops(bc′) - args = ( - strip_space(out, space), - strip_space(op_matrix_bc, space), - axes(out), - ) - auto_launch!( - eager_copyto_stencil_kernel!, - args; - threads_s = (n_face_levels, Ni, 1), - blocks_s = (1, Nj, Nh), - always_inline = true, - shmem = n_face_levels * Ni * 9 * 4, # see `check_if_fits_in_shmem` for how this is calculated - ) - return out - end - @assert !any_fd_shmem_style(bc′) - cart_inds = if mask isa NoMask - cartesian_indices(us) - else - cartesian_indices_mask(us, mask) - end + cartesian_indices_mask(us, mask) + end - args = cudaconvert(( - strip_space(out, space), - strip_space(bc′, space), - axes(out), - bounds, - us, - mask, - cart_inds, - )) + args = cudaconvert(( + strip_space(out, space), + strip_space(bc, space), + axes(out), + bounds, + us, + mask, + cart_inds, + )) - threads = threads_via_occupancy(copyto_stencil_kernel!, args) - n_max_threads = min(threads, get_N(us)) - p = if mask isa NoMask - linear_partition(prod(size(out_fv)), n_max_threads) - else - masked_partition(mask, n_max_threads, us) - end - auto_launch!( - copyto_stencil_kernel!, - args; - threads_s = p.threads, - blocks_s = p.blocks, - ) + threads = threads_via_occupancy(copyto_stencil_kernel!, args) + n_max_threads = min(threads, get_N(us)) + p = if mask isa NoMask + linear_partition(prod(size(out_fv)), n_max_threads) + else + masked_partition(mask, n_max_threads, us) end + auto_launch!( + copyto_stencil_kernel!, + args; + threads_s = p.threads, + blocks_s = p.blocks, + ) call_post_op_callback() && post_op_callback(out, out, bc) return out end @@ -172,43 +128,3 @@ function copyto_stencil_kernel!( end return nothing end - -function copyto_stencil_kernel_shmem!( - out, - bc′::Union{StencilBroadcasted, Broadcasted}, - space, - bds, - us, - mask, - shmem_params::ShmemParams, -) - @inbounds begin - out_fv = Fields.field_values(out) - us = DataLayouts.UniversalSize(out_fv) - I = fd_shmem_stencil_universal_index(space, us) - if fd_shmem_stencil_is_valid_index(I, us) # check that hidx is in bounds - (li, lw, rw, ri) = bds - (i, j, _, v, h) = I.I - hidx = (i, j, h) - idx = v - 1 + li - bc = Operators.reconstruct_placeholder_broadcasted(space, bc′) - bc_shmem = fd_allocate_shmem(shmem_params, bc) # allocates shmem - - fd_resolve_shmem!(bc_shmem, idx, hidx, bds) # recursively fills shmem - CUDA.sync_threads() - - nv = Spaces.nlevels(space) - isactive = if space isa Operators.AllFaceFiniteDifferenceSpace # check that idx is in bounds - idx + half <= nv - else - idx <= nv - end - if isactive - # Call getidx overloaded in operators_fd_shmem_common.jl - val = Operators.getidx(space, bc_shmem, idx, hidx) - setidx!(space, out, idx, hidx, val) - end - end - end - return nothing -end diff --git a/test/Operators/finitedifference/benchmark_fd_ops_shared_memory.jl b/test/Operators/finitedifference/benchmark_fd_ops_shared_memory.jl deleted file mode 100644 index f1b8849f51..0000000000 --- a/test/Operators/finitedifference/benchmark_fd_ops_shared_memory.jl +++ /dev/null @@ -1,114 +0,0 @@ -#= -julia --project=.buildkite -using Revise; include("test/Operators/finitedifference/benchmark_fd_ops_shared_memory.jl") -=# -include("utils_fd_ops_shared_memory.jl") -using BenchmarkTools - -#! format: off -function bench_kernels!(fields) - (; f, ρ, ϕ) = fields - (; ᶜout1, ᶜout2, ᶜout3, ᶜout4, ᶜout5, ᶜout6, ᶜout7, ᶜout8) = fields - device = ClimaComms.device(f) - FT = Spaces.undertype(axes(ϕ)) - div_bcs = Operators.DivergenceF2C(; - bottom = Operators.SetValue(Geometry.Covariant3Vector(FT(10))), - top = Operators.SetValue(Geometry.Covariant3Vector(FT(10))), - ) - div = Operators.DivergenceF2C() - ᶠwinterp = Operators.WeightedInterpolateC2F( - bottom = Operators.Extrapolate(), - top = Operators.Extrapolate(), - ) - println("ᶜout1: ", @benchmark ClimaComms.@cuda_sync $device begin - @. $ᶜout1 = $div(Geometry.WVector($f)) - end) - @. ᶜout2 = 0 - println("ᶜout2: ", @benchmark ClimaComms.@cuda_sync $device begin - @. $ᶜout2 += $div(Geometry.WVector($f) * 2) - end) - println("ᶜout3: ", @benchmark ClimaComms.@cuda_sync $device begin - @. $ᶜout3 = $div(Geometry.WVector($ᶠwinterp($ϕ, $ρ))) - end) - - println("ᶜout4: ", @benchmark ClimaComms.@cuda_sync $device begin - @. $ᶜout4 = $div_bcs(Geometry.WVector($f)) - end) - @. ᶜout5 = 0 - println("ᶜout5: ", @benchmark ClimaComms.@cuda_sync $device begin - @. $ᶜout5 += $div_bcs(Geometry.WVector($f) * 2) - end) - println("ᶜout6: ", @benchmark ClimaComms.@cuda_sync $device begin - @. $ᶜout6 = $div_bcs(Geometry.WVector($ᶠwinterp($ϕ, $ρ))) - end) - - # from the wild - Ic2f = Operators.InterpolateC2F(; top = Operators.Extrapolate()) - divf2c = Operators.DivergenceF2C(; bottom = Operators.SetValue(Geometry.Covariant3Vector(FT(10)))) - # only upward component of divergence - println("ᶜout7: ", @benchmark ClimaComms.@cuda_sync $device begin - @. $ᶜout7 = $divf2c(Geometry.WVector($Ic2f($ϕ))) # works - end) - println("ᶜout8: ", @benchmark ClimaComms.@cuda_sync $device begin - @. $ᶜout8 = $divf2c($Ic2f(Geometry.WVector($ϕ))) - end) - return nothing -end; - -#! format: on - -@info "GPU benchmark results (Float64) z_elem = 10, h_elem = 30:" -ᶜspace = - get_space_extruded(ClimaComms.device(), Float64; z_elem = 10, h_elem = 30); -ᶠspace = Spaces.face_space(ᶜspace); -fields = (; get_fields(ᶜspace)..., get_fields(ᶠspace)...); -bench_kernels!(fields) -Utilities.Cache.clean_cache!(); -GC.gc(true); - -@info "GPU benchmark results (Float64) z_elem = 63, h_elem = 30:" -ᶜspace = - get_space_extruded(ClimaComms.device(), Float64; z_elem = 63, h_elem = 30); -ᶠspace = Spaces.face_space(ᶜspace); -fields = (; get_fields(ᶜspace)..., get_fields(ᶠspace)...); -bench_kernels!(fields) -Utilities.Cache.clean_cache!(); -GC.gc(true); - -@info "GPU benchmark results (Float64) z_elem = 10, h_elem = 100:" -ᶜspace = - get_space_extruded(ClimaComms.device(), Float64; z_elem = 10, h_elem = 100); -ᶠspace = Spaces.face_space(ᶜspace); -fields = (; get_fields(ᶜspace)..., get_fields(ᶠspace)...); -bench_kernels!(fields) -Utilities.Cache.clean_cache!(); -GC.gc(true); - -@info "GPU benchmark results (Float32) z_elem = 10, h_elem = 30:" -ᶜspace = - get_space_extruded(ClimaComms.device(), Float32; z_elem = 10, h_elem = 30); -ᶠspace = Spaces.face_space(ᶜspace); -fields = (; get_fields(ᶜspace)..., get_fields(ᶠspace)...); -bench_kernels!(fields) -Utilities.Cache.clean_cache!(); -GC.gc(true); - -@info "GPU benchmark results (Float32) z_elem = 63, h_elem = 30:" -ᶜspace = - get_space_extruded(ClimaComms.device(), Float32; z_elem = 63, h_elem = 30); -ᶠspace = Spaces.face_space(ᶜspace); -fields = (; get_fields(ᶜspace)..., get_fields(ᶠspace)...); -bench_kernels!(fields) -Utilities.Cache.clean_cache!(); -GC.gc(true); - -@info "GPU benchmark results (Float32) z_elem = 10, h_elem = 100:" -ᶜspace = - get_space_extruded(ClimaComms.device(), Float32; z_elem = 10, h_elem = 100); -ᶠspace = Spaces.face_space(ᶜspace); -fields = (; get_fields(ᶜspace)..., get_fields(ᶠspace)...); -bench_kernels!(fields) -Utilities.Cache.clean_cache!(); -GC.gc(true); - -nothing diff --git a/test/Operators/finitedifference/unit_fd_ops_shared_memory.jl b/test/Operators/finitedifference/unit_fd_ops_shared_memory.jl deleted file mode 100644 index 79eba774fb..0000000000 --- a/test/Operators/finitedifference/unit_fd_ops_shared_memory.jl +++ /dev/null @@ -1,222 +0,0 @@ -#= -julia --project=.buildkite -julia --check-bounds=yes -g2 --project=.buildkite -using Revise; include("test/Operators/finitedifference/unit_fd_ops_shared_memory.jl") -=# -include("utils_fd_ops_shared_memory.jl") - -Operators.use_fd_shmem() = true -@testset "FD shared memory: dispatch" begin # this ensures that we exercise the correct code-path - FT = Float64 - device = ClimaComms.device() - @test device isa ClimaComms.CUDADevice - ᶜspace = get_space_column(device, FT) - ᶠspace = Spaces.face_space(ᶜspace) - f = Fields.Field(FT, ᶠspace) - c = Fields.Field(FT, ᶜspace) - grad = Operators.GradientF2C() - bc = @. lazy(grad(f)) - @test !Operators.any_fd_shmem_supported(bc) - div = Operators.DivergenceF2C() - bc = @. lazy(div(Geometry.WVector(f))) - @test Operators.any_fd_shmem_supported(bc) - bc = @. lazy(c + div(Geometry.WVector(f))) - @test Operators.any_fd_shmem_supported(bc) - - ᶠinterp = Operators.InterpolateC2F() - div = Operators.DivergenceF2C(; - top = Operators.SetValue(10), - bottom = Operators.SetValue(10), - ) - bc = @. lazy(div(ᶠinterp(Geometry.WVector(c)))) - @test Operators.any_fd_shmem_supported(bc) -end - -@testset "Disable for high resolution" begin - FT = Float64 - device = ClimaComms.device() - ext = Base.get_extension(ClimaCore, :ClimaCoreCUDAExt) - ᶜspace = get_space_column(device, FT; z_elem = 1000) - ᶠspace = Spaces.face_space(ᶜspace) - f = Fields.Field(FT, ᶠspace) - c = Fields.Field(FT, ᶜspace) - div = Operators.DivergenceF2C() - bc = @. lazy(div(Geometry.WVector(f))) - @test Operators.any_fd_shmem_supported(bc) - @test !ext.any_fd_shmem_style(ext.disable_shmem_style(bc)) - @. c = div(Geometry.WVector(f)) - ᶠgrad = Operators.GradientC2F(; - bottom = Operators.SetValue(FT(0)), - top = Operators.SetValue(FT(0)), - ) - bc = @. lazy(ᶠgrad(c)) - @test Operators.any_fd_shmem_supported(bc) - @test Operators.fd_shmem_is_supported(bc) -end - -@testset "Utility functions" begin - FT = Float64 - device = ClimaComms.device() - ext = Base.get_extension(ClimaCore, :ClimaCoreCUDAExt) - ᶜspace = get_space_column(device, FT; z_elem = 10) - ᶠspace = Spaces.face_space(ᶜspace) - f = Fields.Field(FT, ᶠspace) - c = Fields.Field(FT, ᶜspace) - fields = (; get_fields(ᶜspace)..., get_fields(ᶠspace)...) - (; ϕ, ρ) = fields - - div = Operators.DivergenceF2C() - bc = @. lazy(div(Geometry.WVector(f))) - test_face_windows(bc) - - div_bcs = Operators.DivergenceF2C(; - bottom = Operators.SetValue(Geometry.Covariant3Vector(FT(10))), - top = Operators.SetValue(Geometry.Covariant3Vector(FT(10))), - ) - bc = @. lazy(div_bcs(Geometry.WVector(f) * 2)) - test_face_windows(bc) - - ᶠgrad = Operators.GradientC2F(; - bottom = Operators.SetValue(FT(0)), - top = Operators.SetValue(FT(0)), - ) - bc = @. lazy(ᶠgrad(c)) - test_center_windows(bc) - - div = Operators.DivergenceF2C() - ᶠwinterp = Operators.WeightedInterpolateC2F( - bottom = Operators.Extrapolate(), - top = Operators.Extrapolate(), - ) - bc = @. lazy(div(Geometry.WVector(ᶠwinterp(ϕ, ρ)))) - test_face_windows(bc) - # highly nested cases - ᶜinterp = Operators.InterpolateF2C() - ᶠinterp = Operators.InterpolateC2F( - bottom = Operators.Extrapolate(), - top = Operators.Extrapolate(), - ) - bc = @. lazy(ᶠgrad(ᶜinterp(ᶠinterp(ᶜinterp(f))))) # exercises very nested operation - test_center_windows(bc) - test_face_windows(bc.args[1]) - test_center_windows(bc.args[1].args[1]) -end - -#! format: off -@testset "Correctness column" begin - ᶜspace_cpu = get_space_column(ClimaComms.CPUSingleThreaded(), Float64) - ᶠspace_cpu = Spaces.face_space(ᶜspace_cpu) - fields_cpu = (; get_fields(ᶜspace_cpu)..., get_fields(ᶠspace_cpu)...) - kernels!(fields_cpu) - @info "Compiled CPU kernels" - - ᶜspace = get_space_column(ClimaComms.device(), Float64) - ClimaComms.device(ᶜspace) isa ClimaComms.CPUSingleThreaded && - @warn "Running on the CPU" - ᶠspace = Spaces.face_space(ᶜspace) - fields = (; get_fields(ᶜspace)..., get_fields(ᶠspace)...) - kernels!(fields) - @info "Compiled GPU kernels" - - @test compare_cpu_gpu(fields_cpu.ᶜout1, fields.ᶜout1); @test !is_trivial(fields_cpu.ᶜout1) - @test compare_cpu_gpu(fields_cpu.ᶜout2, fields.ᶜout2); @test !is_trivial(fields_cpu.ᶜout2) - @test compare_cpu_gpu(fields_cpu.ᶜout3, fields.ᶜout3); @test !is_trivial(fields_cpu.ᶜout3) - @test compare_cpu_gpu(fields_cpu.ᶜout4, fields.ᶜout4); @test !is_trivial(fields_cpu.ᶜout4) - @test compare_cpu_gpu(fields_cpu.ᶜout5, fields.ᶜout5); @test !is_trivial(fields_cpu.ᶜout5) - @test compare_cpu_gpu(fields_cpu.ᶜout6, fields.ᶜout6); @test !is_trivial(fields_cpu.ᶜout6) - @test compare_cpu_gpu(fields_cpu.ᶜout7, fields.ᶜout7); @test !is_trivial(fields_cpu.ᶜout7) - @test compare_cpu_gpu(fields_cpu.ᶜout8, fields.ᶜout8); @test !is_trivial(fields_cpu.ᶜout8) - @test compare_cpu_gpu(fields_cpu.ᶠout1, fields.ᶠout1); @test !is_trivial(fields_cpu.ᶠout1) - @test compare_cpu_gpu(fields_cpu.ᶠout2, fields.ᶠout2); @test !is_trivial(fields_cpu.ᶠout2) - @test compare_cpu_gpu(fields_cpu.ᶠout1_contra, fields.ᶠout1_contra); @test !is_trivial(fields_cpu.ᶠout1_contra) - @test compare_cpu_gpu(fields_cpu.ᶠout2_contra, fields.ᶠout2_contra); @test !is_trivial(fields_cpu.ᶠout2_contra) - @test compare_cpu_gpu(fields_cpu.ᶜout9, fields.ᶜout9); @test !is_trivial(fields_cpu.ᶜout9) - @test compare_cpu_gpu(fields_cpu.ᶜout10, fields.ᶜout10); @test !is_trivial(fields_cpu.ᶜout10) - @test compare_cpu_gpu(fields_cpu.ᶜout11, fields.ᶜout11); @test !is_trivial(fields_cpu.ᶜout11) - @test compare_cpu_gpu(fields_cpu.ᶜout12, fields.ᶜout12); @test !is_trivial(fields_cpu.ᶜout12) - @test compare_cpu_gpu(fields_cpu.ᶜout13, fields.ᶜout13); @test !is_trivial(fields_cpu.ᶜout13) - @test compare_cpu_gpu(fields_cpu.ᶜout14, fields.ᶜout14); @test !is_trivial(fields_cpu.ᶜout14) - @test compare_cpu_gpu(fields_cpu.ᶜout_uₕ, fields.ᶜout_uₕ); @test !is_trivial(fields_cpu.ᶜout_uₕ) - @test compare_cpu_gpu(fields_cpu.ᶠout3_cov, fields.ᶠout3_cov); @test !is_trivial(fields_cpu.ᶠout3_cov) - @test compare_cpu_gpu(fields_cpu.ᶠout4_cov, fields.ᶠout4_cov); @test !is_trivial(fields_cpu.ᶠout4_cov) - @test compare_cpu_gpu(fields_cpu.ᶠout5_cov, fields.ᶠout5_cov); @test !is_trivial(fields_cpu.ᶠout5_cov) -end - -@testset "Correctness plane" begin - ᶜspace_cpu = get_space_plane(ClimaComms.CPUSingleThreaded(), Float64) - ᶠspace_cpu = Spaces.face_space(ᶜspace_cpu) - fields_cpu = (; get_fields(ᶜspace_cpu)..., get_fields(ᶠspace_cpu)...) - kernels!(fields_cpu) - @info "Compiled CPU kernels" - - ᶜspace = get_space_plane(ClimaComms.device(), Float64) - ClimaComms.device(ᶜspace) isa ClimaComms.CPUSingleThreaded && - @warn "Running on the CPU" - ᶠspace = Spaces.face_space(ᶜspace) - fields = (; get_fields(ᶜspace)..., get_fields(ᶠspace)...) - kernels!(fields) - @info "Compiled GPU kernels" - - @test compare_cpu_gpu(fields_cpu.ᶜout1, fields.ᶜout1); @test !is_trivial(fields_cpu.ᶜout1) - @test compare_cpu_gpu(fields_cpu.ᶜout2, fields.ᶜout2); @test !is_trivial(fields_cpu.ᶜout2) - @test compare_cpu_gpu(fields_cpu.ᶜout3, fields.ᶜout3); @test !is_trivial(fields_cpu.ᶜout3) - @test compare_cpu_gpu(fields_cpu.ᶜout4, fields.ᶜout4); @test !is_trivial(fields_cpu.ᶜout4) - @test compare_cpu_gpu(fields_cpu.ᶜout5, fields.ᶜout5); @test !is_trivial(fields_cpu.ᶜout5) - @test compare_cpu_gpu(fields_cpu.ᶜout6, fields.ᶜout6); @test !is_trivial(fields_cpu.ᶜout6) - @test compare_cpu_gpu(fields_cpu.ᶜout7, fields.ᶜout7); @test !is_trivial(fields_cpu.ᶜout7) - @test compare_cpu_gpu(fields_cpu.ᶜout8, fields.ᶜout8); @test !is_trivial(fields_cpu.ᶜout8) - @test compare_cpu_gpu(fields_cpu.ᶠout1, fields.ᶠout1); @test !is_trivial(fields_cpu.ᶠout1) - @test compare_cpu_gpu(fields_cpu.ᶠout2, fields.ᶠout2); @test !is_trivial(fields_cpu.ᶠout2) - @test compare_cpu_gpu(fields_cpu.ᶠout1_contra, fields.ᶠout1_contra); @test !is_trivial(fields_cpu.ᶠout1_contra) - @test compare_cpu_gpu(fields_cpu.ᶠout2_contra, fields.ᶠout2_contra); @test !is_trivial(fields_cpu.ᶠout2_contra) - @test compare_cpu_gpu(fields_cpu.ᶜout9, fields.ᶜout9); @test !is_trivial(fields_cpu.ᶜout9) - @test compare_cpu_gpu(fields_cpu.ᶜout10, fields.ᶜout10); @test !is_trivial(fields_cpu.ᶜout10) - @test compare_cpu_gpu(fields_cpu.ᶜout11, fields.ᶜout11); @test !is_trivial(fields_cpu.ᶜout11) - @test compare_cpu_gpu(fields_cpu.ᶜout12, fields.ᶜout12); @test !is_trivial(fields_cpu.ᶜout12) - @test compare_cpu_gpu(fields_cpu.ᶜout13, fields.ᶜout13); @test !is_trivial(fields_cpu.ᶜout13) - @test compare_cpu_gpu(fields_cpu.ᶜout14, fields.ᶜout14); @test !is_trivial(fields_cpu.ᶜout14) - @test compare_cpu_gpu(fields_cpu.ᶜout_uₕ, fields.ᶜout_uₕ); @test !is_trivial(fields_cpu.ᶜout_uₕ) - @test compare_cpu_gpu(fields_cpu.ᶠout3_cov, fields.ᶠout3_cov); @test !is_trivial(fields_cpu.ᶠout3_cov) - @test compare_cpu_gpu(fields_cpu.ᶠout4_cov, fields.ᶠout4_cov); @test !is_trivial(fields_cpu.ᶠout4_cov) - @test compare_cpu_gpu(fields_cpu.ᶠout5_cov, fields.ᶠout5_cov); @test !is_trivial(fields_cpu.ᶠout5_cov) -end - -@testset "Correctness extruded cubed sphere" begin - ᶜspace_cpu = get_space_extruded(ClimaComms.CPUSingleThreaded(), Float64) - ᶠspace_cpu = Spaces.face_space(ᶜspace_cpu) - fields_cpu = (; get_fields(ᶜspace_cpu)..., get_fields(ᶠspace_cpu)...) - kernels!(fields_cpu) - @info "Compiled CPU kernels" - - ᶜspace = get_space_extruded(ClimaComms.device(), Float64) - ᶠspace = Spaces.face_space(ᶜspace) - fields = (; get_fields(ᶜspace)..., get_fields(ᶠspace)...) - kernels!(fields) - @info "Compiled GPU kernels" - - @test compare_cpu_gpu(fields_cpu.ᶜout1, fields.ᶜout1); @test !is_trivial(fields_cpu.ᶜout1) - @test compare_cpu_gpu(fields_cpu.ᶜout2, fields.ᶜout2); @test !is_trivial(fields_cpu.ᶜout2) - @test compare_cpu_gpu(fields_cpu.ᶜout3, fields.ᶜout3); @test !is_trivial(fields_cpu.ᶜout3) - @test compare_cpu_gpu(fields_cpu.ᶜout4, fields.ᶜout4); @test !is_trivial(fields_cpu.ᶜout4) - @test compare_cpu_gpu(fields_cpu.ᶜout5, fields.ᶜout5); @test !is_trivial(fields_cpu.ᶜout5) - @test compare_cpu_gpu(fields_cpu.ᶜout6, fields.ᶜout6); @test !is_trivial(fields_cpu.ᶜout6) - @test compare_cpu_gpu(fields_cpu.ᶜout7, fields.ᶜout7); @test !is_trivial(fields_cpu.ᶜout7) - @test compare_cpu_gpu(fields_cpu.ᶜout8, fields.ᶜout8); @test !is_trivial(fields_cpu.ᶜout8) - @test compare_cpu_gpu(fields_cpu.ᶠout1, fields.ᶠout1); @test !is_trivial(fields_cpu.ᶠout1) - @test compare_cpu_gpu(fields_cpu.ᶠout2, fields.ᶠout2); @test !is_trivial(fields_cpu.ᶠout2) - @test compare_cpu_gpu(fields_cpu.ᶠout1_contra, fields.ᶠout1_contra); @test !is_trivial(fields_cpu.ᶠout1_contra) - @test compare_cpu_gpu(fields_cpu.ᶠout2_contra, fields.ᶠout2_contra); @test !is_trivial(fields_cpu.ᶠout2_contra) - @test compare_cpu_gpu(fields_cpu.ᶜout9, fields.ᶜout9); @test !is_trivial(fields_cpu.ᶜout9) - @test compare_cpu_gpu(fields_cpu.ᶜout10, fields.ᶜout10); @test !is_trivial(fields_cpu.ᶜout10) - @test compare_cpu_gpu(fields_cpu.ᶜout11, fields.ᶜout11); @test !is_trivial(fields_cpu.ᶜout11) - @test compare_cpu_gpu(fields_cpu.ᶜout12, fields.ᶜout12); @test !is_trivial(fields_cpu.ᶜout12) - @test compare_cpu_gpu(fields_cpu.ᶜout13, fields.ᶜout13); @test !is_trivial(fields_cpu.ᶜout13) - @test compare_cpu_gpu(fields_cpu.ᶜout14, fields.ᶜout14); @test !is_trivial(fields_cpu.ᶜout14) - @test compare_cpu_gpu(fields_cpu.ᶜout_uₕ, fields.ᶜout_uₕ); @test !is_trivial(fields_cpu.ᶜout_uₕ) - @test compare_cpu_gpu(fields_cpu.ᶠout3_cov, fields.ᶠout3_cov); @test !is_trivial(fields_cpu.ᶠout3_cov) - @test compare_cpu_gpu(fields_cpu.ᶠout4_cov, fields.ᶠout4_cov); @test !is_trivial(fields_cpu.ᶠout4_cov) - @test compare_cpu_gpu(fields_cpu.ᶠout5_cov, fields.ᶠout5_cov); @test !is_trivial(fields_cpu.ᶠout5_cov) -end - -#! format: on -nothing diff --git a/test/Operators/finitedifference/utils_fd_ops_shared_memory.jl b/test/Operators/finitedifference/utils_fd_ops_shared_memory.jl deleted file mode 100644 index e1c7976fe8..0000000000 --- a/test/Operators/finitedifference/utils_fd_ops_shared_memory.jl +++ /dev/null @@ -1,393 +0,0 @@ -ENV["CLIMACOMMS_DEVICE"] = "CUDA"; # requires cuda -using LazyBroadcast: lazy -using ClimaCore.Utilities: half -using Test, ClimaComms -ClimaComms.@import_required_backends; -using ClimaCore: Geometry, Spaces, Fields, Operators, ClimaCore; -using ClimaCore: Utilities, DataLayouts -using ClimaCore.CommonSpaces; -import ClimaCore.Geometry: ⊗ - -get_space_extruded(dev, FT; z_elem = 63, h_elem = 30) = - ExtrudedCubedSphereSpace( - FT; - device = dev, - z_elem, - z_min = 0, - z_max = 1, - radius = 10, - h_elem, - n_quad_points = 4, - staggering = CellCenter(), - ); - -get_space_plane(dev, FT; z_elem = 100) = SliceXZSpace( - FT; - device = dev, - z_elem, - x_min = 0, - x_max = 100000, - z_min = 0, - z_max = 21000, - periodic_x = false, - n_quad_points = 4, - x_elem = 100, - staggering = CellCenter(), -); - -get_space_column(dev, FT; z_elem = 10) = ColumnSpace( - FT; - device = dev, - z_elem = z_elem, - z_min = 0, - z_max = 1, - staggering = CellCenter(), -); - -function test_face_windows(Base.@nospecialize(bc)) - ext = Base.get_extension(ClimaCore, :ClimaCoreCUDAExt) - @test bc isa Operators.StencilBroadcasted - space = axes(bc) - ᶜspace = Spaces.center_space(space) - arg_space = ext.get_arg_space(bc, bc.args) - bc_bds = Operators.window_bounds(space, bc) - for lev in 1:(Spaces.nlevels(ᶜspace) + 1) - idx = (lev - half)::Utilities.PlusHalf - args = (idx, arg_space, bc_bds, bc.op, bc.args...) - B = ( - ext.in_left_boundary_window(args...), - ext.in_interior(args...), - ext.in_right_boundary_window(args...), - ) - count(B) == 1 || @show idx, B - @test count(B) == 1 - end -end - -@inline function test_center_windows(Base.@nospecialize(bc)) - ext = Base.get_extension(ClimaCore, :ClimaCoreCUDAExt) - @test bc isa Operators.StencilBroadcasted - space = axes(bc) - ᶜspace = Spaces.center_space(space) - arg_space = ext.get_arg_space(bc, bc.args) - bc_bds = Operators.window_bounds(space, bc) - for idx in 1:Spaces.nlevels(ᶜspace) - args = (idx, arg_space, bc_bds, bc.op, bc.args...) - B = ( - ext.in_left_boundary_window(args...), - ext.in_interior(args...), - ext.in_right_boundary_window(args...), - idx == Spaces.nlevels(ᶜspace) + 1, - ) - count(B) == 1 || @show idx, B - @test count(B) == 1 - end -end - -function kernels!(fields) - (; f, ρ, ϕ) = fields - (; ᶜout1, ᶜout2, ᶜout3, ᶜout4, ᶜout5, ᶜout6, ᶜout7, ᶜout8, ᶜout9) = fields - (; ᶜout10, ᶜout11, ᶜout12, ᶜout13, ᶜout14) = fields - (; ᶠout1, ᶠout2) = fields - (; ᶠout1_contra, ᶠout2_contra) = fields - (; ᶠout3_cov, ᶠout4_cov, ᶠout5_cov) = fields - (; w_cov) = fields - (; ᶜout_uₕ, ᶜuₕ) = fields - FT = Spaces.undertype(axes(ϕ)) - div_bcs = Operators.DivergenceF2C(; - bottom = Operators.SetValue(Geometry.Covariant3Vector(FT(10))), - top = Operators.SetValue(Geometry.Covariant3Vector(FT(10))), - ) - div = Operators.DivergenceF2C() - ᶠwinterp = Operators.WeightedInterpolateC2F( - bottom = Operators.Extrapolate(), - top = Operators.Extrapolate(), - ) - @. ᶜout1 = div(Geometry.WVector(f)) - @. ᶜout2 = 0 - @. ᶜout2 += div(Geometry.WVector(f) * 2) - @. ᶜout3 = div(Geometry.WVector(ᶠwinterp(ϕ, ρ))) - - @. ᶜout4 = div_bcs(Geometry.WVector(f)) - @. ᶜout5 = 0 - @. ᶜout5 += div_bcs(Geometry.WVector(f) * 2) - @. ᶜout6 = div_bcs(Geometry.WVector(ᶠwinterp(ϕ, ρ))) - - # from the wild - Ic2f = Operators.InterpolateC2F(; top = Operators.Extrapolate()) - divf2c = Operators.DivergenceF2C(; - bottom = Operators.SetValue(Geometry.Covariant3Vector(FT(10))), - ) - # only upward component of divergence - @. ᶜout7 = divf2c(Geometry.WVector(Ic2f(ϕ))) - @. ᶜout8 = divf2c(Ic2f(Geometry.WVector(ϕ))) - - upwind = Operators.UpwindBiasedProductC2F(; - bottom = Operators.SetValue(FT(0)), - top = Operators.SetValue(FT(0)), - ) - @. ᶠout1_contra = upwind(w_cov, ϕ) - - upwind = Operators.UpwindBiasedProductC2F(; - bottom = Operators.Extrapolate(), - top = Operators.Extrapolate(), - ) - @. ᶠout2_contra = upwind(w_cov, ϕ) - - upwind = Operators.Upwind3rdOrderBiasedProductC2F(; - # bottom = Operators.ThirdOrderOneSided(), - # top = Operators.ThirdOrderOneSided() - bottom = Operators.FirstOrderOneSided(), - top = Operators.FirstOrderOneSided(), - ) - outer = (; - bottom = Operators.SetValue(Geometry.Contravariant3Vector(FT(0.0))), - top = Operators.SetValue(Geometry.Contravariant3Vector(FT(0.0))), - ) - divf2c = Operators.DivergenceF2C(outer) - @. ᶜout9 = divf2c(upwind(w_cov, ϕ)) - - divf2c_vl = Operators.DivergenceF2C( - bottom = Operators.SetValue(Geometry.WVector(FT(10))), - top = Operators.SetValue(Geometry.WVector(FT(10))), - ) - limiter_method = Operators.AlgebraicMean() - VanLeerMethod = Operators.LinVanLeerC2F( - bottom = Operators.FirstOrderOneSided(), - top = Operators.FirstOrderOneSided(), - constraint = limiter_method, - ) - Δt = FT(1) - @. ᶜout10 = -divf2c_vl(VanLeerMethod(w_cov, ϕ, Δt)) - - inner = (;) - outer = set_value_divgrad_uₕ_maybe_field_bcs(axes(ϕ)) - - grad = Operators.GradientC2F(inner) - div_uh = Operators.DivergenceF2C(outer) - @. ᶜout_uₕ = div_uh(f * grad(ᶜuₕ)) - - ᶠgrad = Operators.GradientC2F(; - bottom = Operators.SetValue(FT(10)), - top = Operators.SetValue(FT(10)), - ) - @. ᶠout3_cov = ᶠgrad(ϕ) - - ᶠgrad = Operators.GradientC2F(; - bottom = Operators.SetValue(FT(10)), - top = Operators.SetValue(FT(10)), - ) - ᶜinterp = Operators.InterpolateF2C() - ᶠinterp = Operators.InterpolateC2F( - bottom = Operators.Extrapolate(), - top = Operators.Extrapolate(), - ) - @. ᶠout4_cov = ᶠgrad(ᶜinterp(f)) - @. ᶠout2 = ᶠinterp(ᶜinterp(f)) # exercises very nested operation - @. ᶠout5_cov = ᶠgrad(ᶜinterp(ᶠinterp(ᶜinterp(f)))) # exercises very nested operation - @. ᶜout14 = ᶜinterp(ᶠinterp(ᶜinterp(f))) # exercises very nested operation - - @. ᶠout4_cov = ᶠgrad(ᶜinterp(f)) - ᶜdiv = Operators.DivergenceF2C( - bottom = Operators.SetValue(Geometry.Covariant3Vector(FT(10))), - top = Operators.SetValue(Geometry.Covariant3Vector(FT(10))), - ) - @. ᶜout13 = ᶜdiv(Geometry.WVector(ᶠinterp(ᶜinterp(f)))) # exercises very nested operation - - ᶠgrad_top_bcs = Operators.GradientC2F(; top = Operators.SetValue(FT(10))) - divf2c = Operators.DivergenceF2C( - bottom = Operators.SetValue(Geometry.Covariant3Vector(FT(10))), - ) - @. ᶜout11 = 0 - @. ᶜout11 += divf2c(ᶠgrad_top_bcs(ϕ)) - - ᶠgrad_no_bc = Operators.GradientC2F() - div_bcs = Operators.DivergenceF2C(; - bottom = Operators.SetValue(Geometry.Covariant3Vector(FT(10))), - top = Operators.SetValue(Geometry.Covariant3Vector(FT(10))), - ) - @. ᶜout12 = 0 - @. ᶜout12 += div_bcs(ᶠgrad_no_bc(ϕ)) - - ᶠinterp = Operators.InterpolateC2F( - bottom = Operators.Extrapolate(), - top = Operators.Extrapolate(), - ) - @. ᶠout1 = ᶠinterp(ϕ) - - return nothing -end; - -function get_fields(space::Operators.AllFaceFiniteDifferenceSpace) - FT = Spaces.undertype(space) - (; z) = Fields.coordinate_field(space) - K = (:f,) - V = ntuple(i -> Fields.zeros(space), length(K)) - K_contra = (ntuple(i -> Symbol("ᶠout$(i)_contra"), 8)...,) - V_contra = ntuple( - i -> Fields.Field(Geometry.Contravariant3Vector{FT}, space), - length(K_contra), - ) - K_scalar = (ntuple(i -> Symbol("ᶠout$(i)"), 3)...,) - V_scalar = ntuple(i -> Fields.Field(FT, space), length(K_scalar)) - K_cov_out = (ntuple(i -> Symbol("ᶠout$(i)_cov"), 8)...,) - V_cov_out = ntuple( - i -> Fields.zeros(Geometry.Covariant3Vector{FT}, space), - length(K_cov_out), - ) - K_cov = (:w_cov,) - V_cov = ntuple( - i -> Fields.Field(Geometry.Covariant3Vector{FT}, space), - length(K_cov), - ) - nt = (; - zip(K, V)..., - zip(K_scalar, V_scalar)..., - zip(K_contra, V_contra)..., - zip(K_cov, V_cov)..., - zip(K_cov_out, V_cov_out)..., - ) - @. nt.f = sin(z) - @. nt.w_cov.components.data.:1 = sin(z) - return nt -end - -function get_fields(space::Operators.AllCenterFiniteDifferenceSpace) - FT = Spaces.undertype(space) - K = (ntuple(i -> Symbol("ᶜout$i"), 14)..., :ρ, :ϕ) - V = ntuple(i -> Fields.zeros(space), length(K)) - nt = (; - zip(K, V)..., - ᶜout_uₕ = Fields.Field(Geometry.Covariant12Vector{FT}, space), - ᶜuₕ = Fields.Field(Geometry.Covariant12Vector{FT}, space), - ) - (; z) = Fields.coordinate_field(space) - @. nt.ρ = sin(z) - @. nt.ϕ = sin(z) - @. nt.ᶜout_uₕ.components.data.:1 = 0 - @. nt.ᶜout_uₕ.components.data.:2 = 0 - @. nt.ᶜuₕ.components.data.:1 = sin(z) - @. nt.ᶜuₕ.components.data.:2 = sin(z) - return nt -end - -function set_value_divgrad_uₕ_bcs(space) # real-world example - FT = Spaces.undertype(space) - top_val = - Geometry.Contravariant3Vector(FT(0)) ⊗ - Geometry.Covariant12Vector(FT(0), FT(0)) - bottom_val = - Geometry.Contravariant3Vector(FT(0)) ⊗ - Geometry.Covariant12Vector(FT(0), FT(0)) - return (; - top = Operators.SetValue(top_val), - bottom = Operators.Extrapolate(), - ) -end - -function set_value_divgrad_uₕ_maybe_field_bcs(space) # real-world example - FT = Spaces.undertype(space) - top_val = - Geometry.Contravariant3Vector(FT(0)) ⊗ - Geometry.Covariant12Vector(FT(0), FT(0)) - if hasproperty(space, :horizontal_space) - z_bottom = Spaces.level(Fields.coordinate_field(space).z, 1) - bottom_val = - Geometry.Contravariant3Vector.(zeros(axes(z_bottom))) .⊗ - Geometry.Covariant12Vector.( - zeros(axes(z_bottom)), - zeros(axes(z_bottom)), - ) - return (; - top = Operators.SetValue(top_val), - bottom = Operators.SetValue(.-bottom_val), - ) - else - return (; - top = Operators.SetValue(top_val), - bottom = Operators.SetValue(top_val), - ) - end -end - - -function compare_cpu_gpu(cpu, gpu; print_diff = true, C_best = 10) - # there are some odd errors that build up when run without debug / bounds checks: - space = axes(cpu) - are_boundschecks_forced = Base.JLOptions().check_bounds == 1 - absΔ = abs.(parent(cpu) .- Array(parent(gpu))) - max_allowed_err = if space isa Spaces.FiniteDifferenceSpace - are_boundschecks_forced ? 1000 * eps() : 10000000 * eps() - else - 1e-9 - end - max_err = maximum(absΔ) - gpu_matches_cpu = max_err <= max_allowed_err - gpu_matches_cpu || @show max_err - z = Fields.field_values(Fields.coordinate_field(space)) - C = count(x -> x <= max_allowed_err, absΔ) - if !gpu_matches_cpu && print_diff - N = 3 - if z isa DataLayouts.VF - @show parent(cpu)[1:N] - @show parent(gpu)[1:N] - @show parent(cpu)[(end - N):end] - @show parent(gpu)[(end - N):end] - elseif z isa DataLayouts.VIJFH - @show parent(cpu)[1:N, 1, 1, 1, end] - @show parent(gpu)[1:N, 1, 1, 1, end] - @show parent(cpu)[(end - N):end, 1, 1, 1, end] - @show parent(gpu)[(end - N):end, 1, 1, 1, end] - elseif z isa DataLayouts.VIFH - @show parent(cpu)[1:N, 1, 1, end] - @show parent(gpu)[1:N, 1, 1, end] - @show parent(cpu)[(end - N):end, 1, 1, end] - @show parent(gpu)[(end - N):end, 1, 1, end] - else - error("Unsupported type: $(typeof(z))") - end - end - return gpu_matches_cpu -end - -# This function is useful for debugging new cases. -function compare_cpu_gpu_incremental(cpu, gpu; print_diff = true, C_best = 10) - # there are some odd errors that build up when run without debug / bounds checks: - space = axes(cpu) - z = Fields.field_values(Fields.coordinate_field(space)) - are_boundschecks_forced = Base.JLOptions().check_bounds == 1 - absΔ = abs.(parent(cpu) .- Array(parent(gpu))) - max_err = are_boundschecks_forced ? 10000 * eps() : 10000000 * eps() - B = maximum(absΔ) <= max_err - C = count(x -> x <= max_err, absΔ) - @test C ≥ C_best - if !(C_best == 10) - C > C_best && @show C_best - @test_broken C > C_best - end - if !B && print_diff - if z isa DataLayouts.VF - @show parent(cpu)[1:3] - @show parent(gpu)[1:3] - @show parent(cpu)[(end - 3):end] - @show parent(gpu)[(end - 3):end] - elseif z isa DataLayouts.VIJFH - @show parent(cpu)[1:3, 1, 1, 1, end] - @show parent(gpu)[1:3, 1, 1, 1, end] - @show parent(cpu)[(end - 3):end, 1, 1, 1, end] - @show parent(gpu)[(end - 3):end, 1, 1, 1, end] - elseif z isa DataLayouts.VIJFH - @show parent(cpu)[1:3, 1, 1, end] - @show parent(gpu)[1:3, 1, 1, end] - @show parent(cpu)[(end - 3):end, 1, 1, end] - @show parent(gpu)[(end - 3):end, 1, 1, end] - else - error("Unsupported type: $(typeof(z))") - end - end - return true -end - -is_trivial(x) = length(parent(x)) == count(iszero, parent(x)) # Make sure we don't have a trivial solution - -nothing