From d48a184dd8bf7063265af2b0d44ba101884ed1a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 5 Aug 2023 10:22:39 +0200 Subject: [PATCH 01/42] =?UTF-8?q?=E2=AC=86=20Bump=20mkdocs-material=20from?= =?UTF-8?q?=209.1.17=20to=209.1.21=20(#9960)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.1.17 to 9.1.21. - [Release notes](https://github.com/squidfunk/mkdocs-material/releases) - [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG) - [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.1.17...9.1.21) --- updated-dependencies: - dependency-name: mkdocs-material dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements-docs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-docs.txt b/requirements-docs.txt index 7152ebf7b72b5..220d1ec3a5aa1 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -1,5 +1,5 @@ -e . -mkdocs-material==9.1.17 +mkdocs-material==9.1.21 mdx-include >=1.4.1,<2.0.0 mkdocs-markdownextradata-plugin >=0.1.7,<0.3.0 typer-cli >=0.0.13,<0.0.14 From 8f316be088d63b9557d85fe25e9c3b26937fa9b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 5 Aug 2023 10:22:58 +0200 Subject: [PATCH 02/42] =?UTF-8?q?=E2=AC=86=20Bump=20mypy=20from=201.4.0=20?= =?UTF-8?q?to=201.4.1=20(#9756)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [mypy](https://github.com/python/mypy) from 1.4.0 to 1.4.1. - [Commits](https://github.com/python/mypy/compare/v1.4.0...v1.4.1) --- updated-dependencies: - dependency-name: mypy dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-tests.txt b/requirements-tests.txt index abefac6852f3e..0113b6f7ae9f1 100644 --- a/requirements-tests.txt +++ b/requirements-tests.txt @@ -2,7 +2,7 @@ pydantic-settings >=2.0.0 pytest >=7.1.3,<8.0.0 coverage[toml] >= 6.5.0,< 8.0 -mypy ==1.4.0 +mypy ==1.4.1 ruff ==0.0.275 black == 23.3.0 httpx >=0.23.0,<0.25.0 From 0148c9508c9c42988503a16c1b909d1d268760dd Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 5 Aug 2023 08:23:14 +0000 Subject: [PATCH 03/42] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 5957a73c09ae0..63e27fc98a389 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* ⬆ Bump mkdocs-material from 9.1.17 to 9.1.21. PR [#9960](https://github.com/tiangolo/fastapi/pull/9960) by [@dependabot[bot]](https://github.com/apps/dependabot). ## 0.101.0 From abfcb59fd065843e669e4e3a19bf5540e789c1ab Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 5 Aug 2023 08:23:39 +0000 Subject: [PATCH 04/42] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 63e27fc98a389..621f82d551c79 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* ⬆ Bump mypy from 1.4.0 to 1.4.1. PR [#9756](https://github.com/tiangolo/fastapi/pull/9756) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump mkdocs-material from 9.1.17 to 9.1.21. PR [#9960](https://github.com/tiangolo/fastapi/pull/9960) by [@dependabot[bot]](https://github.com/apps/dependabot). ## 0.101.0 From 5891be5ff1156e28a7a3128248ce3268ef97118e Mon Sep 17 00:00:00 2001 From: Ahsan Sheraz Date: Sat, 5 Aug 2023 13:24:21 +0500 Subject: [PATCH 05/42] =?UTF-8?q?=F0=9F=8C=90=20Add=20Urdu=20translation?= =?UTF-8?q?=20for=20`docs/ur/docs/benchmarks.md`=20(#9974)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ur/docs/benchmarks.md | 52 ++++++++++++++++++++++++++++++++++++++ docs/ur/mkdocs.yml | 1 + 2 files changed, 53 insertions(+) create mode 100644 docs/ur/docs/benchmarks.md create mode 100644 docs/ur/mkdocs.yml diff --git a/docs/ur/docs/benchmarks.md b/docs/ur/docs/benchmarks.md new file mode 100644 index 0000000000000..9fc793e6fc60a --- /dev/null +++ b/docs/ur/docs/benchmarks.md @@ -0,0 +1,52 @@ +# بینچ مارکس + +انڈیپنڈنٹ ٹیک امپور بینچ مارک **FASTAPI** Uvicorn کے تحت چلنے والی ایپلی کیشنز کو ایک تیز رفتار Python فریم ورک میں سے ایک ، صرف Starlette اور Uvicorn کے نیچے ( FASTAPI کے ذریعہ اندرونی طور پر استعمال کیا جاتا ہے ) (*) + +لیکن جب بینچ مارک اور موازنہ کی جانچ پڑتال کرتے ہو تو آپ کو مندرجہ ذیل بات ذہن میں رکھنی چاہئے. + +## بینچ مارک اور رفتار + +جب آپ بینچ مارک کی جانچ کرتے ہیں تو ، مساوی کے مقابلے میں مختلف اقسام کے متعدد اوزار دیکھنا عام ہے. + +خاص طور پر ، Uvicorn, Starlette اور FastAPI کو دیکھنے کے لئے ( بہت سے دوسرے ٹولز ) کے ساتھ موازنہ کیا گیا. + +ٹول کے ذریعہ حل ہونے والا آسان مسئلہ ، اس کی بہتر کارکردگی ہوگی. اور زیادہ تر بینچ مارک ٹول کے ذریعہ فراہم کردہ اضافی خصوصیات کی جانچ نہیں کرتے ہیں. + +درجہ بندی کی طرح ہے: + +
    +
  • ASGI :Uvicorn سرور
  • +
      +
    • Starlette: (Uvicorn استعمال کرتا ہے) ایک ویب مائیکرو فریم ورک
    • +
        +
      • FastAPI: (Starlette کا استعمال کرتا ہے) ایک API مائکرو فریم ورک جس میں APIs بنانے کے لیے کئی اضافی خصوصیات ہیں، ڈیٹا کی توثیق وغیرہ کے ساتھ۔
      • +
      +
    +
+ +
    +
  • Uvicorn:
  • +
      +
    • بہترین کارکردگی ہوگی، کیونکہ اس میں سرور کے علاوہ زیادہ اضافی کوڈ نہیں ہے۔
    • +
    • آپ براہ راست Uvicorn میں درخواست نہیں لکھیں گے۔ اس کا مطلب یہ ہوگا کہ آپ کے کوڈ میں کم و بیش، کم از کم، Starlette (یا FastAPI) کی طرف سے فراہم کردہ تمام کوڈ شامل کرنا ہوں گے۔ اور اگر آپ نے ایسا کیا تو، آپ کی حتمی ایپلیکیشن کا وہی اوور ہیڈ ہوگا جیسا کہ ایک فریم ورک استعمال کرنے اور آپ کے ایپ کوڈ اور کیڑے کو کم سے کم کرنا۔
    • +
    • اگر آپ Uvicorn کا موازنہ کر رہے ہیں تو اس کا موازنہ Daphne، Hypercorn، uWSGI وغیرہ ایپلیکیشن سرورز سے کریں۔
    • +
    +
+
    +
  • Starlette:
  • +
      +
    • Uvicorn کے بعد اگلی بہترین کارکردگی ہوگی۔ درحقیقت، Starlette چلانے کے لیے Uvicorn کا استعمال کرتی ہے۔ لہذا، یہ شاید زیادہ کوڈ پر عمل درآمد کرکے Uvicorn سے "سست" ہوسکتا ہے۔
    • +
    • لیکن یہ آپ کو آسان ویب ایپلیکیشنز بنانے کے لیے ٹولز فراہم کرتا ہے، راستوں پر مبنی روٹنگ کے ساتھ، وغیرہ۔
    • +
    • اگر آپ سٹارلیٹ کا موازنہ کر رہے ہیں تو اس کا موازنہ Sanic، Flask، Django وغیرہ سے کریں۔ ویب فریم ورکس (یا مائیکرو فریم ورکس)
    • +
    +
+
    +
  • FastAPI:
  • +
      +
    • جس طرح سے Uvicorn Starlette کا استعمال کرتا ہے اور اس سے تیز نہیں ہو سکتا، Starlette FastAPI کا استعمال کرتا ہے، اس لیے یہ اس سے تیز نہیں ہو سکتا۔
    • +
    • Starlette FastAPI کے اوپری حصے میں مزید خصوصیات فراہم کرتا ہے۔ وہ خصوصیات جن کی آپ کو APIs بناتے وقت تقریباً ہمیشہ ضرورت ہوتی ہے، جیسے ڈیٹا کی توثیق اور سیریلائزیشن۔ اور اسے استعمال کرنے سے، آپ کو خودکار دستاویزات مفت میں مل جاتی ہیں (خودکار دستاویزات چلنے والی ایپلی کیشنز میں اوور ہیڈ کو بھی شامل نہیں کرتی ہیں، یہ اسٹارٹ اپ پر تیار ہوتی ہیں)۔
    • +
    • اگر آپ نے FastAPI کا استعمال نہیں کیا ہے اور Starlette کو براہ راست استعمال کیا ہے (یا کوئی دوسرا ٹول، جیسے Sanic، Flask، Responder، وغیرہ) آپ کو تمام ڈیٹا کی توثیق اور سیریلائزیشن کو خود نافذ کرنا ہوگا۔ لہذا، آپ کی حتمی ایپلیکیشن اب بھی وہی اوور ہیڈ ہوگی جیسا کہ اسے FastAPI کا استعمال کرتے ہوئے بنایا گیا تھا۔ اور بہت سے معاملات میں، یہ ڈیٹا کی توثیق اور سیریلائزیشن ایپلی کیشنز میں لکھے گئے کوڈ کی سب سے بڑی مقدار ہے۔
    • +
    • لہذا، FastAPI کا استعمال کرکے آپ ترقیاتی وقت، Bugs، کوڈ کی لائنوں کی بچت کر رہے ہیں، اور شاید آپ کو وہی کارکردگی (یا بہتر) ملے گی اگر آپ اسے استعمال نہیں کرتے (جیسا کہ آپ کو یہ سب اپنے کوڈ میں لاگو کرنا ہوگا۔ )
    • +
    • اگر آپ FastAPI کا موازنہ کر رہے ہیں، تو اس کا موازنہ ویب ایپلیکیشن فریم ورک (یا ٹولز کے سیٹ) سے کریں جو ڈیٹا کی توثیق، سیریلائزیشن اور دستاویزات فراہم کرتا ہے، جیسے Flask-apispec، NestJS، Molten، وغیرہ۔ مربوط خودکار ڈیٹا کی توثیق، سیریلائزیشن اور دستاویزات کے ساتھ فریم ورک۔
    • +
    +
diff --git a/docs/ur/mkdocs.yml b/docs/ur/mkdocs.yml new file mode 100644 index 0000000000000..de18856f445aa --- /dev/null +++ b/docs/ur/mkdocs.yml @@ -0,0 +1 @@ +INHERIT: ../en/mkdocs.yml From 1c919dee3ce73a5b3d134dbb335c0a38af8438b5 Mon Sep 17 00:00:00 2001 From: Aleksandr Pavlov Date: Sat, 5 Aug 2023 12:26:03 +0400 Subject: [PATCH 06/42] =?UTF-8?q?=F0=9F=8C=90=20Add=20Russian=20translatio?= =?UTF-8?q?n=20for=20`docs/ru/docs/tutorial/dependencies/global-dependenci?= =?UTF-8?q?es.md`=20(#9970)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: dedkot Co-authored-by: Vladislav Kramorenko <85196001+Xewus@users.noreply.github.com> --- .../dependencies/global-dependencies.md | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 docs/ru/docs/tutorial/dependencies/global-dependencies.md diff --git a/docs/ru/docs/tutorial/dependencies/global-dependencies.md b/docs/ru/docs/tutorial/dependencies/global-dependencies.md new file mode 100644 index 0000000000000..870d42cf54bb3 --- /dev/null +++ b/docs/ru/docs/tutorial/dependencies/global-dependencies.md @@ -0,0 +1,34 @@ +# Глобальные зависимости + +Для некоторых типов приложений может потребоваться добавить зависимости ко всему приложению. + +Подобно тому, как вы можете [добавлять зависимости через параметр `dependencies` в *декораторах операций пути*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, вы можете добавлять зависимости сразу ко всему `FastAPI` приложению. + +В этом случае они будут применяться ко всем *операциям пути* в приложении: + +=== "Python 3.9+" + + ```Python hl_lines="16" + {!> ../../../docs_src/dependencies/tutorial012_an_py39.py!} + ``` + +=== "Python 3.6+" + + ```Python hl_lines="16" + {!> ../../../docs_src/dependencies/tutorial012_an.py!} + ``` + +=== "Python 3.6 non-Annotated" + + !!! tip "Подсказка" + Рекомендуется использовать 'Annotated' версию, если это возможно. + + ```Python hl_lines="15" + {!> ../../../docs_src/dependencies/tutorial012.py!} + ``` + +Все способы [добавления зависимостей в *декораторах операций пути*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} по-прежнему применимы, но в данном случае зависимости применяются ко всем *операциям пути* приложения. + +## Зависимости для групп *операций пути* + +Позднее, читая о том, как структурировать более крупные [приложения, содержащие много файлов](../../tutorial/bigger-applications.md){.internal-link target=_blank}, вы узнаете, как объявить один параметр dependencies для целой группы *операций пути*. From d86a695db931d623b4225992817d1f9ed8eb259b Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 5 Aug 2023 08:26:40 +0000 Subject: [PATCH 07/42] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 621f82d551c79..d656813cbaa74 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 🌐 Add Urdu translation for `docs/ur/docs/benchmarks.md`. PR [#9974](https://github.com/tiangolo/fastapi/pull/9974) by [@AhsanSheraz](https://github.com/AhsanSheraz). * ⬆ Bump mypy from 1.4.0 to 1.4.1. PR [#9756](https://github.com/tiangolo/fastapi/pull/9756) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump mkdocs-material from 9.1.17 to 9.1.21. PR [#9960](https://github.com/tiangolo/fastapi/pull/9960) by [@dependabot[bot]](https://github.com/apps/dependabot). From f2e80fae093e8d219e101715a8f92a15edf0ff31 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 5 Aug 2023 08:28:26 +0000 Subject: [PATCH 08/42] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index d656813cbaa74..82d256b73f67c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 🌐 Add Russian translation for `docs/ru/docs/tutorial/dependencies/global-dependencies.md`. PR [#9970](https://github.com/tiangolo/fastapi/pull/9970) by [@dudyaosuplayer](https://github.com/dudyaosuplayer). * 🌐 Add Urdu translation for `docs/ur/docs/benchmarks.md`. PR [#9974](https://github.com/tiangolo/fastapi/pull/9974) by [@AhsanSheraz](https://github.com/AhsanSheraz). * ⬆ Bump mypy from 1.4.0 to 1.4.1. PR [#9756](https://github.com/tiangolo/fastapi/pull/9756) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump mkdocs-material from 9.1.17 to 9.1.21. PR [#9960](https://github.com/tiangolo/fastapi/pull/9960) by [@dependabot[bot]](https://github.com/apps/dependabot). From b76112f1a5230a8724994b9fa9fcf5bb417b1e09 Mon Sep 17 00:00:00 2001 From: Reza Rohani Date: Sat, 5 Aug 2023 12:03:08 +0330 Subject: [PATCH 09/42] =?UTF-8?q?=F0=9F=93=9D=20Fix=20code=20highlighting?= =?UTF-8?q?=20in=20`docs/en/docs/tutorial/bigger-applications.md`=20(#9806?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update bigger-applications.md --- docs/en/docs/tutorial/bigger-applications.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/tutorial/bigger-applications.md b/docs/en/docs/tutorial/bigger-applications.md index daa7353a2e258..26d26475f2f52 100644 --- a/docs/en/docs/tutorial/bigger-applications.md +++ b/docs/en/docs/tutorial/bigger-applications.md @@ -377,7 +377,7 @@ The `router` from `users` would overwrite the one from `items` and we wouldn't b So, to be able to use both of them in the same file, we import the submodules directly: -```Python hl_lines="4" +```Python hl_lines="5" {!../../../docs_src/bigger_applications/app/main.py!} ``` From 0b496ea1f8b75943617c3b69421e2b6bfef46006 Mon Sep 17 00:00:00 2001 From: Vicente Merino <47841749+VicenteMerino@users.noreply.github.com> Date: Sat, 5 Aug 2023 04:34:07 -0400 Subject: [PATCH 10/42] =?UTF-8?q?=F0=9F=93=9D=20Fix=20typo=20in=20`docs/en?= =?UTF-8?q?/docs/contributing.md`=20(#9878)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Vicente Merino --- docs/en/docs/contributing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/contributing.md b/docs/en/docs/contributing.md index f968489aed90b..cfdb607d772e0 100644 --- a/docs/en/docs/contributing.md +++ b/docs/en/docs/contributing.md @@ -126,7 +126,7 @@ And if you update that local FastAPI source code when you run that Python file a That way, you don't have to "install" your local version to be able to test every change. !!! note "Technical Details" - This only happens when you install using this included `requiements.txt` instead of installing `pip install fastapi` directly. + This only happens when you install using this included `requirements.txt` instead of installing `pip install fastapi` directly. That is because inside of the `requirements.txt` file, the local version of FastAPI is marked to be installed in "editable" mode, with the `-e` option. From 51f5497f3f91efcaf23ee2cf408b8fa61178ed69 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 5 Aug 2023 08:35:55 +0000 Subject: [PATCH 11/42] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 82d256b73f67c..92061066f474e 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 📝 Fix code highlighting in `docs/en/docs/tutorial/bigger-applications.md`. PR [#9806](https://github.com/tiangolo/fastapi/pull/9806) by [@theonlykingpin](https://github.com/theonlykingpin). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/dependencies/global-dependencies.md`. PR [#9970](https://github.com/tiangolo/fastapi/pull/9970) by [@dudyaosuplayer](https://github.com/dudyaosuplayer). * 🌐 Add Urdu translation for `docs/ur/docs/benchmarks.md`. PR [#9974](https://github.com/tiangolo/fastapi/pull/9974) by [@AhsanSheraz](https://github.com/AhsanSheraz). * ⬆ Bump mypy from 1.4.0 to 1.4.1. PR [#9756](https://github.com/tiangolo/fastapi/pull/9756) by [@dependabot[bot]](https://github.com/apps/dependabot). From 33e77b6e257eb263cfc82bf0572b453cb1272eb6 Mon Sep 17 00:00:00 2001 From: Adejumo Ridwan Suleiman Date: Sat, 5 Aug 2023 09:36:05 +0100 Subject: [PATCH 12/42] =?UTF-8?q?=F0=9F=93=9D=20Add=20external=20article:?= =?UTF-8?q?=20Build=20an=20SMS=20Spam=20Classifier=20Serverless=20Database?= =?UTF-8?q?=20with=20FaunaDB=20and=20FastAPI=20(#9847)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/data/external_links.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/data/external_links.yml b/docs/en/data/external_links.yml index ad738df3531e3..a7f766d161180 100644 --- a/docs/en/data/external_links.yml +++ b/docs/en/data/external_links.yml @@ -1,5 +1,9 @@ articles: english: + - author: Adejumo Ridwan Suleiman + author_link: https://www.linkedin.com/in/adejumoridwan/ + link: https://medium.com/python-in-plain-english/build-an-sms-spam-classifier-serverless-database-with-faunadb-and-fastapi-23dbb275bc5b + title: Build an SMS Spam Classifier Serverless Database with FaunaDB and FastAPI - author: Raf Rasenberg author_link: https://rafrasenberg.com/about/ link: https://rafrasenberg.com/fastapi-lambda/ From 87e126be2e3633a46163ae28f0b418903fdfd515 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 5 Aug 2023 08:36:27 +0000 Subject: [PATCH 13/42] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 92061066f474e..3b52700ef62cc 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 📝 Fix typo in `docs/en/docs/contributing.md`. PR [#9878](https://github.com/tiangolo/fastapi/pull/9878) by [@VicenteMerino](https://github.com/VicenteMerino). * 📝 Fix code highlighting in `docs/en/docs/tutorial/bigger-applications.md`. PR [#9806](https://github.com/tiangolo/fastapi/pull/9806) by [@theonlykingpin](https://github.com/theonlykingpin). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/dependencies/global-dependencies.md`. PR [#9970](https://github.com/tiangolo/fastapi/pull/9970) by [@dudyaosuplayer](https://github.com/dudyaosuplayer). * 🌐 Add Urdu translation for `docs/ur/docs/benchmarks.md`. PR [#9974](https://github.com/tiangolo/fastapi/pull/9974) by [@AhsanSheraz](https://github.com/AhsanSheraz). From bb7bbafb5fa496166037b04a9fbb108aed3b84c9 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 5 Aug 2023 08:38:32 +0000 Subject: [PATCH 14/42] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 3b52700ef62cc..f8138e2a8b83e 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 📝 Add external article: Build an SMS Spam Classifier Serverless Database with FaunaDB and FastAPI. PR [#9847](https://github.com/tiangolo/fastapi/pull/9847) by [@adejumoridwan](https://github.com/adejumoridwan). * 📝 Fix typo in `docs/en/docs/contributing.md`. PR [#9878](https://github.com/tiangolo/fastapi/pull/9878) by [@VicenteMerino](https://github.com/VicenteMerino). * 📝 Fix code highlighting in `docs/en/docs/tutorial/bigger-applications.md`. PR [#9806](https://github.com/tiangolo/fastapi/pull/9806) by [@theonlykingpin](https://github.com/theonlykingpin). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/dependencies/global-dependencies.md`. PR [#9970](https://github.com/tiangolo/fastapi/pull/9970) by [@dudyaosuplayer](https://github.com/dudyaosuplayer). From 5e59acd35bd00018462b6401bf78e52c91b48f70 Mon Sep 17 00:00:00 2001 From: ElliottLarsen <86161304+ElliottLarsen@users.noreply.github.com> Date: Sat, 5 Aug 2023 02:39:38 -0600 Subject: [PATCH 15/42] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix=20typos=20in=20c?= =?UTF-8?q?omments=20on=20internal=20code=20in=20`fastapi/concurrency.py`?= =?UTF-8?q?=20and=20`fastapi/routing.py`=20(#9590)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marcelo Trylesinski --- fastapi/concurrency.py | 2 +- fastapi/routing.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fastapi/concurrency.py b/fastapi/concurrency.py index 31b878d5df8a5..754061c862dad 100644 --- a/fastapi/concurrency.py +++ b/fastapi/concurrency.py @@ -19,7 +19,7 @@ async def contextmanager_in_threadpool( ) -> AsyncGenerator[_T, None]: # blocking __exit__ from running waiting on a free thread # can create race conditions/deadlocks if the context manager itself - # has it's own internal pool (e.g. a database connection pool) + # has its own internal pool (e.g. a database connection pool) # to avoid this we let __exit__ run without a capacity limit # since we're creating a new limiter for each call, any non-zero limit # works (1 is arbitrary) diff --git a/fastapi/routing.py b/fastapi/routing.py index 6efd40ff3bc9f..1e3dfb4d52c88 100644 --- a/fastapi/routing.py +++ b/fastapi/routing.py @@ -83,7 +83,7 @@ def _prepare_response_content( if read_with_orm_mode: # Let from_orm extract the data from this model instead of converting # it now to a dict. - # Otherwise there's no way to extract lazy data that requires attribute + # Otherwise, there's no way to extract lazy data that requires attribute # access instead of dict iteration, e.g. lazy relationships. return res return _model_dump( @@ -456,7 +456,7 @@ def __init__( # that doesn't have the hashed_password. But because it's a subclass, it # would pass the validation and be returned as is. # By being a new field, no inheritance will be passed as is. A new model - # will be always created. + # will always be created. # TODO: remove when deprecating Pydantic v1 self.secure_cloned_response_field: Optional[ ModelField From 69d5ebf34d088019b7dfa15729dabe3603e2d16e Mon Sep 17 00:00:00 2001 From: Francis Bergin Date: Sat, 5 Aug 2023 04:40:24 -0400 Subject: [PATCH 16/42] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix=20typo=20in=20re?= =?UTF-8?q?lease=20notes=20(#9835)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index f8138e2a8b83e..fa8fd9d2891c0 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -107,7 +107,7 @@ A command line tool that will **process your code** and update most of the thing ### Pydantic v1 -**This version of FastAPI still supports Pydantic v1**. And although Pydantic v1 will be deprecated at some point, ti will still be supported for a while. +**This version of FastAPI still supports Pydantic v1**. And although Pydantic v1 will be deprecated at some point, it will still be supported for a while. This means that you can install the new Pydantic v2, and if something fails, you can install Pydantic v1 while you fix any problems you might have, but having the latest FastAPI. From bdd991244d4ff1393725996ac15425857e643c6f Mon Sep 17 00:00:00 2001 From: Russ Biggs Date: Sat, 5 Aug 2023 02:41:21 -0600 Subject: [PATCH 17/42] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix=20typo=20in=20de?= =?UTF-8?q?precation=20warnings=20in=20`fastapi/params.py`=20(#9854)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix typo for deprecation warnings depreacated -> deprecated --- fastapi/params.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fastapi/params.py b/fastapi/params.py index 30af5713e73e4..2d8100650e492 100644 --- a/fastapi/params.py +++ b/fastapi/params.py @@ -69,7 +69,7 @@ def __init__( self.deprecated = deprecated if example is not _Unset: warnings.warn( - "`example` has been depreacated, please use `examples` instead", + "`example` has been deprecated, please use `examples` instead", category=DeprecationWarning, stacklevel=4, ) @@ -98,7 +98,7 @@ def __init__( kwargs["examples"] = examples if regex is not None: warnings.warn( - "`regex` has been depreacated, please use `pattern` instead", + "`regex` has been deprecated, please use `pattern` instead", category=DeprecationWarning, stacklevel=4, ) @@ -512,7 +512,7 @@ def __init__( self.deprecated = deprecated if example is not _Unset: warnings.warn( - "`example` has been depreacated, please use `examples` instead", + "`example` has been deprecated, please use `examples` instead", category=DeprecationWarning, stacklevel=4, ) From 0f4a962c201023333b653ea1412011d02e87dd65 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 5 Aug 2023 08:43:01 +0000 Subject: [PATCH 18/42] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index fa8fd9d2891c0..ac8a67633dc19 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* ✏️ Fix typos in comments on internal code in `fastapi/concurrency.py` and `fastapi/routing.py`. PR [#9590](https://github.com/tiangolo/fastapi/pull/9590) by [@ElliottLarsen](https://github.com/ElliottLarsen). * 📝 Add external article: Build an SMS Spam Classifier Serverless Database with FaunaDB and FastAPI. PR [#9847](https://github.com/tiangolo/fastapi/pull/9847) by [@adejumoridwan](https://github.com/adejumoridwan). * 📝 Fix typo in `docs/en/docs/contributing.md`. PR [#9878](https://github.com/tiangolo/fastapi/pull/9878) by [@VicenteMerino](https://github.com/VicenteMerino). * 📝 Fix code highlighting in `docs/en/docs/tutorial/bigger-applications.md`. PR [#9806](https://github.com/tiangolo/fastapi/pull/9806) by [@theonlykingpin](https://github.com/theonlykingpin). From 6df10c9753fa4a0f2d82506da63adf8985caca2b Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 5 Aug 2023 08:44:36 +0000 Subject: [PATCH 19/42] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index ac8a67633dc19..b195a7bb19e1a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* ✏️ Fix typo in release notes. PR [#9835](https://github.com/tiangolo/fastapi/pull/9835) by [@francisbergin](https://github.com/francisbergin). * ✏️ Fix typos in comments on internal code in `fastapi/concurrency.py` and `fastapi/routing.py`. PR [#9590](https://github.com/tiangolo/fastapi/pull/9590) by [@ElliottLarsen](https://github.com/ElliottLarsen). * 📝 Add external article: Build an SMS Spam Classifier Serverless Database with FaunaDB and FastAPI. PR [#9847](https://github.com/tiangolo/fastapi/pull/9847) by [@adejumoridwan](https://github.com/adejumoridwan). * 📝 Fix typo in `docs/en/docs/contributing.md`. PR [#9878](https://github.com/tiangolo/fastapi/pull/9878) by [@VicenteMerino](https://github.com/VicenteMerino). From 942ee69d857710ee4f0dffce50b6d4d4db10b540 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 5 Aug 2023 08:46:58 +0000 Subject: [PATCH 20/42] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index b195a7bb19e1a..723f338a9f81c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* ✏️ Fix typo in deprecation warnings in `fastapi/params.py`. PR [#9854](https://github.com/tiangolo/fastapi/pull/9854) by [@russbiggs](https://github.com/russbiggs). * ✏️ Fix typo in release notes. PR [#9835](https://github.com/tiangolo/fastapi/pull/9835) by [@francisbergin](https://github.com/francisbergin). * ✏️ Fix typos in comments on internal code in `fastapi/concurrency.py` and `fastapi/routing.py`. PR [#9590](https://github.com/tiangolo/fastapi/pull/9590) by [@ElliottLarsen](https://github.com/ElliottLarsen). * 📝 Add external article: Build an SMS Spam Classifier Serverless Database with FaunaDB and FastAPI. PR [#9847](https://github.com/tiangolo/fastapi/pull/9847) by [@adejumoridwan](https://github.com/adejumoridwan). From 14c96ef31bc2069dbc7dad82a501de10d83c4cf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 9 Aug 2023 15:26:33 +0200 Subject: [PATCH 21/42] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors,=20add?= =?UTF-8?q?=20Jina=20back=20as=20bronze=20sponsor=20(#10050)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/data/sponsors.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 53cdb9bad1588..6cfd5b5564ba4 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -37,3 +37,6 @@ bronze: - url: https://www.flint.sh title: IT expertise, consulting and development by passionate people img: https://fastapi.tiangolo.com/img/sponsors/flint.png + - url: https://bit.ly/3JJ7y5C + title: Build cross-modal and multimodal applications on the cloud + img: https://fastapi.tiangolo.com/img/sponsors/jina2.svg From 01383a57cbdf57cf1ba9b39381e6ab37c8d30792 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 9 Aug 2023 13:27:14 +0000 Subject: [PATCH 22/42] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 723f338a9f81c..486b570717e71 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,7 @@ ## Latest Changes +* 🔧 Update sponsors, add Jina back as bronze sponsor. PR [#10050](https://github.com/tiangolo/fastapi/pull/10050) by [@tiangolo](https://github.com/tiangolo). * ✏️ Fix typo in deprecation warnings in `fastapi/params.py`. PR [#9854](https://github.com/tiangolo/fastapi/pull/9854) by [@russbiggs](https://github.com/russbiggs). * ✏️ Fix typo in release notes. PR [#9835](https://github.com/tiangolo/fastapi/pull/9835) by [@francisbergin](https://github.com/francisbergin). * ✏️ Fix typos in comments on internal code in `fastapi/concurrency.py` and `fastapi/routing.py`. PR [#9590](https://github.com/tiangolo/fastapi/pull/9590) by [@ElliottLarsen](https://github.com/ElliottLarsen). From 87398723f91efb24834bdded970bc5065049d50d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 9 Aug 2023 19:04:49 +0200 Subject: [PATCH 23/42] =?UTF-8?q?=F0=9F=94=A7=20Add=20sponsor=20Porter=20(?= =?UTF-8?q?#10051)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/data/sponsors.yml | 3 +++ docs/en/data/sponsors_badge.yml | 2 ++ docs/en/docs/img/sponsors/porter-banner.png | Bin 0 -> 17260 bytes docs/en/docs/img/sponsors/porter.png | Bin 0 -> 23992 bytes docs/en/overrides/main.html | 6 ++++++ 5 files changed, 11 insertions(+) create mode 100755 docs/en/docs/img/sponsors/porter-banner.png create mode 100755 docs/en/docs/img/sponsors/porter.png diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 6cfd5b5564ba4..6d9119520409f 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -8,6 +8,9 @@ gold: - url: https://www.buildwithfern.com/?utm_source=tiangolo&utm_medium=website&utm_campaign=main-badge title: Fern | SDKs and API docs img: https://fastapi.tiangolo.com/img/sponsors/fern.svg + - url: https://www.porter.run + title: Deploy FastAPI on AWS with a few clicks + img: https://fastapi.tiangolo.com/img/sponsors/porter.png silver: - url: https://www.deta.sh/?ref=fastapi title: The launchpad for all your (team's) ideas diff --git a/docs/en/data/sponsors_badge.yml b/docs/en/data/sponsors_badge.yml index b3cb06327004b..7c3bb2f479aaf 100644 --- a/docs/en/data/sponsors_badge.yml +++ b/docs/en/data/sponsors_badge.yml @@ -17,3 +17,5 @@ logins: - databento-bot - nanram22 - Flint-company + - porter-dev + - fern-api diff --git a/docs/en/docs/img/sponsors/porter-banner.png b/docs/en/docs/img/sponsors/porter-banner.png new file mode 100755 index 0000000000000000000000000000000000000000..fa2e741c0cbb326b271e3e3f545a4dbc55f72519 GIT binary patch literal 17260 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 LNkvXXu0mjfJEqlj literal 0 HcmV?d00001 diff --git a/docs/en/docs/img/sponsors/porter.png b/docs/en/docs/img/sponsors/porter.png new file mode 100755 index 0000000000000000000000000000000000000000..582a15156470bd8af7ebf8e9c05beddea1a7de11 GIT binary patch literal 23992 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�S;@abbD|Vr_Aj3d(~E-cl*Fup6_8=vF_W zAPbrVK;MjrJ-+s%RzcjarUc9|^u8iqE@{GleDV2Jc_#&k1-HeSkXau8Zlp?rRt#R} z|5kA+Wew1jZg2Hx&Ao&Qq09NCJgp+%PkAv{mwUF+_<%p`)|#g5BJ>j0Q~LZ z%VEy5FVw3w*~)ZZxG=l_V30!MBfB<=nT^o2Qmo$f#?f!Sy5vm(0gdCAn9p7OW$tgT zWRgJJTi3}Onu~W`!@|C&)D+N^oRm0u1-r4XXY2Lb@i-Q|X@T-x%9N z^p)U_fBvugAA)b4_9I7YrtOL=t^l7t_G9p+6OM&xk57kduf18-Qg2tqOwJ(CLd4zj z>!FpL^uNP0%YXOkI&NH9?Poqd@jL2r(Wfhh_!53) z8(hZ#w&{kqhrvn~;KPOwhsBE*!;3GztTd1x*yWdB4weiILdQ;}472G+FFz6%EEo<0 zgG*qUWk$O+BS(&e6_#Hf1_uXW(V|7LaN#0p3z_%yM{RlQt$8qa?psL@M~)ofhL!SB z`W07L9@_0Ty!7%bQbtC!GNrI8(=Gh#PYg*W*V1W2#3-oUM+Qt)V1968!q+H?>a7X& z^><`#yb^1j(2$%X2S?GZ!ODiE47_lB^ltqh|z>FEQV7>JwSTnliUdBD~ z9UH-?KYb+ZwBxq0^2#eY@LqH6jd0$17r>n7UT|fO8Zi>S_ua3-l~>*X4^Mp@jy&QJ zc;_zL!Yi-53d2SWhqg7zS6g)zIO3y+!2bL1kCgJOvMK-(hFDLV2v7^gQKUH+xZjf| zO@#B#Jricneipv)#gkyhQ_sLg8?6W5{QBoDfcAn99d;}{Gy6HHEZEnz;97Id)!~?< z4|AsZQ-WKsMI;+~55A@o?SsH^ZfuUF|?RZ{9pt@0U*e41D0={o(ZQoC$Z| zeZQ-Bw_SIFGkM*^84qf+-L!%|o z=JRwVH3yBwuj08~uTfc>nqYRzE*YaM4F5WQ4X<4Z`G$7oT3vtdu9ag6Wo_SFWA8*m z(#lFevZ?IWWmU>$sVdE$?%z!|-VoklHSS;kb_KModHVC8eFq+S>~Z+ir@smd=FfMu zd}j6>xb?QX;7=F)3cmgAufnmP{#tlD1HdOg@e#Q2PnW{^zx|6fwHG;acVJ)%tZBhF zZ~g*!YUVR=*OY(Rdjqb%-FM#wj{EFUaKurchnsJ{Lt1muUoW?scQKq}>%aNdJK@pC zo^WlPyya%j0@!`858AR9$G&D=?;$A*w@_);IPI1ShmZ~wD6tO61hgh9q*^0QE+A?} z)w1Zzq|D#-YV>i3XsUC%ij8&lzuW_3Qj?}&wh5k z^;H)pl`LAc1b+Inb77mUCc!q_Y#{^u;!7{XdB6FKGrc+TDzt+7^}hGM2OfCv5xDi% zyK2vFy6Fyh`Q=w(@4a>vLXtrE@tObWO#MJ4`AdBA!X-&-WQ=rbx)8Im?P=lhAaZ_$ z+JCjSMp{W@y9{*Bql$4LW2E|TY@l7Ae{F4!LoZ1>lrxalPAKn&%Ou;AGja9@y44l{mG{U_*^En^Uk~e~UNJelir<~$FY%tdNo zce3j|x=o^COk6`QLXR~xTYr$PQ$YPzOzrBax=q>`VehPwGJai`UZp&wtE%P0#vdS| zbV&K8SYzm8yU3<`wTb&0f>Gf=4sL-g>obrXf!Yw{(lsTq#gbXm(CECaX?OKaX*}df zvL}T)pj2wTcy*^qtnd?Okyuli>}ML(D%A7D^cir`MVCt+TF5bd`b>Dl&IwbLnbM86 zT6xKm0hm8;0f^h82AZ@iJzHkaXUK2U@m3l(00X;@VMZkNOaKf77zGq0|TE9kty@KbwM>smA2 zwIXQdyQbU+lP7QHrmXlL{|y^93@-e`FX5DvPmoncnubzWRn=BBNt(tLN?}!>tOTr> z6-67nytZBF(p1XQOUF|NTWH4z97N4t;(?r3YVi=n+$wbl>AU=1KoRK`cv@F8*YQszV#*8VEuJt=k2x0 zCL6+WpZ>Ugemgue^$AcXuEvcGYU$nFx%1$yx%2Iu@`edBU46}sc5Zn^IOgMrc~jqW zjce~-d%hF4w}G_FuedfH7io7sUJ)=QkU-A(wKPFstNZk?YZo&@;LIdfLtRiv^S|Q{ z3g7i-rPB;~xn-H}+bE_1fZqvXmkbfX;|M2!5^m2j*4V=I+4h1GGhv3*AWhC zxq&oLo*#wcJuD{62CJB_K}hr%_p##Y?T2b|#@BIwU`thl7 z{;$u1i!ZqnUa(U*6DF(;d)n!r*>j$QpPzHSi&}#c2x0*!CYo=jkgm0Jz@Iq!BXG(o zC&KJ!=D>5$y#SY8ehqy4J7>eGR!GnyjXUnR+f5(sywi5DtBs1EbIxzzAsZlL(8Ycf zz?l&Ov*%EtB?Df9PpG^i=|kAr1)b1MEYx6lwG==t!0-Rb1Gt*8Ut~dq5OBK{jM->VH2hSj4#_#9ZUX#1d@RX4dZ7} z%aM1gkfydQPZ1PjzW*zKVpb}%+x{LiW)*mB+H`n$>SLnqK!XDPc0kHQn)8Z(T&(kxHXyb7>SL|eo(WGs{j4*|X%SARGw6a{ zbWNT5xZ5N#dGe-iK?X&)AAa~Tm^ST6xb5~Su)}s+!Jd1*3wE**>4kQ>=)ChUfd9Ve zGQSSMwrRE1R&hbHTW`BNuC_x=H*D~*pjI8RUku3j8Kwr&C=jy%svuoSSAAJqA+ z$U_->G5>hwV<^AKoE>b8tsV>81v09_eq5J#Y;s=tzG zswb;)nwS^n8;+-*;YMg15vMBruW2 z^v9lh5LAIl{d{~!%B~6w+-e~#v2(E0H3D_p{?URDs%QAH5!S~Y>HJyxqs1Bv7cH>q z7du+h_;hUDv~bb_P3Q=`oM_b{W+|C`OFy8Z^3&nG%OQcj2*gbI4aO>!3@TbZ-JpBPk+l>7^MK z3-@$oUP6MmmRl5suKZ4>a4wPdr}Y96y4;B%^xXvDQ)>+LG=cP0lCVizv7QENdAkUJ z5m281y?OsU`sR~*g!z)QD zH!k#y06Z`-m9Uu@HWK?<3N0F6++?O@b zh)T#Y82wsb*3up9Kt)Q}y_o=g6gyBnJ@`uxFou^usAER}dP=z_!NOY6bV;LFGTy;% zdgPDSAKG;crI&-+9DGN-O zXNtHB!oaAOxxsAto7r+sEeR8%70u?HiPCf_Xf>ep{j`8GzhX`3^}+yS$bEHZ6IYIQ z3{Yv6?9)XNqDj99r=6IAff(JO^w0&`0mV~F9Ue2RYxW}0u-=7ccLmclMZutiWUv@K zo;tFAAoc^?I&o(z)2;ZA=n-CP@9!bx>xZkHzJhB7ABMz~BRiE1FTB z;k=Ztf~0`}PS9Kkk!8bPU*35X2F5k2B1Dpr=$G_$OspKC&?xjKw}0!LiJpw<^ALb; zpv3aC9Pmx`V0jcFXYmO7$gCzaxLp0b%+YOJ*K#t|i~=ZT00?H32|`pY)Zi-gMv@9K zra=alff(KG)auH+sZB$G6pTgFIR|c5wqC5F-(M8VMb%#|1of&blhkQU6NvRs)UAZ3 zWxu}S-r($4%jS6+LEN`kaRpHjt5SVJDX7N7%86!Q)};+n%|G^UGO=%E=I*mYD zndXb>EqNiz=p=4%_>GdJ?y6!S%m3GD>~v0;p7&~6NBeap=w|5=n<@t>26EQo!2t+r z7sLmqX&y>XQ#=^8l8aO;>jRZQ@CrASqo!OcS+wD&sw$qk>ZD*cS~E(&b2`P=Gki3i z^mCmj5ukucS-Sm|YJ)_h!|F6ycmm-RPJ@Ys7b^%+6NOvdm=yR%4T^Thx`4Gb)=R;I z<)Zrsajv;_4egw`0GR2D^l=jK5J`x&*0Qzin6mO(l|nUccL|x(G~d_Jol*1(TAug5 zyZ7Q6zs9B~=jvVB!{=9F^S`KPsT<=)(^OE^oqgy11JWujbpVZP)*1(P?YAUVVG!-b- zNlYBWQWRRo#;7LhwgQv`NaaRI{w5Qci!B{~S3hLHw?CGt_&H14ZXyhuHK0DF5Xlm6 z#-mRH<1*n{dN>SwbI#9yqBEmA!E}sK=d=1yc z4EEGSg$F$aUc%3+i*6mcsYEC-@EilX1u?2_$N0Rr$eWygiY~qfDVpFY+Lwb|?l%dH zjt>%gIY3(+JLNtm!YyxnnjRy!CHYK2NL0a6Ffw})({TIqDU={~^sT&M&>Ly#RT8jy z---dGVp*9<&gJ&eqy)r@S4$>yPXD$xfe@MoCkH|E^X3%k?%=QvJVYh4OnhxOsDxrf>!`gTDT$U zSwJHPxgf)6K4yUv6cCannVO&2_Z&6rw*Y%Yk*!5l$_%LC-6tpSeq5pa_${FQm z@Dti_Ks$~Q>v4com@u#@lkpLK3h`Be(L)+XB?d2IvUivPWYD`V&adv2=+P|TihaXo ze>$-MD$gg{7v(hmJyM=ZO_yL$)uT15QE?L84!w{gDkCFyUoysq1wwtS`>=@XZ7$?1 z-7C&cBdSDIv;t}XZwv-iiD{ae&{z{r&_(#A0tyv9V}I&&RCzH>W3lA~5!}9A z73fVIOgowSQXov?w3t}VF_e-AukwhmUQ?ZPxYomPHNdwZ9FnA3^XK{U2dN2vh%j?4FeB^1K%`Zq>Gs*)*eC81XlO-j;!_9TL(7U zXhJBrPTQAXehu!q_rat>+Taf@|GlHlXx>=Qn>+#txJ{0JZXDd(seF5ROJWsIy70e! ze%fxh^;Vm~@ZoK^?z&q6vV|Pn*M0ZdjqgZH={TR~Uw9d2JUJ@??Zk;2!s=sIgBxzT zqX=M62MmW8P`d|f&-7RrP2)^K_-U~4T(q^`SL;ilf5)z|DU2GmlI6GiV9Db7LbLJX zH+Ls|%$j+>yyg~uO%#Ff_`HVoEVZ++N& zv(4PmM)T*-gGV2I#GPx#JH40}^txy6Rk8vLu?9JDB`{iKY|XZ7=42uzAe9c#AX&L$ zrJ48MdsjIAxR1LH6e-Ga=(7~{ck$v<8!0w8Zp9;-;Fok0pI=pFDw(!clQtZzafMYXCs`wnFDhz$I_D40RgSU-jx0VU0C6hI4;)jP#A!e6>~Af}@T)*;X+CU;5H}-9Bo4t+m$L@R?74 z6)wH(Pw>POk6M~94`2Mkmtni@wu2X*p98PI{wl1x>Pm3J7mtIxr`!!Ef9ni*?X}lp z0qF`TfUepTgpT5dQ1?3#7wrPvi@%dWk!KOSnxXZ4`p)k<$bp#h44nT%F#4GyA6nU1OZyRJQCf`>KMylN@$0#8{angL_`QS}9L zK_wa@sW>G~A~Ah>>hF#_zdywVM1{eotF#Hdpz#dYVHOtvcEW;wWKBvC$8e~3$Iqc| zw%I1I>MAS2g@3+WfwyvT2E+jou)Do$dwB7sS76OG$HE5=-UrS)``5sSA>>1U_D|1) zKVEo=0>vMJkBNtwYUf9D_Lvp?O@dCm951$12)=Z533Qc@=0vc*|Q&UAYOij)nM+MukgsY ztQ%~&g`?ZZk;}k(6DGowGp2&pYU9UEfR$ES8Sc3AW_MQDH@|T@j2$}$zIoEutb({- zcyNnJo56R#^DX$r&wm6*e(czAS_)q#qjpAl(LvF2fGHglOB{QSp^2I^r32{ zvxY$OrG0|5%%BO=dSV&|vxpC#kOm5AS^}mPOYB1{Ei)W4r|X2|tgZ@jD=5A? zGYw?X@v(dDxiegSHN95lI@o*9U0|gZmrI0+2AlLZoUlTh`{@kolTQ8-tUZ2BcQOdd zTO~3+DbPEi3t|#I&pp3d-Z%tdjytBQRK4_HyEP0pdB^_N)V~=XnR>YuR+C`aWml8* zbLLEi1qe(;K7ICdp|f6HrjA~*lo96K*J-q=ro`B*@8fuRwXV`K(GRo&(OG# z18P;2ZYybPAYsUuGZKeKf&9GduD=!j_{YD&e|+R1`17AHa|eZ!rX|yE+ikXhU3S?P zR$X}|c-5L8H{UV^ZoKJES=caY^hh}3@DIQxf4>?QFJ1!gd+*+`sWlC$csefT%75J8 z&Uw<)0?ZUF`&O~qYG>;k@3_O(FnaVTc;=aB;r2W4g}dA#>BefR9bnwJHQ<5^E{Xj? z5RH8BLHod4)+fBy_9Ll7)fI1OP47QOj2LEprgy-ed%Y9Jj#9;h115@UH9K& zvQoN@H{RT8^M{;Uv&zb2oT8ce)Kki815vPd-+dpvXx+uhlPAGH|9NvpT!duGNobe~ zKs|Np^dS0wd~ySo1{P#Mi+_;(q1HwarDNlTbrC?O00EE&ee10^_rU-=*ZbuYKLua; z(y{L3#QW}l*qR<4Yo;6rCx7#JSYf$korGF;^k_Ktlm7vmZMqTs?CjHEhwUfB^Uu8q z3oQr^|H#4c>;L+J9f0-3uLdPV=yUAqW8g_UZ8HPaW>s zv4Rao9QT*I9c_s~y*XaciwEFKDL@5Tot4@2-~lro&TD&91r>$V$aD#Q>jMKji|8dwsO3UlD-ofe!=H~dd zce1|v8y2LG!Mu4d!PB$uvO%VuY_MsBS0MJkInPYB{_Mt{*3KG0SZmyd&H|h@>rqRm zd#t&W}>E@twlK6$u(_D^?j zaL}JEwbDu}z<>Sc_u;E2ei}Y|{K@WqY)j=B`A0warqyiA!AFn$f_ps(T{Hj(9r$hw zpyOc9voBgrcr%=Q((&+qt7(7w^Yc~z5VqTPOZWcV>ubsb7REue!l%ocm!%E0`v4wJCh@gwx%tLMcBD z@{Kp&1!w)_WNVq+Wqq$7J74T1E96$Sg5}%aImh~Mqiytcw0noJV+hM^q^G6Rq2tIS{;ciyq*4yuK>FI1QdaL4>zI+Be z`0!(XXPc$Z>8G9mAOF~)aG5pz->@1v;X$J~(b8wbjo%A1XIvX1&lNm5{bty7vwf|v zx)D4(XR1p%=h;VL`yCF36;>Q;HL~ZmO*YxyT6{0SE3ZCl>v$QCJn}2nOy1bud(l1L ze9|^{CS@+ndU}TY{lxTXRuDb`pE%|-u*Mo|z*SdY0kh}KiAz&$fBd_w0Gcdav0kcl zRh(N7(J`Pm59xVx{-{{`q`n~qiv)X!nVT5#B52Zq0c;3MwuK-kAd<|*wv zciGMgu9s~fu^`k|N{I8gzYxUramkJx zguxbY6E+*p#Hxvj=12MS9NBDU*NQV@^3YVpxN&Q_fhHd?E|v6)G^k@!?s>@hZ1fVY zS6_SGm2>N@_jnD9to6JkyZ62a-HW;?GJD(Y_eSE`za6X}HfPRrb_!)$v0s;6ah>(4 z_j1Rr(o3z6v0$FO`>UO{c*^$IzgOu` zHf~@7ZDg(&K)}WfL7$^Xjf8jZyp^?9ZgR9{Q}0zPfF80yIpBajt-t(F_r^g@lihaR z!9}b24gqM(Ehai&`zL3eXMyp8ue*wMdv_&TJG<<>jScWjgI8aDJrOc|GAGeuM;i=V zeT~&5g8S&S={~KA@!A)yrA9Adqq>=)`FU6qX`9i4b=KV-UVUX6yz$1&xbVk5pZd_H zu^(J^Sn**;vUK%NygYJ45RLHn8KrKOFJVL+zB?E%2T1{lvZJ zO0j}+SCp>{ykRHC5t2R4;$X+C-3^?c*s9jjbNvjp38|hV6wGXNKHExGqTg(TD67~{ z8q_mRJ3&q5vPotMIIOaue9Hx#i1F!~^W5|CEdtz6H?RmVz5JTf?8HQ&6qk0z6_$64 zDM)L_l}z!PY0W|c6Pbzk-~Wg+T@O9v02_VvQv`eNv9r_MbYB7vnmqQC-p70FXHQZz z3MNo6v0t~qnfQ(k;8VvO24lvoDrOS3Z@l$iXU>}K!0^HgFTts&|I`Nh4utQ2=POQF zk!vyak;mcI+wOtsPtNjFDt7}wR(vr-W>I;XH(uG&k%C@)a;YyXT4`ib z)A|5^}<@ zzG=sGgazSbJ9d6bX~v9uV4H0Yu9f8SrlVl`^nXd+)2BZOyYGIWoo-s$T4Bq= ziYu)O(;j=}y;~XP@U*O#y2V z^x^bYFf&LJFEe_COG~CL`FI__>LaYu@ytPQ+goBan!Jt!J%cT_Q(5$0pd7qm%Y_pv zbdkA9$FBa-nt5k@`^(Ncm~EMs%=}w!z1s!ZlAx99Ke<5j-dd2+!(UYI9((NI%+TNd z{$dwhC+$SwCMG`fC*KHQ_6M@xap!$Dc=ezS1dVgA_uSY9+jiY`dn;7-hf_{H+Xc2N ztYkoiW)eiQ(dS*Zc8qrP$3IvYM<3@mGeMiOf z*7UK%R`?`$WYQJ~SQq3P2b$S7khRAiAG3kPm91qr$qMEfcH9?9Tc3S)rq$%H!lX&t zTcNzrS^&f0@h2XYK5j8-E9(X>hKC=1P|?#1lb2q81^(;Y-@?B8>}6e)cfkc0{!Oe! z;RzE%Q+ka&^CJJQ=}triU_ihgS~#Ip(_>Wz&)e~LR2B0*im-mtnx~Ij4e-DNk680# zO}8jurInY5M<1ImzD!_cf>CsI?AX=d zX**R>xdjp|@zBokJ>}kkJ9?Q>cDiPvB9{M`d}j)*J@@=et_`=`HpOb}SKKrXy}f_} zMgO?!Ce_Cbzy%rrXy!yX@O|%r+pI5o(ciB0Qxv2vu?4cWJ22^b>(e`X=h*<$YgQXP zZMEerxaOK$oUl9VCnv#&4%yF2{D-|?2Qk{t03y0k+MRdY0?s|}A}e^T%h4I|{#9qt z(s9693r8RIAv;&O1N`h4zjI@t+noB>SQ}^2{z0Qu-j;RkCjm(9-f73l&aH4e&oCaQ zN9EH@0%>*<*Fi#*{TT}W$ZuW*51v6@+Nrr!Qc325MpfM*E;KN z3%l)coaK#;t>&L*<0a48Ak#d{dz;v2o56z*T%YvsjW=Jl5$S1GXl@C#V{6vT>6T~a zN?Z2d|6muqI_`5HFDf`<$5(A|u+^@d2~MlKSo?O8U3K;8r2N9d^RN^-T_jQZs|5@S ze=cnm&9|E0tNvSU)m7lMQ%{5q)}P>30?oHfGvleJ-68>+29i8Mt5Rq8*=JX)b@sD? zqc=o*Qh;Rq_%)$reIs7{L4Tk6)JNQ_Hm5!^-4Tu%t!=e6&7Ur3r*01akN3+a0uCyW z*-XKvhb&N^vhAUKq=~Qp=WVe6etWq2W}3I0@zgUiC8XcN7Y}L+nu7ns^v#15S?m-Dif_H9q#~4Q%H*!+rLGxTUxztg_8YT@P-v8w^+KrX6MXzcI7R$QR)|7 zcoMeV_5j<))og5Jx}%vsj_AoJABJ~K+zQrTe<69 zWu(82tuMU6hU>#U*0LG2LX)gTx0NyoY7=F8=vQt%@zhew^G+3mU95PkB1p5p6wLZ( znyv!&fTPIRbB|r%J@4Mt{T=u|J5BTT)T9=Hm-&WwSbuuYy>^B@tpMUc9+}7={?Pt* z3d09`Xt4kLqN}WL`VRQQ=Z3 z@%yr7+d$XfFS{N-`7$olemdwOls?Uz`8X`I%<@)1tZs$+w8ScT;DLLs`*)Y^+ZSxW>SM6(y6f5~{mQnF zYr=aE*blya`pNM8^Dn?9f4?$p`Bb~-qKzEQ-IonRs%H)4ub@fe&U=sls z0KH)0B5x&BRZ5k>ko3=A|9TaSwL*iYPsj|W$S?`33opDJw%&R(aOa5G{Etn05`OfP z^V~*-pPqS=)htWg)C>tCGNrG%_BNR&y5YvVZTlv`hY#HsKJfm%-RU0Zp8t2NS(br| z|Nc+W%1)cQ6>a3JqgWXfm^$XDL!DM6U!P3c_}Z0VCJSSGUzV3q&b9G?*Is`!Xb23! znef^iTi0)Ycd^s{q=k308kguzF4UB}AA~>H7{eQHyyZ0$nVb|4pz-isg=n?qi z1%I*r@T+mHcZfFoH3J~l3l=fQ_qeAjEbq)1D-0%XwtLs`R8Rjnd(P=c(i`P%kV!XY zp=Iv*^XE&t#J7Uj5%S&EU3V>5ee77bT=6kG<>DA3Xb_U%7ytEt*a+>#nng70N9a#ij^!auSQpM>7ZXCPtoi;kW<^t`+PI0`UV0vefCU+}!Vy#cx@9 z4M2V+3~tLBHF_mW+l96czsY9g$mMP1d!Y+p8JU}kuo*RK8P~6Q^WLm)tO;o;7&m@A zjnRrOu0RVqXpMs$RAFNd$%-nIt*&A&LcM(h50sXw(Q_yb;;Me-h2DTVN;(T~*NE zr5P~X$?fJ^j_?m=4Xn~-W3m}NB+{VPW}9?O4YD(TZCHSOsaD$qU~sVIK+Lbt)P(bE zPW_?j9Yt7qOQ0eSS4#7+GpwIT0W3C+#iRt?R%T{tDX<{YG-6=X>B+(XU0*sugSlgK z&;!FAj*k!oS{3}|^rdE1IPF9SRpJVu7Wjh(A*^VafY_Hzn8rHdsxWRhD*u;2 z>efsL0nGEADCbXCferXrVSn0Br&+Y%V5mtYUU) zn}7mRK!|pZWzaOz^y#ylIq4;&f8Q;(gEk_+aDa}Zv6^OpkFo7Yn;bJc4NHdyRDoE$ z<0I4)Mr-8A;WmJ@y!A2fbf$R(pY8+uh3X#n31WY_0oXt{RF;SnH0_pH49p-MoioFDhE50}A9zXdfjiCzUhI}n^4Z5)7{xvTXw8eLciaH*E+C#Fb1x64Q!IiD z;tno!Cc7Vt4!bU)ANq6&UXi2&Jv`m$re&TKBvDncgd1G(PQkB7XQ6>xoJk)sMz>!lbAY>-2$XFq1^7Ae+pg*=^E3!Q^w#!~2_c zs(f!OD#nKd#M<;>U@*C~pyGQ%9*mllgb@L)+5`|BM6VERrq~^4r%5scMYqi5XGEXH9vWiDPH|}15$3A__n~NUs z@mL-7Dk(59(@8D6VQht-V_`8w4th=N=vQOZctH#LvY65)QJ#8AkO3YK;CH9AMJx!5 zpcH^=+&MUvSQc6IRDfA1`NR`_ybWj& z^Qo3ht12!!alNe~fT=9Qrhe!@-IG_wumu5OdI>s;tW}~Bg`E+?n>ai)G@tlsB1Kp2 z59?u4jPJF2YJ!TOO)gBoE2W|r&X{1eY1(&8h47uqd zjpp8j5&*#~a|oQ!60@z+E2s3r3*;bH2#j%={K`=Vue3`GB9yh&ylql^+@S60{JWMg zx=-h{E0;%U-Lb-zV{TbG$|h~c#Fvag5TMw@WafLA50f^{{ipLpSz96q9k`qln6*`< z58v}zmmTIPh*A5ZntwqV<$+HPDt-w37N?mrB^RtP?hwa3vds)w1}`=|)y#+3cn_P( zR~?UeQ_UorI4~FgX|paVmx0&uejXhNM~l#z*_}^3FyH{e=TCDJT;$Z5tb^f@JoWN5 zOq#8ruLTfheSpNu(BO?}W51)>9hb_H0E(I)li(3AwIg>yPl>g786K6>Qp@sMl@Hpv z1I?rMHcA60@rFS2D$%}`2$vWf^9S;|SI8P8TG~g^Q-R=j6?kAWaNUu@?$ab7^=7n* zN;EN<)nLe_CJnPMY*l%o;?p{so2bomGrSJobgB!~IJ@+kPcq(*3MSMYrkaBK@U2m? zt_oxME{Ad@{B2LGHmaR0$(2cu^jQzEVkuuCEwah42mw*^B4)q^0L%!hn*)jT?zk7I z5n!uo&@njyxz*~x05KiS6%TfjiFqeo9mp%?Gn=4Apx7Jv7eQ%LOaNL7d=)-@u3)ZK zQ8TyN?clfjkrh8YFjW=SBm3BZ7dX5gIvxrbj%sm2jD27aZZV-V%`5#;8r(;ey|2rr zB+tQ99HGTg=)j3?IVz7CrSEvgGgT0dj!rHl=YfjKbz#}c46NKFJroHTK|NC{+Lcqq z0Ga1I2DJLl0750Wu!Gk*dIOqosqt=bhLgFZ-Axn-H{u%lwt&xl>V$dZjtQ^wG*IXVC;$ebleaJH6DYwHi%>MG;s%kbYKazhQ$KFi6^c*n zH*okRq8J1YgW3VM<%3;SE7g|NnGSYby2y}<#_UH!6bLLR*fe*iZ?xJmYHAGdI&0eX zfYcP-MIB}LG%;beLY{LV z&LsLZ@`VB}_mP3haVFrNYFKe4$un+=Uv;wH(fzc*SOo1(HN)J>6-fSk5I^^fQxb)n;TeoAP7G!QH zw3*wbO;BOtq@T*lkUr{iqCj%s!(pzC#&}KWt$M%kfsf&JuSEr~g)0@@a(*g-z8Z-0 zzyPA5ISQ?P-NeeN;=&NW?waq#9Z7@kTyM4zTAt53nWaSd?S%JQ$y_Ih-!AN9{F&Em zj%uwLnMVONJO@Qz&cmtL!VsTZxW2bQ3l?}_3e#X7a{Vc4`7uAcWh6rSJrsD+gW2V8EvIqGdc);Kn3+; z+@d~>q!E==qU){$KEMak3<{tsUGiPkiPwRMKfm==! zSFNClEz>!WyG01TT&JB#OAQSApqHA0O1VG{1S-L%z?*345TxR?TH}G%1|jn9rjs04 zd>PIUc3}1nqT*t!>^8W=4Vi^H6TOaQSA>qx+nmcl+pEX2A{Xr)toGw&MgA~sY20O zm#UK32bbvj5lmk+sd9lRG)!jldWD&yr;I2Q1w#V#Xr0uqP;OhBs@$RC#f+5|g0(yd zc@ecBPWC+-Ch8x=OqOWv%V4b}TF1=KgAfM>gqplsh67vlUS0}pk&n4#i3f5O%xSKg z0xXV!Iq2n95OuUrPuiZeQ3F`8iK!4{p(Fr`0-#cUFtrnKaR^eyvy9b4K zGN0&vr$$B)Xu;{vS7}MTf$Q2lEue}|YD*xikl7u$b?q4&pP7o8mS@JVJc94TV~%ZnxG)4j}VaEaf>*D<1r>1-v6Tz4vEPHTqKRLDT6eaeym)4pe< zAqI0UZoqF3_hvJj&KS<;C2dPv`P^VTAPxrqw;g=o0KQgRv?hb4YU#+aqElEJ8P{45 z3&+~3lQ_aEF>*DiBThJU_#I4?)<>J&`ryE^9PBc|9Mk}ffhnjlbe+s~?JHA)kZN^Z z9%^NvOlG=x{yz%R%2AZx8d*|c-fDA+bPpQVl^OW-&PnS2e=R+S`56ROXgi|;lqcG z5TWBD$!7Ms}-h`yx;ABYlgvKt0O@yE&N&%wQkFSf_m+> z%wu9a^2Ym&f#!x{wFHXFy^I_JV7(isO=hiu!WX~dA_1U~7ywf9*)%YJU1NK`U~}L1 zliJ{4Jcg;|)8Mm8oow!hv0^O@kec(geB4tL@3BDj!9B|3rGrs(~!5Da`E2Q?hI{zom=)Ap?ey@d9l!3r$<{o!0@#UTb7OSMgjJGjRcAP9Bxn zj?y0OI@LEPV6B}|P^H2LGN5yuf~`Wn+R5>%8Gz(F6Cr^)Ch0=!)~gG}0Za3D$jhw?GKb+K7dIhVGFb{JYlbM12Vva&PfD@<(Dgms& zI&SZ@Zf9Je5zO!)99RSME+`lP0XhfI;*mX3n7PIM*ik;OsRJ-v32-?*G+db$k6;Oz ziO=~gsUQ@&Zz6bEpm)4WVvN?D@l%%78m}Qm&nhfwODYNhO#0H%faNk3pcCuDK-%{t zn1w>5Hu*L=G&NZ3c049UfC6OA-xc72NTv8tgFU9x8aoOEEC?5@YcWWH!0q9w0l+FT z6SX8GAd(hoS#Y*T4ug>+N5KGTpCya@d~ncQRE}Q=(h?1=4+f|SKd}ZPGhvkrHh?%S z#_flo(fqU#-5WtK=jxcCH9V;3Rhpz(TjBUz+LzQ$08GKF!7yJ;X;a_5-R>my>N#YN z4@eZ6mu(vF8*&iHna(OdTU#9mipl|)89oKC=pG0+KwrirPt|>sl?RC?i^?K(3w*MU zJ3N4zRE0I!6)!NU@j9deC)1Wn8>xDAn^ZXv4zp9`Xj({-4B@QXX?$CapBy2|?J-JA z3W(!(Q8P6_K}~Zek}MR2NoD*s04=p$k~~bWVwo6)ihfB{0wAS{MblMEs1Q+U|FG3k z1Mcwmkru=w!(8!VcdsL7Jh3MBtGU=G*3va?7sln0YLNh93CJnac~E#D(zI8n6Q{!b zc1iD(w!@q(X_r>`P2dKnfd{-M9iZJoE#F4;nxy5Xqf!m*0342o^#BgOaJv=Gdmfaz zVFJXGPMDt#n%DUl+n^ zG<~*}k$eIp2~@_mCbeW3@!=~O`e^!^%w&dC$k!|f-74b&El;qP#0Rk=D0HeED5~-L zMghn%S0)S)YEn+5WnPwlD0!>oR<6Bc-IdxYBhR%K)F4*Cf?5}XB5cF@wwY=Sxo~_*N`Q%LThE;0Fyq68XHSs1jW=` zf_j4SdAyqm2Nnd%jL~K4g%XKGPE6={UT{3~*q7y3JrOXy4@e-U01^eZoYqw!C2$Xf zfEQ0Obvo(Eh3OjuQ*+us*Vab4y?n0K$o43qc`I-|ft7&m{BkqsHLwHiaL>SDZ#3PD z3oWX^038t&3{*bZg!21nbSs$Y!yH|_Y3{YJ?}ryIZvF(rVhzXq9We(>(<9-L`i=T- zOrx}vF{$P>2BJVj-xj@5BV+S$@9F`*NjD#lN4DXp77iDh&FE@ljyT!Cp-;Zi52=1o!;fG~Xe8v#ITTc`tr zPpn{I1z*z>&p1#LIEgt&SaX_=4y7Y#{Hm=%=S#K0N2fiA#H#3MCLpX3@w>-x~J1gwVDD?832%adhUk`fVq!KgaT>-t*jMl zpPMruWO`R2e{6qJXNM!>(%Mw5DBhBmnAphFTn@jTg6Smv!dhQV(wdU8WMyRv!jG;t z4{}<%FH|!XADWdWLtt2eZVG|`C?u1{#GWYQ0n>UT_RD}TYGfri7%*i3`*u}o(Aj?z zz=Yqt5rTqPWIhg~xnj%6WKPo>YI?h$AM9a{!Rc-7-kc6c+8UD#oYYnEj+aW&DhjN! zA6&V^`r6Kn^-Df!YRC;DnY&iFm_dJ-K^1~eZWj}Hzu1GiElk=80)$WZh{3D22XH$E z$5=qPWs|LV_LXa`_{`wmQN=r=z(jLbM^@`sDQKgDJPK5`{6QGYyNv?{osS+icO>f^ z{2-(jfc8;AZ5~j(?Jb@N+PG*$#XMNYX8mZqM2q@-xw146@us!276nv$nwJy_{wVmzEPNMkPqf=`hp2;klTmP}9uOSIU+S29uRdK^LL6j4@)w zNWbXAow2;w`;Z}WLA0d9!3V=~%#PAPB4C1f&%Us1kdIQ!eaJb(6{_Q7y(vq1$()x+ zv<262YwmVh0oYDsGJrjZ+7^7|2lGY2EY?iicP`)Un^pjJik!%ty2mm@( zoQQ5E95B&YCC%*H%UqN4Ge6@(oCfAf60n4nWsQpo=o4+LTL3A5BdC&;>bEwa((;qi z8#Od*R!)>MU93MnyQ-2io+5B7wHt`icK9R@YmSmn%;q#N_;4U0O-KQ+fyI96X|R5v zH~ZXdwsSoxjiVJ2&tR^?!VK#Nj~Fh3sU1$RB+G#4=QlG14b1TkTYYC3Mc4Mk2xPS9|3GMGl{n2;{ilDB|du!e52df