+ What is Lorem Ipsum? +
++ Lorem Ipsum is simply dummy text of the printing and typesetting + industry.... +
+From b2c3b91d43333a9b5b346a2918bfac76f252687d Mon Sep 17 00:00:00 2001 From: Oleksandr Yankevych <82472610+Alexveselun@users.noreply.github.com> Date: Mon, 23 Oct 2023 18:09:06 +0300 Subject: [PATCH] feat(article): added google translate customization (#399) --- .../src/assets/articles/articlesList.ts | 6 +- ...-translate-customization-under-nextjs.html | 22 +- ...-translate-customization-under-nextjs.json | 2 +- .../src/assets/scully-routes.json | 2 +- .../Slava_Chub.jpg | Bin 0 -> 7385 bytes ...-translate-customization-under-nextjs.adoc | 449 ++++++++++++++++++ ...-translate-customization-under-nextjs.json | 12 + .../img1.png | Bin 0 -> 56039 bytes .../img2.png | Bin 0 -> 40854 bytes .../img3.png | Bin 0 -> 50364 bytes .../img4.gif | Bin 0 -> 1251573 bytes ...e_translate_customization_under_nextjs.png | Bin 0 -> 747100 bytes assets/articles/articlesList.ts | 6 +- 13 files changed, 481 insertions(+), 18 deletions(-) create mode 100644 assets/articles/0082-google-translate-customization-under-nextjs/Slava_Chub.jpg create mode 100644 assets/articles/0082-google-translate-customization-under-nextjs/google-translate-customization-under-nextjs.adoc create mode 100644 assets/articles/0082-google-translate-customization-under-nextjs/google-translate-customization-under-nextjs.json create mode 100644 assets/articles/0082-google-translate-customization-under-nextjs/img1.png create mode 100644 assets/articles/0082-google-translate-customization-under-nextjs/img2.png create mode 100644 assets/articles/0082-google-translate-customization-under-nextjs/img3.png create mode 100644 assets/articles/0082-google-translate-customization-under-nextjs/img4.gif create mode 100644 assets/articles/0082-google-translate-customization-under-nextjs/main_google_translate_customization_under_nextjs.png diff --git a/apps/valor-software-site/src/assets/articles/articlesList.ts b/apps/valor-software-site/src/assets/articles/articlesList.ts index c8696d1d7..e12d6a399 100644 --- a/apps/valor-software-site/src/assets/articles/articlesList.ts +++ b/apps/valor-software-site/src/assets/articles/articlesList.ts @@ -1,3 +1,3 @@ -export const articlesRefactoringTitlesList = ["0081-exploring-asynchronous-programming-approaches-in-python-mastering-asynchronous-programming-in-python", "0080-the-interview-under-the-hood", "0079-game-n-qwik-the-final-episode", "0078-game-n-qwik-episode-03", "0077-game-n-qwik-episode-02", "0076-game-n-qwik-episode-01", "0075-fostering-innovation-through-collaboration-outside-contributors-first-hand-experience", "0074-developing-a-desktop-application-via-rust-and-nextjs-the-tauri-way", "0073-qwik-reaches-the-v1-so-does-qwik-nx", "0072-the-evolution-of-web-application-development", "0071-zero-cost-way-on-react-d3", "0070-multi-threading-for-impatient-rust-learners", "0069-module-federation-v7-featuring-delegate-modules-part-2", "0068-node-rust-friendship-forever-the-napi-rs-way", "0067-module-federation-v7-featuring-delegate-modules", "0066-design-processes-automation-with-ai-services", "0065-react-native-and-codepush", "0064-monitoring-the-progress-of-an-http-request-in-nestjs-via-websockets", "0063-leveraging-angular-15-host-directives", "0062-module-federation-with-ssr-and-react-18", "0061-tackling-breaking-changes-using-nx-workspace-generators", "0060-medusa-the-new-year-dedicated-release", "0059-avoiding-common-pitfalls-with-controlvalueaccessors-in-angular", "0058-migrating-a-repo-to-an-nx-monorepo-while-retaining-history", "0057-valor-software-medusa-app-and-github", "0056-a-qwik-view-of-the-ranking-bar", "0055-rendering-nativescript-angular-templates-and-components-into-images", "0054-medusa-resources-overlimit-in-realtime-notification", "0053-modernization-with-module-federation-nx-and-react", "0052-module-federation-for-the-business", "0051-tasty-recipes-for-react-d3-the-ranking-bar", "0050-introduction-to-jetpack-compose-for-nativescript", "0049-module-federation-in-mobile-apps-powered-by-nativescript", "0048-webpack-plugin-written-by-chatgpt", "0047-introduction-to-swiftui-for-nativescript", "0046-change-is-the-only-way-to-stay-your-true-self", "0045-turbopack-new-hotness-or-promising-alpha", "0044-medusa-the-only-commercial-available-saas-platform-for-federated-applications", "0043-orchestrate-your-frontend-components-with-visual-dependency-graphs", "0042-next-js-module-federation-and-module-federation-ssr-plugins-are-being-open-sourced", "0041-nx-next-js-e-module-federation", "0040-nx-next-js-and-module-federation", "0039-debugging-ngrx-in-nativescript-with-redux-devtools", "0038-announcing-strategic-partnership-with-zack-jackson-the-module-federation-inventor", "0037-implementing-websockets-plugin-for-nativescript-using-react-native", "0036-tagtide-library-make-your-html-editor-friendly-and-more", "0035-diving-into-seeking-issue-with-mp3-files", "0034-performance-testing-via-artillery-io", "0033-arc-a-new-weapon-against-accessibility-bugs", "0032-setting-up-your-project-on-gcp-fast-using-terraform-and-kubernetes", "0031-ngx-bootstrap-v7-0-0-is-officially-released", "0030-how-to-deploy-firebase-preview-channels-on-travis-ci", "0029-scully-helped-us-reach-a-99-lighthouse-score-for-a-b2c-platform", "0028-designing-aggregator-app-from-a-to-z-part-2", "0027-designing-aggregator-app-from-a-to-z-part-1", "0026-multi-highlighting-for-draftjs", "0025-new-year-new-valor-new-you", "0024-incorporating-user-research-on-live-projects-part-4", "0023-incorporating-user-research-on-live-projects-part-3", "0022-incorporating-user-research-on-live-projects-part-2", "0021-incorporating-user-research-on-live-projects-part-1", "0020-why-you-might-want-to-switch-to-time-and-material-from-fixed-price", "0019-cross-site-scripting-xss-a-qa-engineers-guide", "0018-career-path-for-a-flat-structured-company", "0017-json-web-token-authorization-with-access-and-refresh-tokens-in-angular-application-with-node-js-server", "0016-testing-ios-app-vulnerabilities-with-jailbreaking-part-1", "0015-benefits-of-agile-to-business-and-team", "0014-valor-software-named-top-development-company-in-ukraine-by-clutch", "0013-testing-with-protractor-how-to-fix-synchronization-issues", "0012-hacktoberfest-2019-is-coming-and-ngx-bootstrap-strives-for-your-attention", "0011-the-4-biggest-lessons-we-learned-while-building-a-startup-product-as-an-outsource-company", "0010-angular-and-seo-structured-data-for-rich-snippets", "0009-ngx-bootstrap-angular-ivy-is-here", "0008-webflow-custom-code-snippets-you-would-use-episode-1", "0007-testing-canvas-could-be-easier", "0006-case-study-of-applitools-or-not-only-cypress-cross-browser-testing", "0005-figma-as-a-presentation-tool-unifying-templates", "0004-cypress-testing-running-tests-in-parallel", "0003-quality-assured-what-it-really-takes-to-test-open-source-libraries", "0002-figma-vs-sketch-text-alignment-comparison", "0001-como-o-scully-nos-ajudou-a-atingir-99-pontos-no-lighthouse-para-uma-plataforma-b2c"]; -export const articlesList = ["Exploring Asynchronous Programming Approaches in Python (Mastering Asynchronous Programming in Python)", "The Interview Under the Hood", "Game-n-Qwik. The Final Episode.", "Game-n-Qwik. Episode 03.", "Game-n-Qwik. Episode 02.", "Game-n-Qwik. Episode 01.", "Fostering Innovation Through Collaboration: Outside Contributor's First-Hand Experience", "Developing a Desktop Application via Rust and NextJS. The Tauri Way.", "Qwik reaches the v1, so does qwik-nx!", "The Evolution of Web Application Development", "Zero-cost Way on React & D3.", "Multi-threading for Impatient Rust Learners.", "Module Federation v7 featuring Delegate Modules Part 2", "Node & Rust: Friendship Forever. The NAPI-rs Way.", "Module Federation v7 featuring Delegate Modules", "Design processes automation with AI services", "React Native and CodePush", "Monitoring the Progress of an HTTP Request in NestJS via WebSockets", "Leveraging @angular 15 host directives", "Module Federation with SSR and React 18", "Tackling breaking changes using Nx Workspace generators", "Medusa the New Year-dedicated Release", "Avoiding common pitfalls with ControlValueAccessors in Angular", "Migrating a repo to an Nx monorepo while retaining history", "Valor Software Medusa app and GitHub", "A Qwik View of the Ranking Bar", "Rendering NativeScript Angular Templates and Components into Images", "Medusa Resources Overlimit in Realtime Notification", "Modernization with Module Federation, Nx and React", "Module Federation for the Business", "Tasty Recipes for React & D3. The Ranking Bar", "Introduction to Jetpack Compose for NativeScript", "Module Federation in mobile apps powered by NativeScript", "Webpack Plugin written by ChatGPT", "Introduction to SwiftUI for NativeScript", "Change is the only way to stay your true self", "Turbopack, new Hotness or promising Alpha", "Medusa – the Only Commercial Available SaaS Platform for Federated Applications", "Orchestrate your frontend components with visual dependency graphs!", "Next.js Module Federation and Module Federation SSR plugins are being open-sourced", "Nx, Next.js, e Module Federation", "Nx, Next.js, and Module Federation", "Debugging NgRx in NativeScript with Redux DevTools", "Announcing strategic partnership with Zack Jackson, the Module Federation inventor", "Implementing WebSockets plugin for NativeScript using React Native", "TagTide library: make your HTML editor-friendly and more", "Diving into seeking issue with MP3 files", "Performance Testing via Artillery.io", "ARC – a new weapon against accessibility bugs", "Setting up your project on GCP fast using Terraform and Kubernetes", "ngx-bootstrap v7.0.0 is officially released!", "How to deploy Firebase Preview Channels on Travis CI", "Scully Helped us Reach a 99 Lighthouse Score for a B2C Platform", "Designing Aggregator App from A to Z – Part 2", "Designing Aggregator App from A to Z — Part 1", "Multi-highlighting for DraftJS", "New year, new Valor, new you", "Incorporating user research on live projects — Part 4", "Incorporating user research on live projects — Part 3", "Incorporating user research on live projects — Part 2", "Incorporating user research on live projects — Part 1", "Why you might want to switch to Time and Material from Fixed Price", "Cross-Site Scripting (XSS): a QA Engineer's Guide", "Career Path for a Flat-structured company", "JSON Web Token Authorization with Access and Refresh Tokens in Angular Application with Node.js Server", "Testing iOS App Vulnerabilities with Jailbreaking. Part 1.", "Benefits of Agile to Business and Team", "Valor Software Named Top Development Company in Ukraine by Clutch", "Testing with Protractor: how to fix synchronization issues", "Hacktoberfest 2019 is coming, and ngx-bootstrap strives for your attention!", "The 4 biggest lessons we learned while building a startup product as an outsource company", "Angular and SEO: Structured Data for Rich Snippets", "ngx-bootstrap: Angular Ivy is here", "Webflow custom code snippets you would use. Episode 1", "Testing Canvas could be easier", "Case study of Applitools or not only Cypress cross-browser testing", "Figma as a presentation tool: Unifying templates", "Cypress testing: Running tests in parallel", "Quality Assured: What It Really Takes To Test Open Source Libraries", "Figma Vs Sketch: Text alignment comparison", "Como o Scully nos ajudou a atingir 99 pontos no Lighthouse para uma plataforma B2C"]; -const orderNumberForNextArticle = 82; \ No newline at end of file +export const articlesRefactoringTitlesList = ["0082-google-translate-customization-under-nextjs", "0081-exploring-asynchronous-programming-approaches-in-python-mastering-asynchronous-programming-in-python", "0080-the-interview-under-the-hood", "0079-game-n-qwik-the-final-episode", "0078-game-n-qwik-episode-03", "0077-game-n-qwik-episode-02", "0076-game-n-qwik-episode-01", "0075-fostering-innovation-through-collaboration-outside-contributors-first-hand-experience", "0074-developing-a-desktop-application-via-rust-and-nextjs-the-tauri-way", "0073-qwik-reaches-the-v1-so-does-qwik-nx", "0072-the-evolution-of-web-application-development", "0071-zero-cost-way-on-react-d3", "0070-multi-threading-for-impatient-rust-learners", "0069-module-federation-v7-featuring-delegate-modules-part-2", "0068-node-rust-friendship-forever-the-napi-rs-way", "0067-module-federation-v7-featuring-delegate-modules", "0066-design-processes-automation-with-ai-services", "0065-react-native-and-codepush", "0064-monitoring-the-progress-of-an-http-request-in-nestjs-via-websockets", "0063-leveraging-angular-15-host-directives", "0062-module-federation-with-ssr-and-react-18", "0061-tackling-breaking-changes-using-nx-workspace-generators", "0060-medusa-the-new-year-dedicated-release", "0059-avoiding-common-pitfalls-with-controlvalueaccessors-in-angular", "0058-migrating-a-repo-to-an-nx-monorepo-while-retaining-history", "0057-valor-software-medusa-app-and-github", "0056-a-qwik-view-of-the-ranking-bar", "0055-rendering-nativescript-angular-templates-and-components-into-images", "0054-medusa-resources-overlimit-in-realtime-notification", "0053-modernization-with-module-federation-nx-and-react", "0052-module-federation-for-the-business", "0051-tasty-recipes-for-react-d3-the-ranking-bar", "0050-introduction-to-jetpack-compose-for-nativescript", "0049-module-federation-in-mobile-apps-powered-by-nativescript", "0048-webpack-plugin-written-by-chatgpt", "0047-introduction-to-swiftui-for-nativescript", "0046-change-is-the-only-way-to-stay-your-true-self", "0045-turbopack-new-hotness-or-promising-alpha", "0044-medusa-the-only-commercial-available-saas-platform-for-federated-applications", "0043-orchestrate-your-frontend-components-with-visual-dependency-graphs", "0042-next-js-module-federation-and-module-federation-ssr-plugins-are-being-open-sourced", "0041-nx-next-js-e-module-federation", "0040-nx-next-js-and-module-federation", "0039-debugging-ngrx-in-nativescript-with-redux-devtools", "0038-announcing-strategic-partnership-with-zack-jackson-the-module-federation-inventor", "0037-implementing-websockets-plugin-for-nativescript-using-react-native", "0036-tagtide-library-make-your-html-editor-friendly-and-more", "0035-diving-into-seeking-issue-with-mp3-files", "0034-performance-testing-via-artillery-io", "0033-arc-a-new-weapon-against-accessibility-bugs", "0032-setting-up-your-project-on-gcp-fast-using-terraform-and-kubernetes", "0031-ngx-bootstrap-v7-0-0-is-officially-released", "0030-how-to-deploy-firebase-preview-channels-on-travis-ci", "0029-scully-helped-us-reach-a-99-lighthouse-score-for-a-b2c-platform", "0028-designing-aggregator-app-from-a-to-z-part-2", "0027-designing-aggregator-app-from-a-to-z-part-1", "0026-multi-highlighting-for-draftjs", "0025-new-year-new-valor-new-you", "0024-incorporating-user-research-on-live-projects-part-4", "0023-incorporating-user-research-on-live-projects-part-3", "0022-incorporating-user-research-on-live-projects-part-2", "0021-incorporating-user-research-on-live-projects-part-1", "0020-why-you-might-want-to-switch-to-time-and-material-from-fixed-price", "0019-cross-site-scripting-xss-a-qa-engineers-guide", "0018-career-path-for-a-flat-structured-company", "0017-json-web-token-authorization-with-access-and-refresh-tokens-in-angular-application-with-node-js-server", "0016-testing-ios-app-vulnerabilities-with-jailbreaking-part-1", "0015-benefits-of-agile-to-business-and-team", "0014-valor-software-named-top-development-company-in-ukraine-by-clutch", "0013-testing-with-protractor-how-to-fix-synchronization-issues", "0012-hacktoberfest-2019-is-coming-and-ngx-bootstrap-strives-for-your-attention", "0011-the-4-biggest-lessons-we-learned-while-building-a-startup-product-as-an-outsource-company", "0010-angular-and-seo-structured-data-for-rich-snippets", "0009-ngx-bootstrap-angular-ivy-is-here", "0008-webflow-custom-code-snippets-you-would-use-episode-1", "0007-testing-canvas-could-be-easier", "0006-case-study-of-applitools-or-not-only-cypress-cross-browser-testing", "0005-figma-as-a-presentation-tool-unifying-templates", "0004-cypress-testing-running-tests-in-parallel", "0003-quality-assured-what-it-really-takes-to-test-open-source-libraries", "0002-figma-vs-sketch-text-alignment-comparison", "0001-como-o-scully-nos-ajudou-a-atingir-99-pontos-no-lighthouse-para-uma-plataforma-b2c"]; +export const articlesList = ["Google Translate customization under NextJS", "Exploring Asynchronous Programming Approaches in Python (Mastering Asynchronous Programming in Python)", "The Interview Under the Hood", "Game-n-Qwik. The Final Episode.", "Game-n-Qwik. Episode 03.", "Game-n-Qwik. Episode 02.", "Game-n-Qwik. Episode 01.", "Fostering Innovation Through Collaboration: Outside Contributor's First-Hand Experience", "Developing a Desktop Application via Rust and NextJS. The Tauri Way.", "Qwik reaches the v1, so does qwik-nx!", "The Evolution of Web Application Development", "Zero-cost Way on React & D3.", "Multi-threading for Impatient Rust Learners.", "Module Federation v7 featuring Delegate Modules Part 2", "Node & Rust: Friendship Forever. The NAPI-rs Way.", "Module Federation v7 featuring Delegate Modules", "Design processes automation with AI services", "React Native and CodePush", "Monitoring the Progress of an HTTP Request in NestJS via WebSockets", "Leveraging @angular 15 host directives", "Module Federation with SSR and React 18", "Tackling breaking changes using Nx Workspace generators", "Medusa the New Year-dedicated Release", "Avoiding common pitfalls with ControlValueAccessors in Angular", "Migrating a repo to an Nx monorepo while retaining history", "Valor Software Medusa app and GitHub", "A Qwik View of the Ranking Bar", "Rendering NativeScript Angular Templates and Components into Images", "Medusa Resources Overlimit in Realtime Notification", "Modernization with Module Federation, Nx and React", "Module Federation for the Business", "Tasty Recipes for React & D3. The Ranking Bar", "Introduction to Jetpack Compose for NativeScript", "Module Federation in mobile apps powered by NativeScript", "Webpack Plugin written by ChatGPT", "Introduction to SwiftUI for NativeScript", "Change is the only way to stay your true self", "Turbopack, new Hotness or promising Alpha", "Medusa – the Only Commercial Available SaaS Platform for Federated Applications", "Orchestrate your frontend components with visual dependency graphs!", "Next.js Module Federation and Module Federation SSR plugins are being open-sourced", "Nx, Next.js, e Module Federation", "Nx, Next.js, and Module Federation", "Debugging NgRx in NativeScript with Redux DevTools", "Announcing strategic partnership with Zack Jackson, the Module Federation inventor", "Implementing WebSockets plugin for NativeScript using React Native", "TagTide library: make your HTML editor-friendly and more", "Diving into seeking issue with MP3 files", "Performance Testing via Artillery.io", "ARC – a new weapon against accessibility bugs", "Setting up your project on GCP fast using Terraform and Kubernetes", "ngx-bootstrap v7.0.0 is officially released!", "How to deploy Firebase Preview Channels on Travis CI", "Scully Helped us Reach a 99 Lighthouse Score for a B2C Platform", "Designing Aggregator App from A to Z – Part 2", "Designing Aggregator App from A to Z — Part 1", "Multi-highlighting for DraftJS", "New year, new Valor, new you", "Incorporating user research on live projects — Part 4", "Incorporating user research on live projects — Part 3", "Incorporating user research on live projects — Part 2", "Incorporating user research on live projects — Part 1", "Why you might want to switch to Time and Material from Fixed Price", "Cross-Site Scripting (XSS): a QA Engineer's Guide", "Career Path for a Flat-structured company", "JSON Web Token Authorization with Access and Refresh Tokens in Angular Application with Node.js Server", "Testing iOS App Vulnerabilities with Jailbreaking. Part 1.", "Benefits of Agile to Business and Team", "Valor Software Named Top Development Company in Ukraine by Clutch", "Testing with Protractor: how to fix synchronization issues", "Hacktoberfest 2019 is coming, and ngx-bootstrap strives for your attention!", "The 4 biggest lessons we learned while building a startup product as an outsource company", "Angular and SEO: Structured Data for Rich Snippets", "ngx-bootstrap: Angular Ivy is here", "Webflow custom code snippets you would use. Episode 1", "Testing Canvas could be easier", "Case study of Applitools or not only Cypress cross-browser testing", "Figma as a presentation tool: Unifying templates", "Cypress testing: Running tests in parallel", "Quality Assured: What It Really Takes To Test Open Source Libraries", "Figma Vs Sketch: Text alignment comparison", "Como o Scully nos ajudou a atingir 99 pontos no Lighthouse para uma plataforma B2C"]; +const orderNumberForNextArticle = 83; \ No newline at end of file diff --git a/apps/valor-software-site/src/assets/articles/google-translate-customization-under-nextjs/google-translate-customization-under-nextjs.html b/apps/valor-software-site/src/assets/articles/google-translate-customization-under-nextjs/google-translate-customization-under-nextjs.html index ca7987550..eb16f45b6 100644 --- a/apps/valor-software-site/src/assets/articles/google-translate-customization-under-nextjs/google-translate-customization-under-nextjs.html +++ b/apps/valor-software-site/src/assets/articles/google-translate-customization-under-nextjs/google-translate-customization-under-nextjs.html @@ -130,7 +130,7 @@
The header includes the language switcher component (will be described later)
The central part includes four paragraphs regarding Lorem Ipsum explanation
+The central part includes four paragraphs regarding Lorem Ipsum explanation
The footer contains a button as a link to the source of the content
@@ -342,8 +342,10 @@It’s time to gather all the information above and explain how the solution works. -The start point is placed in src/pages/_document.tsx
+It’s time to gather all the information above and explain how the solution works.
+The start point is placed in src/pages/_document.tsx
It’s important. More information regarding the above you can find here. Let me provide you some related theory.
beforeInteractive: Load the script before any Next.js code and before any page hydration occurs.
+beforeInteractive: Load the script before any Next.js code and before any page hydration occurs.
afterInteractive: (default) Load the script early but after some hydration on the page occurs.
+afterInteractive: (default) Load the script early but after some hydration on the page occurs.
and switch the language, say, Deutsch. However, the issue is that the standard Google Translate bar is still on top.
We definitely ought to fix it. Let’s add a couple of the following changes to src/styles/globals.css
Much better now!
mW$nuBW-r^;_`ZaA$Hrq2vH EClI7m}!neQRvESe>e3Or6PJCG<^B7mHS6vyKN3WZRJVx#^ zLYMjV3N}6F74dyk*etYcEJBlE5HmYX8;`eBRnfGggevTZc}n{VE?#?7tcE(GpA0uD z;C$m9vFT(+MI$XLOSYe-frD`y!7!b#y*+DfMQu?fb@g@d2BB5hK$noGD;C;{1?^CB zPg`@F%LE7Nv{2=3iA=Hvn?HN(mrwUnY(WUFZ>*(*wM)IEaMz;tHS7ePsR?d90qeBQ z3U%3~o# 5azlgp#xy |v5V>d2kU#xyzBnVpOHa)&)MC{ND;#s{k%>u{;D>Xs-WcQ5#wW; z+c=skxd~N{_k5!^+nQx%TL%kqDNeP~+a$CSFfjoUKL;Qe0c_02_ih*TM>0U<19HH3 zYOV0@2pSq|{#fHM>cX0FxVJ1lfBj|!cF@WTDAq1 f$Z|_It;xQwOKPQ}a(B=QDeZ-R`$qE@v~9b$B#pfe$8x zYF>?}tS#Qg3@j`*H>Xg83|EZP%jeD~OiunrVX4*mER3Ich0|Y7!Dd~Ps^Qz?!+IF* zyH7 O8O{s#!jgAg9j(*D)dJ_@UP12ik52%Bz~SnNt&4jlfdTJNf?FE1 zltVGs`wjE=reD=9cMf+67RI*HpT7}^vBEO(wd5?Qj zI#_30_y|UA5CMPX6JQ6!9>yNC7{&^+4%2GvF0F=KuuZ!quJ*0b<4uJJY^@~se4(T< z239gMwqZIyidU$eU iuaGW;^&c64BEgWM_H3 zwxFb^gj8ku%FPXXbwdLTkXZ;qWaYIZVvcP59F^>`nBuhd7MxD;Wl^U-g9S@y4cazg zSkn|m>L{pj4EFQ@Y}>VNa_m#dPr4@Er-8PyQK5mNtA_wL!%oL>>RYF4*NH7uZGD78 zplF+N6ega^#afw$^brG(Je?^-J-gG7%UX5P_G0eGVute`fKja3yL*qt-yZVLc?4Ey znl8yN`UO8SncV&GkN`mw_UDw4?r5>_{nz93bAN#3m;f7|AID87ru`PiOM%UxPn+PJ z-(kmYNAuzI+C5wW%5g!Pm!I3f^|Y6c6RQmrO~bE8q1C`^9$wxtWm$I44ZQ(6K~~$E zhGp}4234$) +@_Nx#g%K8dkxp|6!gTW%!D`x=ZMzjG&(8i8(tEwEva^FB1OR; z#=ASp2zqG~bWQ({&3YdT`yqb67(cd_H{Y*06PGS`sTCpAQCbi64mtWS^_japFEh|- zjv@{#DgUH1U4P}c``y1XYVf7i_S=Mb{=FH|S84P3k@A+arh!5lQ^wU1WKTQkRYoN^ z9iFF1!#65H9VBet>AO2bHKPgY4|bJm?rranRHN$99zUb)f#R$iZuN2z>&{|o#r%L` z-5YKS?B-~d*-zM^baCT0)lUE)gr4tlxEPs= *s6my0rLc8ohc>=p3e#+VXF!wZQfM(< z9M0^>!{pk6JVjqs#a?Ze;S#2!60FBGLty6PWT38!9p(?$ulI+yBXJv9iRVv%#5R <36Tqm!W&I{rC3?nsH+ @E@~LcN^XCiZW)H> zQk{f}{}Aox=Z!Q$ql@^e*}bo`!mx}_XI%8z!IXuq2HzKZl&HL23m?GJUAY{*Tx5Hl zt!`h^eN|qYYZQk|O_eT$>P@CCqAHInQa1DT*h**IES3?0)o4K4 Wh-avOo7E-Tv5OZcR%$M*Gl*{sRyT&;}F)l5~3g?2rs+W9_#BWe?z zsiaB@=@j#j0=fkE1sqfgNE7oBgj%I0-vS1c<+rl};3a>tm} EIb+*Z^ zNBW%Ts97ZnBP|Ui@28G2>swpn^T^dJamt*r_+n1PNuSGm$i!XM9LZ@o!9AQ-<~L_z zPy&wgd7}YU-%{1WwZgL*=z0w%10FKY@CF)lmpM(v%A6?It9%tR`i5E%bF}`TpXsP` z;ONU4TCY2)x!VXZ)3Jvs2cxINA-$7v5UKl&3FkEbtJi5Kh%2|p85SH^wpc=9AxMJ? zzW^{?aS9u3l6+CpcXzL}UmH?IPFl$AJzoq$RblbYH3)q7`U9wg1*dZ*OyJC{SZpVC zFLZ>p=r?}we1Ev+6u3SrOJ!+8SHbz) kbse3pFwNL@VSk{%tt4Zo zgiJhBqk67Bpq8vVgc9Gn!{;M)rU{>vyf|7)!kElhNW9lPr@R%vvNf`M(jAE6Q?EQ0 zCF<(
1czoFM_!8+59{k{?`rA38S#rIEP@KdFkuU#A=6`Xd!MLKmJzdig98 z7zhF)Lm>Zg|Ns0y5(oyyeMVsj9u zRNN2R9SSz9-q= szuC4%nw!Xv8Bw5}qt(fNa2bGRDzE=@{N(Sv+l@7}tYPs#N4 z_}gjcy>-ZNOHi&>a%fQP_@4OT`!ORB-;UAL$3uHR)l cFi4etn# Z!8PHgYW362wp2XTPit_bDB;ume*s7-oR nextjs-gtrans-demo +Would you like to use TypeScript? -> Yes +Would you like to use ESLint? -> No +Would you like to use Tailwind CSS? -> Yes +Would you like to use `src/` directory? -> Yes +Would you like to use App Router? -> No +Would you like to customize the default import alias? -> No +---- + +Also, install one extra dependency. + +[, code] +---- +npm i nookies --save +---- + +Now we can run the app +[, code] +---- +npm run dev +---- + +It's time to implement the solution into the app. Please don't worry if you don't find some expected components during placing the code. Future steps will resolve it. + +=== The main part + +Let's change content in https://github.com/buchslava/nextjs-gtrans-demo/blob/main/src/pages/index.tsx[src/pages/index.tsx, window=_blank] + +[, code] +---- +import { LanguageSwitcher } from "./lang-switcher"; + +export default function Home() { + return ( + ++ ); +} +---- + +I recommend temporarily forgetting the #LanguageSwitcher# component and focusing on the content mentioned above. The file contains three logical parts. + +* The header includes the language switcher component (will be described later) +* The central part includes four paragraphs regarding #Lorem Ipsum# explanation +* The footer contains a button as a link to the source of the content + +Let's change https://github.com/buchslava/nextjs-gtrans-demo/blob/main/src/pages/_document.tsx[src/pages/_document.tsx, window=_blank] + +[, code] +---- +import { Html, Head, Main, NextScript } from "next/document"; +import Script from "next/script"; + +export default function Document() { + return ( + + + + + + + + ++ ++ ++ +
++ + // This is a part of the content. Please take the full version for the original solution! ++ What is Lorem Ipsum? +
++ Lorem Ipsum is simply dummy text of the printing and typesetting + industry.... +
++ + + ); +} +---- + +The main difference between this file and the default one is a set of three scripts below. + +* https://github.com/buchslava/nextjs-gtrans-demo/blob/main/public/assets/scripts/lang-config.js[public/assets/scripts/lang-config.js, window=_blank] contains custom languages settings +* https://github.com/buchslava/nextjs-gtrans-demo/blob/main/public/assets/scripts/translation.js[public/assets/scripts/translation.js, window=_blank] contains #TranslateInit# callback function definition that will be used as a parameter to the main translation script +* #//translate.google.com/translate_a/element.js?cb=TranslateInit# - the main translation script by Google. Pay attention on #cb=TranslateInit#. The callback function must be passed here. + +=== The scripts +It's time to provide the code of the scripts mentioned above. + +https://github.com/buchslava/nextjs-gtrans-demo/blob/main/public/assets/scripts/lang-config.js[public/assets/scripts/lang-config.js, window=_blank] + +[, code] +---- +window.__GOOGLE_TRANSLATION_CONFIG__ = { + languages: [ + { title: "English", name: "en" }, + { title: "Deutsch", name: "de" }, + { title: "Español", name: "es" }, + { title: "Français", name: "fr" }, + ], + defaultLanguage: "en", +}; +---- + +In this example, we declared four languages to use. +https://github.com/buchslava/nextjs-gtrans-demo/blob/main/public/assets/scripts/translation.js[public/assets/scripts/translation.js, window=_blank] + +[, code] +---- +function TranslateInit() { + if (!window.__GOOGLE_TRANSLATION_CONFIG__) { + return; + } + new google.translate.TranslateElement({ + pageLanguage: window.__GOOGLE_TRANSLATION_CONFIG__.defaultLanguage, + }); +} +---- + +Here is a callback definition that includes #google.translate.TranslateElement# call. If we don't have the configuration, we pass it to Google's script nothing i.e. an empty callback. Otherwise, we call #google.translate.TranslateElement# and pass the original content language. + +And it's finally time to provide and explain the most critical part of the solution. I'm talking about the #LanguageSwitcher# mentioned before. + +=== The LanguageSwitcher component +https://github.com/buchslava/nextjs-gtrans-demo/blob/main/src/components/lang-switcher.tsx[src/components/lang-switcher.tsx, window=_blank] +Please, pay attention to the comments inside the code below. + +[, code] +---- +import { useEffect, useState } from "react"; +import { parseCookies, setCookie } from "nookies"; + +// The following cookie name is important because it's Google-predefined for the translation engine purpose +const COOKIE_NAME = "googtrans"; + +// We should know a predefined nickname of a language and provide its title (the name for displaying) +interface LanguageDescriptor { + name: string; + title: string; +} + +// The following definition describes typings for JS-based declarations in public/assets/scripts/lang-config.js +declare global { + namespace globalThis { + var __GOOGLE_TRANSLATION_CONFIG__: { + languages: LanguageDescriptor[]; + defaultLanguage: string; + }; + } +} + +const LanguageSwitcher = () => { + const [currentLanguage, setCurrentLanguage] = useState (); + const [languageConfig, setLanguageConfig] = useState (); + + // When the component has initialized, we must activate the translation engine the following way. + useEffect(() => { + // 1. Read the cookie + const cookies = parseCookies() + const existingLanguageCookieValue = cookies[COOKIE_NAME]; + + let languageValue; + if (existingLanguageCookieValue) { + // 2. If the cookie is defined, extract a language nickname from there. + const sp = existingLanguageCookieValue.split("/"); + if (sp.length > 2) { + languageValue = sp[2]; + } + } + // 3. If __GOOGLE_TRANSLATION_CONFIG__ is defined and we still not decided about languageValue, let's take a current language from the predefined defaultLanguage below. + if (global.__GOOGLE_TRANSLATION_CONFIG__ && !languageValue) { + languageValue = global.__GOOGLE_TRANSLATION_CONFIG__.defaultLanguage; + } + if (languageValue) { + // 4. Set the current language if we have a related decision. + setCurrentLanguage(languageValue); + } + // 5. Set the language config. + if (global.__GOOGLE_TRANSLATION_CONFIG__) { + setLanguageConfig(global.__GOOGLE_TRANSLATION_CONFIG__); + } + }, []); + + // Don't display anything if current language information is unavailable. + if (!currentLanguage || !languageConfig) { + return null; + } + + // The following function switches the current language + const switchLanguage = (lang: string) => () => { + // We just need to set the related cookie and reload the page + // "/auto/" prefix is Google's definition as far as a cookie name + setCookie(null, COOKIE_NAME, "/auto/" + lang) + window.location.reload(); + }; + + return ( + + {languageConfig.languages.map((ld: LanguageDescriptor, i: number) => ( + <> + {currentLanguage === ld.name || + (currentLanguage === "auto" && + languageConfig.defaultLanguage === ld) ? ( + + {ld.title} + + ) : ( + + {ld.title} + + )} + > + ))} ++ ); +}; + +export { LanguageSwitcher, COOKIE_NAME }; +---- + +Pay attention to #notranslate# class in the root div before. This is also Google's definition. It means that all of the content inside should not be translated. It's crucial because language titles should stay untouched, i.e., as they are. + +=== Working principles +It's time to gather all the information above and explain how the solution works. + +*The start point is placed in https://github.com/buchslava/nextjs-gtrans-demo/blob/main/src/pages/_document.tsx[src/pages/_document.tsx, window=_blank]* + +[, code] +---- +import { Html, Head, Main, NextScript } from "next/document"; +import Script from "next/script"; + +export default function Document() { + return ( + + + + + + + + ++ + + ); +} +---- + +=== There are three scripts there + +1. The first one contains language configuration +2. The second one contains a callback with the translation logic runner +3. Standard Google's script gets the callback described before and runs it. + +Pay attention to the following facts. + +* We use Script tag from #next/script# because of NextJS ;) +* We use #strategy="beforeInteractive"# for a couple of first scripts +* We use #strategy="afterInteractive"# for the last one + +It's important. More information regarding the above you can find https://nextjs.org/docs/pages/building-your-application/optimizing/scripts[here, window=_blank]. Let me provide you some related theory. + +*beforeInteractive: Load the script before any Next.js code and before any page hydration occurs.* + +*afterInteractive: (default) Load the script early but after some hydration on the page occurs.* + +=== What happens if the user presses a language on #LanguageSwitcher#? +It's very easy. When the user presses a new language link, say, for Spanish language, #switchLanguage# function described above sets #/auto/es# value for #googtrans# cookie. This is a message to the translation engine that Spain-translated content is expected. After that #switchLanguage# reloads the page, and we will see the Spanish content. Google Translate did this job! + +That's it regarding the main flow. But let me focus on some additional important stuff. + +=== Conclusion +Let's run the solution + +[, code] +---- +npm run dev +---- + +and switch the language, say, Deutsch. However, the issue is that the standard Google Translate bar is still on top. + +[.img] +image::img1.png[] + +We definitely ought to fix it. Let's add a couple of the following changes to https://github.com/buchslava/nextjs-gtrans-demo/blob/main/src/styles/globals.css[src/styles/globals.css, window=_blank] + +[.img] +image::img2.png[] + +Much better now! + +[.img] +image::img3.png[] + +One of the tastiest features of NextJS is https://nextjs.org/docs/pages/building-your-application/rendering/static-site-generation[Static Site Generation (SSG), window=_blank]. Let's test SSG on this solution. + +We need to add #ssg# script into #package.json# + +[, code] +---- + "scripts": { + "dev": "next dev", + "build": "next build", + "ssg": "next build && next export", + "start": "next start", + "lint": "next lint" + }, +---- + +Let's build a static version. + +[, code] +---- +npm run ssg + +> nextjs-gtrans-demo@0.1.0 ssg +> next build && next export + + ✓ Linting and checking validity of types + ✓ Creating an optimized production build + ✓ Compiled successfully + ✓ Collecting page data + ✓ Generating static pages (3/3) + ✓ Finalizing page optimization + +Route (pages) Size First Load JS +┌ ○ / 4.24 kB 82.1 kB +├ /_app 0 B 77.9 kB +├ ○ /404 181 B 78 kB +└ λ /api/hello 0 B 77.9 kB ++ First Load JS shared by all 80.1 kB + ├ chunks/framework-66d32731bdd20e83.js 45.2 kB + ├ chunks/main-12e9c77dbbe57e7c.js 31.5 kB + ├ chunks/pages/_app-3cfebadf4e2e7ae1.js 298 B + ├ chunks/webpack-5c046346608af636.js 807 B + └ css/24fee595fee43abd.css 2.29 kB + +λ (Server) server-side renders at runtime (uses getInitialProps or getServerSideProps) +○ (Static) automatically rendered as static HTML (uses no initial props) +........... + Copying "public" directory + ✓ Exporting (3/3) +Export successful. Files written to /Users/slava/Desktop/projects11/nextjs-gtrans-demo/out +---- + +You can find the static version in #out# folder. + +Let's test it. If don't have #http-server# installed, please install it. + +[, code] +---- +npm i -g http-server +---- + +[, code] +---- +cd ./out +http-server +---- + +[.img] +image::img4.gif[] + +The final solution is https://github.com/buchslava/nextjs-gtrans-demo[here, window=_blank]. + +== May the Google Translate, NextJS, and Force be with you! \ No newline at end of file diff --git a/assets/articles/0082-google-translate-customization-under-nextjs/google-translate-customization-under-nextjs.json b/assets/articles/0082-google-translate-customization-under-nextjs/google-translate-customization-under-nextjs.json new file mode 100644 index 000000000..7643d6c45 --- /dev/null +++ b/assets/articles/0082-google-translate-customization-under-nextjs/google-translate-customization-under-nextjs.json @@ -0,0 +1,12 @@ +{ +"title": "Google Translate customization under NextJS", +"order": 82, +"domains": ["dev_quality_assurance"], +"language": "en", +"bgImg": "assets/articles/google-translate-customization-under-nextjs/main_google_translate_customization_under_nextjs.png", +"authorImg": "assets/articles/google-translate-customization-under-nextjs/Slava_Chub.jpg" , +"author": "Vyacheslav Chub", +"position": "Full Stack Software Engineer", +"date": "Mon Oct 23 2023 10:45:55 GMT+0000 (Coordinated Universal Time)", +"seoDescription": "Multilingual Implementation in NextJS Solution" +} diff --git a/assets/articles/0082-google-translate-customization-under-nextjs/img1.png b/assets/articles/0082-google-translate-customization-under-nextjs/img1.png new file mode 100644 index 0000000000000000000000000000000000000000..8661be414fe14e5a55804b05a671dfd16e8749d1 GIT binary patch literal 56039 zcmZ^KWmFtNwC3Q05AHBXkl+OO!7W&D4H5!Df&~jY*x>F?aJS$dG`PFFyW8gN?m7G3 z?%O|g>V8tU>vZ4h)79M}s>-sMXryQW002{7PD&jBKmY>(a2G&?e@N~p#)p3ai>i`_ z^uG`Z35k@H^!Vxt9v&VW8ygiB6--U{_V&iZE6B#qNl#BNCntAtaq;y0%FD}pc=3F2 z@qBsrd~$MfcYlwMkAMI4dUo@?y}ixM%>4NHC@CqerKN3TWTc{^vcG>YJ3BitFmQc+ zEi5d&fBr~GNqO_|^7{I^w6tttVNuh2XlrY`zP{ew-5nbn``I?QxTI`iVxqORm5YmO zcz9S`T-?dYDLXqG27`r%hbJW^rKP7gHa5Dtx#j2Q`}p`kq0qXzx}u_@($doE>S|9f zFAtBO6%`eMfq}{GmqEod&hhQm$!Gf3iv!c=^ILZchCdFg{3es_Dc-St@yllwkP}rl zea9}8S-G`hZJ6!(>4%;OA G7)p^UH<4!07F>{(PS%e{P9S%Qim00DuJ-c`1m7 z+v0JCwf3R`p>NCnyjew^Ks5a>GHQ=Fd?~eow3NPD8Ln2wL$ 9eQ%8 zba685-AK2$O_vued|Hc_UFnPriPmh@iv#0?fqlT%H~~9A=yOaN1Vr$Y1Onmk05cA- z-}@PcXM^`qpwQ>PP0Yui5s`E;cd3AAPz09kH+hhE)gz2gpPA6o-ze=Xaj-FoxX#qN z8u4}%Q9$L47WyW3-Ip0 xl%#+ zAj6!t#;Q_SWbuYQmaacouez_2u*V8Ju?Mtg#=%8miyzSaddVDc=)GbtpjFw>LDlyZ znE&(%M^4{eubel$iR#3mMW0&gs2c;N_r*mUq1?k;Jq+BT3xZKSJLv{)v2$(@a7}&* zu5at`4A3mD4JfzoIXDV~78PVlk<4)aqT}7Kl6fzeCuH?IGf+NH(tiDbKLUR-`kiMK zt)#z{S!S|fBC#y_5>LpK)A@>&cP-enyhtR=RY*}rH)897Us2~BP#=XonL3`?>=Y7R z#Hf=fKc8x=i@Z=Rl9PsJ`V(R&o=eIy6JkfO@3)9w9+j7iM=(iTJH%-?-djoM8havL zPKj6=<99}XnTAxn05MS>c?d%~`4vA=^+Xq~!qVFP(Vy0gIw21RULh0d}-B sqUPPxZaJ5Ab<*QJcU_O@MmUh7tfeb(ZEm^8mkEigsx=T zM(x-LdT8<}q&6s72=3J?s>eWyk9SL4OOgag5F>h&1E$w2NfxL39_)hKgH?8)2VElz z*%rK>vQl*Dai?15&?r)fW%+6fI=p YhxG)1r4Q82-h1{Lb$MQr|I zQTOlqAG3$ugf&vZF@#eylXPuQ(Ropv^0Koua=4P2oIT5YiSJH-cHx|zpRD`WZia!& zz27laoe0)~fq3eHqyemGa5tJ!9;> -VnaP)7~`_vZ)>ARmdvv;IH40P5Sbv E@77E@CI3v_mTnt!!tCE^t8`o+?!kcvn5 zLATeZCc(kWW<3c#M$8!WTtx#dlLkFE3PGXkL m#3rJ=TxwuVsCEk#2vN7U)D{t<1%-nD*};rJXf_yl znG1zg&<$>?lre?Q|Fja@o(*aXTzSET+K4VMtKV#I@6vg{JWq5qwS7!O@@&B^gEp{X z;UAw8fy|wro+LxZcGKhQeLl LUtZRJF{p4eSa-=~QwJka#u^@ad Ca$7?S@2v*SQ|K61L-gl=9Rmp$qcN;h%;@TsFgbEJZ(M!#7>dQgnA z(lc5=?wJc@*eqzwr;hC){uE_U%%7`Z83MxqH}GwxKH{m$h40*Rx=VT1wVth8I#9lE zW!W&IJCFxo1=p$iFvvOZ<=h*OXY1;)!eC`7QXql0Fw=u$7Uf+-RQoS#jUr-VZ;lyw zy~{TzbCnHq_Ao_G9mEh%rVz0H-=r4guvE=|cM>rbA`Gj&+69(=RG%R%Smkz>jc$3L ztHxF#G&zMa^e@)S7}CX0#(_0?(8DN5Hwb4IzofwaIV)YG@b=_O_XE%U1<#JhP}|sM zp*&*s=oH~xShb0eXdA4wkmyu0;ro2O7Z5t&hg7prpTzjiZCq*~q#{jm)st}?o`0Jj zX`T!zwYi>gaXhhrd6;M+m&}dJ2C1GdQ~~hOq&!`As^d~XN3$+&rZrCs6iYA_*z|M) zyc2B!q0nikhMt+|Fm _^WN)~MP&LOS(w5ex@W%= zTGj9HZPu}$MAP=~1ccUU-d%Da&Fq`ww*u-pUb&Q7mP}efTd8`_?UuH11+33_)Pt?m z-VtU)tU2G+jS4+doS+h`wvGlC?C!-IVz=fBG!Io}7Kf*n{^sx1G3$lw`w1G77`}mp z+FDkclN&F$=`#o8bXodqLp(WKQVj><(3`l!O10G&w@=K~Q^maq(DGd!2$I{=w1{5Y zw8Zg-;e>C vSE04sjeC_& qaGrszb{NbsB*Iop6?*6V1@8(7VjK$>*!P7k9dxhmx6PwU2E#O51Wh%=J&)b z>nNEtDg(%3bz`uG28}TIobTNH^Oqy12Lfb+#^=w|W2T3vZzCiMEXabETgCpeb^1wx z?!LLut_{;qEd=UkB+&CYK~^Q>(gu4qnKI+^2BlWvA$AtE3p2g6kmY_TqS8{y4t8WX zCHZ5ssg-O$K`#foo?LKbew_!}yWn2W_pmNz%B7cki#e`vFx9DTQK*(Six<9yaPu#w zXX+F4vX$^$Vq5&}9YlvSyGtQCb|Xm=0Fo*Hb53kGBI4j+jn~u7 Rl z>LE9KTD^AXz99%L?ku1o{m(aVppV83kA|gzNL;B)gg8=4QkpaTcIOhUyILfgA8Qo& z5C2~1aj}_W2TX0%#fNF1H1_41OK3J}s447py9kg*F~ hU7=38Zf}qt!m? z5`AHtMnr(e>0Oop)5}w(F{)sHGN1o!Fr^A|2EljZ^l&HWB65!CA};WL^umFF1EgGB zl&BsJ$(;D~QjhV?b-?|-rnCs~oOk!%a&?47!UCL@b95C`9dFmc&gv>V!v-@w@Ph +snvCN4_H~#oiS{`DDM9rHJ zcpnmtTTbH~Zx?{`UY3U`<1riw8tviEsQHaa8@+f&M5Z_xq(I?5cYmB5fE{$1P|fE3 z-Q~v%X=Rnm`KE%DTNvEW=*m?}sq0&?hxdC>z#Vu~n_R*OEpNt~DcVW7E>0n5n(;%6 zLVaw^=XayB-FpmdWra$DKkZWp& Kc WaZ0+{ zlLys$*e3 Rx=Xrif@K_(&L1YAqGQ_%Uhx$Accpa-*CLhInsv84}H@~#Ens~-o}dMOf7 zSgI5270GHmv@|qk2SUEk+T>a0{H@M6>=GgPC9IFPf9*~^EaSw+UR}lTTP>7FL&KT2 zd$3w{ciyt==)jjKAhfH*?ss}DbE_MoQEuO$R_xAb^&hb)^4q#ow3c_g4s4#N)dtEe zjV#)D@9XXRs#|H!f7Y5r2-X1LNzgOYUW Mw&(8ciyGS%(H+_ z$sazh3i0s;JQ~wNK@Wm6DE#X$Lf&EdFHagt6s^){%r%u^3%En 3U>&*b-(#}t}1-U#EDi&N|gm<2?)?B)~ z-}cv?E)EUqfSu3nw?)t|mCV@ud_`Bg(u_P9l27xVCY@Q8-msuex5dUXi=N11d#|34 zLSa`*VquHwsAz-(>bT5Q_KEFNq&NdnFz_Y%x$8r2O)ZPNw2uEyi{X6t5&Baz7U2V_ zv+S$<{f9BsWiM*!tD9WQQDcdr)}@;(m8*SkilWXCC6z!474%j4$b*Lm!Y?MjygXvP zsIn27F~7MvoMd5FTMKB-9ZJ-nkd<6Iyisk31Gl%3pkHkOob2VP=VF0xZSLhy2CY+< zItQOeaOSHH@t+2<0N=$dDU_MFK7~@rEIg284Zq!8u= h z%9`F&wf4I>yk8Y^=qgrcW&V$ou)dqWKS_Ao9}-?lTG`G$r5?z(41V4*V{bmad%M`J zrQPZHE@<;T4tOah9WD&TjskC!fPh`_O`~|g0C3UEs;Hkh&{zGJE?>$vDq=S&qi76c zf`ZzAr1;B&kw^;yTIYz$$KuocM@K;)<3H4B-)(S!0RV9@B0M$leYHFo1kJ|9|HlLX z1H{4b)F7BR5RnE1@Auz^&mJ}_-)%9HzwCTJ_;6wDO1q*s*~!PhTNx2RVuRxcTK%)@ zR61k#`_4G^EUn>gWVOs?sTKPe?2I66&S$LBJ=uqjK8KyDW3xooZz1l~ve2y0yULq2 zw>l(xn)~DF)(|@lfd ar10F5Nl0cTxh>wKy+Mc^*6yl zK&+W)Kl_a`tq*V2aNgER+sq+}3jv-H46wv5W8VgIG}H$@{aK>^fCsz^kKmvVZtJq} z6<0Vv==Y9a y7}PZ@bzqHLdBfA#M8 zx-K_+Yh{u zTYn^P3w*8^yADg=#5q+@*W?VSw9MB3U9%YL>LaTKe55)om}#qlcW-|x9&YI>Y#rRr zEE?<)H;}mDke_9NAjI6F@X#XKNXaMUe0&7 e93u|La6e&t4W$=FvkhB0C9>uzZqjn5XJv`)fe>x*dYnYQ zQyYeg`S2U5^6Q ywwu=KW~q!j6t9&^aHO@U(B)n35B*oXjYc#?po z*>j{GJJ2w2jxf^<)kjL3gP?Cb?pF+MrXp0SX#dJR>>IWjl?AA9#V%?ZW_Y_qNKrsP zEvFkP` K3}1RIIG#ZEQy?z7XMN8%^yaS} zI02I=GlunclYD42#ugglBe3Uh$Z8KHH)rbTxZDSqk`O4a;^XO&ecq4!52+gGO)S7K z>|sbGSJIDEci_ob^>9WKbFxDO*{ M1Y3PpRC5wy=)qaf=jNo?N&DhhWc@RDu&SXB=TX=XDXcO?SJK!QT_ZOoUTFz;( z#FkAol7gx-Y&=Dp*{1YPlJqzbO_#AF<&5UHod _!9O|MbfX@V?a7B7}sI-d5^~P zqdGdT1IE!{ 8>yf7KS#enG>|dy3 zTf<6P=@|WoXVGw{k~V<;RK$@?L~fPNYNi{l&F1|BTjYCJEtRJ_;TgZj9^#3Fnz) zO%KNbk*SV@^SALf*ul=z^E>5RAs-TL1y|rjfb&qaH^x_4ud*Zkf;|>095ky^%gUR6 zW|B55q_KUv1X+V+{ps)l%TL^!iK9B$5>1_TZua?OZ%@Qmcu{bgRShqDA&U^4uYY%x zXFJ}05&$owq?2^0gfH*YZH!HAby&Q11PUsyzPu@dwyB1vjfvl0!iartV1#1e05HI_ z(~X512uLHt1HyOukOScXh;RTX0005_f&t KZ*Yz6Y$ct+7;vZ3=Vh+w`1VhaP9L{oNv2XijuXl>uY(Tm!Xx(q9=b< z5X{ r^F0D|eNM{Pay4a87e`(8m z^z|c!^1K|scds>D|JIAx2}4-jI{I5hj;Vc*wswhf@!qG~?Ix+`4!b@ &bb|Ygw04ySb&MB|Ea0%~0(6F=>xZv8`9l z)$`7>jG%|nPz `A%;L%}X1nkhVV+recx#UHe*<|8w#ZP6) 0o6CdVfT*;L929_;cGy zeivzoMTW@yc*ylA) a-`}_UP-&Hk zv|ov)kT+s$Y+qFztdaDr53Yv4dvCC}tofI`A~+=3lYM|a!~C+E3Nl~~sY%N3Q@O11 z_%ettsPdZ<=;$sAbkwXmE_Q`tOy+xuygB(?60_nkDp#f!9kH-yJL>493PuZ zQniDR)ns7`GTOZTLn-E&l0&m$(iG V8ST%yUI&)r z1O)C^vXt%_7#ki)l;@q__@6-K?1Hkm47^nvwJMn|(KPM~TTohxzm&g$>am{+e^~#P z?*K9 NK7(1{6!aS9qU$hd>keYUJnq&m4{%n;t8L3qq zL0qmR_%w&|38lo)igO?+S-4W?FY(`Jf=h5J)Mhlq9w{0{NQ88G|IB1IP5LK`<*v3Q zuAP%hmHx__ mzN*Gj_?dem#|PLM?9pZAZwAqx6|QNe?8{ zK#u5p0zD3-zBQzi!1T!N=G*U _V2iISLZZeis~v$3m= VJmRg>0F9>6WoaivP F7O0Ao3CxNR0|@d`Mm4)|PWK5E>H zmO_Iuc*jiXhZzy$+m$k}3CyS4KOKO{2)Z@Pl}{q5u$74_>Ai >pJB5{7;qV`w4u!h86MS`$YsV^`EBW&m@fD zq2b=SFTGZUVimsGYRlA{vQDS6;@eZ7%9`7xUVX6}tKQxxsc3;n1#AKOV#2++tIr$L zc|TNc=)eOX#51UNPg+Ku0;QY$^%sx=mZ es8hJSxepP|HAul>ewxrf*`B}~x+n45oL%I1{~OPiY#d%bZ#2A~RjH|7hYB=23F zz4?3GkyNT9PY~In?q-STLj*5Tn>N>O(<+cPt}9Ve2>0+7<8ZoBRKy6z2farFA_auP zUm6eD32iACa{L1|H2%T=Z~}sVOenmBv@~2!Zf>rxs+yYkf0+Jz{(sZ|nV)%M1uuT_ z*&mAOHB<%Z_O;t_SX;^skHKkq&fgB+-)O!M=UnfZSfTEHbr>qTfIbw~Fm8^us9tQk zhuGOZ|2PhH?^tsdec fRntg7;af^G=FcxDC9K&oE@yGd2L&nl>9BIS#DC#Zq zY|1BZSN2lw$bH6H{=Am-fn)OP9B?9+;pmj0HYs(Vg4W@*4PQT1!w{<0y)L#V4io!6 zGK}O}8eo^ph=ygB7cEly+Aj3zTGw1SS-jdVyakQ2UWUB|7*RPy)BfB#HY#_hZB<8s zTBuECb=!+6`Q}a0A2o)K;I#Q580+P-YI9?bbg>Zkla2RPfT!#6Tf$G3tY0B+TeJ82 zR2y+X7QRSMm#Y@K<=V6NH9yR(_w m_VDnwpyQKn{OwM({cboNd zi8 *I|9e?h zuoL6kzD}?(z?APOPWEc!5~!v}{|uXPv3GQkbFPR2fJXJeL%gLTJwszj`3GaWYU7M@ zLTr+LDUwt9JT52fPrNo&<>fqpT$@CDq+0#>(%ArJ)MPcTG9X!{K~xJ@;5Y}*k0NK^ zswe9cgHRiiLA1+0ouP~sgqj3u|E)D-^=^+})Iy0`c$HT9RhVPE?z#=OhV2znfF8Tb z1#8tlj}IV)blz6mg&%ecpg|V_B1!;fY`yxtMGfnOO)U!nBTQS1(s=g8E{qkNXsd18 z&i_I8Bd7soxel|^wsq^9@Vu56q!07?)LN04?p5}zU61VelN}~EFU6#@B;{yXgDLs| zjaBVgLdUGWOP$f(pVjvtoXJu|drCEHReZzw%8>}XL@U8tl>8w&f?+e9vYx2AXz zc6F7VN8^=roO g%&?67qW4PU&oL@Bnk{HI|j*;WTLAV4WpEc^gX7tWG?kB zfSUMEva7kO49ZrDYVWnf`NIt)(rEx>*S QB0b}%2Lv_O@FsD|_ zu6x4e?(|53_0mPy2`Y%Ulg-5~em_#uSy5F|;}BBv*92WogBqulGx9-|-fsLXg3WwN zBEeCETva#_8zBcJfZ+c9XE;!wNG??BVwxa8Ntt$rs#SrX%uR>2;QO%mH;xKxqCa)k zx+pOkAo7c{sa^BFCpy9Nuj0`;X`ul#V!2pf^az!d?ZZD20#fo%e~_CVjZ3yRTQU`M zQnQr&U;uldz;@0EusC7t_T(`a^s#13!!_XpTZ8tA*uQ9I6ze+kI=3;~D6?a~#4!!P zDSKzdD(RZ0llBUwM)N*(Gl=s#M*po0=cDWLK< 7fwRM4w|%mjFe8ou-tC2X_;dYEPFFDEW0V z{beDS%yy-v75GvWf+wVZ3_f=W#C~>ADr@N@29U%s`lD%f{xT4OEHNpUJCgR6 *lb*yfyd*x%pzzWOShp+1pe~SYMPn={lCU8_|U6;Sr;1@H*{J!2St~%Dp}roUpC# z{dZUkF!LTYZjxn9V`|JYaTs$rhdH$w1{KPT6g-)nt8cbnohA)&(jt4U{#SN6)%^-m z6*DangxDv{{^?0@0G1jf7o4s0NAgh<{$}&|&t7nJpJVQ7_Fj;gN(YfZmO^vmGmBob zKwph zDt@kE7FY_+8TAzpHpT4cHRx+Bq}ED*&loRFuiU`jfl)o{7->Pb*)WAOxy^dkaih72 zkQ=QY)5$#MOFn?H6Up>wM7kC}Rq3lVE>SNt#gkl4Rd|j<)dBg?M=xM%GVM)jy5rXW z! @xK^^xqNK=bBr|Li1n?6CRbk+kOQh2G4zbok!_Hj7IO7Jht9!8@4@md z1sL$T2>jFN@acWxMQ|mI%21-ZP~ik3P^!(emW{=E^WjeQ$aa;%`uf7ADI@Fb(nG7h z _vzlOOfPWX(j_y3F`ZZ-yvIFbnb8 z2nQAjnQbNF{b)a;pXaq?{&kHs=v%+{0mRJTVh#u`kSK*=YWON$HK>SpL#RskX#z@$ z8XeR$9E<)6$8>7bt+oTYhA~Ie%XhLnjD6=DeJ{!T;G*sKJCCo6A@hxlXeR}!(dEDD z{fm;%LvInyVP96)C0e8E@o)oM-iLPD!7Xg8yt`t{8ru4c^{67=84 JZ$jn>E!(juW&sZ>oN90 zbAN4{u_Wkz^d`DQ-Cs%OpHcY|V-#7#!7(dXST-tMo`PdEbHuISy22>u BJrT!6p{~`;= zbC~(kI{(W#+yH)IVY{;IV+Et5yTde+{XUEs#|yzR=0l_qR-2DZ8Bg2Vc8njdYN@MK zM691mK%N`IWWVhd!h9M2c2HkvZv36K`wOzUodlL`(4kUAnCaf__hTk?nf~eNX=Q)L zjcTJ&1~;&M)%`Yo_NwK_`IM>Rke^GN3CUP;c>PvA?7ppW89O>t?>?7y{5#~$OIhOp zv*h)gZD+wOO- C(!2+@B5^vo((?NchCty0g! z)pVBmz}GByNP8@1Dr@?a3D@9)KyptZygpVSNqrHxVvgad1o{mxI|{Ic?-_JkKImTo zu*p=G)6o7NJ)ctYJe (TvBLdL7(l66ThV4gl!;1 z##^005)XO 9^!yY%;JDy#QuH@b zz e#@%fHSxn`0 zi+FNM-$k}jz$U_phO^(F<@+TO2>*Z;Ojf%Rhc6ih3X5n?pGIJbfP$T6O~GCnMBpjj z#}$Rrw1D8$9k`$mU(NyB+E3J3zA)4}R7q 336S6vJ>cz3$S_z#pc7MY=y?%QzS9(7 zTFXFHH%pb4Eh5oPZE=Y_xr7{=A6PGeZFK5*=p4`9NQjF(_eV%D6NFh2KBAKk-W|Pf za6OWE2kJNDL(f4!;kjJFYKTHe;%@4)xUZXd(dcw(`26b4TiFP|eSw_(%fNKrc$FBV zBkKudqLVkGX!;?pZ}StcpY#8HKRo3@a$2{_CmtjaVL0ZRwqS_u#f-MFwt47{N gM*tYci0w{eq3Fi)Hw12Y+8p?)*Tv)*ICzpecWURzs?r~ zV)=6GSsahN7si&!RD6NFE4wMk*wgfqJ^DhYyb_cs=!KB`X7MGU1bJl7M1?udA;&$J z$Q6-h<@3aoXCLu;qOq^spqtNlbHc6#UQl&=O4^rwak1fHNBA?eKjUr)G-~Ic1#Q*~ zr3bbbq{K!P7?nr)<0ySW-|Qr_)sN$eQHc>5x7bg4!r*@)A!g_{)qeNIAoHLc#av4H z)POt5`7$F4sLt{=KXs_D^<0b4U&8i3V)>2nZP%pyJ1E-JUSsi(_DK~LI}@yeCY*JP z85}Ka!e1ZppmQSlCQ7D3H)l!cg@PDQ+lFQ23n(G@ktpyG*tvpyL z!4c9QPJ93 RE97L8_D-4;1y6*h^nKB=mMo)*t{O8jVlCRW;or~#L5H` zHz(l$^?}A~Zq7okSuTFt8smF@B-<9z2oeY*p2qAzjkRu#c0uoU-|#dI%o~)uQfyqK zgNfA0L2$JVzqwg`uB1~>GDoMnkD8fSU5bZU4eZ2Ee-0WG5AFApOo7Z=<#wva)UIFR z$x85URLI}un 9i_DaM;$sK6=0l! eXsCubLX`o zqJ}l%7y517 A?(%(jTKB6 zQ*)7bn(r&gn8h!tBIFHZ)(D1Gd?w2$JDOxdFMgmTzu9^LvlPABOQCB9MvJk(JxT{B zZVN6xnp@&g%a>>-oKw{=&)Ny@qvO%J_2xNhCe0!-zP6+=*eE9vtt%5Sz5W%6@Sf6= zG&3;vTH%XteOMW+58BGZqx%Xw_>J6{Kk;Gonw&}f(}D%xM}*XQ^=Gr6)#mjwVhofY zlB+$R%R95;Ul0AdRQ^7SLgl8eQG}8v!S HRKu!NS}91v=R71ODKD zjU*-Fe`#I|5o4^j^p9q6O%#L30=z5V4R^c@-hS&vX*iX`OVanb4t>kma6B^hHhJwH z9h=kYV8HFaD+_s*)MjeaXHYQTz<+PN@`Sihka%fK{<@ZZ(I2`lHpJ>??8h|Z%1@z< zvw6P5;nP8v?=3~NlkVm>nbRVL^&s<8^y!xG-mt*|r?KlU!Kj(9#Cg*riAU=U@y9MN zHtM p_vD5BIA(%9+OOpQko< zYfZPUlF$0q?0zSOjC0A(eiPsxB@<08BpuMlyJ5-rC1`fI2fXC9!g31}(xQqxi6|A) z`e+w?aOYRz&5a_^U3R!or;Xfz^u#By0l5``91EdxHEkOdhNgI@+_jmgl+OI^Xm--< z46oc9JX%i#OFy{6v~QDX#w5KF{v^qXkl-^i6j?UfBC6j1C@p;^jeuys`ry(%hJ!u3 zwT9A**D?)Q5eZt$7)scBaOm3U;UINjfH3YyR=40Hp{1#UW6gfpPb7Y*YvbwM6?w^3 zB)eP}!di?kxPWamjFX~JwOUKbT2AR>9 B$~$KwXS6qg$wm%N1tDB`q#k(T6MQogU@k*8_DR!{)b 4)<$=BgkOi8mi_hL%A+(TjZn-F8NiQr6Ad5d z$V8SUQ#XVSOE(J0`tS#$bdZ-SLrPp6)Lpv7Cn}ujVY}!zzXRM>1KZNf;uRx(gr6 KMw<2{H0ZPulo)~TM<)48z 5y{lBbTG^n zR3b)hT;%6tWnFq?W!16L$AOqwCD32(23fPypETxKSXDO$d-9=SYJIdWP)Oo*yG{OL z)AC_kUyV4}j5~xl425O5 M9+_@^XJ7R#l+`GE4XAf1XFU=Ea}0ZbiIl&O7USV8=YvA%n#;QX=Z| z@s?5QeJJAal-yeWZ9=L?{Ac|AZ;wv4AssaYr05K)65a3Ehe`Avqh`G2!^*N1nu3d< z)3bb9NWh~B3T6O$&~_sDCo^AALMfjXqNsuzJC<&;TMll!=C3;2rPFBIpMkjc1ue24 zkdd5fOi~Ont5>+{md@PX$9~n4bhl3E(>qqEU*^*Jm`!HpA29%|eTQ5-bg+X;b7rt~ z=tL^xFuzJO#=7M`Ht=VDRuyr>roJ#l2$5T)=SkO6s!7RsDd$N>o>2GYj@Tocme1KW zsWv)1eZkD6&g2@5#h_`Bl0Wp #(ejXxyy(i^EPY7inWoOq9DQ zw~ebl^@<5$Sa$?Wfskn6Q*#c^?8V`0-%LfHC9rEea6Qyu$;NfPjiyipr>#CT7F05q zGT1C3gho2HVz~~t($dsNq@-^yvRds49$;5aVPL;XRQkif7UdXm+?`m7(TLYRjp$BY zeo0Y|O=`Rln}yl qPXo3>k-YnXsxT1XFMGL{!iA3#9L zT+ww%QN>Ig${##|`yun=R_5nO;jEIku6=CBXG8fCs|)Z|)4*1Pwp*;wy3*Igkw(h9 zZ5}dhx}zE_ M`C+F#%dnHiOBR=k`NV=#GjN#ueOb$HgmO9@&jT}|n6|7Vq z)-4)4K-+-BsB>O~{>G+O ^S4QQ%Ngsr=Opk^g5D>3@x~uqZ2U7Sg&=IrDuC`_a^1a z2bYtX`E)CKHT+|@?h`e2OPX;FS&e`s1wP(o>r>w43jd{^xXkfPhB*-*Gs9_6T9WVn zUkS0n8OK~t{_)8S>ts*M>06toUP;V9jP@cP(1`|@U{>&BOBe%2Ku(U$6eSpMVePAy zE?II06ZRmpD00xm0vV;qwu$a*L$@e&U7G5FaQH{50zloY8NF^1%O&zimiLz9RR1d6 zNXh984)?P!?U!UcL1Xk_-r+7jIPuUTAT(jBc^5_Y2?p&%AG1THhU3g>V}>1J#~}M| zA7f%4Z4r>1;@=H@S12xk3nx?^;UpCv1 LkC*?n<7H@T^28>6nUF$aX!K)gh_w;^Ih0_2)cvB9 zU7XGi=$Q%RH0}$fV>jkB4q5XH7Q!fYMG4>m9y3o%A`HN{7?o=oc1E%#@{;cyXOGmo zO?Hm|>Dh*l!cJZj6wjVIRe&ZGCxst>;Go995VpF&yzU5Me|8`<0-&LE@_zoLq<4#e zmT^$8lI}V^uIyk}lp@?GT$>}>YyM$l4qLX}-4bqLl-mHX&HzP9_IiieH57w9YGrCy z)qzZzdhCg##iaF)k`%O=tW*9Qm%LgCj8X3X>6$!A;L&$ovTY&4b)8o(m w8_v z3WiH-O>{(oU3*6E>q5jaf|CXj46QM8^4t;RCc{I7<%s(A zhAX56>DuuFIH+IM6{@e&wHi@g zWdjA6&mi>}5Hf8H@S`M^a=`|rLt+J3lMeh)4#ty2j**1rDk~_!pN1dib}f?|l+w}| zN3^=ksO|y3!|#diG+Rf)%X11)E2_33i2kczcsk>4YL+ocM|vIsaDKP#?7bN9C!bx# zBfk*kU0q8J$~ZMH3|i!NcnHF799mEg1uy_^-u})*+{2-*2)KScrAy+n)`BA9q1fTK zqYGdOXRnj*zKj#h)Os{;@B{aM-WmHKA>QyD0#LO i+WR10aB3HASgaQZqX6D+lcjT(qShG+GQWk(hQN z4=)}`LJXy>a;H?nK0;^o>>mP(+cT0JOc8Mu>lv9huNN-d!d*1}2}k(?`$h8^*?kwD z1{^W3?v}93Ijx9G1Arq!wo{lE0)L|dExgm~jPkUEOVMeU*#!=q!+}P+F&xL*5H_Cy zboJt2`%%ORiM6K004a|p+l7lEq (vrJ z;frJ8ZY+^6MhGydBlE5@2|BX~yd#J0c^)>`C|)ou{qthtu^KiAp+GhI!kj;=wc{3W z5ygcy&&-rQG|tY9H4rfN(^cI3N@m*k25@n}QxRs#VEmE2eKgh>Zg7{gNx-k|2Yr+; z%lqQxCCCGxcwWN-x6uz@&ze6|ygM0=mhIRgwZ3e2$$M_iMj;o6gsc}*Ie`@6#y$w< z+RDMQ3`~=*PhlRcV1#C}<{iOEZ70^%Z<~R=Ij_o8aB6&!UwwpbsC?y6&>wLC>Z%>9 z`@uO*q!I*^?>*_i$9&HkZiJ&t6AgaXxSe&w&>}}w@aD`N@oxp)Go9lpKFDQb!II;u z$lUr?P6IZu;W#HhT)FVbLIm42rZ4WPS_9NNBGbb^350IVbM%F6$YI!KVS 3Otz#wbKYJQY&5mH^%CS0J`v=7R*nQ$oc3l@-g z_kejs&dzJG{fY*l>${XSr6PnPLgWe2XO8+|uv%v$kXrFI4^B!%U94Rk14`<{cOoku zI#A1Z0QYmdC|r)h& OUJNN7+&Lh+PwwuJ+SG>cg_6RR9J0v5seJULR-p`mK z*;PCbs@b4R6`ga&k$OsCrJ9f73-V>*2j?N>Wh?zTvZ#2xZ(nBsw-2UUqYoV7M4Jrm zHz7#1 r{y*Jg!f+ntFRBC2X(NZ_rbhyn}oRoZ27 3^fH?casT6HmzzIv#>y3*C4WL zh^^Mhk;uTvd#&{Rvh>Sp@@s7R-SjNyXPZ2tzas5eAongy iY1OoUsxH~ zI*OY}sGL*+c+Y3V*uOFwa@7sI&s@h!t|xhp8TlWCeN|LkQIu>q?lf+JG!DUoTWH)u z2=4AdLXhClxQ9l9ySoJU;10pv-Q8`NS@ZEe-pu^m^Rd@i>)vxeYVF!pb;MP9*SER- zuSl~tUJ&O0%FoI-` N+ZjVrx1gdQ|?iSP0 z`1W1l_npFe5F09R)Cl0h+PA!0%ig@c{<+`%cAk+dFe^yk%ubIv$q#B(lDXfTGI}Lm zKYx2ujmPSQFSjGt-qbqRM~|!qa|u|L7rTtC+g_{%2ht|YVvVF&x}=@4h?2heAO>x6 zD`VX06Y!H *|3H!7In$sWt1(c`sp3E?7m8aJS| r0JI9GB8Ppn0Ar(gQ1oBL9N%yz&-m!FLLE3CGQ z30A+7&c80r$(}K7`W%xnCWiKnTa-5oZ5;SpEflr8TN*G*WrSJpS?UjN*JEXLacE zk$OOKsoxp>Nv)Tfu1x*l-jUMwjn=RzX$zNp1q*xKO>TDWmAv0_Xb0TWna(r|%&Og^ z3gs-{lMFg?qJ8DdYwWun6@ahEr4TP;)|nh1>)U8=d8uV?Ywg@2=kjRtQ2d0+wC#+p zWZ4!TZob&&iBwOHrz4g76qjJ!sCIW#R@_2jp!j u0>Ura6~xdfIK9Vy$Ywm%nIx z)`{|NdAJkP%Tx^f!ui=P!OW3Zza1KuYZS+xF6ck$Yh*<=gPG4E3MvgPbjo)+ouiVI zMPr*G-PJHdl>HNcuVwZWQrhXSfKOws2|}>ekd8J*Bpr;^p} U58+?HSBnEPLwy4ryreFL8^{y>1X+#GUpn7UNF_aa0tl z^Hx!IDN&F!)dVxDUV{K;uDv?$bGSudA0SNLKeRGv6;FZztd<*35L89yJH55z>MA_a z)sXYxy#M|vdLnNu6`Wa;&l6VE3uR(fpc^DW|J&-K&^;ziL?zjRc*km|l56rL2U9QL zU`P7ighf( 2*MBP5V!pVc$oo7K!$TQDguMh{H*7+&Oj; f=8pAwWL|qIu9#BxUIOrb7$zB8A4wG* l zApB>5#hNlJMXW>M-UsaWaZ<YXbc&ePr319HFf z&7_iHS~Y`NS|77bi!AM4ZIa6ql}d&S#@Zt3D9#In_2H@*&s-BP?)-3_g;z63Es^_p zTbFM2$P|#_T~6y{pMXW4hD}~z6budDj!ACu2S=&Q_wu_&>P${Mm_)b^x*4o)NBS!M z Js3%e;s44K22ub@hy76gPs=j>vYY4DuIW&gbTwmaZnnSpy9DF2$(kfG|-{g++ z=`DYPw2TvXk)v_j_HCSe&q!xlL`9~WQiPYjZFriM(2(l{zavug9l=+&y-a{4YYp&Q zdR=nCx130l)W2d>GKk9E&lz+iE=Q79-tRjsCFEWlzv(akmvkaE#%390+A4OabiQy# zEA4SYFBxWB2@lAc3fR-}vuU&N`V_NseEl!mnvvY5IH_X5+}wKq@4=|UeAq#{sttU& z-9Jm%w?5w`+7@U0o4rf+bE3hHCCj0XV?vQzW{}W1kyP3_8|dSbNJI|xpQkg|0Hc(6 z()~KZ#DWi$0SZWq#W#V~THdo(yW%CN#Bs|?s{;$<`Mcta!r9Z4V$Cgtd2oK2EUWWv zHuOIc@-KLmIa4w?YtAMQKI<&k?K+*R!@Au0A}lQLxlWGK-=&V{qCKgprPOZS%kEC) zvMxwDbBC#Se2fwF_hw_G^UUu2vCb#Cs2 za)wCrQacZCRlUIe6PawnP3h_f zJ!@C6o{8SKKZMiE*fJz$ LV@Q2+T>ur`mQ_k@dSU z^)G!c3A8F%Gxp_hMLJ~tDtg>T@r*J<;!Q1M)TSEFfVw{;^XDZ%gDTx(@1h0;>v-4j zmaBz2 @(!EM*d@eD# z&Y&RL^`m?R1@2bRF@cDN#zv9ei0^|wYUj8%`p_Z{Tl?IJrY${2UsKBkJKFMAB>0z4 zC7XAg4HZ$pjkYjH!I @tX=I}}-nIC-X zgy0YWEtJ1`WyrBN1W`byyKooc!SvLk>SU`Z%4Y!%Up{2FrzCd7ee6jq5z>X-6XARk zo;^iT{?T)TbJC%lbKzI_^lK)B=vzE8u8M!%Gm*#cOe$YFg5iK!czBgtrE1_Q7Hfin zkuKs6Zh40d-TLcm_9Tl5Tx` 4x**`=5SLAy39h$^-SheoS2&Qm4X>PwY)lkb?;9}4x{6|0b1GS#Z1w2S2)mt(% zecV-}Z5DFGn9|Cy!g>siwtuX4rA)Qfk@4xrlm^v={i79VfJf+c>((J_alL!fuc*>4 zlRoM|)F;Z^%{ai9NT8?kgayJ7jCew{Z-Sb7pRj4bhEoy$w4w_hl;;%~DrgnMc(&?3 zDy5ypKVn1ZCMd +yGoH$lOtY@F4T+DLietI6fAGzk<{OI=V{Tgk)unYV zq`e0AfBRCA;#6Oz3lxpcUl~_EGeHf3Q>juqm{|9;|H>ZMaX|>nH{u3cUyb}>c8Ws( zXjj%F!_#p<1#ayCV|WB)FcM5dfRHN^8H}A^Bp76e$7w&vxwp)fwZ2xma=vvPuI|CW z4p_tz!XwdFdYfbpr8JQ5Fh6k8^Jwu15=Nt(#|1HC^!mhIo;?9&0$lX`=>)uS#n7V; zY!c1J(Q`aBsrd U@RPOQ8N& z1M;Ee!}2RBj8~QAnOnS8!B>dvRJUMkZ@hNP{nMoLGND}AaoO5{G6@k|P16rj!HY_&f &^X`jPTHcqDLsRwa%>`|l^MU8Jl4 zBu)>gFm>5L0f!jkuC2=b?@s#bhq7Bb^HE5kk-&Sy2K=4;oUs$&ye93|=e_sve&o7| z-eV*kL^cmVlsT+BDq`k)ez 1lq0meExM zUd7^gR*o~NEU>=|lnb*N4wr9eqE|%I(`i(6F;+|hQV5mUra&03!Gxy%Nf&Mc=1!KQ zKZ-(F2@(9)p#w1JQ5oWlv>m|ck2Y#Q(+Wpq7pnZ9Dg;vxWR#B5(iMM0n?RHIEGSve zt+kz*cF29gUB#4ZZ4r9SHqGhOza^S%^#L7caA7|XO#^>8ho1uB6sC|gAZV3wSKNVC z=Ya>5C!%P{rjF{G=-Q*gsQp7 Z8Qqe*M>(glO3de`t6WS( zr+S3)msRaXEPH3SY*BWaDz%9PWZ^dWzYmXM;_!KVSP374?u~|q7W^#e(TE_ZIKl&O zX359eBP|{`iW$ku{OU^l^*O2q+h!r92@}k-s`Axd_}WUO1-YBkh_!g89loD2ru=(o z?PN{yG1GcUul^1%w30E(encJh#%vS>B9uh)2$~>;w8h|Si6(J_g)cwrjAsFJcki4! zDxe{jXLUTRPy|97r)jIWN}>W6Y!tK>E6pJRWz0rmUv|&78G7owRrRV5y`zGOPopD6 z7}_8&^V(jik16cO2vEZ=VxN4uw#mIAi687S&!HIBKp0vKzmS(Q$IQ)KXXhBAA z5ki|ZP6k;C;vp~4fJp6x#Lu_@v`D>*M2R3a)@?#(adAwOAE^K|!wn=&5<+?67V0{% zPe?ktDz-6Sx`nteItV~c!9VG&veS(!IQEJXj0&X4{hTMhP)7E2ciVf`q6YD2k9FK# zBQGWD11RZ(FX_c$EcgkxBJkO5Kl+kt1lh5$g57X{M)lATa@A ~AY=~d!`Q 58>e~V{eBOyVB!oJQ6kZ+a%WJQfyR# z2|~WENzIm!Nx4|%gTYiEBZsw1nCRb0(blDOwa+uB@hDcUS${bhP #{ z>gKvY%5Yg#auwt1IW`?V%@PLR;3)f=^e7xP6F1_C%QG8^2J%WPee_`sBI@JbN|cai z&F;#Py+@#p@mUAAcV4OFzeo;7!%xq57h7VXSzp~&pjAF5S%YYahqnX_Z*db3z91Y9 zJmSA<6$B|aUK$XR;$!5m!B}D0Hz|{7%sPkU(idJE@8NS*xGH?Hw=3z0nJ<4`aP?i= zGBl|TRs%nT`?VQvyNZ^o^J>(eGxGJMZ_s~pLsijv5cZ9_w;iiin>g@!mo%^f((_L5 zcO0QP<5*xJlss!UkPQ<{k~1JsX8z-C6Hcf?;!f l>tc7N)f z4@_uV33mTR0&56GUwRh`ec9I|)84&4yRu!Er#*L B5_XhNSlt~=yO;bLx@!Df`zz+)bsAgc`5Z&!-`8uR zLHQJ{u+HK+10mvrS63P!%-}Y>(yf89l>PxvGNMzlU3j8v@1C8RqJ8JNxga-D&Et4= zhN `kF?hFH`AGeYb&ma3t 4W69mg7}8L8PBPo+DS|GUh<7xxSnQT zeg}P$EI=H2L0zo+dHu?aO_hHm4@Z^6jw;J&Dh>AhbdjzAM~DGRU+@L`p(-u{=+?}| zQiTCjNiHf#Ax=XP-;mBCwfOzM|1-kN59th6`3e`<$ynhhcUM$=s%AchXK5HP@N9qi zlaq8g^|%UEXO6;>v)=gT>%cNDAZy}Sw;b^@01y8KB87Rub&sZIpm8d>oE&hE0|@C} zh{!U#`uR>U{ep{F5wr26YfGPS2l`iiAT2&-?|TJuh?kr{xnwxH0Nb12mi?e?5_Wxb zK8!XtbwzaOqz4C%EtWXYAk{ f^5jJ17Vv#4l_*BH7M3!rWzwF& zAFuOIM(lJpGh@v!c%~ddLc#o45>|CJojL&%$)6|i@IKVYYYCfRBa5uoOSBuYfNa?& z+o^HAHMHWqr7^4rK?xrOJY3`fTTcA>h=N3qF!c;4 zDDL4vOzd_YHnV@kmP`1-)hf+{i{i%&%TghqO4rJ?hRhTVW%jn0)njKGd zP5r?^YAj!7_RP&j1(E+aPwrpX%Z&pmk j_5jC)z2ys8P^5RIQhgjxkjCsol z(=KD;7L?`mrz%c9?A M~!yn7Cv{;ypy~(ejw%|IIZ5= z!cgi8D|S-*8BvGz^ksJMJT(ae)>s`mOX}u$wS5h5Wum5W$}%WD(mPgIqFS2oG}(sz zBc3iJN4PjmGWGtO5N6C$h~TjkFX;Jr`>JRd^_~F*uz`28#C61Aq4Hs1bRV2L_3C_n_NX*ISBpY^7u2dZ?*meE)$6dVO16n^>fcixozoNDsISL8i ziRVFf=-AKT0%S0Or1_PRHag1qC7}Cjqkki+Y~yz*0)lMM=Lte$g}<~JEXPXE2q9W> zPG>6~j^!&1=1ou=W7x0XAdUTIxljQ)Kg-JQJm#bVJRmY(^>N?iC%$>g?;rGw+A|5| zzT&ri0z%d{zSFoKO1u|#s zgDaX*$6EOsN6X6PwOy%LuD^97%IVihmy4DqFzjxtc0~v@}#Ea!$lm`OR*Km z^}ImVDoPVb57A}#%8iR1llaBC(3I06c#x6l;tCT*XsQ&w#<8@P=?CN|2FO6lapqd~ zf%r_^5crlx!N?xgX4+Oms0jV%rLGxv`_qxRt`=bfz1FMmLzoPS7>^p9{)XDG-U4>w zvhDE`0h#wz^1U{605^rQmEiQ Wfwew*1%EenkSYSc$l`)OgeoBF~T+e zBU=ARTzgLwJQZ2h@9M)NqPdcHAk(I@cn$~y3~Ek*Y+9a(zHDYoJV_6+pW^`r?U5XP zBp08V&Vai9o3*9ifwsKYBrks;1H*>+N %4XlOu>eDY}FVQqOW%D5s|ya>; UT{yvJdc_+pXmbY*~+%kGVK>2iEs<9~!rmiJ-gnYt7Et6tL;?E_Y znoV$l;95ZUK6xV{(0bPxjX}`EMAGgJfK|1+o$`G<(172eM|F>6U_!F>!x5VI)W&6W zrHio}^x)XT=2@{*>gm;N2Cis}?mu1eM>Qc;qBNV(QYO^zZKq(%te#D_Jlb*J%<}^h z7(eI!owY#tXRatD7l=D3z)Uxc^;Y|XNCZ1qx&IXt_)kVU+$!BX14hltm|#ea*~} WvJ*H@GB2tF1bfv@E7H3_hQE%5Mc=}MCVc~r zGQQxDN ACiv90YjBZs3nY^W`rCmUI!UK4mWA)dMshf93HL+*S@lk9f#zoM z>VI~SlL&F=tFl4wj_z^Z!RAoKpC7UO`fUV+5m~wz`kjb#MF7#%*6|0{LWUMa7CYpy zUq;+qEQNcH71zlLSc}_$oUCAXR*&IAd9I?x zbpp`o#qKA26g+S%-FxLJ->+4zhb`|BXe#jhTInnTi-eBU6V$}+vbfA`&+fL`Q|B18 zo9@fu&$}-b3z@7o??JaFgWhS7uU7*s6y`s!F3>ZV+t0G!@!DmLl$xD`MSn6I)zANS zmM;H3=@pAbiLikak?>E#G6dl<$Z?8)SAQ(faZF1~@5W!Z?%^jzb{139QaJEp4Ewp+ zZtFF^ng3-~K9bdkLBY9P6c~0Km3HA0QSq9u{(8hxKK{kqI{Z#d0dN6_b|^xOVV8tE zBXWTZo_yGhL)5yL;=q500tpB}0E>xP_nsfapui`_GJdm)v8(8c~N-R zQ}fh`6oV4sPkO2DJ8>vXh6XM`f(r7#EI42qT%Z`$b6IB<$j)vC7ny19Un!hYNww;O zzJ%H8(0I_$>$?7L7nskn1F5jPYZ~)SofyIACI$Z*?Xs1w@e)4!4;x@S IF8VYX^xfS`+Fi9J@7vXijV2U6c3hDsaG0UcA?jQTcXX`10$}y3 z3=I^p7Cjd3iJ~xB-bm5(tUO!Pk^^5+VHD+)4!GD!i3I|vr3i9Amcs)?Eq@2)Je zYENzoz>Voil0io|@`piy_?$mK)~-L8{~TN%l1T8VeqmXOrf{_7QKoL4zpa&@?haak z3q=ScDM!NL*%pu}Vx}0T7K%0_?xm{hjj<;X!@38Ex7I>aZ_2ua{BTCaPZ2=W{ex5? zi=oY?lt)@6+?lhM9y$%4qH3R;P+=rzmF6}q9>=LYpidu1j{YXq+zK)RQQvVGo=Y2c z54K?XC%EJN FU%2*>y7Rn3v6u){r$O4Rotc%9x)lJO%jS{RnR*{ znTx>^U21g^jFd~kKB+j4JjII$G~pYc8$*Y*>;^H5Aw`(ECVVs52t7(3$=_qDTf2%c zPISTpw=fPDmh9dBnY0_^aR2*9YCh`y3=P;;-g|}NvsP};z=M7Vs{*+@R{<2k{`sF^ ze!w{dV5H*hc{Es=Qv%vFOekE?CAjZ3cU!MMYKq+6eNcr{wx&QLW&5l{aq^KXF`r=# zkPzd9yHEJm)RuB`JWb5~{e2bDpdtLr$<5*2O_=(_FHClBQZwopua^UUa1eDL&wPhN z$-X9>vgfxr3$a=^QoVOJp8(2&j39s?uL4Kpc9E+ZS#0UH|NfeNaU`J{$373_pUIN1 zmSA?mgc -#Z0n4|&O=P%!IWFETX z{wB>wIAtFL z=Gv|Ecx6?9)tyqYQP zx5blx>7#@hYlqM+zUdy|)2YA6LwrnpJSH0^8I1^M+!HZiCy)8^9kUB+ ~fC@TtKE^w`Q?8m24%#;rO! z?vNmv2$%^2fiGN^vKiymrepG`P1i9XhR{|`W(w|N{RwQq2KQhRWou&TLyvA{`>#Ff z_2T{=c(CO$TdJclj`AoVnj$yYnt?JL3azc2BI4R21MK6k2CVBbGeuaDCXI^s8x=H{ zA0Rf%Zn7ujH?W?IKHxwabm6QDKQGEbv?Gj`!b }IlRsPa$0pj(z$JM$ z!+0`QlEX+yo{s_$bzJo#>35GQHzr}wzlnNR>sOe5x8Pp!k(NYp0A#6lGM9vTA`0N= z4_ar_ S(&3x?t~?i4yN z<&f8Y^)tlbwJ{2vQt)U1(}x8|+?9q{A&>Lz02BeZxjnb|TEA}UankT!Jc;G*;BRn1 zw=ec}S|$drFjx}o_xs{5aXEU6S>VR?7eciA-2PrM$gr_0D{y^slXOFj=^4{YDf)^U zO4ItsqVuum8~o&wb5)EjW}G6F-9**9y36#43A>YP-)ySoPD-|R)mQ^A`*@NXJbc*i z+>Oky- z{eD#7&Gg-KV+ZTj?Q9??w&Oy70tr30IuZ zr@)s1{P8if;&FV!eIGQGP>DBGLwH;MS5$jLy#GYC{|2}JaoNuRW}lr(`118}>iV|F zTIxC8JKs)Coj#S1&Fj5rcA^(yDgS0;eY%S)zW9D9C%6KAT}N!DS1i0dZU5!C|3EO! z;vhVeuKtcur1iSHe$e~jjyL&y9k_8Wwzq#KwA9cPk33UQ&*9R>d{8&^Cx5U2y}n(j z7fC&5I!U(@{r1N% k%Bs zle{Ie%^oeI5#}%JeX7zuC#?rssB =(9%J zlh^L8U!!J{bund5RfH?rkhb&y6JKgXbB7hZHQg6R?w=;it%A1K$Zw{-NYqF)>=3pz zN0yNZ`R}*soNe9%_TODvX0$T3*~tEEe~c~2a!z|y?+d=l>7=R8sm9-VF*G$N^(>UF zZ+*0jG$;B}{t1}fLaxo!{J}Phr|q9y!{PO5O|yOm{6|5KoKWfr2l6!a?fanH=EsT) z5w|D2!y@c8A|}xm-e+LhJEDX`k`GP{(+|yA8lX}fRYhNr9 zyAXyTf$8vrNJ)T9u0Xw0H+AiYB}9;c0&no2m%YK$=Y{lPJzdaLm`fQFOPW=ct3Gd- zDxf>kxE0WCZG_XqvL00DjuztTwjrlJu$ dA&Aq+{A10ZoROnZ;16yb0;4bPNx}r-%PX6JN$|vpoW=BSO9h*;mP=RjJ1C1A z^-oYoj=sasPK)Aq==aNiCW0sbP5vG4@)dHRYUHJdzGsVH48G2tnVAdEX#UjH` d# zT5kVJR%k7^Z-Ts{|B1(EZp^-+*8X!kUAeDue92#89m^xltQY!VA3{=0IykWLk(c%6 z^Eepp@(i&*H80?CGh}YSyM__vG_jn8*a#VW8`W9GL6mP@sAErbFd+Y%b9Jzbx$bP; z*=X | zh>5G3Y$K)~2=Xx-bfv=HGOL_WPazyiEz_NiG(wvTZs$0Nr;k0BSyVtV!1--h<_K zYIUL|MuvSptT0Fa@f7g~Cy|v$;=wln7>6;WSUSC$j9$AsmOr;|L4n-A&vIuH;ieXF zsAZ0!Rp?wqMs y#Hf@A4e}TaRaXz(g3TauJUXo00zHXLu$16PZgga2-OdQPhxf`=j9E=&5igs z*sm>aoq|SH@rn%EBzM{yNr)@>&gkM9!(bu3Htx=!C<1?pY36N})e`iK5o&u%UDh^9 z;y%^egfv$1rLfEm_jg;yoFEMN`JFt3=aVM?R(^;ZhXfcI($u%9Waa2VnSU}`8dl`H z|K^L!@4I3U^X6LMsl2)Aktgc|T2tI8^{M_KP-LZYY5X;x@YgA)(V4Y|(!aYTN&no; z(B)Swk7b9r5(lEp)Ye0iyCOs?y?v4!u(g~PTHFwI@-lUxXKlVJv9^i?sl%A~;b=<% z%Fxu+EC)1p4yWC~(P$lb83)F)Mbj%n7-rbGD%BmyFG1%Hj3=h}RXKmVB`NjL@35hX zj-(~9glZAZbfRb?^N$6@*Uh{qJGd|b^6>N!#FDEJ##xP RMDIal4~8+BQe6A@t+uFn7iqE^MtmHKt9(kQ5yz(ok}haV0uVuOS3LcC(>V z>@QN+do@k{gyLSk3c(>OP8B#~pRoC@$vfjtSi1LD$KE>Qql}hZig2C%XT*M>lYF1( z!>1Z;!RSYNM3ktj;*da}`d+hw>z}#7;;Sw-t7Sj5f3+p5a=inLH#u1?hw|2P_6aly z0Q}~~nV&mRv}na{%;E-ASMhd A)TFF_$Ue2I2w)R-v1ObVpOP1{ 5 z=2XX8(iiM<>((cp_qv{h-(wXWe 6X4sO*hwaw! zt77m`501ySp>2($SIeX+JcFVe-Q4<-1vdM^Mn%=T&`$ifCOe$c9RfoB0u`XUr2fLY zwi$d%Ed7(KI?GAG86K?U^5$l=qtIUX%OJu8`5U8W+XnEhHK|(~@R(>%hrTl<9?nD_ z6Yr1ngkRa%$O*_=k>rKjsf|1m6?>2-FYP+YF!2rv&hD}~Xf&Y$m@>2Zb0+L$b46>E zI5rqp_P|=XX+Nv3zK()j8V5VckF6P^kC0u Ea(`tPT!S9|`_evdKzvFs2G^Nc&T?DH4@MU9sw*Q; zm?aR@hr5yHx W(Q@%3t!Yz6>7x&hL+NJRAAH z+E}t)IXQ;_Q+Cz($aW+*hey24G_F;?uITLFt(8Q?20@Bw%(w<8M@jlRi{8gPeEE zlq_Q9?S-i ZV_O<9y*bH z=s_o49^~QXjRdfel|NL5gJZq_9L+Y)&j7iInZ4dJfLtM@Ph+_R7cYwLa?YO|r$Ym9 zrir!--CS!)^_U>w5@v58+=WTq(f0A=G#+R!*TSSV$9oU}f>G|MQ(xZBOD 8JA{L*N-xrd}Dx;s}WUbhR{pt7^7? zF9PjH3qAVh-V<}I7>d~86a@0}fP?$Fg%1zD+{Ix|aSCn&pavs4p`su|7W9E1OZY7f zTOUOf-0!f#ATd;@pS+0uQf{W)F;Hl%gz|{3vtr4(KLMT60Y&4}S@mBgjbAoSi2X5) zV}UAU`So|CfauRzZbnN}xx9+{Cg(R~AW=MiTyYzv&G(QXT QaNyk;oP^qxyw!uY@R9&7NNb>^ XBP) zwTBH|5($Iiqpr6tBTF2#l0u@+&Y;FnJWKT_I?8+D+H{;N@T7)Y9b7-cJJB3mSUrQ3 zjSGDLM1 _-I)iW27t2q_uZ$%C@6-4d;^Xia6jLcl2{FRzLgLisi!y>R!q@diLERy?>R9i z=LIlL(niTp21q6+c>@9@$$nspA3{FER)G?C>w5Q;$P$egXebQ@90GdNY=H5Jywa#) zr%Kxfr5f?Qp#*klhY=P^T3guLl^TR{v1E|1h%i|sR3a$Xfq%f*@$=lxnv_X4?*rb| z&hbs1W9}sT%&k`$oXn!mejA<@`mU_ORei&Rf9ZodPcz)b3C6W^F(65M)qNy!k!iMG z9s+jSEm3l!^k_b8OPXf^vkL{Rqb~WE=J*O$KBIxtrd(#PaX~B?>cW?Vu);&TNnBVt z?>O==)aPfUDIIhO>4?RCn!?nN;JVXAaue8Kly6-+1``OH=~fb*rrm-j(`v!;pfYog z)wHS|4|VFu3}Wcv)xZUrHAer$hGj;#O3hbJbEi)>q_HlWJ)=V`*`qf1TM)KrVVvKD zQhg@bD4%g)ZsrPy+)M%%m>k3(fTEA!8H@J-4zS5miW*>C%7kfAL5l$PF#N4P-*g|d z!$%wug&z^q#g zW9`5PJ#=X$2?izE@wLDD#A|_?Kl9hL^{~^4wA!v!mao_5cA&iLP zjk-`?a&DNa)lBhNgB+bf$%PN5@AlXynWozv`8(O)ao$1#=JlL^%%Ki@ESkOOF@*q8 zKE3&R!niQH`gi6EZ@~5mr@9B|)W`v+%518_{Zwb!BwTIZ)A2q_(}Md~+nv5x#6_sk zKl~!9hZ0jbnE+6{Yz0OoZot3b0>+X@r_`Y}>*asF1lr%*1#7lW%_q@ FV#i3p zl~X}hnX4Uc@WosF#&=pUTl6kQkBKm+JN?m8!1@9aG_$vG{>XwBjH%;*;a`+LdoZZQ ztRfN8glsjJeyLs2Av0z@8uI}>FOxa| gAlS>DODTh&pB{y$jfw}jsKBXB6VKKh<$JRFC&s1K` z@!TOg>)J67q1C&OxKa{OCHR$E a{h!349pNF3#wXCw!wY8&iJ`)l zI1A&4V$Ee}QGcpoSZEyj>qhd>T7Ca#XUtKQebrPPBGG{~cv{pe4HzfheK?vZC4NF9 z=nM0gH4qL}+*Y@ty}Bth{3 Ub+TXqBH9N(tL`3(-6R*FvKOWfj)i_dYhWo*+|jCt_0_`@>gl*K;t zSMD=^Hapy)TGs^DaM^bJS94kWmv;g#3Q8i(KIroDr x(~I0 z+ngD0JsyhWp5HUdepyV%T-(B?rJND;bR#)?`A)RjZpnogp&>2C(de-}-2@_W<)tKp z=cr6eT_;5uv-GoJS=ly5YeJebCk)+A)EZ62d4JZHYc*}`PI^brALf?#^^R6fOC9fj zPjNpcjQ2n2aR}8Y3Ui}ABhvu3zUyuGy$J)yZ$+MUTwRC+&(^nEe|UY1B0C&_z8 8mM|MNX%%X->aZC<#+pTa>WaGVRTLEo-6(E`Z?+u9Camw4WZbNrhp1f zQ2#&L5M;oGV*cLTYx=j>vJW^ uNMek35ogNPNL*S=t z{)g?SCIg4coYgT5OvQ{X?in`uM)ae~_hG@mZ5l*EVnW)NbzRzG?Cyu{* 3#>#L_C~GJ7pDZ1#kUBTL#UY-Wm%&U3q_>)@qQ-d$d^W+XLpv{~ehlr{-A@!Wj| z3W<2y&Rsh_l663k|2Qo7DsqlCWuz97>+{q<4h>8`&YFD~`W=IObTLh+FH+iTs4;B< zdYoMRx0H@XMt8Z+#)w_soRI#-g{Qn)@!1|5q+r`~F%-P3&GaH`CSdZbvt=cXliZF& zJL<&Z**vP3E@bARWA2?wfXjFTx1XWDU@QB9en|`Ci_n}ws~LRYYDfRJoq|Ky!!!6G z^Q0w2m%{U+4z8+G2IVZ*J)V>G`QRqUZLh`Qs!8ndQf*{ESmt!@wl4EM>vV*7@=}n* zJzKih^RUl&YIi#@WHIjMXv8}{8abn73|!}b-`^Z6^JmdVEw^T=$g}*jKQ-p8f$qOV zjSQ^tT1F7HLi>2Lmu1U55lcJI$y3Zl56?}(kZo*r`=qwl39?>`NU+1XNk1uv-ViXF zO=+D~e6IMhu`|^DI)H8#`-jvzGoH0RF?}*;bSp|ME+atfo1|TpfHZaT0vVyhl!Bn8 ziFx56ChXJ+Mpg>5wqrjISYCy>Lrs|vzP6GNV|ruoD__yTw#vstKf)a;)iTxz z?=#UhYaI%6Qd}bX; MdMjEa@yaauwAUP(qSy<;=JafSN#9;$> zDJilG+q>Q4fYm xT? nG{m zp9(lkaw5$^@N;F WLDZ;BG)?y$l=Y%y{-OxH(#|7(p?<3Z5hm66Ehn5@(*)2d~9`b?&xKKYV*KYUPB zBY8Awbvn{8I~&{8T2gVs#`)CVqT(BJhYH>)mPcmHhCaT7|M!dS%m$Q~LWG4gWU#&I znZ4|vjlcIAL;O=DR`4E}X8kSZ+3O_kDU#HGu*Oo`73WbL^Mz}2(1h^IkI0zW1YpOk z8=mm%a6`-U;_N9AfvJ2($9cQj#Y Kx$vGkY z4m~lQGemkDTB`$}0w8SzU}X)%e%ZWrr6{{fVLl+@Po&P`)IiUW1=+b~XNeN4X5D6> zg31^=CaTQN!u=GPK2;CrMfzt)s>I>Zt#$9D EDlfP?=eoz0B54nq$*w=cnd%^Kx))GH4)MJ=<*I2L z#z{%yUvvsI5Y%b}0 =le_OLZh7E1FK zA*05D-?Higs=b?+nv=e_qLBf%v}4TyD@jPQJ$+&OJUbuk26`9R>SzA#=1_Y?wT_2L z!a~uHXx%=iY|Dnt8ju9!C*+N(4+`AG@HZzKoX7<-q%^J$i7%0nEMZfvU`GV 7{7BKn_@y7(HZe<)}Zc~`Q3tPLnrB+5l3N?kGOyRd5Pw4zeW!uif# zy!6|R9c$~O9-EF!Aps8aZDw|EYcy@`?Zvy+?l!lmU~=#W5V1sHYXqA)MPKNC-Oj>q z9Ba}CV&)4?m+msK=WqvZEg&7ot+myeRKrez701emhzDMU=#xanKEDWe!#3tv9$Enl zNl%;JROObkF!sNS93_%3H3X&C3z1EJ@fW7=dLQljH3303x=|Ok>Am+3^fBqq-0fuq zsGHPZ_}t((AUo?!B$+E~$gtrVyz8z#@8|mUPiQ9xg5RL!JlcFrjQ78QAh8X+dw5Xl z!&S&JgK`||V=|dY&Wg}s)(r^-H>Spryh|^|yLsfhc7W2_jzTfH9-`zKS4#=Z; Kqwr+;#V z%cg6ZsbKPJny=;7h_jT!0ofa2=b8OuypCjs*nUUd8UG_?QQRz4wPVA{oxGYr$dYrj&nw69dTj0|}ywPBBU1OUkI#j3CW5qO^c1%_O3d%^ytp z$FymFX@N=Z 9`$CLL$ntkZvA9J@4PcLbbByxpWsY&9dU^2Y$m$kF|*WMKd*lq z7G1m^#PO_rMTa>}YL=l@$yM|y#-3 HY4*pQGKVe&6r4FuUS0j;(Ls4#(6UuO`Z zYr@OUYkoPMQg##qu|Khd3JENn^FIjon#YdLH^)?3ye=`Vx5aOW0=zS^!|UL?rANAq zrRZ=P96s!BU;m&_{Z4hQs6?VE|IP+r__0Ak$PT^q#|#fX#}l2$ATt3fYCY+Y?O{l^ z8vub|YVxRd37eN)kT%{z*r&ZB^DaI}0lB|F@&``RJ7ZYiz-UiFJuevaQ9-u(d2zl_ zOANwXSpQ=NzR?*9z;UMpo~xXhUY$V9zwRmML${V05)*pm;5KC5+v!8se&y{MJJVq{ z%0oV=Iw_EP2C__59-a%U&VOHpA{3hFHL*edro4!Gwg4! 4*>r{6XniB8pUd8GIN;S#=f^n5K8-5KqDlW3c@ zMjreJ0GvQ$zfjml#>oU|9sns2AOVC5f<#KlzBNgg^#A{&dyZL}r0Gm&M!NSt#Oi2T zZ0xgrUa) tX; pM5)XN0~VQ zTg(mDL1#0vasiO6lHnCVppVQUBN6}s{DgM6>`YNJqy&fui>jzo14K3soIlrVkS(la zW-u9O7HU|nIa@ujqi(@_Z`T0P=BzLSm$YH+v3PuE(x?x!&z$6Arv`}CIf>=bd+-A$ zb1u}Bk`}D78`=ui{o?AUtSwj`%o@ LVM5nN_=PB_8KH9MiAG=^`BY;B!5^U zKs KVXwj~?g!*OJIHG(8C^-6%hMz*0Z zy%uqLD)a}=!-8>DXuDyrDSbcjnFk(1_!=M-W|`*X3Lw24NJ(XVEYo>2k$W4N zr31MFNHLDbenj{h`X43e9|%446zBwMfE4ULb9BB|ekVSl #A2AX89NyXTWg6URshL&c2A2dfV{!*X9Odo0EhuoeBtnq zj~)bC9Zk!EC!+Li%^u6w0C~1`WRVZ-o{j(s`hl&hBpL~?i#0&T%?I1Im&Ejq*amI0 zxg7@}K0soo_ll{_%I+B>iLGs2%Ps*zhDH$Rf>Wz!=$S46($MXd)S1)(VQa$zfItPB z9p~sB69M7`ffg4d2vGH)=~)dBGlQ8o07Txv8xsj8lfZ=iEcQW;9{~BG+k1Y3B3Y}D z!ja;DxwqYRvEqceSAe#%xEw*6wz#z(+j + z5Yp}0oxs4)v 9RLQ%j^`4y|(v2|m|Nq3SB zmO&&Rfc@CI1rRdFHB=1{HtWap%@sf>+E@?Qd17|!=_nHtYJuJnezpQbcj^%&HH;}5 zp;7q5yaY%|$QeNB+|UBB!xA8ttR|t-CQ2K+|89e@cH)^`F&0T(N*YcwWjMGO-!U!6 z&GAFDlLB<<6gtfuhO?-PKSWlG^@HgpIXqTE$#E_5cdEjasdRcu+A1c v`&&6vf=4ru8CR3364D0VOA9UhL65RY<-=8R-A33T@Iw@@U1S4A2t-qjOcgr0 zZt6t^p;DKVJn^EgDGP6|rjxX+0*?4%j%%+rHkqoJEjx<^UaHJ3(h3O{q}Yz-ScG>| z;hR=+5+Drg<=wXTP%K1Pp13Vhl@j8bN{}iEmUDQ+Roc*);