From 13fc8001fcd3787eee6fa27e4b37d865136afbdc Mon Sep 17 00:00:00 2001 From: Kingshuk-Microsoft Date: Thu, 13 Nov 2025 19:29:01 +0530 Subject: [PATCH 1/5] Refactor code structure for improved readability and maintainability --- docs/DeploymentGuide.md | 180 ++++++++++++++++++++------ docs/images/macae-non-waf.png | Bin 0 -> 43762 bytes docs/images/macae-post-deployment.png | Bin 0 -> 22326 bytes docs/images/macae-waf.png | Bin 0 -> 64603 bytes 4 files changed, 137 insertions(+), 43 deletions(-) create mode 100644 docs/images/macae-non-waf.png create mode 100644 docs/images/macae-post-deployment.png create mode 100644 docs/images/macae-waf.png diff --git a/docs/DeploymentGuide.md b/docs/DeploymentGuide.md index 66f81675a..7638ab916 100644 --- a/docs/DeploymentGuide.md +++ b/docs/DeploymentGuide.md @@ -53,43 +53,6 @@ Upgrade commands by OS: ## Deployment Options & Steps -### Sandbox or WAF Aligned Deployment Options - -The [`infra`](../infra) folder of the Multi Agent Solution Accelerator contains the [`main.bicep`](../infra/main.bicep) Bicep script, which defines all Azure infrastructure components for this solution. - -By default, the `azd up` command uses the [`main.parameters.json`](../infra/main.parameters.json) file to deploy the solution. This file is pre-configured for a **sandbox environment** — ideal for development and proof-of-concept scenarios, with minimal security and cost controls for rapid iteration. - -For **production deployments**, the repository also provides [`main.waf.parameters.json`](../infra/main.waf.parameters.json), which applies a [Well-Architected Framework (WAF) aligned](https://learn.microsoft.com/en-us/azure/well-architected/) configuration. This option enables additional Azure best practices for reliability, security, cost optimization, operational excellence, and performance efficiency, such as: - - **Prerequisite** — Enable the Microsoft.Compute/EncryptionAtHost feature for every subscription (and region, if required) where you plan to deploy VMs or VM scale sets with `encryptionAtHost: true`. Repeat the registration steps below for each target subscription (and for each region when applicable). This step is required for **WAF-aligned** (production) deployments. - - Steps to enable the feature: - 1. Set the target subscription: - Run: az account set --subscription "<YourSubscriptionId>" - 2. Register the feature (one time per subscription): - Run: az feature register --name EncryptionAtHost --namespace Microsoft.Compute - 3. Wait until registration completes and shows "Registered": - Run: az feature show --name EncryptionAtHost --namespace Microsoft.Compute --query properties.state -o tsv - 4. Refresh the provider (if required): - Run: az provider register --namespace Microsoft.Compute - 5. Re-run the deployment after registration is complete. - - Note: Feature registration can take several minutes. Ensure the feature is registered before attempting deployments that require encryptionAtHost. - - Reference: Azure Host Encryption — https://learn.microsoft.com/azure/virtual-machines/disks-enable-host-based-encryption-portal?tabs=azure-cli - - - Enhanced network security (e.g., Network protection with private endpoints) - - Stricter access controls and managed identities - - Logging, monitoring, and diagnostics enabled by default - - Resource tagging and cost management recommendations - -**How to choose your deployment configuration:** - -* Use the default `main.parameters.json` file for a **sandbox/dev environment** -* For a **WAF-aligned, production-ready deployment**, copy the contents of `main.waf.parameters.json` into `main.parameters.json` before running `azd up` - ---- - ### VM Credentials Configuration By default, the solution sets the VM administrator username and password from environment variables. @@ -215,6 +178,81 @@ To adjust quota settings, follow these [steps](./AzureGPTQuotaSettings.md). +### Sandbox or WAF Aligned Deployment Options + +The [`infra`](../infra) folder of the Multi Agent Solution Accelerator contains the [`main.bicep`](../infra/main.bicep) Bicep script, which defines all Azure infrastructure components for this solution. + +By default, the `azd up` command uses the [`main.parameters.json`](../infra/main.parameters.json) file to deploy the solution. This file is pre-configured for a **sandbox environment** — ideal for development and proof-of-concept scenarios, with minimal security and cost controls for rapid iteration. + +For **production deployments**, the repository also provides [`main.waf.parameters.json`](../infra/main.waf.parameters.json), which applies a [Well-Architected Framework (WAF) aligned](https://learn.microsoft.com/en-us/azure/well-architected/) configuration. This option enables additional Azure best practices for reliability, security, cost optimization, operational excellence, and performance efficiency, such as: + + **Prerequisite** — Enable the Microsoft.Compute/EncryptionAtHost feature for every subscription (and region, if required) where you plan to deploy VMs or VM scale sets with `encryptionAtHost: true`. Repeat the registration steps below for each target subscription (and for each region when applicable). This step is required for **WAF-aligned** (production) deployments. + + Steps to enable the feature: + 1. Set the target subscription: + Run: az account set --subscription "<YourSubscriptionId>" + 2. Register the feature (one time per subscription): + Run: az feature register --name EncryptionAtHost --namespace Microsoft.Compute + 3. Wait until registration completes and shows "Registered": + Run: az feature show --name EncryptionAtHost --namespace Microsoft.Compute --query properties.state -o tsv + 4. Refresh the provider (if required): + Run: az provider register --namespace Microsoft.Compute + 5. Re-run the deployment after registration is complete. + + Note: Feature registration can take several minutes. Ensure the feature is registered before attempting deployments that require encryptionAtHost. + + Reference: Azure Host Encryption — https://learn.microsoft.com/azure/virtual-machines/disks-enable-host-based-encryption-portal?tabs=azure-cli + + - Enhanced network security (e.g., Network protection with private endpoints) + - Stricter access controls and managed identities + - Logging, monitoring, and diagnostics enabled by default + - Resource tagging and cost management recommendations + +**How to choose your deployment configuration:** + +* Use the default `main.parameters.json` file for a **sandbox/dev environment** +* For a **WAF-aligned, production-ready deployment**, copy the contents of `main.waf.parameters.json` into `main.parameters.json` before running `azd up` + +--- + +### 🔒 Security Considerations for Cosmos DB + +This solution deploys Cosmos DB with security controls aligned to the **Azure Well-Architected Framework**. Access is **never public by default** — all access is explicitly controlled via **managed identities**, **role-based access control (RBAC)**, and **private networking**. + +#### 📌 Intended Access Level +- **Public network access**: **Disabled** (when `enablePrivateNetworking = true`, which is the default for WAF-aligned deployments). +- **Private access**: Enabled via **Private Endpoints** integrated with your virtual network. +- **No public write or read access** is allowed from the internet. + +> 💡 In sandbox mode (`main.parameters.json`), public access may be enabled for rapid testing. **Do not use sandbox settings in production.** + +#### ✅ Allowed Operations +| Operation | Allowed? | Details | +|------------------|----------|--------| +| Read (data) | ✅ Yes | Via assigned managed identity with **Cosmos DB Built-in Data Reader** or **Contributor** role | +| Write (data) | ✅ Yes | Via assigned managed identity with **Cosmos DB Built-in Data Contributor** role | +| Control-plane ops (create/delete DB) | ❌ No (for apps) | Only deployment principal (user or service principal running `azd up`) has control-plane access | + +#### 👥 Authorized Principals & Network Paths +- **Identity-based access**: + - The **application’s user-assigned managed identity** is granted fine-grained data-plane roles: + - `Cosmos DB Built-in Data Contributor` (for read + write) + - *Or* `Cosmos DB Built-in Data Reader` (if read-only) + - **No shared keys or connection strings** are used — all access uses **Azure AD authentication** (token-based). +- **Network-based access**: + - Traffic flows exclusively over **private endpoints** within your virtual network. + - **No public IPs** or internet-facing endpoints are exposed for Cosmos DB. + - Network Security Groups (NSGs) and Azure Firewall rules (if configured) further restrict lateral movement. + +#### ⚠️ Important Notes +- If you **disable private networking** (`enablePrivateNetworking = false`), the Cosmos DB account will allow public access — **not recommended for production**. +- Always review and **remove unnecessary role assignments** post-deployment. +- Audit access using **Azure Activity Logs** and **Cosmos DB diagnostic logs** (enabled by default in WAF mode). + +For more details, see: +- [Azure Cosmos DB Role-Based Access Control](https://learn.microsoft.com/en-us/azure/cosmos-db/how-to-setup-rbac) +- [Secure access to Cosmos DB using Private Endpoints](https://learn.microsoft.com/en-us/azure/cosmos-db/how-to-configure-private-endpoints) + ### Deploying with AZD Once you've opened the project in [Codespaces](#github-codespaces), [Dev Containers](#vs-code-dev-containers), or [locally](#local-environment), you can deploy it to Azure by following these steps: @@ -244,7 +282,37 @@ Once you've opened the project in [Codespaces](#github-codespaces), [Dev Contain - This deployment will take _4-6 minutes_ to provision the resources in your account and set up the solution with sample data. - If you encounter an error or timeout during deployment, changing the location may help, as there could be availability constraints for the resources. -5. After deployment completes, you can upload Team Configurations using command printed in the terminal. The command will look like one of the following. Run the appropriate command for your shell from the project root: +### ✅ Confirm Your Deployment Environment + +After running `azd up`, verify that your environment matches your intended configuration: + +- **Sandbox**: + - Uses `main.parameters.json` + - Public endpoints may be enabled (e.g., Cosmos DB, Key Vault) + - Minimal security controls for rapid iteration + + ![Image showing the resources created in Sandbox deployment](../docs/images/macae-non-waf.png) + +- **WAF-Aligned**: + - Uses `main.waf.parameters.json` (copied into `main.parameters.json` before deployment) + - All resources deployed with **private endpoints**, **managed identities**, and **RBAC** + - Public network access is **disabled** for sensitive services (Cosmos DB, Key Vault, etc.) + + ![Image showing the resources created in WAF deployment](../docs/images/macae-waf.png) + +Check your active environment settings: + ```powershell + azd env get-values + ``` + +Check all resources in your environment's resource group + ```powershell + az resource list --resource-group --output table + ``` + +### Post Deployment Steps + +1. After deployment completes, you can upload Team Configurations using command printed in the terminal. The command will look like one of the following. Run the appropriate command for your shell from the project root: - **For Bash (Linux/macOS/WSL):** ```bash @@ -256,7 +324,7 @@ Once you've opened the project in [Codespaces](#github-codespaces), [Dev Contain infra\scripts\Upload-Team-Config.ps1 ``` -6. After deployment completes, you can index Sample Data into Search Service using command printed in the terminal. The command will look like one of the following. Run the appropriate command for your shell from the project root: +2. After deployment completes, you can index Sample Data into Search Service using command printed in the terminal. The command will look like one of the following. Run the appropriate command for your shell from the project root: - **For Bash (Linux/macOS/WSL):** ```bash @@ -268,7 +336,7 @@ Once you've opened the project in [Codespaces](#github-codespaces), [Dev Contain infra\scripts\Process-Sample-Data.ps1 ``` -7. To upload team configurations and index sample data in one step. Run the appropriate command for your shell from the project root: +--> **To upload team configurations and index sample data in one step**, run the appropriate command for your shell from the project root: - **For Bash (Linux/macOS/WSL):** ```bash @@ -280,11 +348,37 @@ Once you've opened the project in [Codespaces](#github-codespaces), [Dev Contain infra\scripts\Team-Config-And-Data.ps1 ``` -8. Once the deployment has completed successfully, open the [Azure Portal](https://portal.azure.com/), go to the deployed resource group, find the App Service, and get the app URL from `Default domain`. +> 💡 **Please refer:** + + ![Image showing the post deployment scripts](../docs/images/macae-post-deployment.png) + +3. Once the deployment has completed successfully, open the [Azure Portal](https://portal.azure.com/), go to the deployed resource group, find the App Service, and get the app URL from `Default domain`. + +4. When Deployment is complete, follow steps in [Set Up Authentication in Azure App Service](../docs/azure_app_service_auth_setup.md) to add app authentication to your web app running on Azure App Service + +5. If you are done trying out the application, you can delete the resources by running `azd down`. -9. When Deployment is complete, follow steps in [Set Up Authentication in Azure App Service](../docs/azure_app_service_auth_setup.md) to add app authentication to your web app running on Azure App Service +### 🔁 Safe Redeployment or Environment Update Workflow + + > [!IMPORTANT] + > **Never run `azd init` again after your initial setup.** Doing so can overwrite your configuration and break your deployment. + + For subsequent deployments or environment changes, use one of the following safe approaches: + + #### Option 1: Create a New Environment (Recommended for Clean Redeployments) + + Create a fresh deployment environment with its own settings and resource group: + ```bash + azd env new + ``` + + #### Option 2: Update Your Current Environment Settings + + To modify settings (e.g., Azure region, resource suffix), edit the environment file directly: + ```bash + azd env set AZURE_LOCATION + ``` -10. If you are done trying out the application, you can delete the resources by running `azd down`. ### 🛠️ Troubleshooting If you encounter any issues during the deployment process, please refer [troubleshooting](../docs/TroubleShootingSteps.md) document for detailed steps and solutions. diff --git a/docs/images/macae-non-waf.png b/docs/images/macae-non-waf.png new file mode 100644 index 0000000000000000000000000000000000000000..295a9e7ce3f423bc12f1b2280da64e4e8794e8d8 GIT binary patch literal 43762 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 V3nAw(t?mE-002ovPDHLkV1hvlptt}4 literal 0 HcmV?d00001 diff --git a/docs/images/macae-post-deployment.png b/docs/images/macae-post-deployment.png new file mode 100644 index 0000000000000000000000000000000000000000..624f4f91166be535c74b7ca22f1e6bd1bd64f59e GIT binary patch literal 22326 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 literal 0 HcmV?d00001 diff --git a/docs/images/macae-waf.png b/docs/images/macae-waf.png new file mode 100644 index 0000000000000000000000000000000000000000..ce037e1c6d4c541bc2f5bd9c2601b7513557e053 GIT binary patch literal 64603 zcmcG$1yq!6zwbYEm(oasq=b?R34 z7jHy>f8gvCC0>Jyho0;JHxP|QWPm%%A~5dskbv80){^RWAkZUw*k8CsBT8ow==SKX zn23_I_OBEf6Ajgyhvv@))d@YaN>5yn6NJTrH4TmJ>f;Fylu~O3Sh>7baQ#SLBC}6~ zi^nTBR8+?dRVh^ z{&~kfG>@@*O=rE?Pq`yqSlhM|m!z7OcZaaGL5Z%>+4J z?xto}Xy5eN-6yVjt}WsE8Px-=kTXZ{mg$$K0l50@>l?D<>!>G!_bY^_E)gr;xc;E@ zUn16FIoTEp@kwHIk3{HHzl(oad91$v1I@n5C@fQ$VRN{CJ$G8iS8l*t6ani4l|Dmt zRx+&z9XU$c8Mc28M_7hz9#(h+Jd0`8IPixh_ez2@npOXLrU&Xv@$cCyXK+(;p z((!yOdd!^Kt0F{vC)u8rKtY1Ml3bb4@zZ>lRA+61jzx`^X;<1Ei#d(kHzH|B zUG}$SPWu9~9!{!44rZPNT3f}-;$n8$=5=dy5FMkTF`7WMJ2hO!h1PjjlGNpyNF|OJ zyfnd2)Xho#Y~nxb`6BoSd{i>UTNZ{Eqpkc{5mG`diXi~;SQb3XA-l>`lUNFf_~>#a zr;WNJUMLhRSF2Ao&}yYG9*Dp%v;9NwOc`-nWh;D+CHD-=KtN2IIPCJ<1;J7eeS>RV zAkJw;OZ@cslM5$A_alhlB0s|RP zJGZ4zWIHQ9j;MDl&X$|jGL=P}x|O4)s=1!JoG?wa>rJKMWSRFw`s$6k!>h|Yn3QDh zK_*ptqSgAcAO=h^0f`ip7H-#KvFmu!Ow+_0Of-|q9-m$A!@DCaDO0pn8w#K=ND=bf zY1Ql1E=#o8DC*vjj(&I;wSC{=5`{Z%{Ft-$Nx|`?^1|d5<4($;4pnRjjl4FGwH4J& zuMc%U^oMV;n-Ik5;he#q1nN3kYwjH~*?BRKAk;Jx)aP;fDqHH7E;T*T&~T;^^4qi3yoZgaxT8KqSL@e#kA zSnFOV_X@Qy$`qa4nw^kp-wUtj93HGrW@WS-49l&3d`L`&o-O=9$yz3*z8O?jhQQk? zTmR^57mQ6rLVpRhOa3b@`HIo+4-#P?lhsf zaw$$76O@rgKaB45;waDHCN1!vgi(U1a0%`kXoJOU8BsD^H{K}0XVpoy?`1)Ek3-k{ zj;vouT|2HBk9+ODj64$(!x3xcZfo+IYXX0|8GieqvATj=NFRw$dStEO9QT$SfwtUn zcIrwkyBg9=_fX*T+}7y+BLm91Bgr`>)sWZY>=gIj$S+U&OoY|qX&vk&x63JK9Q4cS zV^?mbhAYyxhuo}H{legPF=L))iK-=a#4dI)n?j$li);OJKbG6L7`*I4- z*fM2LY*Pf_V%^u94Rg1!ZQhryiExg+^G;I+`D@-M!IDPO3(WEb(f&#xr6BMEN!WV)LxYOvubt5?r_S^23}+2EDuqg`>iq+D(g z%}{(s$s)|JHYj{nkq(0^;z{$?<4}nI@q2V>F(3R`q9NPTsdnhAAyo zUUSW0-D$7VLof3lX$nvpwJwt=QrQ1)PPF(2 zzGF$lOyMCDy%g>(H=jC$oSBg;#=Bf$4uvNgnKZkP@ch3vX%2%5}qPQ|WNZo691U#Qv9qNuIbEX8{pM$ipLz-(w&% zqjj(2Z8vBe-mqU-=4+9+Ig9H!$z!^#h!D&rQr^H<6?k{QqI&>aE1#?1n+caq&Ags} zLRu+v{m#b_``m6Jkyvqe`0I}+x!kj{_?xi`u>>dzk%}zOEky7s9d1p~?Y>E(gLut9 z*_0asD^GVQ^${@!Jk}DbJ}9t3A2Ry|BAJOiiK=TERZfb`XH8KA&oF9sPtZAQcK7Kf zg3=#{Liwl5`l$lq_8vC+9Mr+qOMai%mYzd+w^`+OiQgg&M>l2B6592&MWn?y;kzkA zweYQe&R6wEm^#VV9hf!w0lrI54OIhPhDh(%@@(g2UQx!B*V&MDx>B;avzq2R+O`SD zzp$TnuBZ#nrr{8vRuAh=(C^pfOS9;lR*L*2ByxGjT*u~ryr*jH1NQu~$^Kw$xsT+X zgB)wXtGO~FfMUPkhWbfRLEVbr-LnZUb2;m%S?<>_lW$&BcNz^YQ|lg;e!JJ{9Ilgv zVBZn@Qna)WGUIfafJW4R4N$4Xd%G$-Dq7c;zw&c1<^4Pp9A1*9ff@Y{VL~NGlixe{ zJ!M-PkNQA+1htx0*X!P(NMaJopT@JjS3ebosH59QXIm2EPCEl3y`Q?rHko`(J%Z)gb(vZbItn;ly6LKN6LP%cQLY zy(*!Vc%9umZ*N9rE&YK7;A;pnXt3W3Gw&yr6x+S)9|s673`PF)QI=U{k`%pqq@y_u`L3$WT>~ment&ViU?J$T6i9>y)hMN??3irbHpd zspuMXy?3LwLut|UA>py4D^s`&@RuZk=SCHe-3snwiE`4se-)u^%GaA1y{GU@E%R8D=+&^cPcrp7j zBimPA$)xrLmk-shcovZ=d2cVY#Us&NYnqx1`;mt4egp6=KKnmeliQINSI5!Qb6&nv zdVbfN_Gg=?*#EF5r7<-Pg!r3J-|~%WCJ;7qUx^W37iy`^Ir-r`ax-yBD&uZIM(!t=OBoMj69Q#B0Y`)$z61J4lVmYk>6~%N998+_2>rg8 z>u7&6iq4RDi9|)${q>9tmfkT_Epm&WHQ_NKl$r1IM>;W)*MxVxSKaX3AQu^XC_aS5 zHxpVNee1s zH$UezQVKN>B7VvztfuxRh7b;W{V)+%i0nXAJPltKL{>dX?aX`hzU)gA2BkTBxh~9& z=%rVFa|-#(gsgdlm9*+MV9Yu>1iSled3pN2urUrf+$(`ndNwMxB_z=gx=ibZmRMhH zY>L}^-3!)DM~~YJ4W4mb480xGI?FA#`kr&V8>F#)bIN_4Sp19kii2H?ebedfjrrUN zyyJQp*)ui?YlCmtWz4-%xmqa!XX0hlRxMTxs(8}WlmQ3ti!$YE-Qj<#%Mu_- zyOHm+$q$KJ(~52ty}3>{(`hj-}6{dHZGq(26#4gcF(o|9_XL?cE-p3!I$A*-3 z$-oOY*7$c$O6*F52vy=+oeL@~{&$P=s%Q)YlyhK#a8Eg!qaivVaq)^!i+acqqIdY+ zk#nJ-*WCFWArjJ5AFBFIr>7jYc>U7(HV$cWBOGp4Ubg^L!ZwqEAVQioN_ODl0yQpu zNZDEMWcwghdR>RCWx#%p=5e|v;4?ld;ygq;h{xiSqKdr_&O4c^!xO{(%!s4CcOo88 zn12(USm2v9m{_Hw<(X632az+xJI|XV9A%W5+DFjOQ@55M+v;Hj@BYm&n#y(c0+<53^~0mL>C_SLi!l-3bWoJ;L3j>I1{2E+;KADn`Ez1r z>yK+l8EK6(;%EEvt|cyE_C{H}Yy3;&x|G;o#=|=O3?5bM0--))XB-)~-`Zo(_=E0i z)WxQkW~c_t6cU;O_yq+injK)~{?%if+)m&t2)iKUF2;Q$#SZ#3Ujk~}+8GBf6rO(dxbDyOml zCel5`b73tqeg&l0YpA)uj#vQwrt_|YRu!8{im4fq;`1l`9+GE;KQ`Uj18NZJep+58qmn zk{~YG-un>Ptv2HK#^Sxu`yF0$FGC&_YQ;azzbRV`!l0B+%umtm?~)Ur7!5sT?sU#W z#grq~@F&6Ss!#v#d4~z1mS?bY8BSon@I*Hh8H7mX!8G{-u>>X8tWt!)(Uy0HDWN0e zv3$v{EP7E9Ca?Yvqa$304Aus%36&Czp6cBDV8-WUhw`p z7smG*5#0hNYtDDz&Z}OEXH<%k-y9FwR3Q^4*Hv-Ax>*4zbay z#Gge+Pn2!7bCAXPR5yn4yE%Lv2QQyWB7DH}T9VZ1CCq{P(bmXBl&fNBSx>Xpt z&Q>0>g9-g5){>Y6-IaxW@!eOM;c-2Du}Z(y)Bn&$hF5sZLh6FbEX8 z?#&o}!JCdh#9-9oq6CS+0ZmWFjn?-?cQDL5atEZ>|XjP7{_XS>v^mF4&Lf7m8xG2w6BxqADRia;&hNj1$^H8E`b#9`IabH&&oYugpKGXe4mRztgY>lh6U6@$^*UAF;|;H-mF9zYxe zfr0))gu;Thez*4s-bD9iPK@@(NhQWSbgNRo~T-p zeMVtI;_EPYMxe~#F9BPyK6SVMFDgb0$LZ;LEC-B3M)L<+RcH^5K}b;S-d| z_yFnH{n5cChzC{I2W6-qEFeiXT)!~W_+pzUfxY=&(6Ey1n3AFb?kTp;J@867Ui$}n zw6*s_?SXKz*xOJ{xlYao^M<&>r?{f9MuFKO01iR#oebvQ>nmUMGu+e=12qRcazywO z?k+gSPiWzO9f7*97=YjKwFGMuU}+6-%)i78@kX*Aoj7Umy=X>S_v%2wK|U6+pd?ir zW^-+VA{#f+NyvHCbhhbRr~@zjz_1PNq#VqXd?BaS^Ewt&~HSqUGWMclo>R1*DlbRJ=*!c9J3Q+2D;6v zy3@uT?e35Y4UEGZz(mgy-chU9g_1Gl>IA~_B*QZ?&vD@s7dt5J^}82>ux&YL3Q_|c zCZRp*gWMG-jo=d5hX57E*JEV;g)5wdXK8g>ARcoQXJ7fSrVg5*xkM~n;f16ds`K<9O;Zc;!yrQ8rGXDD+TyYjfFZ+g4r zM?Qo*We03=?IJnI+piO8USg-}gmiimzLAmy9vVxEvl3+uaOd&yj~7Y`?%l|pliZT4 zURtQ3>XUsKEj|@;<`_zU(jPoLS=}u0lV#X_4gkZZ(Sbk6XaZJ`y7MV8+o|FRn z$5WgEHK{%HNPPF;G4u~qA@2A+;xvDS|6(pZtRiW1FpXd;tVUC%H7BWssm)M-DwK!KBnKloil5eab?)}_g;XuC&s5G zxG?2I)siJtEqkeufg}KB!9nfs8vpea$U%g0hTEr9T0rhK3H9E;C ztDDQPHemJdHo*UG9zW*o;a9s_`T+iSZ)k#Z@pU^_@!KVZZ>gRQJj)CN(KY&|X-8Ll z{(x|VbrQHwyXwVI2*Pb~uCp2V-7?@6J=b!3ni**Fnyl9ce)B0) zzyK3=U(hCtZ)(--Azh=)^%Nl4Wnu%pvoW*3&Q>hBLe+BEKdHhkQ8_F4Olx?#&=~~jg5a{ce|YfrBgNTqSYbn^DA+a zC&!=leih?B=wQlG9ZV5bANro&oVkozfC%@x;sU@@Pp)#}P!8^FZajXALvNsqTJYJ^KZGAUh@l8XQ z=i#}uFSHYRb+s0j_dj>Qf5=o+;kC?EJ8Tb#NHI(F_u(*Jmc?tk%B4JCeZ>D@LJ%q~ zKB0BBD)d1MaWsxT^o;NQClbuSXRyyH#PAfYZcBC4fjUg5`6b5Pu^pG!HQ3Ia9VEbA z`lNmZJ!q3ZZEsOjckgqbYk{s=`ge6V-)|Gecw;LQke`n{F-35eSBzp%thhjGA6R>R zD|V}Xwok}fiW-rB3?|HJmR8eKyOrIQ6QboGi2PcN5`2m0X!q~c9d1-8CA@&ft{$g%`vi>ZYBff1I3lQ5h7m%fQ`bRM_Nh(9GOX!=3)AJCUBw;#1(2UiAsFcw1UWqD0F5bKYpRXqxo7Yh3q89$dU zBNwe=`CU+){s$eXm9wK`f#n^=PN3mbzxVo!!ps-v@7IbSf}=9j@OyJCQuOtu3qt4S z*Zm0iEAOe2Fop`DHqAQ_rQeL#dn$E$N3U%9LOn^J4P=zuMj2jajZGce!MxH&!x(DXM0Lh*9_HmjGTc$x}?LkO9m0fXzJ{4 zPE|S-T{MeGK50_|AsP}*B)!eJTTCG}6+e^Ux-(fV)@mDNQAQRHO&W%EdL6Lwa+0zB zjAokrHZ+$81%a4Rg<0u8w9!{wt4$7*`kn0G#A#+tMC5DyGw~N5Gl$1NLNhe>V>I=B z5`P|nz}jEEN9K1?n*hcht7oH>zi|qlN2%?>`jo#(@<@HaHLlmQif13?%p)t$PsUZz zYsaP(4!Jm6~*kJrZc`AE0shu>3YBxYnEDoIyx82me2bt{`* z!_kCjmDfo@RiBWUdIGd9mB2Gqkw8kR^C!M9#s_oXo{l?z&Lno&r{a`P*6byjYB;=~ zw!EE_8Rlcf1RxSXnr3iOc)VWI$Ho4B4!8o@nwOxK-hji=Q+xRzUk5p1vU7~*y(<71 zt&t!7iRWciW60_M8PEGskKuI^t;T8#-X~jfCXf$;A>zZ+Md~3iDrr>cFA;A5UZ8y! zzb9_9LaBm?e%Bc)k@x<(Vta! zbAh^qiQhkN-yYYL`3kROpW*J`C8DodngXjG(rF2ore92#1#x#vZ6);(IbYX5OHNpV zKLM}$q4+tcR^eb38WRcXc=^51iOS3Y&+7|WCBZggVO=qz?>sz@Kz)1U??JFY{?k_5 zO+M3rOq6wD?ek~0k_cFcoKtT$u**FT5e~~AW+C7p1R+iYY^-=B!>Vr@ibJNNl$73M zuK)spBjjcFb1vD8lSf0vvM2M@sMCtUzWDd;(}k_}|MnUB`3K2tV3SBD}q2Ez^ly_dyY z(akh!Uh%AS*7LJ9yI_$jSPjdcE^Fszq z*Mz*qU5!ssg0nMFqvNpV$xt0_b$iMm3e)ydhqo3q4n^ZuN{E!vje=0M0x1dRRX50P z!fJTVQh7^fvHe@GeL`OPAiQ3)=~(O2`-HdHa*w{;JirBjgQIYrP7mKibhpqvX5%fv ziOt~fgF~qb#NSzbNZTx-zEJs6**3b((_2h8-panie~aQn;OoKQ@VI+(+naHx;W|}o z8R`S<)aCfQwAF6kBQCR<=wj;=CO%vO58prVj$~(a#oKf^E=0PG;p{g;!B0CBiPcqw zemo5T!m2p*a7Chr=NXaN_sXBtez@)@kV(;<-MVY#YAW|5@Di_FD9$85Y#@EIZl?TgE9o zz^&fBP?+tFquS|74@34x>eX2!N$>a6z2x+m1?jgIS>3S>-jCqDcvX2}LBaVD@Y{!LYr8fd}kH45YiDOM4O zLPCzkf9cGM4>w2mrE21i1c;<4*Svy;-*&o0)%!`D*lfT&tU}$|Zfmv{e#K`}3vtV! z0j%&x67w(Ix0Nm)0Sf-Acq}%b_znCliVIA{rnm)j2JAC0lOdK=&F6E<(_qEO%t6V; zXjquzPiO?Wkp^TG(c@^}X@@cH>4{4A8Dx<|E^daIc2BaQr`UOHU$>lC0L{-`^%wQS zbNb>pVwBJvtd>=s0$%Z{C#eKL8-sL1NT! zT8b@s4aI0h4;R;JRMPR2TQ%Jg9jqf=mo_;2a`SHOBe$MhkCMx}1;q&K@9S6V8T zr67@>Giw5(V9YOXKJZF(1zYNjhSw8U$hl=OAH4AfPhLyE*9Z$Mf=G0klMsn7rXUJ8nb+WyE*=? z{ara32V`iNgq2Zfvx~?JHyI*CD0|eB^dkY#r{g#1^Rv;2p}OT)C-)CJ;wI;l&m`8$ z7)Z@BJwuod_;H#CVI#a@XvKl{t_l}(f=kjmh?xHT(oPsZPAH4m^kF%@WHI*IyE5Q& zssaM(MCPbLhV4`x@#z2#&--20qwe9+yN!o|qDIisM2qdOK$a(oTi(TPI6g%T%zH(? zc>#$=`)IO?^=~AD-g_CjiHWoD1kcYG#xBPSakL1kai!u%O^N?D?66EZlK9e;(ESwrB+Hcmp48WseWH zBTk!C8bg+O2*wiCz7J)9w7e_z&pL03KXIO(ITr?K272a{kdxiu@Y`HaGyyN7l@7TE zxZuTDJx6XC%fsky#&I#;o1S7KKo@y@x9Gf_XtY=!qrc(O+oBe_+af&*8b03Bf!}^~ z*3|f@*gXKNHkgRFWO>j}IU~LpZQFA;w9!1I^ZI%;F+^ae}K7Eqt=0a=E;ZpWvY6M|;G~ zP^x|5om8e0Jup}O`9ph9&8ol@ta>_=u9)+ z2Q#g7M{(4(^97B>M*sS?g6%r|SSwUX&i&8fOQQmGE1wq-yma%zR^l%VReq7VhXQ zLW9}qZZ77stCPU{G)>Mg51JXjjvuU%N#_;zoH)qd${DT+F&~LGuZW93er1f(u{?Ez&QGC+2xR9)oxFA$jP4uI+bPg>d^T2Kl?=t=<6>GQam0tw9_(%a45IpAmE;A{hYmHbOLtzOR5Gc#?2xa&F zhOv~nwUcHr)+inz?V(PaK_f&6e|F80I5A>vXd*MG5NHp^$V(Av1&CLB2W-C?*tbh{1Nwl zHZwc%f6ptl@(uh~!wVu31WQIYb*G&c_kdMg@^Xj^1b)rM_igX(zXq=j!zK^>Y)b7v z*=PXnu#tSr?fBr|1`g&A;oJk-*?CKZ-(SP>d{)39iXr4b-bgn3=8C+g1@izKS-~_L zQ+{p@c0H->$vJS;{COenM)cK7IcjrY8Wj77z&{`kmY#qR`lC%a;ego3ZSQR`FB5|9 zxx0nDqN=YXQn2MkOd8$G$<^KQyB#B7nfS#{aOWlLoYxyH8@qmbf}{<##4z5h_P&d_ zT5hFE&Dj@4*!u~XrzODku5a()RL2k3dy5r^+#u3Trpx37J%#kpKq|3c^*cK?>>cy> zoM6~}GnC!rIv)A*#9bfx2`L9g{2v78=|2%1DPt3Ne6_c_33osFKpW4MU0xk6F2~gd3#p~HZWcl5E!s_i!!9$P^dyMs_ z(ObJkhnZEDC!Vz~cndmS5eM8GTq$y}qroo9o=7l%FKNfL;bw)f4(cw`^qu7vOK3oP zI`mpA3OdVU-%It8xPRa?bxZ`!2=3S936|zShyonwX1J{H<1E16(1fZVKBw8E?U9D! zPvof0PG%&B3geAmhvuG)e0O@_pRaQV{Z5*t2y&mZZrI-E z-%b=WyGWkf@d(LJwt6hJqQZ4KxpnC1J_tnnE@FDiDpXU_bve;{-bzqrv*-f9TFpdCse0k_2zReh2i){M zY!FB7k_=in?a(Bq7ODv{K-<)mW;gS2eYrBRGA~AE=DNo5=j2`qNV5^4D#lY&U>TU& z2m;oD7!M|IR~xj@GjY~m9Dc3aR2CZUmtYb^$JCLW@STgy>)Y{dsBFO*d<$$~;6dVS zXA1W;^8SmsYVeDn#xwPKTJJ9Zbz)$hsQioAmJZ9gx9n2H3Yop_xQ*B|-4uN4ARRwv~QjD!L(oR6xX?O$5t0v}@6J^F}Ss?Z>i zWfYtKzaw#KDlS5Rji2N*RfeMX582A+KoBd3&=$3uo&tk$sQA7QiCT!vi501)LyNHOFEdVEqA{!3nGUuy*|^4%Nh{YyaXo3K1QkEIu{{X_VFDN(+G5jmm2nbmN| z!_Z30*$&qh^|pDg7ft1!;Z`_QqWB4i%kf%d&l{iQ+qjI=M&ZUPQOFb?DP;g90qWBb zgZk~$rIvjdo9^QbG*kj#z<)k zv`)O1`Eh~Bkf%kPCAyC=ukd`2(XYHGp-laSbI(hKr*y#t%xT&&srY9sbM&fV4ciw~ zN#N?gHT@99k>kc3Qy$Mr)$NvbS`{-ate=~0^I_0{TDB}fnqI2i~5(NRqiylSeY>_9s=wiEW3zXpVax_NU_@PRSf5K^`sd}@69H1 zILETmr#kaB)Y;|~eNjM-K4d4+`ydCPvc9V&>i{sxVy(rU(MrP8Y)&9c5@Ek+Dqo@i zz=4C{Lv~0_2&hj@)oXE~nAGbF8_;2{!11QfYy;mCU&QX|5BhcLVn(0!@sg8eLM@Vs zkRl@mS>(NsI5i0>1oZVM;?wAra?b;@=c~L-I#~jvyJ&VW$B!ea=cXLm63y190nXER z^iI(r+H0@kRg>cmuY&m%$8$U}2SGnzT*sZ(07RN=G4_YJ-z-a+N8N*lQWIc-Ha^C@ z68$H051@b0{(n;UWvWtxXu!0fgn%V3W1Bb>hH7FWbUw_mx4kgPLyEF;+ zJE0fe4@}zxq|DuoDS~m+oe$yXnXUA80LTAaU(J{uyIxSkVB(~0@;zttPCceeHwSgU z7<**HN5#ouq{t}9QoP>Z(V@n58f0UPdM#z)DiqoIsnoD3L?Bkt(G4UIV`|FF7o4|1 zd&-v;^N*5F!iz^YteC0~DEEnh@r}5Zl$gHixpR@B34M1e=BA?k-Q^0a@cta9ijhM` z-IQh#SK(eS$)7uV@41K57I)Hs#r&<@F1wc1^e|_;7CHWzt=7ZL8D*mZ(ldsU({}7{ zDUY_7A2BnpR-S!9t4OBW5Y=$d+O)!LXe)MaY|wv{+g6AJq_^#`+>^fZBH>l198x0^ z$r`S1?s}f1l*#eIqAV70kgLR#_W)V)Q%&<4|C(y37i3m8NQ)x!+?Axxf9A3bhWsZg>Uk zT-ZrcRXF`LD^z#C=6vN0BZsR{X4$DVZO44oOO@NRT-v@e8_D1tCrThWs|(Yp`m!*Yjs zQ{K4d1;5 zyi(~<#@7(6%o3U&!W9e;2YfF@{QYo9Nbc>zVQ0f%n!IK*0Vsz#|3^dj1FFbTI#|!4 z6z1L*=PQ|||DpDYCJmA}jpxPi_>=*~=R%$cH7W8m8l1Ou8-o2VAeFk6g2#LBCgong_vA{8BF-5$dnv|}IcM~<`RR52J~$iO9_mOOS7HH~yyBC#8kQ&9 zDY}J>m_dhTC5F8|SW5jHRI|mH0v7aYW%#PxyW^r8D-=7n*!^6;F$-uH6%hOSkq@vC zU%Bkvmz4Z9lS>Pm$yLZ+Zqj0wj_idb-Q{JGE(Dn|1iS{UfehiLwmE+9~I7>L-zdS>%>?va9}4q1cD zWNY7?er%<=HyWJb^!YvNi_5!!Sd84)lTb@J)0=YUMP-&>@r|8+EK-yN3l+mI%Mu&y z-o z!b-m*#BM|JDA*`p)q$a<@cjVGJX1Ox<&%#QzteYhSo)4gC3s0La(g9fMj3`h%`~l` z0rt3llRGZWj<87W7YB-&4=(@)&yy8lc>GaKON9sWy#bfd=1$6}t!vQzk}Z^`YDZ9{ zhS(B)Qrb+kMKMrO(&C`xFHK+j#!np3=LAPszC;AhjpuO^`hf`k^xs@QGBBu}L+wNwVeb&cbl$q0&9TR<8OgGBrkyO<}8C5&?1i zNG_98HAU!I5;vECHl|Ov8m`IJ8(ajA_4BU+e~~%As@s0U^hU9W?L=UpsQnGozXc#W z1uybW`n?n!9#7_sFWSjY876^UoM9PxNGgNCD6V678ez*bDCSu{VY48N&I#A3kOU6Y zSl~eAR;Ejm8xaH=SPZ?pn@RQM2uS92|3iX?8{Bf9&&CXvDj(M{oYo};yoQ|8lm^m! z4DP|%$H`fa;a{RAq4tKg8d5|O@_+gkFxpHS(C(e@gYO7DLiu)m^T z`ricpna*#4?`=yPLPOPv`tfmZ6C;^PU62fY%=3Ewuec96;$I_IC1DsqU)29>^wWW^CfUMNHK~W4iVarC-3&^a3zE zatm|FY+4y|kN;-`zg_6uOF5&rAYX&va3r5G@)+?1few6nKlhs~O3i@%{N63y3?;i4 zDT?@-iZy;wH$R+N#h+P@(_YJ$7)PJY`|Gc*J$|t)5FO!=6n_a31Av?}liBIEE0gj1 zZsi-ongC_a^cK80vohd>f5@}_rgO-g=vV+chs{75Am<+g#B3p-yz6h&Yvh>{#&6kQ zjD=rjlQf&p+USc8Tn8n)((O2qZBLUmjLHoi@B!OSIbUb;OnKgoFT>_;b!Yw`fI3rO zI|ZxAI#8q~No$2AL;Xx-l!*{U>xOg@Jf+lGw`_&an9U}hUebB{oyGBZ6=4?h-0;qW zbY!hYz(C#x3==C}udY%>iIUVBVyPN8s;Oj88!qAIHic1VU*DA!*8`4V(i7$UaoH}o z|G2Cp&9m-e^rPr>v*S+D$VSmytFPc%$w|)wXm$S*w%4@2*u&RHtRLSyKxiU6 z3!M^v8Skw_#~MrXc6Gm{PCzK+ez@R^GM6-06a3{Sbbtt?X51ED@L``yggFfzJzc0o zoAoI*(pM@r+?&%6S?<3IyQssu`6sxhzg9GM(u>BS%3LG2vTWbL5quLSfDPYrd`SO; z<>y^7{Q|DCLH|W@g1c*_TbNT&rDCqhah%fei`(rYWpJhav>1~B)E^exo8xT(EOTm= z7CC5nz3p<_tp3@XnzDVh}*%lUwF>>2f5G{@3J=&7Hc| zyUdwAq1~S_{C@U81<2XwNAXlqfS3F2E7nTKIYa+J=KvRe(fb!v$NOI_{836nmZ* z`6istvzZzTO*SC)DF?`~#^6Rdx6yMyVT`by3xmU1m*ks+V)xw%;2IA9i@CFos&ZYp zJq;=;DIE$3Dku_4mmo+=cZhU10*g>U8U$1XDG{WRZt3ps4(aZ-)_oSZInXoXa-vAe!mX27HIOj@PDO+{T z-}%m&*k13`tI)KkX(h5b&!^F^deqyHHq*cE_Vb>Dpsn}O`&&!^qr$NaD9^mU>N$$C z*Q#>E+xnkL$oAY~>tUf@c(8)B$7jGWMamU0rQ7|45!wA|kEYcaZ0|8ug6Ttr57W*pG$DjvAl1fkCjQk z4x)T}>XK;}!UH=XHERFc2fM1AV4^}r-mJChD=4a|hvbIJkoLo7#g@!dsb}6|DrLV1 z_RX3kU&Sj!_wCI1kW*zbOyh-?bE!QgHq37*ZYe#>sIfg;IR%Ixko7OPa{ebQJw8eHJ4 zJoRpoo1SdUd@Ale3F4LQFwRHNpB2WMN;Wbxf5!W)-J>nL8qVPVfE=GhOG5}%0Z_bT z+ZgZ%`6>r<(4N-%r&FM}e1&a9)P{WV^7F6HYDFDafOd{0sQU;FzrT#+h-G~$P8d5u z`(8kq@#ui(cFgmNQ=k*NqU$>n3T_$P4$fkAWkRHYQr+7RTiLEPlyKumM=_lm)y4`r zkW3lnnPN$C@y;im-+Tk=hx4+Zv;0vZg86?=u8KJB^QC@3>HESzci!2EpK5t$7;d+d1<+ z>0g1wBboIyRSk4_93oDL@0;t=!`sP{5Gz)j*NF8 z$mdc`Pzzx*AaD5QA;Kgm;rkf8almj5c}#w@;lVUFm@;RaJn6cZcl+kSQ87*dbg8fo{&w#%)I^!|^AN2o z*tBfaTjfx$c}%sm>8zyL9Rn<&O@!*XeaO7%a$V#ub3B*8o>jrvj!3;@gZ`l{f7F() zYaqijW@E{oY)wX}h4ZuUJ7N8a&MEyH#HCCM=`v=E6?Q#ytcDF8OP92`o=aVW0VqX= z-aAt}zrEn$0A7w+BTC-BHd*=qNpvXu! zvZN~%0xF&d=-}cqd##)>npM}Ie#>?$vqMrqeIGi+J`zF)Lj3k#w{J}3nS7%DE}v7L z&HQRB2Rs|&_tkkaBq=+FSSs)H<#+XOK8gCd>V%vhfka#Ob75~zI_#J}>d)2NubtCj z%@tAR$c-0R9&Ibam(5KcN=Rl3+K5_wu_xE<^yzD+_65I`gYSiMXjR_mNh~G@JzUxf z9S|r^dG^1R-Dj}gNu?yG5pM{O#Yuj#@?Ju))KIeQ`wBs7*e6q&UK z+U@*bYlH_rEemnkzZ(POs#KZNc*g%o;el1`@K7;}XvuSBsOgJ>YpmgtXKh#Y-3Raj zu8jhcUop?SVog!1#?*&>L8nwKNP1~6t7kvj>l%aW=#ig7NI@W>ZAsP=t0{uGh5hUP zZC!B_Y01aWPxg$JV}JMT*(xLvhu_pExx-7yrUa9ZpsonWW6lsZS6WzVL!%lu(qk7? zB%z|#s!|?*zF-Rc$oB0n9dVhcJ%GglcPUJrH10QDyibD*gpjj`r`2I&#ZOoIH3p}j zp1n1AbgfHt`ELBMR@MeYa$`_zq-ViUS&;Rkk2;i6XfQjj9a+KDlgA=~tP{q;9M{|?#=IQP4C%SQEqz!vd zOQ%ssXuZ&>dD!6Fw3hB$PKGD-K7gsn-NQXTGfk#Vy-0aQcAKOZgN5g20I~pW`e7?E z>b-{p%M*!L1?IlQBhnj>>Rz|Q?q8Mfo6Wb(^u)e#b|U8!*HU8Y-`pEK&r!WpleA=a z=JCA<%Fx#}QhM&;@`~&r?D^Q!OoUo+QLPx}7=>$GP0q&qF&Bjh{(GDvv6Y`AC(;k; zU-%J^UY8tRC-qhnnWxRy3?1%b{GTg`Lt37thou{Ib;&SAwV^LPvnv;n^=0*gN4CYmnMN!A{Iw^N~RjWb9; zI2Fo0#tReU3KV*DG_=(_&t8r6162HzkPEyfo$RCs=KGdLKt|F8OBxqa6W{yxWYP|f zI1zIQeXBa*xM&WPBQYUf#rg$7WKB^Ndp|+fVdu79rie5VLUv3jQc-6cC=h<<4cWh} z3@35q>&nj4@ncf&u&Qk}u z_hmAn^$hpt8|_|Pw;wO;z@c;Jn(zDlOy}m z4B8ILA1L-nZRF)Zn6R{piZRp%r@uq74(jl({{c?WMm=Sux#BTZ8Bw zW7P8A5yX#wVY^n{!V>31jVhRlD^APatB@ge2A|k=(8qE&HQ=T zitAVqV{WMkfPP39t0dgvYq%0eOgs-l#f3qiA-ALX%V-m?`999HaXzOw3fiNs63-11 z{DMAloAcQO`en&rPD1!e)ruiu5ylL~0y5yB^uT%$j=~e9KKokSuD;y@$k{^e%=NR^c+!9b*)DAlDcArrPh{COnr2~c3}ZwXm|SmA}UhB5vZ_1DTY`h_R5gK8n3f}won!zZF_#&cTtZLd$tkgtl_ z9mS2V(D5gVUV|h!X$RcqHD3Z+@KpM!$1?PBPi9q1bbWnKi4g###PX(-ItbbRiZ55nx9{r198|BReDh*2eBVZhmSM( zMQN4r?e5>BuoPXiUXarBdgvKnCYY56s@G7Qf2Q4zKi&9*go%93FP3qAk>o=s{6f1K zLfvO0O3B&P%!N0J8;L`-m^2ISvS%hx2c7gkfmgC3%%06By$-FvfJsU)RQ;|Vs(BC% zi3$9%{kp30xU{!;&OAesDC^NhEtfuJN>QHqX;6^H~n1(7=z>`p~+G zFXyiLd3W#ajAY&5TZrT95T_ifNeQsesQhf2@BY0fBV+Joi0y!2#t8w1?XvWUB6OOu zp)G9`NWN0t8`e)jVWUV}&@;YNFgV{FJW$IE!Ke8r!MCL9SRqtRZQ`z(f+fi&HTpVx zg3JSMO18VIYq9>B&CHpLVc~J072eAeq{D-LeF4b&X&Q%p19i!@Aunw{u0uwX1kc>s zL!*W<&FRyRBuG(%BTh$tZrSz%&08P9y$s^!OZxpv|Lb`FSOxX@|Zj&q{DxA(%6gBEDU!R(Gh{n0~1Xbm(mq?f! z*-~7fmd0;FOEcYj@I}qI0wQOZO-}tE`9-k?;kc&Tb7Vs$c`_l!2wUE3pJ74=dh3BS z3O=Rivx#_->Fy;&X}ir>Bk1h(;|Y54>lOP>8Rlr<6$OT|Y`nX>iJUc44cnmW(mm<_ zezse*SC3HvBWS&I1&P~tT{!`?@Ou=YA+)**Spr8T<)tCabb*m_0#v+k=n9|H{BZAC zz3^G~mi2EvZ`$gk22u#N5NeUkSPfV5@dzVBz_YH=wvfEd8ZyORq(oQO0=H^>1HzY^ zXmh0a2SJlxTm{&_B|y))nsOjfZjvg7&ehAZqqLdTl90Im_)L2mmY zL?!iND}b~YdT{hTr~y%FFxz*tqz)(Pjqgt=p^s^sH|x~fvmIodP4wkPnwv^XW{Y9O z5<(TRyD>GInf})9B5U^gOCug2xcL=?%xLD;6rAIrQj&cs%BXpFNZ6=P66fEg`8c;s zZ5+<7NLGX>e@nfT0CNLG7@vB0lU*c80K}3q#>MHk#;B z?&!HA5~p)}86|$Sr(oPZ&4PefS68gGVR+5U^A#swavI-#FU1-<%z496&z&!WP)mdb z^*Q(DJg}hTqO*nBh7ZDI;L+diCoiI%!q{`)>3d-}AEo&moI3@oYp1@_O31Z6JAl3b zBJ*aQZ&$Pz+GlxK4(WSrlCX$<&lOZ9gpqWRnR`nTnc1XFfE~THVmMFB!z~e!eX9(S zh{k2Ejx;#yh@MM(iHLIB5~bt-vFYsVJ?BDOnQb@4tyV+rL|^bqb&!mnHM@;1mR2K&-7T5SrpD@Sk~ z^R??yTDR0aU@&AuqP6!Ov-Q2hzIUUPwF>VdGq*Ul-_P$3LUTm#LlbUQFy!DO+%kl{ z)uf+hNb=ig2F5&l{a-C;Tn=J%k(M0jHUvT7gWBZ3eg!|)y5}1htvv39V_!q>TA6=M z%P*OCXPbgT&T-g2!5crm66Q;Iea7#FgQ7O$y|;^p*Y{-l6sI^017U8_PFSEiBg`!v zA1+Gvv5*zKD+Wkd>8c7r6sr{IJ~ppen0?|_37%fT=@LqYgAAzCVG z369Y2<5;*~Z2QKMFc&s^@85{oHSDvq=2)kG(W_tc%_~XSt`sKWCC;Kfmh`6-yNuQO z;BYaCccf7P1(XvEv zpr9Y23GEg5>f&Q)C#mJxBk>e3rf%Zqjdy@O`{+y3RoB?pGePtTmTV2Vv4?9%o3n(Y zp@&bGXMZ!#_}wU*NW%{Ut$=G*aN(L2KH>s*gyep+L7HiVdlic?08?5r_Uh~XEa-G; zr|Be70z{?&x`lG#G8IS^&esiH@B8`ikqTfs29k^*pjTbezo1tNMvCgaI- z48ASd;gV1Jv0;Mi?%JK9qcHxBRJ@BFj@QZ>UfT(k_l2(|{~Rdq!O zPA$khh--_KN5P*IvA$6+a~}SD|H`n~z1hKj&bZd!5m`1%zpC`YWNdgIw8(NLQn-yhM!nwf&Wf;O8Inb4 z62UF0XTmT$%NZ8hW?t^&0r58xQKGUrVa)dzzsYHjJ(%#6&A*VgGG5&uSZh=cN-Q8C zsy86vF{S7~(ZO>Tm2vhWx2h|{)9ukj*=?oae5H!Ow{%Ek0R0k*uJvZOQ}i^L37QR$ zlX#D3l1<}uuyyA~*87wIH-9AChR${-%e{L{3KbcJy~=R)gRsVPteD6T6Q6}(W;i0z zsH8~bBDkq~L~)qR%TXcl$st{-%=lLbkYoo6h9PrNQc-?Vv+mz3-aCUJ)nVi{ex~^p zP{aw|cx!sAvF%deHYg?+RU&<9L3;jPv)!AnlhSEI5W^93pqmr{Gyc5$VDYNZv>?6F ztrz*D$Bz@HhenRVZh$iN<2wyln0xJ~u=}6kR5frBM5#Z5i~UQ^y{WHqWqP1g_2^k} z(|z2za(s}tI%Q#P3fw?oz0$MDlp1_`TqsjK7q<}oo^li}o0%JM`->XGUgEiDhc^zb%t-sIVk`Yr1@TXQR#dofp1ip;{wH&A=Uh{K ziVNWAK0g@ZK)UKIZ)P%yep40MZbAMDYMl>EqBZh2l^hXBpl~PE@s{LO0kOT?0S2!u zR;Q_NOh{feacK!l?pVjx8Kvaxdg#5Erp#UenI2^>NNJn^7k4&hHx>13NU zv}s9f@c5KN24zwkq)(PJW?mMAV`n%(SDgCn%3+v(Ak|&Ji`uL1@;>_X6(|6C42|rE z^_~aFcqj z;*w=)_h_8<1Y;so9MO@`k`?#w8F@acH9H>zyCO}^IZ&sg5`^2hCg^qOsIY0NC#W{nMA`n z%)fr$>Gi!c@5z{F<;95GTo4_e>gAcU?cJztP}T<|x0OuNxA0tYIP;usqyROI|CkAa z`GHs+xtgTvcIB6jF1!uY+W##^?0-Q0jh;##Zlvi$#26VjQ5wQiC^JCr zWgU)*kLVGJs(#RXasyei8~txRN%a%e$xBl*H($9v?jnq6e0`{2AIcY*>BIX1GF3+v z<*s_4Fe{Q2{{$ubI$lp(T(zghzFqw(4L-X6BKPYreQ<*_N>{g$!!S=zaHr|TH;pWm zipGt0$7tYc*x4!RC2BZlNfdZ{Q6fuG9XOp6j>?`(ep34MF)YJ@LGO0VcVM(?Az>bf z6Z6_W2z8yK060X8^bp1k#3l**!N;O^gjuI@Dse9wA11!qp&#MXHDJIBfTsO01ju0V z_N@1dT+(WTx%_bl-L(cBHIzLts5JsmmSdZ-K?}B|nEdi9M9!V>^LdvhF--4N=%}EymP3#qM5aYfC#U>tCrp5VBWKbM417@UGq_n40;xK16G4 zfazjC=P*YCpWtL%XXn1H zA%n<4_BLvy)wqA0uY_4LAn;{={imObbQQ%GFj-CUEC<>B&$lzjb8CeWkw>M>@jfz^)^b!o?pOm0f&pR(mP@*z~hj!OG zmLM;mvMXg}C9v^bS4G7zzuQuEy_Ch{EyHl@kj1r*)wE^&GMKY9{?gpZ$!8!XC6>Tdj8!5E$j#sAN8Nok0d8I!YkoMl z3k7mc*{KWbo*27^B!_dS*{ZZI$rX2{{0M)3QbB<2RN{oSCc9^$H5IYtv6blS;IZtWXnz)R3lBxc#=` zInSWE$*rgU2%q%9rB8~>3m*9Ha${X_X@eo48Hd~NvXk1X!9(f0zU{hwZQN}Y$;?ps z#Mz_(PhXO-Ktm?gMb*fJ10WK&-(-ovz+H1~%Jm!$-XcuJR zyM!J8JiNgZrXwFTPR-wxb4o5$d^l9%`4!#mw5oigdq72he3D|7vsp8?=s)HhqkrG- zj0NLgiKMS|N3Fw#p2<}lLKgv0#>D;87aHeiJaPlcP7H+y=ae#V_U3RqqkK9%N2{+z zG*^tlJ0F2L2={zFo>?Pync)OaedTO4uEXty{K+$OTV27Dgw{I*9yw)KQtjLgp6n>3 zdVFu>_adGcuHkPuVTEWo=~g>=j_3^w(to^#Jo7TVYSkX>-e_dh5G=3;4la8FG;%e% zIkSQY(X9mc$4;=bUf1=e+>|4K-$Tvm>EF6r!tPsd*$4Vjdqok*H_%uEO^yeuqGsbjV6^ka&Rbq>%>+c#7(w!t?CuY z>kuW#xT{1vCd8VKKOpL@u7HjzXRS(t2n*pqbGIiBK)*p!A+SEsaTIK`);H|(HvqqY1XyFR>@kb=dw3jvmDCThiL$}N>}5W=;}>;o>cACNS!tlGeh{mE z-NunC&|QG#b9WNoE9Ln3TY&FM8?Bn1{$_qKrE4`;hx1PMgkwyNCnu+aqj?(a0k|^l z?4WOpjtENEOwrA!>|7>L&VAf9A%q5Y0$mqU`jo-2*Fk@7#ytkod`}liY}agMB5H6@ z!ljFTzl51yeOu2;AA59EePORaEQZL&afo$UUmJo6H4HLIBH#d5u3`gHX+|e#yN$wK zNKeb)>#N4#V@3S7HZ!z8He_XGSFNR&Fzgsy#TGs7`fF4`cbVJAUFm0y-93LhrBi6$ zn&6^4?}xC2NvQsF!NtNWP8%f^H5+}TdD`*lq|6M?s7Nha*vq#Wh9jy8_ndnni&|&| zgAGBWe7ZLmi=!T9*kDN4DR-FliE!6sH<9wRoLJ&b3ieq?SQ&@Klt#^6 z3j8{w_qpP1%ZK8C=EIuD$Ybjiqkr#=9k0dyf#Wnc!I*lX2}5% z&w7-PC6&^Bb;RoRD7k`5*x%jXB^@e*u;Zcv<4_^%?7md)V_w|XP4`!G^%~#w1x?7cAUKZv@X{s*f1GSVs>C@^Na$ z`TnD0ncfRyej~s9!;}2?_SKvt1aut-$)yWZk(2+um@2plpkv?@M|b7Hpls$!diO8j zax)hJ2K3lAK^q;|tngU+*kaRwKgQl^KgDap3Co$>_LMk|Db-yhI!7DTEmR5YZR7(M zv-_tSDTC32z@t;(v0_SSF;JP(pEQD#p)>#79w}B9^b3ZbhtWlo`qCxt&6_ms+|b>d zmPdqITgG4nrp6XpFac(=!5aIKZaMQY89XG!nx%8+Q6vsPPfti-y4d)=D^wX)YXxv= z27y4s5=@)_j*9mqD`N5qn5Q8H-*nV}>qj>%{+%C9o)Mn*6swwfcl1!?Jj1lcbBkIa zV#6fCff_Ni;BB{=J)P35?~ZJmyMoby@?gC6u0ojfCqqJtD~bAK)g!URs}M9YEIEBL z@#m@UTh`d|O3eYO_?Pkg@Wav;d(|z9l6-J%a*zu2e8uEfLg485D2ku*<@NYa;=zac zpW$;JW+W?K`l5f%!j_;Rj{K;%N^C2pMWETsX}`;Hv=sSr{6(Q1K@=y`2%K3#SGq5x z`KKRZ((iXqtGm78vdT^D;|`uDf+u@4a@$?W{hTvf&v%!739$@Fg-mm9Ea!L#_@GES z9(^JU+&DKAxR(VZyC3!=zKI=7pl=bRi-5R6Em79#v%S@QU6VKTH>>hH$p18TDWPb9 z)yH@mD_RW0|Gzbroz(yTHhh^xOQU7SMyk)=7No;D%!8P7`wI?mur@e~>7XOi_lvy-=Af7r=^ zi$8Ka5nSs<_Pt>afMWbZBZn|~Iw}vQb!icUDGi(CHHngUG5rUE?C!oZR53IcEx&>3 z`py;V>Zbp9l^lV4D%pe}_bq)ccOU75oESwOA7UggwS^I@%nu(z^*IDCUXw6a|iC014c?ulpUJeF9jMH1;t~vB&W-Vd4xpXu}e6yEigh3A?NKq5cKv21p^R+##1;vmWyF z@CeB!Uut0FacO(>F7Gq$+Hi8T*5UHq3E@^}VvbrCSL6t`9+n-X?2eynY2s|$S#V?p z8#Pam!-cXHcSof8Tf$eCB`j_twd_$LDM{IYO5c<0?b2Kbh!Nl%v#*#55V0d>H)UHV zdOEaK7ma@p^LnOOH0L&+`RZ{B9B!0U*JSsT7H95Wi#uO@iW=5{jrrlUW9$OU!Rmwv z?mDpPpnY1F24W*0{=#C5#`vJ5>E$^>;u;|&uFiOp94b;Bgd8JKa8yHEGnL`wNZY2` zTr`2Sxp8S6c$sYl{4;&VE&{owZ0q)Ey&h}cOW$SpzS1WTxuRuG2eQgl$V`GQhRSfxr&#_;_0FAqaOtGv zdu3Zm`RYgO@MENuK+8_wETjiwq6W}AHuCT;(Nm(qjp8;YHZHD_gD@-4fWWM!pVq<@ z2as0{;gM@G5}&7xQYSU}~sAk$~)TxE57YScrkS#D6AJ zc@B(=5irb4nHu)*Wva<IZ9|S#AQS5&;7Y`U3{|pa!fo?;Z%vS5S!yxhb?U zS}ZoLoXORPtHKQokK7e13clr+LDpC0BFo}w{6QR8D4`@lKt_x9)K3{!kg}Z;#{7|L zgf8hh;$cQjQd&3zFvwWJJsSG|en~L8(GuK6Qip7P-k;Ce6~07p_$8$Lq*)?U%(=t0 zkkr*#ct~seTkiL#L}}Gu=6>zZZggMoU5@=E&(h5Fl88omj7f6>Rjt+oIxZSlvzumg zv}nHUkK+Voh*ZChWQ8%BDX=`GlbCu+AzYoT=CNsg85#z1H1R<%2A*4>(XHx2l~!pb-YoIRc`$ za>P==IOAKv@8SW29B*qL$l{vaGk`~$d~}+j%czrVz5NZ_FoRks5CCA-X zt`p*m=aiGKMK!@%3Sd0^CS=SS3(Ya^BtfZ4)~&mr3ckD07TipvW78=O)QCJDe{{>9 z!ADCOseyMfF?Evy->`4)rn`?~cJ(^{j-EZU%V}wJ4AXuATC( z&}a_W^IlB|A6Vxw)2{yDyBbt)0kD!20u`sD2VnunUPp;&CA^OweXF_qk)kDf5W4Uc zlHD@%BqwVXBnjRR*3dXXhi`N=cW=T>N<9D2kO#E*_#Ru=oaJ|IXZQ+V31tTO;Wa}^ z(e1`O+&4b6MZOB#A$f_rm4FIHSFJCF;!Lx!g$wOgDf=qsO>-;0O&87k75n?4xPDK6Ugab6<5M=|AU&HzoOs#ediQ0<<7^a51|f z*>6QeS($u^x1fnQKJs8A@2?5s^R)644sjI;01%1!eLMKZtN34XZ!zr^5te-w^F1m- zX{Z0*rYBF#>$C~WIS3I?sHFjW=wm9)32?P!Xx)6GQ+WnIrqJPn2XP$vxCmT1dWEDr zyWQT&+M@&m?(H=H3mR!zLjOd73;fA+p3Cd7h-ahNMqg(zF6P`5M^=ErtO^kfR&D-~? zR86qv0X{QTkd@`+5-ule)B2yA(g?+u`fOEPdw?}$!e|O<6qf}Ey^3a5Ut6O8 z334!n?&e}%=u>d3rTrxIksb&l5^F+{dfxC0WVHF;$DD#l{E}_5A5k$A)ov(!_;hn| zaiW2j&po`#k0LhxmD&12OnUR8SJTVO6;O%=|0W4KYC=nLF+ZnYiFn+NUu_l&&;O>+?O!gIVIO!6Jh6K{6W9_jo^AA zP|ATZ`Tpo4JT1IG>G==>A)lO%Hn}1Tdi|%wZ;I~ztv?w(t@>_wdli#j(8HNDmysCV z=}!p4jc^}x>`PdeieM^=La#NakK|2%J6aY&%DaMtFJtzH41eMAOtdedgH6v6(7}b; zJB#r|d99t2&VU65(X7^7T!)9Dj(eD zRvj#jRRe5db!gnaE)%={%YXU7I>C{pq&j!P+XWjnz_8yEu^lD#{QC*Zw)iAXU#DgHC8P%Lu(A3BXN*azl~ zhDbK5M^U|Ac{BIgv=RARk7o&7UTS`bdLs(b55yAD@)K{*OJLz`pr~Ybm`Fr>zrGJ# zp}Hlt@h1CL2yYYE3A-SrG$y|-`%}$v%jQ?To6#HA*pc=S}QYUSlc8rLED z29ZtLfETDiutp-zT15v;_M(K5-w}fY?lw{U24q)EXdK>@8ATCzeIe!XIowIDtLJ+C zMN7gGy1z(~B+FKX?c$HEgQ8@|ox`|vU@vvy2QHxWAKn1I@bQN3XB7_PFk*>v!vqLnjQc!B;^B+3DXE#PId5_3^T4X~Bi{%w` zuair-8<177HbBVg2?P48%fZIz+4-Sstwl8$(@gsl+EB+UnkNLmgfnCSIxfL7MDf+qthF&Fe6MW&CMcyk9`XoI83I zS6wL0J^cx%X{U#dnb}kZ&U-xCtPNp2fTCvj<&<=Zu@OB*(d`0SKGqFtk`K+=CNrA> z+~*H2dNn}<5;)b}>>fem!BS&CyPF60iw+Iq5wJsx-(iP{g9jAUAcLKskYU+pmr2WC zTOfg8xGgr?(glZ|DzM#)aHq*Oum#H%ZK_8gLmMD)r|fYsM`KJa56XXxG+%O-1JJ%+ zpVlxsEQ2C?eAbYcoF0lc)w{oQQsNPu6usX#DJ13orG!R{f5S;J9phRKW5{ab_Q|Ok z`h!)jeYT;KY|%$r+-mU96T5cx0g04Aa6`*^*2Uteyp@Oo+85IJKW`Or{moWU7|$U2 z1N_g|qo>5*iJK4I!?&W{ysr5r&Uxhj5J z9W572U|i>G@P})m!nPlILZy+keWprO>!Ne>=m7R_iMY}=Pl~9Y6M0hZRlc)KK2Hr` zBUIUsA9vPq$VeGd&kgwMta}&%F3mDYiR0&vNF=moe2Qx*sk|&f4_sSrOHrRZloA}d zIbVmYM8`=X*4i}L5{UDCwS7d9 zoV>XKy!KgNO68XFbPb@RG}uvq0BgyVp9NyrUO(}erdNBem!)`h4BfN=bHu%(Fh2I= zGhUYm0G~Ap_ZQCvoui7@sD4D)XB)L^d+>Vy=?rH(d3%Dh_hQo7tOGe%`jyqMqzm5L zIJ*;TzpwkAS(lq2V80mj$_z%~o@XzO(q-US*75h1ougEo$ic)!E?#*;M0IVkFVZ z>+iLJ`8JWRc>x%Y*N5J{%Qls-fZRs4)Z7m10qTB5sOxKo6y8A0lh9)I=|EEohIg-c`xF%Ln>_(KV( z|ClYB@9Fs$@RR+E(j%+546gtPhxSi00~@F!>Ax5c#ig6Qy+(Tjn?I|YY|H0g#zQZ5 z<%vyL;6GeX{4u~gKa0iS`J=San=p2Ka0J1LQm&=KC43>M+STtB9;YN8?RK;cYOs$U z$EYu#?bw9j%_sJB<)-k#oR0Dky27~rY|G127o4)Ox6F=KZ=Dey-6kCjlBB>W%|oaS zn*@cCB`{5rLaQ%;q%^Tb{A^bRmXq}*sf+$0wLh5znoy%nuF>AC|#%igeH$*A_2kyn4an$0a)R4m9IG+b6ahq5dto($kpMhL0h_F96FJz+g zn0p5sf~;P~C$*k;iQ6z3?ta8e+zl6a$EtXn-yz}ZPq}YHi_#{0!%GOt{=q$l?*cxR z4iTAh5sFmwrTI^f(rlsRKKrHvva*S1{xO<}{|YB2JTA^x;EnBx9lTMoMZ#ksP1jaH z=_!qRSlBz5rH3b=rT<+xQ-T+>qj~xAnYxe5vrTfAz8aMN!aEn!~!AaTs`X1x>xp?c>`roaQ8fIjaFos z3csd@Y$})WbrZp|8Lk#tfF{aKRh0YMw$5bro{2hIwL@1(8|(X+EJpPhxp?7hwU3X6~w%XJvJ z;JP!gQ4JWs>W8)ed5aa#j%nU-s%E2;&8zV4AJBD)a8^`r0=qZwcDUQ8d(SON6~1LI zMePi#by;rWF>Msg3oR#f9*-2|#=}Pc7+ocjMwE9S*f9ov%ccw;HyVI=@xT|)YTDFdSo(puQDEikY65?km@Yjd+_y6LstnJo+IC?!Ljt_GPB8V5FzvIkwS?aw zk;j#rmNBJn!vDC?%6PHRY7bX*tR_t#c3SCwfT$G8fl6V{j#0KyI8m(|K?%24eC(XX zj2~jjY4tn~|CjPH{Q?9LySAVnc;&dniCR8Y(8wOkOaU9N+7zdiCgO|6>=R%e>vu;9 zq99Pz9slGg8#A{3apxyb{A>Gf!nQHGA6nrf+5BZjQe`wtoo$G0x6YTPm{YI;9jwlV zEwzr|f?cN}$xfzDE`+IsIg!NzcPH9^FOFC)gVRa{b7Ybrs8S)ZESx_nM-D>c4eqvr zVGhZw@DRQA6=K>6)^+EK9~de{q&P)tx9}SzhThPx;Lpj*OW3w{ zc41w}p!Zol05Dwo;_Cy3sipG*Q(cKuiAuT5b~WY`_UjCLndRC-7B_{;ki`kYb#8vYqFHwT6xOe| zpz|wx$TueZjA3n%mG$y{8~<-f5OCluvY`xv##+NJN+L z0eM-$quK!}--q1e-YvW<;;jVE9}{!TsFDk9IpW>q&1XT@vBwIHpv@l~hP1?ylI8M{ zo$NSj8hsIqPM0IFabcA>RI$2C4lmC;mvhm=#ELo1OjaApQMR5O^7Ywg|Ckd zTfr^<6<4wpb+q;OMxZTm;Dvfh)y<6sUwl6xqY<|_&eQbwl{cMb%dUk41@&h|>C7ci zggy7B2QY}toC79mu=kpRJJ))FITp-NGrc6r+-dvX)D}|Tr5anif`B)*2(s_LidHAw zuAQW=6o3o5A8%0KB`ynqN++id5u2&LX4jdnN*yIm=B*CQk=7qoo*kA;DBEr1=Y-=3 zjFctYIhu&qa;C9!zm?1h7E(GWvw5Lic$FB~-6RZ8zpLl08Vr_7f*_yK0h7Avjv@xP zol$fnz=kbSMj0taiX^Eiro`?azOWJt&r}Sm(2$o8CfjxEVV6g1t#=cHX<8C|2FH;v zr`=N2(%;tZ9@cy!o@Q5@SSp5stf04ORHoup(~9~2q!S}yiKb})nD*+xfkK&vfuFPT z>`Ws8vJqP2f%vjSDbA!uLs2%``4)z{oHS{!AzmoS`_Jc}>P`4HT%=ALtiQW-V7Tf} zq|*o`tUnOaA_&MtK{{@1H0_&p(99bY|9+GkWo1A{-oDdh*(=4`Ch@8WnI~&4O=pB@ zu_lPPo{CB2!t;qg!tw3J-LN)h)KHvci8fog+d>w67*WjoUFWj=$ zNqs+`L|^mc{VA>uO?Tvfp7diUlL-B#t{lzGjF>M&eQ$181(!%l{8c><_)FRa7n!}a z<4~ODc=q8nJMOC(DISmKRsjMNFlRsmkJ9P!%N-!!F6(%>9M69LmrBwLbc~NjE`c@2TEM-Dz;G%h~_^928$Tl<$!oD2pl*E3X9n0J}ZP z;ub8+4?i`~sINGATYY+HwR$adg^XGO=#_$9q$pl;_xTNjBMQBnCDWLf^H7kBc__}Q zAkGUhb(UBD0x}`6D5gy;bjgTG|MDO@`XP3P{#$h_(RtedTY4m=s46#JWlykDu8_y? zbp!GE?o{U*=NRIdhemgCBX)S5HF-E{&=(*Ln0OdFe3mriYTftTs$m$$)i)*NAf=7& zQ*@wjgHId9j}_Z**XM)&&5bqxoPhMNsP6~wS3$luale=4#q9?@+kI>4o5DR&i# zd+nYbX^JDrmVeo@k99GW!2Putd-K;~ES&nc#aOpg=U2JX*-HmxQh*qOJl(C0Y33K0G>*Cgr(4{kqZ#MM=>KFho$({tW~s z&~?Pn|DSUxpQR{KS-F4>c#w|CZoF+Tie2VDfiHUQ#?$ek;o;qh+eKgF*ryBucj6zm zWQA!0xqg>ZkwY%Om@W@4jU6rZ=%>&N{^V+x`FPRJbAp3v{r>PD+0l3xG)j8J4yyW? zsyoB`?bV;;0v*4X;kIibhf2mYa|5U|gG_hDJo|-qUF~5EC(pp<)bg~H|4>5d$Inec zE$W?|g}YUPxw7y#D$F8%6zy5Fh^@_XZ6q#p6Bi$O3Xh`vrAEq&}`Ojqo2J1I{Xi5@2H!WeF>F}m=+C&upHAEx>=mER0HV!o$?I_f*BHF(?EOM~plN$ze@R?T%Hhww zVUO&*b;#a+eiTfH5Ir^*BVUQgd-uEdE7aOQ=jgVAL@#P*ID#9w_cYwA@j$ec_{rt` z&NmyZ+1tAiLv;2_GRw_oVEC|>T|un>g+vYZ7#%BkKd$I8ZYWARs`P%I^Ynx+-=mLC zGmFz=1`%TCvfu%mQ|#b%aF&3L!YjAZ-{f%Cdk!^qfT$+l;&HU5SWzV!D*oHWDP>Px z8J+q}nt=2DN$tv5C87~T$#7lwU4KILt738VVKjuDb7SoW68Ng-EZoHXNRc5I6+zi% zBBb`g_a{eBfDq9MbNIVmKyATWPL~r>geh%_4t(?BS{OX7S;dE5&&-g^MnG4x4RY=Y zUVm$n-TV*Ru)z(F-$62uF&5!&rRwUY0RU3(*f(*vJW|Pi)s^-n-zgF5p9s0Ao~53* zZ`*Lhw@-if5W7O9uDUCWaF;SptViKPKe^4DiXoSEG5!uFn?bX#k=9>HxTBi4eN%6z z-y>G0#*?3xSd)hrB5HP}!{*{JdozwCs(hYC4?zFF1DNEhu z?ScnYd8cI2Pdcjra<{H}?9=wK5 z;e31&VA`T*e^#pj}yz(KJYh6X!`S;$OeV8v5p{fVB(NpM|<4y;Qk?A?LuVr z$ZjZ=56TmRw+6{#DvWOzdElbXnbW%ab8ig=X-s_1zGdWOSf$oL2c9dV-tl68Qq@MP zZKaQn?n1ZfQ{1zM#neBeG)K+CRuYM#(tt6{^X1(G;ogYdafuuAnMbqX^>tBF?4z%b zXpQ$pB_8*|j;3ok?=cq1G3(CCTW7kzI~1mfsrSz)y-%yvT?p6zEU0=1brU(y$7|RP zaw1P>W9qwH*Vbh?1PLKCnQbAeeB8}6b_!qoPMFR`JiwBMCQIbwV=|G=%wWmAC6ydu zFGHV9aV--^I!|;)jzI_}VVL{S%M*@9Pk<3!cvGWjgR{(YD-o(p;igTSz$Q$|Z+T5u zRA(JkG+}lznW)<4N1Vh_yhPxO_$6%`7rgx$CKrFw6&=;F?sXPXI_$E;E4Z@_FiY2T zQ6%fZpBjF6_UX#SW54`ytH`NO-O7}rM0==^v&z!I*FeC@fuKdy1%wfVsP@Dcq}SFCci0rb6a2JL$yR(RLVVFQW8`vq{ZYhB&3$Rcf2zl zSL%gJW6n?HZ3Z^BBv14kltq7%L(@><`Y+SYofHP;@&onVo=TTYTW zyO*l24jSzE(W)SPcx3ztbEi#+F!XxQ!OZ=0IDi%*Z%45?iP@4kZw>~B&0);6cFjyG)Ra@ z3P`DRx74OPM7p~{Hr;#w*H+Ja-V^UPbH4BVXZ8$&3@~f2^*q;o-M{O8tUd>DZbq?l z>T`dtq%n0Ws4o_nQo%V7pDN-T@WgeP@!PjHQhzZw~(EB&yu$ z2TO{66spn^7}D;iAQrJgDx;{Yqt+xn2i46c&z#tT@#+(gh>y}`a@24fIhFppW0A3Y z2P;C~p^fiee%~HqX7*JRJ#aXJ9g%~#jJ|A%!z19MLEGKUNzy|u183V%eF7BM#2RkD zQ7LvL1%pDW0~n78Nc@ipo`q-@t%t)AyUqgLDJ?{f7~Ow(&LV|pA|0M*e;x( z&~10l8qa{Ab(JTZvA@|nrP!u>R0;cbeqvjy{@S|N-(@24IQnkTlq@8YZ|zjtaldD= z(0s_UYjS@i?PHg6JEBdU9%H;>T5)^(5NC_msu--Epn6FCiL!_|b`K+UfW9ROdEuZ= zO1a#Qc|wk}h!3q92LJre*<`l*2clSkT&%|JI`y!E!D%@#jAf479Fv#m0U>Y6QzkXb zIau;_y>{Vue(_xeZ{~LkElv$8y@(Uqvrl`c(Y{g48xph^qN+8~ZQYYAOKzZ&5N{4a zL6yC%GMxM5$1l*JLcvQv6~2j)u;vKMvkF0uzsEWwlo3`NRtm|qxjxVm&`!Xv`WVawvBtQ@w%AJrUL8$;$8{?rj0o7 z!6LBn{k$H9ZA~Lg&9))M9hk#rvX|K9DiOPmWxo@^Too25vS-6C-(BKTYgo2cB6qv` zw;ouWm&mywh}A6T=0>Dw&lpD#%`+Dwe1W2kCrT zZ>Y$j1N2h=XRq9>*-zC3)PTl!k<4zcZhCpw-VkM%heiyn52kDv|-f5xrQ^d4AJ*soTCkq;fZKPM)Ca;Wy-tORNhS_uPG7O{X9E z^C9=?DXzcfZ)0`0$)0_6Y?tj!>m)je( zVM5Suy%!6tXl)l#T#h6wkk~AfAT1i*j?@+Tc(*tlvdpPXjK* zTU{W(sYzp0SH)T0E;eyk|4uwnX%gM$-ua2x`-5|=1_9(A?1=`PI)6q!JUzH7Hq z=7UXxdMzjP(7Mp<1M~Dl-IVfOna+z-icS39Y7DvU=OlZi=|-}eLvc94ZnBcTw4{?q zvok#5;;M(iMIb6LzB?_-ggZLIM1%68<7$>{Xdy#o327_t9dTsLBjFr8tAb#P01Gmn z92JlSRRYflU(4r{dt$;E@2`@RepG{dUO01PsSFsDPQHHl0ip;8(z;nwzzuM7H2US% z_}dO@pc{Ua>@wRP(2YqPkCY&jXXN>6W&x{vBd|DMnC^8e1j(QwjtoFK4x1<>A;!hZPK!?&2PI@KWF~^-Qkdb`vJ!GWRx6 z!2}#}QU=V1R>hP>zgj-?4w#{d5^0p~BCj@X^oVg|PE0zGM-1MWNBPhcahN8uAZG@)$U{IEbeIA8T+|UL8a!gAF4BJ|Q4Ou{YHu@m#|Zo~3wf7P zl=z1TOFB6y#rvMw_cqtFwohDPA??}vXK9v`(!hvMd+=juX;gp(lEezyfRdSEm5#|J z*#~}tykw8;F`gDEa_F*(2q(?Js}TBkgmE}n1wqF4@@Gg8^K%5>MjlhO%o1+q_>s;> zWO6J_p$~*OxumQk6|e5%`%pGCpBJCpB9BwJZIR{>`Q(x#h|nh^Y`;7QHbPBCC+uZU z|F%#0;vMxz(*>}_d@*;i&XpAqjZaKQXNowBU%PMUe#*rUHVuv!p~OfY_8c~|Nhl%K*HU3D@qsqKvEPx{Zrwd2#z2%YDsc^54viogP#|cO5Vz3 zfEZGT${UQn)L6P*w^__*oK1V<7Z5E5fk(kDlPE;Hl6(U1REaBVw5F0tbKPq<+EY#L z<{pAQe*_FUm#Zgi7FscL-5c=JB;Q4rl7$`M4K z5DgLGl}C_giWA0xL)Hp`=D~7i`=E0db71}6+tMmMe!y-#2u6NMLdsi36ZNufEJlF; zL5x>tdZLm(Kg$B^0m6by;HQ+NEL=G$foLOC<5(H5c)L-~KC6Xo*;1y#VNbjgpWY{i z#$@9(!8D9iW@fZ#iwB$`KNe{(%iIGw%l{-}$7t$nChpLL)ytAQfr zT+THbT*_yBPWf)?#T#!R?I79nDf-x^k5oq)*F;^KW{{rNTdsN?@(6e$c`;KykpJ*X z+{EeJL>L$-$E4K1u&KCFtsI9v9;#jN)SsSKScKY?myeX68QEZ&g^Jg8L;_QYYL}Tn zWqn%8*1fBo3|<*hdb(l-ZNdXkGppK;cFrIaH$#9jv0 zw>E9-i1$0Ws?ih)oLy?vHS9pGL%O#GqK@&0y2yNf4!?FkujQE;qT1i8F= z1>TJZ+1N9OrGX7)M825k(tFVQ##XZXi}_v-u+D;`gW+YC_igEkbIwyY>$g86PLzqh z`_8+>y+fn%Q0NP{ijq)eiJyru}T$l0Pv- zCMeB!kk6_#x|ZWkJ@R`CMvq8=MZ|$;4UAFCRxDH@6Cz=fB#eQbx1J=$@^4k9eh8D; zhH^CDoGIy6Hf)oDdsLdHU*zDGVwhOJ!PdpF!GeUp=q&w09c;iI5%w^kD#bSa)xdB$ z*M|&+JO=zn1Z=$z_){MCN#>opl)hlluqH;$+IWon@WePF1Di=V*|)`r_=68l6HS5B z@^~}EyHarO%J>&yCZP25_GCDHjajy9F6+mDVX}g)AiatY`ea4O}1$? zB^D~^1lEHB&pUeaQk9VR&*4DVg3dT2C5Y<$FEGIeow9Z6_k+!Sv2Q(YwJc5$`P_Y#W1s&Y|L z)Fd88Zy+VR%XsaJ8NAc=#wM7p_PNeOl@=6Axth2Jlf;pe=XD2cpFQT6Uk9u;wDD5c zd0Kgje)%?p5&U7iwU_)~$a6Zcs=64UPOj8{^^Nw`9WljeV#Sl(6b6i-_Za3FYQWGy z{D zHAA{U3uEnUtg_z;&|?>#hvnVAkT~$F#y!ksH3*+K|HmCw+cd?U-z^nM66gi&rZ>z* zGWvsoNA3q5uBR}l*rWZL6MqxifYUhqv`Y|d#un=|rh$AeVgcr7F7TeJVJ6XWTS&0U z9maX9vJx2p15~f_MWVy($^NB?2WLKZqmVCt{L8|fE$@u)wehET6lZKziT0n6XN{(`b`Kf)en3P z;~M=C+O|wfk|in9@d~(sf=FAO!LQr`rpwmYx;=sB-zYT$_NLr!ZCMs`f9;BEno>sT z?CY5D3&VV5w3>V}&$^G#1TVXS>GkRp8q)sn48imz_3>WdQ2u^|g`Zdh_QV#Q(AMMi z>Ugt6v6fOliNSHH?CD9iyUmDV@)=)_d9YV~aM78;IE~(Qx~GB89<7~Yw>m*rf8M=z z#0qZn-5Mp2;sNGzCohcN4A*JBDZp}<> zpFcXv-j7a?6*4U>KX%nu=S>u4f$B}*_OF!ZI194Ic!{7m$0|4u7~TQSTuo>9p7uL= zR*W&bu748Ts#1vq%JFHh7;qb+rU@eK1!pe87~b~{4AzG<0{Z*WnZuOy_)WxmU-&{% z&MV8l??d^O!V|A&0_du5jw3r4d_)|EZhC9(nZnPVFQLcRrkwoG%0@*`(wAjQX#-u# zvk$UdXlD0GU0$NakQcZq zD)#8xzTW#G=AEmgU*aP)=Ugj8f2;QBf*+f8d(Pn@LFGgWF~!1rpMIVU8Ek^=16Xs-(~$FSQ# zlgI~BdRfVk7)GLZ7`-SYnxjjEIQl6cw-h7ifTZs4mP%V?a{hiodA1h4E4W`-I=__(c z@ybPqpvS<4uO=cB^f*bXsVfH?IqgHtufAywA79ir*r`}(go&6d&(=#RdI}7#a|gLg zvJrR{O#?SFI&PDi>SL)ED71lrwdju6NmMIjM4@byVpx>A_!hCz!Us2-#w!rHGK~k0 zHTZmmAh>9Ex$2>&$2n-gf8P-`vcc>>H1Av=@LRp-JK+E$Aqwt++>PBOwEr}kp1REP zInv-wx=ve^SG7IO&&Np&wO*~<^UfdtVd0O8w6ZE1D!!r&RHI%n;FO4a4ilCh3T4)X zQ27~FM&`-ODmzCVA!&RAXa zA@8@#-d|Ox?3T`hE@klpf<3)*FhURl1)JKM21QUVYPDQ20P}TpWm9yGu+7-LQIi47 z;=4-ZAJ;xtls(!}1ZA`D6~%ElcXWwWpFy^MyZ$=9+1F#UM}SqItsh_Vnf13ge@?xz zBrb6%SPW)Rr0$6BZWs;f2>*l=Z#@>!bnbvW4khGw1S{P;<@f|tJ?~F<3}$b3ngnwX zWjae7iuQx`$m3(~D3U5`1mm!={SlTBPKj+!R&$75W z7zs{O4Sks-Np-7J*N}4z;{c{5+1dAOqlFUG3&0?qEYd+8t?)oduy3OcZ`T%{Cj9Ir)~3G-?a zf22m0r4#h&VqfPdoqHAcA`RJZ9V6~G@X%MITPCf3`StzP%U$u+L!l@M;f`kLXO(L| zd%HU5mZ8k@)?xhsIPA%A?AT-a0qVyaznnUy#PPDj2a?5GMcBJ%dV(=Dxee#e`HsMR zYmB_v7?YUH(np;h39c<~;Qqm=9(AVXQb-gLdI+DP8WM;~&Uu%SmoBTsGQTJW{TDtT zBpd7HMi@OYa4rtv{>wfiPQZW9W9$_mgD+$Xx5eTsSY{w%glEN!eUCC)!VI#eTvp4M zi#3p@UfTYcZG$@u96Ez3oMCM224)3pHrlYq$tthDVQd!R{YVVbH*o(kq#R+RES@b| zZJf+XlVWp=%>F_^RyFPUACEnK6v-ed2Vg)%)UslkgpWGwelbCf)c1KTl6&;;aSikc zMmdR)wVmWGW&*|>O=Rf4>>FF_)s(`NBJdLoWU5#KLnz?Gq+C1}m9@E^;7B;=R{ z$1p@*#=du9l~%oa3BJHlq?c3sMA)^Pd#H_$Al7t7>ywGk&RR9g>V@na9>wAV=;il; zz;oJXAVuNeu0Q*@M<$403$qybpS6h}gsa$=kIOTql?6WyMct5-kDcl{WLg1|xg)K1 z6Xis+N8tTM4dHLQoLG|}{~h3f{uSe0z>%?Z=6}R^u-M2yNpP0G8a+~1P9@A)%5@OB zQP;}pb$2}$O8a4` zmy_7Do^+O#&^O`B?6R7MbB5WA92G!=gj#}v!U@OaZ75tBjrUl0-2TcMVSEj>sQDh8 zx#;uR;w21&tQ+sfv)t69vx_6txdRW#I=|b!x@dQ7(!7_on z{e+9$;pYQPHdyw$$RcU-A}?#XA^lyNFh7h6phhofx9zmzYn}E!g0ufrb-_%@shj<#T5y|`Xge)H`2sO*0%6_|MlKi%q{G$M(tEr3D_o9 zlnz>xWSLL|WUa@`YL2mg{q-=ozn+{sdvc!@n_b_v>+@}RrnxEV=@Eu42phQLkpVko zg%oC_hA&Fs+u>9o4PQdqp)gX+%XV)n*sC=rsLl`cR*Dr5L>m5HkI@9n@YW2W=I0uunN(oB0ZQ6USb zS-&e-eMk$tl#rTb4{N}X!76365X!3+ttYE<&#vzg`RHta-m(GK$X9D4(QHp*e6_%B zj)%ZgsVNOOxgpEA2u-6C`RBVA+0fh59jJ$~Q~P&xrED#t5~u%YqCdTB{oMGje);s` z^zsto@r0=2pFH&LI+QXVWSt>_moM_jvZv5iy~r3vBU1T>sMi-T-gP|qgl6E@Cd%VG z9KqHuhGodFPbqNaf*#@A%t!*aY-_RVx>)`g>RS{BA)*tl2w{$?GCh-lX%jsb+Pum& z{u};}QiOJ7JZPjzz`tCgR^-S`I1q@*Z(+{DSlUK&|{J@lS! z+J(o1%}v8e%dmO5vmz8fpnSF-X=b9anr)+PzOFzK<1N+#Jd6x6V9!6g2^7?F4|QHH z*MT)@x$e1yx3|N@&M1_WO!huNP-U)51MKjnJYTr>&eH!lU3e$X8780c9hARXDxK~d zBiO)>vCb(*F{dyJ{yLCpy7nUsG1j0#;>7(l;S{AA2YK?0Ht07b;|)MEVai^?`VAt~ zS?PclPwPZCyRD?Se55_!%7z)Sk->Bpj34Ks@QX#-=Z#_NQ_Q+N3R$5Ck!Ib!VRbP0 z8L2^TL1nDKip2lVR{7Jb4n#M)MNhhiAKlYD z{a2)Zgk-JInq~W%+R0QG*YHn$SXrOiXv=h5gS$!1bOKP zaN9Z6J{lX!Rg3mlk{qD>1hLbhg$KwGry)z=6e#h9dk}$)L(IG5pPpDR?f(Ot=kXUBPUm;)Wa35cumHEhxIN3mNzkZP8 z>uIO`NnBb51srhXBfX^gZJb-PILiha+3)P9oP*8DpMni;gT@8)FI5`qu`a7=qW?1% z)11mf?sm5m%p@X#Qht?_9Az|jK6a56Y?*S=8U0_~@^)5^Nwb}odg_LPxqxxLSEH3_ zRel_?c;fBs?7q!5`{*4YXJYx#2PdhENXJucfYyD2EKmwBgfQ_5eU%=rzNMgtxzS#A zZhM`-;%yXjax7QXt?Xz72#@(`$geRfUiIlmZ)H5KV0jy^(ty~!S5vyP-wk8RmyUD& z6;FI?Zp0fm^=m^UKujhiSd=Awp)*>*X3B*9!8lFZ5R?1jVn)3I!*?A78XWl;jv+Y$ z#*e)p=o^zmBa95g2%X!RGuD&pAB)MNv(|5t@g+TMD`pNzu)`w=l_5EFrh|hqlN+*+ zlwGS!E!{z(zWca#b3@iiAnc?x>Mse>iJ~9-7U#o#-_pq9CULv_IcY~##-b8t7**8l zTP}etyA;f1k6p=?{gxsQS=W6w9Z#wojZQ+LHM(ID@tBWcD9S!++9SN{DJ;>7&ls_Q zTTE9^lYJjh;C;!=)q1Tk4oUVP!N|p=YUB8F%ABv~hOdANh#y@S##n5W$4v;stwe#l8BgkE$^oDOMYh>8-XLWS0wT(^s~a zXa7~#^DPW7K7*Lmxlo_8Z?RK^ zA~dyX_;Jvauh4$0C7{v5MfSX9udUgN=*uvazv~9d@F*gi;i`5t?%xb_0bWJ7%Zfvr zHn9P|H+>=zkkuDWFu)u5{@z)P=afnG=j@?O5CC1ZBe$U9QgJfHcwc!LGro|;QG(mp zlP!dHlcB7lKboChrHS#7ELp?X9uz$!r` z&g93)wL3Z9Ys;GOTnDzszN!eWx{7EV!J9Gc>IAlf;5E%e7##qjni+xac{oGYnn2IYa)`0m0lF za(d{X{S5k7(pyk=>%S6qsVrozr`m!4~2mtV8h*JVVmiiE*xBbZNhgATw z^aNDOzT=onzK>lbNlcSHs~rCt`VMA5aSzLWRd4pn=ZLo1!RO`K$Bv?vB{O=|Kl-Sm;O(Gm2cZmiXGS6tEWfm&}uW zJ_0WNmZ(HSMFa8+P@75|8brXdMYtka>dfz4nCC7@#^(l!JNXn^;9A*J2gKwpw$c~8 z_afmUQFm*ewO%P!LA|o}FoHw#?9mC78K)o6`J>O2E3+2S(ZTwjxXRRK#ZqDlt*8UE=FUpE)yuKT7Dv~`l8-uiI1I2<%{f$AGSk> z2gNQA?|TZ}fUTtQ?XcIpb^1R9zCXbRS#sMX4J1~SE#adZn-(7(TLI|Zr3ys?P8)Y= zc8Lh0$iWe{j5PJG(z|h=r=mx!40fv;cd6yMo{;*xtb0V93;lSQ4$)w`%$Cl%P}5Wu zeO4^OHOys3H~pF9BC?OEe=Hao^d?A+%lfd8>G`*|2UPg#zP5Xfu*T>SkN zB_*obD`~^TZE%hd7UcTeX_y};#c?A(Ht$1h#5Lm`7uZrsgie31`*c=}C7SObOV2m% zxuWiXKvyhZmx9o{m!pDsZGfteSAL!c%r?YxYM&OSBikz}$^tGhWBE{Smdv*uf^Qm& zBI8hDcJM4TVK19!8S8$ZbN-bF=wQ}N z@0)%0PK5PdeNpW{*t@k&l%WybLC-O>;_NskXbvO&3_+vgl;Crm1KAYpXAaw>)3-p( z!}8NoFc)lQI(5Bm+Y|C<6nJ0EO%TDlC?p?@C`ShW?%3r#8>@Y}4?%$`qQpnOWtZ&1 z6*;Z|oaB!u4Lrlmj@TcUCHTk_84;Dj*rq!}lzb3MNprw}SkFJwdw# z8me=_@re-afJR>JlJy_iZUiw6Ux)kkkKlei0c?$I@V%?Bo>(x6HO2c^gm2X9D7KXg zo+IWHgw2r`iwfaSN7V)V_}*$J(|3w4h$@!)TrQ^4&*a5(k%{z&obnp#w+3wm0UkHy z#1!>f^D;h{y<8x{zH;G|n(MpSwvqs#ENF(cXIn}Z^WdSiKEdHHLqjJHc6bn}jtF@# zGEumCgiN4#BpLEX`NDGPpMmEG+2%Ki34nPP^VMcr>r9F8GxvE3rE439bwNj1DW@ZD?Pm z2FB}qETBg$NF-*gD@CQQFNxT@bm|{tSWguD5pI#`YX_3&zOD!p?=h&oe*@U|dj%y~ z7dJkAr_okJ!j23bXI*KiJ?GVGc-Xoe?Gq^BhvU2SEw|Pg%RI=Dc_?GW4W1&IGSr4s zqpJ$U^=e@U%+)=NpPykqjb2vq`WW=(gU(kSi+^|Q0qFkuAHV(|xXlbE9JleKIIe&j z_IcNFb%UDOMzeZZQ!7~%A;1V0+|`D6O>o|37Lo_Wl(1!;6M^ItGQhqRPJ5h|u^2s? zW?>rcS-ZfS!*AJf5Ath8IfmK+EcuBQJ;eOEUbeVRE zX4%Wep8+-olvtL1e_i@P1zIGpV$EsRlYS@rv0kS|MEBZVc`t;B4STx5E~}99oOhAf-K2t*uNC)4E%<6GEO8s z8qjCze#Mp+MI*9FuO+kOBE@?lVmB*7H43#~?l3e^=+hck5q4;euQn zb+$iY^$}DYoYom;SwV4$D16D@fe>zr*E$4Yp>Q!2xG4qp5xyH2O}Ke4`q#Xl?~);G zPtA|=Ga@yDyuclNiV{txn#~)`;EPv5IC*bA8;}grKIz!Zj z4y+shFAl!P`ln@?$BrZ@_^c9m^j_s;_($Ex1FzhB#cl;V-INk_kjWG9BTjmCS{UXd z;&OnRpc(R`dE+qh(|SyaKldX2^8f@{A~$_+Y)TYsngvFwG5d?VV~@cT(t`c`KTJ+q ztekMy-lgSv{EPqM;)9?A-83Cv%=9RcM(|R1mpD`NpHf># z`gEkGLECB=d`eTW_F;z%KE)EryA0umXYc#goO@T~czK^{v@{kqSYdB)Dj1e6X_uz@ zWMKwhy#(?JnZDX6;o%ec-X8Sp>!31Z&=pNN^gxL`KlYH+jzixth11LbmTF1LXgzFK zJmS|j0COcujzm<~SAYs5&AD5&Hzu}$9qo-3Ol^O2OkDJP=_$)N%?h=O*8;lZa)S5f zRZ2F?$yJW-c{Hy97c~ysX>K^2$FcpmAmupNNz~ywxgo-Bg>$a_bYN8diG6JBNU&>x zRmpr;15DBA^Fp4|SS#7DH~|px#=jLFv031)%A%~_d=5++-XS1!EAQffk#Pu%Dzo{s zJF~<$)#G07hy_w{81G%pWs_J_ud9TY9QdSOno}HqAlDAf4JFLFw47(k=!?+^&`)V) zn~(|W2b%TzPLWG(LaZu*cc6)4g)4qSAmFI;nuHPGawSeLQCms+^AFQva(P=t=UvOe zwYT-TW_%hQ0VRTR1S%T;Ew2+_zQM4Kg%^&Z<)quEK!_yP3{t5~cJX|HYpM{WT+mUh zWiCV-?fd%J!LP$USg~XL0 z4>@ER)}E_E`%M1L0gSaO^Al2HR&>t~s)pDbHW=!h*Kuj< zW-=W-&GjBf6Ti&1vLY>T=1g}ng1uyFj*d}XJa#3{B2yo%v0sdj z^CFmdpENogQYDR+kIr*Ga6Fkq052H4z-gQYcqB2b|BI3$lR%NTA+_dwr>CHute_P5 z!}{_LoQ-eW+kXT2a&`XvmeFv!XXvHS?YY19??!>0$02d$AG!xk8fk2vKD7tq#0dD< z_VxwU%)^JHqAT_Lw4FsY!p_7U)iQjs{I6Q$J^wTWk~^B=UECHh4IUo*n@2sl%uIS)e%%e$-E_5Kz=wbcXlWv;w@kGlU{`)TB-{m z)Yk-8&7sUxfSvEI9KVu3(Bw4yM|m*UF-~u>@^IJpUFn#a=V`BGQ44b{w|6=>?B96G z7pK2Co>c7vw<*no|J6$H+BSxy@qgMoD&%nzK>YpF4+kcg&58TS&l;m6-+N3Mdt5zq5w~4Qu3^3bFS(d z0&_<9)$y@S?m&U*d1(hrHo>Y1&yZZqwp!|jla6}z@P&2(>RyrQXU-AfQWu=Kd@_*2 z5cwtFY1J3fglKX3>83_{k!}J6qFY>kUCb?ZnT>JwIJlNO^bM73uRMEK*aY^$vVPQZ zy{_o-h3`@T6iT{B$;sCEJYtFwh4CtTTuQmn1ZaA9!i8cuNAc4YR+XnCD5wvT%V>fALLur` z(NIT>K9rC@khshfe5tb$uAYz*B$=8raNqi-y*R zJiiCn`Z3tQY9FXj?@a)Q?bU#abLmst@EU^N5c;LQCYf$QeGwC`T5=%!#nk5>9b+^f zUK_~&tqsVo8fUxU#Q|l*TaDw+Nn<5cMD@YYm%3)-_DTd(eyYg2kF9H2e4GxGcroXH zV?BWe5l?~2o@*cVA@Yo$AyP)lWIoWD71#XN2+x;-NHtob))hAJB=2F)_Is{hVz)o2>|vX8MmRa##MyvZc>p<8`H zmGNX@vcZs9hzZ`iYv8vqXejL9NE>nXxd%E4PZ&P{PC24kWaB#(=|X!r$W!+m5qM}- zEEW3FJ6jIZSboXLon2!?WP4lQ860)mErv<%iewcss-i%whu>8A?+fzNSDFpJ@9t77LeP=mw> z*FTX512hgs$P*)?Z%_S82A7*T-x-Yvzl#*tuLmf5e;-p@<$9p$QX>zj)(_;jZ9iUl zeP<8jrQzEi^WTnV0?uZfMqfgfy24yqMQxl;x)5v{(8f?G^AA=Ks{|R-?GeCv9R1m% zRINHnkMwfxD~F=Q7wYO%tN1-RL(QT^KbedHDX0CzgVwg@+yS<(?#<~zf^^P zN!OQ=KgkX;gaOO670ruFS*@B{;5M9h{BMwYU%E^bWIQ$H(WsTZqntd4KV z)Mph}=qdF!V9e3DOU==Kwd5h-+Cm{;6~6vwA5>L~l}tPah=mNK>6y7O7lGv)z?I@3 zk8w)MbtD6H0B}?NKk9gmejq99VcXiSueANZK}CHg?DDDiX7!YH#&-(m@PF$hwBL;p z1_8;iZ3LR3W|j!1WIy!^o`0h2g(p4dZU$R`Mge(_jkPvzWf3U-aFq1A z-xdh$Zjy32HStqzWx?L?M?eY;NSo+_4eowCQQ|(lvAxv_GV>z(hj>>lChiE-cvjT% zW3ch^nM{UkJD{QvCclbHH(PG!vpFS#(Z4@$Jqg*|!;Sp`^pPXKd;wN9!1bV@dYZL0 z>mL&b`;K?F>ehTyO>UYYQfKhB(9qHp0EG`7ye@5H$@BJU8nYxSLAobm^gwbB`i&`| z_DnurH>+3dvhUqJZ)u8(gWVhIkE(9MV!(n%&P%fmBeT-~^titd==O-c=o}SUY038K zT)a~=BO2@AATD}Vn(!w(t1GXDDe)^rfv|}yO5!IQ)mqq1cQ(U1A|sjut#VB$j)4GKddz-Ob^qv|eLwNd zxF#u`GAqkHF~zQ)rXlgVCo`ctMkrqnkc92{lY|v&244)MVBFcEw0w&QUvsa2s+VQ| z!w0U>72V!iAV&k(h6aKvrLR2xE9ce8d|{KT{Y(3VKzB;2w;~k)NcjHA#L4E9RZJx% zuGfGuccWD$`5U0dY6Rbu5i+?}h=qt^nU-@Qudy_$&7Ia^^rC8g3$zNl<6Db@Ab3l1 z$y{qxBFIoH*)K&nO)^36&`8$ItCa5arg;E*XGff)@*&qoXumtv1J&*DaFk;Q8?4%~G6hw) zP7mX&UV5e;^{Ttz8CTtg0{nIvDU`BS7bY@Sz981UCml*Sns)wqs%)1&8p`=1khl7S=qtc4Q# zOA0`)gi_|UTMyxlRm|U-T;L)FD$e+usvqCo1^nUrAO8!o+%Fp?ZxW#D{WPu9fw9@gvoF?254xW^0KhjSIe0kN9+zraknmH*WBhrJ8v9CJ-JfP+c z-_st`85YCG9_X7$#1T5(m&`OrPkuzV90&B%JiTcpuT_D{-MEa1_u1hDe5mlV|R+;2VxwD+Aw zOMKTDQ4b5Uiy9|;u|^>7?QKuosIrgFT21E9;ifl7`*5OUOybJ;Wo|McW3UgTk`8tL zk~#Y_zg_#i@#H^NJxabS2oFHX=>J#s_RxP;$V<%B_@^+N>bv-;D9nEU2SJ&3_OK{R6mhbiC`G4kezKYlnrpyQ09K`{)e2Nt3n|}@E=uHfhL5m^JP6dLl z)!MP2j~aeu6hnqnj_*3t)UoG#^yCVaH&JbAgF1b?@|SQYb_Q=BZXX@3 z9wxF_;FGJ z3d8LdODkb??>QA1tum+?YXi^1Kj0#MviRfPN0N*73yHb={)OY0>Kz`DjKZS~aHc-@ zWu~R^xkH2t%@^vQwZG~6D!*cAeU-6ga#n1fP!5OkaY>^X#T5sCR|6G|I!0L%g8*uq z1c!ffYTfc0G<9>iXa}9O0sxpzHdGjA*vove`zXTbfwD!p>FfrdAk!RqY$Q%GQUwil zqK#WvRDKP-hj@`$q_yAX8(u6S^H9sT=S9aGq+!)wxVZUx>hk{h8r}0JYYx%PbV}$U zMaFfFeA^`e#BB|6b}%O6K0AkJ$C^u|HGts&(c^Ux|7r9L?;>Wu+kn`cW&bGM2tgb? zXm3t0JIC77h)~|Ee&=&F-<|Kw(GveD#p-gh0u;R9Ukct9 ze0|S9`p*)ZE4Lb_?Hlf|^rX+dB`_*_vyS+OUbxa3hKjm??Ic<`lJTEBb%E7__m!sH z-h5LrSLgpR)EX&QQo3}`7^)CCy=@|X?Tda`KKEn4%G?u>Q_Q(es}6n9{uVoe%_fN* zF_av~)XT#tfJn-yLJ6RNQnBVu@EfpuetO24LJghPzB=hE&!s zr+*Xi|CnR5M6iJ^i-2HH+Gi9P_OO3H^*6>dbag={GV~&f27uz(feGu2H?>L>uGf5* zlE{-(2#r9b^@TxFIb3%C&9XkH-+}w+4&d&4#GzAXJ#DuJJ{+=j>Fg~!C5pBRwJVKK zw)VizkMTcis?sgqfIflZH1PezD9+O0cGBogoGTe8 zI&g93GP_K4-3_)4e7FSxZeE;`v($1jAo|ui>0hJpt1r6as8$u&{@F&y{f82doD8ji zyXfL6rPj{3CfeMuZPZ~e#d6XXE;b%sY}lo>NF!L_M=`xLv-^$d=vu;`Otl|%5GlY< zz`-rlIz5o?>4lk~11BAr-OonzXj0E}{(M$a!2=A|xDamkt?9uYcgI^C{X7GH=$!$` zPfOTSLa>ofPG8|Dz<_RaK~ts%ztjqRkEOkA*U{yEK=!QLu*l-e^lBIZaY+cU=D!Ru zs}ZO^#4P*+!ebX3P^jXW!Y%L^$|;NbfKtuZ>q;Lt#x^3RggaEj^y;8BDQ_aZP9uDB&?^oUwlv(dGi__XsraWonLmK(JznQ_xa82AmN^y+({MCk z49v&^_zO|3-}k3p@;Zdk##%$!&;+j0e~h7U2vw!w8d-^zpXMA46nppU<3%$iz-~@+ zibwCmLur8)eB4|Eyw#IpU3pz8d=8fNvZ<+GN#4w9;0aNi^Z~mn$(H{-*)++1A&+rB z6ait96&09IgGsKFY^@I`lw%Dxb#cgSnzLq9jmh@7O?o3hC;oFDPQGF}F| z&3s%`QH0N^fb7qv)tQUgd4RZ1I7N9X8?`LEs*4;rf6NKrTaSUlVt%fd)tyo}pc4h<;j8AgI|+irn1scAA|2kgqe((zRb83NH99xA$%kAB4nm#M}e| zc5_NTa)$v)9d8;@z#BYZ+eD*ZD|1l6 z`PGA6)dJ){hPNDzr})TfY<;{DIbd2i4} zgQ4~OBn3L(=|jcg%awbj--M0+JW_p-&HNU=9?g#1#=Q!SF%a6m6a4(JK!ctHFi&vo z`Q`}b2VOs6{IcM4gQ4gQbmp1+I7NTJ2NNhFVP40NeBoIBIg9sA?28~dLI<{hDiELAZY}rYU zhz=qdAxjO@WXW(OrBuo|s!=k=5*JyrWG!+tvJA<-jG6Nrs@pwv?tSia@14KruX&zX z-uL_Yyp!L~>fs4D`^~rSLvyPiuw7}_zfv|0hI>S43*0K*jt7~>CiDPihVkomhC|!B z607$plPI06G!g%Q8>mqYH@E=au!yHxObK=Ze-iz!c4sjHm1C$b;b;ZjE(i1A_$$DQc`aT}Oa03nA%Y2#xKiMc_?H}eXP%ik=d zT63>5)N%vDItGyqWa2zYZ>ecM$C^8M$#%rWr3W3%sw26fs5{srIh(A^o^+{JF=P}YgphmrvU8#zj zHO=J$7@v8m<~c{zf|mgofTRg7ce8yrmD%cu$xoUG6ChIiIPKx=9}{Zs3Q@l3BrmuZ zrVk@5pGemEJ`y~%nuS!b>HLqvbEBOC4JTi~x8w@^WQ8iiI%*LoCps+3R#VThve`L$6X?U%N5OJl-nhks*KY%LyVnwf9H^4f;!W5Jv$2c% z5vGGkHJlfGRp(+Go0&0Bin3g#v;R)bKZlH+oy6NmnsK$-G#_fYG9+3u>7t%#)lYRj zq96u`MxWWA{|B3Aq47>rJaAuL6DbC_gueM2sPu6MI{fX=!)cFgt-{O!_ z=+HQlLJ{KkF8?IODg%r{QrF?h%AU2PK;M}nF?p&Bz}XtHa-clCRV2ep0_yF#)HU_C z$VR)0J(Xj)K9#fBPiA90w5EH3zZ=2R=GvWIU}2G;JSx;4%m_+9(h&A_chY@6RHSlS zXqSa+H#(cy`dqhm>EU_|F@@zNyk!P2y1sc^jIR)j|J4fFz0ay#Eq%4!b_qEVGxxFm zpXM`LF1fVxeRglPuYI1*v0IzYiOBfM^3;Od;VWwWiwM6ZM1HfLp7o^deZFzfV_o!d z0w1b(lp>QFO7K{BsASmrRNL%njX;fTZX=|472|NXo=G}{;}y_vXLGx5x2s1lPO%pv zzfe7-pE2+sH2oK4pb(B`I^?5rpFsEL{Gr3<1&!H*n!SeTXBNAc7rD0jsWIOjyn38u z#kMGFFB8{&T87$IBd5tzHc+BN1%Cw}cSe{!(~oD2P%j$;k8(WUjGW}$wtf9pP}s

kjg z$M%~n&KV%8bVw*eV``ql?mjaX+@wMen(~TU%O$NWHQNwj9QsYlNz6hu0dO7)Sv(B& zQGjtjrX|sO)>Fv?p{o<=E%CC}gu~;c2d;MIzK}Q5hog?FFHNkGJ$@6vBNI{#|GQ8E z#N785LgE`MH`Ia~bbrB%>T{N5)Ap}bo0*ODFQ)(kBhVUkcV0B^C1>hoEoKcVtiD%J z_-~^2D-NZ)#SD%pxnbyxLxfy6-Q`&q>gbe=XXr*;a%w;)TBl>x!zOaS-70$b@_^!> zr*;OgYice@5vl;x0Yuuj>Oj_a>Oi`ir2Z?B^UB$@nqDQ)%jAK`ryY_H!EvwM??Xo+i%nz}U6@IifKU%WEQYL8{c6dN!!0xbn0z z>OQdtLmA1E3x)MfyMbyelfx%!y8(reI=wgLDn9vJqzB~p>`&Vid%LPuEr&~xKsoSK z{jk|##O2o0qsNm=Bj68~^WRRV*|E?TD+7D}<+8C3NfC(lp7L;S+;I2UsiIv2_{2kiE^RgvWb&FP&)$6OD;GYI+EPu@f)24f zB>WMu_eVT5Y%`_NT;R2=L$@WJJ5|&?cxy#Rvy7n|!DuS)RXhzYlhOHPg`r#?PKkc% zEj#e%0mX5Jxd&ve!8rkyd8tOHWKj*>OF?c4*2F-LiJ05#O@#?IcoUlLcXBp=#{EqN z)8z*erPm1>)@{!Ik{#`J-!LlV(MNEw1M{c!nOPJ}#7m>xceE|myg()M2U zaE^T5f=?RAKgn{W0q;DdVtlumRJ8vloBhq%R72o=tvm)Mn;`?7T87+RlGXFP8a){Ki>{o z`Jqi;-GLXpH~(@klgq7!Ee)KQd7hpf0>QPPRs#&&k^eBc{7?$!{9(xX=BX^H7kP9i TyZf!%Il#l@AjYsz-!=LVob0nj literal 0 HcmV?d00001 From b7c426f4b1806f0d11f58a6ac8f11a10bf1407ea Mon Sep 17 00:00:00 2001 From: Kingshuk-Microsoft Date: Fri, 14 Nov 2025 17:11:12 +0530 Subject: [PATCH 2/5] Update Deployment Guide: Clarify VS Code Dev Containers section and add safe redeployment workflow --- docs/DeploymentGuide.md | 105 ++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 59 deletions(-) diff --git a/docs/DeploymentGuide.md b/docs/DeploymentGuide.md index 7638ab916..a626ab031 100644 --- a/docs/DeploymentGuide.md +++ b/docs/DeploymentGuide.md @@ -97,7 +97,7 @@ You can run this solution using GitHub Codespaces. The button will open a web-ba

- Deploy in VS Code + Deploy in VS Code Dev Containers ### VS Code Dev Containers @@ -215,43 +215,52 @@ For **production deployments**, the repository also provides [`main.waf.paramete --- +### 🔁 Safe Redeployment or Environment Update Workflow + + **[!IMPORTANT]** + > **Never run `azd init` again after your initial setup.** Doing so can overwrite your configuration and break your deployment. + + For subsequent deployments or environment changes, use one of the following safe approaches: + + #### Option 1: Create a New Environment (Recommended for Clean Redeployments) + + Create a fresh deployment environment with its own settings and resource group: + ```bash + azd env new + ``` + + #### Option 2: Update Your Current Environment Settings + + To modify settings (e.g., Azure region, resource suffix), edit the environment file directly: + ```bash + azd env set AZURE_LOCATION + ``` + ### 🔒 Security Considerations for Cosmos DB -This solution deploys Cosmos DB with security controls aligned to the **Azure Well-Architected Framework**. Access is **never public by default** — all access is explicitly controlled via **managed identities**, **role-based access control (RBAC)**, and **private networking**. - -#### 📌 Intended Access Level -- **Public network access**: **Disabled** (when `enablePrivateNetworking = true`, which is the default for WAF-aligned deployments). -- **Private access**: Enabled via **Private Endpoints** integrated with your virtual network. -- **No public write or read access** is allowed from the internet. - -> 💡 In sandbox mode (`main.parameters.json`), public access may be enabled for rapid testing. **Do not use sandbox settings in production.** - -#### ✅ Allowed Operations -| Operation | Allowed? | Details | -|------------------|----------|--------| -| Read (data) | ✅ Yes | Via assigned managed identity with **Cosmos DB Built-in Data Reader** or **Contributor** role | -| Write (data) | ✅ Yes | Via assigned managed identity with **Cosmos DB Built-in Data Contributor** role | -| Control-plane ops (create/delete DB) | ❌ No (for apps) | Only deployment principal (user or service principal running `azd up`) has control-plane access | - -#### 👥 Authorized Principals & Network Paths -- **Identity-based access**: - - The **application’s user-assigned managed identity** is granted fine-grained data-plane roles: - - `Cosmos DB Built-in Data Contributor` (for read + write) - - *Or* `Cosmos DB Built-in Data Reader` (if read-only) - - **No shared keys or connection strings** are used — all access uses **Azure AD authentication** (token-based). -- **Network-based access**: - - Traffic flows exclusively over **private endpoints** within your virtual network. - - **No public IPs** or internet-facing endpoints are exposed for Cosmos DB. - - Network Security Groups (NSGs) and Azure Firewall rules (if configured) further restrict lateral movement. - -#### ⚠️ Important Notes -- If you **disable private networking** (`enablePrivateNetworking = false`), the Cosmos DB account will allow public access — **not recommended for production**. -- Always review and **remove unnecessary role assignments** post-deployment. -- Audit access using **Azure Activity Logs** and **Cosmos DB diagnostic logs** (enabled by default in WAF mode). - -For more details, see: -- [Azure Cosmos DB Role-Based Access Control](https://learn.microsoft.com/en-us/azure/cosmos-db/how-to-setup-rbac) -- [Secure access to Cosmos DB using Private Endpoints](https://learn.microsoft.com/en-us/azure/cosmos-db/how-to-configure-private-endpoints) +This solution uses Azure AD-based RBAC (not account keys) for Cosmos DB data access. The level of network exposure depends on your deployment mode: + +✅ **WAF-Aligned Deployment** (enablePrivateNetworking = true) + +- Network access: Private only — Cosmos DB is not reachable from the public internet. + +- Access path: Application (Container Apps) → Private Endpoint in backendSubnet → Cosmos DB. + +- Authentication: Via user-assigned managed identity. + +- Role assigned: Cosmos DB Built-in Data Contributor → full read + write to all data. + +- Who can access: Only the app’s managed identity. No human users or public endpoints. + +⚠️ **Sandbox Deployment** (enablePrivateNetworking = false) + +- Network access: Public endpoint enabled — Cosmos DB accepts requests from the internet. + +- Authentication: Still Azure AD RBAC only (no account keys). + +- Role assigned: Same Cosmos DB Built-in Data Contributor → full read + write. + +- Who can access: Only the app’s managed identity — no additional users or groups are granted access. ### Deploying with AZD @@ -350,7 +359,7 @@ Check all resources in your environment's resource group > 💡 **Please refer:** - ![Image showing the post deployment scripts](../docs/images/macae-post-deployment.png) + ![Image showing the post deployment scripts](../docs/images/macae-post-deployment.png) 3. Once the deployment has completed successfully, open the [Azure Portal](https://portal.azure.com/), go to the deployed resource group, find the App Service, and get the app URL from `Default domain`. @@ -358,28 +367,6 @@ Check all resources in your environment's resource group 5. If you are done trying out the application, you can delete the resources by running `azd down`. -### 🔁 Safe Redeployment or Environment Update Workflow - - > [!IMPORTANT] - > **Never run `azd init` again after your initial setup.** Doing so can overwrite your configuration and break your deployment. - - For subsequent deployments or environment changes, use one of the following safe approaches: - - #### Option 1: Create a New Environment (Recommended for Clean Redeployments) - - Create a fresh deployment environment with its own settings and resource group: - ```bash - azd env new - ``` - - #### Option 2: Update Your Current Environment Settings - - To modify settings (e.g., Azure region, resource suffix), edit the environment file directly: - ```bash - azd env set AZURE_LOCATION - ``` - - ### 🛠️ Troubleshooting If you encounter any issues during the deployment process, please refer [troubleshooting](../docs/TroubleShootingSteps.md) document for detailed steps and solutions. From 16b4fca95b39d2d96dc2add42e417b99f9602635 Mon Sep 17 00:00:00 2001 From: Prajwal D C Date: Tue, 18 Nov 2025 22:53:42 +0530 Subject: [PATCH 3/5] docs: Refactored the deployment guide --- docs/DeploymentGuide.md | 177 ++++++++++++---------------------------- 1 file changed, 52 insertions(+), 125 deletions(-) diff --git a/docs/DeploymentGuide.md b/docs/DeploymentGuide.md index a626ab031..6df206d8b 100644 --- a/docs/DeploymentGuide.md +++ b/docs/DeploymentGuide.md @@ -4,6 +4,11 @@ To deploy this solution accelerator, ensure you have access to an [Azure subscription](https://azure.microsoft.com/free/) with the necessary permissions to create **resource groups, resources, app registrations, and assign roles at the resource group level**. This should include Contributor role at the subscription level and Role Based Access Control role on the subscription and/or resource group level. Follow the steps in [Azure Account Set Up](../docs/AzureAccountSetUp.md). +> **Note:** When you deploy this solution, you will automatically be granted access to interact with the Cosmos DB database that stores your application data. Specifically, you'll have permissions to: +> - Read database information and settings +> - Create, modify, and delete data storage containers (think of these as folders for organizing your data) +> - Add, view, update, and remove individual data records within those containers + Check the [Azure Products by Region](https://azure.microsoft.com/en-us/explore/global-infrastructure/products-by-region/?products=all®ions=all) page and select a **region** where the following services are available: - [Azure AI Foundry](https://learn.microsoft.com/en-us/azure/ai-foundry/) @@ -53,6 +58,43 @@ Upgrade commands by OS: ## Deployment Options & Steps +### Sandbox or WAF Aligned Deployment Options + +The [`infra`](../infra) folder of the Multi Agent Solution Accelerator contains the [`main.bicep`](../infra/main.bicep) Bicep script, which defines all Azure infrastructure components for this solution. + +By default, the `azd up` command uses the [`main.parameters.json`](../infra/main.parameters.json) file to deploy the solution. This file is pre-configured for a **sandbox environment** — ideal for development and proof-of-concept scenarios, with minimal security and cost controls for rapid iteration. + +For **production deployments**, the repository also provides [`main.waf.parameters.json`](../infra/main.waf.parameters.json), which applies a [Well-Architected Framework (WAF) aligned](https://learn.microsoft.com/en-us/azure/well-architected/) configuration. This option enables additional Azure best practices for reliability, security, cost optimization, operational excellence, and performance efficiency, such as: + + **Prerequisite** — Enable the Microsoft.Compute/EncryptionAtHost feature for every subscription (and region, if required) where you plan to deploy VMs or VM scale sets with `encryptionAtHost: true`. Repeat the registration steps below for each target subscription (and for each region when applicable). This step is required for **WAF-aligned** (production) deployments. + + Steps to enable the feature: + 1. Set the target subscription: + Run: az account set --subscription "<YourSubscriptionId>" + 2. Register the feature (one time per subscription): + Run: az feature register --name EncryptionAtHost --namespace Microsoft.Compute + 3. Wait until registration completes and shows "Registered": + Run: az feature show --name EncryptionAtHost --namespace Microsoft.Compute --query properties.state -o tsv + 4. Refresh the provider (if required): + Run: az provider register --namespace Microsoft.Compute + 5. Re-run the deployment after registration is complete. + + Note: Feature registration can take several minutes. Ensure the feature is registered before attempting deployments that require encryptionAtHost. + + Reference: Azure Host Encryption — https://learn.microsoft.com/azure/virtual-machines/disks-enable-host-based-encryption-portal?tabs=azure-cli + + - Enhanced network security (e.g., Network protection with private endpoints) + - Stricter access controls and managed identities + - Logging, monitoring, and diagnostics enabled by default + - Resource tagging and cost management recommendations + +**How to choose your deployment configuration:** + +* Use the default `main.parameters.json` file for a **sandbox/dev environment** +* For a **WAF-aligned, production-ready deployment**, copy the contents of `main.waf.parameters.json` into `main.parameters.json` before running `azd up` + +--- + ### VM Credentials Configuration By default, the solution sets the VM administrator username and password from environment variables. @@ -134,6 +176,8 @@ If you're not using one of the above options for opening the project, then you'l azd init -t microsoft/Multi-Agent-Custom-Automation-Engine-Solution-Accelerator/ ``` + > **⚠️ Warning:** The `azd init` command will download and initialize the project template. If you run this command in a directory that already contains project files, it may override your existing changes. Only run this command once when setting up the project for the first time. If you need to update an existing project, consider using `git pull` or manually downloading updates instead. + 3. Open the project folder in your terminal or editor. 4. Continue with the [deploying steps](#deploying-with-azd). @@ -178,90 +222,6 @@ To adjust quota settings, follow these [steps](./AzureGPTQuotaSettings.md).
-### Sandbox or WAF Aligned Deployment Options - -The [`infra`](../infra) folder of the Multi Agent Solution Accelerator contains the [`main.bicep`](../infra/main.bicep) Bicep script, which defines all Azure infrastructure components for this solution. - -By default, the `azd up` command uses the [`main.parameters.json`](../infra/main.parameters.json) file to deploy the solution. This file is pre-configured for a **sandbox environment** — ideal for development and proof-of-concept scenarios, with minimal security and cost controls for rapid iteration. - -For **production deployments**, the repository also provides [`main.waf.parameters.json`](../infra/main.waf.parameters.json), which applies a [Well-Architected Framework (WAF) aligned](https://learn.microsoft.com/en-us/azure/well-architected/) configuration. This option enables additional Azure best practices for reliability, security, cost optimization, operational excellence, and performance efficiency, such as: - - **Prerequisite** — Enable the Microsoft.Compute/EncryptionAtHost feature for every subscription (and region, if required) where you plan to deploy VMs or VM scale sets with `encryptionAtHost: true`. Repeat the registration steps below for each target subscription (and for each region when applicable). This step is required for **WAF-aligned** (production) deployments. - - Steps to enable the feature: - 1. Set the target subscription: - Run: az account set --subscription "<YourSubscriptionId>" - 2. Register the feature (one time per subscription): - Run: az feature register --name EncryptionAtHost --namespace Microsoft.Compute - 3. Wait until registration completes and shows "Registered": - Run: az feature show --name EncryptionAtHost --namespace Microsoft.Compute --query properties.state -o tsv - 4. Refresh the provider (if required): - Run: az provider register --namespace Microsoft.Compute - 5. Re-run the deployment after registration is complete. - - Note: Feature registration can take several minutes. Ensure the feature is registered before attempting deployments that require encryptionAtHost. - - Reference: Azure Host Encryption — https://learn.microsoft.com/azure/virtual-machines/disks-enable-host-based-encryption-portal?tabs=azure-cli - - - Enhanced network security (e.g., Network protection with private endpoints) - - Stricter access controls and managed identities - - Logging, monitoring, and diagnostics enabled by default - - Resource tagging and cost management recommendations - -**How to choose your deployment configuration:** - -* Use the default `main.parameters.json` file for a **sandbox/dev environment** -* For a **WAF-aligned, production-ready deployment**, copy the contents of `main.waf.parameters.json` into `main.parameters.json` before running `azd up` - ---- - -### 🔁 Safe Redeployment or Environment Update Workflow - - **[!IMPORTANT]** - > **Never run `azd init` again after your initial setup.** Doing so can overwrite your configuration and break your deployment. - - For subsequent deployments or environment changes, use one of the following safe approaches: - - #### Option 1: Create a New Environment (Recommended for Clean Redeployments) - - Create a fresh deployment environment with its own settings and resource group: - ```bash - azd env new - ``` - - #### Option 2: Update Your Current Environment Settings - - To modify settings (e.g., Azure region, resource suffix), edit the environment file directly: - ```bash - azd env set AZURE_LOCATION - ``` - -### 🔒 Security Considerations for Cosmos DB - -This solution uses Azure AD-based RBAC (not account keys) for Cosmos DB data access. The level of network exposure depends on your deployment mode: - -✅ **WAF-Aligned Deployment** (enablePrivateNetworking = true) - -- Network access: Private only — Cosmos DB is not reachable from the public internet. - -- Access path: Application (Container Apps) → Private Endpoint in backendSubnet → Cosmos DB. - -- Authentication: Via user-assigned managed identity. - -- Role assigned: Cosmos DB Built-in Data Contributor → full read + write to all data. - -- Who can access: Only the app’s managed identity. No human users or public endpoints. - -⚠️ **Sandbox Deployment** (enablePrivateNetworking = false) - -- Network access: Public endpoint enabled — Cosmos DB accepts requests from the internet. - -- Authentication: Still Azure AD RBAC only (no account keys). - -- Role assigned: Same Cosmos DB Built-in Data Contributor → full read + write. - -- Who can access: Only the app’s managed identity — no additional users or groups are granted access. - ### Deploying with AZD Once you've opened the project in [Codespaces](#github-codespaces), [Dev Containers](#vs-code-dev-containers), or [locally](#local-environment), you can deploy it to Azure by following these steps: @@ -290,38 +250,9 @@ Once you've opened the project in [Codespaces](#github-codespaces), [Dev Contain - This deployment will take _4-6 minutes_ to provision the resources in your account and set up the solution with sample data. - If you encounter an error or timeout during deployment, changing the location may help, as there could be availability constraints for the resources. + - **Upon successful completion**, you will see a success message indicating that all resources have been deployed, along with the application URL and next steps for uploading team configurations and sample data. -### ✅ Confirm Your Deployment Environment - -After running `azd up`, verify that your environment matches your intended configuration: - -- **Sandbox**: - - Uses `main.parameters.json` - - Public endpoints may be enabled (e.g., Cosmos DB, Key Vault) - - Minimal security controls for rapid iteration - - ![Image showing the resources created in Sandbox deployment](../docs/images/macae-non-waf.png) - -- **WAF-Aligned**: - - Uses `main.waf.parameters.json` (copied into `main.parameters.json` before deployment) - - All resources deployed with **private endpoints**, **managed identities**, and **RBAC** - - Public network access is **disabled** for sensitive services (Cosmos DB, Key Vault, etc.) - - ![Image showing the resources created in WAF deployment](../docs/images/macae-waf.png) - -Check your active environment settings: - ```powershell - azd env get-values - ``` - -Check all resources in your environment's resource group - ```powershell - az resource list --resource-group --output table - ``` - -### Post Deployment Steps - -1. After deployment completes, you can upload Team Configurations using command printed in the terminal. The command will look like one of the following. Run the appropriate command for your shell from the project root: +5. Upload Team Configurations using command printed in the terminal. The command will look like one of the following. Run the appropriate command for your shell from the project root: - **For Bash (Linux/macOS/WSL):** ```bash @@ -333,7 +264,7 @@ Check all resources in your environment's resource group infra\scripts\Upload-Team-Config.ps1 ``` -2. After deployment completes, you can index Sample Data into Search Service using command printed in the terminal. The command will look like one of the following. Run the appropriate command for your shell from the project root: +6. Index Sample Data into Search Service using command printed in the terminal. The command will look like one of the following. Run the appropriate command for your shell from the project root: - **For Bash (Linux/macOS/WSL):** ```bash @@ -345,7 +276,7 @@ Check all resources in your environment's resource group infra\scripts\Process-Sample-Data.ps1 ``` ---> **To upload team configurations and index sample data in one step**, run the appropriate command for your shell from the project root: +7. **[Alternative]** To upload team configurations and index sample data in one step, run the appropriate command for your shell from the project root: - **For Bash (Linux/macOS/WSL):** ```bash @@ -357,15 +288,11 @@ Check all resources in your environment's resource group infra\scripts\Team-Config-And-Data.ps1 ``` -> 💡 **Please refer:** - - ![Image showing the post deployment scripts](../docs/images/macae-post-deployment.png) - -3. Once the deployment has completed successfully, open the [Azure Portal](https://portal.azure.com/), go to the deployed resource group, find the App Service, and get the app URL from `Default domain`. +8. **[Optional]** Set up authentication for your web application by following the steps in [Set Up Authentication in Azure App Service](../docs/azure_app_service_auth_setup.md). -4. When Deployment is complete, follow steps in [Set Up Authentication in Azure App Service](../docs/azure_app_service_auth_setup.md) to add app authentication to your web app running on Azure App Service +9. **Access your application:** Open the [Azure Portal](https://portal.azure.com/), go to your resource group, find the App Service that runs the frontend application, and get the application URL from the **Default domain** field. -5. If you are done trying out the application, you can delete the resources by running `azd down`. +10. **Clean up resources:** If you are done trying out the application, you can delete all resources by running `azd down`. ### 🛠️ Troubleshooting If you encounter any issues during the deployment process, please refer [troubleshooting](../docs/TroubleShootingSteps.md) document for detailed steps and solutions. @@ -580,4 +507,4 @@ To debug the python server in the frontend directory (frontend_server.py) and re ## Next Steps Now that you've completed your deployment, you can start using the solution. -To help you get started, here are some [Sample Questions](./SampleQuestions.md) you can follow to try it out. +To help you get started, here are some [Sample Questions](./SampleQuestions.md) you can follow to try it out. \ No newline at end of file From 62bd51913918396e117f1577baa29b232ed62dae Mon Sep 17 00:00:00 2001 From: Prajwal D C Date: Tue, 18 Nov 2025 23:11:21 +0530 Subject: [PATCH 4/5] docs: Updated links & reordered steps --- docs/DeploymentGuide.md | 137 +++++++++++++++++++++------------------- 1 file changed, 71 insertions(+), 66 deletions(-) diff --git a/docs/DeploymentGuide.md b/docs/DeploymentGuide.md index 6df206d8b..183600d0d 100644 --- a/docs/DeploymentGuide.md +++ b/docs/DeploymentGuide.md @@ -58,62 +58,6 @@ Upgrade commands by OS: ## Deployment Options & Steps -### Sandbox or WAF Aligned Deployment Options - -The [`infra`](../infra) folder of the Multi Agent Solution Accelerator contains the [`main.bicep`](../infra/main.bicep) Bicep script, which defines all Azure infrastructure components for this solution. - -By default, the `azd up` command uses the [`main.parameters.json`](../infra/main.parameters.json) file to deploy the solution. This file is pre-configured for a **sandbox environment** — ideal for development and proof-of-concept scenarios, with minimal security and cost controls for rapid iteration. - -For **production deployments**, the repository also provides [`main.waf.parameters.json`](../infra/main.waf.parameters.json), which applies a [Well-Architected Framework (WAF) aligned](https://learn.microsoft.com/en-us/azure/well-architected/) configuration. This option enables additional Azure best practices for reliability, security, cost optimization, operational excellence, and performance efficiency, such as: - - **Prerequisite** — Enable the Microsoft.Compute/EncryptionAtHost feature for every subscription (and region, if required) where you plan to deploy VMs or VM scale sets with `encryptionAtHost: true`. Repeat the registration steps below for each target subscription (and for each region when applicable). This step is required for **WAF-aligned** (production) deployments. - - Steps to enable the feature: - 1. Set the target subscription: - Run: az account set --subscription "<YourSubscriptionId>" - 2. Register the feature (one time per subscription): - Run: az feature register --name EncryptionAtHost --namespace Microsoft.Compute - 3. Wait until registration completes and shows "Registered": - Run: az feature show --name EncryptionAtHost --namespace Microsoft.Compute --query properties.state -o tsv - 4. Refresh the provider (if required): - Run: az provider register --namespace Microsoft.Compute - 5. Re-run the deployment after registration is complete. - - Note: Feature registration can take several minutes. Ensure the feature is registered before attempting deployments that require encryptionAtHost. - - Reference: Azure Host Encryption — https://learn.microsoft.com/azure/virtual-machines/disks-enable-host-based-encryption-portal?tabs=azure-cli - - - Enhanced network security (e.g., Network protection with private endpoints) - - Stricter access controls and managed identities - - Logging, monitoring, and diagnostics enabled by default - - Resource tagging and cost management recommendations - -**How to choose your deployment configuration:** - -* Use the default `main.parameters.json` file for a **sandbox/dev environment** -* For a **WAF-aligned, production-ready deployment**, copy the contents of `main.waf.parameters.json` into `main.parameters.json` before running `azd up` - ---- - -### VM Credentials Configuration - -By default, the solution sets the VM administrator username and password from environment variables. -If you do not configure these values, a randomly generated GUID will be used for both the username and password. - -To set your own VM credentials before deployment, use: - -```sh -azd env set AZURE_ENV_VM_ADMIN_USERNAME -azd env set AZURE_ENV_VM_ADMIN_PASSWORD -``` - -> [!TIP] -> Always review and adjust parameter values (such as region, capacity, security settings and log analytics workspace configuration) to match your organization’s requirements before deploying. For production, ensure you have sufficient quota and follow the principle of least privilege for all identities and role assignments. - - -> [!IMPORTANT] -> The WAF-aligned configuration is under active development. More Azure Well-Architected recommendations will be added in future updates. - ### Deployment Steps Pick from the options below to see step-by-step instructions for GitHub Codespaces, VS Code Dev Containers, Local Environments, and Bicep deployments. @@ -134,7 +78,7 @@ You can run this solution using GitHub Codespaces. The button will open a web-ba 2. Accept the default values on the create Codespaces page. 3. Open a terminal window if it is not already open. -4. Continue with the [deploying steps](#deploying-with-azd). +4. Continue with the [deployment options](#deployment-options). @@ -151,7 +95,7 @@ You can run this solution in VS Code Dev Containers, which will open the project [![Open in Dev Containers](https://img.shields.io/static/v1?style=for-the-badge&label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/microsoft/Multi-Agent-Custom-Automation-Engine-Solution-Accelerator) 3. In the VS Code window that opens, once the project files show up (this may take several minutes), open a terminal window. -4. Continue with the [deploying steps](#deploying-with-azd). +4. Continue with the [deployment options](#deployment-options). @@ -179,11 +123,66 @@ If you're not using one of the above options for opening the project, then you'l > **⚠️ Warning:** The `azd init` command will download and initialize the project template. If you run this command in a directory that already contains project files, it may override your existing changes. Only run this command once when setting up the project for the first time. If you need to update an existing project, consider using `git pull` or manually downloading updates instead. 3. Open the project folder in your terminal or editor. -4. Continue with the [deploying steps](#deploying-with-azd). +4. Continue with the [deployment options](#deployment-options). -
+### Deployment Options + +The [`infra`](../infra) folder of the Multi Agent Solution Accelerator contains the [`main.bicep`](../infra/main.bicep) Bicep script, which defines all Azure infrastructure components for this solution. + +By default, the `azd up` command uses the [`main.parameters.json`](../infra/main.parameters.json) file to deploy the solution. This file is pre-configured for a **sandbox environment** — ideal for development and proof-of-concept scenarios, with minimal security and cost controls for rapid iteration. + +For **production deployments**, the repository also provides [`main.waf.parameters.json`](../infra/main.waf.parameters.json), which applies a [Well-Architected Framework (WAF) aligned](https://learn.microsoft.com/en-us/azure/well-architected/) configuration. This option enables additional Azure best practices for reliability, security, cost optimization, operational excellence, and performance efficiency, such as: + + **Prerequisite** — Enable the Microsoft.Compute/EncryptionAtHost feature for every subscription (and region, if required) where you plan to deploy VMs or VM scale sets with `encryptionAtHost: true`. Repeat the registration steps below for each target subscription (and for each region when applicable). This step is required for **WAF-aligned** (production) deployments. + + Steps to enable the feature: + 1. Set the target subscription: + Run: az account set --subscription "<YourSubscriptionId>" + 2. Register the feature (one time per subscription): + Run: az feature register --name EncryptionAtHost --namespace Microsoft.Compute + 3. Wait until registration completes and shows "Registered": + Run: az feature show --name EncryptionAtHost --namespace Microsoft.Compute --query properties.state -o tsv + 4. Refresh the provider (if required): + Run: az provider register --namespace Microsoft.Compute + 5. Re-run the deployment after registration is complete. + + Note: Feature registration can take several minutes. Ensure the feature is registered before attempting deployments that require encryptionAtHost. + + Reference: Azure Host Encryption — https://learn.microsoft.com/azure/virtual-machines/disks-enable-host-based-encryption-portal?tabs=azure-cli + + - Enhanced network security (e.g., Network protection with private endpoints) + - Stricter access controls and managed identities + - Logging, monitoring, and diagnostics enabled by default + - Resource tagging and cost management recommendations + +**How to choose your deployment configuration:** + +* Use the default `main.parameters.json` file for a **sandbox/dev environment** +* For a **WAF-aligned, production-ready deployment**, copy the contents of `main.waf.parameters.json` into `main.parameters.json` before running `azd up` + +--- + +### VM Credentials Configuration + +By default, the solution sets the VM administrator username and password from environment variables. +If you do not configure these values, a randomly generated GUID will be used for both the username and password. + +To set your own VM credentials before deployment, use: + +```sh +azd env set AZURE_ENV_VM_ADMIN_USERNAME +azd env set AZURE_ENV_VM_ADMIN_PASSWORD +``` + +> [!TIP] +> Always review and adjust parameter values (such as region, capacity, security settings and log analytics workspace configuration) to match your organization’s requirements before deploying. For production, ensure you have sufficient quota and follow the principle of least privilege for all identities and role assignments. + + +> [!IMPORTANT] +> The WAF-aligned configuration is under active development. More Azure Well-Architected recommendations will be added in future updates. + Consider the following settings during your deployment to modify specific settings: @@ -292,11 +291,21 @@ Once you've opened the project in [Codespaces](#github-codespaces), [Dev Contain 9. **Access your application:** Open the [Azure Portal](https://portal.azure.com/), go to your resource group, find the App Service that runs the frontend application, and get the application URL from the **Default domain** field. -10. **Clean up resources:** If you are done trying out the application, you can delete all resources by running `azd down`. - ### 🛠️ Troubleshooting If you encounter any issues during the deployment process, please refer [troubleshooting](../docs/TroubleShootingSteps.md) document for detailed steps and solutions. + ## Next Steps +Now that you've completed your deployment, you can start using the solution. + +To help you get started, here are some [Sample Questions](./SampleQuestions.md) you can follow to try it out. + +## Clean Up Resources +If you are done trying out the application, you can delete all resources by running: + +```shell +azd down +``` + # Local setup > **Note for macOS Developers**: If you are using macOS on Apple Silicon (ARM64) the DevContainer will **not** work. This is due to a limitation with the Azure Functions Core Tools (see [here](https://github.com/Azure/azure-functions-core-tools/issues/3112)). @@ -504,7 +513,3 @@ To debug the python server in the frontend directory (frontend_server.py) and re "jinja": true } ``` -## Next Steps -Now that you've completed your deployment, you can start using the solution. - -To help you get started, here are some [Sample Questions](./SampleQuestions.md) you can follow to try it out. \ No newline at end of file From 926b02a6e93ae4481f9939ef4ad09d2da73b4e2b Mon Sep 17 00:00:00 2001 From: Prajwal D C Date: Wed, 19 Nov 2025 22:01:30 +0530 Subject: [PATCH 5/5] docs: Added failure related instructions --- docs/DeploymentGuide.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/DeploymentGuide.md b/docs/DeploymentGuide.md index 183600d0d..e0a013440 100644 --- a/docs/DeploymentGuide.md +++ b/docs/DeploymentGuide.md @@ -225,6 +225,27 @@ To adjust quota settings, follow these [steps](./AzureGPTQuotaSettings.md). Once you've opened the project in [Codespaces](#github-codespaces), [Dev Containers](#vs-code-dev-containers), or [locally](#local-environment), you can deploy it to Azure by following these steps: +#### Important: Environment Management for Redeployments + +> **⚠️ Critical:** If you're redeploying or have deployed this solution before, you **must** create a fresh environment to avoid conflicts and deployment failures. + +**Choose one of the following before deployment:** + +**Option A: Create a completely new environment (Recommended)** +```shell +azd env new +``` + +**Option B: Reinitialize in a new directory** +```shell +# Navigate to a new directory +cd ../my-new-deployment +azd init -t microsoft/Multi-Agent-Custom-Automation-Engine-Solution-Accelerator/ +``` + +> **💡 Why is this needed?** Azure resources maintain state information tied to your environment. Reusing an old environment can cause naming conflicts, permission issues, and deployment failures. + +#### Deployment the solution 1. Login to Azure: ```shell