From e8c439ebe16c08915835d97656fe46686d535eee Mon Sep 17 00:00:00 2001 From: Giuliano Date: Sat, 23 Nov 2024 01:18:09 -0500 Subject: [PATCH 01/10] Update package.json --- package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.json b/package.json index 7373b8a..da1e532 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "@prisma/client": "^5.22.0", "@sveltejs/adapter-vercel": "^4.0.5", "@types/leaflet": "^1.9.14", + "@types/leaflet-routing-machine": "^3.2.8", "@vercel/analytics": "^1.1.1", "@vercel/blob": "^0.22.1", "@vercel/speed-insights": "^1.0.2", @@ -82,6 +83,7 @@ "flowbite-svelte": "^0.44.24", "jsonwebtoken": "^9.0.2", "leaflet": "^1.9.4", + "leaflet-routing-machine": "^3.2.12", "nodemailer": "^6.9.12", "openai": "^4.72.0", "stripe": "^17.3.1", From a960ec346f776995f704d83b84b83bca4112e138 Mon Sep 17 00:00:00 2001 From: Giuliano Date: Sat, 23 Nov 2024 01:18:13 -0500 Subject: [PATCH 02/10] Update package-lock.json --- package-lock.json | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/package-lock.json b/package-lock.json index 0134948..79b2d19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@prisma/client": "^5.22.0", "@sveltejs/adapter-vercel": "^4.0.5", "@types/leaflet": "^1.9.14", + "@types/leaflet-routing-machine": "^3.2.8", "@vercel/analytics": "^1.1.1", "@vercel/blob": "^0.22.1", "@vercel/speed-insights": "^1.0.2", @@ -28,6 +29,7 @@ "flowbite-svelte": "^0.44.24", "jsonwebtoken": "^9.0.2", "leaflet": "^1.9.4", + "leaflet-routing-machine": "^3.2.12", "nodemailer": "^6.9.12", "openai": "^4.72.0", "stripe": "^17.3.1", @@ -801,6 +803,12 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mapbox/corslite": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@mapbox/corslite/-/corslite-0.0.7.tgz", + "integrity": "sha512-w/uS474VFjmqQ7fFWIMZINQM1BAQxDLuoJaZZIPES1BmeYpCtlh9MtbFxKGGDAsfvut8/HircIsVvEYRjQ+iMg==", + "license": "BSD" + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", @@ -820,6 +828,17 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@mapbox/polyline": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/polyline/-/polyline-0.2.0.tgz", + "integrity": "sha512-GCddO0iw6AzOQqZgBmjEQI9Pgo40/yRgkTkikGctE01kNBN0ThWYuAnTD+hRWrAWMV6QJ0rNm4m8DAsaAXE7Pg==", + "bin": { + "polyline": "bin/polyline.bin.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/@neondatabase/serverless": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/@neondatabase/serverless/-/serverless-0.6.1.tgz", @@ -1481,6 +1500,15 @@ "@types/geojson": "*" } }, + "node_modules/@types/leaflet-routing-machine": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@types/leaflet-routing-machine/-/leaflet-routing-machine-3.2.8.tgz", + "integrity": "sha512-v2pJDv/nqbB769SsytHemhLkqwjVor9UdWvZ1l6Y2SEaXNt1yDwVrktc4sCT8/4n7npuEb8VP+UAk8xrPePqSQ==", + "license": "MIT", + "dependencies": { + "@types/leaflet": "*" + } + }, "node_modules/@types/node": { "version": "20.17.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz", @@ -4523,6 +4551,17 @@ "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", "license": "BSD-2-Clause" }, + "node_modules/leaflet-routing-machine": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/leaflet-routing-machine/-/leaflet-routing-machine-3.2.12.tgz", + "integrity": "sha512-HLde58G1YtD9xSIzZavJ6BPABZaV1hHeGst8ouhzuxmSC3s32NVtADT+njbIUMW1maHRCrsgTk/E4hz5QH7FrA==", + "license": "ISC", + "dependencies": { + "@mapbox/corslite": "0.0.7", + "@mapbox/polyline": "^0.2.0", + "osrm-text-instructions": "^0.13.2" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -5315,6 +5354,12 @@ "node": ">= 0.8.0" } }, + "node_modules/osrm-text-instructions": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/osrm-text-instructions/-/osrm-text-instructions-0.13.4.tgz", + "integrity": "sha512-ge4ZTIetMQKAHKq2MwWf83ntzdJN20ndRKRaVNoZ3SkDkBNO99Qddz7r6+hrVx38I+ih6Rk5T1yslczAB6Q9Pg==", + "license": "BSD-2-Clause" + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", From f5dc919d13f1a0bbd2fbdc911ddde898aab2c9f2 Mon Sep 17 00:00:00 2001 From: Giuliano Date: Sat, 23 Nov 2024 01:19:57 -0500 Subject: [PATCH 03/10] Update README.md --- README.md | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 7d5ecf1..3ae67bc 100644 --- a/README.md +++ b/README.md @@ -62,20 +62,22 @@ file in the project's root. The following variables can be configured: -| VAR | DESC | DEFAULT | -| --------------------- | ---------------------------------------------------- | --------------------------------------------------------------------------------------- | -| PUBLIC_BASE_URL | The base URL of the project | `http:/localhost:5173` | -| DB_HOST | The dev database host | `localhost` | -| DB_USER | The dev database username | `devuser` | -| DB_PASSWORD | The dev database password | `supersecret` | -| DB_NAME | The dev database name | `devdb` | -| DB_PORT | The dev database port | `5433` | -| DATABASE_URL | The database URL (used by Prisma) | `postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?schema=public` | -| DIRECT_DATABASE_URL | Used in development environment to keep Prisma happy | `postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?schema=public` | -| EXEC_ENV | Current execution environment | `development` | -| SESSION_SIGNING_KEY | 32 random bytes in hex format, used to sign sessions | `6bd8a14a0d6333b239ae45260618f09cae07c45bef34d4b1c21e7d64d13254b0` | -| STRIPE_SECRET_KEY | Prefixed by sk_test\_, used to call the Stripe API | `{YOUR_STRIPE_SECRET_KEY}` | -| STRIPE_SIGNING_SECRET | Prefixed by whsec\_, used to verify event signatures | `{YOUR_STRIPE_WEBHOOK_SIGNING_SECRET}` | +| VAR | DESC | DEFAULT | +| ------------------------ | ---------------------------------------------------- | --------------------------------------------------------------------------------------- | +| PUBLIC_BASE_URL | The base URL of the project | `http:/localhost:5173` | +| DB_HOST | The dev database host | `localhost` | +| DB_USER | The dev database username | `devuser` | +| DB_PASSWORD | The dev database password | `supersecret` | +| DB_NAME | The dev database name | `devdb` | +| DB_PORT | The dev database port | `5433` | +| DATABASE_URL | The database URL (used by Prisma) | `postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?schema=public` | +| DIRECT_DATABASE_URL | Used in development environment to keep Prisma happy | `postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?schema=public` | +| EXEC_ENV | Current execution environment | `development` | +| SESSION_SIGNING_KEY | 32 random bytes in hex format, used to sign sessions | `6bd8a14a0d6333b239ae45260618f09cae07c45bef34d4b1c21e7d64d13254b0` | +| STRIPE_SECRET_KEY | Prefixed by sk_test\_, used to call the Stripe API | `{YOUR_STRIPE_SECRET_KEY}` | +| STRIPE_SIGNING_SECRET | Prefixed by whsec\_, used to verify event signatures | `{YOUR_STRIPE_WEBHOOK_SIGNING_SECRET}` | +| GEOCODING_API_KEY | Used to integrate Google Maps API | `{GOOGLE_MAPS_API_KEY}` | +| PUBLIC_GEOCODING_API_KEY | Used to integrate Google Maps API on the client-side | `{GOOGLE_MAPS_API_KEY}` | ### Starting the Dev Environment From 97f723276cdc251a198d858b5d6ab5dafad78bb3 Mon Sep 17 00:00:00 2001 From: Giuliano Date: Sat, 23 Nov 2024 01:20:27 -0500 Subject: [PATCH 04/10] Update tracking-event-icon.png --- src/lib/icons/map/tracking-event-icon.png | Bin 43477 -> 31108 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/lib/icons/map/tracking-event-icon.png b/src/lib/icons/map/tracking-event-icon.png index a87f02403358f871f56ff881ed435043625eddca..fb93ff4b4c0847d45e50b82e75a4a1e255f33ac0 100644 GIT binary patch literal 31108 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

Y*{>?B4STltwEn$fTw6$3@okY2Or ze#l3Y_B)`Zq4D5Re{xPhuu#_V027X&YAq&mx;H|@Q6pfmdbXkk%!O|r~+A`TEz4Eg%gt z9netQ^0zEG`4wMmW(KUAExE~M1>LlQrjAUlN6l!fw46oVIs!LKCrDSmT8E^po`$6e zu!K4o%cC1lieL%w$%??l9O=D&XY)m06RcfYWTgY2^4|STo1y&@Xc#?k=u_X-$_-1? zDgv5$-;7f;gc*i08D}H`i#zhg7;T?;FY`=ZEb!=1!FRj&m7s7|T8QJ#+nt6qye0ui z%PnvuWi@>+J?Z72c(fm_*;U#vfrdJ%{2j|qdex`KqntFZfW4K;W*MtU%7~wq#!8df zWNM|k^22!nFLTXm!`@XY@WT@zIzs}$-~|uW@k-y8QY`OX%N70E=2UUm`VV^Y9(!xe z-lqK)Xc*qN=IQV16c-3Y9=;PuioTg05-EUk^ULf37GNdN0$d(%6yR*k2`6txhtX(y zz7gZDw?;mL9NGPk7@$$}()|-G0BL{T66QCUwKXXTISdr(4-Dv|~qt!eG;-(zK?fJEkMyn+x^l69r**RGavuaZT+~BIXu>6Vd zS6;3Y_fOidfrjzr<)^@9!oO$KinkskI>HE&3HM>gtHPB81VEM_fzo3>LvWQ819y;-iwahP* z>xrHTvqdqVOu+XJ6nf9}9kq38+jMpZ81fy();REW$#V77FkJjue?f*cF z3QNwoAT@Z%RF_HramRtm5R}y>EHA&CBcB%Fm}k00G4P>FlrBX)?Z@<(09rtd9dOzkK3I#&mMacfy&z3t} zGjG=wDgyFOTLGBNJJC967iK+XK3KNjO7qr^*UD=?8qVIo=`jMdSyVpwUkdXM9dC8} zWOA9Bs}PKIt2Hf~4d|f@)a1wM1d(^vIbCV609NkpbH}Ca5uGUt>>BL?E91ZaA-=U{ zpQpzR(7t-`>2G|`M7v^{(y*}*9U!{D7Km*j=rJ>+Qv_`i1mf{dMzA}sxpE<&vdQWc$4!pg zA_d$v8?=!_pZW7RJ$z}n`Vpf?ZS?Cg3p5m`2CrOp!b>lnmR9pfE$`ikd44KSR|yjU z>FcgolwV-;kNdN~X6|_J(#IS16_h~6?5nanBdj@!zqyZYpjo#K#<9QnL=>@Sbj z>?%Fxf#zw7{-e)+XWa%AeU+>gb$mVTZYFONQN|V>^W5*X)1}|^PJhhOV;*Rz(=Fa` z!0E63k5;!|F?Zfax7q@GD&1#&NBzlP?@y1`>?-|_0GdhvaP z+N#rE@wJW>Z|I%&n5O>`Ktt_L@s{N$z2@_^?i}UJ{qoHtHuuoyy&WOwo${Eb|1m%_ z>A!TyS?}zWR@g*5V5?7j)fcty_g bPiFr=Jl{bn@=E|n00000NkvXXu0mjfox_vV literal 43477 zcmdSARa9L|6eWsta0~7poZxnF4estF5S-u;-1Q&{!QI^nZoz`v!GZ_35ZwE4bGaXH zyw_uNztJE4v43jps#2pI|r3QbN{QVj|U`uzC;AV6A%!K;x_ zP!v#dl42SjMu+W){uZuZfS-)FDr2W{yr?9Ia{XTy`|svbWfQPd^v`l15UFa<{jQ0u z?Jl=@Y>j-~f)Mx(4ogf7Qze)ZO(Hd2VBp7z;7*4Z5C|AypI)9`f7Q5bc(EUHR=RV4 z+`f}ZoJ=Mz3IIS;Qosdw)yq&MUutKgV8Xn#DFh2gkO#7(!V2}s3FV{H!Ug+dV!|Xw zLp@d~udUuL(vWKf3orN|c)WC=gMpUX#R(|AWcd54xJd#QW{xt)nm{_FS8uT9tq!1GFB`RT&|0RLI57KcHRC4+H znGy(hCR5K$3j7kteqr)|X^{6MFjkfdaAGQHPWXi=*f5*`$b_gZDJ`%5h2H)Q{iJ>F z3(7whbfJnvOboIwWR?0CIvWJ~g7=B**1yn$o}p)_mB?fL#k3FwfquE-ZP*Mkunqw2 z$~bbL#v-0|bETvGFNiuQ$fV5QhFZQ4NQ-WoUF<#MDx{zg&th;_o1^@Tw2lb!QhCQi z%XLb)e=R!aY2|)uaMu_F{Rs)R-M=r1oBW`LboT?>4o=sehADA^L&=StcwB^JRyD5AMy6! zLjLiCDBzF;V&K@DDZCfw6$(N6F!)8e1irMm#X`8)A^3pumt0I3buvhw&z({NVlOR% zkPzr_j;;@RaVG-^(&xu2RmOh~&VWE%<(FO*2aLRi<1%uUURE-U#w3su4X(t1u>TLJ z07C!gi2EsN82E1sG**i+?294qp`HWQ5yutjrA2c078MX+C<-NBD~So$U^uUl_75AE z$dEVNVOr4{;r0bI&L7chDRDF>B zGF?AD1o-tvN&8E7&oeo{L*G5Mca2l(I1>;K2Z>2hEF<6|Ny0M?v)sV*$fECmcbyOZ$s0l^Dr zbOew|3nh>EAQ1Kg3P6o}Kxn$q=9AFU6c_ zkiH77c`aoBBL4D>c*|~1>Yu?1>0$PRJrD2b#IrK9K4dgtCQkx($&Uzqyj`7ef+1lL z=s#=!BC85?kXRa$)E~fx`D+@x*mEoabdI!MV#(rpdWCw|a@{C@uNKRrin$P!0J-Ni z`h&`W=zoCFAx3>SEd%}si0c^;LIXO@U#rDUHXv)4GD+iN-HX@%uNmY$GfXN4--Uez zM1GcWGU73lX951NvBfZF-g5(5JSeM)A*8v(a<%`vYzKE~Jo7Vq96l!VLZkh&NTW@h z%b_74pzfw;dz$V0ZeN|aT9Aw{}5GhIj6ZqP>fauk8V!q zr1e5Mt(w$u5<*3T=X|--gsl;hgi56P!J#V;Bq|PBpDmSAI>CYQ#)6J>`@ys7TW#n4 zdr0fh_wBo3u(`K)OO_fDnJsFW<}gh{(%X&kR=qksmfIfh`{-VZ4-_BeX|a>~Ptb0* z12pc^)9l9D((G0OI~RXGXf3u;pA7KKwtGYf)I)+v856=J4wS-~Ulx?kqKg3*K!(h~ z{(y|n)Z=V15mAsgLv8m+?=vI1uDRVjhv@<~o(>0vsrkN@PT!L?p8t3CAsXKSXNuGC z(Pp&A!<*&K-!@d$)>L){6z@VP>_S}nO9>G!Mh|w5ox8roM13{$u+jhSBYPc z0a;GiD}Lg&##b2|HgXKb}ARAvXP*; z{77f1cqVYGCwTdkOZqtC06&UoPg*oQXAd!H9u{JfH&o^dBV0d9fa600{l&7^0X`yc zrT0hqQrnwqlY#*I;X=_F*%HL)Z*pVN>4fj7IjTMnC;iw?ZxdTpS~G=N;%`QzaL4?l z!2`;5#;kja4i{YSJWF}2p>LTFa`+^?_IM+VE#iAg(@suo5qlImEQKO=UUE-Dj80^C z{3nP_sgmzcUiag;0k@Hdl?Ws{g`6NpDU)!vO8}yYVb*=Vw%h*7{9=5dd$qPfhw137 z()h!%iq?i!o=dzO{f|XVny0fxXNi+DkrGu4dIAztz@glqJ(tC)h0p7V_hUx~MT78A zLxOZJ3A|Ik$pYpWubXWf)Ud)zbl@#UdFezq6nYTDw-d|Toi+Vo>sYh=Cs+eCgw)Sw ziKwnL645l&@wW9UJhNb{#)bEG>w?}5tP0sfeUN!hBMwL!8HT9Pc#>f#cKHT%@seXb+qCbUuiEX7BgTC{O!$s0It8n=LKe5RHxQjX z$fJa#gNEkyZhrJ*-R-zytCD?nR}rn@B|%s1Qn7~YjLjH9f@^o($&MUWDil@4Z>MxP ziT`9ks5po8b11#xBU_q-cC}y=7-`vf{_!_aE2rzd$&t?;kJ9e0G6)a#8pc!bjvDzY zOKw-9SBrooaFzgg7NI=4D{)3L78&9{KAB{%a(sxRuwEeJti#J3*Db`V zu(*!Jr=}u*V5%ruZ?2g8ej4J%!_OB!>yRfzDzj@oD5%vnfC2>qlbvd{Cg;*+zw)o_8yCLl z6C0R*|acHp0@)r?uK(h3;_RE#HHH4XS_ZbKYi6Y1pIIL)WD`ll1R{crh^~t zDtJa-35E*>X?Qg;E*$n?ajGNp~VYZFWxujG|7BiP;{eGai#Bzw*oHyZ3 z64K-H>@n!uqKCKeXnnItn{I}&IhxhAkd#wA#n{#GU>25;awsATUIh=I)t3&_GIV@Z z@vb*cfwnoDkC7C22Ihj5b=?B;x=T+V#_!%b-lv>oeJ0Kh0tD!WLe|!#Wk9b69@3sPhX7}TxTMGIUkv~EQjg- zS!lLMbj5$);mPJX>m*iP?)~vNG?ohPJt9O17M!wNza)l>dfc(C);@yEI@6fkba6z;)6*+77FEU$CK(bYUaW~W0{9O%J$fK2xZAxEa$cgBINA(QhLD18gNI^Y86 zRd4K9>HBKcJ;y|h2n8$hLLBqa1PS~nNb86MsvAR}OaPk03%8$-_Phph)VZS7Kjf{1 zOwHzJZ6PL|bLNI`iW`>dVW|tx`_;>b*;z#@7?P(&_fcNIg{v-O<3&9wN%XJ08sGBP zUt7Gr%nvwI^ZeE}3Y)T{La*$PDpwHQBR5~3GB>>yuZlWqO7R6YAdJRa*?XYWO>&T8 z?nv$;d_HgH(>W)%Q@j&DALR*(0br1cW!f<;5wm^CeZbOyn8Nt)~nTV1UnWj0}2nBHlMUdGN>R?5v*=g z9gAapU9&dG`Q(G`kO-;IL3W3b&wXzjSJT7@sDmxouRh0@k6~Js$!R&SQK#i>s%=B2 z^^qhExjkU zu2d`KW>v_&%4Q-R2q4NV3E7B zYBLr{!c2~McFKm~EVm*fjOn(p=qeR&nRXIk&I^z0zI8;;H zTJpIdp+O!BPQ^dex*VnOdjZ*b8Uoh8j(_#Ha1H^LN;uVG?*<8nK+Qt)15#!eyK+xs z4@aVl7e~~2?x4y%BB4wE#Q`$A&AV9rl}~;OLwT9xMZXU&T;3yyTj2Ldk~R3A=Y0N4)d8+%pKekHxT^Bnh^J9AtC z&HPr}Z=dN7?s9n+)r^zOF`p`GO!Ue_g6j*=3FEm#N*cjlgRN&*YO0DdLOebtNm)a^ zPHn{~#}SL8D=akCMx{7Xrf55VcgImS6ijeC6ZOYS&!AuPm$(f%@g;<+oEx!#`Arw; z2^zb5ar3W}RLzN=BR{aX$kyi~JehS^lg?E5BOhh(p(erRJTbY)e6Z|`KeqR7UX8)i zap+{PSv!`}xRmZTvI)R|XR*F6$<8t^OK2TR*|lrbMk|N*e!;KF9%@<;tsM;vLHs#$ zn(GG?%kP*I0Sg3th=k}^>Iz@R<%$f&VTWs0&Xb_uyHY=O`5c2F)s@F zR-MSLbQj1;RQySZwDd8J*!$CA77nHC!oZ3M2ch``&UrK9<%M?l*{n;QFPF=SFK zFBtj^$2X+zBQ8R9m>#59o-pyBU>aP>Ur+Oz^cpVXC$pS-cwiXKli5?sqXMZ?j zwE0XDW(nctkG*YsE`yQFx&Wb874=%F!6UEUqK>;XE(tnF}tTS1B?m0QW>!iBuiKlNj4P_l3OkHjTxwl!^)u#%`#o)DzOCh=y-i5*uB-C7DCb&UUw}#RW_!-)_c~%~C@;&1*wC14 zTFEwCVW!>DNezFLAakc}3EHKbzPe4+mpDD8K<-2ZndyR%NyccM!K%Z1CDA>yuq~yw z>r$^)of+YzXaaApk5|pi=Dt-3(LOcw(!+-lXW@hoE3!`0G=)aut1DHpmo=EG0tY+L zWAvNYp27oKT#N^KzE{cVd3komj<(v<4ppO^hUCCx(qc>ePgt-Qf|p;1xYw?Wn|c|O zXhZywJy~6lleZh4(q^TlbCK*l8Uq^}IrJ8#Yf;KKt1W%r@U3519+=ZVgQSFj!U5R$(ps%53$}TJB*kWm)9|sJ zIN%ji<+CfvdT8jFB~C|M-n7qPj=q<*_2`_Ymd&#MGl+sdzFw7>%j>|snMW2d-4*h% zuBmY-FY7ReiA6twktxcR{#HU2gx5^dL9YVCet+mznQ2}0j(BG4T(>BQ7!Rjc0>}q5 zhC+|KcF*^kE&x>=c{Ndo`CE+5PyEgxC?MTUG47c9rK_^;IKK%1bzCIG`EBs4(RCpY z;SQ~}z)-wz%!FNUPS(-bi;-%+bTQpU57z(2_nB_>_$+ zoe{31y6E!spJRVQ6U-50t7{^*Gpa-wIQzxF+m{{DE0{x|Y!crk1?{I?M;l#Xmi?VW zw$4At?hB3HhN#Evh|uu3$g54wonAz;SZAwYhjZo1%*8M@VRc^1z8uY9hf-eS6G6L(pTf-w=Q$SeK@lfb=E~(VS|(rK)ZlQJ zCvxA-FZs3y1_gP$B_1f7;}REGjTSU6Rtjhu1&kiNCLB60 zSXjsTG9C1BXl~-SO*+kX&93Qg+t6Z55g1C#%Hfcr{h<#WUB<+z49L&Y?KAk$hrk6v ze60oxaMH3ti}7^2gU_qoI$=L+!xBS5pIj)LDN*ag|8{lmgV3^%#BnZ@R<2dpxr zyz&<-P!GV^Uj0l#JoT;(Xl}w#xko`%K3#m{KqOaTFo}IAPRV|}CKNw?ywTOcpAG1# zs}7GGi`WaFwS>Shp#Ho;-$@_9fIgl<*VSaAr@}{zSd<}XLyXz+R+R`qELgtS*5)vj zV#$UQc*Dm4gj7O2xSlC;C5CKF#Qod1^;w@zQ>~w*Z30mYV18Wa0Rp83bz1ntz+7?s zJ4uMLP3j-ePw|J^BJCJui|E^cEL3O3EHRp=uM^yiFK9v=qqE)6jNOUqQPHRq2AuZ{ zs0W2?Dx%PNY;?_dERFNec1(>aeserbAMAg$K$#yUi<+H38-?2#M=}!jHp3@A& zz+*GYCdUhW*}Yh2my@2NxkA3?0dDH!^df&($^d+A&j_e!meH+ z7LJ&(jr$QArz6jUpNYvb z=`eP3T>p$G@ptlB`R#QIQR-dj2kPO|xrJ36*24q}YVZq_{2_Ri;lT_f zc^A<#)wYIbc#cXoIi399O*|?h&u>i7fJYTk6+Tb&K_mD%>*|?U?VI&8xyxawlJss;fdu`?px|Z>&wnMYjj{(ldZ&Z~XGOcX)1JaOv z!Z$^KBIz_!;bZg|noHQ6G_0>&P^^&+)87hd8gDjl#z5mC3HOf1Y{w@do@&P%RjskF zXoZbPBG1iXZg^EQi&BzVQBn;&)}`|eeDoO)N4rF&l4CbR3tvf@+7bO)@uiJLWIe=K zp7bpAYF`3!Ox3jtS$*eY%zxYu+Ya@hf=dFAb`;`!w zB`s+z^(M{Y@Pn7T_vWE9xI3Q9(uZ_45%Zi@ML@KdPl^2DB8|M-?%<^Q*KZ}{D|s{)qt+wi5$y6b!_Ns z1Q!0dGn2@sqE6?1=|c+5jcf?!UZWy!Flet*2N+-4|7m&0l!Q`H zT$mvZcT}g&c%He#n7?|fWsFF=+>80cT~C5NkQ*KMVLnrpd+yD#_Bfq${@SuA8Su|H z)}TOAbG_4 zEcXV27zIUdAkp4?!18Mta~H!hoR)Dt(_uV(r0_=h@GitMMR4^Rg$@7jlJ|4;EnDlO=9hW z)}TDS3~onex;WsPS>Vx!=*4EzyIFN3lz~QrwqX78wo`QCd5^EODEe`4Wsu2kp)<|> zL(qw*?+vP-tj?`}of$#bIAVeGc6I z+(MF@Je#gRCN_gaDnqHscQSgBnBon5tLZ4w+8w^6T`%OKgpt$VoFIUwO2TwfoTB5^NH#9>lI3 zfbdd4?FOqL{hmMG7Kp>};xk$@`h<}uI^1i%H~L&#F;9-y9vT~QQW_mwMh8Y0^mXeO z;H1sK0)HEFHz~m~C}x7+>ttsXUR`_JJki%FUdjj+MsCH01Vh@@xUb+RP~aqx4vgy- z{&-aS!>boEST5@vYUpdvC(QYjN|m}l+#vtGzObf>1rT%qS}aSgwp-fU1?f5we>Y%| zEIGIR(D><2NWMP1aFmBhG6(BID%hwjaAMLX6Xx_Az5r52gY(E8+3|6Y_tIpmaNrg+ zn%P83hD}YkV{F6m6Upyu=p?JugVGZYwcpXvh9&593Z6`Ql8rwNzxb?_r?%1yOkJd} zH1>WGdLzE0Pu&Z)dei087i4&yrff?L^p`*W&AihnbK=w^?XBPA_|T5A(DlGeo$EW1 zI<50lRFYSKKNbZ}0K9HT3xJUTY$wQ8)VZuhea$8ur@V-*_x%zoh&ctX({54IRbqS4 zU9l@!LB`;@i_K`YLtM(OGe9}s!FTbqZhYdOkN`j~Q{B=40^R^njoijc1H2vhifPBS z*k>Zec=C@A18=}w?!ForG6MYZ-3LZYp)&mG)7C%1Eb4p3#~i1!eX+M(O=Y4MNs>%@ zEwo7_pm1FEg+Z5cd2hZbTIlExr9bt3ijfB@y{tyM>G5(t{7)@U!(jrG&@g#|zitsV3#TrRQUI zR5O}8kwJJgI`ICD$2VRfEdzz>jHy{?fC--G1vT=lsUjH7U|Gc5W8}!0JP9nH#5udW z^S5ki?r+>PR(ENU%q&QO8t39Is32wnZO_Z213o}LsPi=pgYm^Yyj>dTYCb>XME8aF!FtD54gH5n|IQ6K=h@S%>sBvs?QCdMGg=Zv)Iq2rw3sCh?E?tlpKzl;gTTp>odN^j%~)HA$0v5cNFDw^ z;D@pK@H*b=e4oM0v7E@0T5+*UUO9K=QHoR{}ONsH*5kl-?UHlR&8m9$E$jh={tzp9%Z1Bo;G7qTc zm6s4(j3v(3=-wee_!+kVnmpJN8j>BnEeyD!;V?7>Anky^OjM3KwoOv z_Zkk%u$mn>xUh+gc9`#w#vwL9teVXDC3@W^U4INu;qsnAXF)cb1*43KIeWsi8V{z; z$fKS5?Ko{{ML2vH_-!kx;~(M`G7_(TceNVnZU)j}gwsL0z|@3(D()fX*g-=|CB~u>WEK_Of%l+qSGjdz zq~e0eQ@_`~HvlQmBZ6=_!j@KL{F)>Vj+P8u#^6^XuFSy9$`^)c})^tB5UXyiny-y!`c(>yj{- z0udqsJMup82dhv(m{@JHMP%}uHniZ;BmCOa@4HswCi{?LLYCK+q-8xm z=KP-nkZ|05t@YD)6A-s(T%U_4l=iouX7iOjGx^BGYI@0ZarT9iayl?2-32V~RAatH z`~F7G+fogb93~n}HaarJ)hfCv;8C$@0_SDgfPE>#iNKW<6{vSzVwRe*lJF%1s=hPM z==R|ImM%A)5_tjJ zjs5V?5NcA%XdQ>Sw9bROstiy?Q^wDhIc&KLTZI5W#z z=&LsSN0RSdr&{vutM6B{n~?&eR@JQ*F={3pb4a{?>WmSDve@!rDu!)tFp8EfHR?sN z05>I+G4M$J&Wx^icjF*e3ZJhFaWsk3*EV4S=8S!&g1-9PrSi|(=Z7BL*Cpvg2Kh9-}OX4F~7A4rh+4(jx*c}`i zMa@%bKC|B##-oE1L2l<@3(ah?qxZ+((m-J67pUFB!6($kfRY{eS#LvHvz_P50JgUm zGQK#r9&7M1TVh$xMnRf;Q1^XHSNdkNLZ3GF6T6c&=pttJ$3Enn{8}-M4MgXaJU?f2 zmseMFK^A9^Lu1iHv^ldo7GsmaxSOmz4{am1Kv(Nu`amQR_Jt8mpZ!+|wfX{r42O9Z z51RF-bd+4pEYbd!+Rpw)wpjX@nQi5JRnSz;I0;?b#npu_ne#G#kE@5(;HbqlH;f46 zl4Sa0KPB@dCIR`_zDQ9uRB2$FJSNhg_>$}`^wl!iD*9dcai?-08{1)H)`ouMXiGJM z-9Q1smNSFVF&H3=lX-z~6z+L!}q1hZK(@vr=uYDMmb?% zBU@y__O9)Qp1f1S_d4_tRCM)ePH{U{!hj&EHyymDRti z@ce+-Hfwl`V75`LipiutyhSyb{J3|KY5RJJeU_y4J6t1nVa_^Mq1Z0PI##{SyKUeC zQBwOvLWOL@^u;UH5)6(UKGgE#=^xi*>TDs~I z+vgx-Vp1NxoROq263nG!D6c7Cw|l%wt<#Bv@MhV=2XhO_1<50g+r|!D3w<9m3c)f>kj8;fLW&aWDv> zBu;cQi?ASZX2D?;G0#F6Kap83xo#R5xf&#c{cwCLEITEXInIu#{t>$SgyzQM4VKIv zSq5k8n)(98ZIMu>Ar$+7QvvX9MsD{tE=|q1ni#8h-fLd+=*v-NVx0$2R&Ry_c#N8M zEcnPda6Uj8&3t2L^Yd&440)Yx*tkkIGvkt2dbCmRzOSj5Q0VQN z00kRJ(Qf+oa_`sGtAL8H8SSOt9>;?IP#hpg&XCv;ncZslcA)rR>qKmP#FR&dsf1Fs z9%Li>5!aP1UKJ2tN-^7pAqP!6i3LBd9e2ahRRpvWnOZ~-#bg~=^h9sprEr-^UvN;I z6~O(YdD+G}Is*OrB0R0aghod=OZxN3ZVJuHeDES?$AIc5Aw(Z{CzIf@5SY$yqTxsx z`D9r^GAk7BMwTR_XCxl>ucke*J66h$VYQ2Y7u}%N;-v$=ZUi@qS80+z)?HLK|42>P zMWxUR|CYz#q%d9=JFWoGR^l3uSUiP^&F{OQpUmx_lB|8q+!yV2r)faIo9c)o~%?g7*qCNXyd)E=grYvvRxmhA#2#`0F!fOiTS+zTMT7(5c)oiw=g3RW70R@-Mto>TcaUI}fD zXlpU=#bZ~S?JveU&s&G;^E=2v;QE)%j?l>ieGISgVismHI^-y{sMm0cUkL!S^+n`n zK2_xL+?mv>iV@^bFpSzHCvJ4NH=GUQ3BAPR8=kf zjg~xcLW~u+xV?;`MNB6btfw`9Z~lZ8%tIbeCmSwl9595uk|@vJyF^N@f;E(=a6@6* zzvoc+jgXSuWkL+Rylgi>=6(2j^6VxlDaq>f2w82bvIunnSXW5t%=wMe*(mQ)P8iw# z>gFJDjOd#vhK@=(K9;~+nDEbKwhfzb?tH7JAvlJdKL{6WVcB=<0|Z(9dG8F9^1=kG zr9)SS@#RWy7kGB!y?zlWAAWEmUh`%|vC%0#YDO@_gY^o_skCQ;CXOx`Xx6AmPBC9j z@j3G6^@Z(SYt%nf7z~pU#D!6RzIFGijX|JbNX%rjAge?8r^hss^Mw3ygEgj9E#<+O zqox8}8Q-M%w~%@#Y~c;c?~aGcVf9N$?cbA_@)r|j>vl@qBtDOu-2rBnf`;5|mY!0Q zR-UA)ee4jbYRIFgSTPCr!D6_L1r#;d8h@G%`lT#s)P3n|&UR+Yw3kf7NIzI+JqQb) zw4DjTkDvW=FYF*>IAO@C3mx-0P1c>+L%hAKAdCtj!b36O61rO$Z66b&`VJ+LEDf!c7aQIsj@ZH|v+w3navhOBy=PVnK5SCj0G=Vkt;iIk0 zouhOmm-B*+9D=GaLL(HMRYb;r-IK`eGh7V}fT$(FO{Ua^wcYgy3o&Z7SirrrLx22^ z&0v$&9kcT^GI0~P=Y62zmA#Ms;gvyg@;qX*)eA81qA& zeOj(4TCfpy4s|LjMLLt%IebN{V5ZpJJ4G6o`R*QQT=8$^XckuuAp;$#4QIU*jbPLo zQkFGUd>P5%&rT(xH3Zu+n?QbMDrpKKYO#S}xrFxH{j#HIP9yu(TQKjTYn6A#T=~tK zn-dMWNK-3slB+G_LNhs8qKNbA!CX}nEQZivtl;t9<%p&5w3O2)J4eR}crTg@Y7CJP zCBJo)^a-XxQAq?Yg{nl_-+BJmyb7G@Zx!FdkbVd!U67h=jW>I~dxL2JBa? z-i?In`#nT7zU7t0OPmmWg^MXooW5>N!KdYqBg@blnO4Xs6%A9-q^T*kt-#V6#ZRqV zt%49Nec_F5{}ISDu7~bNE7T8yKke-#on&gCAXI%n1oF@)WP<;rQ7e3vUW9vxaY&3YL5vBlk*1cv7@f%>{r zq)!`QnR_q%(o^Ahwa;FMuWgIPp~m=OUmFZc6)*FiT*mF5+7Dxboawut zz!}{lQ0|$|)|eM}-a0%A-h4?>rZv9dry9Y&cm=s%Z%*x-%$9vTa)o~nX0XO~=vwnx z^&z)DJt96dzuKR6S|Vy+B*iyESP7JGLSem+2cEzeQARohPoSZYhQs2>*3HF@St4Y^ zP@2N4PkThyb9Z(6biH+d>Ins}2EQgoVceG3Z#b2~_G<98xAo35Cy^;@F&5^ac1hmk zTNn!?gUXSZ^zUXv;v06Q6|l|PX*($Bj!a}*@Ub{oqGW$~{w(YCF63O1fb02vELHY& zmq(1B7b?$o4h1&`X!m@Ck#B0O&Jc?1kfW2$3rqJ1onep2Ler#437;u$3EfDuxB6|* zwz)&~KAo3Y2uy^|4|}KMzbG`_Z($opvXWHjfeymn|E>CibP{+lIf(GxXXV~^9C$@> z3j~kx@8DdrJ^f+J>t}OH&Bzxv3Lbm-e&L)+tbTlSbkyi^YPRIQ>hthvfN0$Dv^)Hv zpZLi(jNB>w;dZXGv0&IFT>^_l@6PJHr>6R_&XS)>bQ?yx_O(uMQr_7TAhhxPr*)dc zlSuw@Yj(H{+RwzJpAz@VYV8Y|+-@7A{AUzr7RW~dyNXpISg{{S%AAjS!75#--Y%Hz z#8X*%R-?)SXHhKlZI6e*`{LaraTC4gMNg|qo?eg)5S&&i@?lwO$B=VXpaO1Ed$8pV z!2B_x508uMwhIG4lhUh-QXE5fC&W69T9HsLR=Q3BC&+-2;$EW?nUk=%3yYLBfA-*h zQ%s1xNbJ|R@PU;I(yKM@`4Tn6Lf$=mrD-r@9yY@Pm%6^hl$vt@$s}TZ`KRqL+Ll# zLPwmKlZ(nPTZ(v--R{3RA>9eZjbh_U7!jI)L)i0@y=(6S>4H!ReXUR`z3c4S9{nmB zTA)=0=&Jd1WccHD#jruO&@Ksiu!h(=bQ7ulT4MdTHPb6yNs8~=^(Xkkrl5|ORZ4q* zL@9lW)zDrv6+{tJ}6$d8p zWr6NyZUp^SrW?8GRS&;n@u@#3H2Iyht~NBaACbBZ(c&-c6=fX{m`eLs4NUT%4s|ha zD>``R`J8rkSlKo6e?!G&ALw%SLlb;>>0cQ8pEZYNcL_M8t;9NUeuM? z>$z6g9GQ3LEkWt}8z1*c7`GK#gC_Qll*BEYd-3^~m&(EI&{2r7wP?1l-;B4^h0U8j zopV3j@!0!uFHX9MijrUd6|BfEFtOjYX6xC`$xuwWls;iNLa-5xnEN53cvxhr(SclP zeSB=y=P)r13Z?q;N%v)b(&*k2<8$gNN|CIgLR%;Xnx6qb>p-ky0CBP;dre~A4ksvaX@n@D$R2Oyb`9XAO)mzL{p}ZY>p&@!UWZOcxs9CF4nE_R{n9-us$ZdvZZ^`(d~n@g`I&=biz!acOb27ssCpA$ z!;`4L(Iq6yqrhWac>~RiG~Rqp*?1nz**)W!hLZXlej2aQY0?zEEb?_tup+xX4k6)>Wh&UXJ6Ra6*c@#|4 zYKux9$)$$8L*#lasf?gQ5{X+}@wB0Rr2 zwks&wPn`mn<4mb#j9Z}cXV=?`I~G?ll31Z$SNmf#=_&Z+05Nx|>E$lKY7_9meDbac z7v{E0xooK*krV@t$H4O#tvgkOWK~7lLN@W0OfP>P7U6loz>IgYs13noQnAw_ z5rBJhQFc^j{7|Z_!xX3>XD{ec;v9~m6l$T68*5pd zm^~o8;d$UhGiJ(kwd|f{=+uV`j`kUt>{x0JTw6Hv9i$AK&$4fG3UlLEGRRxZY;Ze1 z7?J_PPX(qf*LiEQIE&f>VnA0JNq9LBv@N-m9` zTr=BufG1A1WH9kO0q1hX(ftewXQ_hL)6wbXg7bV*ic>K*hcq6SDQAMlooj(8ZPLEq zvBH)#wT<>7FZuQ@H9DRi?^KUN)0^g3NlW>g$GIJ5kGVJ%}$=iRU?NPhQC2`Fa5U3ym{)aZPs zBXVNk07LpNh3C1v@GlKl5BI%>F&Rw_yjoa<96-q7ZSab$xC|U2j#s#zR|(g3a_|_K z2U5~YW%K?aPcX=lY;;;2e4Hn#D`C0l$t5lWPwM(k`dTAAF+YXpY0SODocy{gOeL-3 zXXZt@B|p;BI)Hy}BU^YPcEH#nko$>a~aGM9;2 z_cH=`BXz3}$L<6$&dF$-B=(Y#PdDQtvqm>RzAho3=eC-)uiTMcl?|YPI2NZ65JC@& zL>@|9FKz3Vv>*Fo`3_B(`6yN-g2$4Cm{lDg6+-fS(NRUWAjJ^Pqo(!Ns)nh;)sxQ? zo@gW1-x;nT`!6CrMCsl1P??NgOtoX69M-MJL%Y!A!(?o8hM>3_Os z>RyO)51*hGubPX`m{^dBabvCTbE@<>oRHQKIZGMO#yu3VJpjkpH{Wit`7H?F3@KAK zbWm>#xBis!TFTn#cuR2c0};)XN^oH}=G5jxG}o51QD(n)*25vrQSC76+05gO$bC-x zY0Q(woRN17$Tr62;#5boa3@9aceI!~6V-X-vgehd+u?MUnS<{z@e#_?jjqiPbFg54 zNfPqA5k^aD0n+1S`<*tAXmR+QqO$OblgIWiyasi{4DRT`mS{dQ;+91uNDpH2kR!HO zYVoWNzchg};PX#cme+gB)0hE*e&@%IV{1UL#({Jzp>>B!BX6$n%7g%YYD@njGgbRQ z%)|k3nw7Pz^~V>6$l*hCd7&*OaR;ZV*h4jfYLl$uoVsIT94{Daugep0Vqdz$NfoQ)OwBTIixsh~}Kmk|g&PBUJ;?{BIoE1J{O(?877#kum8i16?fr)7wYnH4B)(IFu%5M= zxHumB`L#XKqwD_XD>z66Dl@z2N=Y8>_jTBfS<%fO zJtWgyf^MRJvWV35P0$G~}8vR9Y=+nQCIIrD(ARIoSaTAtFun+dih=PCg zJ!+U+L^1je!;CDR+@Ef@Lq*K4rGbCfc&77{4Ijk-^ShbQahS-{FM5$0-uAuG2_i=w zWTdnTH@505!`~vmd>eH4`qh*D18npa;*Y5rZ?qQh|$@wgJ zWb7V2F}VN|z95s_g~pTq1W}W%tO6x363BN62sV7N@BDvo^%YEUHo?|ta9G@3gS)#e z1WzEi6WkpZ_XKx$4X{XXcL?t8kig;)+`oOls#|sI{)4CInVIf0ea>m=o#yLpt#cxy z)E~&?fpCDdGt9yU#Mryq#t;lBg|8?c&J%X8HDP-lp}DF!ta6F zSaOEpj+XK*=yl{!Ja*zk*{o?ZYi$a=rmg1wby2l#D=6Cq# z$>%!)ZLSCvkHiq-)i1L4B+v9bHN7`a>bFRux6G*ygzSN~U(34Qs<#_)%TFy81ukM|)$OREE0Fet>wb14>Lw0rj zO!@u*e2z@c+gBoq`vl&*l`!%G=Q^LxI)wk&WlOqCTK=|FLH#jU`l2D&EH)iw?XW&=|`lx`|Z(XQjQ8y!EpA z@%bVLm4+F+wt+sEhN{N||R!E#Z!lUm_>uiY%tyyV(mcrsLb-(Gr>fBasvpG$gj z+jEKJbN8&nJ~Q4hjUBuLQ}#c)%bt8^{*CIfZ~D;2;WtcN7wpeW7--8? zSS~6p&~aS@vbWPNPxh+Lh(~ma=_dv^sO5C+(#^FtcRQ@}#|U(76S%v#qF}T{_q3Ad zZtX2Kk91K}jUSpmpba@{F6V>Jt#&DUTyMPTo+Bv(RwCdcJw~VZL3>ATHzA1z#D;Spr-0>4n|q#A?v!Vv zSpu>q-yXmNseW|x*5trkGyV&@1Oj9+L=k+#;aMp*U#hPoK}irbj_iTDMBggn^_e1H zfhbfqtCw@IjW8GNx-!k%=fo(!IWQP*(*Ai!&7XboA*V?Op(~Zylk2~Ku0~AaBxo;kV-2G*J37zm+R;(jdhtDruwU3 z(++Vq-}Fa%yjrOus@Q1P6=~1zA#<1xaY;H?Dng~FIm_Be=kXXHdH#SS|Ul}bp(N<2{M1G8z22G4w{D70c-cS&g?`)4cI#u{Oxg8ghc^CK$B z#y3AW4wfE!9Qe~(_7~kn$3^#goG{c&qWdkf>%#xy`p}GJ87ts2^e)!PZ(RKK$n6w2 z|D|MkWpfDQ=vLpUYZ2O7L5SLWTP;3oJ*Qaih2jIeAqTln{=5A{8GUc^7r{M$(|T4) z(~Z#4)((Rkk3=Zjvo{|P^PMjI4m+^h0vEU5?poHx?l-=v1wOgl#kIWi;GG{5dvEBk z`~XzB?Bcd;x=h%I>`DLO!qJk2*wr>T+#5Oxm26X|u750yR45$@qbRy%V{n)MCqtA^ za_3H)ES(D4`FP(~HV}#F|GIqCRTT-y;DfHD)g*W+d>A>5cKNL3Df0c+B-#O9L#}H} z?k2xw(%3pvbi#xx$&LFj9v{FHEV>t_8e$bT)qRpN6AF-KeMx6B-yIttn6%{7bI1^o|O7hPod&`0lgvxiTpHfx_u*oY9bY;EO%c!So}nGMaV z+PnZ^S{H45p1;>D9`oG0(EbD zt~=Z{mWxg5uRZvRGT&Y~f>6;=m{)wry5r4+yYGXMD4cJff8Zmj1nwLTg=2vhQJLg8QTp12P;!Y%tzq@a5$c`l!GRBjr4ba(tlV^X zWdG{-o!8EKFS2rjM!8F4ZOr&& zbNL$eHD=EptgCB7!7HBf=9z#qUEPvo7WDxvMqB7d65jRvPpmqjPwLs zAXq5e7gPvSrCp7g0b9YiMR`4SsdI|*ejoTQ8uc1*5>%O6(*8{;y{Ylfnf$^GA*&7y zw_(`VhWX8$hk{*Km$TQpZ+Unof58o&d2p4=N)p`;Rf^ zjsw!6O^=77hmTQP)AjLwe`v+g#C=UP;6)+mBfq5SQR)k|>5+*D!~|8D5%<{dGB7rr zNZ)VZvy&s%$fMKhHK#(tB#tpb8;m@Ft@*skeV>d`8r*)S+-R_c&F|(K(C>e`qVfDP zYqywx($;@{k@)v(;a6a*0;LZ%C)6meaJsAmY)39<0x5fcnRr^~c$ZaLxwvk`*xKhq z-qTC(H5fkWjmnWK(@pS*GP*zwa}l2=owe#+7vCtea%u5~Y4+=9H`aKgsG`4U+ zVICdl3(GG}N;q5*p}Vkx{c}zyd{$s2Y9wh+WUiiVfSQre9C=k`WtHUT;7FeZA`)bZ)lwt54P-(+RJ}hC_mNTe!@H`-L_Lo zXZHvuv%7Kf8P_);@){<#G7(<)pt{RG8&wPVl^R6OLA~4MqqF0zgYI1E0>C)@Rp5C( z%p298oKcsiOkLFdY)k3`X<4%9qG-FuZn~5EvN((*JWjkdjVaKB$0_U5TfU#Tf~$Op zb*uBfr1Cqjz%pJAe%Mb}+cy*JJ>HUr*f)3ke>dZ<%sc3~tLHU;{BS{-E1UFy>qwpy z7QTs1-xj}Q=c8t^?x#E(*M(LVz;G~k!P$?wf$Cr$X`mSevzNN?{J$7k((5I|-Y_2I zy)+7+%GG|WegK0N#v~h68S3$0c=aT!MBm~3yyb`!ggc`92<*Ehu>M&=D5k6aa#d~j zS{?$Qud!3@eQ3`u*lFlt?)`R&Z*8P~T7>4jo}fP7YhCee1FI*)%&Pspbw3U${EA$= zINhhCi$i}{(zAzOEBWb--vVu_3CkZMvvm&KC4I-1@}f`>`{jMR*L@qc>XUB9f0>6=KIoaP*j@1{)9rUUjjq@bzTze-9i^`+%BxaBU3)Q|=;^Wa3{+5m|2`x`Lzl zXlY7RLvK4;%}3{U8|Qpjtozr`9mxLZh1$+E#0%4kkPVRs@)3D7(lHt_QVM8ORVCyn zh}GhQGv)kv-rKVr$4e!GOUI>Gfr=#ow9T67A>qNN1{2&w7`T(RR+b%SQ!lmBNz*Pr zuFJP=4Zd{8BG&3(L2S2e1XHKR)uN(oT7i;hiZl0PkfXiX_J!ORmh7Us4IA-ws2c_k z#Qw52v;l*|IQO8IA|#S#_&-kT*w!{@GGAN6rmV9|Mo0v{TtFYMtiT-|lpk+Pa?vAO z1Uh#y98aa;4xzee(os>0ktgp2=WQ1|UD3hti)RQ>!j{m;o7#63=|!h8#Q!>bJ7)E0 znu2^W%dQtspsq@PRXSm~QP?WK!(;}9eBbaWD7|+Nj`j;YYo74?i%i3o)>6>n%5X$T zYrc^(r%sE8-(v|2l_@ zx9@A!c8UvB!h2)>^UtGoEM_W-qP2rRBYZ447ljM4F>a41om5wx zw5)dc!9Ak!Ua({j%UPZ9_jyHiy%}M|mzCS??^*ivxIO z`Tz-CZx>016KRz1g^mIHVn$)-W_&Rc-+FvDKorTMJjhoG1WSMSP1(MQQZCPWMJS2R zvgI|2A5+F7!oKdc1;$yF_V{7!@v_4(wVE>&AiEd`$)QkgB^{8zU>A}S@GrtFM}({D z99=^?UoK;pd=9@Ysju2&WQfSrz6AY6HF?tsJEs6C*A@rFNh@puDS;tEel`{}sGIs+ z`nmf$iBiF5=Mf8jB75`~Afvj=#_hAywcB<;h7EEITA|%cuky3bMBE8V%j?z8Dvq~% z{q@T1gkN&xxqo7Qw;_Ju`93UEz!71)FjdVTa*|cdAPKeNlc93 zD-p#E83Ua!@y4`Q|M=dfcG+$$;~87Twl*z<^U*#qev=)r*Dcm3BgCn$x|T}y5ycX# zX#*0&D*MUIijoN9%0ZO7k_%Wao2>4FpC`gL)thS@YeZ^)+1@ila3WZv9fL>|S|jXC z2VZ{!@e1eZ2!9Ddm5wwFNgNB2Ln#gg<>R&k3cqNd)cOi*qWT2I&VU4%;wR6}{ZNGl z)B|`pe8!5>zI`tSuhGUB!i~kl+ie zvApRkY%7Fe91%jeHiIqNzZo-$W6myQNe@&v)?5I*NY?Z-;Moi6y88uRniQokEz(j7 zRn)$8ltW;=6hygY9y=}?zxny<>G5~S23ol3$=RSYc}%NAFWh%{J=8W#7WTk%wR`_J zp}M2_|GyHR-)HcHr@OI+?c4U)wBN?%hHhIrd4(ERN&2Md%CRqpJO4%&GN6SLm(60! zCF%Vb!fpvsK~SgR0naGP=%NuN@+9Bow;wCXOqS8 zp-=Yz`y%dVS@+UdL2Qgg%{dNOp@$k7XY5d7zGQ2p?@pye&v~3;Lmk}+yDb+z2wz&; ze&ILFnQ(_{au$zAw2iZdH-f@rraqd+1SHbbq$vKOa+kfCRnU^pa1Sb01Brf4y_vq} zJj0O2`uEjda3L-4hJodtgUikUrhmW;CXrs|=13WWUqV{3ruMDqNmz*hHpW-p$c;GRGFMlCo0)d;J z&o37JW>wvoprZ%z(| zA@pGhyo|85^NHn4>BwM>utGsFY=erv>joJkhCIPWO2D;r=38E|-~N8g;SNzd)Q;xc z9<%!M0Ef8K zT7H8)&lm~-i-vw{At>c_Ag~dGrMB7LhcxH@QiP$3UIWB|F9m_nnQU%)ptw((hhfGL zCl*s;w#xLuc(uxkZRU*^#TkXf!9uzAHQ=vuYZAFZo-l_R(z#;wI~Ch(fwO@Fd1}y~ zC<5*9Oiw-6R8fTX4y5N_XV0yX8qIu4&OA;4MwYraG;!$0&EOunCt!RziW&ZSQ$ur` zhmPcr$Mmk$%f+r+T1guEm1?bK_Yp5l&wxz*Mt*#m8@Z=y!%Qj8H~ibZ2qr;=Jy52d zqDY`}!^?737~hEqWmD@I`R5k}pUBp80Jb17YYo6qi6L%p==HiL-@Ik#-~(Bx9Dp!D z?)Cg(ulKuR<8e=p(J0m0;;G#$c7w=K$ct?f9jDD!(8z471y}4|GwOz!Bw!-wWv^sb zzl!YGaQIstTzdK0F`JdT;lL&T=j_R?zQk3=3zv!%@S4?8`*s(9Xs)BwEWBfLhl*VE zEg+JfbdJj1w?8Q3${3?3VMfS;4tBY91)oj#ueT<;FtwBhS;UjzUsLLo^O-Rp=AI1u z=BYIrkw1dSf3ofeP8__+E!3_Iy8=W@gM9}_eX58FxZH!s2QG5m_LX|+WoG@RN!DMM z-y1$n=R&n`&-&bisVug?9i6`l^N{o|a%9tf+g#53(XPNmC`li0#HVauoT*Irpd^`) zF>F>?i)-`JN5Pua3JA$mUa=N?l)GC9^m76Ma*!Lm#lm_|q2g;O6St$r7adL^+v-B- z-6Q;E=5;CTceckF&gYTu5uJR~cDE@YRQZp*F;cpsG-YD|q7R?E(k*5bhA?*gYgPZ< zqL{&o?nOtjCj(-&5-8Xi^uS5yb)~@2g+ua)+`d(elBp4QS`Qpy;HayaJ{*InA_NZI z=xnKN&G({X>Vv>G3Zk#T@4SWu8@goacOh;H9T>nk44(_pwoqY%j{|EVV~}FV>kDAT zbh&1!7VaL8?9o?5fNBT}1O6+#4TQWowXk{no_LwU_vuh=4oM$*!V*e7ZFoFCSpzb` zANl_e7XTXqwFos@aNG9aaHzfu%BTeVqIQ)BEo{i45gC~ypwT#&P0uC~%+c4NdkM*A zlZ~tNABMu~7huTPQrt0f8Wi4s3^&7w6*{4W+;yMR-K~n{G?yWc=$;f#4@E7)0~Q6; zl%x+8WsKvR`END}E9>0C3Bc`>PufN{>lB^C1iS~|0r@<2v_$J@N zZm|OXF}Hga^Jv8*ZxSl}{J?mFO5;rO(wa@q4KwscL3+L&fk<$Cc*@*+vTl3U{Ibx} zE#C2N$36qp``@8LWg^dyM_8NAeYO793PoY!u7lAP{?mPeTAWSfd5kQi4VS>(V zl^qIUsj~;eX&cdNo!^Q*H_^{kq2P(_FG`54TM{;_UzG5exNV5UgL5yYjNSKlt9SS!EI3y|p*MVR{Xh9g$yIpq# z)qWZ78V|4F=bQYW=?a1T55?5DFpLD}=+EC|qj}wDc9KV|5B5ro8QqQT1?jILSJnT{ zbi<zo%U>`3k%10k_hb}E53GD`s0CB zpG&$#T|`Mt7Sc{0A*v%wCr{O`#HXumnK>!;XYhhUba&rr$qKq(JpVfyueb##lyU{n z2Tm``2R$!4GH&n*h<;;kK8+^93#5l^jWELu3hc$NmDnYk;l1GHPk&(-+>6&P?w;=V z<7Hy8*Tk)6OCnT zZ(=GdJrY65Gp0EygG^X}E=6pH^Ya#6+1s|s6#d6h{T^Tq)@4#?LW{*D8)Fpz zu5o_L-M;Q2yydu<6~R&jitbk5P-br9X#jB>-P>c=5|=xj3t!QI5mY;4W?4jG+LLE# zc`eB6-*$*G$KV-LcMSVUd@+7_X+sTaOW$+?brQqa_w?212g1G)g>*>U2D1sB$||u+ zeAs3AeECy|UtRJw_pVYwB@%D%3f%yE`c5c;a>4AoyCJOjf%xzr@vI*scI!6&pvI{d z*^i#0$IF1#33<8;SV5ybXS^v_H8a>mSq^Vv{{zGntgHskHC?ahTZf12TZaH5T*wpn zWB4yPg^UlJ8)|f3=F(!^+us*X4G_4hdVMZEWQZxh|LFF-sb~mr1mNQQq`OP*Gb=NI zG@REsbTd`-hX~|@bpyepKdw~`+*ZbW8ZVR|h{hA$7&eBwKp4=82hlxo;zIx(x7qb` zERZ%ug3PmC6X(t_J>LYklR+4SSQZzLMVz@QiUc}8B{dN?e|!>n+D4H%Y40TtYE+7W zvrZsoY%Satp5UmPk{))A#%u`(ilY(KqhVvWtf&Y7y_KhY*qdboHu^4RRt2}$tM~8S4v>jbViB8i=lJ57^4tz9VB$0w=+kx%gv%J2)v+dXRi zen zME1EE`&e_QJEnXQMW>eh*oX8=0)`h;Y1Ra>bI}FTH-w>+(@Jk@Z-OcxKP0fPgli zaPqt3d@*XSoT44w+e6V4c27O%NRkeb_8moFQ1o!m8w6wVp#PJdqU6d@qZ=C%a31j? zD;m$MWXw{81SR)}UD?3n^Br>T+^He0yYdtN6yNk8PMlP?i9$&wz9xO4S;y7pSNroH zxKc%E*oo2(`I00gvpnTZTG+E+xr)Wcg?(SKRT!g-Olwb{mDcT^G%P57&KIM@-pS1& z1apf`?K0a_qt%&QuI@juO|FR*U1^e_MHa^LyI#aD-Ck~UG7!k-Mf9mg6dPum#gDaaU9&ZPI72!nCEsHDaeDJG1zo2y}ex0%YV`qZcNd*%TI6BAubi$ zeB!4hoqr|La7QHgxrB_iCR6=wo7RN2h3GVz71m%OBgylzZQ3~YGepByq*C|& z{VW$H$KYG)-E>!rBb%WT$C0XZKeN(`hVwIk{8iIJQ=XA&Z@7YK{{ZBJ1dmG?!gZJ_d3r zdM$TdJO{Ff-iuubO=}oGI(v0fK`fOI&_!6azZCL)+Xgt#-%d1|E}nmTAjNqr;fF7b zoKCt}n3hee+*+3>_e3Br!A|-Cf0Y-nq^4XNNCqP}_n_bFK8bWPup&*X14# zy5r0wfon7o*E+u3MH6xJUDMIN&VG4;UF-Gdt|Ze76~-fYsSw2aisA z4k|hAKSB9;TbT&H(J+WzElZ)rN3d{Gf0t;_U!KBG-1=k~G-Jfdf0B_B8?#LfGS8og z#wnjvWVj(BzDJE{4e$Fi&#yTs zJD8e|hMZpH38}z`0J5GNI2)*}KAX>=B0D)V4>m!?6 zeGeQdEV5{7_*=V;8njfGZw8lRo)YYdT(Qi&(WU&eVv!i}-EIe#E2O%9$g^e(jQ%1b z*`_jv_1F9cf}zcORqHb!$+uh=_0eEcEEt>*u5ex@T!G5j{ZkWkk6tBMSy4mgHM@n9$*C>a> z!e70bvvkT-^fZcN4Ta#YKVv3jL^iyfKD;H7ifH1n#0d~zMQKN7{ao@u)-~^lw%cQ# zDltCMV!h_pEBh$tcbZ-74Y2)48MF0 zRpQ#E*NU7yB8bHD^A0>$Vz)TwTu}8jx@L8i4ul%D=&#&G&#kQdz^oJ z*-3&yQJ;C<m4!w*t=ZoL??6!C9}R~d|jQU(tq zI$o~6Oe@Y#%Xt(W;Q#3KQ0BmW@PRQc(c=r%}NFl8YC719$xYRa|;Q7$45QN}K-%Bnm zflGIZfDp11D1ZLC7Fh01@9k0Dbh*9&>|HfJBbI7%X-X|4u;aU9@MJe! z<$ASFf=)YSuzLr>JE@m*!UXn#k7`uHbcl?ou$5X z^EqEa8%u8bH0yTl+AMyvC1TMd6pV#^>4WuLdr~9H8=}#NrF7V@J)X9dQbz28<+XW` z32*kZ^fV2%slADhO;>BM$-xGu{w~(U9LXu^ZGlLBeBlztghHyHzy4sFfo^*YdnO;t z>%2AeadgH%hs^Rox~qlgtpO}n z6zDyV3k^M43a*2??yd6L3H;Ydi26jCwptv?i{HZhnU*^^=3X8S)_QYQy4)bDHsW^^ zyO^ZD#ut6@e7xnS@}-SQ5^VJ3iGDgkd^dcL*NCjaun;4yLqhM`TvB7DN~#c9~jn(h%KOc<+;7 zSgagk+j9K1qC+euCiOvW7ulZEVPMP!UDbUPBfazgFY${~z@iFE5Yp9=!Yv{N_#GGu z1iVzbpTQE#1^(-m@f3N=9GT+;5tFA9=~dC(#i?^mrD+XOA9!H#ZB}e9adzgJSHXN( z@o$OI=8ZP!A&eMM8P=VT^DyOP*qyY9<**o=Mrs_`zsogx%4OuL_nDZEFh-UW^lQ?~ zjtB%5*)<*iy^WFtlBboh#qjxgRaH;AyL=fS@kgF{JAO!xydP4h2goqCWl^GG*a9ro z+T#A8H85#`Wal{R`{t8*ZPV~@k)l8g`Tj?}U$$=V46P=6l3`F-0nooVF9`>d+`-cB z{F%VKkx3DPVT=0oWnrU5^Xq4G+={{oH{z+qU5-#X9xc;{*nyLc{tG=+%dF;t2r;~y z16_d<2dSBR6Bw~aS_QND)Axf=V3k}Y_DvZ}?p3TnNR93piO&q3u=hw+!9cR1+S8)z z*D5#?7#&$)6YAKane~wE*m5;lj0I+j`Sw$vR@&{&q}cc1P?}&0YDuY!#PA(X-)zah zQyh6cZ-m-@zHK~+64yef+_PtBnLDGW6?F5o$hBCLUhF)cb(f;|Cvt8FH7F+SGC;r8 zFtEyMMp^}Nq1{;<2=o>&(JqGT?vcLy8{r>2gVgDUZ~mK^&n>4DKZ1omBy{n_p@@t&}J(6Ld3*aCkSWa|c~dS-tJ=f>!LhoqXB$ z%A{DX2=mw?s$=Q|xwAOMS$dWslUZctR(%0oLB{l7A{LJw2?C7O+M9lU|F9s!20{Dl z^4v~zAlRAdUu$&@P7&U$kEFimoZq5b+1)T+|GDOflZE-LXVGlu&@&1*BkY|5qpIQ% zGR{szC0MA=DB{td{p;%(irq9Qi_iBM{48wLosUqY8Wciti+}L4CSMS6q2<)J56piU z8$)l8DLgO;uZ%lwDm-nq;I?);E~#@9_<6RHdV)!&qR)&NmS4Zm>o6(p!gDxT*e|d- zzs5fpXY?D{_nKA0KDm7dxc%wDPIaDa)b4wBY?hlqjf2Uo_Xp^E^t@Qj>rS*>W^V4_ z?I%cW91;!P_H_Ref7b!NgdjwYu&c8ecYji$K<&R$zF5EaFJ2)Nj{` zDbPS<+qfw!AL063*!P?B({Gc7qGxvpFe>$OwReT^)OU@;O&l=~zkz&}=-FKV&mBCa za@!tKGlZu`1Cgm;?*cM1o%}2SMlH^=rb9T^Rh3qU$b;E={~#`Le_D=?Y_4p5{xF6m zM!SkJ_&fuIc0DMChsW}~my3`_1(JGUpqDq+jG0^Ivnth!^N`(n>+W{#gitb03L|}C z)0QBinuWFkPKWz833u1;#j6SFr1bCvkUEf&Co0YH3+eH5oJ4qkdEvoGN!7(Om56(| z`V8Um!EG~|?)9XP%{)}w6p1B1xIx#yOReB_qDMjqgwMz%*Dw8{AP-aCp0Z!O8$*k4 zl^G-ccfpB0aQAuobjIDA6bAx=?y+uTY1M*xge61&zTu~vT1+yJU9v+hD*3#@`EfeF zUvO5(y8G3Z-0K?2j+a1>PU~xgVWYPM8h_b-{;HA(l&-GcYM``Shz z9%TxYHqo!n@SVR>m4-cetCj4zIgq%e+REX=il0mb#XSoOk>>|}dK3W26pveOjy>lM z0#+yMbl=iTLdsZGMXPHm$n|0S70{ck-uCCW+lN>1H~hFs!SCpG-F%cg62jP9h(4NjU9Bx*m&I8S2Wi8E~kc z?l>}+6lFEzs&%H(lv9N%wR~3za1VntaritOUy!$x3}=X+fQMPitU3ZPz=kSLo;n@< zB+F7a{gD|b)rLB~OO@X~78Pe1vygn?mp(qQ3Tw;E-H3RuDOlJHLufJ*wo_W=9;JY`q zYtLtXGR5q;CXX`Z9aQP3uZf9st$($6$6X5Gy|2FB+Puieh|5Q4mnxWkcbmho=wyVZ zy_J6h_b(=Qg~r{y*rDpnmd=)O3EW|v<;hm7sL3NZ3s`j`^#gWrK2@# zKTFXH-A=fb*itu$U8M|bSOpSvT&K1>97ZE3m~f!5K1tAnd??=pQDl=O>#ln8{>^Z( zcl7XfX#D!lY=J)N)WnR_7h&Ny)c0A&H7D}Ytsu>Ir8Ih}ly-tFwCU%$eUqjCRmhfq z30j<2AzEJhZ)?MDcqh-zT-tGra)9-3Gw!WL_9+>=1#-*Cn!TDyLsYGm33N&-7O1Rh z?}lgVy8C?k2Q5|b8y)mOO?&KDfTDW;c>Gto!wYmVSWQbc9MTcX#Je}XPQFo-zCrB7uEje zP2uxlQIyrlC9j71Au~^=i8;JUOsmpD*&la9z&2!&69k?|;!|_G7}0jD7VUQAUMKh@ z&8M#NTjn9>1@zUcnd@4jjl3lXl7rL`E|88v%;HdC=v^e10nu>pR#T9A2Y;N}SJP;; zM2=p}=0vey&VzO}OPg)|JOAyPMCb{RMi^;H?43dgX(JuEc$>0fod1h~b8nf5m6n29 zZR`-`W9BWpgBH!|bUN1+LFZCtZ|+r7s*i!uSJkmrld7qvsoSJ4g=N<-a{F0odCE3x z?Z9pcI^T}GJ?&>91EskfeYav38kt&|Rg2P3JkKv~iApoQ(<+a;LQieA9aI4mA`@A!6Ej^_0SdC~Mo%bDH5i*$1Z52?n-L`M@;WwBcRT36ZR zmsO9oq&i+Jq4Nuuwoe+*qBn`p9CSqNYMAHOK-gEs;?WOV0qYFs(duS9*^> zyGA$VngPF}2_ISBNTh2L8A-YhO=-9-B$)!W6>K&BP1Ab!v<+XcC5E!S^2u>*)>m?6 z;D9BnAe(ESmHe*{JHqC}3Tfi9gk@zaxz>CCA6j;vyzb2PX$7X1ZP?e6_cJr zp7|-zH_uNuar4r%x{S+rMvgV;H4!!*N-nFEK1$9U@K_s8_ah07K{>fz+^BEg`}I zb_Wf$yStN^z(AWdJkKg(*#-EVY(~1&d4x9B{!4W}?@XELp<&{7Px2~Sylv~Sv^r)8 z$!|=rGw}6g-KExY^Z#%Gc1K^T=ph~JqZe^~;-W-hVw-$BaXBzyt4-N@Wb!;&%Y;<0 zGswbk+#UYef*Ixoue(?GI0k=?GZ$Si-+lj*;zYhL3U~_0LjRP4$u#r@^*#nS@CU+O zM(+Y!{$u2*NcU@>g#*u8`5sx@R{`nt33R0dVm{)F%P_tojL2&rsr&jbEm{+|=|9XG zjCH;Dw{YFb@#i*UaPvwt&)9!GnR~nfzDnTO364xRV7Q$% zzmPCH>mhF*QK$VEI)NDVTlx;d%LEZ?=Op|3j?)|1Xnt>SJ6xIEv#$Ciw_v87h|CD! z(T>ojKoHR(6mdOWn+-?TH9J7>ii`2y9$^3Kbu@foprU7z+8*6x2OnZ>M7~zo(*JgC z^}-MWNSn7YC%Cn5F*zf#4v-`(mj9l01W!q)GLW{KsUrAUa{9rQxWoHK-izl~7Z>|T z&uM4V60DV9d7ySCEo1N&t)!IGK-P|gV^m5dJ%KSD0HIBK$A!Scg5 zduxni>JE|AQ2NtgNNU`h{mSp*ge&l~L5~qG7Mo7Jp+JZGe3x?Q5}2-yVMP_~X&-zT zQegL(i{`aVO-4^8AbDu!^P9X^SDKvK%e$G-s^t?pN{C*(5!&TDd)&l`nnB*`9Dt#&9VmLjtN%fm4r)CqWBDrfLo;s@X zQNuRwMPDM^EWt|J)Y_&O)KX6L9c&q!CSFFsTz_FU4+PS&C|PTH5E%n^>?bW|>v%mN zK~Jb5h&2K!P3LPfX#DR3VP0UC$3s=kKCn~**?C}&@}#7=q~Ly9&!xm)zM%Wu?r_87 zm5@U>w`x=wrQ?QZ5Yvo2^zjo-2aZ^8WStVwQUqs+HRac0B5zp{MS-|sxIytr7Zn6t z_uM}v%KEcm#(TKl2FB($t50lm z>JW;7MMA)gLtFTWN$a=+>19!g)@D^eMF}b;;eM=--iFm~#Z~Lrv9Nn@>N#G%{nM&g zkPd}bARiCG=59uSsPkfG&(j-WtzPCw#a~>}0C(aKJPJfgaRtUtQKJAXuMWLGi>Ms~ z`{dA(0SkjV9TJ~rWK1to3QoH8s68>tTM&%i?K_;qlnT(XbkF#wrpRTfLVRVI>%73} zyQ?)LNKc#z6QgOBwEK~{ey_ph0ekfRJry}HC^t;7sJ`*+=#lv3a9;0+B9xxZufDg) zYgLuOF>8HG4nWsp7U!5e?$y04CdU9le?Kb(Hv6t7VFV4VN z1kIO~fCr0#Vz_pDsW>=8Z{K7C|8yc0wFsSQ^xE`lO(AyNqVBV*=<7zg9*b%Zn=s3G zW`d*>6w2K%`8xAr(*f)|?`}Gr9+vGk_CAajbSinZdGKk3Vvk?`4m0^e8c|n&!Uvt4 zCbc{$_$59ruvGAeW49+?mTq;%1-frJ$-Nq*TagRJtb-b;eB=emkbmrAWfmUr0x#fzLtPiwY)9cngPiop)Jb8~)N@$tj32cyFe}=QfIsQOs#G3{AzJ|6S z((N^W`)FUn=E_Q0-IrRz@gz@k?v{P*kJ;wo=*MR+45}?1YnY9jy;|VKC87q@{ z12b~RG9U!l!cAL-*}rTpMY4kY%{-FQuHb_K?%#vtzXV)@v=CD?S6t3Os3gXKlBPyp z;Au`ldLYhxBZ`}{K4n_ z5F?t1dRrQfu8t5|?toyUB|gDDOPlOB1-iM}Tut+(#uM&FtaX_Cz&!Gpc{)M{bguNTHUckp8n$TmiW;xw=K71B* zTk&5nXuZ4As>8CmLm@0Q7L4i}6eCDD3NrfEpgHa%id-`D+{w;fgeB4$Q!V-yqr{MR zecsZ9NW}qNy2}#i(!B&FNFt%wzpNVj2i^t02R#12?!G!K$|&j+>5`NXhAuHcL2^iG zkdzV_7!*Z9x>G_xX;D-pMG&MVW$2I`BqRiBaL9q7o4q5r`|Li??tb6*$NsTA^9S!d z?|aX=zkANPr|vtUi9YiA}TyGxJ zkk+FXBt;}!_$@MzS|5Re7(01`geiFU%L0?UdUJ+(;BoZ zNI7UKv`E;F3vmn`4IL|i8p#hASyO4fOY$)uD`sT#q(q&(i|GD&&t>Y~=?XZLa;&|! zLTEjafKM0?;tVRI6j$`sAWgBlwT&ieu^O4>H8~?8ZiLMi%(GtMa;e7f#!b5IcclCt zDAD9urftqLvuG22b?5dNWxlI9hcyaf!K{yKpVQf8#0hf$2i(`!qJ6Od*Voc-*ji3GHidN^Hb)bGvJB z_h`z3O)FhMdJ#3f%Bo7&;e0{8QLnkHxLK)vv^munQDT$V??aNYDkU`A$*ZQRfL6^F zZrpD$u17atJ`lLSQ7~RdTAi8~e#g-=O3iue2y!27Ii}AN67FF8;Vzl+n_bfCJPDG} z$&^Q5SE@=+9_~ISB1yaMg5>HHuU@98&YirxH3x}^8<^*N@I(86&E?PZfeYu2YFZ4Du#&af!qa%(DZC#cdKCs#<5!9 zVkw0DogmGEKd!EKTt@otiFGtr6nhZ+USO9){R-{9t{M>KRC4_4e&v!CX80-dm3oof zn%mapHZ53JJ%qV@hH9&t+ARW+_(9}()!@xXB@uTQ#{_~WIz1epxZzMz3UCs|gpCef zA+&Jq-7y%SJu)%3eZvnS@)BSBq1soOmBg4BqV4mmHTU!J@gY5ww=NdAtIpVXYxcV* zFp(goGVobO#=osnu-n9xhkEmqp;9{&bo#Cb!PQZh2dx9V`3@Wyq%E9bEidb;ZJ%!D z1dYq=p9<}woB0k0MIZbne^1?&u1@`7_t;nOH-67<33Ru-n?kV6T_ru8P(_@(XP!2y}eJTV)qnaSc6ruRV6{Y-wV;l0w`+z;)#oOnO*eZI`%mS?QgY)ve>>)oC? z2(enhRx238JgEc>-p%6=+5uA;V*%?EWg`6dnbjOe_J_XIkqi2g_6&mG4a}x+u=Le? z`kN*lZ3-=E^!P6RZFTt?d66AI#2mTq`z)@SUsIvNpJv{T)nn@F!mX%Q(kZx+K!aj7 z{Gg%@vwc+v-L(_Z-k!8UU38*OFFUsK=W9{s?4jB-{2gq*!0`#jS}h%kU#t)_=`;VU zb>#PfaZis1X_k#`(nN6>k8s_ctD~#r(f8e~?Pv4Hc8+vKqd)iX2x;kip|2A+avMklQkiM5Mbn5T zbi^z;PqKZPZF^GQg^f-t6It#K4#36` z4`x?~U+Udh`sICj+CxfDAG010;}Krus$lc|^JrG1HDZ|O0?mjtFt6y#7(P|F8VUR@ zD`I=2lyvc+`Gu9YUT@ST>NSq{3PXn@Uyk8}AAMqQg^4P@v~xSkfeu-cnaGrbkITK= zYB&$_FK>C-phW3h%L_`J*qCqVvAi4K%Mq(Ad1yqrPxukn{87(J&(q{xJLwwhjLaly z4m&N0!>1*glP+pdIi;-79G2^Z`%HU~DG3+0Wg#MRb^`wf`s9ICP26(dI*&#c+5OSa zE<*h884og=QPT9y_eE*?!<57NWJLIRerB~{5Y<&=2U&+A$q#4iJ#7gG)J?{|NmujM z*tGiW*%Ayk*Wa&ZHe&O7*F3Udhu#z5JQnTjz-*G-4tSx^QvQL7W|K)ZII_*jHWua` z;6VBSt-%z4CXlkxFTIwPEbcXcv4&Mti*>l@bKevP`W#X^lx!1AYaF;eW}R}xB7yj- z)Sq*_lSlVD`rE7SXjQHkrS`;yl4Ulk69x3qA!c;YdBb*?l7D3|>j6Uak-5gtpYxgu z`y?#{>=R2ol($q^Qk=6i(lzsvepNZZHum}N1+u22AqF1(s+#S}vV45C>np>&6wt#? z*0!$cc)2;?HE`9pB*W{eawZSAD<`~Xc}^2ac>5?>Skc*17g-nAy(;^nHFaoN^*QRY zoynS3pOl;AHrOkJ&=W!!Xs>+5G%(OUKmbPO+ae0#z< zbZ?MaYsppbdUvP{n#!FBx{tfmvrMZ!>D4_d2>C4-C80$VAp|VSYooWW%TV0qy6rH{ zo$iCz6M1L?kHuJ#m52ej{NE1S^nR*1|>pX(v{2OMQ;&&TtVx)ypMS+?eMg-%%? zxq*7zIf^b5EPc}Q%6R`s7IM(94PoO!CzFwEL4g3&7qPdoso^pg%J`;qA6rJ>e$1WW zfi|#8Sr+gS=b{g-%)q6@l&_i?vr%-7NSggF>v*|isB3DBKcCj3CXlZ{Y1cATtteUtLngB1`kduTY@T`zg{2@XPLSmE351(d=@s+%jLMOC9n40JfA7os-kE-Od=#GBuHo9bHz zD*K+4?LtmT+`VF0NJ{k~3+dFvyn!w=)oW%)2wgkouj7`xFH=0oWtJ~mRa0KPp%M(~ zwuX~uYB`T4m?^=23?Kzqf*qjK!$=C2tj7f|qQ|~f3d6kDoz-|5XOCYl)SeI=I`DRGWIayv?&j?1eEjqARJ)Ne%RWYBRNJuNvIeDJdcIbYgd4s#>t) zlNSpR@k)!fs$%p&-Ez}cD6H|y@z&<7ap2l7c-5w$C_*V8t3g6ZyX~e&IwbGXzsM&2 zlS$$vCIHv`B+JljaXu-Sc73={iczi_A244OF>e0ScX#=Etqm{jlkdrOcu)*u zx1~MwhWpW7JT)hJregMo6sx*q59EK&u1B|yf1+WIf7*Dm5mo6A&w9jC`9?zlm%H}^ zSpM2?0uVY-Y9M~>0G+E_t6K}w$FQoke$jh2BKga*szTyb*WGue>o@0O5}Y-?LUw@> zf-UzO^eT{uoffIACXJ&TipHZej|zh5b4?Je3W4soZ430_diQca@{?89ir9@>Gk5X0 zE{qBmd38)4^SphIubS?OO(S_e6&Ip;$5*_1u&H@g%2twuJtVS%bl@zA1_lr zKuJZOELZdu&sS0Ce>H{i_z zT(h6e_E-g)XNae&@Fb#;yxWloeBieG-Uaonww%2X?p}XfsKdd?>9|+h?qs>tH&{Mt zlm#w#MdK_>twGoMocRa@Yc^iV%r(081D)n}0 zV|?}EO!j>j^IGobqlVmFgSubBdTZY#E{+yM_Pd2o_?>5>C^OAVFNCXsBu zca;AMq-o{?PqPAldv)=wu_dZ;SIT!!uN#I_L0>@3CS6pc1{B3!f6V<1?Ln54eTa3b zU>q&9rAa1yb|ZBDhE@IS2<+v$z2LqujfzmRVLj5IWPlCY2VD|*dyxa|he>0{ReQ8x zhT}ZF_kt&2mujHkt<)E!_P(PJ|GanIS%KwR=>&;4SJ4GKwDyZ@vnhjjI+nVvCQ{rm zEb^SC4;K0M9qgg9SGtIsyA*@HLE_}tXs(POV93@^#{&bTW;NAuL8`mr_ZN1zmJTo72g=K%~+SiekN;8{-II8fwxFIUf zf@QqydM>Lx!|_<$VVU$Bh`BqBwnP-G2|Y>G+bssY)2~?WUkLQL?VQ_u{d<^G=0m1B zc+>+3cN0&XIOZY5FhFoCT&J>2l>|TC-Qsx zj0<5Z8c-~1PE;#|QWN7DB+hzjRi%f20(m!CCQHloFIuC`YvBPe*tv^XelIQf3S66? zlJ#zrD0yhUIjGt+^GTI`20%}30oM{7#Sh*#s=-vG`OVwSDwMVdhIE-Ch5dWRTkxZ- z^!lBs!&GElHD9{IFMkfU*wy)9Zlt~UW%0c^|1i&DjCvf@qbmqRBo<{aoIUrm+sxJRK-2+4WELb28D?cpDoFl6;dQU(Crqn9N;&OLd?nuGv6yyBRr~_ zGNKAbRn@XUElFlqv#2~K;P?$*aP$CoP&@EyR2zeT<;vR=gznLX40%sziCS?fnKN!zP?9@KjCWlQuw5si1K(- zo3%-s5}2@4>;}0u>O6sO z*K&o;nw5_wA&>QY^Ij;-7o$$bujMzNZZUC!@O8lg>;We*XiPGwFL^NwNU!dE5ICNG zCrh9)!fD&Z_bIq~!?R+Hn|>Z=jd_UC;mAmYDo?CldD3fYucB#k zY39wW2eIwVE;-452T*gX0;z32MWAH8lVGWjYXczC*u5Cr*MmOjV{l--$ZJV|FH{wA6}F7M=j~=9?j5GGi2WqS4eA)@e@x7 z$%HKRgjBtLaQU*t)?6AoaH-9FB^8vu zfoOI(?QGqRk%( zRu@C0mL5oacXGY4i*F6Fv)utt_(U5tckO0kiLg_oh6YDPJp}W0m-TUh*TM0zFjvfL zkc;yKi-O>4SxW%Mk2u((uq zfMRMW4nYbVB~8SYpqV1soh;2t|K;D@J^kC{|46J8kGYyO?t5n3MxID>*f z#glC$3)PaT#ZK&yWbC=9QrWs33;$9#$HPP0R=1azr+v~Op_>Lpso;jF0z(;**CRnm z9@HdwvVV^meXvLnV;aw7@+oya%rpA_kn3k6LL5GITs%c^t6U^9mx48jeI#+eS#08i z;3d}hOf4TYN;%EB&pSjVNSHUMksZ*Fa*tWLzNlDnn3Zyb9Gl|*p=2#!oH*$+~Pn3LadN(}V08ygY*Q7d-$c@1ke=a>0!AhTUe!?i^50;XvI0ED*&b|SM-7aGn6}zs)pjli6PAx$|!)S#og~v8G zi2CgbS}{?mpz|qm$^iijQkuJTCSX85dw!fT3xIzHfX9t&=RYR}bTSQOFI8~wc8;n% z^Mis3nF8Wt!SM_rH26yp4Ft*at?ZiC`GlT=j&MgZW%JN;a@86DQP>G^x6Z~a1NO1@ z2BSCiIid>!08!8VP4quR=>eh@@HwS(_R_K4lH>ET#h%uyJJ<>pAXKafzSF=@e0!!8 z>_J*sCSHlIok@fot_INJIz_nm{eMKb0TDi%P4jai|Jwn0x*bsAe-$qgo4mHE+W7L1 zFRawX%=|%~@s;?hfnDVS|ANMT$4vRZ#a94qvEU-d&e3bo18fQMz|23KV<8FHn&9ZI zxpPo|gy$T)y$8b8MbqT6f3Rr@xy;b^#V`BmroP-y-0o5 z@(ENx_4Tg?Mgr}yxGh;14{YWVe$`>r0jY{zz@@Dx1$@?LT6z=f&Er+CCySmzfIVKC zS)Q5R_r++WJf_sWIPQ$zYY;lZhU%7NA|NY!HP%sqa(Bv2Dq@s zFbLc6w-<|Z;T)qNfDvh4yTmz0QUIfdKz!me2G~i#40Vl_dd>_bda zf3^q$*hLv{YGDUjXT&Av*i`5fzzTZ&ocljPj|9BHLVuY4lVb!{j+I^w|FgORGz(Sf zn>9I+dC2p76cgpz2&BJqOWgWLhZE3YnBE*Zhr0JaPXicLY8gk(^NFkiN5zpr%{=^{ xWd~cwgwkG($hioXVb7t%xV>5aKW1S4^n&(6)j;cJRt*mLQ&ZAXEW85`{%`#{Knef= From 450ae56f06ad0b56ad1756dd2ae072f9ddc851bd Mon Sep 17 00:00:00 2001 From: Giuliano Date: Sat, 23 Nov 2024 01:20:37 -0500 Subject: [PATCH 05/10] Create routingMachine.svelte --- src/lib/components/map/routingMachine.svelte | 132 +++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 src/lib/components/map/routingMachine.svelte diff --git a/src/lib/components/map/routingMachine.svelte b/src/lib/components/map/routingMachine.svelte new file mode 100644 index 0000000..1529c78 --- /dev/null +++ b/src/lib/components/map/routingMachine.svelte @@ -0,0 +1,132 @@ + From d80ddeea1101c4f07e9e0e42c0f38ee9c9773330 Mon Sep 17 00:00:00 2001 From: Giuliano Date: Sat, 23 Nov 2024 01:20:40 -0500 Subject: [PATCH 06/10] Update map.svelte --- src/lib/components/map/map.svelte | 94 ++----------------------------- 1 file changed, 5 insertions(+), 89 deletions(-) diff --git a/src/lib/components/map/map.svelte b/src/lib/components/map/map.svelte index 6b9e6e5..d4e8587 100644 --- a/src/lib/components/map/map.svelte +++ b/src/lib/components/map/map.svelte @@ -7,10 +7,6 @@ export let mapLat: number; export let mapLon: number; - export let senderLat: number; - export let senderLon: number; - export let receiverLat: number; - export let receiverLon: number; export let zoom: number; let leaflet: typeof L; @@ -41,89 +37,6 @@ .addTo(leafletMap); leafletMap.attributionControl.setPrefix(false); - - // Function to calculate the number of intermediary points based on distance - function calculateNumberOfPoints( - startLat: number, - startLon: number, - endLat: number, - endLon: number, - ): number { - const R = 6371; // Radius of the Earth in kilometers - const dLat = ((endLat - startLat) * Math.PI) / 180; - const dLon = ((endLon - startLon) * Math.PI) / 180; - const a = - Math.sin(dLat / 2) * Math.sin(dLat / 2) + - Math.cos((startLat * Math.PI) / 180) * - Math.cos((endLat * Math.PI) / 180) * - Math.sin(dLon / 2) * - Math.sin(dLon / 2); - const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - const distance = R * c; // Distance in kilometers - - // Adjust the number of points based on the distance - if (distance < 50) return 5; // Short distance - if (distance < 200) return 20; // Medium distance - if (distance < 1000) return 50; // Long distance - return 100; // Very long distance - } - - // Function to generate random intermediary points - function generateIntermediaryPoints( - startLat: number, - startLon: number, - endLat: number, - endLon: number, - numberOfPoints: number, - ): [number, number][] { - const points: [number, number][] = []; - const latDiff = endLat - startLat; - const lonDiff = endLon - startLon; - - for (let i = 1; i <= numberOfPoints; i++) { - const factor = i / (numberOfPoints + 1); - const randomLat = - startLat + latDiff * factor + (Math.random() - 0.5) * 0.1; // Small random adjustment - const randomLon = - startLon + lonDiff * factor + (Math.random() - 0.5) * 0.1; // Small random adjustment - points.push([randomLat, randomLon]); - } - return points; - } - - // Calculate the number of points based on distance - const numberOfPoints = calculateNumberOfPoints( - senderLat, - senderLon, - receiverLat, - receiverLon, - ); - - // Generate intermediary points - const intermediaryPoints = generateIntermediaryPoints( - senderLat, - senderLon, - receiverLat, - receiverLon, - numberOfPoints, - ); - - // Combine all points to form a polyline - const route = leaflet.polyline( - [ - [senderLat, senderLon], - ...intermediaryPoints, - [receiverLat, receiverLon], - ], - { - color: "orange", // Color of the line - weight: 4, // Line thickness - opacity: 0.7, // Line opacity - }, - ); - - // Add the polyline to the map - route.addTo(leafletMap); }); @@ -136,8 +49,11 @@ From b9c61bbaa439046db9bd6c6db883fbd7559bb340 Mon Sep 17 00:00:00 2001 From: Giuliano Date: Sat, 23 Nov 2024 01:21:07 -0500 Subject: [PATCH 07/10] Update +page.svelte --- .../track/[trackingNumber]/+page.svelte | 134 ++---------------- 1 file changed, 15 insertions(+), 119 deletions(-) diff --git a/src/routes/track/[trackingNumber]/+page.svelte b/src/routes/track/[trackingNumber]/+page.svelte index ae00e53..1dd46aa 100644 --- a/src/routes/track/[trackingNumber]/+page.svelte +++ b/src/routes/track/[trackingNumber]/+page.svelte @@ -1,12 +1,10 @@

@@ -188,58 +124,18 @@

Live Map

-
- - - { - console.log("Sender marker opened!"); - }} - on:close={() => { - console.log("Sender marker closed"); - }} /> - - - { - console.log("Receiver marker opened!"); - }} - on:close={() => { - console.log("Receiver marker closed"); - }} /> - - - {#if latestEvent} - { - console.log("Tracking event marker opened!"); - }} - on:close={() => { - console.log("Tracking event marker closed"); - }} /> - {/if} +
+ +
From 8e8744b3c68510711b9e4c67c71380a16cac791b Mon Sep 17 00:00:00 2001 From: Giuliano Date: Sat, 23 Nov 2024 01:21:14 -0500 Subject: [PATCH 08/10] Create helpers.ts --- src/routes/track/[trackingNumber]/helpers.ts | 32 ++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/routes/track/[trackingNumber]/helpers.ts diff --git a/src/routes/track/[trackingNumber]/helpers.ts b/src/routes/track/[trackingNumber]/helpers.ts new file mode 100644 index 0000000..1ac6ed1 --- /dev/null +++ b/src/routes/track/[trackingNumber]/helpers.ts @@ -0,0 +1,32 @@ +// Helper functions for distance and zoom level calculations +export function getDistance( + lat1: number, + lon1: number, + lat2: number, + lon2: number, +) { + const R = 6371; // Radius of the Earth in km + const dLat = (lat2 - lat1) * (Math.PI / 180); + const dLon = (lon2 - lon1) * (Math.PI / 180); + const a = + Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(lat1 * (Math.PI / 180)) * + Math.cos(lat2 * (Math.PI / 180)) * + Math.sin(dLon / 2) * + Math.sin(dLon / 2); + const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + return R * c; // Distance in km +} + +export function calculateZoomLevel(distance: number) { + if (distance < 1) return 15; + if (distance < 5) return 14; + if (distance < 10) return 13; + if (distance < 20) return 12; + if (distance < 50) return 11; + if (distance < 100) return 10; + if (distance < 200) return 9; + if (distance < 500) return 8; + if (distance < 1000) return 7; + return 4; +} From 0cbe328e43a170dc2eace01cb77a441a9d709479 Mon Sep 17 00:00:00 2001 From: Giuliano Date: Sat, 23 Nov 2024 11:55:18 -0500 Subject: [PATCH 09/10] Update index.ts --- src/lib/components/map/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/components/map/index.ts b/src/lib/components/map/index.ts index 434d6dd..62ed216 100644 --- a/src/lib/components/map/index.ts +++ b/src/lib/components/map/index.ts @@ -1,6 +1,7 @@ import type L from "leaflet"; import Map from "./map.svelte"; import Marker from "./marker.svelte"; +import RoutingMachine from "./routingMachine.svelte"; import { key } from "./key"; export type MapContext = { @@ -8,4 +9,4 @@ export type MapContext = { getMap: () => L.Map; }; -export { Map, Marker, key }; +export { Map, Marker, RoutingMachine, key }; From 6b0f4b910d7b510381d17bc98eb116f910f39d38 Mon Sep 17 00:00:00 2001 From: Giuliano Date: Sat, 23 Nov 2024 11:56:48 -0500 Subject: [PATCH 10/10] Update map.svelte Add base layer for dark mode --- src/lib/components/map/map.svelte | 87 ++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 8 deletions(-) diff --git a/src/lib/components/map/map.svelte b/src/lib/components/map/map.svelte index d4e8587..4fe20f0 100644 --- a/src/lib/components/map/map.svelte +++ b/src/lib/components/map/map.svelte @@ -2,6 +2,7 @@ import { onMount, setContext } from "svelte"; import type L from "leaflet"; import { key } from "$lib/components/map"; + import { modeCurrent } from "@skeletonlabs/skeleton"; import "leaflet/dist/leaflet.css"; @@ -12,12 +13,81 @@ let leaflet: typeof L; let leafletMap: L.Map; let mapEl: HTMLDivElement; + let baseLayer: L.TileLayer; setContext(key, { getLeaflet: () => leaflet, getMap: () => leafletMap, }); + const baseLayers = { + light: "https://tile.openstreetmap.org/{z}/{x}/{y}.png", + dark: "https://tiles.stadiamaps.com/tiles/alidade_smooth_dark/{z}/{x}/{y}.png", + }; + + const baseLayerAttribution = { + light: + '© OpenStreetMap', + dark: '© Stadia Maps, © OpenMapTiles, © OpenStreetMap', + }; + + $: if (leafletMap && baseLayer) { + // Update the base layer reactively based on current Skeleton theme value + const currentTheme = $modeCurrent === false ? "dark" : "light"; + const url = baseLayers[currentTheme]; + const attribution = baseLayerAttribution[currentTheme]; + + const newLayer = leaflet.tileLayer(url, { + minZoom: 2, + maxZoom: 20, + attribution, + }); + + leafletMap.addLayer(newLayer); + leafletMap.removeLayer(baseLayer); + baseLayer = newLayer; + + // Reapply zoom control styles when the theme changes (otherwise they won't be applied) + styleZoomControls(); + } + + function styleZoomControls() { + setTimeout(() => { + const zoomControls = document.querySelectorAll(".leaflet-control-zoom"); + + zoomControls.forEach((control) => { + if (control instanceof HTMLElement) { + // Apply the theme-specific styles + const isDarkMode = $modeCurrent === false; + control.style.backgroundColor = isDarkMode + ? "rgba(50, 50, 50, 0.8)" + : "rgba(255, 255, 255, 0.8)"; + control.style.borderRadius = "5px"; + control.style.padding = "5px"; + + const buttons = control.querySelectorAll( + ".leaflet-control-zoom-in, .leaflet-control-zoom-out", + ); + buttons.forEach((button) => { + if (button instanceof HTMLElement) { + button.style.backgroundColor = isDarkMode ? "#333" : "#fff"; + button.style.color = isDarkMode ? "#fff" : "#333"; + button.style.border = isDarkMode + ? "1px solid #666" + : "1px solid #ccc"; + button.style.borderRadius = "3px"; + button.style.width = "30px"; + button.style.height = "30px"; + button.style.lineHeight = "30px"; + button.style.textAlign = "center"; + button.style.cursor = "pointer"; + } + }); + } + }); + }, 0); + } + onMount(async () => { leaflet = await import("leaflet"); @@ -27,16 +97,17 @@ }) .setView([mapLat, mapLon], zoom); - leaflet - .tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", { - minZoom: 0, - maxZoom: 20, - attribution: - '© OpenStreetMap', - }) - .addTo(leafletMap); + const initialTheme = $modeCurrent === false ? "dark" : "light"; + baseLayer = leaflet.tileLayer(baseLayers[initialTheme], { + minZoom: 2, + maxZoom: 20, + attribution: baseLayerAttribution[initialTheme], + }); + baseLayer.addTo(leafletMap); leafletMap.attributionControl.setPrefix(false); + + styleZoomControls(); // Style the zoom controls after mounting });