From 3d1beaf16d62d5d58f10391beabc59eb97a40292 Mon Sep 17 00:00:00 2001 From: Oliver Davies Date: Mon, 29 Apr 2019 09:52:29 +0200 Subject: [PATCH] Post: Testing Tailwind CSS plugins (#70) * Add post * Mark as not a draft * Add note about preflight * Update heading --- resources/css/app.css | 2 +- resources/css/components/markup.css | 11 +- ...9-testing-tailwindcss-plugins-with-jest.md | 245 ++++++++++++++++++ .../running-tests.png | Bin 0 -> 36414 bytes 4 files changed, 254 insertions(+), 4 deletions(-) create mode 100644 source/_posts/2019-04-29-testing-tailwindcss-plugins-with-jest.md create mode 100644 source/images/blog/testing-tailwindcss-plugins/running-tests.png diff --git a/resources/css/app.css b/resources/css/app.css index c33ba33f..3d3c9fb5 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -7,7 +7,7 @@ h1, h2, h3 { } h1 { - @apply text-4xl + @apply text-3xl } h2 { diff --git a/resources/css/components/markup.css b/resources/css/components/markup.css index b8ccb3ac..3b3e0ee4 100644 --- a/resources/css/components/markup.css +++ b/resources/css/components/markup.css @@ -2,12 +2,17 @@ @apply leading-normal; h2, - h3 { - @apply text-black mb-3 + h3, + h4 { + @apply text-black font-bold mb-3 } h2 { - @apply mt-6 mb-2 + @apply mt-8 mb-3 + } + + h3 { + @apply text-lg mt-8 } p, diff --git a/source/_posts/2019-04-29-testing-tailwindcss-plugins-with-jest.md b/source/_posts/2019-04-29-testing-tailwindcss-plugins-with-jest.md new file mode 100644 index 00000000..2a2369e8 --- /dev/null +++ b/source/_posts/2019-04-29-testing-tailwindcss-plugins-with-jest.md @@ -0,0 +1,245 @@ +--- +title: Testing Tailwind CSS plugins with Jest +excerpt: How to write tests for Tailwind CSS plugins using Jest. +tags: + - javascript + - jest + - tailwindcss + - testing +promoted: true +--- +
+**Note:** The content of this post is based on tests seen in Adam Wathan’s ["Working on Tailwind 1.0" video][working-on-tailwind-video], the Jest documentation website, and existing tests for other Tailwind plugins that I’ve used such as [Tailwind CSS Interaction Variants][tailwindcss-interaction-variants]. +
+ +## Preface + +In Tailwind 0.x, there was a `list-reset` utility that reset the list style and padding on a HTML list, though it was removed prior to 1.0 and moved into Tailwind’s base styles and applied by default. + +However, on a few projects I use Tailwind in addition to either existing custom styling or another CSS framework, and don’t use `@tailwind base` (formerly `@tailwind preflight`) so don’t get the base styles. + +Whilst I could re-create this by replacing it with two other classes (`list-none` and `p-0`), I decided to write [my own Tailwind CSS plugin][repo] to re-add the `list-reset` class. This way I could keep backwards compatibility in my projects and only need to add one class in other future instances. + +In this post, I’ll use this as an example to show how to write tests for Tailwind CSS plugins with a JavaScript testing framework called [Jest][jest]. + +More information about plugins for Tailwind CSS themselves can be found on the [Tailwind website][tailwind-docs-plugins]. + +## Add dependencies + +To start, we need to include `jest` as a dependency of the plugin, as well as `jest-matcher-css` to perform assertions against the CSS that the plugin generates. + +We also need to add `tailwindcss` and `postcss` so that we can use them within the tests. + +```plain +yarn add -D jest jest-matcher-css postcss tailwindcss@next +``` + +This could be done with `yarn add` or `npm install`. + +## Writing the first test + +In this plugin, the tests are going to be added into a new file called `test.js`. This file is automatically loaded by Jest based on it’s [testRegex setting][jest-testregex-setting]. + +This is the format for writing test methods: + +```js +test('a description of the test', () => { + // Perform tasks and write assertions +}) +``` + +The first test is to ensure that the correct CSS is generated from the plugin using no options. + +We do this by generating the plugin’s CSS, and asserting that it matches the expected CSS within the test. + +```js +test('it generates the list reset class', () => { + return generatePluginCss().then(css => { + expect(css).toMatchCss(` + .list-reset { + list-style: none; + padding: 0 + } + `) + }) +}) +``` + +However, there are some additonal steps needed to get this working. + +### Generating the plugin’s CSS + +Firstly, we need to import the plugin’s main `index.js` file, as well as PostCSS and Tailwind. This is done at the beginning of the `test.js` file. + +```js +const plugin = require('./index.js') +const postcss = require('postcss') +const tailwindcss = require('tailwindcss') +``` + +Now we need a way to generate the CSS so assertions can be written against it. + +In this case, I’ve created a function called `generatePluginCss` that accepts some optional options, processes PostCSS and Tailwind, and returns the CSS. + +```js +const generatePluginCss = (options = {}) => { + return postcss( + tailwindcss() + ) + .process('@tailwind utilities;', { + from: undefined + }) + .then(result => { + return result.css + }) +} +``` + +Alternatively, to test the output of a component, `@tailwind utilities;` would be replaced with `@tailwind components`. + +```js +.process('@tailwind components;', { + from: undefined +}) +``` + +Whilst `from: undefined` isn’t required, if it’s not included you will get this message: + +> Without `from` option PostCSS could generate wrong source map and will not find Browserslist config. Set it to CSS file path or to `undefined` to prevent this warning. + +### Configuring Tailwind + +In order for the plugin to generate CSS, it needs to be enabled within the test, and Tailwind’s core plugins need to be disabled so that we can assert against just the output from the plugin. + +As of Tailwind 1.0.0-beta5, this can be done as follows: + +``` +tailwindcss({ + corePlugins: false, + plugins: [plugin(options)] +}) +``` + +In prior versions, each plugin in `corePlugins` needed to be set to `false` separately. + +I did that using a `disableCorePlugins()` function and [lodash][lodash], using the keys from `variants`: + +``` +const _ = require('lodash') + +// ... + +const disableCorePlugins = () => { + return _.mapValues(defaultConfig.variants, () => false) +} +``` + +### Enabling CSS matching + +In order to compare the generated and expected CSS, [the CSS matcher for Jest][jest-css-matcher] needs to be required and added using [expect.extend][jest-expect-extend]. + +```js +const cssMatcher = require('jest-matcher-css') + +... + +expect.extend({ + toMatchCss: cssMatcher +}) +``` + +Without it, you’ll get an error message like _"TypeError: expect(...).toMatchCss is not a function"_ when running the tests. + +## The next test: testing variants + +To test variants we can specify the required variant names within as options to `generatePluginCss`. + +For example, this is how to enable `hover` and `focus` variants. + +```js +generatePluginCss({ variants: ['hover', 'focus'] }) +``` + +Now we can add another test that generates the variant classes too, to ensure that also works as expected. + +```js +test('it generates the list reset class with variants', () => { + return generatePluginCss({ variants: ['hover', 'focus'] }).then(css => { + expect(css).toMatchCss(` + .list-reset { + list-style: none; + padding: 0 + } + + .hover\\:list-reset:hover { + list-style: none; + padding: 0 + } + + .focus\\:list-reset:focus { + list-style: none; + padding: 0 + } + `) + }) +}) +``` + +## Running tests locally + +Now that we have tests, we need to be able to run them. + +With Jest included as a dependency, we can update the `test` script within `package.json` to execute it rather than returning a stub message. + +```diff +- "test": "echo \"Error: no test specified\" && exit 1" ++ "test": "jest" +``` + +This means that as well as running the `jest` command directly to run the tests, we can also run `npm test` or `yarn test`. + +After running the tests, Jest will display a summary of the results: + +![A screenshot of the Jest output after running the tests, showing 1 passed test suite and 2 passed tests, as well as the test run time.](/images/blog/testing-tailwindcss-plugins/running-tests.png) + +## Running tests automatically with Travis CI + +As well as running the tests locally, they can also be run automatically via services like [Travis CI][travis] when a new pull request is submitted or each time new commits are pushed. + +This is done by adding a `.travis-ci.yml` file to the repository, like this one which is based on the [JavaScript and Node.js example][travis-nodejs-example]: + +```yml +language: node_js + +node_js: + - '8' + +cache: + directories: + - node_modules + +before_install: + - npm update + +install: + - npm install + +script: + - npm test +``` + +With this in place, the project can now be enabled on the Travis website, and the tests will be run automatically. + +For this plugin, you can see the results at . + +[jest-css-matcher]: https://www.npmjs.com/package/jest-matcher-css +[jest-expect-extend]: https://jestjs.io/docs/en/expect#expectextendmatchers +[jest-testregex-setting]: https://jestjs.io/docs/en/configuration#testregex-string-array-string +[jest]: https://jestjs.io +[lodash]: https://lodash.com +[repo]: https://github.com/opdavies/tailwindcss-list-reset +[tailwind-docs-plugins]: https://tailwindcss.com/docs/plugins +[tailwindcss-interaction-variants]: https://www.npmjs.com/package/tailwindcss-interaction-variants +[travis-nodejs-example]: https://docs.travis-ci.com/user/languages/javascript-with-nodejs +[travis]: https://travis-ci.org +[working-on-tailwind-video]: https://www.youtube.com/watch?v=SkTKN38wSEM diff --git a/source/images/blog/testing-tailwindcss-plugins/running-tests.png b/source/images/blog/testing-tailwindcss-plugins/running-tests.png new file mode 100644 index 0000000000000000000000000000000000000000..0b0b6150f2914acc0193a477cd3fc3d8bfd2686d GIT binary patch literal 36414 zcmaI81ymhDvn@=3U?E5#xVu|$4esvl?(P=c2_D?tgS%^RcXxM(cL?Nu_rCl7|E$GY zoSEsa?&_IcyLQ){ASnsK&roPkKtMpBg@yQJfPg-%0se9!zyL=?k=f?~U%ZTYd8LGT zd2ys{EDem!^nrj#e(Gvz6$(+1^l58rY4r_}lS0`z$^-_6%4oHAwhgs);&f?shpgTqFc z!_0!*2evmRN<~8Up>hXku3?MtBhED{j%qfLS)-PmP69dHH;x)2IggwZ)f4E zO|K%T77}d#My)I<*xuJR3X~0lXbHE$1@3LGg~%2GH<{=Ka+LQSC z<;8XE<;4>jNppWNv0*%j(2|_xB1`!2hp@sqt|BUSem;fu|%cg~MxUqmRQtMNdV8 z#|edlgTrp4XTU1MC-B}J@Qnk{$j;7+m73bo(UHpW8wu#Y-ML`X@T?FueOe*y&VT0-m9Vi`n-)(-^uttmMm=F zrv;cG_3IgGS}Gdq|5r0RV}t*XX0K=7n*E*En>qH^&RC_4o%GF=`Hao=Eo=cp<7A?v zVgGC9f1UZyK>u4yrT?^~rDOgdP5;}e|JL+%D6En;#`*v+z50TamYw>49ecl?o%+>L z|IKl4tMd0KU|Be!*s1?(i8-N4Gtzf~fW89>^Kr{LeK<@3cf;tuyYXzuU2ZfRtf5e~ ziPj%%MyDZ!V4vNTwO7sjd1hD5DH}ZqMK4S z;S+Y-En?y^@EZ#6)eN2|x&1z+&kukh}Nl zc%Sru#k?SCJ^+prd|>QghkHBg1$i3?gszS4ZCLT|^en^$3ZUKJi&yc1&3xTKQ@iP2 z8@@Kd|D*ffO@dbhL^=F5yc5#kyD6_Qnuveb0dwND3Cs$vDpR};;mP%p z**@oQ@b>e-z7k2$FS{i4m?O1Y^|q_U?vC^6mC~OKa7pYb5^X;%mdq1xRiB?JygXzh z@TQNo1%h@Nrub}EvfEXqp|vjWt9*CDp!2+wtddLp-Wg z6FG_RWK2p42oQN(9k9WzVviCp?H^n}@a=t=HCkE3L}NpvaX`eA&;)Y-eiCM-D?t^k z>G5fMppZ%?M8g#v+|z?eC4AF?<>VOF@ThTN_&a%7Yy|PsP0!U8VeRv1Ys)U2&GUs} z)s+18u8Gv4QP&VNxJNU6M^Bqn*9a$e&H^WotEz0o^}{`1Vk=}kXaJ7T3{%9ffu{rQ z(z1>~ey)9a#YaBMEN@Q!Y%;ZoZd+h2Iu*~sXrD)2GZCm^_5%vgz=uhwYCEhz zbF?awuP$qRc5;jv*6yis>xKF}d18DWQ}G=rx+zZ)uB%MzxY`02?f4{aTPu|w>k-s& zsb)yfWAH|0mV6WK7|Bjotu!;!{cbM_Mg%J!KH>^XHB066#;&8Go|mxsYELYMj26GA z@_c+nM|k_HgqhC+1k)Zs5|g})S#Y%y>!DIwhE&qCY)?+1W0Ugre7nrzyy^*CcpQ$}a zA!~_#?#t!}bpQE{#!(B4xYo{IG5&%2R$p3rmFHBKjTNAfkJY`7>$7-Lz4|UE zMAdot(h1$tx}GDRrGUc1^4tvW8t%0Rld;;}Q2li#RLPs?vf`6xe6S2$RyBK9!sTaG z`gL7sB`0T6vch@&hha`6Dz#ATr&}oYr^#q$o6T~HxHv}m*1D^Br;D(e3g-)f;<|kk z3Y8`lT3XtC^2m}E}w>1hmw{xzlndwe7 zbyL%RL}Z`Du!XTiO@hzLi(5O~$cVlhurKOy6_ZTqGLxTDqx}1}Legz@YYc-U1a^y! zIYO;&JLZhIoPCO_u@hL)Jl5OgpIXC=7CljDk<&m#_r z=UItibcU4zvy)1BL^a?CmhYtue!3A7YS^N7Y>U;p+{rUQ{7R%^$IFWPTY(Cb*VYS&n;BRX(lZL{ zMnR;utup8Nbd#5nw%&$8Nmw8C=wIWKc;qu!*r+I+^3s4e8EuN5eUAarroEBfUrX*o!iuD(k9-a z)j|P%2+<5*#x$8BEC%L5hIQ$Qh%j;xB5Kwk!FaE0?1gow6Ll)!-V9;-09iIq#!JeF zkj(s|16Jn^;`odfI%7#dT2a-0gKQ&$7`u)&&I#9ELC=d}&1cy{R0HXB*_D-}UtgpYH}l=~ku$wYfhm-`^xD)fvIZ zQK$z`owPOT7=E1f9llwnp!(3D3~qS&Iwc5nWgQMpkvN~o?skJ}kDDsM3XM^p7w7CA9(J8^al%{(cWPemy~LOq zTd{R__Tv!|i{oW$Tr5ebVqr#dJH%l#+Goy2G8TwBZwWpv^X4y7zXeGZhnVG?S z3LG12e8%etS2zi{hi4@fm-s_5WnUgx!B=p^R}hFM=G&^|lWpWn{`7-5P`w(DXRWYh z{x*gu#ck9ee>Gcf)8n2ZnDGgjRoiSkn|fEKVQJjI@Nj4pQa8{~y>fI~E~F5DVHG{wim{+-C+Uf3KfdOP@tQLg6hs%~ znl}eEa}<0yQYv*$DPjK1_VV(NEHUxjrXVctXFVk#2-*!Px z23Cg4n5HnCZ({GYz(4N}8W{T)EHyr>gq%3kvVIxcP;+)hWi*@h$`OrU+ltqSxeGz2 zhQ~T&l?xVz%<08;2MrR&kL0w*OYF+_e!E%pY|doLW>@}vl?M@)=V^hq40wwr{_4srTJ}zSsr^sW6VLtQOH|WLk2gQ#BnGHr)iSeaXB9md@JBI%5}VA zF9savJUPEa#|VWsbfVciDcJ4XR3dY!^(&eV zV?HIqY}(PbP1cYOqve_-e{-U1ilMOooR2IDjF_0aDZ)j0rH|kI2!Z;G%9Jq{BYFjq z(Y!<&7QcbKwDc5bcSJc8bIgwVS66P?v4&ld)2-}jjl5fpUEmoxG$o%w9}qR|=_8WyFiJK&xD9t%v(jwc!cfF2JQ zY{_hR*0j!Bnt!gZBj|mjT(76sy@z&IBgR8kWwPYfinM>a4V%$KUOQx7bU$gP<9Zmy zWxwm%=o=Zi@P}IT$NUf=P`C9Rbyrf@+VGQQRVM0`ry98JPkV8N{)=7JKiQ;vUB!c( zevs7R&@_I=qR$T%rv%Umw*$KCdpNl(7P&AL3OTS`_P?d=yPb$MUUcaVvA=4V0)Oeg zHxGbtWx!%7RsV4cjFGdQb$3pW>LlW_#*N~;W;9|N)wQr@*OdUrQ%)eiW%^ev2ggUQNfN#OG!)g!9lo3aGt5DEJgx( zNve8h4M+NCgYYQwr>e<#bJnqypX?8|pZ%sI^`v;93M1U9IkaB_`4Z5V8XYBqkq;X3 z*ri-qaL?91ds%<$(g<{kIabk4BaBEADT(%KOMvGHEti>f0ViuMUb*0d_yv7Bp(Ac1 zZ_g0gK~jcI83!gYr&WLLYAp@F-reO?uk^c>m=0=&4?snTZ}_A{MHW6F^3>SsiAuV( zYKB<982L>h92B+}Xl@Y?rm{|4k&swG&#NZ!lgxAAyG_Jq)U6idxYZVY#oxH9TML$I zdX&HyAwNVsA}bs$0|CF@m>tut+l&&`=Of=a)rQZlkqD&o)5ZsRoG&U1EN5^oC`NTx`|7&F2g)pV= z31eFF4dK^Jb2+zGMcqnweHd_l!+~Rs>iwIQ^xt!#*8*3{7B>y09!y)C1BbWRDG`ZR zs@%=hx|3zQH)Y#gfE{9aoNRu^GlWut>%?>eSrB$DtU@2 z)1XEe4i_Wp($u_eLx$nCcX;T7KeG?%h$nV5foUh3GMe#zKZigaw^+0ty)LbozW(Zd z*xIkk5U+@Lzc{fg@#O?O!aJ?y05sEJ3F*#cDq&^WcfX7&Butr-jy~-so1uwey-;+F zjHh^rXD6I7#H^*0iXbn}vMi!VSJ2JKCrRa{y3f(UU41W$u>d~-A@WxURf4U@@@p-3w>#HAVtKCVJ;28y+TeZ4dq^g2*kp@ z`W%kDp@^aiRhF1^uvPCLt#RB($i>~A`VtiQ{d3|G`~D~`D$0eA>Zpu;M+ST;H8Tz) zdkv1sI?v>G>Up8w1{EiighhBF#WX>DpZ$`SZ%|H>3H-dmIHu0ib=|3pZP$I7veQ&d zSEWgOl_UkKbOXN`@Pm?Xk!UwTJo^@hPH`GsFLF@I#OBs9LX!U%U*dXt8i?9h6Q*3& zX2_oi$mv9eA(7+abuovxx*~~?j!PK++%IGFprvpVA0ph;GF-f$qTq(m}PHALL&!_Q2A-LL#`t$(YO z;zfjSR$wG&S%6H4W*eTdoiqfImgX0jb1{1Q#EId$i%OqH0^b-vgL8gJ2=O&3y6<+J zH=f5-L= zLdnL$1(AVlcni3lnCxkfyo3zLc~t)M%-=8vGpZ18!pR^LYgBBc-Zuig|ILL||bV0>E<$a~@ zz&+tYoiiMbp1KL!2>W~XQ66tz1kV0bHxbQ6zrDUoOic>Ciou%2r-5o?`ekTxfh$O}a#ZMyWGqc$H=ev;E9TviaNG9LNy`dv(|4iNzmNI<_+`Iv_KC z9SLQo#yun5MA<~Nw9V2e3jy6eFEj9Y%Ms5SzNtqDdqNGYq7}07{WnDgmdDwnS}CU* z-V4~p-0HgEFq>8VnB&J)-1Jw9VSZr8SUGR$b0n(Dl?$hz`JMMqoj>Bsl8|4uM6e>i4qdcHTUskB=yexmZb z4Iul_x_O3BEr~0ibYbzKdA3PA5Q0AmVo61@ylKHhvsR$ds-M>s0Rh4|8xta1imkbD z3KzOsxp;7v*vHA~XRSqPK2llPWhhVn)cD&CRT&ua)tiaSbpi;*q5BMVuqSSCnI*B;Ado@Zq0)vmakB@^=R zyI7R$lR9gVEa&jN-Pz0{oAFS(JY@`5M1CP*TJY;-GAJovOr2%Fm|96Pfj%-{PJ>v4 zz#x>B$4v)Vdiwh91lO*McAZzu z(rWZEqc)oNKfQ9T?6~$jGZWe(aio%dV?M7{tjp)n(+7KgCBKPoz3T!(5Yv1#RerLD zrz}zDsC|wUrZdX3%{zT$3WU3yr=BkVa7=y5D+lA+!F$EYX4PUz1s!6!cMgsb&9Fqv{-0VfT|ntCucMKuO6JxriI@o;8dBcB#uVbnq@40^)Wm_aJz+|7A$T7tGm>2;CJnY^~J? z2QaBeMd%2~N?%1~Fm%9}e2#)ETHa0Sy_%$pk7Db1lb?OU0Ap%*=vLBvH~GKa&_*+h zh!uK&-wvCy-nvXAcoimqVCUhXo@i!jYAY&XCr6*Dt0OHh9~2yXPGx=u`_|E}D`033 zf!0D+5W{RQz-l)AIS??AJ@zwdKI>5ki8%#Ro*q*nLSiC^L`T(WF4l#e31FyPkvDCTDyFHG2jmN{!Hj z1eD2{DczNpW~aSwWGPu$bJ>%ZV^6p({VfQ{&)f#vc1rV}{siLR55_L;@Sh~#BY1topCpARaG#&pCItOmZ-=%0UhyMr!K0c@R_?Ey|k zM#ie$4|)Bp7wc!oNb4$aC?*?H06$iauP>-uqeaSTPdL6Z%Gg)(QXVTQn&Z|N&R>$) z8#1!AuEQ8Hi1Djg5uCoQtz3_O$O3;gk-Mbw?Te8L!x4+e+hB4jW#u5xmh-4TGv{lC zPeBO8nK)c4(_%K~MsvhlzQpGd*lc9?j4*>E?4Mpv(x?ZCf~Eqcvm(>dh&?^)9m4Pm z6<1XDsa2YU#C(y~0QB{CJE`n!j~F|vpkU10*?4d7bmDGpG{eVY1|Sdq-D(+i1%?T; z`o9w65^9YmKBw{nDN@EWDVN7F!LGzji0n_gGn119FFjD5OB~Y7*NU}E!3_=b$I2aA zTc0c+Ae}vilj{>0%~c}kOo-L0%M@yB&oB69Z>$^`hglEI)|y*`1N(&Z^oP23(%k*G zw}}`kH2O6guRkFoA$1th>&#V7WY==Y__i*6CMND8UO#sAh)CQ=Yr5Wlxd^sce1DXU z@K;A6WT#*iT8Wz}&aX+v61TyN6bE&Emc4pYon$NyajBW8nUFnn@=Duhf7ds=-mucQ zO^&v3xazxJa+^kPx;G}NRa>qg?agpFtoU(xTRH zOkH$c?G1HKi9X~BB=|Nx9DANEu${!5E0nk_6V=wu-WQ6S>^uEQzF;_y$~~W0 zD!p>5W|JPNh=@qJ^;4~pxoPZ<(GsiawpcyVa!%##TA{~yAbj2C_~7Z%bV&!uOpw(j z9q31J?IUDOJL4YZhp{nQr^7R1cr>Kom!^yGg!Jse*0^nh3g|QQc*a}s_lFYmL%e{K z4-Lv2?Ga@&isfVbvA5>F4C@(q_i5WFl=|q$^j@Qj4$|+BNFn?M(_2ZyNtAi)vcKy~ z22ZH`QXZ|Qo&my-m-U9s>A`|!d}FP!psVw8q~w|*T}O6rt&VPt`#>VgC#Ge)=%dNt zqSB~dSBDdxgMLqxPKteLliI35%LiD+D{&&viUSvT3AQIY)!4Gud#Iw+mw+QCOlDIq zc6J^#Ei&7=t@w#}u`1f|uyP)s*1uuMU9yeZ`H?U0B?jR?yy9yacFBH5SSt-!6=^|n z)ntihL4hEzyWNkD(X%tibVVChRt{MAo1clzCevCp12c_Ax(fRIA5~OTU8Z0Zb>4PE zSKzI7ArI_b7M*7}bb2l0F3&l?CPiWpLKVfuxlnf<2>BE5?4||V?KJC3>RmaihXmq{ zZvH@c50)ALM4&k$I7Up}0E7Rb@z9NyOhSd$#GyCz7CpTnp{0PSI>$id3>8A&?)_KV zF=|gd6}kJx@yEYIt2lrtY^6p#9rbp^ALljjpJv*`zXyJ+*C@WMgSbO zi5uGauN5%@1~Z)h2nMRNp52cUn+%;I5iq9PvpU)iLP9}drO>^0w_ix+c6Mi2uJi}y zf`bJW1(D=xzCt&Nc*siqZE9M;oVcs;>;UM*@BeKu#I2=;bAE2Kc7p8{6{Umn8B9(= zo|SBQBl%LsFy&mP^?4<}yh_zSL|1CHavbhvWAVZFr>rLBUXudNo8mhc3Pwt zfLKh<%;+9$iyIl4eRpyKH5mEzDY~D)zPO|$);_okbPWKQjHqt^N(!`a5Ulngqt{F= zEd1+-C_+=X_V-RgaE0OF;jOUkg{k_rz}Lr$5KSc6 zKAgg)SAThFM?gfV9c`3VUHuiX5x2|EqHY8S_G>;|QmCuykC?MqEJd8GKuZYCbNhRB zffmpgs|F%BDc{t7h~ZyMu)^zXtYq_)SN#WsWwFrCH;9Oc6bq%r`CiNE@yisLvV99$ zG!CQ^=nX2WDpFFB5k0wJzh;)ls1_`YD{91TcFS_Ab41nu)BWE`DayrcL`QJ)C7uci zhGO`A3_;2&PX}7@Y+c%T2L1T4pOGXP10CJal$wiL(!a_0=~hSr=7$e&`DN9FFZg0m z)1unpLZhI|Pz}_7yak6~W#U^PxoNGSDBo#TlU`5&Z@WEw5sYibvWJ<*EbY6vxB+v< z@QK=SFiw2*;4&~mvhA?mcB{b(upd~$?w9w(myq;)fcRqljvYia2@uSm1r7D|M5w2X z=mxCL0^#wy8>~`j`chA9EX>UK0Q)vFJvjq3OsHdUYgf6Un1;IXG4wL2SwTSNP5ZmM zk&RX6AG^5i?PKXXs(g|dZGN_Izduc4TIFzn)vXP*pEdq90Z+y#`Lk9yWA~)S>^itt zSmQupY`R$acg5l5Hv)1f7Ua#HjoGuTb4NEf_U)lGYThwDFVWx->q{XC#_q+Buy>)I$#H1uyLj-Y1@!uj;6QSg_(0DNV)@OJ?G?uj79(2# ztk>%V+d?|X-Y0naIzcBj!{dJ_`~7u-tNhxr?-O)_+iiwFJ_MvWS0jXE(lD1hBtaLL z{GW|R%0MVEIYjffZi>h93?El#@{Vr!H(sd`v7(0GYI2b{Sqv|3AI_(Rf=~Z z3^d4)8>CU3v%X%%e4we(P@P>ys#oEaL@`UJ6@Mb`WPK11t3iM$$Se?! z<_8e99e*-05`HvHwMPO525C&bnTEBj^0a#KV86JW$S*Fwj8j>JdAo<4g1(n=Xh)TO zV&vhXlY71k8nv6+NE%C({kU{UP@r+KjR!i6P6};DsltfVmJo|GQX2wSRbLK+8!z$0 zLoR{cFwwMxmuvD|-_PSQf!X@Yz~F!{Zc(I6KX3E1KRP@*I=Sb|)mZQ7^t?ZyO5$%p zgYExS&;ZwCHFfdwUDz1l@vtxi?e(t-jFbr4+S(*kR7gGNq??<1A*}mHg92)9fOy!! zFjHC;JKJ)^M$e?01!FfJ>!wP``GyDHoP?`C;cJYE;@lRlV}h)H!`xTEpW6xQe^ZH& z!@V81L(%aWJDr2~g@Q%)@EA8j7xd3~PHP<1kOH50gr^A&sbUcHUy^Sr(c;30L}n*r zL0xfsiWOJ+e{WnT)f&^FoaF^z3ApLtajHFWs;H<~jqxLIOfOh;Hs34~F4RB!CzWfp z1G5wJ%*l6%4*f}{>R6f{%$RNwhermlukXzX|7M`KmTc>ZLkxV~t=?Zt-P`;2@QgZw zveR{xG>VLRjLeiHPG>duheq1=@*<-XRGTkJ0i{U8MxS~tZ1{{l4|6JA$8^$AN^A>0 zd%&Z;G-H2G+f3hB0)Y^U;O-mPqY*1d)2)7N;T^Bm-}@LJpOu-p7$+^S9u$T?gD>FJ zq36qFIUksqXrlVu6@)5AEsdKylHl!o%eVJANld`b&Q55<{nm<+(Q?_S zsB9V_*oJ_d&kGAix3x(^;=`m>**ZHt~H)( zsE2EiLP%U0{JHaZ$yx=`iD5Giaq#5_{QbdP2OHR*mH71IoD?G`dnUZ+Cb>98z!SFL z=~F&Rv-h#=VcWDeyQ^EZ^O$mID1p}9zgSgKHl!q}7Kf& z0%CBSIWgS$FG8Mi2l+1AlCR)cSU&eJhtXvmb0?X(l~fl;i8eP@U4cIX!^63Cb@9Wo zswI#P7liVvwblT>jh{<9wmzh85`U0W)>da*uGIge;bI-@9(R;5?O|DeCqU}Cmf2l* zmYZaCMi{?dK#W}*D-F|7TbA6qPE1Z?JWe2|sJIc-i!CoIye3@}~3D3?2ZVZl}-?rwfG??BsI5Ic+){jerq+I76c^8}Y-% zS-P;cK0}F5B;y(S3fP5P|5*0okTPKaYlt1?tXNtHrRjMUyI9Ac zYIdFBql2%=5=YI2U~g~V$Ks~sUurm#>cjQ2=b>!4Wj~WuUJh5^8_{XTIB1LXJ12y~ z@QB=xQ7HkWd^;wtCgCZAcvJ&FcxafJKa6&kcTLTZaYs-+ATdE*eZDMR8&iz9weIAV<;G1 z)m`TF=|&a}dTLHuIuFWP4ah~ohvyZceo3MoIfype6!zBk>+M^IOBnq;DaT8Dj}>L` zr=nO~6#*Ybl-%oQKuu*kUW%*}JQ$VO(4D@SdMXlT6}q z=WTwporHV(q~Ly5rnL8HcYAbl%)`e=kgG4znY!faf}%B^SGLKvPoAdx_FSfdx|#U8 z7Jj1{j#QjiOf~krF3-sLP}cNFH|;@y0zy0XbN?fRs;xlAs~@^ZhBWkFfr9 z>}$}Xp@6(p3&e~=shjx6Ztl|nf&bZX_{+aM<&~E>p`&Yhw6|S)1t!_sY?uC&5t3X&w30_OmNlD$}_`NC^ zn&6cqj8AE)zjFk@1^Dd6R7{R>Z!s3^%PR@mGbyKfrzOR&`KCgA65G2H4H5(xzPBBN z67oCmQh22$MT0{r?@F{cAAq-fZ$K;l^v=7;0VV^cwzh}gsnT~qp|TT>`sZmsfXOlh z2q-B3*8Y`)BbRwCfZ`h}5S=$<^~5cq)rP(X^a7Nfoy}7=0c$haDf%>))r&($*D%70 ziHsZ}98EOXn%xC2v2}WD9o&-zUGm8BW!-N8%m@Be3)Eg)<50Vt%K0%V+DexNEVkM6mmX}k0p>JOo9#;4!xKQz3QZb}M?3W}MT zov`J}L}R6Udvl|FWBe$LpNy`pxFN{zo6HBjeYUlKpMRxJsY&ix?QqY^MW~OFn3yP~ zp<#f)4`zS1o>O<48DhPyY`6ia7wafiw#AUR?3d-ZX}YlP*N+cTS!U>BVF~EI#r$+W z$?{nf7-Sh@W_ofpgdwd{hw-LP#GBh2g~LEB;-YiQx9s6W^p02pQKvWDJij>K%DG-W z3_JcSe=hYyUT#v{W6LC96qGL4@~FY7IXQXwJ5~`6VUYikcol5u8e4lu1ne zI}ou)senpL-jlWuyBeiTt)`}?Qn)=Qw`T}0vMC49@WB4hy8*-bg0~}v9W=O5TdlWh zfroNmMZX;pipI|klmOz25`_XU1{Rk0ob7gp9vyeyM3B|QT&0?{_6Hb@S<9l0eXnWV zN`oN*Jw1ZLq9SQcMeyJCpIvW`e@+>JvFi`W?dgw+E2+r*P-kluG*vD7lg4EEVSnEQ z9swcbG!Oz22~q2%rMbqf`hF5(sAW$Z4h@ZL3lL9N8%tC-i`^INUNJd%bycgXrX~|m z<5Yl7J38*ka3|v7#sduaNNH+Dl&ot{j?Usd?CkS~xD{gKWul12Q5-N}E3)Qq)uVCA z&B(u0UrUOEE6ynXl+&3RXBo?nrUXb)W$toohzrJa{LQHNDjKIdkp(C78dAzH-z9K-KShXeCemg zvXAoiAY!`V5B@K!gO`?uJSSfNiT`X;=3CUUar2ufbPKWKvtEBs_1WvVd&HN zWMpWv-{`V&<@ZNYIlyr{n2#4LK+HRs4aEk#vioJrZFgXleb2vqK{$H~KQb~lZcnba zmBw$n*6j`N1Nd1kkSC`M!OzLSBMl{an@_f$=~Z;bJEeA|Y5JlT7_VGf zT9!A{EAMW(i;a#RaQ6v$eReGC94q~S8kd&4WU$6faU&k8e!Yxvg{ZHaTgfS*DJ?M( zO+DtzjkZ)^Q*Ze8=Ip?j#*gA(-?(oG#eI*W$MpDo6P!HBF?@clw}c|yz&KBY#8Y&S z;j`G_6-{&HG_%s)^*vFm)+@MPpAYw~p4 zU%zgRCuO5DITvnL%L3{X+0N}fSgW8gp`gykX0wk!n*OAYMZ{iS&8pfut}Qy#U5U$j zE;_3&D|0y9y?1eOpWJuleThLlPyy`qSPI&Ue=RH|XK-!r>YBQ(Hrx(uWxKo9Z^Vv1 zGqbQjlKissTeKl<=T8#x$;n1<#9U$mC%&ja+HQ+oj8RH`W#Je54xii|(AX^D%GN-# zIpXT)YKSM2v2Xqprv#(KspXtq*lSE9d<&^Epz2B9aS=A7x8lcMxENFpA~Fz>7C3}s z^BGY;e*DbvP4gAcDg^$ zRtHctl?sPD<#|M)vS&F&KQ+e@{hqxniFq1Ccl69j$>wLywx==AsJ*|Fu9`eq z)^zlYM%L7DF!>hUcs12ihUQuAMtM(9PcO6~fL@4!s*@N>tyC^WWn8jSHKyR-F$CDw z>oTwoKYkeTT3d97?MgJQ?-vxlFER{kiG++wV~_{HVO*x0 zI`*Ai9}6r&VN>@)(Sy+?gc3zS(CEzljGpZ%b|)I2LWPZVt)FtG8S-cV&p%tKAH4{V zhMnd$hnFnT!%3WXK!oJ#ycChruQ=fB6EPn5+tTF}wX3UdDI4&VJx$i|OU-gJ0suxwZiKzz!i zIol+a%|S^7k{w9q1YxUjCyu~$pN()VxtAqLB>IFA?7(N|lzb3vW#_7kp18sVeK9OE z`Dp)*RkGB!!6ycq{Kz6ZOflwiJ;`IjnNVI)Q5YYP;3->FWw=oWfw2#r?=d9q?xIw% z(Te-K$2K4WmlYTD4b;i;g85<*PaoK5qLH}xu;UF1)Yl_-hdM`*fdER)iw##Im zoW12$cPl$aK_-a1{_zuX{}WN8<53K*-h2%I4G7_U{#AG4h?!^ATGY78Ssa*OdNo1G zJuv}MMs}T&XtbI^;1{bEzfp+HYle}g6;honxkQ>M5!RE(Pn)<$Si>VD(Y*k{%|<{<7!*o}iYJ2Dkog()ch~WreqNe32k~O?k4HBQ zHV?UHhpUWg&Y|QZ!x53BO^&05M#Vo}d0O|Os5Z?F`Q>mQmZrm!U+*5L3L;L+XE)Nc zdvRFcdAW578zRk;&y@EC)ft<}pPI8W&&#dOzR<#dTmLP|`BNj}pU1|A=B}p3Jr(Z( z)jzCGnV!4LfV)6~7=MkLqPGZ@ zULKgbgSos^@6OCT?mnkmQ62e6X^c#`s89Bksk}^{SMPHF%>M0ZMO70*L+5<-^lS1m z?VDk$Tj}Y6@RPGVSZcAhsc&y6Dmm{cVz4+|8S7XP54Pv6_X2F9x1+E!K7gqnLPpYN z6VjfCg3Dw=A~uWc6hWST*P%_e--~8gYX^#9#2q`aQ`&bRdV3YX@u*qR&oE{%KHwev{1rrU->V> z{|msFJ-~+7-zc{iBnf~qlM~z~y)o{D?_7Yl{1!*rlri22GtCD-z#D>opq}6U))xRF z>>2_X^aCn$$XiuIPYEDT#L$@kJ4&4UFXBwwYtu~jqoTr)eYu8uI|vaGX2^^AjZYlRk18= zkT(P*6RVMMfBFV~NUTgiOz?7&o5rbPVu|>T8wCfDq&L#%ZNPGp3WE1s-7gI+y1H-M(&`x>6 z5C=0T*hihq1X_+^*m#7N<5ub|z$Qf?CRvf;{p49{5accSw^W@ z!pT5qI*l66v~ywGj3{o>2W(Ik5cN2Pc!pe447)_n*5y3 zXW>2ZQ74D@BzNKauA-h$7kQG2zJNEutSu9)A7`b9ZsLp1ih49fTgb2T(yWQD50|Gp zT}4pYV64y10HGT}Eey8gQ7z0;@xHsKM>~-Q>ryPs5GE%uQ0Px02RJ%YF>Ct$A?Dwq3Y;8M^GT5#T5=$Efn43 zlm2;WbYWv#;d&$CEK%g4pF=2wBx)+cp*%N;{iNfIZ}IEnM90tk=cO4QcR+&RZdR*Q zE{>87p-s@gdViM!#Xt|?Q{lV;)|lI!d1E-2b)Cy4Xen` zg$;!w5~YIS7(oEa+ka8jBX+}yswHCbm>*hnwpHk`8={(#^7$ny2gHb`@*{of{vg zkc_?&@T4rEyzWlMLXb*?Hv|+cTTUJx`lxS?q5&bAmiQ2J%+c78^Y&B5-~>wn+(6A8Ab zJbpN-&1%SnlAnrAY}V3QH+h`@X4|!r;`UHEU|nAquhT{FWBkX*5E^?EfA-vfiprYZ zzs@&v6V;~T+|^D^izg;3(A6h}Y8?N)bxT{sog1xk$AYFQw<7;iRdZ78sd5*IQGFn) zpG-&x*ryz-q+S{nOZ!Qf<#V|R$V)2amF0t2;f=F*m}9g0f3*hQ&k-{`srb5y=z-jm zT?G*r!=4G=4t*P|$wTCxF-YIa!l3tvUQl$mYFx6am3*{Is zm`>0T$6x^Xp^mrT0zDGI%k(KSDSwUdcz8wir(<0I(G%1H5M*l2qRBbTJM zAl(Vt*mObDfr?79i4QlB%Ket~UGG1*Q8)*~w%i+UPI=zt>bLvrKb3vQld{Iv{y{Qo z+a^>2QB{*Sc215tFgVDKo(Bv93{TFkqe7K=CVmq+j|HrF{yELRr%Z>a#0=}5F_(T&y z!ghq0vnGqlOMRo{W!@>NUw?xp0fTlGj3{zYP4f)X$S|G;6QD*89l&EVfxHj^b-) z+lLsQ;Vxywn(j_;kg%Lq`VSoUvQ6eWB8wkcl}e350@3*Nq6Hv?K+*Tq43nbvsU!F!dB5!SN^{fFV$GT$iJ(!A6;krQI$nfY!eag=hv z^6FrL*2q=_)#$-PTr6__3g;zZ{b% zzmYBUE&NNp!Ow$e=ErYq0DYM2QRVJN@Qz@tSV@gAgJoH`Y$lLZYn1RcMP4W}%@zW$ zP*}kc^vOH2CKG+~16tXr$-AYQ>kP;7+Z;y^3{4G>hSjy53$nU(;&)uue4oWXiKg2e z75x(8bwy6PTro%0J!+N!^{i33mKb~FnG#h=G7Hz&{x{&Ny8JHK8gAgXD|*!NFCGg# z;`W05gncAv|G?wF{iWjqz)j*^*|p#pYWc5?bou{(>HnpPIsc`@ z>(v^mkvRgJ0tRQ&Ro2wBk6PL!Of6A~4*mK?zU|6Io zUy_W?0#&I3>t#k(t1QKG2-EP(ZbPsv2)L)nybF{c09(Ywk7G zR_g4(IJ>6~5TH@+@M)O)e4Ok7&&ITDjJvu48e#kbG5a8qUnyV)m9PF|i z;t4)2KP7Zqi!h}puSW+|o z5|3B4&j!3kOvp0W@LRsV_WMo7oXmH{XYL;!lWS(9Yb)%Zs9j6lt{q#Cc=XvQZdzTrL57T4niV=)R#NW9tI+wE*BQ^r{U zI&Abe_Tt(!5)eLkLx}_PM`;W&iLd?-0yLB$&qgG^!YUrBF9V9PvA_F&zRet=DF%G0 zRu6ZQbQ+cL;&BX^{-++}6O$QoF=J8X703ufbx7FS?g-!gx}~}tpB9_8xA#jG!R$7q zh#hK)QBlz%WJ1o1V)-Qn(Y85;MyvaFgZzL=HtHqI1J?nB^t~FFj(m3x=|>tlj;xyo zQ*rOj@-Rd^IkFd-g!EuSA!A8eXogg;VcP7p+oPqPRZt|9$;~Qz|4r40us1@(y{7Q! zUFEkUk{@}`^Yf0iKOtTWnG1+G&`QX6p87qG^YAL)fIjmIF4o}G`|5mx#M4v3@W*G9 z-23n3y8r&1i1@T2vF)2~>1xLt60NT*7JQnI3N$|AiKu)^k;f+*|2Z)8rtzey~A&A&^tgy)b9)`KzWC;e`ydpy9$^cTUscF zX~`sBS)M11oTg{s47O!_kpMHnAe;n_;^~pOK*PXEU{DO zU4!>E6+PcsR~}f84(cUVXqIB|kREE`D_kS1^kx`rYWK0)uS zYMFie7UhZ2{Okd4872kB=N&efn7Z;4n|{|h?rCjtHrAiK1evt^2f(QnY;E`Muz3pa zbb!YmUYh5G{q*dt@ryM;+N43A8K^`~WDM4)<($3$Nyibxr{|dSS6iwoCnCslf?( zdq_F&!6a0&GOLvEQSU68i5hkj9qC7%C&C+C8xzJtbkB=6v&q&HO)J`^<3WDk?pI{{ zSFhJO`cglR^E41_%I$5kD&P1|N6W(L&WDbz8hRjx)>trn*N)(KUR2VzqAstV(6z*V zrM~^)>*zIt>2P3fOJt^qIo{U#y3XjjC~4!n;Gm$?J7n{ho!kx@pA-;TuvJB-fNw2zr!m1gDjrzT< zqQ`I|us`7UFflPHEwXSzo$uy7&n)EZ6Aj_v`ReaSpA`z9@D8rMl6@uc5G&QB`uByv zJuR8(3X2O^^GaH440?|@x1nMS`W zq)a$WYLT=0jm>ZqC_7<#bWfzD={8@b+C>2GpVp|ksmwK2rff3Oj#236u)$Xp-deaT z`vPzqmU?Pi`RHZ^90ACE!>9W*cE?-13yl1Qjfbv48(A+4eZ|bTd%DfyBWxlpvxb;r zj6Ka~=b8$7@$fqJ*sFp&B4-pLk8{-1v(xpY8TXTVVSRzj`E@~yLrk-d3ZtPefLDLT z{lb(C+XYiB)Lu=hD74{Q?*|^VbZp5O65S`iOr1q7x-UZnCXDF# zX&u?R0%EYxqxz_&?6@FVsBMe`TI&7Lo>F+m84a1>w`BtA+0mS#JJX8IH(#qXmXI`f zlnSZX+TCjrZ`o0AQwhU&Jyn`aPn%&t?1Ti8MhT;tot$ksjn)Mp;00nC*c3ezWP~wvo0EKIMOK|m+|WtEdG>d@FeTrCUX_*&rswfoI`AU%prFDIu)b5NMXm` z80wE)7Ee6o6}O$8lge3g^4lZU{Bj{04NAqaDP`^))mC%bRxhyT~Nsx}9QiVEbK%miXFDMLO3}aW*vnLu#0W*dKzD`>knT)K~ zt0X#mX$=1`?7b;N!z@ilDJRCQ9xLt3CG;lrM>~Wh<*l?w2wXbyRX}3nlI7F47^y=3 zT{7rjvX11zkF6;Aa|~Pt9}5?v)p%m3f<3)_v~0d%<3m2HNl8Y%4{saxPar;-m6Jz? zk+=!xx`oY_NFlw%<6*DM2w=P=OUc%v%`IGOZ-SPxpk}?}Cd_(%oOkKF0q4*z0wXP{Z56z;f|=3j+V8qgOneF>-j^)W6(0VtlZ zWi9_-oX-V_sMF}K8h;z)6TIL6fzjp=Lf~`w0wSsOw#|PuY7qjW=spxzaqnNz z^Z%(IqGdU^c*Nv8;2)61nw^`|HLYRqUyFVaZ$ZI&;UR%SH!)y>?J2fhrrRS%AVO<7L3Y1+258VmS^#K>Nr4RNU-U_z1>r0yx zo3}z1i?MQ1L^ zmiBYftofGzD1QsCKHtNoKkD1pue)K8AA5{CevDmlIxepSJcjspy&9P2B7mfhON&c) zxA_IHd(^v4S+cezmEd6;Jl|36*5|+y;|t&!wMW%{teDui8Ib4wNPyN}>vRmpPnStm zc=$KxYRT>CB!D-6+ulT_3cc#eim%UDME7UxkJ5tdw*iN4^W8wF+&?Y&E0K^#%%x)W z0AT;Vo}-WT4!hH z^?il3`PR1A7niBR#<#e*V|>U}Fn3q_e;X<2umNKlSfdVlEZZ;$PAkFuKe8dC1NS;% z7+G1B;vV)g!_$kZknS!I&@H$M)U>fsh=8cH&a8ONu-+iVdCw=0-W`%Bi#$`|&J;6? z2lE-tH&0{TEgu+09ix3l^G91{{|KSa7vJc2e1~j z5I^^w7hJUd&%mjF`a1smaHG`{RkPgbdRYQ*qQsp zpjH^an?*7)%P8;-mY8cdPC7iJA{!G5TbgehQ(orb>c{~7zYmKPoEIL0h0`AsEw*zl z{Y>*!nuo!Ng|)p`V>cwH&7H#(u$eba<{Y^2^`DSd*d#>+RvLT=?1a7iO9 z{WCQB74Y~p$ANtPzM$~wY1EA*7Vq1a*P2lL`Cf(xUS_SB)|h>V1;qze9@s+4JGZ-P zrQSOHs+zRZuPN+*2}H=qk))g_l0UgwCIpa67^RZKP_8)L^!IyMa$GGQG56PP&7ZBy z$f4>Sjy*JBFyAf2`SMoFK?KU&-J0z z{!L9yGP1Jiv3rjXccqpKcrd^=hBaAugNfRUhDFh6d5|>bcpY{-2TSmEK78ou4)-+1 z!KRq9?5hAFUQm#}5PO-sQ_}|(jw1Pipy&C*rt?lwcmPkWhpt*oy{qFX6W;hue6}C7QL|?41;>b#eFKy8t z^f009Z=BbE1wthqG?HAK>_`!d zU(~AJn|B{%w$AL%N1lk4cmvaQlu7BIS^^n4xtvd8=Qey8j1 z7oXD$jht#@3o5pw^K@|#bMTbU!)XS88I{#YHNFWCS`WCwq~c6nD|&$ zw&1`g2}Ff7-?uqH>E}phBVaiTy&|=re18Bv2wH~|xS24{CnWeDx=A?lI7@Fn@ZQ(z z=)Lo0uw2}>RWDj>3lWsD;}v<&m~p^2lCjql*dN^X?@fZ|7BAXAdl?s#6Wo&D)km~8sTs=F&?e07(5 zlb+Si-Dx9SL2AfVtL=ko6L`I^mku6DQRKA*IUn>u6rWGbF^_|z#LJ&C#B9( z?Az(Wsjy~IPuacf4bOX#E7npW{@&e9u+7Qf&3v1?Y@*Aq>iV*1ldhst`G(0N^=pl~ z9E%>=rVYL@o}~-?CDjxv?DleAd_vjY3vOaOjuHjcF+GnvEz|s|MptY`0 zhN>9#(LxPr$RE3H}YDf(Yl0u(rC<*{0;}Q_K2Z z@zm24IbV6{?|XeER*rjeD70&Rcy`4$!?=$ZaG$@?46R1#ah+UeIxn{dFgeVA(%)=w zJp6d7_fjH>OI2Ha+|pysA4#R&K2Vks*GAU!>Y(Pf(0u;-WV+IZEY&@u*TW(kqQV!| zTeNX|rr~l1e=&lnGKv48D!gpp*03|K|9Z66F-g`^>nVB7K}JqUiK)YnuE)0Vg%Hh= zlOdgZm!qJNRvr(;53#?TLU#C3-c?zXh9eHil>KBSkJ(h@0`nVl+}U^ue4P_K^il5T zL6il91)F|K!k1Q${yGkm1olrT7U{}yv3p40NB9ggG7B_j5*-Wsb`QR734Hld1s!+V zGo@*)Anq>U5mTCZRKm4+bsa6OH+#OL1{!T8FH|{+WQsEYhB9N7*1*pC22)vQ`dC-( zrZ-zzW4>xEKUUl9En4kH)+!LAbEE}e{av1M%ONu~V()CB7JAC+t-K-^m`yAUoL`{f zFXt|5vXSL!`B^WX_TI3`(`d*;CWY)4Y_{Dj&Grd;jlc3VbW zg$Y)HOcZ|NUn?FY=KkVQC08BLyRf8wMX!ui{(f?{N42T)O2*SmfY63U*;^ZvLXi+X z`JIh`Tdy{3AKhn3DDh;VDTJ(9x-p0)VTt@n#V^@*P5e0B*~`|p!lLiv!_L})&#+R_ zxZN!-3!TXr^mGKU2=xH{`Usrrt%2XsBjTILEz7!UyYS|g7JsTJMe_;e2?;4pDS)c6 zGE`_|6g8BiAcGs*jP@J_*mWB;2@+bDQMFwb-da_A8$UlWFaV=-zIL@VQEZ7ewd%?P zx{qher=h6&Gprkj5+=HIXM)KZgkpo$p4yeKeitq?CZm~n5*^+ zXn-3X9h1?}SkJvtEoyLFHF$Ub-~@2D8--zWTweC^s(BX_H&^$3xbD-o zY%SGo$7caId)%!p-W>*%gj;2<-=n6qx3``276czJ!V&FG$xHLfA31z-d!iYu<1&YHC68+O7x{sji6H?k6wZJ(9uY zwt}^G@eB#pC!NO^XLjR-qLT|x%kA64=`f3$<*+~xO{>cmIGp;Mz8rXb`hqR{2|rk? zeOx^oXlwGgNc=b#^#YiK!K6A<1PcXDTy5>`7s&VV+V0udjgAMqc(1|S#yqxmcBoib z{$T{1K&Lz`ogyL$H<@Hjvh5i?4wEf8DJiKn=@YEu;k-8+R#Wks8mh%j<)% zrD_Ye{@S&-_6L(lv9Yn!)ef{+O^5R5ZFoK*@;GXwY5miWA>zWTa@slh1Rb?cvoCqz1!j@rLaU4m(P`mLu+>t3E0X z4edLr_WoP^zM+{1Cw6|N=aFdP_|j60wpe4uC>A4Ee>ocn4-Y?#=r|Qdzyg|ITU}i~ zSPNC8Ro1(^T(Sm|&53DgUt2*g{Dr6L9n9`e&xY7zVtjG3e&tBi;X*w^`InUkmALi0{iJ6P`x4njOR=Y7Jikw^&w>aFpT@fZw4ie?~>c?#d1JZ;m@@9g3t zf_(xqhjowRIkk@?}OkC5rWaQ zY8(elgZlcf;n1$u&YnR2T!xz90Sp|RUjfm;JwfOW4|zPLjfxIm^~bjwPo_++NiXK$ zP>0Z7C)PbV41{kyuaVZpD5V9yh9|&fm}CrWCir*`Eg`S8yY%?Tn{XRXovZLfelXuG z;Mtp88{F_yp*-X3)}VG;rnb-sAs}*CT3Q|#8un09QsOYkq4U7ocdiQ!0a6P-j z4kD&zq+Y(HI*(Yj#6D^lXJqI=>UChuD=n4rWZf((yYF9o>gtd5cwW`hC{RlA6BIpk z^%RTLZZKIbW`F$7{VFIVf1LAn2&s?3HEnj}o7#>LeC4Vb{ zJbz-(MB~Kzt@QNti1VedltQ&Nrgi( z^jN_R6>5bnw^I%z_yL*?j=DfU=4WS#7zrSdri0s}Vm0dsSTwZy8#{#t|X#ktmVhAP?a0EG%5#e%MLT`KK=H>8hpdyl~gBAjV6=;{*wG7fJKl zq=WOuRX|3EPl-vK8-I2-J7Vj4&uhAY+buAt%^M~sBYtSK^c{dU|I|rIZ=eDWw<(#$ zrF{Q>MUB{-w;#>Yo34%=jTrb8P-wZ>P&6y9D|-5WpIZ|E#nM#Sum2Cf-XJy&)Kff* zJdWC_gsCjTR&&_|lv4F?p&q?idR=TT;cHuq_Yt`tVHz-Kn$@p8l>}X@#50}Z74n`*#OBo)_dc5 zU&Wc2p}c_yY6e_2T92cgim;`tsj7OeeY!H2^18Cb|-c%0fG#KSYeF`t#!4} z&Eac%K4gtCknHk2?wryd_fS2x=Eu^?YH5X~V{3Rt49k#{7uwB&k$~GsL!_mc;=YfO z7ne*TnU%oQ)Ko=vkGH0lhREfdDRaU90^vPf{;W`VlL?n)!+~Q=tRnS>Le?)}I|zck zfO$L>e+n2am-|6$zI(1dQe(w?eS52SRjla@q;W>1+K9CVSFxC$I{cPP_DW<1f9leE zb$#59Tn1Ph{573PvX@-Vnj+4_j(mXjna(>!_lu3K`lE<+0h^P~c%6~GlD2PE%Rt3~ zlvsXJe;p-0T&?M*xmgJLgob??$|lJV0X?9;dshe%U~Dc$2@Je@Qy1F9e)q_Zr%g9J zX9-TdkBcoH5j%9+8ned1D}iw*zBTzx(3{k6G=IYBS}hAXGA8nyGW@zG+n6 zOfqI*x`$HgTuDrajHCDN-aZ$0KqYy|?b@=mw6smhYe|w$a=j98gqrU-1tbi2T`hTr z+n`gXi418SD@@K68iU)dFNmJHi9ClnPqmud){d^`^?yf5)ZRkvVa*{etm>J?oI%eX zBqYU+5@P@z;Pv2!a%YMjmlBn+N2teLo>$u+UGP8Xpjg)01XU+(+}<5QqLCAJJm(Ia zblQA_%k(77binW){v&6E9qt&mL?(flfyX)K3-v6Zn;YYPFef%p3U(wg>Dvr(Uzy$vcCl47!x6c{A53I#k4f|L+t?s9dNhXC zO|g+Zc`nQ^lsX*|W)_fvgvpG635F+`)(Qy%*8S_7Eh1SUfLENM>AW&fK}kWchtq29 z{tS+cj7;F+H+{RJvbG-p=!YwerS12}QCBYqdwWMcqUEEQbe8!l!z}ex+W)O08>6=( za**1-zd}VR@hOGu<`+0Tu@=n{f6VWtc>~n^TWxYASNiwY2(AJYQ*KxLamYn7DHm5t z#sip`n7@bm+5w_E2H!38a4(3Bd5K75&3MZ|cOXd{HJvp$Q#ib(SGLWNnwm95go1nh8Qc2 z9;hrx8;kUy>N~r17w=!zZY|zfA8~sIBt8Pw?F7S)2w}nJ^645UMy!5tjz)HX#VY>2 z>E@jsWp{ia=PjrY9o7z$5y4$dTD*HjAfPg*b?g^a%gpU(hhn+SJZi;M6ohPXY3UL+ z>A-uC<>fnPXJ!P4_ty-N_rtr%H&RnlF z-Q72{`C+U|I2(f>jhcClx@tn#*4FgDB6KXt5Y^k@9v7k4?*q5DSol;>y4#S%=H}c zx7~`}7CoPgH42YfvxWtZ>vp_zwo=KXkP{m)QtZzoWi8c`hlW*<)7ZEfp7Wz=XET`z z@cHQbx*awtZ!Ni=Nm|UPNC^w~6>EZgX(w*d?x%w$$hIt`xgOsGx$C+TDXaq#fFqNE zj1kwAHg8_7>TC+zeGK+hic@nng9Uqb?j4EgozgaEU&HYRoIe|@ zdJLq0U5jyVlJ{u7+&Mp(Qx>`k8=gX2xEshkoQoa)rI(d1PxM7yhfcL(<5Lrm^(OHnM$2}{ZzGO-LV z3d!cf&zZsIjuv9mZ~pEbNR-Q1=yPZGo;E(66A*nForqh0_>nDH+v-mHOZZAeBp)!C zXgw0stSB^2P@>N+6OBG4J@qxPXUl4OI0AnP=MC*QQZjK1L~_w=PoW=VLJ zCp0KGpRuv~+uM_-OlVPyAqe0)VWD!2+b9i65fDE8;M3Bw^tmlV|HHsxK(mkusrBa9 zzWrO3o4f)j&E!_eRg8Z~P&G=RYL9c#uA}+$4cNW zyLOyT9-|xsZYQs`e;zINJAiatNoyh2aNjX>Wd%sM-~Ii9VzwXOQV{r7&AVP2n;HvB zOEX^I+>imh*E@jrl0@Jvs3AM8%qUe_*`CjO4FnB3tEJE)4pzD|+r5E*(*dmF*5})i zV=>n93E)JQQl#h0_(>W1?ZOEDB-Qeql@iI#w(L34hZjw*-E4^t+1Zq48wpvg@Rv~) zu5KRR;%{#5()Dwss)98gJ+e2F6HT-%8JbnA(3FBVDmNu{K{=8^FaMzN@9@)Az7~75 z3=BY&YbvPIe*Xs$Yp;%3?-(jHWx0TYg5otgD)%cZ8%VD@C{-%}^)uG$)E;7^q6PwW zZP9P1gL!YDAQkY>3}LVudmf|2!~=)ITw2sirqP%!WFu9ZFZxDBp}oQV zj8WIS``P)}i=>Kw+5K-YIt=W9N3v(}> z;r3h!m&m2ZV=*SD&lp5uNW+vru%Fc6=OVM#021R6|IP)b^lL-lX6YRWGFIR4ZIB zpz?frQKW-RLDAYi1_NAUl$zR~M9NpMz7jdHImP5l{`grp8^wH6?P$bv(8D$+{r$iI zW+SWcVYX-H9;;*2SF>)X{)16RjZ5{MdRKW8P?UOKp+q-YO}DAkdGZi9PT(;sj0I?Zp2Kob)GOx zuKOwnEbQ*vD2_BvO)3M$Uyaq8GdWoOE;y5j_MVA{v^o^vdI~`i@q*rPh>e8d^YYgj z!RfU7!@|;RpiMP#P8Mrf2vUR-+C}p47BySjP_vOI#xj-z#)0KL3~kLGRS(UFUmDqr zmTEW34@^a9Rp}8iNlD)Yc1H-^@>Enu5D?5(Rt~+lwiQ$#q=;y#`B6YOWSL$*WYKoZ#uq+*Ul*22I#5^R}p4928K3(&mG5u(=CniIKEmcGwh?Z zz$}qg2{;=f3Sq(y9V6}7jki1V5rypSnPi)%oGd;t|8R;%bm1^v)?Al0`t_qth&&~Z=Y z-`B~Pe|iZ}%oh}~&HCNU#*R|7y)N>}^*w0QC3)WFfJXwcjxvH94Yqx^46;OB?tDX00=Hyv-IqRNV)hVCMJGfRT9n!*rWMFa5&l`*gO}x+^-I3){=1lnP|-7 zEo9_er{Jo9+}y&JbcxsBgT#*a7UA!W4{TzTRYHxl2oJB%eBY}mE>HS5`3ct*d?fhX zp#xYu#7NwOk@luCl}l1!< z$x<_S^W!e<{qcema96e+zYZY#M2@jHS;Ru|7)WJI^P26gczknk(5da4&qrL&E^hjL zaRc>FOOIQGAx$Q9K(>gFp?JLB)#1WdNl|_^wS4LubHP7zW!M?okzO}>`pD@fqeHT= z0Z~2jaes^ho=oH>O88K5xiEy+#jUvT);8_c_i0mMIvZy6pF-QTL{(batXBz7BmIV@4OZ z`9IQUA+E+_*vcnl;XFp4=F--&u~Nzb^1#ZzGP+ES-dT6WJ=3T_?kBdkEy8TInNIy9Xpg30%4u|%Sy!Fkd_;y>u7Glk zj!Lqja+*tpHtDQytVaRrJ8o&6M_iAu?INu#64%JZXD#fmJy{#cSHvl|E4Q9naLQD6 zCn~(XH3N#zZ&^_(DWNq>t^!Wzw8L}V_ytPE9hV1?m0NsEJ|(5N;;ZxX(c;-{R*U1A z9B>-YRWYSuNB;;K;&$F2c{0YIT-ge|cXz+-q1v8;@G{h$%U$2yO_>~-+~Xk;XuQGs z0MG4u*#StM_60|fr$PQbc|}=S+1oFLbN?x*-ru7Dxvi`gbMHI%ve}4Nr>%&nm6rlyuEO9!B!d*q~9YPC9B13RU&sqRhF3 za{plQpp&y9-fy%TF{MokQ`eWXv$W`Yigc3^!zh|fPD7S%15&iF-@F+$)LY>_UKY3p zw#dkz?ig(I&SXHeX(a_6QbtB*slka}46V}zQtvJj!rRvVMCsk;#a-0OAjGQl-oHGV zdnm&e{-34LYY#pF(aKT&vb1CKP>jCqHP~>i)wn`NW!YyRgZ9v^7`lRoUZ8E|qXAZI ztF3=bX{{hdU@!-3G3We5-MRM?GQd-cOGpUX@0l2;i{Ke@)*O8}U6n#o5)+n-v7Hj5 zk>%Hh0o2fv`+2TH?f4hGp1hh{K{fSVY_xYpY}hM616w<{=M!fk7VTl(6_32;YsB$a zq7*h$>U~AP8EAgJ>M~WuZEasLFqG;BJRf(c+>akWx>w%Am@5=Noxvds4~xEJ*y<<` zeD-7>AC_O0>Z}C+2+Tt~{m6pA`VW}27HdhTFyABCKJX`uOjU7GNNl7jT8IqRhA;}q zYEew?Q&+KY>VrX`$6g9f1y#eF-#tD4uwjZy3N%?L`XMuU@;NkptjuHY(ZvU~dOy!l zl8``I(YX$2p~uHeuz);#`@Fq=wi_AzA}e-t`nqmE)AOPf-|}b1_eoc3N{$3xt1yzw z>#{Xr(52l|8$wphTI^o)uSyB^YSr!n97V9UkdP#@e~8PKCbNRCBP_!^COO*kzs|}x zGY+9vpLG7w$682$dspSrz%b%ASQUMBfhhxwJqkG%=so!oqgKS8VBjazsXwD^_qO|! zCN*l)fkMo&F9J5%dv^HOn?uSpd2*`l9Mf6Qd0nCSCG`44L_}Ezs}7&a#yQ3BE)Tum z)7V@DC3D(5fdmDG_5Ki(*BUIz;^uCRaY;ON}*M@N|w2p&x#oL4Ha^F9dV#GXa@$426NE5 z{g5q{Y;=y=X~?=@e>Q-_>{vK*pXzoraZ|JCj!xuxo*u+n?B<>+Pk`%0@M&Vo+5bxL z5y8FUTdZr$_5vO^9aXGeT?(1kf2;T2na|ZD1uwbGZ9f6WTIg=dORrqwGTSGbi{i-UqSGnCOaX1eYYtL(+%b#MATqoX3UBX;CCwt9HYO!{+O^5423yZE7 ziEgJc3{)DUyj-)+d=ysAX{Y$!Q%H@~#RapEm` zoN94ex${E}6Pco{FX;^HI*UE9R1E$=gg+=juq6gfNy~WSEq64D$`+b!aqOSM)(bWt zKEYKgq4b|R7WiL78ZgmaNKpU77ALHmbr`r3j4=)&>| k(?9I8~^|S literal 0 HcmV?d00001