From 0fea2c87cd831f88581fa191a0c95381951c26dd Mon Sep 17 00:00:00 2001
From: pietervdvn Wouldn't it be cool if there was a single map, which everyone could freely use and edit? A single place to store all geo-information? Then, all those websites with different, small and incompatible maps (which are always outdated) wouldn't be needed anymore. OpenStreetMap is this map. The map data can be used for free (with attribution and publication of changes to that data). On top of that, everyone can freely add new data and fix errors. This website uses OpenStreetMap as well. All the data is from there, and your answers and corrections are added there as well. A ton of people and application already use OpenStreetMap: Maps.me, OsmAnd, but also the maps at Facebook, Instagram, Apple-maps and Bing-maps are (partly) powered by OpenStreetMap.If you change something here, it'll be reflected in those applications too - after their next update!An Open Map
Un mapa abierto
¿No sería genial si hubiera un solo mapa, que todos pudieran usar y editar libremente?¿Un solo lugar para almacenar toda la información geográfica? Entonces, todos esos sitios web con mapas diferentes, pequeños e incompatibles (que siempre están desactualizados) ya no serían necesarios.
OpenStreetMap es ese mapa. Los datos del mapa se pueden utilizar de forma gratuita (con atribución y publicación de cambios en esos datos).Además de eso, todos pueden agregar libremente nuevos datos y corregir errores. Este sitio web también usa OpenStreetMap. Todos los datos provienen de allí, y tus respuestas y correcciones también se añadirán allí.
Muchas personas y aplicaciones ya usan OpenStreetMap: Maps.me, OsmAnd, pero también los mapas de Facebook, Instagram, Apple y Bing son (en parte) impulsados por OpenStreetMap .Si cambias algo aquí, también se reflejará en esas aplicaciones, en su próxima actualización
","ca":"OpenStreetMap és aquest mapa. Les dades del mapa es poden utilitzar de franc (amb atribució i publicació de canvis en aquestes dades).A més a més, tothom pot agregar lliurement noves dades i corregir errors. De fet, aquest lloc web també fa servir OpenStreetMap. Totes les dades provenen d'allà i les teves respostes i correccions també s'afegiran allà.
Moltes persones i aplicacions ja utilitzen OpenStreetMap: Maps.me, OsmAnd, però també els mapes de Facebook, Instagram, Apple i Bing són (en part) impulsats per OpenStreetMap.Si canvies alguna cosa aquí també es reflectirà en aquestes aplicacions en la seva propera actualització.
","nl":"Zou het niet fantastisch zijn als er een open kaart zou zijn die door iedereen aangepast én gebruikt kan worden? Een kaart waar iedereen zijn interesses aan zou kunnen toevoegen? Dan zouden er geen duizend-en-één verschillende kleine kaartjes, websites, ... meer nodig zijn
OpenStreetMap is deze open kaart. Je mag de kaartdata gratis gebruiken (mits bronvermelding en herpublicatie van aanpassingen). Daarenboven mag je de kaart ook gratis aanpassen als je een account maakt. Ook deze website is gebaseerd op OpenStreetMap. Als je hier een vraag beantwoord, gaat het antwoord daar ook naartoe
Tenslotte zijn er reeds vele gebruikers van OpenStreetMap. Denk maar Maps.me, OsmAnd, verschillende gespecialiseerde routeplanners, de achtergrondkaarten op Facebook, Instagram,...
Zelfs Apple Maps en Bing-Maps gebruiken OpenStreetMap in hun kaarten!
Kortom, als je hier een punt toevoegd of een vraag beantwoord, zal dat na een tijdje ook in al dié applicaties te zien zijn.
","fr":"OpenStreetMap est la carte qu'il vous faut!. Toutes les données de cette carte peuvent être utilisé gratuitement (avec d'attribution et de publication des changements de données). De plus tout le monde est libre d'ajouter de nouvelles données et de corriger les erreurs. Ce site internet utilise également OpenStreetMap. Toutes les données en proviennent et tous les ajouts et modifications y seront également ajoutés.
De nombreux individus et d'applications utilisent déjà OpenStreetMap: Maps.me, OsmAnd, mais aussi les cartes de Facebook, Instagram, Apple-maps et Bing-maps sont (en partie) supporté par OpenStreetMap. Si vous modifié quelque chose ici, ces changements seront incorporer dans ces applications dès leurs mises à jour!
","gl":"OpenStreetMap é ese mapa. Os datos do mapa pódense empregar de balde (con atribución e publicación de modificacións neses datos).Ademais diso, todos poden engadir de xeito ceibe novos datos e corrixir erros. Este sitio web tamén emprega o OpenStreetMap. Todos os datos proveñen de alí, e as túas respostas e correccións tamén serán engadidas alí.
Moitas persoas e aplicacións xa empregan o OpenStreetMap: Maps.me, OsmAnd, pero tamén os mapas do Facebook, Instagram, Apple e Bing son (en parte) impulsados polo OpenStreetMap.Se mudas algo aquí, tamén será reflexado nesas aplicacións, na súa seguinte actualización!
","de":"Wäre es nicht toll, wenn es eine offene Karte gäbe, die von jedem angepasst und benutzt werden könnte? Eine Karte, zu der jeder seine Interessen hinzufügen kann? Dann bräuchte man all diese Websites mit unterschiedlichen, kleinen und inkompatiblen Karten (die immer veraltet sind) nicht mehr.
OpenStreetMap ist diese offene Karte. Die Kartendaten können kostenlos verwendet werden (mit Attribution und Veröffentlichung von Änderungen an diesen Daten). Darüber hinaus können Sie die Karte kostenlos ändern und Fehler beheben, wenn Sie ein Konto erstellen. Diese Website basiert ebenfalls auf OpenStreetMap. Wenn Sie eine Frage hier beantworten, geht die Antwort auch dorthin.
Viele Menschen und Anwendungen nutzen OpenStreetMap bereits: Maps.me, OsmAnd, verschiedene spezialisierte Routenplaner, die Hintergrundkarten auf Facebook, Instagram,...Wenn Sie hier einen Punkt hinzufügen oder eine Frage beantworten, wird er nach einer Weile in all diesen Anwendungen sichtbar sein.
"} ), attribution: { attributionTitle: new Translation( {"en":"Attribution notice","nl":"Met dank aan"} ), attributionContent: new Translation( {"en":"All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.
Some images are provided by Wikimedia
"} ), + themeBy: new Translation( {"en":"Theme created by {author}"} ), + iconAttribution: { title: new Translation( {"en":"Used icons"} ), +}, }, sharescreen: { intro: new Translation( {"en":"All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.
Some images are provided by Wikimedia
" + }, + "themeBy": { + "en": "Theme created by {author}" + }, + "iconAttribution": { + "title": { + "en": "Used icons" + } } }, diff --git a/package-lock.json b/package-lock.json index 988d8658df..95c2c2e8fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4029,6 +4029,11 @@ "integrity": "sha512-29GS75BE8asnTno3yB6ubOJOO0FboExEqNJy4bpz0GSmW/8wPTNL4h9h63c6s1uTrOopCmJYe/4yJLh5r92ZUA==", "dev": true }, + "@types/prompt-sync": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@types/prompt-sync/-/prompt-sync-4.1.0.tgz", + "integrity": "sha1-utMynv9bQRXjTvRpgjckTUEdRHA=" + }, "@types/q": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", @@ -9903,6 +9908,29 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "prompt-sync": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", + "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", + "requires": { + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "protocol-buffers-schema": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz", diff --git a/package.json b/package.json index 2ab8e4d9eb..691c168bac 100644 --- a/package.json +++ b/package.json @@ -13,11 +13,12 @@ "generate:editor-layer-index": "cd assets/ && wget https://osmlab.github.io/editor-layer-index/imagery.geojson --output-document=editor-layer-index.json", "generate:images": "ts-node scripts/generateIncludedImages.ts", "generate:translations": "ts-node scripts/generateTranslations.ts", - "generate:layouts": "ts-node scripts/createLayouts.ts", + "generate:layouts": "ts-node scripts/generateLayouts.ts", + "generate:docs": "ts-node scripts/generateDocs.ts", "optimize-images": "cd assets/generated/ && find -name '*.png' -exec optipng '{}' \\; && echo 'PNGs are optimized'", "generate": "npm run generate:images && npm run generate:translations", "build": "rm -rf dist/ && npm run generate && parcel build --public-url ./ *.html assets/** assets/**/** assets/**/**/** vendor/* vendor/*/*", - "prepare-deploy": "npm run test && npm run generate:editor-layer-index && npm run generate:layouts && npm run generate && npm run build && rm -rf .cache", + "prepare-deploy": "npm run test && npm run generate:editor-layer-index && npm run generate:layouts && npm run generate && npm run build && rm -rf .cache && npm run generate:docs", "deploy:staging": "npm run prepare-deploy && rm -rf /home/pietervdvn/git/pietervdvn.github.io/Staging/* && cp -r dist/* /home/pietervdvn/git/pietervdvn.github.io/Staging/ && cd /home/pietervdvn/git/pietervdvn.github.io/ && git add * && git commit -m 'New MapComplete Version' && git push && cd - && npm run clean", "deploy:pietervdvn": "npm run prepare-deploy && rm -rf /home/pietervdvn/git/pietervdvn.github.io/MapComplete/* && cp -r dist/* /home/pietervdvn/git/pietervdvn.github.io/MapComplete/ && cd /home/pietervdvn/git/pietervdvn.github.io/ && git add * && git commit -m 'New MapComplete Version' && git push && cd - && npm run clean", "deploy:production": "rm -rf ./assets/generated && npm run prepare-deploy && npm run optimize-images && rm -rf /home/pietervdvn/git/mapcomplete.github.io/* && cp -r dist/* /home/pietervdvn/git/mapcomplete.github.io/ && cd /home/pietervdvn/git/mapcomplete.github.io/ && echo \"mapcomplete.osm.be\" > CNAME && git add * && git commit -m 'New MapComplete Version' && git push && cd - && npm run clean", @@ -38,6 +39,7 @@ "@types/leaflet-providers": "^1.2.0", "@types/leaflet.markercluster": "^1.4.3", "@types/lz-string": "^1.3.34", + "@types/prompt-sync": "^4.1.0", "autoprefixer": "^9.8.6", "country-language": "^0.1.7", "email-validator": "^2.0.4", @@ -58,6 +60,7 @@ "osmtogeojson": "^3.0.0-beta.4", "parcel": "^1.2.4", "postcss": "^7.0.35", + "prompt-sync": "^4.2.0", "sharp": "^0.27.0", "slick-carousel": "^1.8.1", "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.0.2", diff --git a/scripts/createLayouts.ts b/scripts/generateLayouts.ts similarity index 100% rename from scripts/createLayouts.ts rename to scripts/generateLayouts.ts diff --git a/scripts/generateLicenseInfo.ts b/scripts/generateLicenseInfo.ts new file mode 100644 index 0000000000..3e7e1fa865 --- /dev/null +++ b/scripts/generateLicenseInfo.ts @@ -0,0 +1,147 @@ +import {Utils} from "../Utils"; + +Utils.runningFromConsole = true; + +import {existsSync, mkdirSync, readdirSync, readFileSync, writeFile, writeFileSync, lstatSync} from "fs"; +import {LicenseInfo} from "../Logic/Web/Wikimedia"; +import {icon, Icon} from "leaflet"; + +interface SmallLicense { + path: string, + authors: string[], + license: string, + sources: string[] +} + +/** + * Sweeps the entire 'assets/' (except assets/generated) directory for image files and any 'license_info.json'-file. + * Checks that the license info is included for each of them and generates a compiles license_info.json for those + */ + +function readDirRecSync(path): string[] { + const result = [] + for (const entry of readdirSync(path)) { + const fullEntry = path + "/" + entry + const stats = lstatSync(fullEntry) + if (stats.isDirectory()) { + // Subdirectory + // @ts-ignore + result.push(...readDirRecSync(fullEntry)) + } else { + result.push(fullEntry) + } + } + return result; +} + +function generateLicenseInfos(paths: string[]): SmallLicense[] { + const licenses = [] + for (const path of paths) { + console.log("Reading info from " + path) + const parsed = JSON.parse(readFileSync(path, "UTF-8")) + if (Array.isArray(parsed)) { + const l: SmallLicense[] = parsed + for (const smallLicens of l) { + smallLicens.path = path.substring(0, path.length - "license_info.json".length) + smallLicens.path + } + licenses.push(...l) + } else { + const smallLicens: SmallLicense = parsed; + smallLicens.path = path.substring(0, 1 + path.lastIndexOf("/")) + smallLicens.path + licenses.push(smallLicens) + } + + } + return licenses +} + +function missingLicenseInfos(licenseInfos: SmallLicense[], allIcons: string[]) { + const missing = [] + + const knownPaths = new SetWouldn't it be cool if there was a single map, which everyone could freely use and edit? A single place to store all geo-information? Then, all those websites with different, small and incompatible maps (which are always outdated) wouldn't be needed anymore.
OpenStreetMap is this map. The map data can be used for free (with attribution and publication of changes to that data). On top of that, everyone can freely add new data and fix errors. This website uses OpenStreetMap as well. All the data is from there, and your answers and corrections are added there as well.
A ton of people and application already use OpenStreetMap: Maps.me, OsmAnd, but also the maps at Facebook, Instagram, Apple-maps and Bing-maps are (partly) powered by OpenStreetMap.If you change something here, it'll be reflected in those applications too - after their next update!
","es":"OpenStreetMap es ese mapa. Los datos del mapa se pueden utilizar de forma gratuita (con atribución y publicación de cambios en esos datos).Además de eso, todos pueden agregar libremente nuevos datos y corregir errores. Este sitio web también usa OpenStreetMap. Todos los datos provienen de allí, y tus respuestas y correcciones también se añadirán allí.
Muchas personas y aplicaciones ya usan OpenStreetMap: Maps.me, OsmAnd, pero también los mapas de Facebook, Instagram, Apple y Bing son (en parte) impulsados por OpenStreetMap .Si cambias algo aquí, también se reflejará en esas aplicaciones, en su próxima actualización
","ca":"OpenStreetMap és aquest mapa. Les dades del mapa es poden utilitzar de franc (amb atribució i publicació de canvis en aquestes dades).A més a més, tothom pot agregar lliurement noves dades i corregir errors. De fet, aquest lloc web també fa servir OpenStreetMap. Totes les dades provenen d'allà i les teves respostes i correccions també s'afegiran allà.
Moltes persones i aplicacions ja utilitzen OpenStreetMap: Maps.me, OsmAnd, però també els mapes de Facebook, Instagram, Apple i Bing són (en part) impulsats per OpenStreetMap.Si canvies alguna cosa aquí també es reflectirà en aquestes aplicacions en la seva propera actualització.
","nl":"Zou het niet fantastisch zijn als er een open kaart zou zijn die door iedereen aangepast én gebruikt kan worden? Een kaart waar iedereen zijn interesses aan zou kunnen toevoegen? Dan zouden er geen duizend-en-één verschillende kleine kaartjes, websites, ... meer nodig zijn
OpenStreetMap is deze open kaart. Je mag de kaartdata gratis gebruiken (mits bronvermelding en herpublicatie van aanpassingen). Daarenboven mag je de kaart ook gratis aanpassen als je een account maakt. Ook deze website is gebaseerd op OpenStreetMap. Als je hier een vraag beantwoord, gaat het antwoord daar ook naartoe
Tenslotte zijn er reeds vele gebruikers van OpenStreetMap. Denk maar Maps.me, OsmAnd, verschillende gespecialiseerde routeplanners, de achtergrondkaarten op Facebook, Instagram,...
Zelfs Apple Maps en Bing-Maps gebruiken OpenStreetMap in hun kaarten!
Kortom, als je hier een punt toevoegd of een vraag beantwoord, zal dat na een tijdje ook in al dié applicaties te zien zijn.
","fr":"OpenStreetMap est la carte qu'il vous faut!. Toutes les données de cette carte peuvent être utilisé gratuitement (avec d'attribution et de publication des changements de données). De plus tout le monde est libre d'ajouter de nouvelles données et de corriger les erreurs. Ce site internet utilise également OpenStreetMap. Toutes les données en proviennent et tous les ajouts et modifications y seront également ajoutés.
De nombreux individus et d'applications utilisent déjà OpenStreetMap: Maps.me, OsmAnd, mais aussi les cartes de Facebook, Instagram, Apple-maps et Bing-maps sont (en partie) supporté par OpenStreetMap. Si vous modifié quelque chose ici, ces changements seront incorporer dans ces applications dès leurs mises à jour!
","gl":"OpenStreetMap é ese mapa. Os datos do mapa pódense empregar de balde (con atribución e publicación de modificacións neses datos).Ademais diso, todos poden engadir de xeito ceibe novos datos e corrixir erros. Este sitio web tamén emprega o OpenStreetMap. Todos os datos proveñen de alí, e as túas respostas e correccións tamén serán engadidas alí.
Moitas persoas e aplicacións xa empregan o OpenStreetMap: Maps.me, OsmAnd, pero tamén os mapas do Facebook, Instagram, Apple e Bing son (en parte) impulsados polo OpenStreetMap.Se mudas algo aquí, tamén será reflexado nesas aplicacións, na súa seguinte actualización!
","de":"Wäre es nicht toll, wenn es eine offene Karte gäbe, die von jedem angepasst und benutzt werden könnte? Eine Karte, zu der jeder seine Interessen hinzufügen kann? Dann bräuchte man all diese Websites mit unterschiedlichen, kleinen und inkompatiblen Karten (die immer veraltet sind) nicht mehr.
OpenStreetMap ist diese offene Karte. Die Kartendaten können kostenlos verwendet werden (mit Attribution und Veröffentlichung von Änderungen an diesen Daten). Darüber hinaus können Sie die Karte kostenlos ändern und Fehler beheben, wenn Sie ein Konto erstellen. Diese Website basiert ebenfalls auf OpenStreetMap. Wenn Sie eine Frage hier beantworten, geht die Antwort auch dorthin.
Viele Menschen und Anwendungen nutzen OpenStreetMap bereits: Maps.me, OsmAnd, verschiedene spezialisierte Routenplaner, die Hintergrundkarten auf Facebook, Instagram,...Wenn Sie hier einen Punkt hinzufügen oder eine Frage beantworten, wird er nach einer Weile in all diesen Anwendungen sichtbar sein.
"} ), attribution: { attributionTitle: new Translation( {"en":"Attribution notice","nl":"Met dank aan"} ), - attributionContent: new Translation( {"en":"All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.
Some images are provided by Wikimedia
"} ), + attributionContent: new Translation( {"en":"All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.
Rendered with MapComplete
"} ), themeBy: new Translation( {"en":"Theme created by {author}"} ), iconAttribution: { title: new Translation( {"en":"Used icons"} ), }, diff --git a/assets/translations.json b/assets/translations.json index d985d59968..860678aaa8 100644 --- a/assets/translations.json +++ b/assets/translations.json @@ -519,7 +519,7 @@ "nl": "Met dank aan" }, "attributionContent": { - "en": "All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.
Some images are provided by Wikimedia
" + "en": "All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.
Rendered with MapComplete
" }, "themeBy": { "en": "Theme created by {author}" From 5df2bedcafa3f4df558a025952acdc4c5984cc5d Mon Sep 17 00:00:00 2001 From: pietervdvnw0XPpD+a#C)T8rzjn5E+$apY)g#xT`!0SCZbG`a0$e;rzsEil?d+P z)43FcxvQhUK#mTv@pJe;44>!*j;UOWZXP(SN(VmDb|G<0Xm>r=NZP!3NSGBpe3ZYg zur#A(fR^>rjJM|_VbeYV^sUA%GpkkML z(KR5#lwQddyc%ug`ero!j{%VFa%CwqTRnC*(~+ikCLhTdjYAc4E WQ)qct*d8cXWExIBLj2<6>hFiTie^1a=LvV5-!Ky zcz^aL90lg8l?U+}sBMKoV`dDw`^{#^P@Mb?5&M|G>5%u_uWi7}Y5W0aK4NXYm~+?O z_fMD^85tV5U~%y j{1blLhK1~ylOAg>;Cuc34Hgyce@02DH*(tSlwA1; zz5`U;h?lTWtL(S=-g4!O`-c18{w=Di8kjHK7@OT%?-JGLf{RJq+UOh(jz{f5yx6yA z8^gbU6Xiqv!%=Xk3y&WvOyBa5Yi0Wt@eM!Mw66Enbw6SU+ R}u>I{5~o0Sxz8WZ9qU5=$_OoJfBr6 z$WpH1Q^=*Hg8i-9zvSG2{gTufAKoJoEJ&)*o>-+(Hn^bMC5xJz6vuKhzjfE#J#3GS zdlM>2MYg}bS4iq`)A~#-Ju3BS>JPN=mRfagbMt^l{*GhsQh5E#J{8!y-Y|a$euTI` zbq~1yz&u64C}m_PTC7?}BV>nCsv7mGP$-aPec)0OA|$u0oDp~nZ@101Rn2}{+IHBI zCiut7`jpZ#1tTx}fL1P5D*oRKzzwbIe13B`)Y=`j;pY+0qMpBLUEmizCGkqBUH}=6 zA>j@-t|e$Qbfjwz*Ma$Tp}`tRp<}fxeVJSh%L+~DxqB~`J#*YU4N9@Plg-WZa8|c% zKX2i$A_-DAUFY7%BXg=6(Q0SglstSAcp0{N5P-x{Ev8WF(-9l%>cS n@@g#3@2z6cUoWx`+3f@p~|d={Oh>SA)YavQ+ zb zJu}IDXCPE@u+$0L+H%P)NA`ecvmsMfO;Q^M<5olukk6(0c}68JWQ);E#P4DRxXxC8 zg#4!+ct4)DUTpS;Fe*xJ1{f_UQlw KW*P6T$w1cSJfUPHpY{| z2L*bJ&VK;LQ{}@f8~d_No1(2;wB@~|IHg!ybjQ`zRTGiCGVAT}vqlchMDy?JJpyxF z*KA#@Oq{Kzsx2H?Yof>^N(JTXA+MbBCt5U;GW(lMo4K;fWlZ$xn@dZ=C+UrGPuOi4 z(AciZO_x^{=pii;+4b(bli5^bj6DthIAQ(+XAz34=T&`pzWQrIImEYz`%Qr&fQRbB zU#DMOlG(b-jGH>SiP{M9+(M;`(j=W1JHxt~vHYW}UgfyOchqwt((;3tF2p{{c`|-| zhD -xx)ZoL=%nP>WxKbX=287n zrrG~Np=Di5GQwg&tVF9 0(-_opS@X;R%f z %;s=w5z z0-#C9t|S87@~wV8E@?_y;Lr{ReVNRrP-aCur)1SZt3+z%*fh7z4hcKtaId5-n$9Ag z^d_~YGXoSlT4^Xrwk6)M=0e$tlyv+0q@{ZMkPm@dv+77lEP(w%H5hb^y16WZF+B*q zc%zdux;QvmF1-_%#|o7T>@ASOc4UQMl%DC0XF(c?X6Z{=K)HEQCl)S5E%eQfqb>xQ zHb^!{6*bX42f~Yz@>2JUHJXo*FJ#ShUy;ql+Z*$M^yQkktkrpah#nDI8^1| Y-as zSI*Z81Rxs ?9wy=efU9G=5IAosjj zyc0@D)!$p!eKvO+U5rWwz{}n87db!=#|%AmPtG)UuNw$vxY-1! tz->XN(1|GBH~r5PLV$yv z>lFTpVWfs30O16d84LcwP>fdG@bK41rxVVfvO8hR1-0tre|}9)6-cPlF1U+K2)IU_ zss(E2xD3^pNflp+yn_)T4IMmmO6r+pwI2E}f5jbXH)!PrGd4mAzcXBOE`153(_jyU z#;C~ZXG}CXb5l>{cR{}wt>ue-37(tNhGUI#HlqBdqA1gx3A#}6X}GHe|J(KUHb>C9 z?zN?khe@fU;5Wih3>C|Wx%U~S{8K|jJ?oeIQ`!`>WBihOM3&AvnMRxB`G^pF?W~Xm z#uWkM+xrJt?`gxSwlu&I@F%M43)~L_S4+F3N?c|X8;MrSE?fe9e6ojb!TJ;d3pO
6+~%R-E9EtA4w_#CO5xL#9FY-;{dTENLhT&Jl3SL z#Q&~#q!Raq*f2e)bo&fD5&cyeR%}Kyc6EmR_g>t|^=)iYtex3|i>g`@TGl_>5rrF< zl7dcc*@&)i;x!N?W{vR1pY&`)p2(AXlGBlZ^jehm+hYIcfIJ6$N}hnY>QhnyhI*Yt zDTZ9hxyDWM(%*pG#%4b?`RPH8RZhaTj?#*c>{kP`f62hhGwR9qF&wkKuhxUOm82 9oOc8Eqnv3yB$5Rr#Ry87K69~lE`m#(PwC}&3&ra*uKiXNwRTA7Yti#3w@ zh4qfgPh99fU+5%j7^6iZ)s-=_C +rgm zZ`~MN+mZ2J*$KG~j10V&c;?PBZ~sukw^lM}7SAq{<-f5rnJ4 Ks?6Ss~v 5y}Pa?4ZS-(wYx)mbOu|1X=P4I{-&2>W!UvD$9Ag zLXwd}6Bk>=b6Ww2`Rr(@VIC_*r@kBuc9hhVJ3`%X0&=z`lUuz2?&*ZVzwho+;??bG z`;dQC_(#NW!bTt50s?ut+o_;hWYow2Wtvk>uV@(w+nE}gW;;!ytO?Hc@j0v2Z`1r3 z8lhdJpeOh+%?lxqcjmC+MoTJSXy&FmHfWzAB~9}MYOwt=rrq+8zRA@U5$v27RzP$} zNgWC {#qfuV3!*#dj#3FWaWakJ^;^S*_?oYX9U52KDIYmw#BOK@j z8M;3}!R3l|(wg)XLePBal^N16Y|{oQHO!F4pwi^TPq3e=3voN)2@)i6HgFRkb$waL z8SqdPyd`rA0xNI>7-%V{v$5-`8#P#UfiUx?HAGHL?iA!ISNtyYp_vtG<2Kw7670S) z#1S8W9F=~8ain{JiFwtrC@U|((IS!xutU{}R1K(Z#iNX;z^ zzG;%VEJiprZ?mh^>|LsUiCf9I7G|vT$8L2q4AP5t;@6`NI$IPK{VWn`x2T*&`{P0f zmR`>=t42ns7Os~W|IKTcxBTbi#NL|fj}-Id4OPgjG^*hz&L(M5b7Hqfidc`I5(R3^ z&O_mZCWy>G^vE@!+FakX9Bbr^^la?mhTpmG^>FZx1tYd(ofh{L{HcCN3JXO=@_Cph z4kKs80l==AuXio@q)6uO^MphjiBiMYTTDB9;9h8JYwNr7ejI|4@nOM*Nk)|IJg;>r zO~kI>_h#W%kp2^sAh@~}67mI|F|@&wpUQL}O7pZCu~^*-zu7~Bga6GzDTu(sO#C;l z@ci-p07kIO{P(D|(lo6gVH`=hQ %~u+J%)X2#&&ZcY+=99O;&n#W4~g2xg=9fh@*O z?pe+WzBm{O;KcFJCRabiXYH37JqpxT8f^vfjC|^lQpfvFJxqHD#?w1N(O}3-ZBR-Q zRq^GE?~N(?tG=^_WF%IukB;c9AC6gF=tLfK%QNgUJx;kOZaC(in>@u^J|Iqjm$;gw zcJ-CK&sU**9rOt?_it&skLOwSu-vbpxGd{@*pL+1)8xm+)u&or^0^OeDJtj1ipfoT z1Dqq6>UK0rXK-yLo2MeRI4i*jf*p>a7;n?l4(?t(cO_m|2A|Q+JqC4=pl>N4|9Oag z$;jVOjwC&2gi78~#$JjZUT|c>Bxe~zwxmCN^9m+fHM5y{$pGQGQEl Ism3yPl(hspp7E+OEO@U$6~zshI}VZye-J;?_?Y>@7QMaL>Lla_xIal z(A!B-^;kq8qVXG{k?S&o{*S05sEk#q$#p5=Hmnai^67^f=am)ggiKvO-K*zC%C>N9 z_DA;~Odhr8L#bv@&={ElgR54&jA*J>y*dinc$E~Jeu?BT8cLUSD$p`#{6j~gA~QKM zylHiVjBYK`|J;!+fbgtxhOXgc;vau%)OkWomH#Bh{VO8@Ne}d9pC_ghW=1@otP{&! z^3Pi2duLk);n&TTWAq{*dE;QoOa(K#kzGGMGbghuu$2g2(As_&nDTBEyEXXK$H!OU z(f!*Mk9FgDChl%pbbRma`G9cN^9muJ`!rnl($z{w;^ud_%{S-u?U;NLQR4 SH2hcmi2^W6`-I^UR=#ZFIL6t;~j_C(oAzBfp{KQ|EVh$;Lu0OqK zciyfG&0LF9L;NBSw*lX-k$WE2eecp*d!lJx&Ld_t9WHiWp9(IT3Z5~&&ejJ-&pJck zY!D~#i9yWw2J`Y>%yAsC`R8{cG=VV8(k529%32xT&~{s7Eb$^|509{RY(RuT-Im-m z$4Oie34*Tf&h`=h*fqIVu8b2_z|)rc`OG_-t@45w$_b0`){Ov)o|oedII8?&CI!cl z@CZb-aD`bp>l~!;q6PijOeZW^boc6svSL#X@rK0SHL8>c`QH#n;Yu-lSNP=Ci;lbB zbIpTCR`@{$RU1Krgml=zz&19CdTFQX8_!SekQ*MqCUdjs>LzS0gr7KJc3j-tGcBBO z5Qcy?a)6g&h50j?;f#`xXQ!q3<74K}9Z!nm(s-b^YYSi8N@HxhlIctfsiZY6v<(44 zZ2-ZT58;!D*e7dF%EJ^?ESBvdHL$|S=WibFU>y}z0y_UC->aNcuIYiRLKT79^@i?f zjCg1$D`9mjj|0g%0YW>6h8~goFQL_D@#O#${2!UJNJSb#Sk-UO1)(}AgLGA+gm7>9 z@h(0biFz0nSC#`PTUP4zZ4D%C5r #n&5CBfUhU`j5B75qIlOG&?yP&s;ArI1&S|_kphzPct;nnigSiS;y#u zJ%BvTlL!!bd@}En??YDK72~;hZ`*1&GVw--D^l?%eY`Pk@)1*A<`2NSA~=*wC9OhP zI*KSl ;GH~Br(s}5RhQd**E}Dw9GN6Lf*Bgm?nB`Yy+R^F z-l2KvNRZ`EgUw%)l##ozg5cn$Hr;n3-%F|3leDuRO=KwFSd{Xuj5}atG%Elp@S^ja z>vNj+hMwPIe_#_Qv^{!+ykVDh7 n6+PzbNh#B z0x@+zk7u*(p EfbizSV}?KRZ3zjEzk@uw$p-=o=|+cTPJO zp4hm*-1ol!XPJl@RsHv3J!H9&L)kqq=ofm}Y;OQLh5iaNGEjEWiJfldV~FEQaVzs@ zeIcw)58g}KNIaiofFcyB(0oP*jB`w7?_`o1$LH3I>?{e_+a}$6IQhe-*t!?CkI4!o z4EKKvXD~{8YXonM>Fb%<$2@i`Pmu)&&9FqCZpDVhk$q02{~puI)!cB&vmPs{cmgdo zkK30@S&EBZ#`;|r!k9S)%*^{`KJ-gz6ZqwiOxiYYQ{wyBy+6{}S&tl?3oL6=Q |o+wlHp W)GyYeu!vuLf%8N$@6yeP<2z7t{;Nz9Ju{ae&S<9kgXpg_zg9 3h(OjF7f+Y? z{%#p-pZ{#!4-fqCR1qa5rDRm0qNl%qTuu%J+&;1Od&$7nYCZ7Pf20v+-vTphfbC8o z0nkd39`q5V-t`(Op&fPgZ{Hy%&`1m|Y td&F^IPDVk(l?D zC3xSgD4C2}%r8`E-5a#=G~^4fpm!24t$}e8PyG_19#9=5Kb4T*VZrnGp*3Ha!O|4! zRccC;(WzU)bVSiU!M1#Z@Rl&PDe(hH$y@~PFRMPky2p6h9_8=6{#_?ULIipFqy1Fg z^As@s^N8v{+wv6T5wpC!+(2%%A!#uqIe>x`jQre&%(%eIw4Z{Bns9R&U1vU>EVx-B zwSQ|LJG^<+CP|p*OLH!&lkV<&mREjx0^)Nrw~SxWZM@p|$6Vun5CX7{%x#bUP@c3w z#NGB%Dy73EUH{MB5C1ece}qfRdw |optXL0cLGXYQ8!g}K7GMYAk+7Z>9TAz7F}hKjwkSdXgPmL` zPlYx$SOeWyLEmZSW5PrWk}T^9pfcEMyanTfo|eopJr92<^cwnhiwrlbUWrXdx|kJ% zmCYpY-HI=vC9o*EKAc?`5m2b@8h=gPBIIlgb4PZtF8mIc`Egv%UNX)neb2ThgnB|H z?m{GBDJ(rOc<=I`{%<{%kMod4f6)7-pd8ulMzk(K4N4d!%XUPTF!$lB7L$ni^b+=v z0eFW%IR=1IWWf<>8tkX!$t8(ac((HSo4r{{Sf5#rJ4b0HVh%xxOEprg%XItd3@f9k zf=x$Buc8}&{YIbsHwTm(c3>GJuZ+nX^$b m6Z4ehc?g8dFHxy`Pd(! {rlHE)hUq-q=?_I5-)PJ69F~139^5HnZoQLG z1}hMbJ*gNav^JL+%yVxXG8+Dd0h;xqc!@}}za+gm`s%XccEe?Kc4QR=w@{Ard(%z- zdW)@&eX$imv-M})h@*^O5{+_v4=g4uZ Dbn3omUiaRKOP%dr zbA%_@viMBFD;Y!o?Dd8($VvU%*%5Y@M6S5>T;GfEG8GkfTUXy5RYydU(axh3j(tH; zkuy0_0wUq@S<$EH%kO{5RfD8cFJqnG<-r6#)eQqLTxMinzMv`)Dxwr*W`a5f`#$uP zPw(N{^D*ZaAWXTe4=Qlj(+HR`;m*G$%XPNqtQrmF{nU_g>a`+P!rtqMn4KI>p7Hx) zlEpckq;| Ap*^N-YJ z }$mr1!CzP(y~&+SsxsQ&oZ zXDCJHd8El}8!ajK{C-yIgnkV@_jzg$k5yyiw!Tky#mskcO2l8x_VL!2$kO4_jdVub zw0pXh0FtV>n`7df33O-bLHFRsU%2cgAcqd(3H#vT1e%@oF5kODmIBx<)ueHEU!Jem z#h=k89lS5|<6m3$F x2S10dGJm7! z!`Brw57~ANY~_i1JHO%uT>NqCgiGZ6-0F0?L8JEJUK@{sddHjtDm$A8q;Ot#>;QN5 z@pixb?f5K2;rE>9MMrmjF-#-#bo?r=`}evbc&9s9WPKmAyuJ3n*Ds^oTC+*9&l|-^ zui^+Ty14J!70b?-lA5}hm-_M^2=|QN?~=V7IlYiyH}_8XgxpHp(Lo;W{`>a-!sOq2 z9^Qxrz91C%-z>#<&mY5P7@?DbJCu}Eb{28p&m)6I=VX6`uYlwH#|3vQqjrua9t9L{ z*CbF>hU0 >baY#+nx}W1#G~rvrJ6H zld}NZmTKrCu`>akoZURa{<8 _1+g=Q4vPpK8Qam0?^J6Gk;DFB=~kRp zrlEXbp7x#lfH58J+vA1z)pgs!N=Wn7I3^#=2-7WbK?%Q8zbVFbc*Se#V*Rv5zXMSF z>W`O2WU7*QKm0+1&%pXdbtWni?bsWwUA?wVVH$En5Vy(R#M&HGId3rp7&vdr+1ndT zxOq;UR@LCpQBtF?OLWvOxq|Gl-`~$r4NvUX^qVzE&W)So_C8oeT^`%nw^03O3r%>L zk?4z{35X1QJ$q#>8Fci$@+WyzFPSKGi m>%#ZCvJ&voV7~HMIHlq2 zk+ALSK8B<{1@LR(+K;7BGlLJui1-8=(pqm3Pc9Ms=21q0J8Ko2RDAM`83ZE*{Sh$6 zxd|pu=18ieBrT{P2c?uJ++sR^g%-PgqUnRzpVTBq(5A1TP=nv^N)zKiiK}cb)&l=^ zSv8`HV`9Y9bcNaQrB)R}4oAPbf64FsVmwmDb}TLStWx5WhM%=4BGoD1fPj49$J}S` zQ0PBlbH@$xAq-R(EY*F=TspE~z#Tn;o`cHR2Pe?xA 617 F`#u0J|^xgov?tT>!R zu}!S0@@v0XJ%B}w%(|?OLN%bVCL8kH++4WHfca5#;VreePipfvD90C$g6K>{V_NL^ z=iQU_B6sRm>>JEnapG$G1KbEQ56Piv!VD|QXor?R@6It#7+YemB+u-L2eyuBmxQ@k z_|_LrK+5;+;~1qE;_MT@Pv<4=k}Ol4pEp(hi3LCi^D&SZ@`Mb225k9z2as9#4jFJZ z(=Z4Jtu%VUB<24yGD-3Tm3l^~j>Zt42F3}iBM3{kN4x_oZS441DQc(cJD!N8c2h5= zK+5uQ*v=|{Ht$d6ipF+UD2JEOp>P-?v*V &-D<8--)I@L>4kd25g%g`T9Caul`>?2i%Q+<2-&XP1Y!?H;a_zC6Av=F{Zn+APV ze(>2LFvZE4>lFsl^+A3a0CU_Q>OmC>XW{g0>r8@rL-^xue!NI&-`$dFaXSDXhJKmF z&cYm9Oh0kjlTvU&{ntChgX;o%=9vm6-KnIy(<2Dz?B4wGM>=Gcx;6mc38n{=8Yx6J z@YO1KZv*lljL72FM3g)1wO`3+f=-~hr_r%%qR@iWf0J{6 G1?7vLB_~ui z-kC+6?L07dnWH1~emuxUu{cja08RB`B%R#qPg)MEdxVJPQ>-k{ c_}TL~ye^Sv>C-UtCjuI;5%AE!L0fV 9UpL_ %U#HHX6yIBC|E9i^bJ9lEX^M!kZxn{cpTdGUn-aI5j HmQ$*S%2E? zHdo#S{MBJFCBM}0 &&Kd`Y=5V%F1aG5)U+XZB{}ts+r385IYs|~Xhn2r;e*Ez z Jl^p`52bttX@f)pO+eV`g@aS#R`vrFsl@F|kw7ZH*49v((x*y9o zgbM|A-g4I)!}qa>SQ<}LeiyW-k55S8Kh^8j(?9k?C&lAWvR_~>lT82-tfR>D6B%vY zq@Wa|G8P~I5tJ+o798MF6%;B9A(6w=vLQR57|fXy$LGmHR~)?A8f<8LE-aR D={)Pj;kvzI9K98a=I)Vj1mesy9 zSfUS}_)t?<*KQZXVNDL_s 6~R)2x>`f6*}DZxMqs(rqPzA zy5+Z;s#Ku0=-@Pc^AVoN#>IBnF!kt0tBlhsj`jZ|3PKAybdT=u?;rTdHHHtLrQpCk zZg9zd2!5^r+uOg9sv2df-mI6KAlkW^@jak=`rJ?h+E6((&)0=fSl@zOFx``zhodPj zd2vOowBpIW?sUQQ`K&t&NUe`zZ$oqaA^Gq8#M}~>d}&r@!aU}XeRpFgZtazj+8tD6 zgaiYTKYm6X!&h{YGeE|dhA;d{cm0d}ZsG?Xg$gEgEAkm}h*32^law^Lb+56}-MKbn zC@WDx5{t+>>LHhu5%7e{cOJmn7EC2L|97LhMQ12eH7)u}5lg{-HaZ WbRnf%D-3|eZ4ZOVElJI;h{Tkp^1uU0L-)zoakm6cdd z>jo2EDDoiGai> +ZCaOmwTPuOiucl-POTZ z`meCQ5(gLaapEBZBkf!-21!XxXk2D4=}(O){kC5*o#)!fpX0tWkeQ1pztWf(W2a-E z{Pectvd;SJ40?z3gD-BiL^F3MCYR)my!|hr`Dk6Q#Op452hJyQTh}H5KkV!>F&hcW zW3t4b+W&4FRou{^yrORJxk90{P+in5Qi3TNX=XMs-5|`Fxa~I%cC1Z?0N>i{yCq+U zo$K1Y{|12w XdX*XY;>P7tcAR4~kh z=WvL{6FkbTcHs8# 9hl$C(OdfV5K^!ql!+%fIHD#Vz%p8~lpmW`W`Pr{6 z%%cV)MW3198<)MGcZ(cioIs_OgkbY`El7f> CcCIwfQzH&i1W-+M$b zR64e%h;whStI9l|Hs{gF<{dSLNWoy#QWJ=m02?KRj9HtRpn2N&Xkm|2T1vEqE$4!F zH6ILzVX3lYWtuZ-qLWVz2*cuvW?eKmO~^!@E+Fll=xW>_jN!Y9CtK>SPKs;#UX*ec zvGdpgz8yoSYqROdis%T~O0Laal5@?QVkmU~qv@=pn(QAoPIrmKMk6AlB&7r$-8c{s zkZ$Sj?#>Yc!szbql5S9HG$Jk1CGg(Qd(Q8i{ka_uJKMecd&TDhw^j8!wKi(|3ilV3 ziR;-ZWIIA;5Y{>s)%Gx_;AZ>kzt{dx*B-Z9>?<9 Fz0De*6o<28Fp`DvnHDw{k5r-W3KvB) zm7DrLU} @^as~i{Mjy74T$sV!Vh(9al|K~d_ z9jOuicp{mfKjnyW#U~t|EX{JYEGhUDjt?L1jScAjVvlsQm*k$@6R|1%grdc-<;DV5 z-7E@H!=pP|zTZ&|(^33Z)Wu=d%@Lj6D=-Pd=Y6>G>^^^QK$=prrsZK ~nsM?{l?evDir1b$cgl9^INbO_eD&0(Qz~WOw={T0a1NZBpSdF+lek zHu{`fCw1qoM)zD>Lv&u<@ukeZ5xNo%?<8YNQ0lUoJJFmyF4|I6ZiJW$IYC5IYpxVh zbgm1DNNy_Beh$4vLpGt#U~x D^uLv`ai8{$h`cM_IU%#!b1>0u@Us0U#+v2P6k!jdv=JSQU;7Z(~ ziK#K#HY5P9>^$#9`bS1E0fw4DIdj82WQ<_$_E`ja(f5>bT(e_Z_;S2wsM)T uQoM1=%#<);?fd8^DXT-sKmHM1Cfb01C9wSXUaG=Fj}? zlV}Ege*xE%{N3%Zk3Q%BJ_AQ-n(n6udQw9L9DG rM `c*s^W7{GS~x0XXTy_@%=J48$9BosDBUML zV#45 r5~vr`n)#NKJBOBWN&$+lorp@cCygy5d?1gR&*>9X zS8b7)2Gfyf5Gx?tkha@w|JdlgcjPRzy B@=m^u z5{zIa4*tbet&aQXwMdJKx^us@>-b$B0nnu_o_9^KF+HD2BB+2Rx*eb`9t=V3`T z|A+VRT{@1CLAE}h0{k6 2l(&%~C|JBwC7G!OK|ncP62fVi-#6 zxfuEPU!8+r2%@p#a)Xv4(K~3a6f|QjsE^-ZmRx1}ImJhFJU(53ehii=MXCwZs~@wY zeZ?*w?*W qg@XX(>$gHGondq z*`q0kr D&Q_zG(HZ bp48zQl-t`71d ds9xLK zr7?IrE|1poN##6Q&Za)`(80+_NsIa^z9H_L5LExi%Sw%kJ#x4?1RuIb$gA@A_a!IA zxrwe`mAF%swzgz2v;j|t?bj>xm>?T32y0?8!TI*bVY}%3Tb_4!8%&TTNjzvIU5vSq z_YKbMAA7*#Plxx+9ATV~(5OKwK2iGsZc0C;|36ZeU5lIOoJX?%E_CaUoA?cCs4)@& zh$S1whC!RQp3^0CvP%M|&i+h6`_o(dCvg1$YuEJ*@!vIUdQ9rWrZ1=WTz=tCcLtC2 z+^L&C%k67*DiQF$^~dA&t(kmTE!!sG`y~lbdMaKmUZRCL(!BQwnDD}7qH>YQ%T~@k znkUlMhT`FKG$tj; qr$kOJ&3lMNjxw+Yn&rRuRUhl%W zQrl55dgpNh1`-;oBth3XqB3**CDAmQmz)Ui;jVrg$B<($bRs)NTtj>-f|!Zh`gTQ! z(S#igow0(YMK%TyPGcd4+v!J&bQx~4u;onC(SEG4X1&iTDirW4KmU~9$!q~gQG7|| zyzytFeYmA&c{WkeP{?KM=9LQHzbQ-zwWX!;w7aG>e`$G5X=)X&P8-D@2fbm;ryK53 zTM8}$gho2XZ6Em{M13KgH90USfl7fGKgfx5pw>($K80lY^=gdT-#yP;3bUDJOXQ^a z3OVLM9Y!_VFR8#Zf_As?r}LAi=Z`lN&Jf0)a~d6missKGCOvfo$z^CeGzvH_5{7CT z>65#N@gQ*Z*;qZVR<3VvMrfjBL?foIFo=1&NH&$nls`BZ19K{YoV+C0QkvLG7rzOu zV181>9)E@mRfKUmf=-8(M1k>+uKbe9b`DA%jLgieaZITi@UCB#z(chqIO~v7{REKx zpa~rHO=>xfdqz!9*SU>Lfm MGi@<(u;n2}8zJI|@B~^dO+%5X zo`-H(<`;SkfvvE=hPVP)KMKCO43a1n|EIbE@o^J~S&cSV|HL?8^8WkvvL~XvoE=o? zSSN&sC%}lISx$(Osl0GO>ty${M3{@a+yVfr{s%#=Uf(*H_}nlU;1o7uN_w z|I0HDc(szbvy%Ba!cL#-laPp5|I(5qzw&c<0(c5W@dl_M5?fg8T4vAz-9e=CHavO0 zPj7(_$XVo%S^$CJmiEu$tbt`^3A@5>pYh){wKoPwbC@oN1(N0e0UfBCGM}vwEuCfM z4=cE|0~@A?9IkPZyj+QMG#OSnOTD1D7`S0pu2446^j0eVcu%un4crKFq$xIh`)+P# z@U~i?PbL6HF^^BY{3=- 3AStf#cWG_*70`zLuO~WjdL86z95-3G#mn5AMTspvy{VZB?nToODKau%sv9%7b z=sd{PsG}51KURQ+TkP1mXi3ar+n|dG;riJ7tFDt|Q6)wUf*DAes1*Cn5cm7+TmUD8 zjBQUPG3A#` EegS%AI$tY8qQ36;Hyw| zimeZ4ykLH+9RWruNzj{LExgp=&10+4K =ZH>u^QIf1M z9fQOnbq9z+ftKi-@1}?&!g+=0=Gz>r?2WAjsSJaWLC)UYEFl5>RA95cLI-qhQe9Gc zEYYdl#xbtf=LJe5esSG7CWaMpfYOdY;6gp^s?*>hVnym$opkyv?@`QZP^Uw9)4moz z*ZA#QG~&YjW-;v2gXxb+l8^hx0&|7GF_GWoeyv$fsOp*xlQ(Lw@E8yDiq46Z+XpaI z{rn=O@?3-M>Sv)hf?tdB+5}rIkOqADeHyV5iMr2d8HJNNSO`PS@WXDT6~<6zdV37= zQQJC~9dgr>nz;DF?lh}K|9SesoBs?ovn2rXc)oTh0wJ&bhs&)lNsU)#`&jgFYR<(p zMMH`lJn Q_=%%s~GP6da;lK3Cs116n>6yqc)2ArBx_ggG;%ZG( z2pa8eu+9vl>qQ!^{ewzG7|)lZ^}nLnauqHsHr2qn20p2CVsq!P3pcL182 zpgLAPNV`RYs98!AqYd2fIz )#0qMxCo0Q|}+2bzS#fpXNMm3To+U?SMi3F1)>`OTtjrRO)gi?|*x&UA~v3 zPk-Z|2%ql!vo=P&Pd5L!g{sJj3U&9;KmBFa7k#3t?)Hr>vPU#>qTXI|`G*#NpqEsL zZML`d#5E$5Whvgfr?5Q~{D6t0s=AM%s4k=FIIA7;G0jK>Muyoiv+;eI+W8Ns2|@cR z5qxo_vdPw{p%G${^@0i7TY|K?6nZNxBi4w>ufnrr(yRKarzNr!I71M!oT(AI8DRWl zxkPvTO0IW=v^*QPGW+qsh%&M3xi?#w ^d4{s*ydqEpN@*1if zzk`bAN^J#Rbu}>2_mzRsQ5AWWI-Q37<39cAjezO*Yhiueg*0^Tkg9w$ F 1KW^;_EVPu=Un(nix*H_3^2$zc zPE7#secylZgWs8nQn52ApF4-%s9kTHvipX-s%kChlqMN>+7+$*P?5X%MXChTHfEG= zuB}(aLOF^VYa!$e&-D!<+W^4MUbTV!?d$zP7tdg z@J^>rcO&9u{~l;R<-F$#X()Wh=&Y8B(xF5axe@RE *OOtw7D4pCq4ch;*09ygN z@{wwIVzt(DI`*}z{F{v&qZ|R}Wo6voRQh?g7G^u@&|3$LpRLJ0jj@NBfYx1Ul_Vv8 zs8^GhaPQ?uWD#f!6`f_B2&;9Nym;ro^>4w@vzQ|23o*T}5|k@6HrYr-ip+xrA53ob z>Xc~4nw~N|Zrg1ug6SzIWb9cy=Li;wQ^ZQ1YAZlYhhdBx?<91(w-A31i8X`th{97W z^3a%h9aw`QA9&GBujTq=mWmPs`6l0Ars^d9J~+16`wG$H9-ZQ6)#H7oyo~&q_SKtL zP?<(BLFey8gl?i3ND}L9*S$BM{71|K6lLWzs?5Yop?R#6{V=A+UB9Klt~~f`Lv4D3 zdTvI>HPhIU*dEWXjz6^TgID=p&EdlMn4m?31hfnW1Pt;8O)s}iOs2}Jj=iMS1GFN3 z7KtA;+EX@BY-@c{m?bSCdBfARC0iAblZV_=|I}kDsB-l{#4P<%q;*&baoKZYQ~-*P zJA`E^+H|9oaK5Ow^0DpZ2=%qyGn}BW??c@yxGiw(2&EHOQ@+wEAUc#C^8R^q68@{| z_apI<;AG~#zu?K8yAS29cY_;olb^}esl$qi#FpQ4i7d8NLQMXp`d=qI>4R)@sy3r2 zoi0L@C!YhhFM*Q?DU{XO0j}EqWc~wPwAuV+|7(Mw-7DlWwD(ajw9zIal{ YBK%yEH59?ViJ~B49r_iNekJmJ 5;1$x9g~?vU6|}9q11yJ_VZQrsGZ3 DSl(AKvfe8olm+$_&IlP1o~YJ1ZTK#?$3&9~@vA_}x z4m>qRm4?&Y!^1Idcikt{yd9O9%Ci^6j6-SP%ak8|3PQk>ppZL`2Sd-|`0e517#E`o zVpdI)UL3!T1#+_JOg(2;M4p4Ng_O?MUvLK?Wo=MB&5d!p#WD`bg=Sy{!pK#7DH1{I zHfM^$jA1DQwX~zezJC9kW8ck04n-MCKzKY1tlh!YXU$$nqaIZ)4)$Px!1iw2O{cyZ zrNSTv-@R8BS*5M^*mL6gVw0`WW0?P5SwW(WdW{E5tmE85$@K?vS9iVf&4qS?$?b;Q zqsbX0->t%QxB1XIx5fos6j}9Xp5Y#Q1h1-wD|bKr6Jnb8uZ})9u@O{s$j(1uZbD+2 zX>a}dg;BpW{@aoQ)4X0AX5=&pP(paV&2L~TD%e0aN5b@2{dvCY?-S-iRf$I5>c^ zPG4%uFSw&=yulS*)nUYIY?>RasHz1jpWmQJMTjKSGp?gTua>ZONk+Yp*Kbt3C*c%r znZ(AOb6F*1VW@k^-Q9iD^}PB4Mr4AG`xU(?goL~AThKhJdMcB nLeR!3OkPs6VA?zpLj|+rlC+$MYaO?8=T>OHXZ2Px?ssXcpw;wtam!peI z&~nNNM$d0xm425*0%7aEDT*hc0n!x}9dh9rx?cCDkEavEbF-GQ`QAfm;Deg~CZh}2 zu&s ME-!jY=fWE%%Bq5*T*Xosvf|rm^y ZQu6fN( zuiiiy mVtvgqV`vhD*3`=EL*K%1j^5){$x2W~!|eCIq&~qR~}I^IMiH z-Ms=7$JUYh0UBx5Me1|Syba6<_R{F;db$|Rsu5A)lRS=b&>3A+5ktt!r9R*v6!{j` zIAV}Iq B3 zh{43H^CxVp!k;QUxrc301UtRIh^F7Z>0<19f4YwJkEMs-GUiQO7eVSoMigSlKI7C5 zgfTWxNn^*{A~Z{-g4SQBwxRF|vV?jl=}Q$=+Dko~P&U3XW)U!@S2b4Yy*O!5n?P zhB<6XCzvGIWI87JhL9s3VA{ z)FXcS+wansvG>2!&Y-Ms%Y}>OCM{K? b^@xNtVeO6It5H_WUGw z7yrCyhEvO9$uODpA?OXgIoYOwCX2B@;b}ZWSdpLdw7(ikMrzG*sp7=L)x&+o!*AHH zVf~1nK-YtJ8&o?q&y(JnOZ>T?6@No%A!>}F%=wbp=soo$k{g4{Oi6aYr&jEJSm`UZ zuYc&7PN4(n(>Muj23bq@ER!V<_2?b~YADZQ_*Df;V!LpbH%*~=`FVow#|$XUSj(Zv zmbqy?KIVdgjn@+Lc(}b7LKc4 &r}Tw(Ea{PdIr$08 zJ{t9wk@Wekw(PNrth44$R}qJhpvkkQ8~<^(RZ8OgK(%EXH2Q D@M)oI>XwG zyhx^AT$PIBucVAsIw ia}ITt*7~qH*CvN^6#F0B!Vq zm1yh|&ydW({~qn>^yy~(bZdfLy`D9@>zV*qY~tziJ*UvM#$g4dpRzIu dK#ts~FKp2{->OSvaZ>4ad4|@96Wie1s2U68 C78mRnacN@pa4dIA%tb=sUns2?`E=k+=4dn_rk uiba)zX0)Nc2*+hhqQrWIUukdWwH-Fnj>bvcI4%BypN#v)| zO0h7i#{*VI0fkDesUcb4y60qq89~;ZrH5fY8yZT2`C<*b8Kdow!LCC$#JJmrC1;`; z(28L#I>(H9A*nqNQ&{}-I `X*a(!?HwMjC 1Jgc8lo*f+NgY1e>s?oWKP54x*B5-mo?UqR zB`}n<%v;$u2vpv)cL8!=W4w`ZG)gnFvi^=JRFtm5vhs97a6M!bZC7+8CwsyiCE(U4 z4tM}T2>zUA04E8sG5@nS0URdac4-0Pdr0?vdw2iNj#-VD_dp)Ds _mEbzi#qYyfKuB*AciV{^4Z_n=oNRv{S+%SZLb(0aObwc;fEj902@UWGZFHm0a# zOAFI%yp7(ztkJ0C((BC#HZ^xD!hEbf#*pP`rN}XqZN}wADth9Ef7OoSDW8tlimePW zP-SjiXV7_s FHU@x`cFsgBI^&tI)H^=}}C%`f8V( zI9sd>;-fDSgaz{X4j_|Z4~nQrV-(@ARF1mw`#0LHM@p5py1{BqBpk257i5LX;ViLo z6ycL3Q{)dI#$>T?)=i)X@y#1P5%9W4odZ7jL+!KO?_R~q1e=5X3y%6_*y*l%;pbv* z6b_SmU5~twUf;>er`s-mj ^_9I4SIS1X4=98DcZ2vv6F@VgYH8aJ;&|oJq3-ZYSw_3GF6&P z9C_h(?iC|unLkG@uV)1fJ>?QnJ8gY2_W%yuxPXY}*h2 GP5q-~nfL{XaEio7XM1X&7s8^jVB2n4nyTjRCBE?QHP-=#+xWV}MnbeX2HROk z)GQ*rIn-1l%ug7q-jiY@A@`~OZo1N?c9eM_v4YEyA>8{tJW!0L+D|oUY?Csup@LH) zR#5EeJ*@rDxn< Z>DI`=6I|&kDv!OY4&;etoc E?JINg{WyZIr!jY(^>AWg( E+3dff=l5`Q;r{W+vjgllxY85Fz_Fx+@q#mtp%;)U(62v#AVGb z&}i4uD$A$irmo-lnJh(4fgvzH)E2Kr7{0#8`!@(wf;JsM0vvv85UO1+Nl#n|~B7 zL*wg2 nam3-xfSY*zZ!kRIk C`yLbt<4 zjZ+%>?X4NfY0= Np$?tmSgc06nk@JM*|FHhRp7q`* z;BW_zf6NdHAW9N JcC|8r4-1bl?~OWFk8{Q^CL&5*>-#@ txuxuwu<&XsWqmd=NIY@hWH7GiBv-)Qmh z*?oNNVV>fSa?pllV)tA+0Pr3K-pqE=)qa1swlcuR=KV1YMzkf^^cXg0_gmh@c}KBu zE1JA7&z#=7LG?P5PO^4s<;4`Gkg!;P&eLC6)ELW3$$s|=%_zYxEQ;BWlUZlXA9N~> zuy%;eg3TBLFi~u|f*zJ7P@`gYHbmVqUyYh&{j&2w7+Io!vDqK@>TF2X|59TsuxLxw z;A h6D3Pk#-b4E~F- ME}Dy+X&!atzNJD(|cxPryqz% zz)9`bI+i|uAL5o^4ZWN-XQKdPfBms&JAZRIW ZAA< zfl!+|r_r0sTV3jt#zWI5oA-l|1M7AI<*sNP%Wi^oTXh%^pwAh`S&KF;d01DGd^wQD zNazrDVwV1DN4xXml6Q3eY_9JL2`#Ws3b#f{P^E}M6|Oz#j4|IcBc8!?=rbyqfW2B? z JX2W$MnS