From b427907a2483ed3a2e4916664577a78dc8547f3d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thor=20=E9=9B=B7=E7=A5=9E=20Schaeff?=
<5748289+thorwebdev@users.noreply.github.com>
Date: Wed, 19 Jun 2024 21:07:56 +0800
Subject: [PATCH] blog: Protomaps Supabase Storage Blog & Example (#27231)
* chore: add example.
* blog: host protomaps on supabase storage.
* chore: some cal blogpost nits.
* chore: add video to top.
---
...m-platform-starter-kit-nextjs-supabase.mdx | 2 +-
...06-19-self-host-maps-storage-protomaps.mdx | 198 ++++++++++++++++++
apps/www/lib/authors.json | 8 +
.../calcom_platform_starter_og.png | Bin 53418 -> 103246 bytes
.../protomaps_storage_og.png | Bin 0 -> 36699 bytes
examples/storage/protomaps/README.md | 31 +++
examples/storage/protomaps/index.html | 52 +++++
.../storage/protomaps/supabase/.gitignore | 4 +
.../storage/protomaps/supabase/config.toml | 178 ++++++++++++++++
.../supabase/functions/maps-private/index.ts | 36 ++++
examples/storage/protomaps/supabase/seed.sql | 0
11 files changed, 508 insertions(+), 1 deletion(-)
create mode 100644 apps/www/_blog/2024-06-19-self-host-maps-storage-protomaps.mdx
create mode 100644 apps/www/public/images/blog/protomaps_storage/protomaps_storage_og.png
create mode 100644 examples/storage/protomaps/README.md
create mode 100644 examples/storage/protomaps/index.html
create mode 100644 examples/storage/protomaps/supabase/.gitignore
create mode 100644 examples/storage/protomaps/supabase/config.toml
create mode 100644 examples/storage/protomaps/supabase/functions/maps-private/index.ts
create mode 100644 examples/storage/protomaps/supabase/seed.sql
diff --git a/apps/www/_blog/2024-06-18-calcom-platform-starter-kit-nextjs-supabase.mdx b/apps/www/_blog/2024-06-18-calcom-platform-starter-kit-nextjs-supabase.mdx
index 63c35a12a1d..a9223c9d657 100644
--- a/apps/www/_blog/2024-06-18-calcom-platform-starter-kit-nextjs-supabase.mdx
+++ b/apps/www/_blog/2024-06-18-calcom-platform-starter-kit-nextjs-supabase.mdx
@@ -206,7 +206,7 @@ And when using the [Vercel Deploy Button](https://vercel.com/new/clone?repositor
## Contributing to open source
-Both Cal.com and Supabase are on a mission to create open source software, therefore this new platform starter kit is of course also open-source, allowing you to spin up your own marketplace which convenient scheduling in minutes! Of course this also means that you are very welcome to contribute additional features to the starter kit! You can [find the repository on GitHub](https://github.com/calcom/platform-starter-kit)!
+Both Cal.com and Supabase are on a mission to create open source software, therefore this new platform starter kit is of course also open-source, allowing you to spin up your own marketplace with convenient scheduling in minutes! Of course this also means that you are very welcome to contribute additional features to the starter kit! You can [find the repository on GitHub](https://github.com/calcom/platform-starter-kit)!
## Resources
diff --git a/apps/www/_blog/2024-06-19-self-host-maps-storage-protomaps.mdx b/apps/www/_blog/2024-06-19-self-host-maps-storage-protomaps.mdx
new file mode 100644
index 00000000000..5d789ad8d2e
--- /dev/null
+++ b/apps/www/_blog/2024-06-19-self-host-maps-storage-protomaps.mdx
@@ -0,0 +1,198 @@
+---
+title: 'Self-host Maps with Protomaps and Supabase Storage'
+description: 'Host Protomaps PMTiles on Supabase Storage and render them with MapLibre GL.'
+author: bdon,thor_schaeff
+image: protomaps_storage/protomaps_storage_og.png
+thumb: protomaps_storage/protomaps_storage_og.png
+categories:
+ - developers
+tags:
+ - storage
+ - postgis
+ - maps
+date: '2024-06-19'
+toc_depth: 3
+---
+
+
_4g8BrsnZJ;ywX;rt)hBFl5!0q5kjrA0zxKO`a}{A?$G?gD(~|IE zX@Hi%=lv$mxV!^r7yCW5b=MGUeY+Xs6$3DZg#>lW;JrDMEgzU~5=?v-8?!l&hq8~8 zrueuH-#vbL)Lo&dNWc?!L>i?h4x}G1_#(6+yQ{!ZP9uSpvuCYN(ADf0PvsNW#OT%! zadZ|OBdo{i#HXHzL=2Y&dH)~slLM5iB`cx<*G)wN%4KSS#;8^(Zd}d>Za~VDx~&}3 zz?M0fF;^z2erFxEwGtOM1dqR?n`(>W|J7CJ!gr{kO7@2d`LnF?b&{0_zyJIeGdY z%ShwwqX$T@y&sC3^SM@j%h|`HQ(MSouFKT}tUKx_o@|U8 z8%5BzHyX%AO=WZt_K=<-Kpd_h6lVM~&;LYjM TzG%M6SMq5 zGE4cN_1OpM#Qlwg`i-rqu W@$fpe5S|v zrTiWXaGOAkHGX&10r_>s!q0Ewa9kRsXKalR9BSQm?ptEuz_ z9^MFjth^3zg=dh2D|~=vfk69i)XC)%n7&spML46lYbm<6>v6nZuSgiLKjdPuT&K l?^qy@3vOb{wh=a5nzLvy*+d &8u69?hfAW)pXb zGMNj(tpeD_Bx+N-14|y?l?UqrOA^RZKP_NMckcSq0Ne-%S;ru0Y{&Duv!v$?%4E5p z5SB8~Ush~tovQQ9zrJF{1*Pg2y&C?KC!Q3jwMdzAD(@r&kfuAk&0n| 7-D1yrIvgkS z;)^B3!5y5&5D_@S4bM10;zUDR8dK$r1r~nE#)4J2)q?9PsVI_2)N+EycE0-Z%g6fu z^F3#gEBZ$r1&xP_$fJ}nkGi9Mqfu9zLw>AWv?MUnPk@|Ed_QY+v^}w3*cf-5AZ@}{ zMQvJ`<69jHz{rjXLj^9E?yu&SSk_N>O&sGZmQ`3Q00(BpjS=#|lt6Xg+Ly`To@mY| z&JVFE?Xqq~FJ5lJaL#SyC{~)|R-oTPPTalP(MP`PljO1EAyf1O5lL*F0zWp9E?3rf zP5KKf1l4G2Q$?~Ti?#OmaszwdROG`sY;M1~9`;*J-K(Sgg7N3Y73~Tu#{{s%juO z-SiG3 j$(qh9@4@qqQXaY~Rlk1Vf#$ciymKe$e7Si`GD78N*^31&3N$QLI2 zS)f7nJ2YITt2y24*8JEjFvTa?p!&BYC@saVPA7jM7Zte5SXvgq?37wlY7%9uIPKU? zj(QVaVFc;+c>!P>Ft{GSFuKM!q&4-gA1@PM>=D5jI^E1o(t1=F{=v({(Sw)B*{-Sl z<8I5^2yoBuMbOTr3-ABM%sal %ZdGau8&o zb4O<&CB}q!RjD5`P`Le?IJoK@bQIng>`q3_OA7nie~10PBOJ}b0HJa9j(pwLY7ZT8 zWf1ALlo+P~BjbGa&x!Jl4G@a)lEf#6p5Fm{M0nQI1E2w2OdW1BCRuR{RJUPak4K&K zRB6C!#`nDO(!z)zNj5 c;iY+?Pa%Jx84ALSz%;2*!3TEo`h9-;JlOV$QXGT7 zKl~4}dy*bbNqTtCi8=9&_1O`B;Bl!Ame>osi%04tC$BWdM#>!Bk&)->0jkmmYSXJ# ziLLwKd%cnZC98Fy8oimdvI;6G&D}By5y{}TLld^*(+7c_N S7m-TX*ckG lkO#@fq#tLmS;bQSHh$@C%)G( QHWUya3d=)at0?pz_&g?em|^Mj3j@zg89{FLkQj5XA5@EK_D;@6)Z_`8)tK z9Sgrh{#w=h-NmJsPo9Y+N%KCu+pn9M{2tQR*VIBOYT)DqWe=2tW?)B{A%$yHLl#Hc z4u`kD{t@$C@Azx)Q(W!uI)D6eQrQCSXBIL+j8;u1R@mv>@~%O8`NE7FL`1#mCycC3 zB#$;Q OMnTL#*pX7F5tN0$Pbn}`!~fl!T5j$2 zDzZ#$$L-BhK8!WAyi`^Y0~XPueK-`6GF-UsyRH@HekI<74$5HnKE~TdL?xh^c}oHr z(wmLFKdd%blEWiy-}7}EY8)G$&j*P&(O`uvZ_agwX2-ZS8@xe9yt@+Ww*2hVNDCz@ ze9T)Jtl{P1-NH+OMsAI|%;WmMem^-JPWmQAZ<=)4 { zyZ<4R?ZW56_xHd#+_ZOlRWS?J*LI;V0o&nF>Sdnh@veVZHqa<6dYOYv9dRDKc4vrP z+VbP*@_b9zlv+a4x~cXc=kaDOUVXRT?y|klyGGtgsBr}P|NB^) !IEUW0gl8a}xO8Y$WE~Kvdly^sr=DEDKJ}(sKU`-OvIT zVV#9}G{blOX CP99lR{=$I8zR72CLPFW&y@ ziQ{b_Zx%75h4{S~JO2KYb#-R9wmHjxN%_Y<-(Y6>=)}gByY6X*<+OY;=x7D!5DW9( zU<)5OOfRYv7iyGFFR!1>pLo84EL%F32`qcoB%QASJjnr~Exho0U%u!Mqbcm0T?RJN z0Cmw7Vs{y%FWsU1X;~!L(2MVb _;pT760@)TQ}dGAXsp1%NjhxKjuou&TM zY;iIWw$K0%kDJi5vVpdG2wKm;&zL2+^b53i eK>kfAZ zsO|p(=aaP1PKja&b3>}!uU%Xiw;s%pt4l5d3uGCR&b{3x@=ypuO>er+z^jJ{Y?u#c zH06^qF{eZci$_l7N%Q{^iob0n<>l39sE07W4$$ZoryL~qW+XVmV=60eh3C%*^9~1a zpLUV)fd{*ahuE(x-&58y3*z!Ibu%%$I)9cJOs-^J%bG0c^f;R5A-%8e3;;Q%ySvoL zgD&^kQHz@L7hp9~i|P|sXPL$M1IZ~+UI6hRA;RbLyD3qyjFfU{GQSPOUA0@+GCU<1 z^qVPBOtf(~z%nd>RnI| |u%}oqg4}d0!k6+P;!VJz z`Cq$Bdb!NPA_I~aF?p|Qa(#4yfSXXBxQX jE_-s>NEk(PjAfru0p;(kQw1u6!XQRG-{WnwP?Ex$~f2a`wXrS@JYXgcPWTv9dL zdRqdYvF+;=!OKajRx|09`HS9TFh{5}v^*UvtR7`4YV+u+{E{!@Zg|st2-^S1XLSgd zvNM7!pdI`9*T_nR+utEXq-=NZ5ifR(mN=!402sbp88lc6mi6c#9GUzh@-Rss@!sws z!F5I3Xp!_{3V+H5mdT;)9^6+&XkJW9G{*7^)&A(KsZKvDUeF;Rrhi{}6ogO|lX+al zEi7$0CpaepB}%upZIoWqzNPZXdV$Iy=a<169Ou{h-XFL62Uhd@+lHuP{vw-y@xAy2 z`Z-wVs0VBQXCVO42GkHg=zJxulFa@Fwf2`skiw427cv0UE}R{0ksO4X8fx+y88z{L zjEv5G{+ss9d85Byk-g0fl;vZ!46t;L{{gzkk0LeRi}9$uiRDuCCm^_(p1x8azMH4X z36H3eVq?sg+LK-> 3$Xe2B^YafA5e&wSX$N<3>tRL5#7_Tv{gkw-2lPsUWh$aIUJSHmU9j1~MN8^~B=N zS$u&&M9Sx;M1gU2S(iA|Qor{V=hJ0*Zp2|ta@O1BOSe>dc#Hmdx2=Gl^t${@Pc{WH zOGPo)mPhF|>|1YF1p3_XNm$k!^{ByR-IbI+jyN2*P7&*R)#MT*?{b&os)tQ%QqTTk z-rer61=EB;ERmY0t 8Zxt%_%ib`W_B~{fFuJOFm9pCPk6~__>Q=hw{LNcN!?Sam+O}L65Zibca{zxJ zxl=NusnK9_s+-F5G0s*W9ARPgHE|iq`P!xNKj?CqQG#`~kh#-K#sZr9^;+u)4W!V! zzCQfQ3^!+cS?VnlfE-nS1dtGFc4Ho!kx~UN5c_3$vtlW3TJYHLU=~f527#M`G19<_ z8;{@4C1PJ`O)qkP5okCu2T$*p39*oW4dMt(qCaoLK uY{Fcy!^H|ACsva3|>f|LbB`me)a$AEB;d 8F?9bmR%R1H5VAHv$m;QG z|73K1u$op7b6=%g;x7PdsT88vRwU#9A$$p7X?=^_HhRID2F&L}G;6BD^Z&Cnzi%Yp zQ9FU v5Twx!Rq~5l2WN NBU-cMm|LK9ZbTYJgO*{5_x&^7?``ZJ_ZPXQm#0Po| zr-}W(Q4#$(mN9U-=qret;#&%s&{}wFH2|1r|7A=ADu`x_Utz~kV+E pe=0903WT-m4Hos_XK5l%?2p#VZ^vjio~@!4 zUOtRf7@_C9ffM)H$y~oUq5 OA;~Bcyqm7 zgz3<-50z!lJ+i{8VI-)RfpJ;rhF#8L5#eRFl-CTE1L5~ae{;JEaFUQ?+ZB+e@VWmd zO=$w&5FU030MPp ;>(R4kUwVE;J5j5Rf+$j8xj*7D z8o_3fRPbzOp?lnc&Ua 8>Fx) zr)OPv=>I~29zso3UI*p~sI`r*6Uc6$g!nG+-?7-Uf8&r%-Iz(SlMg!*?BSg`jpg4i z^Yfal^vXf?^q7`{ivj89r%rwzy{ *gQy5M%b X;AL@^nUI|c(JeBhwl6K1e*2(;cIlbJ0Nt6ybE8#x3 zvR~3erR4nkLAVIL(xZ}B*Qu^C@!CI9`*?JfNi?@P QUg zRr=f{8ThFE;lJs^rvfQbs T>T#kc+q}(O}s}&wjpR_k3aVgj*$AyQ9A7({Q{fxY!P1#qB!Ya*yWykhSkWxN< z=%yjX%O~}ES$UsIX>EH)vy{1`a;)WM8RNV~mZYdd8gqDQV6nW%zp~-a9ut4mlQ=DA z|M4}__OuXFH=?$ZQnksJ`D5aMGC}rG`<)&lX0j#qyXG3JoJAeA%__&Uj)YK zkVGMp@E_2+{c)L|X|)I4yHab1{|1(NCoi!|I5^E>iY-CRi;}H{-H522%-EP0`%OsK zufI1Mkx$>XZnUW@+N5y#_ Af`L z^PGv&U+nO0RJQo&@Q231#X7fH3yysIl<+~OLLy1t)PEY>9eVP3`6# OMxy}7y#a& zsHU$N35w^_H#12x!}Gyak@_u= xIy$PaedzrKfv`2F z%2AeM=M`1s%~<5`qk2?QsBcy*MjTSWZ#N#!ND=Sy09oZO%rr4Y)c|o{6<@zmtcO^A zS=<~*N;s=*crmG_JcfVHIYQZPfvrb-v$6;NR>qQOXp3tz8t54^Yj7#YI5$|9{||Hg zrb*q)Cw%)Wr`Jm)EUPPS-xDh(o$9q#z$<}a6q!ur+-Y5%&-T$SCK?UOwOE_bn_5Px z>Q${_g2bqBn6qi|>N%}E_JMa_wT)6Ysr4q5$DdVAVrt-x$s!!N_G TIk&vlV{)Smo-%kIcb{nj5|cr4m! z2Xev;%oc1#YXL)mKDMTTvM?4 j*Gua>jks{%87g_}=78kx}B5 z8`>xHXbFA1^oyd7cvwFH-%N ->LU3EKu3G)3DiG7uYKnJLbs&pqx6~aDpW9p0
K5@YZ&Mzsomc)9 ztd#dr`bHa_+^1h`N|=iHWaS0{E+my*keU&oLibb=Y7ag&v2rczBh>DeOM{#Ox&TfV zmJyuwbt9Lxw#|Pr%)iazaAa_#!nd>H?!fUMedGxI;78nuA|Z_EXdn(wOKZ=3nC~PV z@1L3bRaM{ya*G?IgMY0R! mD8Ao}({Xl!4t;z*L(p z3zj1QGZ~BXCD5&Q*sy9z5>&W(8m!2tTy7GeEkf*uLiDPO)Xthr>B0{fOqA5pOv{Ct zn3Lzgi5~EitH~&5MAG4VA`f`)wiyZq)6*~A%r~&t2v&Kx7N*)+YMU)~^q8pVvs7r= zQ=O3Bi{FLt^+F0W6VU7`;qFC4wA)qSw85SUpFmrkB 6CH9?n@F z&$UR|Q^^JP|8-exlpIjcTS^EwS+@taUt(iM`2zf2OmZ&s6Xs278})wsvi`Uw4ow*N zXeIWGf{exFL`+)}*rU{IJ>{AGyfK1z3Lx5t_`*PG=cN&P(x76}Nqd|DE-ltKs~2 z5*`bzrtznb=Tp`0i8IgLO-^_&_F)(Qy@97asN}oYCMx<&EwEqvmK3JGoM@&7?y1y8 zO( h;gXJzt(fFYkB&%NV$b=4j>487s zrdMHTdO!JGC8#~QUin 3`l?mPLE3&-1&Y`${T@g7+^# zQO+507SRWmr)TXBm(>ACKXhMd>RjpfsFMas0bMcc;MiXZUzmX#Y;Z06hHNxNFsfza zQq=elc@^h>42m9dpWiym1vlIKo%-RXd4~M#hjaq7vf~rp(Nd5zjH|;F7)+@M@!z?_ zbc};hYC*w#dAmVEv(OwJ4VJt+y@|FetAX*a9 ||OKwe@XvmWSaQ@K-A3n(mco*);Z@O@mQrB-G)M5*{(ewa-?|%fyjS{|VjIzmb z#jgw-e-=MUx8Li^IcZR1!nN)DoW0Bpt+Z~$P@)>FrRzO6m%!ac49s0^64wfDAMR(Z z7mI-&Z1cj8r63n!U@^gmlip|j@gUI~r?r+%+|TZbrkM!q1K>FXmjx8gr;BaEVUS&} zJoy`~?uFt@M?Yr7?B&b#$97r1`u@?G*|czUqqv%HU00?DiIOGbD;hoX69^LL!=8_R zSd}ff7+6N6vf}p7!{8^mY4Tn%F@(TPLovQ;22wl`K^Edswkl?UQ6&b(ukLARl+Z)F zH6J~dO-nd?zI@S5=~5!CrC~TULHXQBf^wx8gA;W>OqjAuxuF2QK-{md_)_m^X*AHi zeDZdrCJjwhSV0PLdeQ6kGB+mm=KCX!pG_B;hjq#UgMXWPxFbfKt4H~6QnemN)$c_$ zH@s0me+*VA9%5S-^q&@tc8NQ?x#U2IskbVosjdrdFL0P1XMJO#&kSH?UnCev76q;s`2L7=T!l)2EHf#$2BA{Gq`TbyBzoxk4ix$N zAsKgX$|-FN#p|fGiSwh>n07`~>{ PSbZ`Num{R`HHH+dMou>S`ZLe0wjsitx8l1ftd$v#|x86SfMo%nfqF(*f&= z0-jp0Jw+Quf>W-T7c`r{Df`AU5zT=UC}Azic`c~VqJJ!XY2EgKlydpwR_?O#w-jV! z8z}QKb$>R!-~4MK6l8&F&!oEjO*FC^=T|g};+|#=R3EN=jUpOQcqP>pF?G)JG_h8n zc|c%o c-XCuV0}JM<(l$0Rpgjx)bEvlm-uOc zh~*!pW~f8`61ikD{{Ysed`kx3_?9}taV1|(1E$Qes2lMDt&yslx)@a&G>#&abi^^5 zCSjPg06L2Vs$G0V@j>-X|Ls!~D zj|C=Yc#7gR+YipUedj}u6XvB^i9g~6EBfwpKk=-N>YCu`jlWJze(>VbD?gZNyh`ae zyV&ijkMjEm;EQdh&s8mV??a@XJN6V>{7On?`Jsj{jbRFDWX)r2;yT(V&6Q3Qob-IN z`WT6S9OJEmn?9w|VSPskUysdJXp?!|wA;^lU3IcIN2LWW^tk(bT{(YJU2s9(9~sd7 z^We?wZ7JrbuTtvHrY28SPrunPp}2FmT(Pbj#Eohddk{ASYyQ=cRN319L+NkdlMpKx z{x2W$8XTKS$tX$p$1A3pJQUfaf-EnyLRuO9XByY#gI}Kw&!Zn6yq93^n}*jEzLa-5 z@NOcVoTfl~G+*B3ri%>XA y(Yphf;uOLFJ`pqI_=JkfuvWH0h7{3*%5F z){$4rPj<4=$0qfUQn(1tet{g_fi=p>JeUCeH}Erku5ZLC>V`>?gytlYfD#O#39;sg z9|Q@-Er~k=qPaZA9}+njMAwFyI3drnWSgiT8f&c?)agT(^Zl3dsTg9sSt)~I=|9x1 zgEr}JO*W-!^e|Fjxb_pcihpHoM$_@c21wZCTlBeYYS(XT IFWi-$NzN8r+_g{G z IRjzl3h^bzD5Ku$l^5E)mF9-#eE%R`DPKC{(7@f;2{f*`7FF%5*Rn@`v!x!kB| zOcQ-Y(wTI}mK`AYT5p`#aXf4wWh6F3{djd@rTr%2-Xs%uS{|>pA%#od;sqw-`4B=- z+lXL=hV(^?J20@T?Ez7SKP$2>G)Nmjif!K&er20Yr2azvNnDZ<)BReALi4bFH` z{icd=4F7%<|0J#aP0ts7`KL&{H1W1>Q6Z@a3f@~{LlrlJ>YFB&%}K2EjX<|kt&4ml z_Q6ETabNcqQ_GXN4VwRq^Hd4AIqixnx%%>9;Pa`79OdFk>V}KRf=^-)>L7~T7fP%j zN_djFiw&%`IhvOF2UYm}h`UH4Qv|tJNK;Al`Hc9Fh17qj`ORLJlpdK7mn=UQcI+^d zWI8mxu^G$Df`MAV!^ebo(+~dUEb>P_jEA?G{r?f@9wg0GOY&fO+e!3w-rQfBxPr7M z>8W07 4r*I2eR#eCHFc3z7?c!~=^xa 7(dUtJ(5 z5 4pBI!qOintWA1>-e5AG-J}(7_#INA>EqAP_^o{rMA!eRF~Q^}9>W z{y`=Vm9mAKcQ~9r)qJbUIbv?`J0%iCn);A>(DU+n%Xp$|!N;|m 2%@iEEgyYU!V}G1j18h)drSo-SJbLmOIlN7{&nVzzO|CI z8u`&pYdP9){P1EU6HCz^*`Pe$BQUaHsK7D$C_lQ>`b46$!x{BCM7TMOajHvf0}{;9 zu#n}O Ys$?y6|#{@yk;#!t G+s_u9*eyE2I1QC_IfF_)d<0M0q 4ZN-f4$)J04#_#7|@ivodxvnEvWHwkWPUSEA2^ zo@@5MX^rDz{&QxQ-Y>{ESAGT|-}Ej3Hs=*2yyU6148E8J-$O^=&SuaADd%^-JcT8# zY|nQJS 6?9O1ConhkoBy$o$l&q8 z|JxeElb%{|h##!)iRDE8Nqk{3Es 2lnnw#M% zdF?$MbKk4)_`Cf3ukOxjUb~*&pMLL&$}8Q?@DEQDLi(2Abi^a%3s%L0R=43II#RVn z4?%vFkg5a-!Fdg1G$Kb~8_Dyqp{a?|J m2xY2S zs*!mH<1h^l{y{Nqgp!bw*83ghTqTS5)#o0+bPvzd&?#PL_VH}?Ri@ylxH4U}Q96J= z8bRwOnErBWn5l+UgI+la4Fu%MblCsb@z{2R>ZBdR_YbDYE&y-;2vb zu~g@9bn-=JRo2lW{88_&SUe0Bn>Z~J5YPU# P|1&txDRTE-1$2~ zKw(SYlGcUI3x=5APoFzX7P?PFp0CPSN }#a+`BwPmIQpa+vUV+DabkwMm> ztnq#7c3!Fg7I`^2W~e$PG9XEb7cPB=hsC5Nx1L8%HqE)Bm5=Kjg9l|IP{3jr9!nhM zMUEsQ)-noshwY# }z2cX3mtICgd0d?!THp>FD@4ATXh@wVUEV zlBY5?8C=28=lOPDPn1J>#Ka*Pzn&@Btu((qcaun52}gs~vS7tY&T`&nR+)p<*~UCA zFTd~XV~Rw2i;m$@hEYlJTSDdWw>D}X0vWMBJ7am~tYaiU3sZd)v7y >k5eka zyP>Y9Zfi7ELj2*eL5Dm6?`{>*R_!N!UkKkIoa-*JqIqn1GJ2b#0_$R3^A7KCixQJ3 zeuaLspQJ~=HR?SPn*63CZVdQy=QeOy*yJ&-zOTh!o~^<-8$y*v(-HnXK-0o{yq{FG zUHJC3+@U|1b+T5q^VNz`MZc=|S$WF%zR_w7w DZawE4~P39SlM+zxq<|d|RM~R(OP@{yCtUgSt z6LnnzN!}lz9xT+MfDC@68@vqg4GZB6_t51kRD|ejOF8Xo(H7{4!-ZB9-rt |^3D06f$<>Q~@(;e_xaSIUA`QQD-)2%uirvS~i zta8>7(=-(#_7;Z|#Uqr`2j^L-$@v#;9(n8He@6ZmA7*~rxaoP+$J-#GQ^|8(0dyXh z`%x+P#~a#@BfmV_^O#$dzIOx2e2!N@D}cxG^>l`C^iEy`;c$Jhqtror&p4^3si5II z$>7XQ9e#3)-0$DzT!x9>jpH`UQFU-(fKr198$0AyLM%CJOaOD7z^rPhgPd*vj*(#D z$J@3~AKVJ)ko(eipF*%nRw?dQaJN7G@rydEM5(>SFVvs&A$kCHX#IOF2e;3g-HCjG zj?r(g&uCiSL35~Q*08*Z`-E_xH!iJy G!TDoTleb)(fKel^FM?W`1z z?QoIY((~YBMm^%;h*?-iC>)u(!5sda8{|8iRTHTx84E`U3^sfHsg(x2xMgYE=pXO% zTwpx=x+!XcUSeo|#{p;#f3N*?9n`_h$Hx`yFi=hjvhaiz;^gctwUoKOke||FcyXcv zMs({W6>K}FT)YoV>QG9JJ$OLWM=DLN7`oBv$My`iU8v-{dzv_V_=EhC21GbXI8ELk z_bCiqAbP`hmY(alnU4I&M;9i^BMlp^7gJ%LTNB>6cv1O`MRL20c*9@FO7~w01~9=x zo_ |#ct($~i=L(*^91btoI-g60$7;KhcP2gd|AsJQn;AgZ;xT> zHMh?k{DZ`a0b{5wC=qhkc{K)eg!idYd`HX|pOP1ztlAq3N8T>!%B)wpAhj@;$}J2o zQ~IkrI2u_0xRlahjnGPi5ve$65zIxC^LX}P#Gs9bHG%D|4Qqz#AE~+fzY!GK=B%G= z%zr!FjZ6h&@E4Z&ehhCN06IUU=Q2e<&gP`LB)PMTd2;CIVz&HdXSd((#$~Fz#4o=I zM*Q(EOh4wo;Fo`{LA4pEiTK5rR!0<^8D;&OSRT_V`(11xKTn@5$9mqq2TO!~vJEAf zQf=c+HEr+$s+2%^06)C3mvtC=Pp7P(Aj0Ex&p2j26Svmk1%dJhp-b|Zf@1b|+H|TB z%LhkhFcBw>d&4t}G4ymq`12@sQOkqyQcI1vUgeCWS6;|2W;2epYd;Vhs+l8=369KT zyv+U|0fPem0pE(%vWmn|?*g9~7JB{w!B>_Uk?49hpsBt=h|cbT*vpY>6F*j!Q1N9W zeT5z3( rgCl(@X~0r&igJ=%*jC^ll~;(Cz0PxAZ*vKaoplUO5Eo(2XwAg=H5;N zm2_M`nDaScj@Je9O@ni&!NZ2O9L|7In{f43Ywbf{Iuor(Kn(uo$rK4&2KbwAufH)9 zp5g;2qZu=oDT|GO^$_&a(vWr0_YEw|W~NW!Y)ayj(>*y-Fm6zjb)aC*&0QavYsy`> zIBT~!@GEAI5{dvo=RHzGcO~tu`ZuJ8?@Fj=z_{=ysjb4Krlo*vM^MX;kkl{S&>?!& zPe5)t3;IXK1==-^YsffC 6nV*n@VUI17051yzR|7J(@DAnC$|92 |)n_gMGQC12PP3x1}h+#S);yp<~UC`?$#?s$N5jyz_eRUo&D>Nz0i2>32RGtGNu zc1_L`wWg87<;WLftNr{{o#y8q&$A0ET>)UvC&ANh3stI_^ VL9ti zMVliB)McAC&w_W*JnJ{qs INe2?5F0b={@soT(zB7XA+zsj&$`=1o&1**{o6mL3XWK5O3vlP zNNs_JHv7o+Z9ZQMRBGXou@8zt+(@^(yEneCk8f1O=54H%|CHjU>Fif~KCzeT*`4(v zJZN_m>yO>TT6Y%!kfJOg3c=Q{B$)Ao6?;}q1?R=Zi-uwA1~5HQn2-~Uy2o@g$0|@N zN+av3Xonk9qih3Ff>;O $^^ zBQZ%C!u-y9Px-+c0lG%$=uA+Ch&E%Bhla_+yANaJj^9bk-T4(u$x5pO{--k*!(`bR zTIf&WHlBbz`J#Y41MmswTDg=T2YSMh!7=uoA|+vVeZ3IPWUy5vx!zdP7`+^RcdD3( z0ON0H;k+`lu c$$-p1hnzt}cI6;f3Mw)xZnjT7O$aSL$oD^_9-h68`-)R91ERVdPk3P#{ z! ~FUaSB(I z5=xQ8ff!#!j*aP;AbuqqaV9hguE6Pds+MDiGpFCi%7QUQ2xU6~bpQ%A+-Ke22}y7m zzc|cYKat_32IV$6#*l2ccKtb{-hFTqT}Sp^!2Iax8>Z{W%qYt|YHhp_#mb)-xK;ty zy+n=I1q)UND+}I?E{1H^Xe2K3Gyh-=^9m;#Ps 1 zVqtJBuam+sD={D7?AtA{(tsg(;;dk%*G5Qg_+yx~Ul1%$K^Rnk|HaUkw?6EJ`rPB% zjwcRBwpx?xJ%uiKG~e>hs@KOS9XK>6qYD;VdeXm7(jShDFM{)8MPy0ea@utOP3mUI zJv;f&P-f3&MSjfTG;RrL5gBTl;@Lh}(qUxDmQlipwl-YhVq~k5d7>;A_F;YtC$MW+Co8~^l`5TNK)jQXJ)aj?H9 zI1VI}1~>OGhDbFfh&AS&(o6md?Q)>Bh4dMo!yNaLdddL9ACJ`}>t&f$B$pESfV~P9 zW&=7BLks;VZef1QkkErT@@Qn|2Ze{0w5>rG%UjJ`dh-h69a{Xwyd;Rt1}uD7h*!Lf z?JtdU6-Lhi>ddNwQUyheM}%s9CAY4lWH=4jM&>Y#X>IhpkCk5l52z&@wLGiwDjk!{ z5&=U$^Wd5$`S0^L2aq6O&&b)uBissHyjy1G<+PnVQOlyj?6vZWfJNU>z03{>Myy>K zC+NlHi)Zz#)^2%?xS7+~yznBK8yJGjv=meU02jxd!5;KafyuJ=*=Jdb20KdQ6*RKv zf{Ba0Xk383EOEp;-1!_LH?k}hzhG6I`9`e(vEFg>+}pRo#Q0_J>@}$C9c1}vq8krI z>*UL5?L|ooh-0^}MzaeuM!NeI(N8AmPb3rYCu|V#e;8K_#U>Hq0XBHmjKgNn)3?X~ z;TZ(knm-2-^c9q6UtNB;=b;!;8J3f6=p d217u&phWl;;DTjXzyw-@mbWGE? ZF(0%!!=m+5AW^Kj9ypV*)sMlLmndV|=@2l75i+vRffBF8SF)<$Xnw}@J)CjyV z +{Jj@itRVB!W+P`~4*FtnxKEXrzW33;7WgF3?6#ls1e=;w3jX+Q?X#rF3 zf3}CO_~H`f9@&Fp5G`vF9pWbxKD7LrEe1spW+TqM60D*3*yyBrsv4Hbqi~HXz>peY z#%PhT?0yXxn%+xqd0e_^zA9$7lp *FK46H3M*(FQwFi#b8~VL!2)m528QqV2LLpiAl}OAUfC6zt#%J2 zgPSk5d+1Aw&*zHA2gAN-`i~3y>x;6t@c?os`Kwx4^-ILRS Z{+0`1;(k_zl8!pe`C| z-FQ(bc{UK(BJ9ZfZA%^G-HgW6(>kIAnXaQZZDL!9@4qv4)J2}$OvXfd%quZs!?YNQ zji=tgRimvR>60jxK483xDeOYHA#$un4mNKzz#FOe<0z2D+2@3V-2vVEgA)h2FF_X# zE~Cwn=OsrEsQ{7!X7_Izp7%R?K$IR(gb=4;Y`g+2S9eG(r_O{D%baPz-}ttQ4r)i6 z*I&Olp=TbCjIXag+_0!fX;`avdUf$nIk{o!w;jp>QAVw&p_<_{!r~;+;z`itp&M@3 z15qLDgJAY$8L2>YJ0|TEN?rWSk2oNzPFA3>D|9@#<^X`{z%3LL7{0c8F{`+~deNlV zE!_lB$ckd?t=+Xnx8wyuhbt(fp9WYs%`Xk^EJ6~G&(ARK2fuutPjbn4E~vR>%sIJ< zI5xPcQe3>mzDB*5BJ$fNC^GE{USGT_02~j#=Kwz72p#xw72q`k3XZ*vML==9>vC)# z3sWWnXozBPK$-j_Bja3|Cjds3U+{lK!91 E3Q1 zkfZ-R1+euwH3i_#fCFsh`e$Gah+!I%O%m#@r2~Db^u*XTR{x;$Y~ RX<5! ^D;2F>>+1QquHA)=P<;9lJwaB^QSPp@`Z~2uK3|qQ8qSVJ3$^rFo za#MZW`4ChQrB7gC(JIqEj4>d%#J~K-IQE Q$^x z&dN>Qb@8pF^Y6D1O3I#jm{H8Aeb`MH6RSbu6H3aR6mr!H_+(DR$fbRNlb4oTw1C|r z?q|ZAOCW3Xiw*{48ii5C^HjuiYQ^}9)TM-=u*o;p81OtX9)<<>jedD(vKOFCRE%z| zTb@+Vr;rMebwyJWJsM$=KVBcqYP N9-l z$(8&pzI9%kFUlB%UjD5#8xD6SDm9bJ3)*pqnd;L*?*eAiQZdnx8B2AxG$RVO%o^yS z81>Z9@-28!sHP&A;cg0Wk15M^0q`IAPaom0g&ry5%)e4Pv3j()T6ZjPa(r 3@6~V?|KmVye)+wu9muZqSRL2 z{-!i^ADS7iQVx0@Q#X`yNP)%!B2rte!M!f-zkLa*ZT398|C}Emi~?@adSTU{mC-ox zpx2}i<_g!wYj=L GZwz Q}V`UuO#`sUV1Ct>xtpWTDyXcNZ=!Zw= zcU@+%i~L|bMdA=cic=0#Lz$vh4e8D;cg2Xv(O?GGT8Hr~`w^*MyaoxTnzDG0xlhN> z)4KCy@Yt(I;IV<;Nk$fD7(1FVbqB|4X^ny&s=Tu=358Q;(82wA8Ef ^5@ok^-qu?GE}Tx s#lete%)rTD^i^h} zlMl@@GS (4XH===SElnYXySJRT;#o zGxTK7=Ke22Jx&uO1_WxM+96E>J>9|7$FYE8g@vC`>^&>_Nw^iUu#CIEb@J!2rnCps zr;b@kMpPIEg=X4(FQlt3O ~j447{AIf z3CaN#s;m-(_}vYOVh#`-^E&;?fNJ$$KIoEOy$7m8Py_lcT6WzO2M_uM0G u?4*w0Nh)DGVLS>iB$W>9vg$M{mhEpK@( znCx>b(Ut)m9qtJJUSpQS5(mi201^+^voqg%0_$7@Qc%pIM1G6U6X>WmJd5R6*x~%n zVh@(Hceb}fO&6g2&-6YVnXg;g8}%=Obk}1+8)uO=ZnKS$AbZ0Ltn;zod>=K0H9OeN z22w(5?2u?kz*Bwhx9%)5>fz$2K9vCDA_~67g^w=AbW?rROO6}N1Xl_>1Ho55`AOSu z@&H|ivcn^+ i^Zknk5$CUah|5xF2*KAff)2G0`i7k8k}oRsG?Op}o!c}N^l*#3 zg&n+Sw4eUXVs?V)H9z o689qSe@=FSGG6roo3sh}8@fY_%aTKH%DS;?nuFhkKqy*7#@2l%74Xqf*MV z<|3(OjW${d6K!{(TVdCHVq~Qcx{Ag#PXI(tXCA*aJL*>iM?&%HNSrNNzm 6~T&`A5j!6jA(!^5xlV=fT-!^V9WV%8FXD31A9Rk*`Unrr=U-N%ne&qCe zF(Q*r^1SalTM*ZFvgRM>NU7Z{D{h8w`fY{dPwK`s(tP#u5`;Z=jx}DJA)!rg1CJ`Y zcKnP~wVW5Wbl9HlG7}GAD>g7yG}%5_0r*1pnm2>}ay6 z9X?+=e|}Rhh(?ph@Fr64??vk$L@YgTM7pSJ 1dy6wMPeh~rpx@2sT(CiU&U3r 3Pk*y7CSRrE}8Jr{8b#t6S zo}1+U1K+@4GWRTrYhqm4uayECYCz#8Z!InKdLqUago-wCM8AkLVbt3#Q0)MU)$FJd zA`?Wqi@UcdQ~*G#_>{S27;__<1w{;9J59?^Gjjh*{13QO#2(qGfwS|N@r6-3F#9&Z zN~aYC69fbr1haa_g7ZuyevXgySd%`HHnvO@4UG!UX4ZHb#n)DV rWD?QsfCa?|fVcOIRB{0oA_m0C2Vmidk9Z%}{}}l!XPwr$?ZMGc02lF}gQw;i4(AC9nRs%s2-0MHNGU6zdpR=QIJT zEvySqP)l^nUusJ9J?6K``qo_zy&>6tyijEX{sdFe<*5Kp2%d*kgSCRmuf=jXdbewx zt;c{XOwpw)%!e~`tyaJtmA+85M;b)^3qu7j6J2*x{qF* 3N?=z_(HWj@Gc(U+&5C_)taMMcs*+Q4vWX>(uiD8v~ z*GY6o1}Z{hrl O z(0Kg@3ckh%>Q2tzJs|zA`~o}RreIjN))m_UO1Gu5)suRy0H&B|4P-KoVsDUdNN;JG z8gc@vkGtf^-UHB-h{<)C>!jo2?5x(II{X41LP_tOKP!)*7ekg4415s=E&ym-*#Ho5 zA_IvItdgV!3b*i5Jo%y3q6#%3i1}s$IwqPD8{=yOVSkM~3z1<@rw1Fbq_&^0Z|4|k z`$T_Q9KKA{;a7>;jL6XCL=_7o7UP$#kuj4qm}UB6x`lnqeut|_%>7ZGIl$f*e8r#< z0Oh5(FCr&V92dL9J3WU`p#iSlMWwMKA%I!1R*X_LEbU%;^?_P9LEf@_0UE=WkMZzL z`OVnvuZT~IKl FJa}ey_;U~*8qL>Fv8aSzZ~ %;Pc-w!Df zJ)nNThiY9Qv2DXPaTNj2CNQN3ItsnOjuekSHDL9GAUH+lBdxf-VkG^|^JxW}shTNm zc+GAFLwV|X;{l&utHdl2^f7>Yc9i5jwz77Qq2e~kD|~4uvl8R|l8}cGcJ6