From f3d59296132f200c263619e231834d2046c0b794 Mon Sep 17 00:00:00 2001 From: Mahdi Dibaiee Date: Sun, 26 Jul 2015 14:28:08 +0430 Subject: [PATCH] Autocomplete using Tries --- _posts/2015-07-24-autocomplete-trie.md | 203 +++++++++++++++++++++++++ _sass/_layout.scss | 12 ++ img/autocomplete-1.png | Bin 0 -> 22455 bytes img/autocomplete-2.png | Bin 0 -> 31134 bytes img/trie.jpg | Bin 0 -> 13818 bytes 5 files changed, 215 insertions(+) create mode 100644 _posts/2015-07-24-autocomplete-trie.md create mode 100644 img/autocomplete-1.png create mode 100644 img/autocomplete-2.png create mode 100644 img/trie.jpg diff --git a/_posts/2015-07-24-autocomplete-trie.md b/_posts/2015-07-24-autocomplete-trie.md new file mode 100644 index 0000000..f1c0640 --- /dev/null +++ b/_posts/2015-07-24-autocomplete-trie.md @@ -0,0 +1,203 @@ +--- +layout: post +title: "Autocomplete using Tries" +date: 2015-07-24 09:44:00 +permalink: autocomplete-predict-trie +categories: algorithms +--- + +In this article, I'm going over creating an autocompletion/prediction system using a data-structure called Trie, it's fast and easy to customize. + +#Trie +[Trie](https://en.wikipedia.org/wiki/Trie) is a simple data-structure most commonly used as a dictionary, it looks like so: + +![Trie](/img/trie.jpg) + +As you see, it's just a *tree*, a set of nodes connected to other [child] nodes, but the nodes have a special relationship: + +Each child node extends it's parent with one extra character. + +{% highlight javascript %} +// Something like this +child.value = parent.value + 'c'; +{% endhighlight %} + +It's pretty easy to traverse this tree and predict the next possible words. + +##Implementation + +We're going to use ES6 classes to create our `Trie` and `Node` classes. + +Let's start with our simple Node class: +{% highlight javascript %} +class Node { + constructor(value = '') { + this.value = value; + this.children = []; + } +} +{% endhighlight %} + +Unlike [binary trees](https://en.wikipedia.org/wiki/Binary_tree) where each node has a left and right child, Trie nodes don't necessarily have a limit on how many children they can have. + +Trie class: +{% highlight javascript %} +class Trie { + constructor() { + this.root = new Node(); + } + + add(value, parent = this.root) { + for (let i = 0, len = value.length; i < len; i++) { + let node = parent.children.find(child => child.value[i] === value[i]); + + if (!node) { + node = new Node(value.slice(0, i + 1)); + parent.children.push(node); + } + + parent = node; + } + + return parent; + } + + find(value, parent = this.root) { + for (let i = 0, len = value.length; i < len; i++) { + parent = parent.children.find(child => child.value[i] === value[i]); + + if (!parent) return null; + } + return parent; + } +} +{% endhighlight %} +Every Trie must have a root node with empty value, that's how our single-character nodes follow the rule of Tries. + +Ok, our first method, `add` handles adding a value to the trie, creating necessary parent nodes for our value. +At each iteration, we compare the `i`th character of our value, with `i`th character of current node's children's value, +if we find one, we continue to search the next branch, else, we create a node with `value.slice(0, i + 1)` and move onto the created node. + +It might be a little hard to grasp at first, so I created a visualization of this method to help you understand it easier, take a look: +[Trie Visualization](/autocomplete-trie/demo/add.html) + +Then we have our find method, which searches for the given value in the trie. The algorithm for searching is the same, comparing by index and moving to the next branch. + +#Example +That's it for our simple Trie class, now let's create an actual input with autocomplete functionality using our Trie. + +{% highlight html %} + + +
+ +
+{% endhighlight %} + +I put some random names and stuff into three categories, results: [data.json](/autocomplete-trie/demo/data.json) + +Now we have to create a Trie of our data: +{% highlight javascript %} +const trie = new Trie(); + +let data = {...}; // read from data.json + +for (let category in data) { + for (let item of data[category]) { + let node = trie.add(item); + node.category = category; + } +} +{% endhighlight %} +As simple as that, our trie is made, it looks like this: [Data](/autocomplete-trie/demo/data.html) + +Now, let's actually show results: +{% highlight javascript %} +const input = document.querySelector('input'); +const results = document.querySelector('#results'); + +input.addEventListener('keyup', () => { + results.innerHTML = ''; + + const nodes = trie.find(input.value); + + if (!nodes) return; + + for (let node of nodes.children) { + const category = node.category ? `- ${node.category}` : ''; + + results.innerHTML += `
  • ${node.name} ${category}
  • `; + } +}); +{% endhighlight %} +[Autocomplete 1](/autocomplete-trie/1.html) +![Autocomplete 1](/img/autocomplete-1.png) +This will only show the instant-childs of the word entered, but that's not what we want, we want to show *complete* words, how do we do that? + +First, we need a way to detect complete words, we can have a flag to recognize complete words, we can modify our `add` method to +automatically flag whole words or we can manually add the flag after adding the node, as we did by setting a category for our words, +so we already have a flag to recognize whole words, that's our `category` property, now let's add a new method to our Trie class to find +whole words. + +{% highlight javascript %} +... + findWords(value, parent = this.root) { + let top = this.find(value, parent); + if (!top) return []; + + let words = []; + + top.children.forEach(function getWords(node) { + if (node.category) words.push(node); + node.children.forEach(getWords); + }); + + return words; + } +... +{% endhighlight %} + +And change our event listener like so: +{% highlight javascript %} +const input = document.querySelector('input'); +const results = document.querySelector('#results'); + +input.addEventListener('keyup', () => { + results.innerHTML = ''; + + const nodes = trie.findWords(input.value); // << Change + + if (!nodes.length) return; // << Change + + for (let node of nodes) { // << Change + const category = node.category ? `- ${node.category}` : ''; + + results.innerHTML += `
  • ${node.name} ${category}
  • `; + } +}); +{% endhighlight %} +[Autocomplete 2](/autocomplete-trie/2.html) +![Autocomplete 2](/img/autocomplete-2.png) +Ta-daa! + +We have our autocomplete working! Let's add zsh-like-tab-to-next-char functionality. + +{% highlight javascript %} +input.addEventListener('keydown', e => { + // Tab Key + if (e.keyCode === 9) { + e.preventDefault(); + const current = trie.find(input.value); + + if (!current.children.length) return; + + input.value = current.children[0].name; + } +}); +{% endhighlight %} + +That's it! We have an input with autocomplete and tab-to-next-char. Isn't it awesome? + +[Final Result](/autocomplete-trie/2.html) + +*Pst! I have a repository of algorithm implementations in ES6, you might want to take a look! [mdibaiee/harmony-algorithms](https://github.com/mdibaiee/harmony-algorithms)* diff --git a/_sass/_layout.scss b/_sass/_layout.scss index 7ea5d98..26f21d7 100644 --- a/_sass/_layout.scss +++ b/_sass/_layout.scss @@ -74,10 +74,22 @@ article p img { display: block; } +strong { + font-weight: bold; +} + .post article h1 { font-weight: bold; } +.post-list li { + margin-top: 100px; +} + +.post-list li:first-of-type { + margin-top: 0; +} + .post-list h2 { font-size: 1.5rem; } diff --git a/img/autocomplete-1.png b/img/autocomplete-1.png new file mode 100644 index 0000000000000000000000000000000000000000..74dad68d37661320349e6c69ba8f3d054e3a0b7e GIT binary patch literal 22455 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 yzF@|eQT}yy-@6>YR-Jig?9#go zBf)-kCo{p-F}{y-HJs@KrvUDl`{~M1)oQp2v*Z3|Fzp?s7Li7RiBird>#eM087-`1@5CA55Z>6%430y(4qdPVPHwO8~$y%v^G2(W5Q7PrhVdf&10 zY;_PhH6&*{c{6#%?`-$truO?JMR{3Z(=i3J>P{ld${MXfu`m+{{-d@Ql~+V+cU5V^ zTh1Kst#Z>-f~21~*x!;lv0Fw0=B&h^>rYBT$mscvj+AZos_*D6^d;M9oyM9#u`>oY zjPG9;$$^d%pIVsaewsl?rYLZR-qpuumE@iqR9*@NYX*MUTGE+Byxv`|mXiY7LcGr( zHG+jtEGjCKee!=63xB^-hX=IcaEh`bwd8hvi}1&lxXTdi$Q07g6Qq5 ze_943>>(2*C^8CSuv=5MZQ$-Y2xBs`WgDg|M1CGYkrzI5Q={`O`iMgK0kq zo7*98AoA4u3qLA4KdE+wzI64YX^pBR!+I|j!9zUlcCUoya14P){3jQUtY}Z6i|+^#jTn1_-)wDw>3 z#;74A?5O;AMceZi({s)KRne-ho7Qz%1&8mb7ENdf?p*)$9?*pS3dGd+wpBwPAfDzG z`FMqS<#dj2ClLiE-1g%HF^&hKi!;GtiNQ@9o0slqbH{M%yPF@#QzrzV7mo+K)bL&% z1;P82r?+a9HE}5uCV5BZK>6|quv*IV0lt#D>GYWia+=0G?UU(9*JBht(=qZ z>*bx*g$P!hys_&IRv>pkurak;ZlfCtoctm zG+TosLaMKyv^1iF2+rlE*Gnd(-;OIRoq2ACZcxBg1<+q$Y zejS9t9Gg5_9p5h+JmB7^9z^P;<{{ptwK7x5e%D7=s@p&zg5z(dfKSB#gY=Z*Qf91b zvFV%ko_%ZmM8S(Cojr;*zm0}4A66!e)nzqOb;m=IOF!v+IyAfxinC{9wKh&W`8C16lRKHlP-JW#^%`QIvI-~pg&Wu6cyY5`bd2}m7Jp%rS z8&~*5e>@bqAZ?3d%3t|ktiJbOSe@tf$)|DckPf8@ffJWP?<$I6O2)-9slnX1YeoLZ z=vAUFn&vv*>JgUhlFq5hr`8{;Sa!dcZ1Y@XSrtYXRjfUToeV1+*$ZD{5@J6}v7xLn za1&ddFKbFZ%nkO-DrMCm$%bEq98F)`d^Q+H<_=Q-h|2(In`44zeTI?eau&ocB-Ssn z@;^D6Pj00#>JA(xEEbit>o*;=y}pj68bx$0eo$2_muVoN2+e@V7Z;b}Uy!_hMR@%~ zt?RB&0PxJ&X(RIRDP zd-lJ?eiQ>K#_Nb_fhyGar>()6QS>A+mu3}pI1BSxSAOg&;Q0zq%+Oy?eX^|a|*b|(Ic!Hl!O4~TPVJK(JbZk z3l7EMw=i0!g<<}LA;Ek2q&-zSGM(!t4EwHNxcgWQ)C(^1_%9iHDb+U^eR3E#{Kyk7 z44FvoYL+#p#ntpxl?@i)-W5MP>mJ2Ex7o*UcF)|M+07;lRv0dNP)fx28Ss*#^~&7Oqa9<4}=rl5iKPcvkrqT34*tcsNuwQzRu(%eGP z*Gc^5T{8RQNW)b4m;EU+R+9cynuN- zx+DLKgoxSsh8JI8L%gOO>b37c8P^XLXqloWQ>POwg|rS@5fPUzr5!04ivh7#R9$^^ zNgFDu&Qv?y(WmvW)N;3f_B(};5}KU$l0V(uI8+l~l>NR%@k;u9p0x()c;2BOY^?ePPW(yh|mg5~$!AL_lg6DFJ# z`Bh$-guZ_colT$Apy&#-hhG0k#oUXlXH15*4htsdOh+=i27(8Fn&4Aln*<+v=uN*P zT90sO>a=~?ubxy?eXnFp>GkCjZEA3uOTj`r%It~HmzxoJwRE)(@RHeXjp8MNXM;A> zf*=ljpB8|PTqx&Y`(*GSiEbKq4s5G!iZFyAo?+}Ko|QXv`cTV4JuWG6`a1AICa&5- zj?FQ@dc!TK#l`py11%cg6~VGg1ymsaL-xA`mfaztDiC57D;@S-|0dE^jqHU6pyc;d zzjgH+4FB@;-(dI+hW~e9cu`%p9Q$=TIv?YKmfBOW5RQxXxhT_CiF2ANNFI3hO~x<# zqJEJJCa96JIe!Ap1WCyui3DD@PZYbe%y?QOSAc%gilE4$}3W@mF zKi)kjk_aG#8+N=O+5g(@h)Y#~g*(oNusCft>*4h>0R|x^*uq;tXU)q5dCnL(L=Ogv zCvs)Q|Ik(s%#tGle#zm})o%g(%LB05u1;qf1EAms>M1n9E4r zeSIV1spAJt86cYX6y2X`Ie113A*zs S@Vi+EFP_VYR*EUR*mO`=OTAbqU(o&#!DNr1WI{|_RNNJ1PDHOLBid(VZPH?y26b(*s z36L*6_kC`8o)g~h*Z1QaZ^!5uVP~zi_gZVtYt8GLb0_4rsyq%BITi*629Cn3mv1mI zFtIT(Zs|O@kGi7D^neEg1Dn`JM&`AGj128-7l5UWy#)rwtB}}uOwE{X;!Zdl>!(k| z4`dbBRsJx_I*oMwfgg?WtsU>dGk0_KmddYmABYTzN{jCOQAwMjgLeyL_(WZO0(zTR zbDrVW(fNFu$9xLk!f9_RXz$XB_b`<@Cl+s_H$dm#hv#rU#Kpwl$AfFxq|_F_vn)s z2A=3wL$G_Abl=`nwnyKjF@nu`aujqm`dHsUqR-l2o=czHd#`L!`pE{PE98*xaLR@| zDg~pAD7|f2X8!S1YU;p}^lqRyj~Iy9-0PWn%om!2?^pT*U-nbj-%blFb<(k#8ygkV zh6$V^QzDUuW#uo;eAinPRY>m3g>+)W9RO>Ecsw#YT?&4Ro_Ea|yGXn!Lz)uyvchhg z$zLI+Y9yToFz#SHanfmg`p2R{2DZ9oA&h0_$ERqW^{BwZgAb;1BC^74w)|2_gZ;;0 z)XT1puh*>yRxb;G@ysXn9O8b!)+YBZq?KSY$|rQ_hC>5n;y%uPP9~$`-9+Zn&N2J+ z$+LtK*a^PBl+;?MVLWabD+6|R1n8FO65!bWA#pfjb~~$7=eCg0Q&(k*psg+D@%PTv zmy_!Kqy~ob>Y1g`4~1RoV0$(pHd;l|!O6wh%k|R9V)5$c?}zUty5HTCS3EY8`B2|Q znkPt!`K=lA>^2i#OVVvif9z(vy^_74rtcir@9%x0#c}e7=321R8I80C4O+j(xc<<7 zuV&eKKKd`8$%rr9^9=kj@FMeWZ9keo`&8d;eHwNB9m5gSeWCGK6IJR;MLyk<_y% z5d~+G@lvPE6Q|3h@;fe;E+?7K-gF!z!a-LlPi1rBBXJI@fd}mrtyXdG zivNg@OY1!PU~JCG7d!|_>8dC#gJ4Qu`o{Z7&hs!VIDB$Guj9yhhyf?CRz^6QZQOBM zBEvZPwkLR1X%Mae3am z-;75phxh5z5T0m8UkIze^8~TOL;uT}roxJCM z@~X5}pOs!QyO4N=A3X(p9%Ko8qi&)3NZM{`b<0HY~bKeW@W zehyVgeuYr5dS&?CXhgn@T{p;H=7gE~^ZCjP7ZER-bN-sJ%M@|;Oj!Ri2=3?klvTCt{v)Zs?)kV@3-%AtQ#I#UCoB8hh&&=jGI=Qd2oL($KTEEg64(su} z;L&%^T9Sk+g>rp)r6{N9r%0JamzAmr|Khz)YM8z&V>KE-;xRlp3W^Qs>F9ahL)Mek zgZX797E|+!=C}bHO4m%%ZC+6jWrAO@n>82O-$xH8)bq&9NdLH+3itHKhMk5%Ips$1@ByW4 ztkJMUXyH2uH>RtA+Z{LAS~1rdx1i(jW7A`-#<$8#$XLFu(*2_Yltmz68K) zJEy_d9YfvRb55Bi1&f&UW|^Lu7IMdOT;b#4AHyGo+eOeM3@M8%yC~NcVx;tgHfFg4$dqe9v>#K>5zCZ^J3t(HE3(|5Dky=9q zb1ayn0@eB^T=60-5haf!AHN9t_}Dk{eq?uKG8I6KRZLd2$hCG|+3CdHXvJsbJSOa; zQd%#5e3K!E0iWS%O=E(+c%qmWY=v4#LMU$Lah0P-HmD5Ye(H#8h#Mzg*-5D8s}>1& z9E2NX8<80y8jL{tUXL20K;U1_`?^0zSHjNkpT(U)5Ul6W3#|)@1K6S3VaYMggCDpF zBtuVLJ-~iwK;bF&iY=H*laL>8o3x&`n(-4k0o5C_1BNknP10%7z`%P!MUOyuj-&&) zB~cjo&+)hDsO8Az*Ir)p1PC*_D2{)zQlC&i%+$-=80O17mBod6b{0m~(AW{Mg*rsW zL?shz6P`Yu7iwg06f=3#`r#8>2zf|-dmzJ`HwGiS-&^whG=!9QQZ1#5Jg18`I!58j zP5d%uaueYie5+PvmeeXt44uq-O4qHS@3hMAYkYVkn1lVpcambNL^v(wI7PCUqADCA zKF(3eek_}$KV4hV=o)o&aO9VUTM~WBM9*!e-x1Uo+$WJpue+}sRMtJ!J;i*cc&Y5y z%f6!vv~X1kWifUedr0sUb|Bt#sWhLk@%_Xv8T z`xvz!6=C&aEpSB`PwRZws;JI|$G*+dJ9!i@1s zMT)&jO@-zq^_K<5B}7e;g^GsbjngK_69Vl5mjYE2-i34e**b4uPn2`o8_s#JT|^)6 z3H8l7<;@oR%*ge~4R`E@4uuA)+)tjczj%{qf0l-_Irpo@|{OsT>DxwK(X_ zC|3E-56t*k$u~#V+GcJZq_(G?i>2>`&Wv9qj{*eh1l;3yuWN&vazKEw`8e{jSwSr(!;A4v%t*hjS6!diGF9bqsrkeq=fYQ> z3RG`|svN&cHZ;~fE&X=*@>j^39IRs*taDuo|GwLuukkGBZF+VJr>KNW_Rqd|F<KA z7G`^!gnYpJcUnJ22Vvp%(%4AmUymLQ%FI2U%b`X{I)VtUR{U`5;NzpSImX^$X~Su; zQZO&0!`3xuw@q>-SWe3$E5X}_euM8${(F>|;F@&DvMFVreT572JZ09U~q z<`8QwT`lr5Q!;Hdijw)@Sw#1S#uof+a4^UU{M0w^%=V&kU%#sglYWYx{&w6Sj3QX? zeq`k3Vbssv!QjA8qxvZkNypp(R=}cb;8T2XNvO1E9leCnOs$4tN^%DeYmi0XMBtNh z0APP#tb_0?1hVW_v64MK{R*hQ$PxI<*?c9H7~{JfMkAKITwqmrxX;`@=={B}tn%J_ zgd}w0%K(yvqGqit(_g@IlKN^p5`327U=&e!==4e#h=D=O`1}7Yg*ObpP#hx7MpMUC zM@3oG4B)_NVh%91;PiBGLbb-g5cd>CeRQyJHKFx%uy+KCdP>m!*+LZc`S)cmI@&** zxY|k3>8QM>l>xX|&Q{XYizYn+!BKrMH*Gs_1JQPYZjUmo^R- zjzH8sBzc6n`NjY2@V~zL_bvaUtM0$M^6~#y&;R)5pFPF7e$U`PX7rEc`tvGky(F>3 zx&F2Gl2|8IcgZj?q%jm;KG*cTwLJ&+iPcW!x&R2g%6)%N1*j}m5m#CoIzEl<%OjII zhEJKGDj(uaitD1P?}_s`l{#pohGci^Z6N4zeFq&Z@14jUD2S!XW#bkRn+PUlvW+v{ zlb1H%aXP<7jI!WxPzMt*sP2`=GDozbd6mpvA9@uX8#rH{ z?ZeuhzsItI7Vahxq4X9etF37T$aJeQMp_h8|P1Qf04%TIHaRS}NQKb?Q>h&9POf=yMwuO%=TNWQ@ia;ghzU!^%{g` zJ*3}FK1|^vRrYr!*|vDmGHaJuHY-?TQL~zNH~@QN@%XkcKB~X0nm+peSl>U?&HgOm zd+GQCR%4_FbLr)~%9?i9POI6Ckv6_}H_(@8EDha;kV0KmS_w%_QFou(cNWsR8FUaOQ|x6MDB6 zHFNjgj6cxbnsx}}KY!mpkD9N=2z<}KVW;X;EobdD2_EU=W3m$;bVkr@f!}r4KQTF# ztGc%c+*q3^2|7%i0RT1&WTfA%3;l1C`|HX&roW~WY=-ui!Bb-ZVm(NHXq6kaxQ}B( zP7=`GY?Y+?kD(tq!>Me_+j$Xxlrod8&OLm9U8kWghju-xU*1k^-g61`OavKa$Pe}7 z{hreP!xK+*caipckiykom*Q{g7fdSK_@Mr&@qJTDbgeP`7ulT}rJaRmJWsBFTUSZR z{KLQVwLd4`K#WIzlB5V#VtJ=Dq7e-;@wW=kuuN@PFX{&G^<$4NTZ+xhXqh_J+~j@ptD3*jM-e z7FPbb$Jk~lpXW~ViBd(oIkeI@TM4c7JJLrFu!HtjK(1()3T4u_Wtwi7&aK;RI@0fi z!U+`-l<%2{pHruzbt38a@0*7JH%#|^GdD5H{+7E>*U?%O zY9@CB{qEfKePHSPW+zg$MtSDH{ONDdke2(1;%_ehs|R;D3Xa-54QYWS&&sPmRps1Y zUGBU*GuU1&gmlM?Xha5iL-&_EjrWi$mfY8n6cniVbMH>RdlZ zk4^D1v_$0DWqIa&1J=FyoSlY;r_^_-NgI7kUlyotrUpE|2}@9&V^l24@_U^JeHuF7 zV+JFGt0tgP%li z*k@X9&wE(+_l7Y2R@@fO0sGrreuRLF{^X@Q;FDobm~hG+DK@#k*`>c`>GbqALGh#E zo}!scA9h5hTKk&oRCDq+TO$$c5ch6qI`?JQ_uR-I%z<@l?#?qe!`y;X^ zS!6fuygvaRsnM6qyvgG(nN+>vaDWf;We%_LO?$jj^}hKR-CE9SR?hM+phCdlwBgSF zsYgXBvJ-h=Ut#bPoOI*%v!F~{wu|PXqr^#ur;juy1jY{DQRh=BVUdpV7kxXY^+_>Ays4@JHm>=7R zab?f+UA6C3rV)Lar3NR?$GILZNRZ)>Oy+FfIKuCzcz)2oA7yu41tAtf8eVqSVT~4b zLTQkzRx<;*5>FOOfM(*osY-0JI9whJH~~s>iS}ZD_jhH z7U^)Uwd*fiJwVh-;k2~94HdckD5T-XC zHt<;XRkJ*MW{ac{;_Qf>rS{-z$}E~6Me;n`N&=17DgGbFqd3>VG@T>Ct(>U$>TU|d zeR49pekvs@1afX89JClry~$v^$+58&6%UmO|&^A{b z1{MDu)&Mv!9k!~Y((4lz?QV!_rBMMW@02D}LG3TP>}Jvho~&fjrpShxx*Ie|MIGy>|%)~=qA z(ca`h*MuksN-s*g(SaIJ4z!okg>h4(qjZ!5A?=TqZ}1INEOR%|OG@_ss~Z}9MWRUb zl~sWi`Zd3G+lz~qyAQ$2D}7U=D`r~mZ7F>T^oI5TuM31a1m@K~-?}NxUzb8PLQZWa z-UPGrs95{ZFBBWSP$&If8i^9U5QA?AZ?J>A2Sz9?KGiUPe^a9iH53+uA>KD)@hJ*s z>(lA(F#HXe{j~!_U{s^)@^QYKtfc-o7XM#U`oE_1e@*Eo!1@0gmHae><$j_F5f9MvKzsT)Z7coK2-d2~7_c0gk;`(fG_UKaqM)8r(0J1` z3Rg)F_QD3{2F8`1zJ5&rjF+MW#xy3K7?OxtmFy1L?M!p1mpj=iKihsiyBt6EqAg4$ ziNY@PVya<3Go8O9aiU1QvqQ|$$9VR-rCWWhzag1?YkATxhyK(rv%{E#a3of33A_nC><{}$!L!W1cX z3fAinS$tH%Ol zi3R7G@B{%j)0Esf!Udl-%;5xVbMs-)@`9hO_mgAp@JFeKVdsW6Xv0bD$NtnypIUg% zzVY>BPd0K=5x*5D&`LkE`BD`aBxbh7hr?szt$-A_Rg$qkzqB&j2)vRwGNyb)qf3L! zu=mDZDk*dGaMc+JIf;gpmrc5R+RYvu#8taZj|`B|_h`2-MwDkJUzXa1*EKC?m$Aik8dun;%?ef4dD(??;0{D&&De?^#axxKf77dAyy7N zg!wQ!*4bG=6yswm3o@5;r)>-UT#Ym(>i9*sZ9(e5`PE1)bODtAQwCIK$0wn$1HLqz z5Ap9yKF8!SIS5Zkq=v2GEQDrXlbQh?#66eC9-Elhc**u93vu<7&ty`ERh}*o@iqQn zwz|tPd}KQS>$BN#*q_iO7e1M08T_*96W5p{O!0p832yOd+=43^K#-lCBVs9~paAYC zc;Y7HtRfYHoPNsA9$A*imnr^`nooXwvu6JkLC$BKNvqqCm>O+w!=)PO5ZpfqIVB{K zfHzdfKSSpT&0l{zY0KESrX;n4-B{0ZG3#5AuISj-%w0w0%kr^GRy;79u{_aC*Nl?Sei#{Rgn01W^~5)zsxK+tuoQCLy=OS04&nDs&VAIm!c6`GQuH~g5pD0eFIxU=v{bYnI2kn7ys4BsW z!kDAKIvxEneFmW|rcCtee5Y$aUCOkZkbvc-!6M6Jw-LIH)ti*=UjBs73$S`Apl`OE zwCb!qHNLNCXgD@LF7GR27LII|r%$e&Xdus-@m4|V<7r3uf@ZunqN~9d?GuM1Qb~z8 z?rg*ZVG4QQA{tqla`~D0nVmQ4o(xco z&Iv^2m=!T~sOF#R=#clO&rt<{ML7f+mJ9V7X!A!nLSsC5{2Vrp{B*P?2?S4hmc??>O_}$QNh1_#9ze+NR zs%3hr3Oc=AH5-#!dYl-Tz~8`7^($jgjj3R2Ix1hs2dssFr49IbWh2<`5t`Yo?w+;a zjM8;?jmYcTgU$xlgMv9XnndzpC6WE`hcmqN3cii2W~WDL?>zG{V`h^*gaMI;xO4cA zcnie%V4*P$hEZ7>%gU(Ib~QKfe&1C2obf9~u8ovaPZAQe0Mx>QO5Jwp+DVc|c|4Bt zCLR0@J57m_QqgW;Ur9Lwk+O!U6)K-cQbq(;1F^o0T%&dFwqCewYjm4w7f6@ZR!taU zx!l;Z)=g}r{>=Y4C9_h@Ah3LGx=6&tM3)`3{Vic1v=^E&A)y}=o263HUL^$v%z~fV zSaWsy=E3XZtF$7}5ggLHx4k~Yv2W-2k(svf87l!6bt&20?Zd=M$cS=cI28EgTXKWp z)QJ?2-XMH;jmhdZ_ab!(FC;B8=fwqqVY!~a089S5gk=j{N8kNmp$YEDK!~LUkvjg2 zseaj*6LK1~tTtF^Hy3v_Qp`_D1-{m?_(CN{LGL|VUVgO)UNAS&lv5|nE@zU2cNJ19dy91TMK+#fzcPxN zyqK?Z2qWoCpKBDzcK0JO-ZD(e-2KV7pSrgl^?9!-xMozNXgW$$N2igNkeD-6LVqtT z`fRIuKP^;8*Nxpa#u;2F;uXJmpj0QZu^v5Ay*jczFn!HU;uL2=%~wXTMtSy`im=}} z-G|XPzF27}^=XUlUa6!m)C78iv*XMhuQ{GxV@U#&v!To6b6Xzom z|Na7DMT&LsM>VhjwaVKii%1&S#7jdNjWxT2DFPg~O7)of>D_!+o1JN`QeR^S{w$KG zf&yb5Egvywu5E2IMC(561WX$Ha@+F4q6d>|Q%;GAQTT7D8Mo^O?rU(6EA-lY$1f-# zuLRWK7aW6*&cNE4bLz#iwb+AW?S$IP?x{gTCWtwP6T_0J|`f~j*PBG zNEKO2C|zmPonN0#eoW5DZY#Io!Yz)8BUF#?8=Z$6TT`4~=X+*nbBfUn&yrROjPG9# zj>Lm?s4(qjN{kU{r#b0Wg2a8k+-agZ@j5X1{Z=meia3`01k5R27~u|!b?33Yr|s*|#buRF4OKH4JS41{iSRE^>xlF zI6L)+=jzP4nUXk);NdE(T2^KWQrA1nmDy|sQ1UHrA$@Iqj-uk-Z8Ynh^fjeWWrSXB zhC6$IDEr9-6~Lj(eDkS?6l|(%jiQN&u;fEdp|}5Y4gQj&1A~8SO}H+nG>xJ!)7F=$ z+pyZgfLk&Jt!Hz%R&P(;wzJPBqPrYTb$`VrXwL3?ugzdC#Mi#YW7GiU{*jk}(Deb; zSIX#UKRFblj^tolt8`RL(iZ?3=}|w5FAAH(jI2N#@rO%diJwvFf~hmxo3jv zHJ9T6u+{^;Ej&j_??FGm8=cWtwuf{CdhS$?cFX17Q|GqT45yKj?1-RVdAJZDV*nv$ zjxKs-EaEFTtV-8Z3RQpe#qh!_vE$tU7h%QBU(5O5hk`WqBOQ}TL6M@Z$OF$b?47a) zPui<99(FHS)FdV|++J2B*t-?W4ZqW~w}vJTq>Z|3uaG1kW5R-_!JjtH`8(t15>|Jk z#4e7?B(4pclVaT@5cP7Duaw4e+uNAG; zK>OrKRC~^DifcE)Ty{*;K#jk~O$veoN{sWrWaLLONLJZfP;R+n+nF8p%bQModX%0q z9JAK>?G8=UXo;`TZjw6~_sRpLaT6tOQ~rt5w(WJe<@~55Vz4hSIFT==$(Y=HxnPRg=jO1I!p)l2|ia6qMa>9LE2OoHyl;X5({W64%$8NJ-SiO$9 z@w^W=gNKz;_h|mCDm{r>wt-wJD0y`uJ}x^Kys`R9$}hYon_p2*NPezm^KAE8@Z)Dd z9gpPEXIyBzGu-dzTE~Uww-act#6_5}+ktsSepG{GwokP?3IRQ1tre?+DF)%N_^ zup0TY@|JtG*)o+-BbOuc=L*XvbdLkc)EWHWZu)O4@(&{t_Q-cGZLsz5zpYa0YbeTI z=*f^Txj)JRz`^zCn6M%@9XX1oMu@4`v0V=iat5bXrWSmGMibG5r+aV?oX>kYY4jE8 z5E~|0Zhh%A12s~5e5qi3)sHg5nO(iahUr!FolTwDEN;`|%)^Y$sVrywx&rsnnPwt^ zrV6&695=&--CrGD-v26q! zS03m;c)B!kXRG`~=bdf@9~C;dX#R!wgV9E^54a56x7M1GUhBX7n858N*QXq1cNhqe z)xb3?oV$KKE1FsNgM0iPxX_^Xg3{z&dy@~mfU1}zK8|rFGfv+5#81l^01dQO26K^u z4PDEDwh;Fy=1#%(H7mY`BONv*SH)#^FKIc7V%tRO6GRVO*>7(-E+zR9AW?^f4y6U3 zm7EuWxMgJiIB(!ikUH&qgr?DHuc&yuU? zo}E$#w*}$KjziqkKM$mb&H!`m=lT@(9m+EbE5z5>^@w6YxbkkR6FTLVW|}lpgi1Z5 zI8jBB;6gh`hc~ZzC7wl5hp0R%-+0rfUnLevEkPd3_KbHHi}?Y=XsV?1iOl(^B%j1KL& zHBl&jM=}Pdl)j<h&~Yo{klNbX+>(;04vppIWw4tX zWOqL%ryQ=}L-Z#DJ{@6nMjnL}!Lz{pd=!FO>?tHMZ%P&^d^MC+;c4A7kAu3@@w6lR z>dk(z3-0I;dMGOg)OV}Deo`J+9DFdrg)boGE8rV<__@ByUbBfR^0PTp^>GAVbiNknINJqhzkIUABIpu zz^Ot|T*Es@z;gJ%(eS@bhtw5yrrk;_+boK*l>gy=;!rAx;5aq6viHq?%A~@jK$6zq z2>WrQCix_luRyu?!@hQ>R(Jd^F&SiRFLb7t#I+`Fy7kDQfPl}p$}es67YAY$MX09^ zmB1sE<6GLDYnr@My~`XlbvfYMZ5meIA|I41*CvmLs7h(eN4PY6p06uphB-+k7QVBW z$~WD=(%LZwi6T}5B#qUmSkac@9iR%{g#RcX_2H)8qoh9OPV1*=Bm(pK`k4#1_4#xp z0zU!o(R=HxPEe|`JK{c4g0qJO!TW?5^}X30+HE34h0?{H2{A|?Z8ocZwZK0S*ChCOoIW8uB=)?cEnSaNA+~Id!2*XT{CeMH6 zs_gIJB+uM`bDem${yq9t0~=?Z3%5l3KWKYJ(R~9{SY!5<;Bm*gM@MQm=-?#hMUxqY z={`wzJ0b4u@YAC(Lc|idL??BZ@tia1z+%g%6&q<&W|qFU;kx@;yg$ zQ@l6!$967W%qHs^PDbq1?13Clhhg(i@`MbThJp6_^}^TNCq+D!GY$61|3fgS14&uZ z+!8=jTC8H{jW4B>bzMgA3nXlfD!G&rdq9vmR)d1%&lxy7FxBDhuZEhEbCS7!l zEwwW^)eFw2*B5ZRQO@`PW~e!kXqDz|XG=Q=@M`+BUdpiaFH%nufpe^04$t#k zPh;hAcs@YEe!8b*&({>9^wWr6;M!e1nzxD?VYchQXWFlUnOT}AqL-8$?fkbggltZp zO4TXa_o}cN|3&bJ{+8ftC^d-E{7-`KxbRd5VlHo=D#dzI)WmFAQn)#*6u*~e&)rR> zA4OD$+qoSQpk8&=k^u44udVQ)sREyrEKPCw@* zUd{zQZl}-d5a}E{Z4&AMHd?6yIBI!CsEA+|SkZ&ODfvt+aR(;ysxM^(#mS4sP*^y) zH~OKJaajGkLp@FXw<1@21&>9&Kly%^-A#Odk)VbIdKnR9)*I?IcWtSco?RhM%&AXO zhf9f1yoRbqT1OMwH!~9cX#Ewf{@7f;zxyPM3%a3hX4<|n%9DSV#6mttjGgA8+0UGD zy$V~h&o@0NZe1!+%BWHqoT-nPA|%{y)sXU9C;CKE%4;;8BPOa3lHe2{xXb=L1kLec2Ha;t50G~{=Xae>mw zx9Pv4lRo|w7w)5Kx}CTO(@N1wqo_Nq|E~FqdY^Pt8`3`1{QqAp(mh}M5-;PsdgNv> zLgOen#bA5aXA!DY5kfO1DT4G`;F}cihot4aAW7m=z_mr;^p$I0l1{?t=Nr`kII%F8 z+HLow_(b;WIrDyv1>3Stm2Y9hun#O#n(cjw-NrVsg%cZ*W%3ot86}F;eI3jWoc7#B zU@mt`NsUiCt|U}-;AHKEoX%>JFN@CB{YwCtU?UY^S{k1|8}Rru^L?WNAhR1kL3v!s z)gC65A7NbY{mkq7F0GtgH%k9K5@V_yRIp^yOUhi#ieJ`Lns&St;3;KEtkLvp>)oI3 z9#!ba=YgChCH(Ph&*!Mp7k=%7_WXVD{a&C!IG?Z;gcVYv6cj)d^>Uoqk9@UgadBYs zLRm&R$!KJwRJFY^=UV>q7rZINx-c~VX#9!|$vF|l9%YSFG7_K=d0aOtN$v3^Qi){6 zhkqQJ-PFJp=U_K8!VgzGaUBTd*dN;NE<)wXi_aBj-C;f3m7L6W+MP?B0r&+psU%v1 zoDqjR#nURI_3XCd)vRl8*~8MtdzMQjj3dPqr$;BU;X>_Wp()bUo~q&pKlPWSxQu2j zl%|&sy!KC#HtNcapLPxjM!urOgL=H`B@`Bw;I6!CJWvBTG+Zs|-Vq7C)#$N2%Ciaq z>3_`hilPe6@~9_1o#Wn?!)?yz8c}NM5W2^JRH~hQtvBV) zYCZ>$no_A8byUXua=sFuYj>U)0W>Pq5r=>F^gd5jANs*|?Yj8^c-KNC)lD?@baH;B zCR8-`@jwY?6F2>{2}oxEG|R$yt9{t{os||MK-(DRSze-nU;fqEw=LkGabBQW3AwrdW4hZOdW2o#)ifkOJpJuk^1LDp>iKf_Vd0y59~+F zFAI$m2vNE3Fb5R*U+oAo^D2|woYkyW>G4ea3y#vEM*ZogfAw>T_RR!KdXM49xGeh8s z!XqUsW>u6(U~8mdV&beD2C5vDZyRoYkiL}+JmOp#`n~u zVys<4Xnwqw!)7Y_xYY9c`-!(iiU91gN+(fQPbbBmL@&{vWcr)qbLINwMuui`G9m2> zhv&6kEwu?A=3Zq**3S(DPIeS_%mWPnndFZ9P4N}Y^tU$KLIVy>-)z~PIfiyCNJ98( zv=1O{Pk~>QQ)%?s;LL-g1kB{*8O6Ky;iNotauGG6lGoa&?LGN|<;z8TjD3bMU6dqX zAE5A}%}k-Vma`G!<1N@nCFF>bBD`3##f3SD0ZLh+TBQdCm}Xm-`XlbX&v)MsV_>j( z{{Afh2PyOH=8tGK=J?mBmqi}(aAg;)B>_4Ek50bOGy&g4Kd*cVEc^Q7$4Xo^v#tY# zw|mtV<`|L`piypO8ie3ak2s>MSeXm35;NG`=#6SJPHo@^KrdBIOitc}H?Hn_em6Cn zT_87VAZ>a@+^6yiZdg?5qS4HwEh{P)PEkUWzWaT&r|YB`;WY8@xY0|*RI?)27DT*tJh=~cYxRN#b)8ECH944SwP4VrFiJ+aF)n}9b`syP%`*4K#-QKvgnT)@ju-->lYA8iD&vDlj^f2+ z$FC4WQknS@k{8{IhE%!}m34J}&aM)xwk>*Gq#i9@oX$TPCMQh`HBME&-8?KJm8enU zHZwSwvSa8pHNW&?ASu)PYI8E>ZeD}L{6Q&*Q}^BEnD)e zIt4_&P?1OaS$$z<<108}&N7qh2!2d5YJ4%>SSJ~aHhIwYrdbRd(`7mtw_`aO6wm80 z|EuUE_EU|SDsTNZR@>|WFr}(Q;ZpbV;K=LkEz36O_cnY9Mgw@YuB1V&`MCv9ytG<^ zojtXj-Cc7hg1%df5+xpWe5MaF8;sQIo+w2Beq!@aeA4d^hko9YguS9jJJ;KS#Nb0q zO*kFUELzP8zA)Q;AMyV+8Ix99z9(tqa9l^TS8U1o~>gOQfK`uS08K2)nC6RWrSuf$2({ZTDVoRdreuX;&c=Eaj&yqh zu+|^{U2oG_h{@zpsP3tvtO_ZaO}wj&h`Qvj5zJdYHor2NYoTe!1s`mAE*x#}@YJ-p zS%4G9rY7_N@DU`R`_(lePXiDy(Lkbl17PN0xiwg3vp;b3Q!ZS2fo_VkypCq53xAFw ztO1*ER3iP*%vHf=cBFr|5N_|v$_e?+_)qvUw#tRZp(MnR66x)Ur!$R$yQzqP$*W3C zQ`6l#(qvmRXv2>0m;PsaYgYkzsu$CeVtCBxBGP7Vk{^s47?&7&s{HLOIZe}zq3mRB zQFeA2#ZNte!~Y=W=A9!2BW8t$b!CIcQhv7tvn<#xi&{ zeSX>-0WH7p@+AInUZvEpqra4w0&8`)&QqN-x3R=QR`(z2b8{+PSf+h<;)!{Wm*Y4UCzTilK^LH8l$A@vlM(q0N_znlKj+-RJ8p5cFF zx{D}MA#Y!$tvVgod-`H7 zfvvrey0>qSGi-DVXBt?uJ#_p?hhZlT)urf4@ZL>6D4d=@$@M@k7PPG;)`4ELp?>FL z16KAsGtLYOb_f1RpkW6@^^8ne+U0J=7cHl5_1umJzNMhKjP+vJQdwfD^|)CneCRW( zSYq5vz0dH_UQ-gn&?D*|-(a}W7f@<3xH$2HTT4gyI*?`1$U&;6a=mAzH}_Qo84vJ@ zT7%?NSvj}l*`AeUX!Ib8JMW%w_vd}y%OSKX3U?@2a}(=35a~5N{dQ;nm8|>_Yt~ei zGNg*lm>6{Owxi68NIglvp_+e=(f@AoL zy}b9q(Nr)#z3Fy>Gf(Xgp@)V_WjGs3`#pKVJZ5t3c^Xz`mjbYt!|Sv0TR5z_jZ(_M zvYoBo5?Q)bov2V0fhO2G^hh>*s#DAGSZe?Pwz5!CDqFOB`MjkDUQn_#DD^@BO%U7s z3;##!4~OExR8{Qsg*H5|kq@L2#VqG_L!GR_&WwaJkQWU@*=?16znSy?hi_)>UHp>? zpS!X8Qs^IIiTMoHd;v|vPHKEbZlD5py<^n>pp!+PoflV+{ zv@vaA4W>n?!|K_X!o^_VNMDBqIOY)A-|XOid2b;0HTJOliOyZlCh5@@9G*&3w}FT% z=q%aHbd$$?M#Yulmag%P$L4@G+RU-^+n+d7d?<`MN|tVkH5;5e{a%#@tN|F$q$Adf z(bhTtxoL~yh_tJ+hfm@LA~NMAW2fI&Y<+%0{3Hz_1w}>D-WrVP{29Yv&>xudmt?|ss6?1 zv$52e*1N0K!i@hZ%l!AFRj=GW$W>DHzC|VYSMDCtJx%I+_&GtK<%wHw<_)g}{fvGv z8GRJZZDh{;U%Xs$Lh8JsI6(2n`MtQ+3*&sccF#lWuPXIG6-04ZYPq(@dd7cb=2aW{ zv?jl|~MIkbdr`viEtnY&(i&&VrjnAIO0*bN&M z&=#i&^K?{R(WeAMHBv#0@h&44#H`MgXY%*$a}R?7$j)go{LKTxhZ(Tk!%$V zhsSRQ_Bav?Lh@=9V}0Ichwf~Rn3zE6 z)sI8c<-F`XtN#jwT|L*cKT??5%BoiD)U!O+Tp%ghHyAzSsj8>56|2x81w~2X$xfAJ zpY0f*;0Mwf7xW3j)sGmIan9t8+sbLV;m^R_0}m zY`#yzgF_Mzx8d_=3PGw^OSKDjxC^}FjmI8fveDXyk7kNtP^9g^SombsS`1GSs!V{K z2)OnV+E;d>h!ASu&a3J?sZ9wi(vDfRPmP)`=~z;mpH|VCe7heIkJJt#MjoV=xIdr_ zQ|gT_GVBE!iYh@&VV(nNZRG$SpchY&~x zM?pY9MNmQ$5KyWR2~C0{B`^p`CqgI*J%LmL1W0at*S+&DKVAXWi3-Rfu^%{B3NdQlOg zI{)(?l{V}#V~PoFm1lJZa0+jy@o2G2jcQUdF=75Be%-gUS2LIesZZhGm$Yt<+T2}dKMM7srms~if@}PNMkYCvn(dIJZR>Uw|Yi~#OvfXice{Q zA@t#{69Wb3jzD}LIiKr&+=>AWxZ0^B)p@{+z&L4ovTfp=k)z|)EoB5jt2pj>Z9{AOU%>a zQDOeBxRd8$<;e!l>0Y_ez_rul`OGe zi5sF+Kag4P^H6bd_CZ^SVRkfRS_3!dZ7H!57?c#h~WZ z6bW*#mXeSmafoeM`?7?cY0^Zl=?QBGEBS*ey$Q1b-FEEm75_1|wj*P`J53F@{mIc@ z)(lz$hh#KZovF~Ct0W!iI%n$T|4`E)4R8cM?5jvkQ_RWJwp+d+Bi-A4?D{piYtwb{ zXK94lsxVqh5Y$K2Bmn%snJ6f%;We6fvy>oprs+8+)hhh&!~uIeENsvQGTe1o7# z(afpWQ7*3bbQ0*~2}Tpp{?I{qhLW_sQi82)#;IymJ9LdkAYFT(*f?5@{=tRy;Cg+) zc%ZyRNO!I072hGd;Ha%0)6TsDr+hs}D+h;Qv+>lj(d$jnxBty%fRp$k0#}&cgFH^a zZ}rd{X$?(RIF<#fO$W{-$hAYvb3X^vm{8g*%Uxu$jw`w(2JG&E-C6q=X$7np*jQIBaQ^}C#_0L=wTIFx0 z#l-0veNsTaa8{Te`Z?>+1#zq%^Io*mK#KY97Cc%Tbgu>nPpl!q>s9{FSiz=GfOA(n zr4a{rgb}()bdao>ki2X?xDnj5cFzy?h&_X{Wv}7vFA{7te_e`rwvCLct95tZuBdB@ z`YjSL!h_ued7n(2qcoAL1mHPWJ?jiKZg=B}f^#fPjTK{N<_v;uK zel%BBw|u%(qEu;2nyD))7KS`RL)nIHUOhH>>=#)GKi+tzn%H*lUwcQNh8|UUxp7;6 zLT_u)T|ZMdN)0d=_U2rXS?5*REWI)0!7f-sCo-F&3EA-0m2J@EXO~tk2`(3L2QxYr zFWP+RhJK^Em`}t-XqS|xoMd?G15x2+*N4^SI)ixqNd@)ceijZ6hr5)<_M@Z~;|qp{ z${F(dQFkr%&&?mu-ymr{hkcF|n{Q;hy(|v9j07|D&U}c45{4W2r=QlgmycFyth~Q- zE6W0Zyc@Wy;Flbf7fgNhvAWN{@pw`ZcQRDV8w@(4l6q}X_mekPCD&YU{`tbYK!2C# zp=nN+!u>hPug&pA>dSXb-ZX9tm&q7^*IDFlrpj$y3(uST%*rlyT+b{o$~OHOcd5+1 zF*V)9$VTTxrcv==Ki11*57zEStV3ZZZP3VfXMg_7pP$@0aM>?SBg05HU*~R@)!-v_ znVG75p= zW+^1k>1FjW14Gm|w+6?MZV_pmWfot{xE<`9qPSal77g!5< ztXfZFIwKYIwB$7nh431+s%j3ZMrfp7cgInkaaR#M_Cy{i{}55#cz;fp^C{P9M9Acg zB8Zdi*fiHZtT~L-UF+>ky!_{;D&|1d8X$-$xtB5+UrfmaY*t&cU!MiDZv&(F4lZk% zx>t?SQyo@Z;kpV79lp!uJ>r5}53d6fhjVtG$SFUsALQr|{$Sjk+;@J~IhbZ&EyJ0v zy8Rk6(q2a$(qJJb7m{SnIH&@&Or?@wz79jhzla!wc>6`IraLjUwMUh~daGz{%sEQ^ zF>0x@!GSo-vPXV?iN>7OuKY$^`1sw_a^2Q$l8<7y1#OTDpyr$aQD`)~Ynw$aXuBKHq|9yTkT_Vh@|ixw>r}sZSHEI7z~n_Mii{R_z;$m1YgT{Yd=JeBbI)46@iV*KnkR zAee5hP<9m%!jkBe;0l97DHHX-;LTt8g!$D@0(zAQPl)6bZ{(4{9zauf%&2dGezOOc?>*12u@W@}>z!qwQD! z>R41u^XM|coM(XM4H7HM`F&VVn1fo=x15PTszKOb{{V!jq z!Lvb`1E!!)%sG6oMP)W)xPB=oVwtqf`VjlqKI7TU29GWtgJ`x%Yxx+3vI#B2*545< zzOwKA>u#lGSv%N;0CT332|oQ5L%L~_(Lqz|xGK->866nI=_a}GJvg(Wecqtu*LU{$ zjH;b1ddzYv)VW?K{YL#|ZEypekvA$N6CB30^o*8E{2wY>0uu~uK7KS+v*S}fYi$<5 z2lxvmP#7aYQd<8&oEzzwde#qfl48o_6kddSi3YiP2wg7kcKBvLT`$($Jct}d;>bXM z`ZDK2{{;cmL!JB)f>Dc=b4evDaOX+AG!LJ7im83Et5;|Ja!xslorLh+>k8Vj|%}I#fL@{vm%=Ck7tmgn*cgveU+|%zzqo}KA&T^h9>(sov z3LSX{l`L|3>jZ)zkUNLVD<(hW1}J8G)>bsVP{LM2?UI}4M$n4nbI;#aA_ePzj(k#< zR4uJxKmMY8{GftZdMG@|T-z!HWW-9iyuXCrwFCeg?AJ_D=6?+7C4RWq_5|W^0XWi{ zRYIto)F^K%bg+c*|{H@aGtJwpq6A7t_tWl;0spZdQYlRUTg!?ZEkd9WiH2=IHn5^Syrl(@lIUOMgFK{}=f4ayrI+z;^yx zFHP>)uNId7h-d@5N=UbKO0fiD8m@3UX8L1#%C#EHX4LFUkXY0fIU?Kl+`_%_wHq3R zDKtj5>})9vXerpCnd`59e@Kjb=_?*o0Aqa5+jf^!WNGE1izKD@f!7wLaTPsnd%*^B z@NNIdKk#CwbRuG_d$t34G7V~jyrz?G>-yKyZ0Qj5!`pyq;~-CB9E(+ttYR2nZed41 z2o=A{?NrJorNeU>w{py*2~__X$DuR<7QyE(>Kg_u&Lw;-bTFiDGGy ze!qAO?QPwvf>ro}ZTp8?yMCIP_~hYM#)FLj6OP(m&Rgcdh!k-tb0Vn}fJVAfgZA#1 zpWBDL8{u`^eJdgm&4am7y+gmP{%^ROX?7|Q#$9<{dm3ZuaKVuL@rT$U_*lkTMY8=w zmNGocCwZ;MP4SrWUg^^FXt86mAASY_p0OtDBVN}T>F8g}hce#{d`#$S7fS0Yj9`*p-Y-uLJ8y?(^DoZrva mcl;5{5#Mq3{}b;Bq`R6Nx+bjI1z-PuKokKb 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 literal 0 HcmV?d00001