From 15c61573ae115ff6f8aa7ed7c340a55b8f6b4e5a Mon Sep 17 00:00:00 2001 From: Weichen Qiu <57570491+w3ichen@users.noreply.github.com> Date: Mon, 23 Oct 2023 11:43:25 -0600 Subject: [PATCH 1/2] started on comparison articles --- blog/2023-10-23-vs-anvil-works.md | 78 ++++++++++++++++++++++++++ blog/2023-10-23-vs-streamlit.md | 91 +++++++++++++++++++++++++++++++ 2 files changed, 169 insertions(+) create mode 100644 blog/2023-10-23-vs-anvil-works.md create mode 100644 blog/2023-10-23-vs-streamlit.md diff --git a/blog/2023-10-23-vs-anvil-works.md b/blog/2023-10-23-vs-anvil-works.md new file mode 100644 index 00000000..bb105194 --- /dev/null +++ b/blog/2023-10-23-vs-anvil-works.md @@ -0,0 +1,78 @@ +--- +slug: vs-anvil-works-2023 +title: Anvil.works vs. MecSimCalc +authors: [wqiu] +tags: [Compare] +--- + +In today's fast-paced digital world, the ability to develop web applications quickly and efficiently can make a significant difference for businesses and developers alike. Anvil and MecSimCalc are two tools that aim to simplify web app development, offering the power of Python without the complexity of traditional web development. In this article, we will compare Anvil and MecSimCalc across various dimensions to help you choose the one that best suits your needs. + +## Overview + +Before diving into the technical details, let's take a look at the basic information. + +| Feature | Anvil | MecSimCalc | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| Website | [Anvil Works](https://anvil.works/) | [MecSimCalc](https://mecsimcalc.com/) | +| Description | "Build web apps with nothing but Python. Build seriously powerful web apps with all the flexibility of Python. No web development experience required." | "The simplest way to build and share computational tools. Create and share your Python web apps in minutes for free." | +| Target Audience | Enterprise | Designed for non-technical users | +| Knowledge Required | Python, Anvil library | Python | +| Ideal Use Case | Business websites with database | Computational simulation and calculation | +| Cost | Free | Free | + +## Features Comparison + +Now, let's dive into the specific features and functionalities of both Anvil and MecSimCalc. + +| Feature | Anvil | MecSimCalc | +| ------------------------------ | ------------------------------------------------------ | ------------------------------------------------------------ | +| Documentation | [anvil.works/docs](https://anvil.works/docs) | [docs.mecsimcalc.com](https://docs.mecsimcalc.com) | +| Blog | [anvil.works/blog](https://anvil.works/blog) | [docs.mecsimcalc.com/blog](https://docs.mecsimcalc.com/blog) | +| Discourse Forum | [anvil.works/community](https://anvil.works/community) | [community.mecsimcalc.com](https://community.mecsimcalc.com) | +| Drag-and-drop interface | :white_check_mark: | :white_check_mark: | +| Cloud Deployment | :white_check_mark: | :white_check_mark: | +| Self-Host | :white_check_mark: | :white_check_mark: | +| Github Integration | :white_check_mark: | :x: | +| Built-in Database | :white_check_mark: Postgres DB | :x: | +| Built-in External Integrations | :white_check_mark: Stripe, OAuth, Jupyter, Email, etc. | :x: | +| In-Browser Editor | :white_check_mark: No intellisense | :white_check_mark: | +| Run in Background | :white_check_mark: | :white_check_mark: | +| Custom Domain | :white_check_mark: | :x: | +| Marketplace | :x: | :white_check_mark: | + +## Building an App + +Creating web applications should be a straightforward process. Let's explore how Anvil and MecSimCalc facilitate the app-building process. + +### Anvil: + +1. Select a template or create a new app. +2. Choose an app theme. +3. Utilize the drag-and-drop UI builder. +4. Create and customize databases. +5. Write code in server modules (requires custom Anvil functions). +6. Link server modules with the front-end. +7. Publish your app with a custom domain. + +### MecSimCalc: + +1. Begin building your app directly in the browser. +2. Utilize the drag-and-drop inputs editor. +3. All coding can be done in the browser. +4. Manually connect inputs to the code with Python. +5. Run your app with a single click. +6. Utilize custom Python libraries. + +## Conclusion + +Both Anvil and MecSimCalc aim to simplify web application development, enabling users to leverage the power of Python without the need for extensive web development experience. While Anvil is designed for building full-fledged websites and offers more features, MecSimCalc is geared towards non-technical users and simplifies complex computations. + +### Key Takeaways + +- Anvil and MecSimCalc emphasize the challenges of traditional web development. +- Anvil's user-friendly approach makes web app development accessible. +- MecSimCalc offers a solution for simplifying complex calculations with Python. +- Anvil's extensive feature set can create complexity, but it is suitable for building full-fledged websites. +- MecSimCalc excels at simplifying the app-building process for non-technical users. + +In summary, the choice between Anvil and MecSimCalc depends on your specific needs and the complexity of the web applications you intend to develop. Both tools offer the power of Python, but with different target audiences and features. diff --git a/blog/2023-10-23-vs-streamlit.md b/blog/2023-10-23-vs-streamlit.md new file mode 100644 index 00000000..54cf1b3a --- /dev/null +++ b/blog/2023-10-23-vs-streamlit.md @@ -0,0 +1,91 @@ +--- +slug: vs-streamlit-2023 +title: Streamlit vs. MecSimCalc +authors: [wqiu] +tags: [Compare] +--- + +Streamlit and MecSimCalc both offer solutions to simplify app development and data visualization with Python. However, they cater to different user bases and provide unique features. In this article, we'll delve into a detailed comparison between Streamlit and MecSimCalc. + +## Overview + +Let's start with an overview of both platforms. + +| Feature | Streamlit | MecSimCalc | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| Website | [Streamlit](https://streamlit.io/) | [MecSimCalc](https://mecsimcalc.com/) | +| Description | "A faster way to build and share data apps. Streamlit turns data scripts into shareable web apps in minutes. All in pure Python. No front‑end experience required." | "The simplest way to build and share computational tools. Create and share your Python web apps in minutes for free." | +| Target Audience | Python developers | Python developers and non-technical users | +| Knowledge Required | Python, Terminal, GitHub, Markdown, Streamlit library | Python | +| Ideal Use Case | Data visualization | Computational simulation and calculation | +| Cost | Free | Free | + +## Features Comparison + +Now, let's explore the specific features and functionalities of both Streamlit and MecSimCalc. + +| Feature | Streamlit | MecSimCalc | +| ------------------------ | -------------------------------------------------------- | ------------------------------------------------------------ | +| Documentation | [docs.streamlit.io](https://docs.streamlit.io) | [docs.mecsimcalc.com](https://docs.mecsimcalc.com) | +| Blog | [blog.streamlit.io](https://blog.streamlit.io) | [docs.mecsimcalc.com/blog](https://docs.mecsimcalc.com/blog) | +| Discourse Forum | [streamlit.io/community](https://streamlit.io/community) | [community.mecsimcalc.com](https://community.mecsimcalc.com) | +| Download Required | Yes | No | +| Custom Code Syntax | Yes, requires custom `streamlit` functions | No, works with plain Python | +| Resource Limits | 1 GB RAM, sleeps after 7 days of inactivity | 7 days, 16 vCPUs, 120 GB RAM, 200GB disk | +| Monetize Apps | :x: | :white_check_mark: | +| Conditional Inputs | :white_check_mark: | :white_check_mark: | +| Dynamic Tables | :white_check_mark: | :white_check_mark: | +| Interactive & Animations | :white_check_mark: | :x: | +| Plotting | :white_check_mark: | :white_check_mark: | +| Maps | :white_check_mark: | :white_check_mark: | +| Embeddable | :white_check_mark: | :white_check_mark: | +| Drag-and-drop interface | :x: | :white_check_mark: | +| Run in Background | :x: | :white_check_mark: | + +## How Streamlit Works + +Internally, Streamlit uses Tornado as its web server. Streamlit runs on websockets, making it suitable for interactive real-time applications. + +## Using Streamlit + +Creating a Streamlit app involves straightforward steps: + +1. Install Streamlit: `pip install streamlit`. +2. Run the app: `streamlit run your_app.py`. +3. Design the app with a sidebar for options and a document for visuals and text. + +## How Deploying Works + +To deploy a Streamlit app, users need to publish their code to Github. Streamlit provides a simple deployment process. + +## Streamlit Sample Codes + +Here are some sample Streamlit codes for reference: + +1. **Animation:** + +```python +# Your Streamlit animation code here +``` + +2. **Plotting:** + +```python +# Your Streamlit plotting code here +``` + +3. **Mapping:** + +```python +# Your Streamlit mapping code here +``` + +4. **Dataframe:** + +```python +# Your Streamlit dataframe code here +``` + +## Conclusion + +Streamlit and MecSimCalc offer solutions to different segments of users. Streamlit is designed for developers who want to create interactive data apps rapidly but may require familiarity with custom Streamlit functions and terminal/Github integration. On the other hand, MecSimCalc is tailored for non-technical users, eliminating the need to change existing Python codes and works in-browser. From ab8383360a07899ee7a305d51d207a748a1c7d93 Mon Sep 17 00:00:00 2001 From: Weichen Qiu <57570491+w3ichen@users.noreply.github.com> Date: Wed, 8 Nov 2023 17:29:36 -0700 Subject: [PATCH 2/2] comparison blogs are done --- ...-works.md => 2023-10-22-vs-anvil-works.md} | 74 +++++++--- blog/2023-10-23-vs-streamlit.md | 133 ++++++++++++------ static/blog/compare/anvil_app.png | Bin 0 -> 14493 bytes static/blog/compare/anvil_code.png | Bin 0 -> 34213 bytes static/blog/compare/anvil_create.jpg | Bin 0 -> 42461 bytes static/blog/compare/anvil_inputs.png | Bin 0 -> 37555 bytes static/blog/compare/anvil_new_component.png | Bin 0 -> 21011 bytes static/blog/compare/anvil_publish.png | Bin 0 -> 23279 bytes static/blog/compare/mecsimcalc_app.png | Bin 0 -> 162240 bytes static/blog/compare/mecsimcalc_code.png | Bin 0 -> 161977 bytes static/blog/compare/mecsimcalc_create.png | Bin 0 -> 219047 bytes .../blog/compare/mecsimcalc_edit_inputs.png | Bin 0 -> 540251 bytes static/blog/compare/mecsimcalc_inputs.png | Bin 0 -> 93318 bytes static/blog/compare/mecsimcalc_outputs.png | Bin 0 -> 112633 bytes static/blog/compare/mecsimcalc_publish.png | Bin 0 -> 97156 bytes static/blog/compare/streamlit_app.png | Bin 0 -> 82457 bytes static/blog/compare/vs_anvil_banner.jpg | Bin 0 -> 25810 bytes static/blog/compare/vs_streamlit_banner.jpg | Bin 0 -> 26794 bytes 18 files changed, 141 insertions(+), 66 deletions(-) rename blog/{2023-10-23-vs-anvil-works.md => 2023-10-22-vs-anvil-works.md} (68%) create mode 100644 static/blog/compare/anvil_app.png create mode 100644 static/blog/compare/anvil_code.png create mode 100644 static/blog/compare/anvil_create.jpg create mode 100644 static/blog/compare/anvil_inputs.png create mode 100644 static/blog/compare/anvil_new_component.png create mode 100644 static/blog/compare/anvil_publish.png create mode 100644 static/blog/compare/mecsimcalc_app.png create mode 100644 static/blog/compare/mecsimcalc_code.png create mode 100644 static/blog/compare/mecsimcalc_create.png create mode 100644 static/blog/compare/mecsimcalc_edit_inputs.png create mode 100644 static/blog/compare/mecsimcalc_inputs.png create mode 100644 static/blog/compare/mecsimcalc_outputs.png create mode 100644 static/blog/compare/mecsimcalc_publish.png create mode 100644 static/blog/compare/streamlit_app.png create mode 100644 static/blog/compare/vs_anvil_banner.jpg create mode 100644 static/blog/compare/vs_streamlit_banner.jpg diff --git a/blog/2023-10-23-vs-anvil-works.md b/blog/2023-10-22-vs-anvil-works.md similarity index 68% rename from blog/2023-10-23-vs-anvil-works.md rename to blog/2023-10-22-vs-anvil-works.md index bb105194..c04817b9 100644 --- a/blog/2023-10-23-vs-anvil-works.md +++ b/blog/2023-10-22-vs-anvil-works.md @@ -1,10 +1,12 @@ --- slug: vs-anvil-works-2023 -title: Anvil.works vs. MecSimCalc +title: Anvil vs. MecSimCalc authors: [wqiu] tags: [Compare] --- + + In today's fast-paced digital world, the ability to develop web applications quickly and efficiently can make a significant difference for businesses and developers alike. Anvil and MecSimCalc are two tools that aim to simplify web app development, offering the power of Python without the complexity of traditional web development. In this article, we will compare Anvil and MecSimCalc across various dimensions to help you choose the one that best suits your needs. ## Overview @@ -16,7 +18,7 @@ Before diving into the technical details, let's take a look at the basic informa | Website | [Anvil Works](https://anvil.works/) | [MecSimCalc](https://mecsimcalc.com/) | | Description | "Build web apps with nothing but Python. Build seriously powerful web apps with all the flexibility of Python. No web development experience required." | "The simplest way to build and share computational tools. Create and share your Python web apps in minutes for free." | | Target Audience | Enterprise | Designed for non-technical users | -| Knowledge Required | Python, Anvil library | Python | +| Required Knowledge | Python, Anvil library | Python | | Ideal Use Case | Business websites with database | Computational simulation and calculation | | Cost | Free | Free | @@ -38,30 +40,58 @@ Now, let's dive into the specific features and functionalities of both Anvil and | In-Browser Editor | :white_check_mark: No intellisense | :white_check_mark: | | Run in Background | :white_check_mark: | :white_check_mark: | | Custom Domain | :white_check_mark: | :x: | -| Marketplace | :x: | :white_check_mark: | +| App Marketplace | :x: | :white_check_mark: | + +## The Workflow + +Creating web applications should be a straightforward process. Let's explore how Anvil and MecSimCalc facilitate the app building and deploying process. + +### Anvil + +Anvil runs a web server that communicates with a database and other processes. + +**Step 1:** Create a new app by selecting from one of the Anvil templates + + +**Step 2:** On the inputs page, use the side menu on the right to configure each input settings and drag-and-drop in more inputs. + + + +**Step 3:** On the code page, use custom anvil functions to write the Python code that uses the input values to execute commands, such as database executions. + + +**Step 4:** Finally, to deploy the app, open the Publish popup and click on Publish + + +**Step 5:** The app is now deployed and accessible at an Anvil url: +Keep in mind that Anvil apps on the free tier come with a banner at the top. + + + +### MecSimCalc + +Internally, MecSimCalc uses serverless functions to run Python functions, make it suitable for computational simulation and calculation, which may require more computing power and longer runtimes. + +Here is a simplified workflow for creating and deploying a basic MecSimCalc app: -## Building an App +**Step 1:** Visit https://mecsimcalc.com/create and select one of the templates to create a new app. + -Creating web applications should be a straightforward process. Let's explore how Anvil and MecSimCalc facilitate the app-building process. +**Step 2:** On the inputs step, use the drag and drop interface to add, delete, and position the inputs. Edit the each input by clicking on it. + + -### Anvil: +**Step 3:** On the code step, write the Python code that uses the `inputs` to calculate the output. No need for custom functions nor installations. The toolbar on the right allows for installing Python packages, debugging the code, and seeing the input variables. + -1. Select a template or create a new app. -2. Choose an app theme. -3. Utilize the drag-and-drop UI builder. -4. Create and customize databases. -5. Write code in server modules (requires custom Anvil functions). -6. Link server modules with the front-end. -7. Publish your app with a custom domain. +**Step 4:** On the outputs step, use the rich text editor to stylize the outputs and embed the outputs variables from the code. + -### MecSimCalc: +**Step 5:** Finally, to deploy the app, simply click on the _Publish_ button at the bottom of the Preview step and the app will be accessible at a MecSimCalc url within a few seconds. + -1. Begin building your app directly in the browser. -2. Utilize the drag-and-drop inputs editor. -3. All coding can be done in the browser. -4. Manually connect inputs to the code with Python. -5. Run your app with a single click. -6. Utilize custom Python libraries. +This is the final app: + ## Conclusion @@ -69,10 +99,8 @@ Both Anvil and MecSimCalc aim to simplify web application development, enabling ### Key Takeaways -- Anvil and MecSimCalc emphasize the challenges of traditional web development. -- Anvil's user-friendly approach makes web app development accessible. - MecSimCalc offers a solution for simplifying complex calculations with Python. -- Anvil's extensive feature set can create complexity, but it is suitable for building full-fledged websites. +- Anvil's extensive feature set can create complexity, but it is more suitable for building full-fledged websites. - MecSimCalc excels at simplifying the app-building process for non-technical users. In summary, the choice between Anvil and MecSimCalc depends on your specific needs and the complexity of the web applications you intend to develop. Both tools offer the power of Python, but with different target audiences and features. diff --git a/blog/2023-10-23-vs-streamlit.md b/blog/2023-10-23-vs-streamlit.md index 54cf1b3a..d6c49ac7 100644 --- a/blog/2023-10-23-vs-streamlit.md +++ b/blog/2023-10-23-vs-streamlit.md @@ -5,6 +5,8 @@ authors: [wqiu] tags: [Compare] --- + + Streamlit and MecSimCalc both offer solutions to simplify app development and data visualization with Python. However, they cater to different user bases and provide unique features. In this article, we'll delve into a detailed comparison between Streamlit and MecSimCalc. ## Overview @@ -16,7 +18,7 @@ Let's start with an overview of both platforms. | Website | [Streamlit](https://streamlit.io/) | [MecSimCalc](https://mecsimcalc.com/) | | Description | "A faster way to build and share data apps. Streamlit turns data scripts into shareable web apps in minutes. All in pure Python. No front‑end experience required." | "The simplest way to build and share computational tools. Create and share your Python web apps in minutes for free." | | Target Audience | Python developers | Python developers and non-technical users | -| Knowledge Required | Python, Terminal, GitHub, Markdown, Streamlit library | Python | +| Required Knowledge | Python, Terminal, GitHub, Markdown, Streamlit library | Python | | Ideal Use Case | Data visualization | Computational simulation and calculation | | Cost | Free | Free | @@ -24,67 +26,112 @@ Let's start with an overview of both platforms. Now, let's explore the specific features and functionalities of both Streamlit and MecSimCalc. -| Feature | Streamlit | MecSimCalc | -| ------------------------ | -------------------------------------------------------- | ------------------------------------------------------------ | -| Documentation | [docs.streamlit.io](https://docs.streamlit.io) | [docs.mecsimcalc.com](https://docs.mecsimcalc.com) | -| Blog | [blog.streamlit.io](https://blog.streamlit.io) | [docs.mecsimcalc.com/blog](https://docs.mecsimcalc.com/blog) | -| Discourse Forum | [streamlit.io/community](https://streamlit.io/community) | [community.mecsimcalc.com](https://community.mecsimcalc.com) | -| Download Required | Yes | No | -| Custom Code Syntax | Yes, requires custom `streamlit` functions | No, works with plain Python | -| Resource Limits | 1 GB RAM, sleeps after 7 days of inactivity | 7 days, 16 vCPUs, 120 GB RAM, 200GB disk | -| Monetize Apps | :x: | :white_check_mark: | -| Conditional Inputs | :white_check_mark: | :white_check_mark: | -| Dynamic Tables | :white_check_mark: | :white_check_mark: | -| Interactive & Animations | :white_check_mark: | :x: | -| Plotting | :white_check_mark: | :white_check_mark: | -| Maps | :white_check_mark: | :white_check_mark: | -| Embeddable | :white_check_mark: | :white_check_mark: | -| Drag-and-drop interface | :x: | :white_check_mark: | -| Run in Background | :x: | :white_check_mark: | - -## How Streamlit Works +| Feature | Streamlit | MecSimCalc | +| -------------------------- | -------------------------------------------------------- | ------------------------------------------------------------ | +| Documentation | [docs.streamlit.io](https://docs.streamlit.io) | [docs.mecsimcalc.com](https://docs.mecsimcalc.com) | +| Blog | [blog.streamlit.io](https://blog.streamlit.io) | [docs.mecsimcalc.com/blog](https://docs.mecsimcalc.com/blog) | +| Discourse Forum | [streamlit.io/community](https://streamlit.io/community) | [community.mecsimcalc.com](https://community.mecsimcalc.com) | +| Download Required | Yes | No | +| Custom Code Syntax | Yes, requires custom `streamlit` functions | No, works with plain Python | +| Resource Limits | 1 GB RAM, sleeps after 7 days of inactivity | 7 days, 16 vCPUs, 120 GB RAM, 200GB disk space | +| Monetize Apps | :x: | :white_check_mark: | +| Conditional Inputs | :white_check_mark: | :white_check_mark: | +| Dynamic Tables | :white_check_mark: | :white_check_mark: | +| Interactivity & Animations | :white_check_mark: | :x: | +| Plotting | :white_check_mark: | :white_check_mark: | +| Maps | :white_check_mark: | :white_check_mark: | +| Embeddable | :white_check_mark: | :white_check_mark: | +| Drag-and-drop interface | :x: | :white_check_mark: | +| Run in Background | :x: | :white_check_mark: | + +## The Workflow + +Next, we will briefly explore the workflow of both Streamlit and MecSimCalc, from creating an app to deploying it. + +### Streamlit Internally, Streamlit uses Tornado as its web server. Streamlit runs on websockets, making it suitable for interactive real-time applications. -## Using Streamlit +Here is a simplified workflow for creating and deploying a basic Streamlit app: -Creating a Streamlit app involves straightforward steps: +**Step 1:** Download and start streamlit via the terminal: -1. Install Streamlit: `pip install streamlit`. -2. Run the app: `streamlit run your_app.py`. -3. Design the app with a sidebar for options and a document for visuals and text. +```bash +# Prerequisite: download Python and pip, if not already installed +pip install streamlit +touch my_app.py +streamlit run my_app.py +``` -## How Deploying Works +After running `streamlit run`, a new tab will open in your browser with the app running at a `localhost` url. All the coding will be done locally on your computer and edits in `my_app.py` will automatically be reflected in the browser. -To deploy a Streamlit app, users need to publish their code to Github. Streamlit provides a simple deployment process. +**Step 2:** Write the Streamlit code inside `my_app.py`. Refer to Streamlit docs for custom `st` functions required to build the interface and layout. -## Streamlit Sample Codes +```python +# my_app.py -Here are some sample Streamlit codes for reference: +import streamlit as st -1. **Animation:** +st.write("# a+b") -```python -# Your Streamlit animation code here -``` +col1, col2, col3 = st.columns([6, 1, 6]) +with col1: + a = st.number_input("a", value=12) +with col2: + st.write("# +") +with col3: + b = st.number_input("b", value=34) -2. **Plotting:** +sum = a + b +product = a * b -```python -# Your Streamlit plotting code here +st.write("The sum of the two numbers is " + str(sum)) +st.write("The product of the two numbers is " + str(product)) ``` -3. **Mapping:** +**Step 3:** The inputs, code, and outputs are all handled in the single Python file. The localhost webpage looks like this: + -```python -# Your Streamlit mapping code here +**Step 4:** Before deploying the app, first create a [Github](https://github.com/) account and a new Github repository. Then save the code to the repository by downloading and using the Github desktop app or using the terminal: + +```bash +git add . +git commit -m "saving my_app.py" +git push ``` -4. **Dataframe:** +**Step 4:** Finally, to deploy the app to Streamlit cloud, create a streamlit cloud account and fill out the _Deploy an app_ form with the Github repository link. Once submitted, the app will build for a few minutes before becoming accessible at a streamlit url. -```python -# Your Streamlit dataframe code here -``` +
4LN(rKD;!O;%YpI9NL=9BoQxplr;C)!SLR)p@A z_6R@S9U0$$k)NGMq(9FSiw=Bmx~7Rfn$>r$1_%xjp_!&|?Hz4zw6<;}X4{?1{LjMa z|9f9!nP$L401Se)Q1ba-CuaKaM+isq5&sVQuU$Y3O~*i!_a+t+0}MjI0cLNYSPBk6 zAxLHzAOM8`-T(>$Zo={g;4mNx0ZgF(AYcRu6rh2CkqAHm3^MRV05B+^2nQ_De_#+C z2ZAK{FPPE0JKFeg1F}*M7&xyW4Ha7teD4_rr7}1RY;=UmOZW!*v|(DPM75NZJt2H zddG2WHTmR!Uz5voA?km &IR-zE-uiQw(8aiHXFFS8v1;T`%$I9T;n&oK<9U?+};?$#9qc{9&bfYQFlZSHyi z!k(BbA-G`hYltl35fqw13n@Zf%j; zESbty3>}l | z!8yg?N`PE3m46)*J{M;%`N7`zEBC?Yn9@*8V}I}~nj#EF{yhqUTi=W^e%k&5hnzhq z!iZ|pA3{LWkUeO !NT0n 935=5+x}WVS|&w5{q#=Sd?pA(=x~Ia0|Jn-Qr$P9m=~~ zN`>O4FrPi_r^ukIxWkr&k42%s%}y^fjGSTbs(X!?vWi=BNuv<@7^*Sy;liroxUchY zhtAQfj59#jdkmTFyl3pFf?$IS?5`t*A`%0&a)m= T9_^5!^9 FHG zFe$$+QBJV>SXBf{|MWN=3~MJkEv~%5c~^@1R_6w(GnZ_I%y;)YWev+P)4? z?BLcvM0{=Y!IU+W{MPxSrB@)xFu36(YaSZwpc0%sqpxNrYw)|xhGnG;!P7xI+ak1& ztt#dA>xsDB)`@3OYvKFBO+xpC1l$HmnwQJ{@0Jq|f|Lh7KazeZsgQnlK)L&DlG`8Q zK7=7-5yb qFZOKyB;9#6Pd?u>IW?>5)jF~dn &zN@{` zMaSb1S@04C9!8X>OSX)nhPTk+p6n*KWh^1cQW>neFF+@ZzxZhbj`VAOH_{dg8b~0} znOA%eT+b=lhu87go4tt8%&6h_6FVppdDi+J37Nb%l1gV%D5&D3HB>T2)gG;&Wo1G7 zjmX&xJVZC4?(w=Np4%zz@#xXzQlKW{8y&NO6RiNNuitu4>ly@N;%tnq(rA8I0g;8` z1VUQ4)*#Hczss(WPHSYP81(=z2P!0Vgr``*>}&bg?DAe1-wTK7%g-?eF1EBSBD(cR z-6DK{33Ur%M 7xF0M}3d{)F54xFCFu$EIUig_MOTa xID;e*fnH;~`!2 zn&iPtG =vU%E1S14&4Pit 1;r=ytz#lhGHyJ^3;Zq15YADn~+coGL4a)O%|V6s&xpahe`ZM z>SO0!oa#5X8Mp>c^X@;-S2Mrm%tLW)ZMz`$tx<&aEffkGgn&Rp{zw??u_gA3`r^3h z1QlqH7b1HfoF2A~oOtq9K4Sv{UXX(ZzJkcoOoMQe%-1?!8V75ANV`{P^4`9gf6YJt zjQqye*h3S@Cx%r(0|iJx=vRMM&YTfGGdYy**BMS%D#5Ho6-JSBj#X39a%TUD(3LX+ zt7y3+M&q96ixYo}*~B&%k+^paN2SNQWe>hU-s=2cJcH)i*00v$H)iXr4(DmEU+Xw^ z73A~94mn+%yu3;VCS(yKjPNN1$V#R4NO)I&))vv1 K$3eMIPU-0>v_Zu|$Q(ID`F;_y8oR1*RE*kh->#Gx zw%Zp^fQOxR?B6Y8fB||If;2Z0g=3mMZTTtWt^D(Jc_UKNDn#cC;p%|x>_Nn(RbNNS z8fFtcM3(1|DUHEK{4%0UvB`qH!EgMROd6|~raw`>_h8U{Ec4GI1;9}YILI4DcrY>S z?Vd8R0u5Li!G~75oBXv5BYIYsD&v^bc0w z{KYEuAFLMtg>n8L7#~QqAAer^g}1_h!uS5#Z|m844*hf8^gkg6|F8M{H--`tlP|Sj zGX;aWJ$3QJaT&Vfl!rHz 0vS|uZJ){bOuX-|ExGS7YW4%~ z=t|_#8>6fpQ`>M4$!gslQV-o7dbDvu;c%n?#1Ba+g#doTna2kSOu=B_S7=!OHd+f5 z3^tcRKm&;(kb&PYXM#dg2|x_+hcFo8w{`!6K?x 4FpPTO7XI|$Mlw%Rs#|l{Na-C&= z*(O{BPc8wp5dRWtyqlH8RoC~?UZ2{GadAViv3&aMCjkz0&kMq=18E68qUxw%o~c8Y z%YAoh^bqNr*Cl~15dR%}j*#$jxJPbQaLx)pcJkV@|G9I0L4$I+0|V@#3YF+pZ#ct0 zk6m2U?JZ?;>4-;OII+{x@%4Rmo5wRLA|H8C2%H5VjYE-fC6qAd^)Wt93P$$F(Z_r* zyS62}iTwA&?~T{6eO#yJ;*R)3_Dx^wf0OV2-TAI=zkcH8=W>#w+#xOa;De*;iuGbs z4Hoz*dL937Q24{H!`f+Qq2e_g;lf$bz|ixw b&hV3dL9xj(lG&rJqecCUR8I zZG|k{ZK_Ki+f>zb%TDxuIw3+ou#~w`4*lq)og->U(YamYrRcdU4o*iy((*SHNg$Bo z-w=ERgEjreE*o0jG#a!2M+rheuWu#Q=<2Bw5}IVPupb|Y%L6b}J`Bcx3!_w$&Pil_ z@r|OZSfq7OM)ik^C;$%EW`J9uZ--;Uy;R*fn>!|yA?G@XFYmx$7-|bWO% }@7^*bpouC5YZX7@B*2QRD`CtagR|6?XkbAjOY zyWI>1etWad=PUW5!42;|%s8@T-M1=^uA|{IK0b;ydvx&Qm-a|RRm%P`2!;wpD>?+y z#$&k`!8wk8WwqVgc{M`c;ofQAM=Mi!#bP`k;jgsL_J 4q}B zzf!REeho#+XVV=u&KLBn$xql!S@rR!`UcBqbg#7bl)LZ04|sONEjC9Mup9`0I>Df4 zMm%sO&B&gLUmF}hZdo7C-}&}&wrcswQleJRu;R?|O5fZ;-kY+;uddDu)*tTa3&e(h zOxEt8g}~ud@ZSzvIW|!9WG7mhQ^??pJ0hGtA2zP!jcTdGuTK~H4Bv~2vSis`Q0|f^ z${f3=fercBycq~{>xcQD2RetQ#}RUAR7kX~(C(>LCjQ?9RmsUbBT~$C02fK|iPGGh z5t uDYK7tXQdGO{#M{qda2=oz^@vmvGZgnhHPh#LrTaJU{p&4x)sGD(nY>q8kFFa#L z6m=Qm$+)C}ZC(h11)R%+x55EC^G-xGKvZSmFa#XKdjtlBz&a3ceh3%@;e{y>cq0IB z{C^*o*qW5ISVoW`_q7$Y=!_^^Vno_zq;f{&W^zaF=;lSz_)0y7X;E%jO@7DYnUu6G zVNfJh07t&XSJNuY8t~oK6m$8C;nB(jZ-T;LL?B{cB*26~h(ToW!QfB;v=4*vK%v}V zNQ(@j1^(Y7La4A<4AoMqW 2UnR36fEko>R(3KV+h=XPki4{lg3)ROLwb=FJGV zk)!T7F{s7|8Hf%pRFpONE~e_=hW(t(KeK{%z`=}IAP|`6apY;4SpmQJs*VJQQ(gOP zcmK_mof@A%5}yJ73I>Ct^7}?}Z@<{|yuc~hY_)J(Iq|a8M~N`OWuSqS5D4`6Ch+Oi zS>={n%?WPQ%^WMIu$@}fo3PsZj9^~mAIWfs7ut?Lz{7&$(7^gOe`lmL?3hy6XrHj=~VoID`B~w1E zZobj(GfNEOZ?6=qZ4qvSKPBqo`)~(NLHygSu 1Z*>keDax&w0`pM*F%SVO|%B$$4yZI@~ z#|Fm8p1mC<6Ri93ing5AhhgIuA#TuXezp%sVDj1I1oD@|GUx+ J6xIIi+_#ct}wmUL-$v7vAYb>NNym{) ecR`n74?oX)@#~2z zmyo+EKA1bHoi(-RyG_ZZP15O!KnO7YhG)|d?bz)P IIZ8Xa1 zYzeI_xr!OXR2-k)S5W<7U3uF-v&<)Fm;U9Qw&9~IpWD6CM#^! ocl1yBL6f1s z@d}9gw9-8*yjW g?jf;}Bgxm^ z?ETTae~l@5R-!e`&-Jf$S_($G3cKv{hH2yntDdT9vO7O5_@4aZU$)akO^-IIpX(-H z&7N;L$+4poG=GG Cwm9V%iT3NbAZ@1KMlsk7*PDNg82h8gMCF_I`0p2Ve=MNmw9obi?gjrt zRo6$W(#M}w?D=;K($JGA8kw9Ggm$2_zUb|0+Tp}cHT#qud_V(cY|{s^>)&MuZhHGx zDl~HwHE}w)AhMy2U{w*9MJV!S?fa7BJ~!z6Ju zthM* z 0h^Atr?!e&)l%KeeI0x8D@E#$OPVi z0|pOF7wqD#sasKaeyO%HIK7;#sWVC(eLD?e?B(}dV|I&Djbn}^zd;^7oofK01o4mn zj0J=m!hr8m03f(B7@moZnBxM#h&Tx1(XJ$LK!=Q>`}Ywd `Q{r305c zc2i___RkM5%>X~`e@1ZNOBaU9333V>O@>boO~cRa$Qk4B+n2 R&VQ7r0TzY51i^ss%z&y}5mJovnH*DAks175_H@K$uZWI5^;>!*Bog%OjN(=m z00j(50QUOmJGGBOGP9-|fb@dTRuaHDgELnE2x&w3FLR25nEe(+m9BEOB@wsgbzbiX z3aU;|P5`jJe d(f$^aI}y~oBM z6p6TOICn1-&xCAh8um{p5P&K(G6NfR4Td6uA*dr@NFM+xL;_K_5f^xHfSm*}grVRC zg23g#3T~Q!F&=6Q0HYW|%;LzSf1A9vjss7|gdxdr;2Zam`T95d363|H;sCQK639>h z6nDWL?fXY#Uxxc 5nqq0^e!xI(YWBJM2mFCm%vOX%zIo`|DAN@d8}m+d`+{~?VW`m-V!`~CmaEC=i+ zW)#d$wkR{x;Ls*+Z#^e%21gZG$n&C-TViru<64t$pttqD?fg?uleJGS4Z^v9am(D! z76lpNW}ft$S*v#}za~XtsIh&nEEtuftIoaHJ(>$Za=%yYpI&ZXy{)itaQM#h-M%NZ zgRkqyThX1%YhY%=k+|`ter%%wP6yv3s;e0!^PJoLkW(4N+Ow`41n!lH(K(u478liN z=n4iS(NHCU0d_ES?Gl1SApsP67lotof^N}5AOHviXNChS=pHB(U_iI9K_CPIfZ{*_ zVRR1|j8H%T9q0oH%|II6BK%*lY}_7Y0098dj81;0EO>$+p{t<_=u+w5YN#$4lq!W5 z0YNIk0lq(_RU34v^lxdE6J6i@Q(A38KkrljDXmsRzzAQoOepXX0hs?Ot^Q$#ag`Y_ UJH_e9jFto_$~}=Sls54BANg90rvLx| literal 0 HcmV?d00001 diff --git a/static/blog/compare/anvil_code.png b/static/blog/compare/anvil_code.png new file mode 100644 index 0000000000000000000000000000000000000000..1e3c7e0f4fafa56fad413c0812a4d7cc9f91a846 GIT binary patch literal 34213 zcmZs>WmKEd5-yCpyE_#3;uf@&Lb0O73j{4vw0LlLmmr1W7ARgya1HM6PI2#-bI!eM z-5+0mWW6hU Z(sef$BQ>mPgkkIY^{OamzR#w*Y^NV9x z{9t)mV0>CYT +8XB*vaWxTTj2M6>Mr@slC0u zZ+0mlF!1v7vcJDSBm^`&I~$suwYjsGmY$wpPyqV9@XpA5VrG72W3#!rd2DL7vHf@7 z$V6RzefPj{NMgp!%uHcnp`D%G_V)Jm<4a{zYjt&XZA*K3<1Z&Cr_R2C=$II7ZJndj zv$LCfb#-+kBcqtCg3>z3uiw2%$;p53p1_s0U0q$dxw&6mT=n$yoFfviZ*Jn^6O!|a z6LX7p_74|VHyR-jkNEWQ@$r$7k+>Xib#psr`-ioy9d@6QgQMr(zP{$J9$#NyH+T0h zU%o(x$C65`ySuy7s~RgRE4c#4id(wEQ**+?!-rv0o}Qj=(aA6v?Ck6;Fr(mCYin3a zwz-8xetFH0A3p{L25f9>{2Dg1epEE}4EUzxMC6xd6#s-mp()_f?9$4-`W7!Q@6EHj zl&Gb_lc(8@o!p<*J@xfFC+GdEm!C~c^m{Lt4)2l|? j#%l!5%Z(U+fO{?zT2=%iFsDUOctUoxdK< zJ$HI^EuX2S%~kdcshL;}FRr;&txaqn2!_JO*S1Z;OKn|$em6B4IlARQ50sK-BIa%* zTDCL(97G2$==NTw53Ti8S5-{!H0?bmckfkoLSg66j-%I7ZRa0G{gZlT*V5z$M#f@R zDhAHxih3tsc85V<6voEJ%6ehX{jtv-9#0J>&W4JALgklXeMc)3YJV VpP^#6S7 zqSWS1kiabp>wA9L#=o(HDr$JlVigc{Ar22VGt$8!&N>17H;9^}(&Q`1;PlTkNZ{1b z)XAWKiCiZ@IgVD#OAn;9oooSwqrp!Kev7Xp2(rn`%8+gGAoTBEqf3eu1Fp~ef1o^f zfu)JxR2#0f>%~&Z@H%$GgX)PA$xgsK1Z}Bg5-6m-e;AoqJw}+aa8wSl2aPYB#IUAt zhBi3YOp2~MM&6Q ^T>fYNPhpEUXgt7!ROQ?*II#NtqUS7@da~~OUAu{Pz zqVA^&f<^r!p9))UDnb(-Sqhv{n36KABuG<%`*W$k9j`BDbybtLQHI4=85u&{)3ZF; zx(kDH6F%qduYepH`bMDQw;u?0FToEZ&{%L2q5+fM#BBE?Ou09`jbd}lnADC2v3f6y zYn90SZOPOh-9BinHbQgE(dTk??~3~m(sK8Y&kS6^;_WQ0dvvBEM;n42nc7!IT1ZW8 zu%t=-+I#ea2dX3+Xd-hr;cp#(R@;jb3nx))V>SQNG)G45l&2`LwAPdFr}A0 ^v6d!s`>c@(wVDs47%(1RbSG@ON vb4eu zP^C`lnz|DE2@$jP-XNYzmn|FG=-bbsN2HGWC4X`2(_<82w=-)`Fpi~!)TL=30JRlS z4GtCI?z %4t|Y&Bbl}eulN{ zT-7HWwx3SN>BR?JC&b){CYb;uYlZ&97*tYry -wja4=Z;CyVhAc=NhgV%_l1=}Qr(Nbp*euQcwG z&72c3S1gKMzsUBm$X}&~M_e(P*_uL*L>L@o0ARkgk4# ?rVNDyG4{r0rS4zR1f6}> RBp2p%Jvx2y}Gk#gp+~R;rAmS6(J;}p9|pOZ{-3~R#bzIy1HU3DvCyA72`7% zQHTD{)lgIeNi!Gy_#5`$@0<3l&5-$t$OAU4(bNg4^%DA%RYtrXITEEwMn>jEM6Qbd zdI70pc?SMf6ciPtqOG#41My~6Gv(1H F5*gk&FdAk3wBpfHeU61X}Ruo$MWmV${!RSFI|{DrV#^Rgq9Ry z6hih6=B9#LoeoANf~;r(Dp`TS|A%BLB~J*;=?Dw?LOeN8)4=VK;TN^#Q=$i#2QsS$ z;D_hNfhEP4{!-ZR+-I!m1LLZ~eE zu)qB3?v}hZ4Y4~1icGK7?yW4Zu>5=B+24NN&tJjoB{bSc^9Y?Yr784ah=)mt{$z&S zZedg-yN1rS0%!}H$W?%}k<5^B+#`(YPBHmoIqtyVfxj&`K_kPb tZ`cL@%+TpX-pMsDx2`|G-)SBXe6#Ug>%D zdK8tnmACu4w39xk`psTb30N8ErTS{h`cD$h@$ZcfAKFi-OksNN-}_tn_Eo3N+W@ae zeRA#&`xIlNH z6OT^`u!zz0$-;|wAM)0e6{rMgzLY(9Kjy8J%O0y*Y zOTIEmc`=|Y&>gU;PQ79&gsD1vj}J;88J=r~>9v#GI>qk&rFoOQO_#t7c^P`jtVM9y zr%=jzIK-tW9_!$~-_7^pM5?={U5%zro+*ry#!%N&Cv6>TrAigVbc~71H~Yf6oM$?d zGa(|9FJ1X5uSPu T_C{YmK63rbYpZ`G<5kOdQEFeXzL zW`r!`96{490v4{3me`erTA}}sv$rij5mh9I!oq*YPuW;{jKz%yZxDTQ32o-#2`f!k z=RL_VRx3jhs+(1RlGni=kHht=k~Ut}{+7*66=&l`Vif+v3%8gpsZtj<(wb}Z?}uTk z;ZEPBR8mEyE_b`*G|jh;c4Z~Z>^NmZP9sM~i1+*Tx5-T#pG|y>tgMwdBz~jzs(UhH z036Y=Hr7BeKdNg&Y*FXPy*f ZhMcyRx`y5-Kp8a5Y5Q4tl#xu<*&X)Tc*QUH%H1=sSefr8cO>Wp~*lke` zlqX1HqhmoCm_-u9)&k2v$YNK(ZrVe(4hk0}#uv^OR20&&v@%~$X#dP1lpR= ktHT!4w9N~W3r*A7bRh|~j1$y8b0k)F zZA({2;!I<$iMC9;t@wAU`4J-!M#wLA2yfKFceNwMjTqvq*W#U-j=cmzqRWq?=&pXd zlrc2Y{%kbw=@>J5_V>H+k**2cqTA08bW1j#LJ|vJvj1V>tmEJl36ge=hV2>BO`mNX zvuOb gEQHT#S o zFL-D%{lsisHa>z(xrc(i9Ch~TKVrD8-u$eZ*?s3^LQ3`3fNhMQoQ;XZ=l!LWBj)L< zUSTJ*$Fs|>ptGgsh1~@?V$h)I1rKGg-2@HF{-2M&h(Xw=Sd8xMknI2r6$ZDR2DDd< z?u**G50Uu3Eig87M=~t@P?&CU>sOjVap8q9dF(>Wlp#HT&*b+<@;Sloh+k383Sn%W zF@%}G)LaFG&-!knWG#p;e|fu2&boKlyXUVZx&@9jRZN=e (XiNUP-gSLnRAA5l;R7DBxQ<&ZtLtzg5iVO$U(&K##HK0iaj6l0g z7KeZOqYdMn7iKaF!`>mXYz4 *2AF!#5KZHZ}}ia(iJSJ%M|8`YtBKz-7SoDD*i*Z` _APwuCl+YOQ>xrK-rtEk+PZiOf;<4u0Sng;&2C z$sth%g+T6@q&)hwRxNLNARi)|_(VBKkwcuG52ikotTSG8s_SMc`jI78+h0?sNm_n+ zL&AZ`=sl#ztemZIkxzVJ7sW`4LwqEw>fSF4>M2iLMqoXwjWnR4^_{iMK`KI*b2&X% zDZLxPEtD-Kb-&(>b^o##b1ULiwPjXR&@ZK%;trq1BKjKo#caKNlem*$TV7IHFKCCy z wXwY)XMFrSGsEPOcydz|^rb8Y$u3<$ zyNXS?KBwusmfW+WqnB2 z@1ZP_>(nu@ylv|#AC{Cwn^x6WVODq)RB*)SxiSXn<6o6d_6_8JC>NUsy|f`o*)R>{ zZbLzW;2lZ~x?1d0A~{*CF=E8u_*iA%5&QyzHj5D&TS(o3_imzeTk`JdP7nekhx^z- zM1~V5j8pM$Z4{>B9C-!(Ff@*>JYv3ZMpqsNr00dqg ^}o*bqg6?pSxonDq$a} )>j-SZI>L3#H;5j%Pq{psL+ zZY(E;a)3*yOCfE1SQES&bmqqfiTEdpgen*C1@E L3KvFeTY&=W(x0|MhCNWNh%HTf|$XBvnB4hj6O54Ec*B8rqB( zO_Sfkq{5AQaFR;h5CcH@762S%UkwqJ^V%`m&iwUy+y6wH!*Oz~Ur++W8`Ll0{$eP> z_-0~>?)v5NXu9wp?>_jGDKiKJT5vfklFan+;;;Tn|K%Uo96JR0e)k&3iu;pWS8l*y zSbw08FcZA}Tl;wXbPL#hGYj&50=pIMtjG)!Qq53)3%$*6fS!VKsii#SH22XGPQw$E z&_M8Z5pkbvC69Wh71gVqk*rwSEp!eO-XpGn<6%oNI&Pl-x1$VPXfMcM+eV1rE>JNj z=3Bm^p<9+3_55k~K_d0-A6{CNCdN=px>WANWKT-1 @&H_NP|DQ)nI)zGW z*d-OnW;IR_*qY{_?rv_5(1ba%3O{B9vKN5#D7@W$Hy7$$ttP*^2K|Ix^eoB$0TVv_ z$(hDR0V#i>-WWSX4FNDWEVk@$6TpvxAU%ExVWylo(K2!jw75Z=?f<*(eXJ8~4vVCK zguwX)fT-JiA#+lHksMTR^bz}{rKL@|YmbmhAQpS0wop)hJ||3~A50p%8?q;3YDosM z^C#O|V$!M#SHMAFUDfY3EjeC_6Ha@>_ybqSR)$*RTMPn_wlT{aZey4$Y DN6avVGv>#CEaxQ|s)cB6&5{bh1 z)sgA(EJlKYGU@}o3kmR+mBrY2IR5icZ|CvaDMJ=D%1~Za*7k^~xy83+Y+@W8&WrH! za`4;t#$MmE+z*#0;^oyL=; S^Zx;uz~sp+6oR7RMIDx)yf{ zJ4gVry (xDITB^#NU<0K~ zQ)>mwE;JCl_`}fFW0h_`Dm)6AOT~IUGVoKQ^)zzggy^ju{Pi~4NN0q;BEVK7AC)uF zPThV1iQ0)(I){}4-4 _L!1)6 #xjJV_G8tn{ zaffQ8XTk?qKnBpQB%JgU7UT26(g9)7T1<(Z3I4}}$>w+OUiV4Ks`zt$8Dk9mPm^J# zaluY K?O5T_stI_Mq8T3A~7@@y|W;g{9k2WvlAhxiJ-<-TDIG|d$lzzMK(?hi?` zh2A!>Hp26Kt}z^dJo(rS-mPxJS~CBFqIe9YLOH# X_9syTZs|TVfhF|gk z*DY^R>%U?N0CA{Z;-#>cY` O}&WhwWfCXmNKFCzP+g^rxQOw_1f#cvM<4 z#y50JV2jDE<1veOcc-ob)|2z5<%WjJUsVQ5EGC?nNiAWKZZyJ%5NopByNF%c6|;te zlY^FThf^gDvA^(}+TW)q2<$R@!6<}_KBJ6v0M~T@PoE&?<={N+l4hNKNoNhtV%joE z`hug5au1o#>9U(R&f&NdFso&Mz5q~B95dTzGJqRJok|1cbRZdQGUa?@pXXGZJ?FJw zIyb*uZue2cVILQiF6L{q4-iI+JNSn(mQN|nK`N|1oxe6~$~kQ1wEy!~QOnuhI91Z9 zplD_4j0*MCireO+AA2vD@MW9TmJ@h6@lpkrUTJl|tiRRMVryE{IxWXp@_A_T JQekjh!#ghyDk?9j~ml3JJD-s{68#zNSv`cdD2l&@uZm*3@)yyKVR zfR*2@9UK5ntzjn}Rp|icM?UhoQr_j30*UZjA5~cM=P5{6d$bme4Yy{guF=+Sl7BL= z{f2`KpNc4)n0(F#6D@7FZEPB`62s^;9(0BTC(xopIn9wq{`zsk2R1JDa;jmr*$K>K z#}7&OahE7yNPPm&`o?fBIdDG}S?G!%``K#l+#yL1=s@kCVmxWYqr>lE4$?N~tl@X| zO%s8Hihh2HpSS~Ys$YIun+ZS5&7g;Ndopr~xLCSU9JL*rq Wk$My_rr{&uez{gsOFpT^nNwg-@n;Bv*5Ici>UM AwM_)GK#a9_6()-A9C lYDOF374{=@7+P`zEK|-|{7#i7C8xFcF~@qVNGYiRU?vg9UVH<5+dQtL z_ZfI!DLb*{ Fr(RO!raD%C!orJt zEY5_rgqSI=@aJZtfzAeOz`@ED^QxJ)-oWT_cU~;2La^bxzu;8}W!JAYd8qSb&@Xb= zG6uA20Ab1|`v~4L<`T~~vT3 ($qoWPAe`Hxy+8qyRM+825XL;f0JB!daSf7vO^$_r{mlo9AJ?1GPJAWjIpKgI`Vr z@&HKzc3`L`Oaljtijf3D3<`m-o%Vvkg#TIM2NtC7;t;qszzOiMs2&dLahmGu{|ehX zR@Ib(4T(|X{H_JxLX$0qag^sOK4E2}YQf?$&@DgVd@69(y&?)v_*h9Id|U{o#l*@^ z6ZqDaO$wA!2Q<=QEhT}$hK7H^pLAf{2ftCA&SsD8#2_{*2w$h{=ubYXzd=l+3QsTi z_y>JX8$Dc3B9ATziA0#I7@SA*gmQWsL;h6_)k!Ix+1LfBHHotk$>ljHs)_CMsE7?- zseAdcL(1-SLz-Iro9 RU9ZbDlV?_Z6J1x%0~_y!yGbcdY|;&m?b0x93_1Q@Fhx-ki0 zPh b61a(oej+4;NSaBAzr*7AdEF7egh-O0m_r1DLtDM zBJsz*zDsdnlT(-ZUEE3 +s_c~D*|3{3ghg=~ z)n2Bk-pl+}lj^H5NpjctPfnZ15?>zd`%EH=Wkg5CTco+Eg~#@tD+ZpvKDN^!!-G}` zG-seGeB)1!I#?eD;5w>4?fVW&e>ddD`4)ZT(p{Vk)O30yW}y~8m=u{iBLCaJL@gF! z;iV945OQ2Z&Oi}nTIT-FoCYgIWCI7YtP#6=mNuVcUI5r5&THfjtw=4b^VbHkJ|!C; zhE}!eaxzUI4)*7a7+<`LFWJGRo!gDe?7)E|7b)w&3v(CJf4V*}CtqV97Z}+jaV=}~ zn5g>zgVY^dMv}c-LeF7KLqHvC8wD30*}o+gn!OL_@t2qElHs_c$sY5poe_sDFw2d& zeW5zn+nwisBO6gYn4Rk#>oJ7EEe}>P=Pr^E+a{=!+@R(rX=@V&O5&$T{8Ru@K!gtp zfoDGZiFn192y6<-;N!#rKedNNorj@D45{c30Qmq3R#_BjvXODZKJ6f^{k>dFIV0U* zX&i!Phr}OI&6ZF>z%lVD!W!XE@+L$K*c)MND+~uce~FL9?;~;t3|axuN~GpZWHcvA zSeq1f9U-WiVzAb17u9KqkK_Y+IF1DWdy(I3I|C$X7)$H@mwAP!?m*_kl`DDnXp?*J zSLOTFn8Xy^r5=dX9RVnu&^Sp{f7jaGa#7p{q$eh7OHkLKKPGNUt~%HQCZ$ftH2Ph~ z6`hG_Kx7G10W{X-xdZK+0G|$NmIU;jVKD4vM9?h?%*uxfGFU7PI6iWotFZ~OQM8kr z@t8;A#93<6!_} uG`ethHjpw6)1}dzEss^uNCJ1J7kn7uL!=w_wTTB> zA#46w8P#rzd^{D$qIK(askcDbdedP?ekzuMxT3vmQj`{AWAaU_+ie)fXgbF0YmRd| zF+|*5dVJt}$lhP>x$l=DXduQUlvG@!yp~5?nZo5hcCcrXUL^yAV@#JbGtdP2Wvgt3 zKjPljbwlESxvQ^lh+u~VO+BEMCaMa+-SBJ>ke*Yl^=quG#gJdLY-&lg=D?i3ma0j` zLdCB`)X SH)z722gW%CFE&MBLyauJcZ jL14in`oW tG-{^$&}Cy&2Y9Uiiw`n9Qm(mr%<#< ZObC2nRT6DqH v-b3_a0% zyF7`Y#wF6?l(+M_SJ-bK+G8!%r_n -%kD+I |tX2ynMe@lVjRT*v4OS zRhk6iImce4i7NgzDcS3ZWuK?``5D)e?R4Z^Swx*+F1?_W2+PN_18s%`f3 nm5V z*hRL#eH+Sy `-^(AvIiX3G3n};DCy}*`#}%y?@y9_P;j>i&JuME z%a4GXcO`@KB4;`<4Dljx7LU-sv(lUIV*9_3awohyucV>@m1!jiA}69}qVexKO&v{_ zDfA&9`s^FOyP3XGwenk|;8vaI2daJk>pLL+n=L5>ygG1R2=7nC8^9K0Z1uL^Sv#d7 zwWzR|a!3RPSzGVN2)n+}M55sy3Y;Z s zXWR!pskjeP8W>osloj1N^pCH#y6-bF?|3iMLYM|}eui;%Y7-}@x%#PlMW_e>i<2ig ze)piW2pOeqx(Jd(e8)48ln=uHvU@1bpIxfjg-gCI#|GU}7YxkzI7iW37RinE?z4t8 zGkvX_y6)wcj1;m=uD?=n{mTPa@ubM9p0odc<)=>eRTcq0svuyxO`Lw oTB;cqEd0ho)=E9=F3A>jdWoPKl#Jw+B+(qk=?lv`I& z3Sm_bPAOBaBq-`>C7VhVnCA^q)TjPZdOp6 Is%`+9qmHX zqBACTBcgh#M%um&oW91?Up19=c?5a|d%T8BsDG%7`hIuzqRj%-XY-W^7 j higlBt^2hF znt4A8G!sI>PP%nWfOf|!20u_9G*O^7roNDO@6fUj6wXE>Fk|@Vv%D6G1r+Qd2<378 z>*bo|&xaxtCw)?9W*PcCvi1UnxQ4sZ{JZHj=BV{McdI%56Jc$E+;bD;6dO&>sb%5F z$XJyb94V`vffa5 zj~ik8VuiMs(iEI%PP};6?&$dGs7@%Q#?BOND#TJzhG*%{Bj6h-LqlGQkKAU3G10p= zxpz(^5Hg*A4%GeWjWuBDBv5$5MK_Ju^BP{Zlxs`t?}#F28S16Mbd<5fytafXu=*%! zENe(ESJ1f)?9g4^DzS2N8M^8TgJtYeBcz)Y4{so`19!MdAnBL%D5r8l1=*+6$PunY z!X(1gJ8ab{SH~%=0MKy6NJw+qE-&KsMJxhRis|@(U$ qT0Q$r4nSr+ z4Gz((Eyd3Et0xPEpko 2ddZl!jOKy!?s0nGMjdb5Q`v;C&or*cOTFa1hzC+ zW_yy_ey>l!n)HLW+>%yv|6FL`8nR7qz^Jo|OagAoFuW$|l4HE31lQCdoD4jwn$uaX zT!k7 uCW}_f?)~PJf11|E0GctQk8@-QfEBG_%^naNlWtA2Vmc*>Q};XWsk@gIqdNA}k}~ z3OWdnhlPNLFD$ 6b&0+?~s{qg!zp-Q5ZI0sxYkiHk |N zU+6~8-@lWm8`7EV{SVDw%r2S)bbd;+E#v||4Gh%kMP2-*@Fnre@mw NIk>NYsH za2%}=&ui1~K}AjC!7|SH6ucVB!8u =AcO)FL= zk|dAB>L+#yNiqhgo{-bZ#9IiGMyU6jy4>2&D|E)O0Edyo&Ht;^08mMwmr8Aa;0IVn zHOHq2=)^i*m6QZ($l%4gICR&ordphNwBEl=fY{gqPj-cFcZb2JU4wrxmW|`+T zT=M){K1J>xs6-iS^D~0cIhYMeiflU=p{bL|V*7)LrJwT&A^&}A7;Y+QV8a+ ?=Aa$i}3G5;D7b zx5U_MuMyynD+wIjy%nYJar<|+5hQBX+9KUd!6-v=#i0iqCNBdg^`r6Ry+%_|(L-R- z6&0%Mts%`0XmGrrDTUWb?$&m0gDkp*`W{ReJo2tin1ZzU_M;lWm@-x-HMEf2=1%nI z=4!iyX;#4UgdMA>U5sh|&^{OWuK_aT?c6IRE?`;=@zhW7i=QpfIXWpu-)e;NsMX}| zm&_@qE-@J?ayXQZHhC*p^_u;sylIW9vv?ofhxsXX=79EaVy4)Nm}RS&_U~;D+#2tS zLvBxDRLpUcsp}&gAT;^$b3xS8_FgGwB@$tsO>qqI-)ba~uf?$o+3;znA0>esrau4{ zKw-6m0&g<^t^USe`b8X@3NHy$?_T5M@dBYCx2r_VKj74%!lZ!_>*wbO_PQ{l(aZTV zeEk}~`)hLev`C(+mmZNIN|+tEKGA4JZ#@?8e?N!;7pQz7_$%j )Y_eSq+nmYuOilh Rxb@yT+5TtTFEF zp>=DZ+)TDm%L23$PARDNKXL#`gr_{Ce_5F%;XQCySKhPWl2b!CY#uc!A^4+AzP9uN zd)n8=ptguHgy6T*ti-JEKU$;I^*11y&xb9zF!U)C-uGda#pXUAYa|dt$|9>n`PBi% z;3ScmSwitMBl72@ZD>qDc>1{DblN3Yb@WnK4&NrAZ=*Mqdft}5C)0RhZ9smJBWa3! zk$=Tpc9YEtFp7 vTX(tuZzm8O{K_#0mkYFtp96 W~rj$QE^0l0Uj|)$sKQn(r zUqiuabRvEu4=NAoLXG#jx9_4XzuDPIBxU{a$Z9byc+)$qfjL0o7s)F(XP;fK^&zV6 zd8AF}H6YpA9E}I8l2H^ThB{XF6OR*XwJ=F!OSX&Wm{Zd6AOcCymTyFs#9aOvf)r6{ ze4TJCkYUKzjDXYFpwsimFLDUmQRBR;F^u1xp@j~VqEz@i<4yyizF^g%C<0SDR}HLK z_=dv`eZd(^;C-Sr+BRLTTVL`vyj@b(4PFzPIP(Rg_b<4@_JVwD@)|-!qBNL+j#HS@ zX%-3E5>nAA^^}N8E9n3s{Pw3T9IDQUQWl#}pJ+?LNzId5yE^0Vn9Ztq8a#8;t70ex z4fRy>D{R*Ka1sRP&a TFiZgi-zPROrNI4`e^_;X40a9O(QduT`m#2H=G6Hr zEw8p8(y#q(b+9}eUaw=(PkH=JoKk9Yx%(FfO~(80!7hUT3Z+Y~y^nF?b}34ogxl?? zSNWZwK?B}yqNqzcqNoPBt5U+uEg-iW%-i^>w*KVQpD4Jm(nYutwsQ+gtiZb8H$z36 zbtt%Qmw=p&8nZ3@TFMZ##!CH^&(1QOuNYLLHKyv wQxoo{aP{25VR0I8~`$a zD;yjQCRKpR!J-*~48T4DVFHLH1{H>p017TjHN`fd-G_F810jTL*c+zt*!A)79h{VD zsLPEm(Cqsz3ILmx8sfB$1!rJy1)G%E(xb}3EQe4}g___RZlPVY#E2Nk0212l k+b^B<`H0m$ b_E)<@eQEMMCW^IFFmr-8e-=On*{&iT<+PqNA)m1m5dk^FbQD z<439ulWi_Kc&9wBea7zy*Id3uV=V<%$pBU2{qz7jB&3jk`Y#_h7KKQKmBfR 5Z2R56rL)wS?+kHJdRGAU?LHcHsXBqY&T*+n!z=K#gLe-+51 z3aYfyj4=o^f8211Gd_Nu-hdt*JBR{TlZY}RC7k!@Ix1GOxiNQL(5kCXk_ys^fi}Ki za`eIDu++GLZKrz`-{E_qadp0piZwU ={3J`H z)JIyBqxeyKKT5)R*LnJ0or+{QAJlyBa|fmk3^+UB1ssntn1-YpR%E#}(h}t50gJlX z@L-oDC4--nSMPsVsik8CX(9y1edZYi)_g7ZxmS}y_1;@^BN%3!=Jg~~e>MJ^N7q&8 z$~de$l=aapdgPk3>E>D~o}IBYs-sC|{HRj%XlS}h^Y*nlu5UHObH()~d)x9D?D1Ra z4>rf%#8vA0x*oZ(JJr~i;yf{SL16N)PcW%jLYrqs1Z=d|BGh7Qn6h|OX_29UE)1{0 zb5ax1pP!}pMuQ+su?BQ7lun>kH0+`{N{ow#M`Tios=o53?Jv`t)J`;~zoKgqw}Y;Q zrw?iAfDs$9UWLv&br;H@90kB{a{ib;OM*`}+_EBwLpoJ%hGw)Aw(<*PR3;Q|JvL_f zcV%h_L^dMLM3*?%2$AZ@HcRwPU0fUQtI!zZ!k#Awfub<|DidV}S-s4VW#7S7;a{M= z_dE3TAc#AP5Sa!Z&ZvSLp7-de{I8KEDY_tA@K|=81xl-3m1JVVoqTd7>cfdmDZ1RP ztBfnwGDPbP)M-CzBtRes_SHxV2M?+5VqC6$aFCzq7I^BgM=yTgVz$&bUgY2K-Ns#W zVCPHN8AiRQZ7$Ft67~aYGUuz}9gneWi09ok_oUO!Yka4yTY%}xP104#_DI(2YdRoC zXyRfps~>FF#jipjfWw2s(1V@Tid51VUjK& {ktc1Q?|Er_+TJh1WLfY#4fEKq|pnrumy3y{)(#1D>!YKO>o}>t{~j zRd@}hGLAOi{-WsgOLlR$E~2xB5wS=tgXnC^CgHdo+;YR5sf92ZCo2G7w~d=fR(R); zJ(0^HKuQGXRuo0unNub4E`3+5u3UWAX9%QK@`97?x3;p$Hmj?>yUF`Ej{U~co82P; z&0UdjGe7q;apSdeOT-&@d Y*|u5!@9R9u=K#;)jLU}Q=)pmvjcrEVzHj7ueg`uza$3k!9ibB0{}3~jQx-B0 zdnvxNiQ$e4qwx$5Y-| 3=lV5XH tMU30G)Oc4Ws5)1L{q}a3aqev#G^iFKCW6@Mb3d|;x>dfM(YX?B^}^U9WUpas z7J9`f61>|FrmV7~dJ2>U3OJ&xYqYqdv~pY{f`5u)Qf=%oR2k3v&=Fl#^q-x6+Sl7K z?&Aw#6HQ|t{H~DNu8`X_QR&G)>~%YS-ekufy*;qC(ZP~PAl&?+0Wz*+d&mZifwkF3 z%l1bb^l6m6Gc=-?K;y(AtmrYn--70T^}ksZU4LHgh{`YRWTU+y7s;Pccyhsi(@K78 zA*z0vc3&w^yySZpm{;KA@nyfBUtjr|{*7nuSDC1>gVU_#yGBbc_+_IHo==aXqpLrd zM+-=nip$Dply<#4U?H6)5it>%>ad0SdR9#Jy2NrT+Q_cCLPUBh(?4n2<*CSZ>ws>_ z<=K74Fb!3H>`E#{3|!&K7Eqcwv*$)sKW-*&=-eM|7s@UcenhZIJW2L1aZX{;#B$jM z+%PuvU_2@eCw26Yw%xxuxwp6Pk(gIpmpssa_0;e>TiGfCkNJb}-s^zfkv|!~Z2U3r z> <<%r#p%X4vcyr@6G^fiRFy1jIy`WUq zK#wujUFt(6c#tb}b@hsdhs|#;(-=}oIW6nnIb}a04>J07iK rG$zIubf2%yRi$iqva@XBM?@~VmY1W zz{qY1@7#(i 4n*tD4>$mXx%mfkE!HD{LYw-m? z{;N?bz#(Q5z@?CXYZV?RtXOz9-b1lx%xt1_HMLk0_jMahv60$Cx9P1j);Acm{gk(x zWi(&s2WX0fg=v0dYhA+M05}w4Mt>bxBvOxp0~d@YoBLX@b&=;f93%k+-5CGqN-< z6c`n2P|0|iXeDgmh6Iw3Q9)y^&JHH4{)zVpVxQ87h4u4W8Rl>E>|b}oS-Qg0DGY!( zPB~a#{y9zolmWF ro2l$E?OhPPU$gu;mXtvZ2 z``tqLm5>K|$&kCl(U6)}zSaCxkT+g&!vYDuC#XSF<~i^6uqw?F4@einRK!*{eE)-v za}NaoC2^{>moAHVV?Nd+J;Dk4;Xt=UK#t3uVYt-K)&}~o3Z5~(6a_zyRfG2gr5mj+ z3zi5!(K?TOS10EpLc`PJtT~HOHcjb$(cw3~j{85nUEFAn<6dtT*j2 p0Wd5w)(-Pj_#?A?KF92!okp{5ne)*Ws?pc^k-Cyl*lO_eJ`M#bEf zEA-pJoN6JDXN|Ku`hj6&`u(^8K|s&7$V2a_YxWRXj44B*NBWEW_m{lS%Exs|z|7J% zIq8}@!X-{|StD)0f28FUw$yI-%UktkxbJ!4en4(-=wo^MIq(4WQvseIzI7I}0(c`x zksGvr90`Y21_%64qOpqBb^0$%+-Y4yOg~oYLR$P_F3!O;v}RlEjotQo7{%Y++y@in z>Fydw0ZJZA_bhoR$vt0@dw+;aNQ%%iO(a8%3|tb~Jo7%w*MDU}q}{aKP^g{xcadTE zEz&KA^*p-`o5ih_HirXt49SmH%?8& 7 zj6a+|ztZ?FPHE$J%>o$;C7~sm{RO*LC?;6y<>#d?s3w< =sf^Fd%Wfxji%O@E&@WTaRq4=Bm<+3r6|{Q;0XCS_TeeGR){ z(M*)fmD4mXxLzIBUK>V;xI`Nc_TFcf{=)PQKk?`TONepdgKAJGUEx*(iXWf+TiwDu zf0(?npWm-s>S^Bp*!1o5^;YApXD=XeKkStb$5kO!c*{-ot&Nla$&+F|mNv?OGL%#0 z14L=c#?4!i> y2dvHo-dI@>qYeZDHKmCg#zyPD z=BEj<_?VJ&@d&%e%0EHZ7Mq0K!d#!T>UbuU@}M}u{e;UMpVUREr(jdwDTyUnra)p8 zR8l8KM*C?_`8#<#L&C{u(c_w*othmaUrVY`&z}*#x0AnMJ)!!p3vJ5`iRH{>*tbVb zBmmijY{zrm%>zbN1s?(*;|8wu2cTR#aIi1iX4r8u1c`wf0pt!*3IcB2rf2FgX(<^+ zyu!Zz7B5i-lBOhhg;A?1759yLrJSY(RfAF1O%RS4&YTEj7U5%pJ2_y2%zerBJif2A z?6>EO&Ht~uw~UMHdHO_g*WeZ`Sa29L*kB0|++BhU5Zr>h1P$&mxI+j71PB%^1RLBT zKyY^__vH6~p1phTv%8;XpS^GHn={jWPIXmRS9e!e_xT>$Rimt-K{Cj2`|roLyNP}U zg(zjKbu}?v6K%QO?N<2CW%%XK{iJdUFO0*!X!lGFcDIwaQTZkC08^s%6DfUS#(yhT z(o@fG>-1q^{B(Se#8rf1>-pK!vVWCl@ft&W>2`lOhfJKX?lDa)4)w=$S6d6IMA+am zf>4X*uk+V_We7dr-Ze`IM22|=_h?ugs~xaiV{}}8G+)q$yw)~XHa{i;<}q8M0$l1i zRxWAZYqP9Dpi2o7Q}+BbZBzYg_FnuuBa<5Zmw!%ZF-Nk8HhmDy^dx+LF?0Mzq)Q(1 z=sq0(=Fl&U(5vIrT-M=7UujZNmOjyj;Pu814dA9U!2{7dTT|_@N5v&;e*Y6r{?3-> z9l|FAzIr0ZkocEUR+x{@_8=!i)6Yl 4wIB{&S+$?T*S{`D|ydkl{d6Pqi&g*Z3G3Z0P zLX~kpHW+Wv1s^W+zQ9);^dQF^aiI~k0XL|ahd;qRRz?U4rU7U5=e= pvI~5oC P`WYXdZlhZ(!bwU0oo(w;McDC*rkc1t%F<0n-anYXhua`H_0m2aYy9 z yEZDt{qHgwNQ4-ufr`DM+_jz 7??AoPp zc2%!k2K=)$>v8aGoCDDOwU+9Xb$IY|A!x}NA*e>Fc#9D!t94APqy}C*z)_1qn`c5H zbEpI *jJ`f!a$ C+lT`in36^o4C+A>m<(PGtvNE<}N=vONm4 zwNC0}@Ev~``${#f9#LFgxHnPtk3)gxVTiD8n|;zGS)XJ7lVnwn9~Q&vqvEpADTgdA zrW_)X*R8FGDiF!90cqkdffte^11;mTqy+@r4@ej2^72__RmWv wB4R^4nchtD6cL*-0$31dEWzYPow zB&WL}exHYS?t}k g86kL)8q6H^zr7OrqGb4zM}8#JXyM6Z-D3=3pmYG1l|{H zj)g~T6z%&v<71*CeMJ8#%X%S+$>~xJQ z0^YcBC&0D0b^q`j;hXT*ehtYhnTFVmf(db99g`Vq>CpKXlqv h#HeE;4m}Jj2bNQCx6kFR>VT;;)yTyjWHfsu%2E)CVko84MrpTd0zY6 z#30)cLS-OUIUA0qz$qYRNx@TCHZ<9oceG#e1TEFz-K#K!*kl9>=b}HO#0@LaC)yic z4?wGbi@Z*{0DX? $no~0uPxt>MLx6c!BQ@XrvXUUhg4>(wBdZ zccQv^x?o0CC2t@}#p287j*J#F^f1<=xeleDJ;m8g%2y859A`VI=#{jDxVre FF7`-<+*EZUzokG~W8RemeQjg~`Q-&?0a(5Ey6Odp5<_V>E#)Hv9tC6u zEo{!45%&3`a4GPjyA!T9))9q<4PvW?5`3KoBhK$C`%*3E8)+fz_S=O~wcfm2o3_h` z7d=yCO6+X~GV0 6NO)o3f <0F`wjHtdsT%(RE_@#{&c2ePdjA`UdPH~7ACNFV6;=`(fG(E93?sj^h zpnbsBW^p>G$OdE6@th4aYG%Mov9Y+eskgp=D;B6 zGJ@Vq>7k^_TYEC03;pt|JIAt|WBmkqO%+0ot6uw(i-TWgnmO;I-&sjTVKULH#P^P& zqsO?mF*GawaftBj8~kxP9;Nq6R8$9;O8FxYyJm4Yhc nz#t$g*YzoVB|`wZ6AVp(wj|Nnh~v7dKsV;7BzNXhW;9y#bsK?TT!{`x$72{R1y zbRp0D`SUlkaX8-yEF4rZX?{wh|NQHFg_{@f;*1Edns|SNALXFU8WAB!TXx+wlx1A> zrrQ8sP|FQzmVGqEo0ImO8Z>}U^*ob5e3$Md2$&y%CCS#v0UxoeG4zzgVCb(`G<(2z z@(Y)q)S&8bD$97nm5$)cuT>d)aUg6VbBzv9hu@$-HzWmO5pX6-|ADmdnJ<4=HWJ zOr!=wu8Y#=9OTXd)>!^(MeKO98{@xt!f#guwd_UHV?sh9HV*vg42`siySxS#1&tia zArYNV2aEW1B%rt8mfSg1-J-KCo0G#oPx@cqn2KE|SW^#h{6oLLlvEmu-2Q8B7)BF} zj%k2V4>w5d2lsTk``sB2u;}7amO_{IF&%^_ai8(eyn&qiSSjU4Zhc5^Czf@+SF1ry zheP ) z)f`#uJY_$#lq+YI63UNEg*Lt+#OF$JG3r}l?EFKF8x%r2TXSRFa!rgD{9{l~pd`4G zQ!cGo!lE^|%20`5 aH1A!E{5C2laA4gF`JK z0AazWw{I{{B9Us8Gz%W#r-L3L5p23i3?c7!kh$@~UA*7urVEyT5=oN|ETg$2mn(YC ze O&&+a7c-1$65P`Gka&0h)9K=xZ} zu PBS|59JPb0*czW_|=;z?n2+D5E SbWfoWI$&6uV|UAyAAVOP tOwc4B;&$ReU`arCX&H?i!VZdjuM`xR~i{1X`P> ok;mUHX`C-D+@G4-$LntBUSq=Y-wX 8QvQIj%M`j9X0bqM~@5- z=~=8a1cT>ZY5Vi`p51~f> 4#`0(f~6V5q?K@qf%k+A z?4bXV &2NU$)0<1;6w&U!{8z$%p8t_d z{ph!ye>z2&_%nNRUb^H({XYs!KX ^xqXKY3=+G$TYB(A0ISB*p;iDg`r{p{h%{OvrYEll#S*13KyuPpLbP%Pg zzDHI*|MgDWLE8g>5TxeUqBLr^$UBMuQM7W?= YW6t+qCO-h7&x|c! &Et<4`yOavX8im7Gd*$?7h(FSqN&Jh5#B$_32%w SKSh9EJ7N__4gqpCc_?`1GriSEl6a zU6#6KKTTLzsj>+AP=?PFMx%}#U|>EBVOy(#>Hg3EYN+&>_W9zW(hEL^0)>(3YtGkF zU;S_UdyXwAe=5$+=-6B|7NRFJ43#4*(V@NkwU<$dQvIQ&x%Pa+&T*R5z}TzLY(Pq8 zf8^x9X@wz-lwT{lN^ d{go1C0POIqaXDvG^{-X zoK?(7!&? `*X9!30|R?*zbY%rgDii<7#(Cr87131iv!`3#4ba)LPC z*_~jJsNRM;5HC>kv=7~mhKbOcj1JFihLti)H!K1|7`(b?RBcovCV+7R`y$w-4nE!u zB@qA$rr_OPY`BgZ4T`@?uM|_#w|Ps5_nyQvTS1sxX~DEO{}Tc)oV8$0MR@6_SK--5 zhcq}2r?x-wKfU9q^7^giZK{vBAw&;eg+; z9fvLBRh~%yCmde5f6Y*ay=0_?VEOMF`o#a%`LY#TOyj9u_D$n@Zx5u~TZCGfk-WhS zPYd9>un~#Ve1Z1LwEeKt_ofq3mqj5Mm{rIOAOVf6yn5sg+E24 xPRB8~LFJm&F;gWj|HvyDEZWVU>Q!k-OI!9TCb3mRrI zf!_Xj_&Z|T7MS<6N6t2sP)PSYsJ6cG`RZZsaXGO!l1;qO$5eQCakIJk-nJCZL(jIh zRiacSZ&Q`dwOkD6dN~<>CF;8=-vp9@WPE~s#!6V`TUCdUrBq1!W<5UKIbNNn0%e93 zhi0cchIe!-6d1qlXz)T8!U^R;kjurg!pHVNRP82+g@?~IU6B8Rmy4U-I7M-XT6&Yi zY!oZ<8hrg-Amn->Xzep`&=!yw=%M_M#U>DvfrwiLvF76s*_t?kpRhtUWO}-ufquy0 z0HOHaQUtm}d3c%>9D#812-8Or(vs7_b~}d+Mn-%5at|Kbjum951S8812js)Ivd1KT z){}&wMa|JZ!AC`C4Cx_Kv^==da4`mmlw=_)6NHNp1dSdk4I%)gV^G2mB;>H=;eHH| zuI% )+EWK7-v~B2CbJ_QRMWACYd!CE5;a7qegy{S3l^XQB SuoNlZOh_*uC z@OxS}tLrrv^{xC}?Ko#7tE!|lp%q$>h1mScMP-o`9|dvXpg1``r8IQ)L33~wi0(7G zp-w8EflPM6kk71q#Xpa;xIeafKlaD{!n=42y-i`-5$6m0+LIC2DJ3($jWyCA9~eGE z3$i|BgA+quPUp)N=Ayz34hdkgoLE`TesCS*c|GDo6kK;QxdBp#exo&aN@-^nlp3Z= z*_DW5p&0^!aYvToMPjPAb5w%uJUSjF?IU`cZyaC#Q(Q$ME}p?oW+{yy4wxw8T*^=e z##Go6=2|c3$+`AYnK>h-Db5okE205MeWE~_61rhbe6a!r6XO^+1v?^H`O+H4 *si|@e`_|v%U|= zk4m*H!L4HMhJ{sJ7f5lXB#=rs)VS$qu}nx~4A8{4J9?}wC*`h*&0>|JQF9jYUGj`K zGzJy6G(pTea86oKRx=ejVjSLz^n5+Mh7eNgyi?C)hy~lA!VQd4p4g|O!d2a4M+nD~ z+8eaaGs+$!^*Z19WI$dvc%k%$o143H$9!mHcf{D~+f8i_O;Mfg2Oa>8Pzw?A5!7C- zI_#@xy&b(<$4{VBOnXnBbKnKHe(prNj t2PQ?> CU$3j zJT$eX8UWzP!>iFJ5&wwX 1T20ptt8D zUwdh#7T$cHRflS{OZoOpDv%?8y<$|!h?{h~62VQNz;;d^yJ45w#SZSrCa8cVqGaHx zdQ!uFyS-645hk~i9>yr`nbxX2N2uw4`pEU5dx;d+%FlNuAt=%%-;;Xa|L&m{?8)Jh zt4aVtaFI}swR(M{XbPtr^Y)+#ax)gX5gq;%YLeilyXB?}?ZP$QZa^_WWr!oR(E9LY z0~)vK2FgRSAp9am@=s%wl|G3)viN$P6v~qKyF8?qZGYh&9+GP4Z|X5C6&a+CPU)f~ zV`4}_#orHcC-4eem +PlZ;%DgG*_fZNV&gNnyOxgfDaTF>oK94=K*qOy% zN~zn36=B}|uA;4?72!9+pj3 ^+{zeeqN0(C-Kg~8sg@&_2glpBG z{}>ECETG~D)k*q|NDdFE 89R@-pyppyMjPCHv{NBnoFu+q~oAl5QW8brOzh)>Z2qiTp zLROd}xf@B-?TgwWz`ZOCAcu*JcdJR#7{7}RO;Z C(^soQhb{A?)^Bl|0*pgpy5Va>wDYx@8KE}J_e?LiS_>+SE=3)H0D3t5-*~N zz4LN7O`oJt>XqpcB1Dg?zW^(7EnMEy91cWW#)kIm*->4!Oeuc{|0SiM2K5U=GQ0n` z5`P3BjzQ#A(=MnpZUaix3sVU$HAuA@c33=3O@{j$P-7>Bwj9OHk#ncET~85``Q9X} zALCkP;#V#c@X~ Pv*Y_LujV;08Q&P9nuy48?|Dcvp(Ri^+l0OI%g0SvB3gAzz&6Ko7#`?-0-( zWL_i```w)FT=i(R<;cCxn=PksFwL8jZCVbRNnQTpLe6R1I)%K&2x$Vv|3Fl+b*y5q z0`E62@_U;h-F(21YqCe5imM&@L0@D|w@n`E`3fH@HPcsRiveghn?VGkYFecpylv|# z;(tb0PO;eGXGLc{g{SrmkQs8F$U>V{!>3iU7SB=D({BgY!ebYvC*!fjk&8z;uyuFP z2^G88)lB8cfZ@xvs>z-c$GX4;`%OcdE;VpVmQ?G9=9v(_0P@zN)tD4{igX%HR4ck! zU_h=;3yl#IeFSiIL$_kNn)i|Rz=<@|;uOZ&G+n}%{s|B6sj&3y7vSB1%x8e8-#@Q`{-?ZFO{@+0Jx-osNQ%`R|Ox4458 zwMNyW4@s@~6^6G5&sAjmy{!XfJaF8aKHZ<2^Fg{xfRD4pF}J29WL*}*)6gelOmSd_ zJ>3JTin98J*As(7jl=!i-NcfNkT&@9VqSs-Rx-o_R^jltx+=llukrJZlhZ=&2s+M! zLgLpUTQTMKHfKoz$v&e}s#D5pqBawT%mhb$9Z#}$cUM-QU31ybMi_o42^pU^@yDc8RQ%0~A6Q4z zfm?CT*!0^Ru7V*6QHZuFdo1lL%>7zS!A44GI n06xybFaVXd)qm3k9l=72gE+<} z;4D=ClVuLKM*V+M@In^;;;Mlhcp$PkS%Oa{a4wMGryUcLH&nYY^&l1(=Q(|2&NXxn z?6lz3k Xgp=VG`mx@r4ett}`MSpO=7f40_GsYFGY7bKR~ zXivYTPl{+SN%g(}c0Lit$pkHVh88*d_MuCr+wEh%gl6B^Ts It1l!uHm7DN|@DASOpT!x#;fM z+qWTjrlQhuGbt_9LvP*sFu`r2dL8lRbvkemVZ(|Hs}CHK{?%B&!^C0pQQ)_V10io| zDEV~vIHH&%US8JRwArkgx(l@`w;OMrDL;gt!}gNR`H#Ure67^S_P3s6O(ZV$h~YID zOX^TmZ0i(9FIQK5(I=B)e ICL$GPg0 z81>cljkI5n4Ik}5H;pU}Phhm)H3=;(iSo8-KB)jr7K^o@u@}s{3wL&fUpa#pSfhk7 z=JG?gkgT!04mpro-rZznI}4e`sD``s$$($^d<|-vyII-QHZp$wTPm|KC0yzsMg~Vi zI#uxp>Xan<-^s31o@v(5Yq)(j#5^O{8hhSl*F9^3xEltZ>@SD5za_za_q|~4HxyBg zhPby+2>j}>nS&Ih-J{!-vc3K4We)q31SIYKy~08tIaQ`SSF!>lfj9)FRE_364`GdB zwF(f=P94m6MM2f0NaOcTS4z|z4&!|Z*&ZV=IF;!c1Y=w1d@^u_`xv9Na>^E7!wXy1 zA ?mt4{)wCAfY?E>y)tXv$QBGCdKePZ5Na zuRuA}uuH$!P4egt^X`K82unuN|0?V&L&>)|nFb$$vWc#ws5sj4R!lIq*T)_xjZ)2A z9sL%MNU})gYoj{E2~5B=34sFt*iZbe@@8+fxjX!TB#{vzUbqJwvlU&`z2>f49QPeN z@lh;j#J|D}=@cs0)@yg@28V;>zS#CEKZC`d6gBz)l{_u$U{fQVd#6!v(=)3f_)Jf* zgNB;R@q5G9k5Z;MZ<)N)Khy fa&cKi>YAUi;?<$W$r%kEtn5TzNAmM1yWGw_b8j$Q1EF zKqK&z`Kb}AmAF+A&^J2^hBk&SakowubUMX;=r~BGCqW}Uc3?KZ3PLVm)8ns=IpDY5 z-1eoZDQ?&RQP?v`aj=pmZEZ?0K3nPLrIQ44*8<{9AKLgTk5K<>GzXm*brQKs?d&V9 zm+Ue 1O4;)K0Djw=^a2Z+lPh{V9bbq$yfSe)aeG%@ibS~Fy?m($=o VUx(VY#T92ATP(EQRdGl(x)UWk7eYrKRT{( ziFz;eI^|Fo@&Vcv&0BM%pAf9l7@WynMSSyy@GY~{?-SByO?-p}+QcRA(ak-R`P3{K z3fH^oO}utZe|2sx&rrT 2H=Ku5!opH?%a@;@ zZN}kuAj+XwA=I1_W`m85ojLrSC?lU+3{{ HTgqK3;S`7!*ea{w!hvdN5DiFnx+SIx->~292 {W7GGB7tLI(Rb{6Ctl(?)&!(Q|E3d) z$@4U57=?V(lP5D%r2l52J2baR^2BZ(7^@T#Tfm>OOF&u-)UIQfC_F_zPDFy0s&Ali zm#up^Z8@^LJy0f{2d?cEc#HKxm3~{!Ly&w$@4xb%cDA$E|I%ng0W>b~bz!* n z+Ie97PSdJs%^GMFLRd2Xdc4wJ)d%Za+Mz@y`q5c8nvig|G-Pi7&T0^mpf!k!JR3ph zI`z6dvO>Aj2lvOZ2krFm26$+i7Iix)F9(RuT}%wx%9_D7)^EHZ1$8N=>;lF;0KUK5 zv+rUy*J>u6vt;;buvt7yWEwWa#i2RY^x5NHl#%8~yQcUDac>wi3A8>(e8(yC&{s;1 z!`-rlgP!03^koQJsNvAJ+S;>Xo1 z+ZruFxYsGr77OpDH&Hns*CTa5zmQ!KRQsI%nU#vXq93*9PggeyQ5sHgW4hEkjZ%1? zOcmm!V9+fG!H*%aQk@dyY6LgAVeLLKN>IutFH16Uwt^RzI} F3)vk!zc-6_tLMCT#sb&?t1?f+!~n1RFiwNlZ5M){P`2J9Fv z*q4gF_-t#jj#T}T0(NiJmDql1OpUj|7ckerlh(X9k0xjZ(N9ALnXE_7WZ95Gdq2y+ zMbUptywZtwBJY~qY2bBkm<*jplvRD*isi)&ZeuWa->sXB0s^y=+;KTB)B}>gZ$1q( z(Vz0X<6>qf^d@+R(tbg3@|sY#;yH0(mr2@(c~W)`Qp@@%a^Exf)>H{B(i{NOS8aMR zG#n8|ywIcJ14OY^@5D9&Hmc)W+foHb156|11ridPg{s=tdceMtMmI{qmvaHkZrmEt zsTz{Qa{v7~{0Vjj#nlu? zVC{RA_dy)e##=-Ek-FF7G2fI7wBgK)RAU;Iiy8?3S%?q_pLiuL>yb=~OE;cRY*B$S zd{n+o%F`LduiDEI^rM`B0f0dGc!Fn{7Ctv ZdfXZwhIbV!r1TIJVQ z@pLQ=KFh*tY{+9%5_&(J;XXRQ;Gds Xpk3NzFsb^{qwTbgn>a??dsr0Wyxd_c@Y=Eo)FqK4&>h=Kf^#7VO+ ztw!Bs;2rUuFbU9#FhqGb=$j0DMwYmlg^#pgFqO_XoAjg>fbAH;&@2Bd1F#REW(Qb? z#li4C_ zYR1(+*Y-EUEl Qm*M7G#ENnx}b_<;#k&_{|tkG2oo-#$<#4CHs9*#3+*tidZ}rXpbr zZmo8=M78|PFpVwvEUr>?M!ssn*{ZMb9VZ(*u6}5N#PTO)^4eCF8FzS=_AF9_EOB(p z*KhQtZ8ALyE*xpesKrSG*CP(tWbjsAnxgsj@b69JZK4o+RC=s%#4OHI8_$&`L((>w z<5D~4JFb=0%+nA-PtVowSTJuwWNcJCgE1^>;EYWo-zA{mF$u%)JEAPYKO^61@i~8a zKj_}T%!SX0 c(d6*~83#Y=6B?WL?$igfCHAAj9N!L%+Qi(~VrM;3uD<6L? qyYTwdX5|>(5$9`Sgq1b * `NGU*Jxpclf_6=#A#pNY66!?Q!#_@eJO#BLw0Pw1Ngi9TJV%h6w2Dx zn#Y%r)YfYcbzWe|!^PFCz{A&6l+9NviUI70e1!BqR42^(;58R|oOR4@3v)y}bo{Rb zIYHZc#M}4{YIj1=&4FiT1zo`S&@I!myTeki0XuFDY&zw5>Px`ipk2SeSzUd)p(YD0 zZJl(tQWnqEk&!0ZhcR=bDgS9+aeNi}xn$B&bom|Ut{~0v>k)&+wAwxMvgzvlLKA^l z`5pwE`s05|=4$aG|2g6((n9>Of61l^AKi|@?_J-7jswkfZo!>J^p6cWNK@mySJo5e zGV96-I@<)n9C&d_vHsPyjbd#x_d~8mY)&IPE1)$`qzMCmT8UxS+CN*X3+6vfq)I9O zwCl=;t7&diD(iW$S@l8Raq1^dG@6yaF4?G@#Pz85xN6S%Qp?C|mx~@35s~g*ahGnU zoV`bc#^cVaNcY!#AWaz|o)V@xgbcnS5Rl>9F-CepK`-0oufEy5=2*P8ziuR)8JdDp z<{|~@<-4SVLuVSE`d*=$ke`s7>VF-!qdNKKL+QXelI4k&?-?>W$*anMU6Wh#$25FZ z+>I ;66jN8;tBo>w0%1A+`2B*yHA&3k}m^SU0{MgFS48yxJ#qx=0(;p84gIua1+ z$PxHBlngMBprgkD0NxO1IQa%N9PPi5=>J0u`(Z!}8!meN?yHUkhY(*Ff~KbX5Ysqc z?Qc*)jcC;e 8>l8oRx`XslfO+l} f4lY_)u-GPo6;6Rfe5L(L4r7+RP6e< zxuMkHA3qdbZXPl`zGy53ylsZp{G9pSJEsqyXd(Uq-Dnk{VO^}*g$f+DZeSZsHrY8Y zBTSJ)upQcP`$SNGDwrUeQN!9^d`Q &@^>6(#6`CVx*Bl%F# za^ufhM*bag)VMTIv(O|t$l1}f81c9%Oc?r3rjYjLf_GWExiWnwNK6YpA$=VS!>ty4 zSzZxEF(Gf< Kr>sJFHZgN3(`b^MTKXP|UxcS0+$K}Iuo>Gg&)`G^%Ibgn(Z$R> zdFJIK7+X{xT*NdoMN}`G*hvfv@eyIOaIbz**tPSnwZzxHlLrbMHYD$ENib%!LiVsl zoQSZ?{^JFisdx__#~07o_T0;@EE;3>o(^+?AEmH+ityLB{4hj~E9GtPfA2SMTy?NO zqSM8TW#FYSsYsH{kML!4%pYt># ZzLZ0bFFbGlM*i?x1m?91Ti&Bu1z*u>J0^ zqvs8Ft0IQYqLpWTL7SWSY&8JP6G4aMf6as*Fq1!@y#}h4d;hMh9Ul_g*p{rmeo*30 zj3B_{#(kj_A(bozeL)ZzrT#->xOhs+`BPyOL BqOV)&_VU^gqieoz8_ULz7KegdLrL0-n z&Wp#;HUyt9&BU;*oz1clX}^f(*Nv6_ {@K!f}+8rRMI|vxvH~$XMMs+hrR> zIXWGFzO*QuH$7d=LY)s0S0w7!DjojS-!SiVS^}RrY+j1eS-=I~oN;Xn-z~ID!`E%! zDv2@_iCr-nR2lI&M!j)#X(Gx+><@m!ZZa`!!Y>zbjqoi=Lb`38PK_p-TI7_Xv%W!kZw=L{eT8v2lZZz7THqsik?sM83#?)UfT+{|;yObPyQjP3=7IbK;P=U4 zQ~!MV<9~Yn>I|84qW}tYXn28-+kA1@1c1^5WN}GipabEonXgTXa3d%Cwl#!XmJNkT zss8f|i=H9IKVJekk#D9yT`ux>BuhnGz*9WN;m#GMzEvm=tAeK4g$1^fM@qDLV$Fx~ z?&pk|2MV~Ekp)}%qfuJDP`3S$g0 ko9>vzdA|L2#>?qVHsO%k6W3n^&Zw0cuK!o{b-PqAM zxs@*>9iO@jwKTnLfQ6e4aplu44o}{R=A(iDPSzJ-1M>0en|-4s#2#Z|CGXgiv}EGo z)w0HP%fmcBMbH~g;F+Yzi0yaAPL?x-u!<;=C;gW)jzzDCC{(xux1x!qiUG`GeRFsc z@sPcbW*6&*uECL_%?Mu9)ORSG(xq gwU(ZW| IrpC}6M6vWgJS|~CT;S9c_FprJVVq>Ll5=f=v!He1*bV%6+Hcvt!Z|G^b|Q(4 z 5nJ zeOeK(E4Ugs9lT;r`{DK)$KX8*9xh9objN1(M;%dz-`eoAFNR{r_n~P?%So7hNj1?e zs3fqK9Gk3l`~@RCED8kwHT>f7WnKs`p%{o-0#be@$2A->l?L9w`po7!bsnOVie-c? z^Hc2$r%Z8mRl(ZB&}M$?V#mPc$2UY>S_X8jK=6<2X^jPy5A&w@ 7wG;md zZvPjrr}&{d3t#ZuQNF%s Go!XkrB z!gxg{3A=>5Bc=#`7e*di?`R__ z^ayBiM?`3cD_GAd^X&URIf-D?5DqC;qMFmqPV^%@173eIf#V4_ZzBkj-m{b;X!IQF z;F-YXbqX~+9Hg8)t?Y8E=GUhi4>qA9nKiZL#ujEqtF_;;vuquLFrEYY2#Jg^wJ&mc z1$@&YK58R&DugFO!?QTlZ#F}MPzbUvmPWX6=K5)6h|$gREsKUrs7@+cQe-XKSv-AR zPJ9-piSc6US;4T5?i5%3O0t5gyd!-0LJK`H5*!ovt6 Zy_QGtRLESW}4YJo(;5xR9XY{RwX)1+t2{*&2R*w9$LtvA7P$GGBJ*?bHV z2abt>7MNf683(