From 5ae7ffbff59022d156b94a72597f41381c95a218 Mon Sep 17 00:00:00 2001 From: Peiwen Gao <111329184+PeiwenGaoMS@users.noreply.github.com> Date: Mon, 18 Sep 2023 17:38:35 +0800 Subject: [PATCH] [Example] Add example flow for activate config (#525) # Description Add example flow for `activate config`. (if-else scenario) - if pass content safety check ![image](https://github.com/microsoft/promptflow/assets/111329184/c224dd18-e795-4e1f-9a6b-190f42172ce1) - else ![image](https://github.com/microsoft/promptflow/assets/111329184/f2cea225-a020-41fc-897b-1a210ec6ab53) # All Promptflow Contribution checklist: - [x] **The pull request does not introduce [breaking changes]** - [ ] **CHANGELOG is updated for new features, bug fixes or other significant changes.** - [x] **I have read the [contribution guidelines](../CONTRIBUTING.md).** ## General Guidelines and Best Practices - [x] Title of the pull request is clear and informative. - [x] There are a small number of commits, each of which have an informative message. This means that previously merged commits do not appear in the history of the PR. For more information on cleaning up the commits in your PR, [see this page](https://github.com/Azure/azure-powershell/blob/master/documentation/development-docs/cleaning-up-commits.md). ### Testing Guidelines - [x] Pull request includes test coverage for the included changes. --------- Co-authored-by: Peiwen Gao --- ..._standard_conditional_flow_for_if_else.yml | 89 ++++++++++++++++++ examples/README.md | 1 + .../conditional-flow-for-if-else/README.md | 57 +++++++++++ .../content_safety_check.py | 8 ++ .../content_safety_check_failed.png | Bin 0 -> 39587 bytes .../content_safety_check_passed.png | Bin 0 -> 39590 bytes .../conditional-flow-for-if-else/data.jsonl | 2 + .../default_result.py | 6 ++ .../flow.dag.yaml | 47 +++++++++ .../generate_result.py | 9 ++ .../llm_result.py | 10 ++ .../requirements.txt | 2 + 12 files changed, 231 insertions(+) create mode 100644 .github/workflows/samples_flows_standard_conditional_flow_for_if_else.yml create mode 100644 examples/flows/standard/conditional-flow-for-if-else/README.md create mode 100644 examples/flows/standard/conditional-flow-for-if-else/content_safety_check.py create mode 100644 examples/flows/standard/conditional-flow-for-if-else/content_safety_check_failed.png create mode 100644 examples/flows/standard/conditional-flow-for-if-else/content_safety_check_passed.png create mode 100644 examples/flows/standard/conditional-flow-for-if-else/data.jsonl create mode 100644 examples/flows/standard/conditional-flow-for-if-else/default_result.py create mode 100644 examples/flows/standard/conditional-flow-for-if-else/flow.dag.yaml create mode 100644 examples/flows/standard/conditional-flow-for-if-else/generate_result.py create mode 100644 examples/flows/standard/conditional-flow-for-if-else/llm_result.py create mode 100644 examples/flows/standard/conditional-flow-for-if-else/requirements.txt diff --git a/.github/workflows/samples_flows_standard_conditional_flow_for_if_else.yml b/.github/workflows/samples_flows_standard_conditional_flow_for_if_else.yml new file mode 100644 index 00000000000..de28a68a527 --- /dev/null +++ b/.github/workflows/samples_flows_standard_conditional_flow_for_if_else.yml @@ -0,0 +1,89 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: samples_flows_standard_conditional_flow_for_if_else +on: + schedule: + - cron: "8 21 * * *" # Every day starting at 5:8 BJT + pull_request: + branches: [ main ] + paths: [ examples/flows/standard/conditional-flow-for-if-else/**, examples/*requirements.txt, .github/workflows/samples_flows_standard_conditional_flow_for_if_else.yml ] + workflow_dispatch: + +jobs: + samples_readme_ci: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Setup Python 3.9 environment + uses: actions/setup-python@v4 + with: + python-version: "3.9" + - name: Generate config.json + run: echo ${{ secrets.TEST_WORKSPACE_CONFIG_JSON }} > ${{ github.workspace }}/examples/config.json + - name: Prepare requirements + working-directory: examples + run: | + if [[ -e requirements.txt ]]; then + python -m pip install --upgrade pip + pip install -r requirements.txt + fi + - name: Prepare dev requirements + working-directory: examples + run: | + python -m pip install --upgrade pip + pip install -r dev_requirements.txt + - name: Refine .env file + working-directory: examples/flows/standard/conditional-flow-for-if-else + run: | + AOAI_API_KEY=${{ secrets.AOAI_API_KEY_TEST }} + AOAI_API_ENDPOINT=${{ secrets.AOAI_API_ENDPOINT_TEST }} + AOAI_API_ENDPOINT=$(echo ${AOAI_API_ENDPOINT//\//\\/}) + if [[ -e .env.example ]]; then + echo "env replacement" + sed -i -e "s//$AOAI_API_KEY/g" -e "s//$AOAI_API_ENDPOINT/g" .env.example + mv .env.example .env + fi + - name: Create run.yml + working-directory: examples/flows/standard/conditional-flow-for-if-else + run: | + gpt_base=${{ secrets.AOAI_API_ENDPOINT_TEST }} + gpt_base=$(echo ${gpt_base//\//\\/}) + if [[ -e run.yml ]]; then + sed -i -e "s/\${azure_open_ai_connection.api_key}/${{ secrets.AOAI_API_KEY_TEST }}/g" -e "s/\${azure_open_ai_connection.api_base}/$gpt_base/g" run.yml + fi + - name: Azure Login + uses: azure/login@v1 + with: + creds: ${{ secrets.AZURE_CREDENTIALS }} + - name: Extract Steps examples/flows/standard/conditional-flow-for-if-else/README.md + working-directory: ${{ github.workspace }} + run: | + python scripts/readme/extract_steps_from_readme.py -f examples/flows/standard/conditional-flow-for-if-else/README.md -o examples/flows/standard/conditional-flow-for-if-else + - name: Cat script + working-directory: examples/flows/standard/conditional-flow-for-if-else + run: | + cat bash_script.sh + - name: Run scripts + working-directory: examples/flows/standard/conditional-flow-for-if-else + run: | + export aoai_api_key=${{secrets.AOAI_API_KEY_TEST }} + export aoai_api_endpoint=${{ secrets.AOAI_API_ENDPOINT_TEST }} + export test_workspace_sub_id=${{ secrets.TEST_WORKSPACE_SUB_ID }} + export test_workspace_rg=${{ secrets.TEST_WORKSPACE_RG }} + export test_workspace_name=${{ secrets.TEST_WORKSPACE_NAME }} + bash bash_script.sh + - name: Pip List for Debug + if : ${{ always() }} + working-directory: examples/flows/standard/conditional-flow-for-if-else + run: | + pip list + - name: Upload artifact + if: ${{ always() }} + uses: actions/upload-artifact@v3 + with: + name: artifact + path: examples/flows/standard/conditional-flow-for-if-else/bash_script.sh \ No newline at end of file diff --git a/examples/README.md b/examples/README.md index 2b6928d41b0..1f7332277c3 100644 --- a/examples/README.md +++ b/examples/README.md @@ -41,6 +41,7 @@ | [basic](flows/standard/basic/README.md) | [![samples_flows_standard_basic](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_basic.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_basic.yml) | A basic standard flow using custom python tool that calls Azure OpenAI with connection info stored in environment variables | | [basic-with-builtin-llm](flows/standard/basic-with-builtin-llm/README.md) | [![samples_flows_standard_basic_with_builtin_llm](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_basic_with_builtin_llm.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_basic_with_builtin_llm.yml) | A basic standard flow that calls Azure OpenAI with builtin llm tool | | [basic-with-connection](flows/standard/basic-with-connection/README.md) | [![samples_flows_standard_basic_with_connection](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_basic_with_connection.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_basic_with_connection.yml) | A basic standard flow that using custom python tool calls Azure OpenAI with connection info stored in custom connection | +| [conditional-flow-for-if-else](flows/standard/conditional-flow-for-if-else/README.md) | [![samples_flows_standard_conditional_flow_for_if_else](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_conditional_flow_for_if_else.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_conditional_flow_for_if_else.yml) | This example is a conditonal flow for if-else scenario | | [customer-intent-extraction](flows/standard/customer-intent-extraction/README.md) | [![samples_flows_standard_customer_intent_extraction](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_customer_intent_extraction.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_customer_intent_extraction.yml) | This sample is using OpenAI chat model(ChatGPT/GPT4) to identify customer intent from customer's question | | [flow-with-additional-includes](flows/standard/flow-with-additional-includes/README.md) | [![samples_flows_standard_flow_with_additional_includes](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_flow_with_additional_includes.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_flow_with_additional_includes.yml) | User sometimes need to reference some common files or folders, this sample demos how to solve the problem using additional_includes | | [flow-with-symlinks](flows/standard/flow-with-symlinks/README.md) | [![samples_flows_standard_flow_with_symlinks](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_flow_with_symlinks.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_flow_with_symlinks.yml) | User sometimes need to reference some common files or folders, this sample demos how to solve the problem using symlinks | diff --git a/examples/flows/standard/conditional-flow-for-if-else/README.md b/examples/flows/standard/conditional-flow-for-if-else/README.md new file mode 100644 index 00000000000..da887fbe644 --- /dev/null +++ b/examples/flows/standard/conditional-flow-for-if-else/README.md @@ -0,0 +1,57 @@ +# Conditional flow for if-else scenario + +This example is a conditonal flow for if-else scenario. + +In this flow, it checks if an input query passes content safety check. If it's denied, we'll return a default response; otherwise, we'll call LLM to get a response and then summarize the final results. + +The following are two execution situations of this flow: +- if input query passes content safety check: + ![content_safety_check_passed](content_safety_check_passed.png) +- else: + ![content_safety_check_failed](content_safety_check_failed.png) + +**Notice**: The `content_safety_check` and `llm_result` node in this flow are dummy nodes that do not actually use the conten safety tool and LLM tool. You can replace them with the real ones. Learn more: [LLM Tool](https://microsoft.github.io/promptflow/reference/tools-reference/llm-tool.html) + +By following this example, you will learn how to create a conditional flow using the `activate config`. + +## Prerequisites + +Install promptflow sdk and other dependencies: +```bash +pip install -r requirements.txt +``` + +## Run flow + +- Test flow +```bash +# test with default input value in flow.dag.yaml +pf flow test --flow . + +# test with flow inputs +pf flow test --flow . --inputs question="What is Prompt flow?" +``` + +- Create run with multiple lines of data +```bash +# create a random run name +run_name="conditional_flow_for_if_else_"$(openssl rand -hex 12) + +# create run +pf run create --flow . --data ./data.jsonl --stream --name $run_name +``` + +- List and show run metadata +```bash +# list created run +pf run list + +# show specific run detail +pf run show --name $run_name + +# show output +pf run show-details --name $run_name + +# visualize run in browser +pf run visualize --name $run_name +``` diff --git a/examples/flows/standard/conditional-flow-for-if-else/content_safety_check.py b/examples/flows/standard/conditional-flow-for-if-else/content_safety_check.py new file mode 100644 index 00000000000..79516e69fab --- /dev/null +++ b/examples/flows/standard/conditional-flow-for-if-else/content_safety_check.py @@ -0,0 +1,8 @@ +from promptflow import tool +import random + + +@tool +def content_safety_check(text: str) -> str: + # You can use a content safety node to replace this tool. + return random.choice([True, False]) diff --git a/examples/flows/standard/conditional-flow-for-if-else/content_safety_check_failed.png b/examples/flows/standard/conditional-flow-for-if-else/content_safety_check_failed.png new file mode 100644 index 0000000000000000000000000000000000000000..7195bf8e2e33310caf65fb6905b8128f816352fe GIT binary patch literal 39587 zcmZs@byQVf)GmAgX=$WW>25?yk&;p*r3C@$2I&@QC8SkAKm??_MWjJWx=T{J<4*j2 z?|0un?it&0#yIZ1*IIMU`OJD2p-)ugaIh$_5C{a$BYEkk2n3240)ZTcfegR6*>{-2 z7pA@ZGbaQB_s8`=qbB8O&M=J{? zbga%Qyfc5+R0vt>WtiofJ=SjNy;&ODbTg>vwW8mB?d7Ak$OVibm)YLk3o-B0Ci|ol zKFi&uRL|bIL?x!{DI+R+f;X?f5j-MsLf7A-egkOmWrRLCii_ZJ+T7eEs3b#=KEchotTb)OGvoMtaWU@m zB5_3^0^x@;Z*;&in((zV?7Y^r!s$UG75@Q=c_ifhYu}vPLor9mk53nx|JX* z8tt>^^6;UzhwRVf6k9V7dS#No@hhal% z+rpGX8+BS*TF~3e%S-)Q*R*>smLuQv#b~127UJXLcxKKz*$X#j8b6+liq&L~tP9&s zpO2Y;G&MEl?aLooPg*HEHvqMC2hEMj&C6RKEjBUqy>L-ei@i_x>TI*J$8fyf^C&Y~ zV!Xd!_36{y9LWodfZWIFPmWJkKH80yWPSd;*ynr6Prq0`V&HkQlpuQVp7TBZCr^HP zoio6igYe^o?A2jz(GsUD30+H$)o#=7=1xwf?*8AqxEnc$u`ubS((OB97~|vP2R+OJ zo9|;_-negq28;W7ia|Hzi zl-51C63$j6uc|XM1MvfXY#asj2n#^t#0^4=3!b z%EyamMnU42XMg!=A6vZvU!ju(8z+TD6oWMoyYn>uC(U&6x`U0ei9oy)4Kj(6H<&G*`1{md=ANlMn{h^q9) zi-Y0z_Ado)lNRyj>wo`V_1O71t)#h`nVLRZ!p!;e_v$R+O?!JmrS3`&Jh&3{?*D;9 zzKP`@t*`$(5i_C;lmjt}1eR(+h1({*;ZxAv-i{GsKdJ)%@lTy8+?oUOvN3@Y3U#3RwK#DU>$r;|BQx) zrr8z$KczMrG&Whlpx23f4OW&j{8CI@+{D=Af7#J1X=&|OuasSeo0)tHGzQ)8R*P~)e#=|j9E zry7KB%twy%S|>R5ddCn8*8-ALy(E^|K}D95S0`>P`ZU{li^>9q5<-VbjZ_Mk!9)IZ z$=Md~`XRWJWfMRby&cVc20Uy5eehV!h^!Gj&+f)u#})BTeu8H0GNBGF;N*O*6I>O6GLYKX6l!OGDN+Q3iB`Hh8p(0Bq6rHC9P@;Olh1NlMO2|-wf zqvPJoWFd;1U0V4Op^+DBUEKTks6EL6LK*@G&{V#rWVcDMC@L@o5fi7nI5Jzh zdWhcm=?j)Mjedmq1kwSrSzT>NVC?6j`!e?*eG#hZuE(Ge5F8uql^DzO#IIP}G4PvtLx zi(cKU)R8zCngr%a&MRET+lBixgJmtmZANi$U+zr8h~|;9B7``7799?hgQ{_mSr z7nGyG4hPWWvzU#>y(?>@&<`=GvdNO#TvT=AjJC_~KG&`^n-IKxi2q zHQ*1e&4dbu`_ZQFhr+==QzcNwzt^|(@8HnP(BPaew?vM zsr=d6mOxBOeZJNO5pQ(|Sg1XsqCDb zoMPn(Ybm^p*mq3EGWW`d4Q;qtzsuDvday>sHv0a;$2VoN_9= zJ3-RYva&lT)SH{T$!qLd-=ud=Y;A2dajs!%0Il~0np5Wc#Odr2i?&0du-ya(hQp(y z5p^wc92|fDItM%Y@3Gx*pd^bVlOEgyk*AbouTj#~#CjgM;|a z7<rcJ|IlG!&T=HEj)ma(3;Bt%p0HLSzzMy6_-9mTrYj*%Zcb?mIt^?z$e%5{u>Ltx18%h&vk)m2PP z+?_I4c)L9s7z44yV)W(y;Vv!)Mq&tro<<|r zPw^_^YZe&rpKXq1x9<)GIpio{(${_Z6ePX6y- z45nF>$cQ0Q?Y<}3ZPrmo`9_M1)^j$VJftNwB8*UxP>Cs4Gq2xLz^0(UV0xN3*hvwb z=5;J@Z(vb}`l)%d={Z>t=sOcAM2IFf{ciG#Cbe|HZbZeFI%mTOM`B~X8KAP&1aCQ=PCGfi@~ zfHvl8IU-~fM2tQyZ68e;Yp&j1?k(qiaBK>=q)QTmoMZ>_(QgGB&i zmujVKrfOFH@VawLOUr`?&Dz;uMe=ZaREtl@Sa-J~(J^xKO|w^?o}QLp^Q_=7 zqoWgH6l4_{o0u@?%0NamiM7a6-o>2|skHnF4-h-L7f3bmIQ5q`OtrKG_K`9$GQ#7P z<>k5R3Z?}mjg22O&Nq+5A@D$hEy7ryWNWzpR-`Ax#EK() zm3G0?-)xIEHU(Q-H2(hnnm2DE5Ka&wZqO(X%Hh&F7d;m$ef#T)lU>SIO;9m1GBN{Z zXuuz`*pAPdx$10L{V&OA$T6|7zW=s`$PyQx`;duSniL%LI(dY#y8*^x2_p<`l}c~# znW|53Fv!%j82Wm7>0>AM(%l7x7;$ZKR|l&Q(d{9_&14gR}7u{K7h zM~?8NXnbBUPdr%0b5bXjQFS_1tE{YKwX)La9N*fqH8eEL<#@yvkBW-kH^mMb_Zc+w z@M{sBVa}i#myUI7wbVr0l4DZJM84>wdtnJskyBE7>KIm7$gMnRSq_$3lDA$`8xqp! z+eB3l0hAJCOB=%>XA+-S)+#u4A@iMCwvBNn2K?TB^CoVn?9=S*+#G$RPC>o~)Q#k1 zWsy;kp%A#Tl?7_Sp%fjU&&JUXsE`tyl8_eLcZi;57q2HAB2v~V5;8`n$CWVVFcK!}r_|Zk$1P#N63cjUeCq0=|NG0ZMtnRq zH8sG$zu5Ho3ve`M+QevwIhyp$LHV^VC=(Ax;BqYQJ;g$u;+5JIh2!6vdQk_gHFt<_r zgWi4*IKQsqmPWjPo0#}E@l|g1GtghbwNi7HTZf@LnWty1X6A28L78AwxOSx8 zY2St^(9qCWo8LebSzK@J_GPUd-p!kn0EeJkn;b%4Aql`Y4&?uA;_mLggBnn_AMxuK z4=HKy$-R2bYg{bUtDc|Rnp;_EbG?s1PzJ*)T)>hAlvfs)$Cf8Qa(-e7cwy+$Bpo8>7-1*rJ%$$-PI@Y0>QAyz#J z6|lIWq4qBN?>j6YbRW9-pChA-+nL8()n@I4}stSM>EO=197@K!zhzeQ!U?HAgVSoHWsg* zTwV^Rhy+tFsjpANCnO_lpR*tB#eiZgG;^#-~zaWa+ZK)xk9cc z>jet3^zCBl7upJ7hHcRe+QT!;Ps!f2<@~N5^!j!1>(`JA^M$bg zDboo|pW8?pG%l8Ac#k1-y8;Cn(GBg0A{lL89+cjqmZZGAJax8M1ydUvn{E%(V5x6U z+5-b0CQ^GqG&u%~;?V*>wmf?tnDqR&)_^nV$Gewj5DCI3H8v$@WPSf$fk7eQlkQtz zO$NenM#6X6^IKcJuCfROJ2=mjzytKs{;8=R*C2OB;;MN!pU z`dY{F3CKIH^&<}=yosj}(+H5+UpC)77TFQ4XzF5zC_sdtl8r$@(#wkBB%FtbJI@8F z&zyA%AbhnD3=9lJ^7p^}?_J}>hz$a8i&&Y>+j9+g5W(oX%>YJ=?p@aYEi2P2@%k|} z#mVVC7Z#s48ur4frnc7Q`Zcx!6qr!7xz9opE^XZX9mS6t)~#C%ftG->ZLOz{2O7mhRmQ)MV*)3HrS}Rn3!di2Dfs&O zrpt4XDBjM@7{$eaj005au>W7&M=T?L-mU_8!QRy@bhA`h-`pI1a5_1Kn@|ewPP{|H zV}pedg4)^W5v)G~4dpj&_dw&c=g~lxnXuc@{{GF$9wB|Shk*t;FyPcw8K|2)1IZ(X z+way zMrz8QO^`Pt`WNqf|7oq+JURB06yw*ZS@&=cC%tO&Tb9kO>?D6-vseSA6l6cnCV9%D z+#HTv%(7>yPJ1%-Dmf#oP~}RrP=m!2huT-LBDy8xgp6=XFAQ&qhEI$?&7CvE!iYEQ}v$Z%48<7ebdeQ5##LYQ5SL061jn?5jEii<7 z6)mkCT5@tsT-+#9P<7Q;(l;jhA-_y7LlR94Rn3<~hz`4)lo%A6^y1$M+CB+*mHvc< z81)8P2{jIaiUeMIJ#tIc&}4U6WkrQ1Zpan&tk*ltMcb@J9md@p);;Q?ef+fe41Tv`>kT` z;&w)K>XDUi%aY#2!C7^=S8t%3Gh$fl+A||bXTTCcij|pZvdqhbxXTnLl!$jH`(43b z8*vS{uuVFI=JrB9ZDZZsQfT4o>gx0HiQv5zO#1Zn=Th%j3|QcGDG3pXS-&UaMiO3L zr!ur9ruAxe3Fhu}L@**UJ#I zWY_@iy(wmE-`nl{M9esNF2&F#g zsBU~@5cu~Iwo6jUfz0M!L3Uk!8F<8JC3M7L5Qdmvu|bmaWE_FWZez>pQ38OJo`<$8 z0F7pz#g{@mi)!_^zCuDmDhwoG$98sh>vcK$JRRbVmA;Av5o!7{M7$t=Vbp@0Y;y;*x45l#fqTy=q(LLNG z!1h?quKe`r)2no_zmSjxdk+M2@Bo_AIz(L8<0wMf4HvuSx37ci>ub&~9^Q`}R3ACK zqr0aA)Ba&>Xee31kK9xzWf3T%{tuy{ilOH5EohSi;o8yDqa5>=?vebT_08dt)q{IB zX$E$%QBJ3EfGnXuAehL@W1rwfGLraI)~uIqQ3EC^ql(Q>3exP3NvL#FP_Tr{+*~fr zz%XY70&=L*L65K7Blru8!~{8#k!?CW_?+pwdgKp^h|9?Hmb5Cd@}XI__59}>%eKP^c^ZQ4mn;P`X!pQVpjl;_mf zN#B0=4;o6S@e%nbSvdKHMRXsHjERkWs%xqr5fU(j_R*}2#_xY!o4Z%C!fvk;z~ zp%;O}Ged@9Hd?%CpAfr@OdXX_-)I`!2?&5x@tNX#Awj`4mzsO^mym?#JicDiKey-p z>eaQc%tnGoLzBpq6;z%>U(Ab{kB^Oy&+;TJ-o?cuyWT>Of|k}0G=w-5x^dUeKrLVZ zO%sAffZ3u;M3Yc!8}`CNFbWEa3oI$G;M>>yulW$6-@5j$ERc~w@O0gVDN2q$^uB-n z#In1Ghl1&&r_TnKy3)F1f&INe2dOWX*9UV{cv0*iOKoip-i$zOQ^R1$d!ZV?lgYd< z{W{NgzQ4Q*E=D4_)XNj&M?|zv?pIi!V40QY!fZ9#QIL_7{43krS*`;idg#C3`Ym2; zxnPJz`V-AdW31cjRKs-d=l=GJonl#MEJ{;kRaMoSR>ETKf!d4^@>lHQT2DQ`F|dVk zzn7ObF8)aSvma?RXaKEL0}P^-D6ey!n>zw$G!Y7dHbHL-*-~f?2*R6%{7&XJH)G#_ zc=!H8|M+;u2;f*x=t5iX2N6yPO9(^dIi8Es`Ne`|Ju5!_@u#)x!cap;$Lza)4(gBO=M2Up7g<~~<_`CP@qB&5j@ z^M;X-o7>sY?*!`M{N^xXeGXTh!|wMRq_1xNj+r+3d`5f$vf(Dj^}Ux=IdL4=MMWGew%F=YGo72XQ9_jz{>R zKOA;;plM}quicBo{{oV>P)gk($&r!ry;J72GqWql!*7j^SCPWg@`{SO<(9)Idn+rO zE=PZ78of>&>kTBkR#rDQ>K39z4cwP*<$X>b#WXe7q>5)cHZY;&O&TxMBMSE5jy&QX za>Kz*IsJyy_mC`vfQF#h`lJ(`#^V@0#Wp-LT7=)HQ%kC>qT=%6uP+`J*6CQEk6FAr z^WzU*bHSuOhov90va*zU_)QN+%H;xE?tFj3y?5hFhjc@}wfCa<(wmO`fiz>JXwkc3 z8P;pnOMOdtg>O!WU*G*E>Jy*F264h8`8WoK0p|pjyy111{}Qwrn(=(-h_P1oTs8?L-=6(W$_~-mt{2zGq&F8xlbp%9?7PFtPKb>D zT6W93ei?n0J{Nh$sWxHqNVaFTXf;|_rmEGZhNV-|seis(COjpD`!~3Wg5SF@JRodY z4UJtz%11P+eOICq@p_x_rFN@fWUa4`SKO=os8GJmSN^E@@1?Nv!-o&i@n|ON-1(#1 zx;i`WIn3Xn|M7xPLrY6?y9uSgzu&^bqSo!Ntxf$jwxWWP~33wmp=q z_E>C3+Sz&k;%KH%Ne@^bFHB8YiNi<@z25yJ#6;j&^Cfk5cKYmR(!#^$rl#KKJ8eO4 zA>L{U!JBbkNmH5?o_>|tc>VDOCQY>1?i&EG&d%%hv9Iq{)jQextxzIn*A1Y`v_(M~ zYFQ?lO5}FD0y`U9_9YD;mwwIuV(epCIXS!Oy6T#m@$))}@?vpsP)`6hKc|Z2Cg!@wGtuE3U$ED8RG*K8iZ`d;D49|mY_XiTScpx{8 z*o@>|J|2Nx-?qrcX|hT_UVEdLi-j`+dK(nlA1S0U=FlClTDjn~WdO*f{T&j!|(_q?|ADzB=KQVOp;8@@$tIwM^1vT(8^MT*&2MOwr9ET#i( z3O<>|C^GAcTk<90Qr#`G8sRF|J_m72>~-^lF9~|b73Anags*Zmq8AS597u4y@L)=HWEVmm*GjEj#KJ7OEJF8*>GHYj0`Q&Fk2#f!Rbu&}Xt%!e`? zyqXJ!4XduLwVP?U08)>sp5EkoVPk{$nJe_E9qvSWObrbUL3Y4SjFs6hk3mjD!^O_7 z+u&8L&GF&Xv;91RyYbu+=oyOK_0DtOgN0|jN(&34-92eN{-g(ElWMA~TTfJMwvrl( zdF-<|T?{^!1fJ132}G_q$DI;fH;#3rKF4NJ3A)1j4P`J zzJ+URlzaqgdPO5BcC4?W(~j+w&l-JWs210o^~h=GZ&8=cI{uy2`(ZBx=xSxxu;d>? z)8Nwb^G&?#l<@XmD8vF(LVby)2eFyD`77qquC~Z6joMN?z-)O#zskc20A*U zv%^gd4Gnh9e4}q;Wfp_)Idw7Up}hqL+~BS4 z){7S}Y`2c>D3k|v3J#ANue|lHKU8W~ReD?8K0DY>6%RvjbBEUeBp8^P!A`ij3-|Y( z)1SP`lwbc{KzUH3_@2XkuSb}jo!yl0nXay`g~e)`+w|%Je{cWnLPJOdz&-OvFEF)u zrr6x{^to$2fK|MBvFMM2{yYEKUi+QsR~{a(gM#ATzb7Fk2IAN$m?$vht|?}$u^kxn zUGF*X1Ub7J7;5e=B^Yjvm99klo}0M39x`10G54o!zgQ+ssz+&|!X+o8TBRoQS>o#G zatlN8p48{amhwb+Da!i+LK4i-o4z#$H&J9>m!oKvw`a)g)^{O--EF+>6v052CYy|S^fmDIU)c6BMz z;RDVk+8OgxL?&?QW8tK&4eCf#%VuI?U|^j8j;KWDr6eZ@_Qhn;^A-8*wy);o7v+S*q3R|kPd1twA3pWNUu(}KxkSE!i>d?8-* z?Y%uHz!MM<0OvF^GSZ}xT}bE<_>qzx`+rjG8Y~RTc}C7js=Uv&*Jid9_nptCKly8bN z#$Fk3iszq$bitoS*cK=35X!3g27u~w>Q>a9t^pO&pr@l__0OMK$7;Zdi4xN;lW6fn zK?|x_ z8X7LaOF;n_)T~%G^BJhmDD%qRiEx;}p-W&u012l~nRy?L|9vA7KH=7*ZP^j0YQ5#x z6)?vUNq}jnZYwG(mO^<|O-pI*)8Kelwz9Yeg&J9XJ#}q8buw<^uvSdt&>zsD zh2*dT6@P}0tC8X1a+mer2?ib(Ffw?E56)(>T}#v6M^n(CfE9zc*xlbhUjo-Y`0>&i3@J~u z0Eotw(3%QB#b!G3M@Ff%o0%RRJ%-HzN>VZD@ySV=g!jEWcNWq^Xb8hw!3+fwy7U`; zE&weIJyx?MFL$CVCmp+h5ZUIvi+MZJTOVu-H0-1^o}HYW9BA}|-gwOR;1(Kpep2@I z^iT>}zXGv2-=pRaV+j3t&M&)O;ceUD&Q(|9#vfa4{FRn=5BL_I~V`L`KS13?hxY2qFg7h zpC!H=`X5i86fr=kp-KV$9M}7PA|V54!UB&eOQG181n|ni`V2M&sI!whns0q8z7)~X ztFpy+8n=mhqBK1RH-OVK_|qDJ7$gNY3L#+(w3nb?83#>Tsb_g_A|e#zm6YN-nWo;L zH_?FWJ&r(YIk&l`mBqTJw5OY~UVZZ^HhfrbX z;l)B6-WC&s%eZ48%Q9XeH=mQ86Rulf((s}m(ySA!|LRabo2|Rw$EAJ;ezl*4c2N_% zxXE*mpWlJ`Y+3#^OC4%NF&W=s+zj>Cs2WCpVS@zrep-{6p&&$WkmaBe(nTl4rc}PLr~uAVp89UGrMq(Zef+fRPA1F2 z{{9P5x~6@Q%MmfjBL6xbPc)p`XdWJpA7lJn-2X*0cZe;k`PUOYy|_e{_>LGTUO{S~ z$QCDbj4K3_Kqmpxao9Y6_$_s)9yzE&OXj*UA1fo*R+NToz_M(E1YDAyLdo30KNfSP#rAMOxMg6u+&f|He^$b>44aH3&d{@ zI=@jUS;hCuN9w9Cl#=q{nB!X2r83Z}6V-Nhz8}Au%V<@ME60j2IZP>x=Bca&4}JDr zl))$(djiSNw4&(pQ`K|d%`74!z3qt;mU4~ieQF9L26u_Ud{+Rv7@OC@Y0013=-qwI3CFxiBjAJe%^{H_BtL0 zePGLlvoH3ZL(${zOvM@1iqzB3%WmB{jrFSx^o!0@wK?n4g1%j?wg+FBJNo*fBO;Wl zc4*T;XdXMQq)E}f2YH4ChK(Qaf$e-Xpve6w>uJ_g_x(TpMMXtg2JTtFIfKZEIcU;( zQ29RxXWCGopKlFi1CRnSy);|=WUQ^8 zD^yR^O{8%#=srdH{Wzb3hFrjx14qC4X2H~lk`(;iKLc(U^fuxL?^~>c-VzM{`ohdh zb`zo`rDlqCIQavK7G&DmK0cS}4?`M`=ffdEOKLprmjg<31*fE>@4?#e(UjW^)L|T; za034;C@4rR=`-my)}JYt_w{RH=!kNPP^4$&m{noDEC#RP-bmwRIpm(4oSVPWA3{!f z0f}I}+h2q1;!Vi4;5P`bt}c%nk2c0yx>NZgH?NO1(MUQi-?V*+Qltz-r4;Bsc((|^bseExl%%(JEicnk^4$TX%WnVch%z^#8_`K{c)xOEv zcXgN@JMin);u%q9#C`6DrJRe43qXf=@7^s)_(HZ~YPtkTZK8sl>JWq=P~hrTM2D&n z0TIzdjAxa$Y3gjI-#)Wg4rVK(1va0HJxAh~o2O)u)P-Z%#R z$D#A6Bxb>xNue;7SD{NeKxAiN_~EE-P2ANWn8Q>xVnf_@HcHmrJ`?#98>#6h6xp(~ zv$C?YECelsr3~~nSPOGipau814^I7DkAXax+4~1tXZeMaMRDXVx=jHXU2>Nze>y<| zS06Lk+YC4`JCrdS-G>4pUd_wTr*eCY1GT>FY^E-YPGDWZGRB6gfXDaY0}cGH$}Npi z4cWktnXZTdLBU9gg7DlAGBPsnMI0Ve`b`li5>{B(FI4pC!r9NT-IAjj&!hcZB7vz^ zS1$V-EH)}3B4%+1x?>!efh2__7q5l_7ov(!JkSaVE`sKxJ~+Gy4ZW_gK(wr-p>Z(9 z@3o7mJlL&l^0)qohCfbbaQ}n2r;yFKbEXEiu;cz8)xDaa>l6TJc-?9C@5wm~zd-5o z>hfY)bme8T8IvW{;j)!epqxhS)C%z?!`{w7mSQxmWUp8EVydPTqKNu-@nVSEl+*g_ zNQjbG6cjEGrfW~k`}X&Zl90QxvgOjkBdzy%e=E<+iF!mbuTOtCE^)z>>0}UU64auulWsEyw2RZ8fAy;!8R;3o{Quc?fIL4VKfTOHPnPJX|xxym-CNEumKDY(Y_GP`i2$S=nXHg zd8>P8$+&q}r-lbJuVueQURVYhey7-Jsbmrp5k_Ke-WW8SuE0s1jAx%}i=vsTGi9H6 z&}0jZat#elbxloY{RSn~OAF|wuaa*8(`p6zn&`!Bj16ocx?k+O4H1%zuQ^1`kITw- z?$4C3S31e44lHh`knB}5yyh|yrbje&S5;S=a_Mj=DnK{xOFoOF_u6MYgV+z(?WVc; zfU`KGuTREP-*5t(DK}V^l2q2FuClQ_YvufnMSIuOOf;pE!^5#&R0NMM^wPDH(_-UN z^`5D!K2!BMAMJ-O{QiE#P?>W@roZ=n3n!9_ik`L~=T-DRCYqE*FE36HGKGv#5Q*f5 zhK;6OTEM{7($rMf(Dd3n@YPT-UCxk^dY8EQ(r6u~fXd%(X0?uoK%}bC!CA~6kxKf^}i}tdg)WKJcYF zS)F=icb)pL8|E-CPALl~EQtMZZ1;fb8}v4DbTn~PJ6_?Ls;29=&)S)qAf41={E+eH zmn=3>cr6g6S8(&HCMU8KuyC_;bBp?HeEIiEc@FZGFQ)c7EH=2kvaW;FWMoEga3Mbr zYE~^%X`95eiF_nxz?B0Q9$bc0$71xnywJ~ps(42uQL5iMq%wW3Xo(O1qv;K=3DT!q zZzcCXG5iaJVJhQ?*iuMl`DLH)-etJq8~vTi!Oe{nBcs(gG!#F$E<3yC6zTv#jV=}8 zC8t7BNVx;e=O*)yPl?NI#k)L9Aqi{s??VQr`zIsUSVZ?zXwJ)KHdt)-eEaqd&dAAC z7&Qk}9UsH;o2>$YD|WBoXUiae+^}Jzzsud9o$q)N%f~hHkU#|y61M$fQp;D3_Rt<$9k@$vZfmR9cu+{tNwm`zUrX!`m$limeg&sx{1X#L|NKb=YUK9-ugvu4FuaE> z+C;k1<)<u9oEE4uuH@tj%1GuO?0db zlQ68kXj)NA9sv%+Vm>;$x0_FRLW=O4`x8UPte>agB|e5$TK1}KvV`L?KAZ_P`VbTn zVmIc|223wtZe7rNf6>evRk`7Wk=4@=tjm|yDsQrDG3cQJF8i))a#C`^ySZ1o?8ZnF-sE^MF!CRbFO41RBics}J z{}>MSEDvdI+`yjQW(kX7V8Fe3GcFP zf;`F^spA6S3e?~Qt?X136yQ$|bdxBg1R6z!wDF|u{dXX)`@(Y2##-1zDl*0g2ejzdP8sbrk6Y~xOD0qhb=1>n!3}= zM3BuAZP?rd{p(AqjC9@BU!OFh_Dn8f&=bXp>~1QttF5wx?e6W}`QnV&IN6Vl?i(3q zRLG(fvNaaP?#2fwAgi51xeJFcu(5Yx%@{Jm^EojrozTF^>=0ttJkBwd>!8#-Nd8P zNi(<_%Q>5xocefv!VP#e=r>?CQ#2TIhZkDfnaz$bBl}2=DkoMcDyNfZKhFQ5ZgIRB z{b|wPB)8H2`BfV&P-3SVZO~!<;0iY=T~CYLx~rfUgyoL2hw=LN^5E!ext|ep?^qMW z_@?D)s+*lTAM~MAtU8aQeDr3EXDpa0dbi2J!)R-b?)Qupj_AypQNu9@+_+D9#Xrtx zaAj1z_)b18|6qhEe>;?AH@Ay>KEERt@D=?x6Jh8`!HoUluVz0##QB^FDNKND@90Lw zNfGG+?$@QoWk@>aXfx^)Z9DFebaA{{`Ze`RJes_ZKc*vZx=K9y(^~UBq}hg>>!L2Z z05WoLP!W_8j!};l!y#h)0K;f&aMY^C0tFxB8VnD9PAAD_i+q-2 zvi3}Da?uGVG1spjcia8pfQQ!?H>3`#2}h(iZb2kC$ujX^)-w?WB||+z!`G$I7l_$b&}V!!S7og~aK$Bx|mP@JvY*?1V%_ z*%%`r8QR0^KS%N)we64|8Ip)Q9_}GTvfK9fvTtdwsAST{Qr9c-mIvS~D1fyTYZo}rO|iBf9*(6tZjGama=}YRfgyBO z#k;4+tUM?%CAbzPz_ES9FDdENootzPym%^#yv!sl?ZlqAYlT+umS_ER&tFz%7TPc=u zaLsl<)$4&kF#SP61k0Pd4Z_vtLF0BF@d@7_-=;4v~nGUh8cS9NGAZbqE5)26r?rZBq#KK_AuHN|HiI?vc zLz&%AP~Xn6gLQGj@VG~?x1=Qr`~PtE)=^c3U)Sit0tEz-Q0Ycm5D=t1q%;!J-6<&@ zQqrNcbfchj3P^W{w9>6eNq_73d*A!LW8C|Vd&lJug>&}VXYXe}vDRF3&Sxh78Fbdi zl-U(IkiCjSyWBnH!_a5EYOXeV6TzO=%hf;gvzN0FbY36_s#JQf*$KUrgoFd+P8yPA8R4Tbo*u0FmH=$D2`tZ>+ z>6U^Gu=EJXWH7lFVQ!03Ah==&Ee;PsdjchUE06^Q<^Oe5gs-_R=&y^AI#J$n+fPuG zySi`P*w#F?Y}hQ=h$i3j&GXlZI9l4;APk=OTx9`1IuheiGypaII;;RHn((Y_2XdP{ z!RAawAmo_n_$sTb2hYqkEt&Sd9d6@%d5?hsEkxwtDKZ@%q5%Skw6wIAEiCXJP>Qbd zaCKE*|1p@p><4P2Zy6a@VprY_o3JH7YI}C}>F)=_&jvs2aAZ&;?TnkkJa zVsC=G#etF{C|&=gE$=0~uI8H849NubrQ!0@a%^mB9k)yPF@B3xB_gL!u-BfTx!TVH z+%y<0Kng{j7)nS)u#${HdC#N_8=gDFIlVu=`zUJn@#n{-ynBicZU#*m3Fy=8y(ZMq zTuoU0!8{MJZUxMENuOVE zjC+B?toO|OaEJd>0n@LmfAw)JzgK4?g)DOF8ru4*49#llRhg*OcY?nT5Ut|kW1qkEU)MmmAvL9^zYRU2&@1=N&|ghC z&7fGro;jV5 z;5px$D$vnCr(@A%BAq%DKjf6Dk6nf_CvC=-sR*h zuaD3ZvAN3H$@g76#BdAqN-s*vWZhMY{*FMHRoTw|**lUj@blI8ACRtU`}YL0Mi9{`)OMF6bf^NFQ7a#nGdPj*^=g zp(rolJHcYIw6r8S0)GMa1URrZPd*h7`N`TUk@XrhV}k!!7URYb-(PD)0Mh!K@#Er4 zX%eKPzX? zAUQBRyeNfqybA2Uu*5N}3wwn09=qy?!kW9znZO7G1(6Uim|LquV%5S9a^R-)z`@*M zqZ`oW;XU?zxVZAD;JXzS<&RJ=Am9wF6na>Jlkht{)iL-UGfUGTR4(T8>^3}RnPjql z$D8nG6Fc+;JwwBm|LZT*N4R_jQKw12feUnb1Y%U!7AMSGQlOr>`s~X_hNxR5uaCyi z_^5N$E1Uxiu2C+dT0(>Z<;3;a4i4!Y+ih8OMXjgqN`!v2-zX+N4mvX|D$IPg>t?*} z^URsf8J&n^fB7$mHU=W!UqU65MZ)&9E{U{ypC{<7BjF{@*mmy_-A@tDFJxl&iwjwOjzR0vEsd21ev1&=|O zEu4&5$3vt8ZA^`Vftlr@tMb|Jp{$_$_jw%4ox;MxnVFflc}a+fCi-oMj5|1_jDjW+ zM!`uMuIdB@uCb-zlp=jp66z(6Cl=p)0!4>gOou{3$#11%kdTnZYT_c4>_4xH$^;wK z-a?qA2`eO|#3sHzDhB4qSAmY^=HaG6VNL0}l7f=T%0oM`0Yr!SzUY@M9YKsQU9*7ae3=egRi!i*ls^OJfM` zpB|}VKi8_&L3z5}Em9Kk2$Gz1`2mS38oc1IC11-D9U^}r(qH`1_{FY$1yR0eCnmPh zhN+?w+i-#Q^Nu30ueKc@?1*6iSYRS|h=bm6baQ!mDF9CHtG1-xXp9F)9^(K z5`%Kg^lfOSDPvMn5|rG%agi6t1KxN@fb0ZLxI%M6B3n_=9TgQ7q|fZ^QR^DYDWb>* z$vY=}$y+YQ2@!FDTN1J?F-}6W=PzIUY+QA>X#5-fV&CH0=i*8^bteRSaZXMmJQ`sg z6O;A}&-o{Oylo8)VLb;bA6mX!9sd0h)mZeF`oV+K%cBE7^fxx16T7|r^ddzE1*V^q zx+O*As&+oJZftA_UY_j%X$SPrPIKjuXNH@^4Vdk%kX2X$|gH^jOt z1s~M&i4T+?XX4rBC$$>vF89Pof9D%!qzrV^7^kZpj{CFGo**z8$28C{-5DoI!%W(z zdQ<&qM0+QOAO4)oQ1_P|{((UbSSC(eK?!~K@ zx$j*|_$oku!d4b>nX0CvIzDU3S_%en6*jG7^|1yXF`Sa&MP}2D7c98JMkQ?Z< zWULW=A$n@^NZ_qp3aFBnP;#U{2qdPQ7T^7 zKiNe^P#Ls@g#%(I;E!DVU5o@CeSBd6gB4;F5?Mt>FwXU-SO<<>%D^mrp|$ZYP;Eq0bM(JZ=$lsfLfTOqo@C5k@9i3 zdU)9u+B-QJmreTP0$23vRX_cfKtRv$Ac4|yKIFIy86Zui5jcwH}7um}_h#9EiFppZ}!F`N_)5?kE9NqJV^9g@@@eOr8@ zDuQ!(gky9hX4|!~UPr>UNAeD=O~L_SPDC`**tpQ=EH`6rZ5=B~1B`2HAu4~UR>9Bx zd*z%@h#uRV?HUHB1ac!g|2!`qkbCBG(z2)ONuIg4S{?sf&GyE3K4j3BRP`@<-`c~8 z*Lx)}hDJvp1MP!{=MvbTcz5rDa^VsXW$(jDQ((4BF%qT@jf~UyyG-2|EU-RV6eMV? zh}l$78+!G_zANHoAmb+Se=cun$;i&rlZ$KGbqT6i(5b!pKkx#r(DKwAyo)q6ra}mq zro4;>ekLR)0`tc5@2k(LqoYwG5A5HzU3uXdnBae~blX!zUVdP1?gIGlK(TXnb}l8a zC@;T9OxywVo&90yUk#@_ZJ|VY@@aAy1)o0?g|_)et*oqQR@ppKI%;ZuWO%Mye!B44 zzPX-xOXeVZdm(pxp0isw?FYNf+r-iaOw2o|mYn(O@bX!?+u7e;uo8?Q6PN-TVbQeP z?W68G_bOtdPVBt(@3_!r*0SYAbq8NPr9?!inVCP;*L%SInD&3@>g+@rBLbQK8OC!d zDZW=fgcTJP!Bg|uGhZ-Biin5+s~07u5$}t=w7pf}igf5U%v{JdgU~@vPL7wC7iPQe z-rlYGwC5~h5vASdPh85GG%KU6(><*!=Ev2^q&|>|nL&i4qNu8x+cC^p^<^#Jub^Q4 zA6FS}mIbOwCn8)YjTihDJ?)~et*d+bucr>{ruC9;tXgGej2hl?^EzB>2@;EyPdj1Y zr@<5s|G@t(`3_l^BLTusL(X{|X6+X0sY_idF-0hUX;oMdB=@m0GtYolr8kii)XnQP zqrJVo5xElPy1!;QPd_{0(}1S5Yl|S$zz+LHLW6)iWD3GHg@uK^y|w#@C}0?%18)FI z@v~rM$;}<76I_r`kZ5kKVtj-oc6cUBf$Q=2XAr*Fb4^%lp=`M3`}p1mRFo&I0`f`V zQaT0ldU+cjZf-IGxBZiYP0R65B^4Fh{aCm5Rz1)qe^ZttUcybSji}DylM*j-5|nAQ)Bz3`9-D1LKb{ zXy?j6DN6tJ^uW01y^Flh#YFfZ9ll^^e|Np-X57c*vdu{;&?ZYsl?Vctx6YT_4zc|wrWR5sUX;z^`<4baBs+~B;+=_ zq9DE4etnNkM_JVj>WFX^kvTn=x$o=H*z@<)v$sC=o?o7}r!M}U8eWF%^A;X4W$WlD zvr%&^&w?r}%R86z6JkjHs>1bdqx_1Cw2$AC{}XIpf;I-lSYIE>3#lU@B5DM_WPg7@ zFbVF45^UcaErw|q^*%7iw|4@%Y4L&~+A1^Ydk`(zYDFt`R9zXJ_VPY)Z?v?P(*j{( z!}^%r;r-^M?vq>%Md^>C&C1b;K|_%s?6Qh7X+ck^hp(jtofsYM?*&fkA=YThca_+5 zopuu*`D!;l3~fu|aB_Rq>7VA!=XiQpRIICpd>BG>nEQ#v`@YSTN69A7mM>7w zfu;M8Pb+byT&f2scdmin6{Bd?QM#O$^*zdO?fBuyB#Jjns88*^usB4~{ z95dxGB1|48HPm|qvw2V?H0n`G>o%fS9g^%ATUq_-iB79{ToLH(O)cuKG+wB%$eu?s ztb9>labh^!k#`Qw54xFa*RF|*ihfa(a$(&77J3*xH&PPfBUso_i;E+rRQl(v=NL7+ z>3qYZA-Gf)7M`a+tnbD-9}{J?GjBUorEx#5Tr)HGs4@FHK@_sO-7lrJ{IqvGYP}FG z-CgIT=acU3%NbBBk#J<7$AhGwOb9Zp0xs(ltelA(O>b{YOxZiw&NVn~vX!mwGnWiK zxqW-6%w#X(Qb$p7=wI|2c;ALX-pl3i8u9tZWMJgJ-kt*ADBxdQoSzaC6X%dWr-}LW z=@S_9sH>^TBy(>Ax!l^urhi}{P0;fM4uU9R;ODE`1IbE)+0I-%vEEVGxG z`RI{immfG=6LLH^6}O+F+p?vs>DlCG6=dvcV378Aao4X?OXT7oCb+V}`Jzn?6))t4|i?zh1kv&4@t#Swa37df${t zrbKI}41d2=RB%Do0~Yb1=z%T_nWxbC{zzvu^}0OR2%$7}uyWxDokb0-+D=!>f;^sv zW~l{U*!cJvgYxs&!z8HHK*z&Vjr5ta zu8?tZ<1{{B9&YQgInB{l-0<0Hd%8aldvzOQTR zLtrvJ%o7$7v9jv|&Ax76HZnZ?XLlF$M-cXb&1gv03l|p`GqZd>RzmUr<^n)eAyE-d z4wV1J4v3P`(9r1U=s-gg>v;Uo9TO81oWVe;2o8`WBr|Ovl@oIV+e?FQhqh1OMgDb- zCEyCDCJigLB{j{?GtNJ1zQc3Wv+49D3|}}U9Ow4#K8e@C2KjEC^X;QQ&aaQYtiHm+ z)^%BdSmcks;?P%jS7gTEz<}-K{M_J}O1V`rHFN;bKS2X;jug@z1a2BA30QN^;1!rD$Rz`aLZ{1pz;=U$HWndEot0%gYGIE%k`mgapJN z_s@RNYSD?HXvfN=+!VqqFg}C>7TXWHcr_p^a1`Il=LUZ*Xf+rWd^|j_cNf|q!rj?5ak(0p zT1iLQI@169x%CM7Q2|5oS;3nC0&H~F_$?Q)Av=FW`U%7(E!3GvI+=R+RXJzXm9D$b z@rEtZZS(W;roVp&l`9y=blAPR$JfgVX}$Z097yp%rb0l&T>yL`GYgBrfPkS(Pqa1i zZU4#-AFPT$>(+IB`rld4l%`q~sH5WIDh=8~D#`6gNMvODcIIjXAb^nXw(6wB=4~}V zD-aZsX|8oD*hdHV2MFm)$&27-SXt#xR6*${FE4Ks83~gtt#q8Im>A$B?W3cPv$akF z1&yauMb@zP!UTbSn*=4u@;X15`1{ud$krDH60vr@YL`UY4Szp=U}wX8Ijm+Gi2wkVIy2^O$`nte2+LDk1Dm-mJkEFP;HkL znlg~`)YQ`QsewO-ybVI(Q;K&4;2xYaJ#|@_Fm&pnv%=H>oJ*(8Wd0zWUvqZ$_ATao z+@kYAW}0`cH(BR|A*JiC9lt1H;cr}s=AI=uB|AE*=CP0He# z)xm!OqEPB1jKcjQVTx+kJrf?U+6X6QVoLD50JUuW<;7{^#fhbuSQ|+B)}>nw9(`@k ztgY1`P%S)cgxIl$96i$6Q=go!()X}r%uCbMRnHAy@5j*iIG_>`qgQDWVHCZ$Tnu+?bZJVf$HkuOaKD$@P1@)dps zN;|;C(!4K@cV_EgQl|F*{{1`FeGVf?p&dt0!R_DLYKpCQa#EcF7bK)mH;g2Gs=B+= zddmV-L25`O$X**ER|5D9zWfQvZAzo1&S+haT`>=jv-c0dgHp-C-hOL)dwOmh@~`&x z6&P&*R{=6})%I=wzhn<{L45J z$c~?kjf3MwL2UC6TA^W84Gjy^iGJ@t#_Jm!{YhM#D1p~j*#N6f{r5xOFV27tt#59Q zM80>5J-)K=rw_BS)?qF`BBCEI0Du(K{tl>k^aC#^6&3Pi9fWy6kXCx}0*`>8!f}1r z{b;8mxt0oKR0|80w(}Pd;W@O2-8XCx%a{h}VBT$$g_t-QM9^svae$P&vNXm!J%sSV z13rLZ6TYvRvDw8$Y_2b~ zVXitkI=*QSx2@v&AGt4`KO~_Zz$6EGaY;#u757t4&ay1iDYHhBi^+-kc`$#k5xVO0 z;$Ipa;f;GWKjNnYK}h8v1=?fD%k7lJMCg-JCl%!> z4RJgCP8*{zy2{j;CsTKKcfklcE7gAcSN&c;#1)xYS?kh1&*hw%M{a&M z_yHDH?bp}!GgmK2_18Cf99=C-(AGifp0r2hCjSJgL~+H%HmfO93STsng(*OmgoT4c z?+-43V4jYdW-SU>mWHOLG!Gt95JU|S3hy0zkVVEPBy=wBt{tA8!5_(^ltXQxlgn`_w^Li-j4EF z92uWt92(skR+@%QQBZn5UI&v`uU-*NytFhocd}!3O4q2g0^w^+3TU zT0-yL_q4LM<|UDXn$7t*YR z;Hv;Us-;zLF~(Rc0KgOaVrbL*N_}a-95RYZN}>fP4S|w;mriD_J>m)8&2Mo~?Mine zAtkMI4+ba&G?iLeV0Q|55RMe*@_J{j_ z{P+P&yktiU_}4=KT?w`&&^2IYgD@C00>hMiNJ#*H?Ct-+e6i;A3BW>VJjkot+S))% zH$rQdp0uS}MI$Ur6@GFL7oDJG`*as;sNHM=KJ&5YyVe(rlgf0@_!{d;w8t;VN#B4Nqk^n``S>})2aG`BEZFtPfncAFPI5?Mn>Mv z1qf15q-T9s*3yy*Dg-naBEJakYv~Ue3t&>s8hRsP}oFEs}4O1qoy99v%XBvg8fh$9#q= z7ds)Sc_IjY0+@q`m#LTc;vwt_a`P@-xo5g;KScQyPxDu{w>_bP5f+AJ`-{l=%lub& zo|H_Z3D(ZskDR9cgCki~(QChdw(NUY8XMD|o12*AI=^i=y}!To>WR?VZ>!Hr zA(;^*yvPeJyl3*W!vvMHRQHtQ&XCt4{6vQC=)=lW*P-^141FB7%3(jF^Z4D=-Cbzf z1AAa0PJF?Y4txfnN(8q(p-9dePmGVh^yA0iPF^YI9V4D83jgm@Q^R?B((#ysD+6hb zHnV(u{B0c_BWaL7LOgq-3iHTq0fBCV5{Mu8jl1zrY|^|=3PM9eg(=kPoLK~J*1h_P zbX#O03eUIgh=SeQ{M39=J@hn3lVm-xoHlvf(Oz$S6q-PIN6 z=+BECo|Na$x!Kv*%+Q}8+V#`85nP%3o>N9Ds;c0%vb?%VgpV&-)efP+D|`C~97b=! zjrUE8Abyn10NpHpIBaLIIS##BKl$-mx1ja*S;^kvVSjh8vW=Ogl~r$7R|IHsgO8vz zzJ>|I7(gfZfo2Eb1nM(w2KVpXTie_`TB(F|{vj-zHUl>XwYOzn1HxQro8RcIo46XG zTj$p1kU(E2@y|k^{Y{$z_)SAi3KKJQj;0cpVi=aKt)lB07zlyE3&gK#yKiTqL^HDj z@BfezEH8U!YwOgWVdu=Ctoy$Xo;sFW=f!&*dJClIPU)(#_l}HAwR6)Rm%nJBrag9C zTVg+(M%CieJNUG)`8>s4%+0&V&CS1_U76d3wWja(hIOEpbGlLVPDZe(E0#p&isA7C2I@ayPCyw8LTfV$_J73{Y9bZ*f7bFlw zUG=vnDU(c)x%M^N=k)ZZfeG09sjUMef&5*IM@VewiGbq_8kxKkJdL*`=LpqIduz*b0M~OSadttU2L?pGzZn%=EgcV z7x&osn1#6oME~&EsIqi6CRK;Ze|`R}81+5-;`M>7fOSi-O-Kaab%c*^ciY&(3yY0} zrV<&VE9uviRmQ&7*RPMX5WKcrz4wu|HvV;0efwbcXhyn(6h{NmH{*o4#Ih1*PT4%P41&}6r%j^1kRJLs_4R^xDcIc>9lYy-i< zzGe-z`zZ#vFv!dQ3T1;5hK!8NRuDNL!QrC)9_urcoR_ntw&vzJ83o@Qc@YAzl@T*u zaC-#yM)!)D0FJd({N-PZi$$hed@_!@97CQrDO2I)YfldXvv9mv8vv#{ zi2G}o0rmh=0|6e+0ujOoFF@{gGP~XIVn?JqzvZSt z3e!@(woMJ9w8l%-N!QwvhT!gxlEfASG~42eqp*M08H7jRLSVl5f!EDRc5joWpdfEQ5oII{q@*J_7fJB9o+KXzbU*%wmN@79eiF zdIBLbsV8P+2j<1y$c`*xv41%O%0&Ps4;Z|>4l5YfuAF$x!|yOmY8Eu`04IG0A9gojlv0u^O;K{99l)$CuV_DVnPSEw|5M23?RRj z$B5!rP%kz&FVGU8ibl!YA&KiVxr?ga z!e&*lx68V-`6I`a5bsTBWW6S(4AUvCzH_5_y6iT$Ntsd(`;5EO(OWFT5|cXB-Muf1 zbE>P=4t==`fMkVy3qf{y+vq67o2tx&o9kV+rX40_#_rtD^t zj24@<>n6_x+rP)l{dLKT^d#~Lfc9!E8|EB-ccu4oxG2apMbTo z_KyU=pr8(`!3+F0lQJl+pMK(l`JJ^U@!j^?Qdny)m9m+evP3AC;rD6#aOgi|U2}h) zm7Zl;m9Mv`c2@xD+tkQtP(HBh5f>K=tYRs-pP-TfGrVlr-Ox5jr0vl{y{6YU(A?e^ z!*j8&gAF8YY>LZstYIPXX*gWW@WU4izxT7nk@9!gtpHe{nPwtC$msrUQB-6ydmR>z zi??vNaW8MuJ{;Nt1wA}^RLb-SJjjrW_~(P)!K6l7s1*h-WWMll>*|a(?Cnb(wVNRh z`mwSiF62R{>9<7`ESd?$Md`E;(1{759*j#ENYZoR}!7hY-qxuuA>*K4#mg^?D$*pAMreWz2YD4IJdyyVnfKacI^ zZSCqtp}M7GjCTzYC21|a?2*R%ZmX?RqgtD`J{+5%8`V6YCiGa^4)$nOE=HFeo- z3e>AuxWn(oF`_Xos6E6>C#@tT=$SE8bWt1}#0KOtR6qS7j?ei0j7w}NBRudOfkK+{0eW$!+S=;h$IYc* zw(jh+gG8|jTypD5!a8X<>FG_87%}(vN&Vqj++&_H;XuAs`1@m^UC!XXfSx#e@=dH~ zaJ&y%rfFgr>h6p=?+a*%=KrHI&`%msuUQ5Kf!A)YAL&mDR02g>KA06S8{UplCII4H3 zt6+PEmg7DaY~%p^V6o-7-kMf<(x066tr+B@JP3t{Qi&BF7lZ@v&>Vr}X+6{1)!@pR zC&`eF!}-kZs*l&;sj&D|uLd4g4B9>hGC3(jVm3PneFUw4Xz0$nJjCGDTO8_nk=t$#F(Tj$4Pk@+SDXNQI4=24Fcj^Yk$**0ipI4C>q>EGMFDo25 zyG%dJ%3x5D`h=|a6-ad&A+BN}r}Ze0UV2Yl&e8jqV>@3fqd|02lQRFZW6qLSX})Ac zyTR?x?Ls+l2bmom;aJHRMt2_R?>H0DNyATd_m9!jt61FjU15Tn1zFE~od+oB?=fDz zH-kHsF1_@I^q6xRKDH}2RisqP8+n$v@wS&$*1LhrvxN8xc|PBI%gs_llWjWA56^BR zW&;LqbkkRz^3F1x+kVFkpAB|6OmE->D9R!I7{(suv;r5O+#gMKUW{ zYl@m9%Pm{>2lecL$5PuG-Mdvj9Peu_UVbrKf7K;Mk{qABOX(BkxQbXtn)#t2xoazk zPmNCNe=A0cpJwB)Hm>@;xp$^SUMgZX9RA6;YlRcWu|FqbjT{Ctn;G$iB>KDhKja4n zOOfS77r*m$8#Ag3b0vnBsFJhDrW-0G|1?jf9z+}l+v@#ZQPa8JMB|IUODao`mK$!0gA%qVo%h9mZ zNUt|U4C}niOx+SE5M3S^j_P-p@=J1L#(s#67`=@oM$`*)Z#?`S_n9gA;BKH?eGd9q zwo=+~`iela#FzmsLU;mBBaBnw9(RLM^qXDP(g6SJ+FJfTjf81MGVkR6OJIk?aCijd z|Eo9Pbo;TzA6!nYdM4)t)Wkcu+-|?`w}45RX*~!C*#yuIO^EepAAq#rk2|?|t+wKc zPiB5k{9hi2(&#Y=Nkm{o#!?74rRV2MCjDGPz;``qHZ_`-hT){UkVjRF)T2ugXUx4m+ z+YM|gN=_4hP93cmSh zGpsD&(hUUk?)|k35uoD#*U?2zEWDNuu(AmAZftDYk+8sZVH}!x&?~dl&+1Ji;4JmjsNcT|8S4c4d78c zKs|EkeOLc2rwEIG=YmK5Z{dZ8`v3OfDH$RJyNmVlcIAFWV_8At$HcD>L%+GfA{+}N zgxzpuHU9h``)JTM()fMve#P{k_@BM1K#yX?9LYjpRkP;rzvfErs))7bk5l}UFV(92 z9ByO*+>M)jBw{mxB{U2jBBzt>qfpdgeqn?9lz~M$>0P5=`i4znO24l%}QAhgwt#-ZSjyG)vwEIP;gZ-nEed1-=pG+P|yyw}QMq z*n14yjOekkZ(v?S&_bK62?5_}hxcWEx}S{_Yk@T7*uz#6f=7wNwgJAiJxm{^pJ=|{ ze=VeIdbcK$gG`z2gwga2w@gv4J#6#_qWg{M6yhXuq1D8;n`7MVWUFsP^ z8i!S{ll43qqT$v4IkyLE?JIm=qrPj<#&mFni&$a#&B(H?zT~Qq+#uFWD8xm$;bdS7 zt9YCdNxw*Gb|er0h0_u2R^13>aH{AK*1T%B11S49xNT2yNP;V~|{#dX`En^Jap zK=b2epO%;u1z{){&u%R(wK`Igy8ZqEqM>21o=apEJtpZ>pVwm65$qaLkPpSR-`yE$ zB(L3TA*QBxO$trcB)Z@^rPbYpmUzh%89w=Lc9iOPRX6Cz9Uepl7)&5;z|+U%oDohv z6E0Lrz1+wJQpYyHOaSi26O)rS0=)s62pA;qalxm(w6qjV1da6dA6ZY8qu7i!HHo-z z2mxSZz#j2{Boj#Dz`O*!eVF)GKy%fcThHVqFFX4ys2uP6+!tu6HXq4_FK~Bp(Wkb-N3NA>m5DNjZyB;KzRT>T=49- zNQQ!$rDdJ@2pyQpynXu?HgyjpeOj55V+;=hY!cnT@daujhPJj~a|q7c`9FfBWMpQb z&H`rDlUB}k6TmI;{{0OdwsV39?POq(35cp1^Ul)iKk{r}_lJQxE{%b*TY=&rRLtsJ zGBmzC9zQ?sQ+#I+S(K7>d;zHt{9pCgY1D+fn?klnwkJxtw3Sa(sC0%2z?vq#lV9cot+h6 zV%m%px=0Z67W91n9~ua-1t?ql`nJK~J8ycmFPX<-r58SHYHIpF=@ENYVQFQBF+m7rS__-a!Df!+f>uXUP*sO9bB9{|RgIRl^)|FEY+K@J z*K4&ln6cjn9sz(2)!GNU**!K*(IHl#w;39w0ERT5T~FR#;Q8iq#)>#!5{FVo#llJq zV@V|;odnt_4ywbI@EC80AJFf@cJn%=k z?&9F!@Rbj72L3ml;}S}y8k%VWUV=uQxF-Sc-YKc8CrZNZ9&JDpTitcxCzE&U0-nkG za~0&NtkB}X1Z{`w|#fqbQ;Fw^>((;k|*?Tr8R zys97s3x`aUtO+)6Hf4|+GcevLR`%+gh=Gf7A_i3u5fQ&F2^dBZp`q^@#sKUc8By}6 zx{gU`HB+rPB?~mG*4FI8LaE9~QL4#CZ*L^BxlrXJ6u-bh8^w5Is$K43ri80Z9Bjvqj)VzT$WHtKklMWb3709>xj|oZ>x*-B|m%AHjR|tJ5Hb4mZ-o< z3-JyiZX5nq_6V^7sjbh=sd2XYu@cG?K{l)!r}oay&VSsB*S!hgQSkr<=F!e|yTo$8Y_c>t~gIMF9IH3LEB0-z9CV0j72N>JWp49qw zi0YoM@<^oA9PBIiFRrKtm!E$|tK93DdQkS8N61H``O*DA#$}D{RA6GqDMZ3`# z2wYHVhsT!#1owpnd!Q$PD=kbnF}TeJC2QzY++Yq1%iPA=npT}NkR|NkVm8)n;BKMF zifTtdVsv2AaB$dzif-xT*6-i1YEof32F5RN?TJ{m%&e_pU|%wwzr7v$ANIYyvoloj z|3b+QH5o$nE-*0g1-=td;DK%9NGky{vPyT@>v|KgCu%Ax;C>7b4~vK0gKyL~G~_hu zjPg7^1Z|3$nVAPzo^o?mvcM zce9>9i4Wxp=Gz_~wzG|X*DRr}A_7AVEQ-yK+~+;^WHmLX0W$_3rW+6dO3C}u zgmhoNd<_L-sAvHiiIPxE+ctW_oB%U9Xpts6J0-zKiAhLXVgfc@7@L>?I$#e}mpglU zpcFpfSM%II-T-Ir z*K@8NJw2At!o%pZ2)C@elmR!)X_gP?U0o~KkZVqmY*A_`en2E zp~waIs0E2q1zch`fH!L|^Y)y{`;JYGTe5(8C#Atk=tyDkytS3NUfHKv7V#rZefY+cFSuywY46A8gq-Mg>fk&VV|!QKSv!~Q$X#`%Nm?XF4F41euWzO{QDUJd@-n!$Wh?3Lw{&$@<#>HBGQ(7DW#(kf;o#1 zC}}8JRHs~i*(GW5gk%bWLJZ~9+_Nl23>1K@B@L)S(duVorwj2Hd8^Sf=ICnPuNmab zD7C#wNwo7T-t&D?=8o@->|YPTpcb$M-&)gj;ZJp(df(w*nS&va;s)A9w--(jq+Ic( z04mP*7NY<<6o#B7)Ca1!p#uc^{z!dcVMJ(~#Ss%2 z_kt=Ds7-KjP+J4X-W34L!8WrT${vDgWAPJ=2jsuu7G4Z*4 zJ;WbXr{(HM0UM&&;^?QVoqNwxc%m|(lyHHXAVuyF(iB@9W3Hy!1< zlfi(T1^-sg5o}qk0lSo*^F4WzfJ?=L2ZcXiQy85B6$=V--DA{v!5~EgYS(uwZpv1e zxPWd0#6etpU^9RD!tNFr-)6v~Q=hN{`D@6}L~fsp^v{MIt&D5Vlh;qSp*Z3n#Y;fhARAeges4{a7A^GvKT_6#EmlB59Gz> zK(~OSn4b3cyDZmO)jR8B3f_IVaGV&CX=gHHq1kDZQY}M>8lmsixm&=TMo2`|Bd4UQ zq5>qk1G@I$wgtEkAgI=`QTc3ERBCrxKdEN%6R;TuKADYk;QQr%xOn&v<;`uA9HXF!%o-` zVGlp60Cw6SXDn>i0rkuT4&z(1bIul}(gboT8oIjjY|j$-oHigOm_7^+51(!DtlJ`b z{!&O(LIU=GjY$;(#R5>W9z7cHih^xTV2Q^=!p0jw_Li>#q6qXVQht{&bxv?W$Om}A z*?T&O!Rwc^=gY))wv0P_Cg;QRwJBJrGvXST4OU;G^|+!Br2-{Z=^l~q~|sYL<#IG)i1M3 zC|;<6#kvL?JRpRfe&`TCs9>0UL7lFcVQj6;|2USE3{cq=Ys67(E3L>@Tkt(8_1{Xh9 zr(Qw#WuC2G6I3GvlvUK1mzMA!a0dvE6C#vRAR`K0YT9S`_y7MHW%5Zn-W~jQ_c=ex z?_kXqzCT@#A%qd{Rw5Kxe9%yTdwub~2hZot=N2T=tQE@8#dU>Y*i-|Q$zQUwfg<%4eHA)Bc)6N=$cJVIT?h8zuP9s{7J!$V!c zU=f12m(}M8g(}iah7Hl-U8)Rrekwe96a*OrSHV~)$#Awi`H2A!+5~lt*?8zzxD$W{RB4TORv%v(N!k8C`?fR2k2Z~b#z+{#c^2fH@#Q);1IeFS0CX^7q* zdVVY_;&hWqN23!*L%7{SwM%#P?zgEazI{uSndJVz1|V?z0(*;r=O6;{71dch&1U}U zv9MVGJ0g{P z_4UojrQ?)Wf)x`04={whbqn*?OwBALo5seZ9QtqSI&j4|&=7jJ;L`X(8q*B^r#mUr zkfS|Y^aHL_VzHzSq}(SJAAth_Y6QP_C_N`OIf?;tk1FY6P-a7Z*!eS!jF7<2^E_8B zx!;jDL_v8BDyr850qmPcbTTBwk0aJKYW-iIeJ`3x z_BHgQlljmJ^A_S94fNnXzm?bsX9jRch_hLPfs=5bs|@&!-Q?z#&dy-(ZHPLhV36k& z;znIa2uchHao3nlr^U(s{n}bLBDN2vwXoU21^CFYf7kwMAArjtNaMebtnK^WO7ny! z`_KAF81Y0ROdsh3@U*ZjK z5;vtER%bTP%pfD%3~HlNK{re5udJ+$8Y05;&`Ix&f|><70sWZLuxQlHf&#R(G>ZKH?^~fm{g+$L@5}AkS$QQ>M8|HPS+n`0z{B_Y58q&P zRHENuI1T-~@RIy_9uG&1)P9U5Q`a=SBa5CI$W32U}qZ!JNCZ zv-9f7huz<5%;Uqu21zSa;#YiPVUq;l?OcT|1LU(dYfs|$@siAw;6_T+m_2&|w1v$E zo{#_=To;g!!a|_H2d&r6jgDp)T7dt#o8%J`IIEWdxAp{=>{Evo8PH!Js6$-X&@gx6 zs67#XwuPp5KcgHiA-;GMb^;uAnq?1z$O058HX07lnkdV735g*6dr7&lofI8i^UvQP zO~P)$2tY!_D_^r;V4hUG2|#Fwcoy)Gx{Uq+**HU?lReDr@y3B0(IpmIlOTgNVg-`# z2?*s>RA~Jb@N;Tvcmbe(*JYXp`?Y*2D;rtd#h`riO%G)Hj~{3&1iJ9E`u}#}2i`R1 z0}KQcRt|R44BRO&oS2xT8?y>GfEWX)1ZT2>B7WLHRr(^pge1YD7p}&H2zx@*(VrrW zSsZhY&%NS%VkiAoF}2JB0lU2yNa>$mh1O{Y?YUP7>XD6&QfC~sOLp*B49Tq4DhA*e zY+o@bWkx)tQj!u9K<8Yd14cWy;Of$GGwbX5J#!8K(gWtS2S> z<3XKu_%Y-G=1IAQh4a6_9NyZ(0uRX$QVMS0;8L!l0w7i$fExQzAQQ7}DX5q%g9ZS} z&eVk~?7arV@?i*-znPU4KJxFmmx{_&-zHG_fBFewE+AmzJBsl=Tu+{ug@=n$fz}bP z;R-^Hn*?a_rJRVUl`?t3Kc~{KdALjs?MEI@|NAK_`d0%iRS+4K3QAD8(3yFbjz zSpdK?!Actd0Duip+5i9mY+$wQ0034jkH>T3#0l9c0APh+r40Z8zy>I7KyGt5W`*r{ zBhAdrID|uX3IND1N*j>VoK9!PPdHd69zTAZN~N4mr|cjAkX@8EAg6ge9@8*nr}$s) z-yau3xIG@(K>#4TC~ZJa^Z81qr>Dp6+>sq5bGPGhA;h|cJk=Bc?1<6^`dwXbhy7XpA>KxqRY8s2^iV^-7y8bZmaeaRvtD)< z09Xo?HUPrycE7)4=hW0x_m^MX8ji`1^WT2B(*O0jvu?Nhy~Z7~vjD&nam>!z{$}U^ z7R9aM;oh%$QmK@t)oy>IZuRQr_-x{d2M;dvoxgeWMse}F#+@Iy-EP^50APtw+5r5` zFz$c%?Kh(%BTlC?`0^_?HP1g+Tr4}(pGHSVe!6+%>foRdV)N$UTkpKPYSk*)p#Wg% zP}%@I>H4*+SNi+M$L|Rt3JMBTuh-=&$aBbfxaaRPGrvB1G(LVWl}ZUADk?T^d-b&q z72K5#K+d7G0hrtEc>LCI>~7+&X_%9fzsZV`mzP(tW{ubDEiGMNSyf$BR3s}20LVpY z1Mo~_{Z=?6t?&WBazkkY006K7ZutQK0AK@@HUIzs8=$lS007tkr40Z8zy>I70000s gKxqR20I-2S0K)I@58XMxkpKVy07*qoM6N<$f*(_i%m4rY literal 0 HcmV?d00001 diff --git a/examples/flows/standard/conditional-flow-for-if-else/content_safety_check_passed.png b/examples/flows/standard/conditional-flow-for-if-else/content_safety_check_passed.png new file mode 100644 index 0000000000000000000000000000000000000000..a0ab31854f5ce8515c4f566d3a005493e5db95eb GIT binary patch literal 39590 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 str: + return f"I'm not familiar with your query: {question}." diff --git a/examples/flows/standard/conditional-flow-for-if-else/flow.dag.yaml b/examples/flows/standard/conditional-flow-for-if-else/flow.dag.yaml new file mode 100644 index 00000000000..909bb8234a9 --- /dev/null +++ b/examples/flows/standard/conditional-flow-for-if-else/flow.dag.yaml @@ -0,0 +1,47 @@ +$schema: https://azuremlschemas.azureedge.net/promptflow/latest/Flow.schema.json +inputs: + question: + type: string + default: What is Prompt flow? +outputs: + answer: + type: string + reference: ${generate_result.output} +nodes: +- name: content_safety_check + type: python + source: + type: code + path: content_safety_check.py + inputs: + text: ${inputs.question} +- name: llm_result + type: python + source: + type: code + path: llm_result.py + inputs: + question: ${inputs.question} + activate: + when: ${content_safety_check.output} + is: true +- name: default_result + type: python + source: + type: code + path: default_result.py + inputs: + question: ${inputs.question} + activate: + when: ${content_safety_check.output} + is: false +- name: generate_result + type: python + source: + type: code + path: generate_result.py + inputs: + llm_result: ${llm_result.output} + default_result: ${default_result.output} +environment: + python_requirements_txt: requirements.txt diff --git a/examples/flows/standard/conditional-flow-for-if-else/generate_result.py b/examples/flows/standard/conditional-flow-for-if-else/generate_result.py new file mode 100644 index 00000000000..c238605bc22 --- /dev/null +++ b/examples/flows/standard/conditional-flow-for-if-else/generate_result.py @@ -0,0 +1,9 @@ +from promptflow import tool + + +@tool +def generate_result(llm_result="", default_result="") -> str: + if llm_result: + return llm_result + else: + return default_result diff --git a/examples/flows/standard/conditional-flow-for-if-else/llm_result.py b/examples/flows/standard/conditional-flow-for-if-else/llm_result.py new file mode 100644 index 00000000000..82b1910cc9e --- /dev/null +++ b/examples/flows/standard/conditional-flow-for-if-else/llm_result.py @@ -0,0 +1,10 @@ +from promptflow import tool + + +@tool +def llm_result(question: str) -> str: + # You can use an LLM node to replace this tool. + return ( + "Prompt flow is a suite of development tools designed to streamline " + "the end-to-end development cycle of LLM-based AI applications." + ) diff --git a/examples/flows/standard/conditional-flow-for-if-else/requirements.txt b/examples/flows/standard/conditional-flow-for-if-else/requirements.txt new file mode 100644 index 00000000000..34d068f5f1c --- /dev/null +++ b/examples/flows/standard/conditional-flow-for-if-else/requirements.txt @@ -0,0 +1,2 @@ +promptflow +promptflow-tools \ No newline at end of file