From 53a0fd66635ef721fda402454606dc34e122868e Mon Sep 17 00:00:00 2001 From: sudjoao Date: Thu, 24 Mar 2022 10:25:14 -0300 Subject: [PATCH 01/79] Create ListTextWidget class and update ExhbitForm Co-authored-by: Hugo Sobral --- src/ARte/core/forms.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/ARte/core/forms.py b/src/ARte/core/forms.py index 4bdaeeb2..b5d4fd40 100644 --- a/src/ARte/core/forms.py +++ b/src/ARte/core/forms.py @@ -4,6 +4,25 @@ class UploadFileForm(forms.Form): file = forms.ImageField(required=False) +class ListTextWidget(forms.TextInput): + def __init__(self, *args, **kwargs): + super(ListTextWidget, self).__init__(*args, **kwargs) + self._name = 'exhibit-list' + self._list = Exhibit.objects.all().order_by('name') + self.attrs.update({'list':f'list__{self._name}'}) + + def render(self, name, value, attrs=None, renderer=None): + text_html = super(ListTextWidget, self).render(name, value, attrs=attrs) + data_list = f'' + for item in self._list: + data_list += f'' + data_list += '' + return (text_html + data_list) class ExhibitForm(forms.Form): - exhibit = forms.ModelChoiceField(queryset=Exhibit.objects.all().order_by('name')) \ No newline at end of file + exhibit = forms.CharField(required=True) + + def __init__(self, *args, **kwargs): + super(ExhibitForm, self).__init__(*args, **kwargs) + self.fields['exhibit'].widget = ListTextWidget() + self.fields['exhibit'].label = "" \ No newline at end of file From f623f4f2bef9b69191899e44c25047c3ca35f64b Mon Sep 17 00:00:00 2001 From: sudjoao Date: Thu, 24 Mar 2022 10:27:03 -0300 Subject: [PATCH 02/79] Update exhibit_select function to receiven just the exhibit Co-authored-by: Hugo Sobral --- src/ARte/core/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ARte/core/views.py b/src/ARte/core/views.py index f93e5d92..4eb3fa6f 100644 --- a/src/ARte/core/views.py +++ b/src/ARte/core/views.py @@ -88,7 +88,7 @@ def exhibit_select(request): form = ExhibitForm(request.POST) if form.is_valid(): exhibit = form.cleaned_data.get('exhibit') - return redirect("/" + exhibit.slug) + return redirect("/" + exhibit) else: form = ExhibitForm() From 36053f1b32d442c1f378972e3d50c26cb8c8aae3 Mon Sep 17 00:00:00 2001 From: sudjoao Date: Thu, 24 Mar 2022 10:28:42 -0300 Subject: [PATCH 03/79] Add new form in exhibit_select screen and remove unsed function Co-authored-by: Hugo Sobral Co-authored-by: Sofia Patrocinio --- .../core/jinja2/core/exhibit_select.jinja2 | 28 ++----------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/src/ARte/core/jinja2/core/exhibit_select.jinja2 b/src/ARte/core/jinja2/core/exhibit_select.jinja2 index b0270085..22be5ce5 100644 --- a/src/ARte/core/jinja2/core/exhibit_select.jinja2 +++ b/src/ARte/core/jinja2/core/exhibit_select.jinja2 @@ -14,17 +14,9 @@

{{_("Choose the Exhibition you're seeing")}}

-
- -
-
+ {{ csrf_input }} - {% for field in form.visible_fields() %} -

- {{ field }} - {{ field.errors }} -

- {% endfor %} + {{form}}
@@ -32,22 +24,6 @@ {% endblock %} \ No newline at end of file From 01bb4b48ef04460510f36e85c50b12ed2abe0b09 Mon Sep 17 00:00:00 2001 From: brenno-silva Date: Wed, 8 Feb 2023 18:19:16 -0300 Subject: [PATCH 09/79] Changing conditional to show modal --- src/users/jinja2/users/exhibit-create.jinja2 | 22 +++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/users/jinja2/users/exhibit-create.jinja2 b/src/users/jinja2/users/exhibit-create.jinja2 index bb0f4b41..15e18535 100644 --- a/src/users/jinja2/users/exhibit-create.jinja2 +++ b/src/users/jinja2/users/exhibit-create.jinja2 @@ -104,6 +104,17 @@ } } + function checkMessage(innerText, messageList) { + var contain = false; + + messageList.forEach((message) => { + if(innerText.includes(message)) + contain = true; + }); + + return contain; + } + setInterval(activateNextButton, 100); // modal events $('#select-artworks').click(function(){ @@ -120,14 +131,15 @@ let exhibitNameError = $('#exhibit-name-error')[0].innerText; let exhibitSlugError = $('#exhibit-slug-error')[0].innerText; - // 54 is the length when there is no problem - if (artworkError.length != 54) { + if (checkMessage(artworkError, ["Este campo é obrigatório", + "This field is required"])) { $('#form-modal').modal('toggle'); currentTab = MARKER_TAB; showTab(currentTab); - } - // 56 and 62 are the length when there is no problem - else if (exhibitNameError.length != 56 || exhibitSlugError.length != 62) { + } else if (checkMessage(exhibitNameError, ["This name is already being used", + "Este nome de exibição já está em uso"]) || + checkMessage(exhibitSlugError, ["That exhibit slug is already in use", + "Este link de exibição já está sendo utilizado"])) { $('#form-modal').modal('toggle'); currentTab = ARTWORK_TAB; showTab(currentTab); From f9db74d64b519db9088e3e566d15d6b01d8e7c45 Mon Sep 17 00:00:00 2001 From: luiz-hfz Date: Wed, 8 Feb 2023 21:57:28 -0300 Subject: [PATCH 10/79] Corrigindo componente de login e signup --- src/core/static/css/home.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/static/css/home.css b/src/core/static/css/home.css index 9f933ab2..e10f9f4e 100644 --- a/src/core/static/css/home.css +++ b/src/core/static/css/home.css @@ -51,7 +51,6 @@ height: 40px; line-height: 40px; width: calc(50% - 5px); - padding-left: 0px; margin: 0; margin-left: 10px; } From 245dd14a9b152ecf3c6cfea143303a22ac8fbd1c Mon Sep 17 00:00:00 2001 From: lorenzo7377 Date: Tue, 6 Jun 2023 14:10:01 +0000 Subject: [PATCH 11/79] Fixed grammar on document --- .github/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index d5f4fb6d..415938f1 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,5 +1,5 @@ ## Repository Policy -All contributions to ARte must be tracked by an issue and at least one pull request. To start working on an issue you must fork ARte repository, create or pick an issue. Also check that there is no issue that already adheres to what you intend to post. To create your branch, follow the pattern: `feature/issueID-issue-title`. When you have did your first commit on your fork you have to create a pull request to ARte devel branch so we can see your work in progress. The pull request name must follow this pattern: `{STATE} {ISSUE NUMBER} - {ISSUE NAME}`. Where {STATE} is the state of the pull request, all pull requests must be created with [WIP] tag and when you think you resolved the issue change to [REVIEW]. Example of pull request name: [WIP] 435 - Refactor create method. +All contributions to ARte must be tracked by an issue and at least one pull request. To start working on an issue you must fork ARte repository, create or pick an issue. Also check that there is no issue that already adheres to what you intend to post. To create your branch, follow the pattern: `feature/issueID-issue-title`. When you have done your first commit on your fork you have to create a pull request to ARte devel branch so we can see your work in progress. The pull request name must follow this pattern: `{STATE} {ISSUE NUMBER} - {ISSUE NAME}`. Where {STATE} is the state of the pull request, all pull requests must be created with [WIP] tag and when you think you resolved the issue change to [REVIEW]. Example of pull request name: [WIP] 435 - Refactor create method. ## Coding Style Make sure you are following our code style when submiting a pull request, following the style you make the process of reviewing your pull request better. From 8a139b733c493f641acefc4cf4f1c6f2cecccc43 Mon Sep 17 00:00:00 2001 From: lorenzo7377 Date: Tue, 18 Jul 2023 00:08:25 +0000 Subject: [PATCH 12/79] Grammar erros on the readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9993c655..9d555d75 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ # Jandig ARte ARte is a Progressive Web App for augmented reality artworks. Our goal is to give a way for artists share their artworks in a simple and free way. -You can see galleries with pictures of [exhibitions](http://memelab.com.br/jandig/exposicoes/) created with Jandig. +You can see these galleries filled with pictures of [exhibitions](http://memelab.com.br/jandig/exposicoes/) created with Jandig. ## How it works Jandig ARte uses image pattern detection to detect [augmented reality markers](https://www.kudan.eu/kudan-news/augmented-reality-fundamentals-markers/) through the camera of a device and render a content (currently a GIF) on the device screen, giving the impression that your device is like a virtual window that you are looking at. ![usage](https://user-images.githubusercontent.com/12930004/46251341-770de200-c426-11e8-9671-d870d1b9bd5d.jpg) -Jandig ARte is a Progressive Web App, which means you can open in every device with a browser and a camera. Also you can add Jandig ARte to your homescreen and it will run like a native app on your device. +Jandig ARte is a Progressive Web App, which means you can open in any device with a browser and a camera. You can also add Jandig ARte to your homescreen and it will run like a native app on your device. ### People We are a small team based in Brazil :D talk to us on [Telegram](https://t.me/joinchat/HES_ShA6TMPP-aiHxH7thQ). Here's a list of some of the contributors for the development: @@ -38,7 +38,7 @@ We are looking for artists (both illustrators and animators) to create great con You can find interviews and references to Jandig in the press [here](http://memelab.com.br/jandig/clipping/). ## Get Started -To contribute to Jandig ARte it would be awesome if you read [Contributing](https://github.com/memeLab/ARte/blob/master/.github/CONTRIBUTING.md) and our [Code of conduct](https://github.com/memeLab/ARte/blob/master/.github/CODE_OF_CONDUCT.md). After a good read you are ready to move foward! +To contribute to Jandig ARte, it would be awesome if you read [Contributing](https://github.com/memeLab/ARte/blob/master/.github/CONTRIBUTING.md) and our [Code of conduct](https://github.com/memeLab/ARte/blob/master/.github/CODE_OF_CONDUCT.md). After a good read you are ready to move foward! ### Prerequisites We use docker and docker-compose to ensure a consistent development environment and to make the deploy process as painless as possible, so all you need on your development tools to run Jandig ARte is [Docker](https://www.docker.com/) and [Docker-Compose](https://docs.docker.com/compose/overview/). From b277f892ede82208ce3127bcf37bbd576c0c2572 Mon Sep 17 00:00:00 2001 From: lorenzo7377 Date: Tue, 18 Jul 2023 00:13:10 +0000 Subject: [PATCH 13/79] Grammar erros on the contributing document --- .github/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 415938f1..0c752c77 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,5 +1,5 @@ ## Repository Policy -All contributions to ARte must be tracked by an issue and at least one pull request. To start working on an issue you must fork ARte repository, create or pick an issue. Also check that there is no issue that already adheres to what you intend to post. To create your branch, follow the pattern: `feature/issueID-issue-title`. When you have done your first commit on your fork you have to create a pull request to ARte devel branch so we can see your work in progress. The pull request name must follow this pattern: `{STATE} {ISSUE NUMBER} - {ISSUE NAME}`. Where {STATE} is the state of the pull request, all pull requests must be created with [WIP] tag and when you think you resolved the issue change to [REVIEW]. Example of pull request name: [WIP] 435 - Refactor create method. +All contributions to ARte must be tracked by an issue and at least one pull request. To start working on an issue you must fork ARte repository and create or pick an issue. You should also check that there are no issues that already adheres to what you intend to post. To create your branch, follow the pattern: `feature/issueID-issue-title`. When you have done your first commit on your fork you have to create a pull request to ARte devel branch so we can see your work in progress. The pull request name must follow this pattern: `{STATE} {ISSUE NUMBER} - {ISSUE NAME}`, where {STATE} is the state of the pull request. All pull requests must be created with [WIP] tag, and when you think you resolved the issue, change to [REVIEW]. Example of pull request name: [WIP] 435 - Refactor create method. ## Coding Style Make sure you are following our code style when submiting a pull request, following the style you make the process of reviewing your pull request better. From ccfe0ebf26bd548a88d388b896e69b84735cefe8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 23 Jun 2024 21:53:03 +0000 Subject: [PATCH 14/79] Bump sqlparse from 0.4.4 to 0.5.0 Bumps [sqlparse](https://github.com/andialbrecht/sqlparse) from 0.4.4 to 0.5.0. - [Changelog](https://github.com/andialbrecht/sqlparse/blob/master/CHANGELOG) - [Commits](https://github.com/andialbrecht/sqlparse/compare/0.4.4...0.5.0) --- updated-dependencies: - dependency-name: sqlparse dependency-type: indirect ... Signed-off-by: dependabot[bot] --- poetry.lock | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3a193c17..d569a148 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "alabaster" @@ -1651,19 +1651,18 @@ test = ["pytest"] [[package]] name = "sqlparse" -version = "0.4.4" +version = "0.5.0" description = "A non-validating SQL parser." optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, - {file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"}, + {file = "sqlparse-0.5.0-py3-none-any.whl", hash = "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663"}, + {file = "sqlparse-0.5.0.tar.gz", hash = "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93"}, ] [package.extras] -dev = ["build", "flake8"] +dev = ["build", "hatch"] doc = ["sphinx"] -test = ["pytest", "pytest-cov"] [[package]] name = "text-unidecode" From b7a8e38ee6b45e116aa4c6fc664d9d65334b5067 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 23 Jun 2024 21:54:22 +0000 Subject: [PATCH 15/79] Bump idna from 3.4 to 3.7 Bumps [idna](https://github.com/kjd/idna) from 3.4 to 3.7. - [Release notes](https://github.com/kjd/idna/releases) - [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst) - [Commits](https://github.com/kjd/idna/compare/v3.4...v3.7) --- updated-dependencies: - dependency-name: idna dependency-type: indirect ... Signed-off-by: dependabot[bot] --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3a193c17..3e0841e8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "alabaster" @@ -768,13 +768,13 @@ tornado = ["tornado (>=0.2)"] [[package]] name = "idna" -version = "3.4" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] From 8b012b4ed957991c54e8c81cca303de14b6ca158 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sun, 7 Jul 2024 22:08:44 +0100 Subject: [PATCH 16/79] Update dependencies --- poetry.lock | 1275 ++++++++++++++++++++++++------------------------ pyproject.toml | 5 +- 2 files changed, 626 insertions(+), 654 deletions(-) diff --git a/poetry.lock b/poetry.lock index ec1b2ee4..cf77f81e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,61 +1,46 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" +version = "0.7.16" +description = "A light, configurable Sphinx theme" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] [[package]] name = "asgiref" -version = "3.6.0" +version = "3.8.1" description = "ASGI specs, helper code, and adapters" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "asgiref-3.6.0-py3-none-any.whl", hash = "sha256:71e68008da809b957b7ee4b43dbccff33d1b23519fb8344e33f049897077afac"}, - {file = "asgiref-3.6.0.tar.gz", hash = "sha256:9567dfe7bd8d3c8c892227827c41cce860b368104c3431da67a0c5a65a949506"}, + {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, + {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, ] -[package.extras] -tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] - -[[package]] -name = "attrs" -version = "22.2.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.6" -files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, -] +[package.dependencies] +typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} [package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] +tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "babel" -version = "2.11.0" +version = "2.15.0" description = "Internationalization utilities" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "Babel-2.11.0-py3-none-any.whl", hash = "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe"}, - {file = "Babel-2.11.0.tar.gz", hash = "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6"}, + {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, + {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, ] -[package.dependencies] -pytz = ">=2015.7" +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "black" @@ -93,124 +78,112 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.26.60" +version = "1.34.140" description = "The AWS SDK for Python" optional = false -python-versions = ">= 3.7" +python-versions = ">=3.8" files = [ - {file = "boto3-1.26.60-py3-none-any.whl", hash = "sha256:5fd2810217a74a38078a19fb85a9e5d6934d0c146eb060967a3ffd7ab33cdf00"}, - {file = "boto3-1.26.60.tar.gz", hash = "sha256:f0824b3bcf803800d3ecef903b4840427e4b3d37a069f6fc9a86310f7e036ad5"}, + {file = "boto3-1.34.140-py3-none-any.whl", hash = "sha256:23ca8d8f7a30c3bbd989808056b5fc5d68ff5121c02c722c6167b6b1bb7f8726"}, + {file = "boto3-1.34.140.tar.gz", hash = "sha256:578bbd5e356005719b6b610d03edff7ea1b0824d078afe62d3fb8bea72f83a87"}, ] [package.dependencies] -botocore = ">=1.29.60,<1.30.0" +botocore = ">=1.34.140,<1.35.0" jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.6.0,<0.7.0" +s3transfer = ">=0.10.0,<0.11.0" [package.extras] crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.29.60" +version = "1.34.140" description = "Low-level, data-driven core of boto 3." optional = false -python-versions = ">= 3.7" +python-versions = ">=3.8" files = [ - {file = "botocore-1.29.60-py3-none-any.whl", hash = "sha256:c4ae251e7df0cf01d893eb945bc8f23c14989ed349775a8e16c949f08a068f9a"}, - {file = "botocore-1.29.60.tar.gz", hash = "sha256:a21217ccf4613c9ebbe4c3192e13ba91d46be642560e39a16406662a398a107b"}, + {file = "botocore-1.34.140-py3-none-any.whl", hash = "sha256:43940d3a67d946ba3301631ba4078476a75f1015d4fb0fb0272d0b754b2cf9de"}, + {file = "botocore-1.34.140.tar.gz", hash = "sha256:86302b2226c743b9eec7915a4c6cfaffd338ae03989cd9ee181078ef39d1ab39"}, ] [package.dependencies] jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" -urllib3 = ">=1.25.4,<1.27" +urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} [package.extras] -crt = ["awscrt (==0.15.3)"] +crt = ["awscrt (==0.20.11)"] [[package]] name = "certifi" -version = "2022.12.7" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] @@ -218,110 +191,112 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.0.1" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = "*" -files = [ - {file = "charset-normalizer-3.0.1.tar.gz", hash = "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-win32.whl", hash = "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-win32.whl", hash = "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-win32.whl", hash = "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-win32.whl", hash = "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-win32.whl", hash = "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59"}, - {file = "charset_normalizer-3.0.1-py3-none-any.whl", hash = "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24"}, +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] name = "click" -version = "8.1.3" +version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -355,18 +330,18 @@ six = ">=1.10" [[package]] name = "django" -version = "4.1.5" +version = "4.2.13" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.8" files = [ - {file = "Django-4.1.5-py3-none-any.whl", hash = "sha256:4b214a05fe4c99476e99e2445c8b978c8369c18d4dea8e22ec412862715ad763"}, - {file = "Django-4.1.5.tar.gz", hash = "sha256:ff56ebd7ead0fd5dbe06fe157b0024a7aaea2e0593bb3785fb594cf94dad58ef"}, + {file = "Django-4.2.13-py3-none-any.whl", hash = "sha256:a17fcba2aad3fc7d46fdb23215095dbbd64e6174bf4589171e732b18b07e426a"}, + {file = "Django-4.2.13.tar.gz", hash = "sha256:837e3cf1f6c31347a1396a3f6b65688f2b4bb4a11c580dcb628b5afe527b68a5"}, ] [package.dependencies] -asgiref = ">=3.5.2,<4" -sqlparse = ">=0.2.2" +asgiref = ">=3.6.0,<4" +sqlparse = ">=0.3.1" tzdata = {version = "*", markers = "sys_platform == \"win32\""} [package.extras] @@ -399,13 +374,13 @@ test = ["beautifulsoup4 (>=4.6,<5.0)", "django-stubs (>=0.12.1,<0.13.0)", "facto [[package]] name = "django-cors-headers" -version = "3.13.0" +version = "3.14.0" description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)." optional = false python-versions = ">=3.7" files = [ - {file = "django-cors-headers-3.13.0.tar.gz", hash = "sha256:f9dc6b4e3f611c3199700b3e5f3398c28757dcd559c2f82932687f3d0443cfdf"}, - {file = "django_cors_headers-3.13.0-py3-none-any.whl", hash = "sha256:37e42883b5f1f2295df6b4bba96eb2417a14a03270cb24b2a07f021cd4487cf4"}, + {file = "django_cors_headers-3.14.0-py3-none-any.whl", hash = "sha256:684180013cc7277bdd8702b80a3c5a4b3fcae4abb2bf134dceb9f5dfe300228e"}, + {file = "django_cors_headers-3.14.0.tar.gz", hash = "sha256:5fbd58a6fb4119d975754b2bc090f35ec160a8373f276612c675b00e8a138739"}, ] [package.dependencies] @@ -444,13 +419,13 @@ testing = ["coverage[toml] (>=5.0a4)", "pytest (>=4.6.11)"] [[package]] name = "django-extensions" -version = "3.2.1" +version = "3.2.3" description = "Extensions for Django" optional = false python-versions = ">=3.6" files = [ - {file = "django-extensions-3.2.1.tar.gz", hash = "sha256:2a4f4d757be2563cd1ff7cfdf2e57468f5f931cc88b23cf82ca75717aae504a4"}, - {file = "django_extensions-3.2.1-py3-none-any.whl", hash = "sha256:421464be390289513f86cb5e18eb43e5dc1de8b4c27ba9faa3b91261b0d67e09"}, + {file = "django-extensions-3.2.3.tar.gz", hash = "sha256:44d27919d04e23b3f40231c4ab7af4e61ce832ef46d610cc650d53e68328410a"}, + {file = "django_extensions-3.2.3-py3-none-any.whl", hash = "sha256:9600b7562f79a92cbf1fde6403c04fee314608fefbb595502e34383ae8203401"}, ] [package.dependencies] @@ -473,40 +448,40 @@ django = ">=3.2" [[package]] name = "django-storages" -version = "1.13.2" +version = "1.14.3" description = "Support for many storage backends in Django" optional = false python-versions = ">=3.7" files = [ - {file = "django-storages-1.13.2.tar.gz", hash = "sha256:cbadd15c909ceb7247d4ffc503f12a9bec36999df8d0bef7c31e57177d512688"}, - {file = "django_storages-1.13.2-py3-none-any.whl", hash = "sha256:31dc5a992520be571908c4c40d55d292660ece3a55b8141462b4e719aa38eab3"}, + {file = "django-storages-1.14.3.tar.gz", hash = "sha256:95a12836cd998d4c7a4512347322331c662d9114c4344f932f5e9c0fce000608"}, + {file = "django_storages-1.14.3-py3-none-any.whl", hash = "sha256:31f263389e95ce3a1b902fb5f739a7ed32895f7d8b80179fe7453ecc0dfe102e"}, ] [package.dependencies] Django = ">=3.2" [package.extras] -azure = ["azure-storage-blob (>=12.0.0)"] +azure = ["azure-core (>=1.13)", "azure-storage-blob (>=12)"] boto3 = ["boto3 (>=1.4.4)"] dropbox = ["dropbox (>=7.2.1)"] -google = ["google-cloud-storage (>=1.27.0)"] +google = ["google-cloud-storage (>=1.27)"] libcloud = ["apache-libcloud"] -sftp = ["paramiko (>=1.10.0)"] +s3 = ["boto3 (>=1.4.4)"] +sftp = ["paramiko (>=1.15)"] [[package]] name = "djangorestframework" -version = "3.14.0" +version = "3.15.2" description = "Web APIs for Django, made easy." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "djangorestframework-3.14.0-py3-none-any.whl", hash = "sha256:eb63f58c9f218e1a7d064d17a70751f528ed4e1d35547fdade9aaf4cd103fd08"}, - {file = "djangorestframework-3.14.0.tar.gz", hash = "sha256:579a333e6256b09489cbe0a067e66abe55c6595d8926be6b99423786334350c8"}, + {file = "djangorestframework-3.15.2-py3-none-any.whl", hash = "sha256:2b8871b062ba1aefc2de01f773875441a961fefbf79f5eed1e32b2f096944b20"}, + {file = "djangorestframework-3.15.2.tar.gz", hash = "sha256:36fe88cd2d6c6bec23dca9804bab2ba5517a8bb9d8f47ebc68981b56840107ad"}, ] [package.dependencies] -django = ">=3.0" -pytz = "*" +django = ">=4.2" [[package]] name = "docutils" @@ -521,28 +496,28 @@ files = [ [[package]] name = "drf-nested-routers" -version = "0.93.4" +version = "0.93.5" description = "Nested resources for the Django Rest Framework" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "drf-nested-routers-0.93.4.tar.gz", hash = "sha256:01aa556b8c08608bb74fb34f6ca065a5183f2cda4dc0478192cc17a2581d71b0"}, - {file = "drf_nested_routers-0.93.4-py2.py3-none-any.whl", hash = "sha256:996b77f3f4dfaf64569e7b8f04e3919945f90f95366838ca5b8bed9dd709d6c5"}, + {file = "drf-nested-routers-0.93.5.tar.gz", hash = "sha256:1407565abc7bada37c162c7e11bf214ae71625a17fdec6d9a47a17f4a3627d32"}, + {file = "drf_nested_routers-0.93.5-py2.py3-none-any.whl", hash = "sha256:9a6813554020134a02e62f8c2934b2047717f7da06f8b801752c521e43735c63"}, ] [package.dependencies] -Django = ">=1.11" -djangorestframework = ">=3.6.0" +Django = ">=3.2" +djangorestframework = ">=3.14.0" [[package]] name = "exceptiongroup" -version = "1.1.0" +version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"}, - {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] @@ -550,45 +525,45 @@ test = ["pytest (>=6)"] [[package]] name = "execnet" -version = "1.9.0" +version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.8" files = [ - {file = "execnet-1.9.0-py2.py3-none-any.whl", hash = "sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142"}, - {file = "execnet-1.9.0.tar.gz", hash = "sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5"}, + {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, + {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, ] [package.extras] -testing = ["pre-commit"] +testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "factory-boy" -version = "3.2.1" +version = "3.3.0" description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "factory_boy-3.2.1-py2.py3-none-any.whl", hash = "sha256:eb02a7dd1b577ef606b75a253b9818e6f9eaf996d94449c9d5ebb124f90dc795"}, - {file = "factory_boy-3.2.1.tar.gz", hash = "sha256:a98d277b0c047c75eb6e4ab8508a7f81fb03d2cb21986f627913546ef7a2a55e"}, + {file = "factory_boy-3.3.0-py2.py3-none-any.whl", hash = "sha256:a2cdbdb63228177aa4f1c52f4b6d83fab2b8623bf602c7dedd7eb83c0f69c04c"}, + {file = "factory_boy-3.3.0.tar.gz", hash = "sha256:bc76d97d1a65bbd9842a6d722882098eb549ec8ee1081f9fb2e8ff29f0c300f1"}, ] [package.dependencies] Faker = ">=0.7.0" [package.extras] -dev = ["Django", "Pillow", "SQLAlchemy", "coverage", "flake8", "isort", "mongoengine", "tox", "wheel (>=0.32.0)", "zest.releaser[recommended]"] +dev = ["Django", "Pillow", "SQLAlchemy", "coverage", "flake8", "isort", "mongoengine", "sqlalchemy-utils", "tox", "wheel (>=0.32.0)", "zest.releaser[recommended]"] doc = ["Sphinx", "sphinx-rtd-theme", "sphinxcontrib-spelling"] [[package]] name = "faker" -version = "16.6.1" +version = "26.0.0" description = "Faker is a Python package that generates fake data for you." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Faker-16.6.1-py3-none-any.whl", hash = "sha256:2375d0bbaf405dc4f1cbc771485a78ad952c776798e5c228eef3e7b337f78868"}, - {file = "Faker-16.6.1.tar.gz", hash = "sha256:b76e5d2405470e3d38d37d1bfaa9d9bbf171bdf41c814f5bbd8117b121f6bccb"}, + {file = "Faker-26.0.0-py3-none-any.whl", hash = "sha256:886ee28219be96949cd21ecc96c4c742ee1680e77f687b095202c8def1a08f06"}, + {file = "Faker-26.0.0.tar.gz", hash = "sha256:0f60978314973de02c00474c2ae899785a42b2cf4f41b7987e93c132a2b8a4a9"}, ] [package.dependencies] @@ -812,30 +787,27 @@ files = [ [[package]] name = "isort" -version = "5.12.0" +version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] +colors = ["colorama (>=0.4.6)"] [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -857,61 +829,71 @@ files = [ [[package]] name = "markupsafe" -version = "2.1.2" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, - {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] @@ -927,171 +909,161 @@ files = [ [[package]] name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] [[package]] name = "packaging" -version = "23.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, - {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] name = "pathspec" -version = "0.11.0" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pathspec-0.11.0-py3-none-any.whl", hash = "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229"}, - {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "pillow" -version = "9.4.0" +version = "9.5.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.7" files = [ - {file = "Pillow-9.4.0-1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1"}, - {file = "Pillow-9.4.0-1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12"}, - {file = "Pillow-9.4.0-1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd"}, - {file = "Pillow-9.4.0-1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9"}, - {file = "Pillow-9.4.0-1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858"}, - {file = "Pillow-9.4.0-1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab"}, - {file = "Pillow-9.4.0-1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9"}, - {file = "Pillow-9.4.0-2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0"}, - {file = "Pillow-9.4.0-2-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f"}, - {file = "Pillow-9.4.0-2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8a2b5874d17e72dfb80d917213abd55d7e1ed2479f38f001f264f7ce7bae757c"}, - {file = "Pillow-9.4.0-2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:83125753a60cfc8c412de5896d10a0a405e0bd88d0470ad82e0869ddf0cb3848"}, - {file = "Pillow-9.4.0-2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9e5f94742033898bfe84c93c831a6f552bb629448d4072dd312306bab3bd96f1"}, - {file = "Pillow-9.4.0-2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:013016af6b3a12a2f40b704677f8b51f72cb007dac785a9933d5c86a72a7fe33"}, - {file = "Pillow-9.4.0-2-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:99d92d148dd03fd19d16175b6d355cc1b01faf80dae93c6c3eb4163709edc0a9"}, - {file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"}, - {file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35"}, - {file = "Pillow-9.4.0-cp310-cp310-win32.whl", hash = "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a"}, - {file = "Pillow-9.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a"}, - {file = "Pillow-9.4.0-cp311-cp311-win32.whl", hash = "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c"}, - {file = "Pillow-9.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee"}, - {file = "Pillow-9.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5"}, - {file = "Pillow-9.4.0-cp37-cp37m-win32.whl", hash = "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e"}, - {file = "Pillow-9.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628"}, - {file = "Pillow-9.4.0-cp38-cp38-win32.whl", hash = "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d"}, - {file = "Pillow-9.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153"}, - {file = "Pillow-9.4.0-cp39-cp39-win32.whl", hash = "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c"}, - {file = "Pillow-9.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9"}, - {file = "Pillow-9.4.0.tar.gz", hash = "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, + {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, + {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, + {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, + {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, + {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, + {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, + {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, + {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, + {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, + {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, + {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, + {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, + {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, + {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, + {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "platformdirs" -version = "2.6.2" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-2.6.2-py3-none-any.whl", hash = "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490"}, - {file = "platformdirs-2.6.2.tar.gz", hash = "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] [[package]] name = "playwright" -version = "1.41.2" +version = "1.45.0" description = "A high-level API to automate web browsers" optional = false python-versions = ">=3.8" files = [ - {file = "playwright-1.41.2-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:cf68335a5dfa4038fa797a4ba0105faee0094ebbb372547d7a27feec5b23c672"}, - {file = "playwright-1.41.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:431e3a05f8c99147995e2b3e8475d07818745294fd99f1510b61756e73bdcf68"}, - {file = "playwright-1.41.2-py3-none-macosx_11_0_universal2.whl", hash = "sha256:0608717cbf291a625ba6f751061af0fc0cc9bdace217e69d87b1eb1383b03406"}, - {file = "playwright-1.41.2-py3-none-manylinux1_x86_64.whl", hash = "sha256:4bf214d812092cf5b9b9648ba84611aa35e28685519911342a7da3a3031f9ed6"}, - {file = "playwright-1.41.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaa17ab44622c447de26ed8f7d99912719568d8dbc3a9db0e07f0ae1487709d9"}, - {file = "playwright-1.41.2-py3-none-win32.whl", hash = "sha256:edb210a015e70bb0d328bf1c9b65fa3a08361f33e4d7c4ddd1ad2adb6d9b4479"}, - {file = "playwright-1.41.2-py3-none-win_amd64.whl", hash = "sha256:71ead0f33e00f5a8533c037c647938b99f219436a1b27d4ba4de4e6bf0567278"}, + {file = "playwright-1.45.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:7d49aee5907d8e72060f04bc299cb6851c2dc44cb227540ade89d7aa529e907a"}, + {file = "playwright-1.45.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:210c9f848820f58b5b5ed48047748620b780ca3acc3e2b7560dafb2bfdd6d90a"}, + {file = "playwright-1.45.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:13b5398831f5499580e819ddc996633446a93bf88029e89451e51da188e16ae3"}, + {file = "playwright-1.45.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:0ba5a39f25fb9b9cf1bd48678f44536a29f6d83376329de2dee1567dac220afe"}, + {file = "playwright-1.45.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b09fa76614ba2926d45a4c0581f710c13652d5e32290ba6a1490fbafff7f0be8"}, + {file = "playwright-1.45.0-py3-none-win32.whl", hash = "sha256:97a7d53af89af54208b69c051046b462675fcf5b93f7fbfb7c0fa7f813424ee2"}, + {file = "playwright-1.45.0-py3-none-win_amd64.whl", hash = "sha256:701db496928429aec103739e48e3110806bd5cf49456cc95b89f28e1abda71da"}, ] [package.dependencies] greenlet = "3.0.3" -pyee = "11.0.1" +pyee = "11.1.0" [[package]] name = "pluggy" -version = "1.0.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] @@ -1100,82 +1072,83 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "psycopg2-binary" -version = "2.9.5" +version = "2.9.9" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "psycopg2-binary-2.9.5.tar.gz", hash = "sha256:33e632d0885b95a8b97165899006c40e9ecdc634a529dca7b991eb7de4ece41c"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:0775d6252ccb22b15da3b5d7adbbf8cfe284916b14b6dc0ff503a23edb01ee85"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec46ed947801652c9643e0b1dc334cfb2781232e375ba97312c2fc256597632"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3520d7af1ebc838cc6084a3281145d5cd5bdd43fdef139e6db5af01b92596cb7"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cbc554ba47ecca8cd3396ddaca85e1ecfe3e48dd57dc5e415e59551affe568e"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:5d28ecdf191db558d0c07d0f16524ee9d67896edf2b7990eea800abeb23ebd61"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:b9c33d4aef08dfecbd1736ceab8b7b3c4358bf10a0121483e5cd60d3d308cc64"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:05b3d479425e047c848b9782cd7aac9c6727ce23181eb9647baf64ffdfc3da41"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1e491e6489a6cb1d079df8eaa15957c277fdedb102b6a68cfbf40c4994412fd0"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:9e32cedc389bcb76d9f24ea8a012b3cb8385ee362ea437e1d012ffaed106c17d"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46850a640df62ae940e34a163f72e26aca1f88e2da79148e1862faaac985c302"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-win32.whl", hash = "sha256:3d790f84201c3698d1bfb404c917f36e40531577a6dda02e45ba29b64d539867"}, - {file = "psycopg2_binary-2.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:1764546ffeaed4f9428707be61d68972eb5ede81239b46a45843e0071104d0dd"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-macosx_10_9_universal2.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:426c2ae999135d64e6a18849a7d1ad0e1bd007277e4a8f4752eaa40a96b550ff"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7cf1d44e710ca3a9ce952bda2855830fe9f9017ed6259e01fcd71ea6287565f5"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:024030b13bdcbd53d8a93891a2cf07719715724fc9fee40243f3bd78b4264b8f"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcda1c84a1c533c528356da5490d464a139b6e84eb77cc0b432e38c5c6dd7882"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:2ef892cabdccefe577088a79580301f09f2a713eb239f4f9f62b2b29cafb0577"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-manylinux_2_24_ppc64le.whl", hash = "sha256:af0516e1711995cb08dc19bbd05bec7dbdebf4185f68870595156718d237df3e"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e72c91bda9880f097c8aa3601a2c0de6c708763ba8128006151f496ca9065935"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e67b3c26e9b6d37b370c83aa790bbc121775c57bfb096c2e77eacca25fd0233b"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5fc447058d083b8c6ac076fc26b446d44f0145308465d745fba93a28c14c9e32"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d892bfa1d023c3781a3cab8dd5af76b626c483484d782e8bd047c180db590e4c"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-win32.whl", hash = "sha256:2abccab84d057723d2ca8f99ff7b619285d40da6814d50366f61f0fc385c3903"}, - {file = "psycopg2_binary-2.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:bef7e3f9dc6f0c13afdd671008534be5744e0e682fb851584c8c3a025ec09720"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:6e63814ec71db9bdb42905c925639f319c80e7909fb76c3b84edc79dadef8d60"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:212757ffcecb3e1a5338d4e6761bf9c04f750e7d027117e74aa3cd8a75bb6fbd"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f8a9bcab7b6db2e3dbf65b214dfc795b4c6b3bb3af922901b6a67f7cb47d5f8"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:56b2957a145f816726b109ee3d4e6822c23f919a7d91af5a94593723ed667835"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:f95b8aca2703d6a30249f83f4fe6a9abf2e627aa892a5caaab2267d56be7ab69"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:70831e03bd53702c941da1a1ad36c17d825a24fbb26857b40913d58df82ec18b"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:dbc332beaf8492b5731229a881807cd7b91b50dbbbaf7fe2faf46942eda64a24"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:2d964eb24c8b021623df1c93c626671420c6efadbdb8655cb2bd5e0c6fa422ba"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:95076399ec3b27a8f7fa1cc9a83417b1c920d55cf7a97f718a94efbb96c7f503"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-win32.whl", hash = "sha256:3fc33295cfccad697a97a76dec3f1e94ad848b7b163c3228c1636977966b51e2"}, - {file = "psycopg2_binary-2.9.5-cp36-cp36m-win_amd64.whl", hash = "sha256:02551647542f2bf89073d129c73c05a25c372fc0a49aa50e0de65c3c143d8bd0"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:63e318dbe52709ed10d516a356f22a635e07a2e34c68145484ed96a19b0c4c68"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7e518a0911c50f60313cb9e74a169a65b5d293770db4770ebf004245f24b5c5"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9d38a4656e4e715d637abdf7296e98d6267df0cc0a8e9a016f8ba07e4aa3eeb"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:68d81a2fe184030aa0c5c11e518292e15d342a667184d91e30644c9d533e53e1"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:7ee3095d02d6f38bd7d9a5358fcc9ea78fcdb7176921528dd709cc63f40184f5"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:46512486be6fbceef51d7660dec017394ba3e170299d1dc30928cbedebbf103a"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b911dfb727e247340d36ae20c4b9259e4a64013ab9888ccb3cbba69b77fd9636"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:422e3d43b47ac20141bc84b3d342eead8d8099a62881a501e97d15f6addabfe9"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c5682a45df7d9642eff590abc73157c887a68f016df0a8ad722dcc0f888f56d7"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-win32.whl", hash = "sha256:b8104f709590fff72af801e916817560dbe1698028cd0afe5a52d75ceb1fce5f"}, - {file = "psycopg2_binary-2.9.5-cp37-cp37m-win_amd64.whl", hash = "sha256:7b3751857da3e224f5629400736a7b11e940b5da5f95fa631d86219a1beaafec"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:043a9fd45a03858ff72364b4b75090679bd875ee44df9c0613dc862ca6b98460"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9ffdc51001136b699f9563b1c74cc1f8c07f66ef7219beb6417a4c8aaa896c28"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c15ba5982c177bc4b23a7940c7e4394197e2d6a424a2d282e7c236b66da6d896"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc85b3777068ed30aff8242be2813038a929f2084f69e43ef869daddae50f6ee"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:215d6bf7e66732a514f47614f828d8c0aaac9a648c46a831955cb103473c7147"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:7d07f552d1e412f4b4e64ce386d4c777a41da3b33f7098b6219012ba534fb2c2"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a0adef094c49f242122bb145c3c8af442070dc0e4312db17e49058c1702606d4"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:00475004e5ed3e3bf5e056d66e5dcdf41a0dc62efcd57997acd9135c40a08a50"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7d88db096fa19d94f433420eaaf9f3c45382da2dd014b93e4bf3215639047c16"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:902844f9c4fb19b17dfa84d9e2ca053d4a4ba265723d62ea5c9c26b38e0aa1e6"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-win32.whl", hash = "sha256:4e7904d1920c0c89105c0517dc7e3f5c20fb4e56ba9cdef13048db76947f1d79"}, - {file = "psycopg2_binary-2.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:a36a0e791805aa136e9cbd0ffa040d09adec8610453ee8a753f23481a0057af5"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-macosx_10_15_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:25382c7d174c679ce6927c16b6fbb68b10e56ee44b1acb40671e02d29f2fce7c"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9c38d3869238e9d3409239bc05bc27d6b7c99c2a460ea337d2814b35fb4fea1b"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5c6527c8efa5226a9e787507652dd5ba97b62d29b53c371a85cd13f957fe4d42"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e59137cdb970249ae60be2a49774c6dfb015bd0403f05af1fe61862e9626642d"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:d4c7b3a31502184e856df1f7bbb2c3735a05a8ce0ade34c5277e1577738a5c91"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:b9a794cef1d9c1772b94a72eec6da144c18e18041d294a9ab47669bc77a80c1d"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5254cbd4f4855e11cebf678c1a848a3042d455a22a4ce61349c36aafd4c2267"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c5e65c6ac0ae4bf5bef1667029f81010b6017795dcb817ba5c7b8a8d61fab76f"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:74eddec4537ab1f701a1647214734bc52cee2794df748f6ae5908e00771f180a"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:01ad49d68dd8c5362e4bfb4158f2896dc6e0c02e87b8a3770fc003459f1a4425"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-win32.whl", hash = "sha256:937880290775033a743f4836aa253087b85e62784b63fd099ee725d567a48aa1"}, - {file = "psycopg2_binary-2.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:484405b883630f3e74ed32041a87456c5e0e63a8e3429aa93e8714c366d62bd1"}, + {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win32.whl", hash = "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win32.whl", hash = "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win32.whl", hash = "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, ] [[package]] @@ -1191,31 +1164,31 @@ files = [ [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] name = "pyee" -version = "11.0.1" +version = "11.1.0" description = "A rough port of Node.js's EventEmitter to Python with a few tricks of its own" optional = false python-versions = ">=3.8" files = [ - {file = "pyee-11.0.1-py3-none-any.whl", hash = "sha256:9bcc9647822234f42c228d88de63d0f9ffa881e87a87f9d36ddf5211f6ac977d"}, - {file = "pyee-11.0.1.tar.gz", hash = "sha256:a642c51e3885a33ead087286e35212783a4e9b8d6514a10a5db4e57ac57b2b29"}, + {file = "pyee-11.1.0-py3-none-any.whl", hash = "sha256:5d346a7d0f861a4b2e6c47960295bd895f816725b27d656181947346be98d7c1"}, + {file = "pyee-11.1.0.tar.gz", hash = "sha256:b53af98f6990c810edd9b56b87791021a8f54fd13db4edd1142438d44ba2263f"}, ] [package.dependencies] typing-extensions = "*" [package.extras] -dev = ["black", "flake8", "flake8-black", "isort", "jupyter-console", "mkdocs", "mkdocs-include-markdown-plugin", "mkdocstrings[python]", "pytest", "pytest-asyncio", "pytest-trio", "toml", "tox", "trio", "trio", "trio-typing", "twine", "twisted", "validate-pyproject[all]"] +dev = ["black", "build", "flake8", "flake8-black", "isort", "jupyter-console", "mkdocs", "mkdocs-include-markdown-plugin", "mkdocstrings[python]", "pytest", "pytest-asyncio", "pytest-trio", "sphinx", "toml", "tox", "trio", "trio", "trio-typing", "twine", "twisted", "validate-pyproject[all]"] [[package]] name = "pyflakes" @@ -1230,17 +1203,17 @@ files = [ [[package]] name = "pygments" -version = "2.14.0" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, - {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymarker" @@ -1259,17 +1232,16 @@ pillow = ">=7.1.0" [[package]] name = "pytest" -version = "7.2.1" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.2.1-py3-none-any.whl", hash = "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5"}, - {file = "pytest-7.2.1.tar.gz", hash = "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" @@ -1278,7 +1250,7 @@ pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-base-url" @@ -1300,17 +1272,17 @@ test = ["black (>=22.1.0)", "flake8 (>=4.0.1)", "pre-commit (>=2.17.0)", "pytest [[package]] name = "pytest-django" -version = "4.5.2" +version = "4.8.0" description = "A Django plugin for pytest." optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "pytest-django-4.5.2.tar.gz", hash = "sha256:d9076f759bb7c36939dbdd5ae6633c18edfc2902d1a69fdbefd2426b970ce6c2"}, - {file = "pytest_django-4.5.2-py3-none-any.whl", hash = "sha256:c60834861933773109334fe5a53e83d1ef4828f2203a1d6a0fa9972f4f75ab3e"}, + {file = "pytest-django-4.8.0.tar.gz", hash = "sha256:5d054fe011c56f3b10f978f41a8efb2e5adfc7e680ef36fb571ada1f24779d90"}, + {file = "pytest_django-4.8.0-py3-none-any.whl", hash = "sha256:ca1ddd1e0e4c227cf9e3e40a6afc6d106b3e70868fd2ac5798a22501271cd0c7"}, ] [package.dependencies] -pytest = ">=5.4.0" +pytest = ">=7.0.0" [package.extras] docs = ["sphinx", "sphinx-rtd-theme"] @@ -1335,18 +1307,18 @@ python-slugify = ">=6.0.0,<9.0.0" [[package]] name = "pytest-xdist" -version = "3.1.0" +version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-xdist-3.1.0.tar.gz", hash = "sha256:40fdb8f3544921c5dfcd486ac080ce22870e71d82ced6d2e78fa97c2addd480c"}, - {file = "pytest_xdist-3.1.0-py3-none-any.whl", hash = "sha256:70a76f191d8a1d2d6be69fc440cdf85f3e4c03c08b520fd5dc5d338d6cf07d89"}, + {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, + {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, ] [package.dependencies] -execnet = ">=1.1" -pytest = ">=6.2.0" +execnet = ">=2.1" +pytest = ">=7.0.0" [package.extras] psutil = ["psutil (>=3.0)"] @@ -1355,13 +1327,13 @@ testing = ["filelock"] [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -1384,33 +1356,22 @@ text-unidecode = ">=1.3" [package.extras] unidecode = ["Unidecode (>=1.1.1)"] -[[package]] -name = "pytz" -version = "2022.7.1" -description = "World timezone definitions, modern and historical" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2022.7.1-py2.py3-none-any.whl", hash = "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a"}, - {file = "pytz-2022.7.1.tar.gz", hash = "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0"}, -] - [[package]] name = "requests" -version = "2.28.2" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.8" files = [ - {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, - {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -1418,30 +1379,30 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "s3transfer" -version = "0.6.0" +version = "0.10.2" description = "An Amazon S3 Transfer Manager" optional = false -python-versions = ">= 3.7" +python-versions = ">=3.8" files = [ - {file = "s3transfer-0.6.0-py3-none-any.whl", hash = "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd"}, - {file = "s3transfer-0.6.0.tar.gz", hash = "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"}, + {file = "s3transfer-0.10.2-py3-none-any.whl", hash = "sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69"}, + {file = "s3transfer-0.10.2.tar.gz", hash = "sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6"}, ] [package.dependencies] -botocore = ">=1.12.36,<2.0a.0" +botocore = ">=1.33.2,<2.0a.0" [package.extras] -crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] +crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] [[package]] name = "sentry-sdk" -version = "1.14.0" +version = "1.45.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.14.0.tar.gz", hash = "sha256:273fe05adf052b40fd19f6d4b9a5556316807246bd817e5e3482930730726bb0"}, - {file = "sentry_sdk-1.14.0-py2.py3-none-any.whl", hash = "sha256:72c00322217d813cf493fe76590b23a757e063ff62fec59299f4af7201dd4448"}, + {file = "sentry-sdk-1.45.0.tar.gz", hash = "sha256:509aa9678c0512344ca886281766c2e538682f8acfa50fd8d405f8c417ad0625"}, + {file = "sentry_sdk-1.45.0-py2.py3-none-any.whl", hash = "sha256:1ce29e30240cc289a027011103a8c83885b15ef2f316a60bcc7c5300afa144f1"}, ] [package.dependencies] @@ -1450,16 +1411,25 @@ urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} [package.extras] aiohttp = ["aiohttp (>=3.5)"] +arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] beam = ["apache-beam (>=2.12)"] bottle = ["bottle (>=0.12.13)"] celery = ["celery (>=3)"] +celery-redbeat = ["celery-redbeat (>=2)"] chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] django = ["django (>=1.8)"] falcon = ["falcon (>=1.4)"] fastapi = ["fastapi (>=0.79.0)"] -flask = ["blinker (>=1.1)", "flask (>=0.11)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +grpcio = ["grpcio (>=1.21.1)"] httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +loguru = ["loguru (>=0.5)"] +openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] pure-eval = ["asttokens", "executing", "pure-eval"] pymongo = ["pymongo (>=3.1)"] pyspark = ["pyspark (>=2.4.4)"] @@ -1473,19 +1443,18 @@ tornado = ["tornado (>=5)"] [[package]] name = "setuptools" -version = "67.0.0" +version = "70.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "setuptools-67.0.0-py3-none-any.whl", hash = "sha256:9d790961ba6219e9ff7d9557622d2fe136816a264dd01d5997cfc057d804853d"}, - {file = "setuptools-67.0.0.tar.gz", hash = "sha256:883131c5b6efa70b9101c7ef30b2b7b780a4283d5fc1616383cdf22c83cbefe6"}, + {file = "setuptools-70.2.0-py3-none-any.whl", hash = "sha256:b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05"}, + {file = "setuptools-70.2.0.tar.gz", hash = "sha256:bd63e505105011b25c3c11f753f7e3b8465ea739efddaccef8f0efac2137bac1"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "sidekick" @@ -1562,47 +1531,50 @@ test = ["cython", "html5lib", "pytest (>=4.6)", "typed_ast"] [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.4" +version = "1.0.8" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, - {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, + {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, + {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +version = "1.0.6" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, + {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, + {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.1" +version = "2.0.5" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, - {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, + {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, + {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] [[package]] @@ -1621,32 +1593,34 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +version = "1.0.7" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, + {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, + {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +version = "1.1.10" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, + {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, + {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] @@ -1688,62 +1662,63 @@ files = [ [[package]] name = "toolz" -version = "0.12.0" +version = "0.12.1" description = "List processing tools and functional utilities" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" files = [ - {file = "toolz-0.12.0-py3-none-any.whl", hash = "sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f"}, - {file = "toolz-0.12.0.tar.gz", hash = "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194"}, + {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, + {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, ] [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] name = "tzdata" -version = "2022.7" +version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2022.7-py2.py3-none-any.whl", hash = "sha256:2b88858b0e3120792a3c0635c23daf36a7d7eeeca657c323da299d2094402a0d"}, - {file = "tzdata-2022.7.tar.gz", hash = "sha256:fe5f866eddd8b96e9fcba978f8e503c909b19ea7efda11e52e39494bad3a7bfa"}, + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] name = "urllib3" -version = "1.26.14" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.8" files = [ - {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"}, - {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "zope-event" -version = "4.6" +version = "5.0" description = "Very basic event publishing system" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "zope.event-4.6-py2.py3-none-any.whl", hash = "sha256:73d9e3ef750cca14816a9c322c7250b0d7c9dbc337df5d1b807ff8d3d0b9e97c"}, - {file = "zope.event-4.6.tar.gz", hash = "sha256:81d98813046fc86cc4136e3698fee628a3282f9c320db18658c21749235fce80"}, + {file = "zope.event-5.0-py3-none-any.whl", hash = "sha256:2832e95014f4db26c47a13fdaef84cef2f4df37e66b59d8f1f4a8f319a632c26"}, + {file = "zope.event-5.0.tar.gz", hash = "sha256:bac440d8d9891b4068e2b5a2c5e2c9765a9df762944bda6955f96bb9b91e67cd"}, ] [package.dependencies] @@ -1755,54 +1730,54 @@ test = ["zope.testrunner"] [[package]] name = "zope-interface" -version = "5.5.2" +version = "6.4.post2" description = "Interfaces for Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "zope.interface-5.5.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:a2ad597c8c9e038a5912ac3cf166f82926feff2f6e0dabdab956768de0a258f5"}, - {file = "zope.interface-5.5.2-cp27-cp27m-win_amd64.whl", hash = "sha256:65c3c06afee96c654e590e046c4a24559e65b0a87dbff256cd4bd6f77e1a33f9"}, - {file = "zope.interface-5.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d514c269d1f9f5cd05ddfed15298d6c418129f3f064765295659798349c43e6f"}, - {file = "zope.interface-5.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5334e2ef60d3d9439c08baedaf8b84dc9bb9522d0dacbc10572ef5609ef8db6d"}, - {file = "zope.interface-5.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc26c8d44472e035d59d6f1177eb712888447f5799743da9c398b0339ed90b1b"}, - {file = "zope.interface-5.5.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:17ebf6e0b1d07ed009738016abf0d0a0f80388e009d0ac6e0ead26fc162b3b9c"}, - {file = "zope.interface-5.5.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f98d4bd7bbb15ca701d19b93263cc5edfd480c3475d163f137385f49e5b3a3a7"}, - {file = "zope.interface-5.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:696f3d5493eae7359887da55c2afa05acc3db5fc625c49529e84bd9992313296"}, - {file = "zope.interface-5.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7579960be23d1fddecb53898035a0d112ac858c3554018ce615cefc03024e46d"}, - {file = "zope.interface-5.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:765d703096ca47aa5d93044bf701b00bbce4d903a95b41fff7c3796e747b1f1d"}, - {file = "zope.interface-5.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e945de62917acbf853ab968d8916290548df18dd62c739d862f359ecd25842a6"}, - {file = "zope.interface-5.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:655796a906fa3ca67273011c9805c1e1baa047781fca80feeb710328cdbed87f"}, - {file = "zope.interface-5.5.2-cp35-cp35m-win_amd64.whl", hash = "sha256:0fb497c6b088818e3395e302e426850f8236d8d9f4ef5b2836feae812a8f699c"}, - {file = "zope.interface-5.5.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:008b0b65c05993bb08912f644d140530e775cf1c62a072bf9340c2249e613c32"}, - {file = "zope.interface-5.5.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:404d1e284eda9e233c90128697c71acffd55e183d70628aa0bbb0e7a3084ed8b"}, - {file = "zope.interface-5.5.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3218ab1a7748327e08ef83cca63eea7cf20ea7e2ebcb2522072896e5e2fceedf"}, - {file = "zope.interface-5.5.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d169ccd0756c15bbb2f1acc012f5aab279dffc334d733ca0d9362c5beaebe88e"}, - {file = "zope.interface-5.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:e1574980b48c8c74f83578d1e77e701f8439a5d93f36a5a0af31337467c08fcf"}, - {file = "zope.interface-5.5.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:0217a9615531c83aeedb12e126611b1b1a3175013bbafe57c702ce40000eb9a0"}, - {file = "zope.interface-5.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:311196634bb9333aa06f00fc94f59d3a9fddd2305c2c425d86e406ddc6f2260d"}, - {file = "zope.interface-5.5.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6373d7eb813a143cb7795d3e42bd8ed857c82a90571567e681e1b3841a390d16"}, - {file = "zope.interface-5.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:959697ef2757406bff71467a09d940ca364e724c534efbf3786e86eee8591452"}, - {file = "zope.interface-5.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dbaeb9cf0ea0b3bc4b36fae54a016933d64c6d52a94810a63c00f440ecb37dd7"}, - {file = "zope.interface-5.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:604cdba8f1983d0ab78edc29aa71c8df0ada06fb147cea436dc37093a0100a4e"}, - {file = "zope.interface-5.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e74a578172525c20d7223eac5f8ad187f10940dac06e40113d62f14f3adb1e8f"}, - {file = "zope.interface-5.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0980d44b8aded808bec5059018d64692f0127f10510eca71f2f0ace8fb11188"}, - {file = "zope.interface-5.5.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6e972493cdfe4ad0411fd9abfab7d4d800a7317a93928217f1a5de2bb0f0d87a"}, - {file = "zope.interface-5.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9d783213fab61832dbb10d385a319cb0e45451088abd45f95b5bb88ed0acca1a"}, - {file = "zope.interface-5.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:a16025df73d24795a0bde05504911d306307c24a64187752685ff6ea23897cb0"}, - {file = "zope.interface-5.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:40f4065745e2c2fa0dff0e7ccd7c166a8ac9748974f960cd39f63d2c19f9231f"}, - {file = "zope.interface-5.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8a2ffadefd0e7206adc86e492ccc60395f7edb5680adedf17a7ee4205c530df4"}, - {file = "zope.interface-5.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d692374b578360d36568dd05efb8a5a67ab6d1878c29c582e37ddba80e66c396"}, - {file = "zope.interface-5.5.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4087e253bd3bbbc3e615ecd0b6dd03c4e6a1e46d152d3be6d2ad08fbad742dcc"}, - {file = "zope.interface-5.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fb68d212efd057596dee9e6582daded9f8ef776538afdf5feceb3059df2d2e7b"}, - {file = "zope.interface-5.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:7e66f60b0067a10dd289b29dceabd3d0e6d68be1504fc9d0bc209cf07f56d189"}, - {file = "zope.interface-5.5.2.tar.gz", hash = "sha256:bfee1f3ff62143819499e348f5b8a7f3aa0259f9aca5e0ddae7391d059dce671"}, +python-versions = ">=3.7" +files = [ + {file = "zope.interface-6.4.post2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2eccd5bef45883802848f821d940367c1d0ad588de71e5cabe3813175444202c"}, + {file = "zope.interface-6.4.post2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:762e616199f6319bb98e7f4f27d254c84c5fb1c25c908c2a9d0f92b92fb27530"}, + {file = "zope.interface-6.4.post2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef8356f16b1a83609f7a992a6e33d792bb5eff2370712c9eaae0d02e1924341"}, + {file = "zope.interface-6.4.post2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e4fa5d34d7973e6b0efa46fe4405090f3b406f64b6290facbb19dcbf642ad6b"}, + {file = "zope.interface-6.4.post2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d22fce0b0f5715cdac082e35a9e735a1752dc8585f005d045abb1a7c20e197f9"}, + {file = "zope.interface-6.4.post2-cp310-cp310-win_amd64.whl", hash = "sha256:97e615eab34bd8477c3f34197a17ce08c648d38467489359cb9eb7394f1083f7"}, + {file = "zope.interface-6.4.post2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:599f3b07bde2627e163ce484d5497a54a0a8437779362395c6b25e68c6590ede"}, + {file = "zope.interface-6.4.post2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:136cacdde1a2c5e5bc3d0b2a1beed733f97e2dad8c2ad3c2e17116f6590a3827"}, + {file = "zope.interface-6.4.post2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47937cf2e7ed4e0e37f7851c76edeb8543ec9b0eae149b36ecd26176ff1ca874"}, + {file = "zope.interface-6.4.post2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f0a6be264afb094975b5ef55c911379d6989caa87c4e558814ec4f5125cfa2e"}, + {file = "zope.interface-6.4.post2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47654177e675bafdf4e4738ce58cdc5c6d6ee2157ac0a78a3fa460942b9d64a8"}, + {file = "zope.interface-6.4.post2-cp311-cp311-win_amd64.whl", hash = "sha256:e2fb8e8158306567a3a9a41670c1ff99d0567d7fc96fa93b7abf8b519a46b250"}, + {file = "zope.interface-6.4.post2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b912750b13d76af8aac45ddf4679535def304b2a48a07989ec736508d0bbfbde"}, + {file = "zope.interface-6.4.post2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ac46298e0143d91e4644a27a769d1388d5d89e82ee0cf37bf2b0b001b9712a4"}, + {file = "zope.interface-6.4.post2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86a94af4a88110ed4bb8961f5ac72edf782958e665d5bfceaab6bf388420a78b"}, + {file = "zope.interface-6.4.post2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73f9752cf3596771c7726f7eea5b9e634ad47c6d863043589a1c3bb31325c7eb"}, + {file = "zope.interface-6.4.post2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00b5c3e9744dcdc9e84c24ed6646d5cf0cf66551347b310b3ffd70f056535854"}, + {file = "zope.interface-6.4.post2-cp312-cp312-win_amd64.whl", hash = "sha256:551db2fe892fcbefb38f6f81ffa62de11090c8119fd4e66a60f3adff70751ec7"}, + {file = "zope.interface-6.4.post2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96ac6b3169940a8cd57b4f2b8edcad8f5213b60efcd197d59fbe52f0accd66e"}, + {file = "zope.interface-6.4.post2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cebff2fe5dc82cb22122e4e1225e00a4a506b1a16fafa911142ee124febf2c9e"}, + {file = "zope.interface-6.4.post2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33ee982237cffaf946db365c3a6ebaa37855d8e3ca5800f6f48890209c1cfefc"}, + {file = "zope.interface-6.4.post2-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:fbf649bc77510ef2521cf797700b96167bb77838c40780da7ea3edd8b78044d1"}, + {file = "zope.interface-6.4.post2-cp37-cp37m-win_amd64.whl", hash = "sha256:4c0b208a5d6c81434bdfa0f06d9b667e5de15af84d8cae5723c3a33ba6611b82"}, + {file = "zope.interface-6.4.post2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d3fe667935e9562407c2511570dca14604a654988a13d8725667e95161d92e9b"}, + {file = "zope.interface-6.4.post2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a96e6d4074db29b152222c34d7eec2e2db2f92638d2b2b2c704f9e8db3ae0edc"}, + {file = "zope.interface-6.4.post2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:866a0f583be79f0def667a5d2c60b7b4cc68f0c0a470f227e1122691b443c934"}, + {file = "zope.interface-6.4.post2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fe919027f29b12f7a2562ba0daf3e045cb388f844e022552a5674fcdf5d21f1"}, + {file = "zope.interface-6.4.post2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e0343a6e06d94f6b6ac52fbc75269b41dd3c57066541a6c76517f69fe67cb43"}, + {file = "zope.interface-6.4.post2-cp38-cp38-win_amd64.whl", hash = "sha256:dabb70a6e3d9c22df50e08dc55b14ca2a99da95a2d941954255ac76fd6982bc5"}, + {file = "zope.interface-6.4.post2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:706efc19f9679a1b425d6fa2b4bc770d976d0984335eaea0869bd32f627591d2"}, + {file = "zope.interface-6.4.post2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d136e5b8821073e1a09dde3eb076ea9988e7010c54ffe4d39701adf0c303438"}, + {file = "zope.interface-6.4.post2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1730c93a38b5a18d24549bc81613223962a19d457cfda9bdc66e542f475a36f4"}, + {file = "zope.interface-6.4.post2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc2676312cc3468a25aac001ec727168994ea3b69b48914944a44c6a0b251e79"}, + {file = "zope.interface-6.4.post2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a62fd6cd518693568e23e02f41816adedfca637f26716837681c90b36af3671"}, + {file = "zope.interface-6.4.post2-cp39-cp39-win_amd64.whl", hash = "sha256:d3f7e001328bd6466b3414215f66dde3c7c13d8025a9c160a75d7b2687090d15"}, + {file = "zope.interface-6.4.post2.tar.gz", hash = "sha256:1c207e6f6dfd5749a26f5a5fd966602d6b824ec00d2df84a7e9a924e8933654e"}, ] [package.dependencies] setuptools = "*" [package.extras] -docs = ["Sphinx", "repoze.sphinx.autointerface"] +docs = ["Sphinx", "repoze.sphinx.autointerface", "sphinx-rtd-theme"] test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] diff --git a/pyproject.toml b/pyproject.toml index 15fde249..845541a9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,8 +1,5 @@ [tool.poetry] -name = "Jandig" -version = "2.0.0" -description = "" -authors = ["Your Name "] +package-mode = false [tool.poetry.dependencies] python = "^3.10" From 00cc11f5dcef9993163c15b51a7a5db36a6b94f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2024 21:26:36 +0000 Subject: [PATCH 17/79] Bump django from 4.2.13 to 4.2.16 Bumps [django](https://github.com/django/django) from 4.2.13 to 4.2.16. - [Commits](https://github.com/django/django/compare/4.2.13...4.2.16) --- updated-dependencies: - dependency-name: django dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- poetry.lock | 10 +++++----- pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index cf77f81e..fc1db26a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "alabaster" @@ -330,13 +330,13 @@ six = ">=1.10" [[package]] name = "django" -version = "4.2.13" +version = "4.2.16" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.8" files = [ - {file = "Django-4.2.13-py3-none-any.whl", hash = "sha256:a17fcba2aad3fc7d46fdb23215095dbbd64e6174bf4589171e732b18b07e426a"}, - {file = "Django-4.2.13.tar.gz", hash = "sha256:837e3cf1f6c31347a1396a3f6b65688f2b4bb4a11c580dcb628b5afe527b68a5"}, + {file = "Django-4.2.16-py3-none-any.whl", hash = "sha256:1ddc333a16fc139fd253035a1606bb24261951bbc3a6ca256717fa06cc41a898"}, + {file = "Django-4.2.16.tar.gz", hash = "sha256:6f1616c2786c408ce86ab7e10f792b8f15742f7b7b7460243929cb371e7f1dad"}, ] [package.dependencies] @@ -1784,4 +1784,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "84bba7d5ee3576bad6107eb6dd0cbdf63b28e7ca290353eca27a4a1798a38043" +content-hash = "9069175fd256356d8679c6eb7f0d8d77e48721829fd14e0cb8c3015988ceb66a" diff --git a/pyproject.toml b/pyproject.toml index 845541a9..c656c513 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ package-mode = false [tool.poetry.dependencies] python = "^3.10" MarkupSafe = "^2.1.1" -Django = "^4.0.8" +Django = "^4.2.16" Jinja2 = "^3.1.2" gunicorn = "^20.1.0" Pillow = "^9.2.0" From 2ea9c89002ac02dcb74e9c15859b993e96a47f19 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sat, 26 Oct 2024 17:39:04 +0100 Subject: [PATCH 18/79] Add Mailpit service --- docker-compose.yml | 24 ++++++++++++++--- etc/mailpit/mailpit_cert.pem | 33 +++++++++++++++++++++++ etc/mailpit/mailpit_key.pem | 52 ++++++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 etc/mailpit/mailpit_cert.pem create mode 100644 etc/mailpit/mailpit_key.pem diff --git a/docker-compose.yml b/docker-compose.yml index 555e958e..4ae2d8cf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,6 +19,8 @@ services: condition: service_started createbuckets: condition: service_started + mailpit: + condition: service_started postgres: condition: service_healthy command: /jandig/run.sh @@ -49,7 +51,7 @@ services: volumes: - media_data:/storage env_file: - - .envs/.env + - .envs/.example command: server /storage --console-address ":9001" createbuckets: @@ -57,7 +59,7 @@ services: depends_on: - storage env_file: - - .envs/.env + - .envs/.example entrypoint: > /bin/sh -c " until (/usr/bin/mc config host add myminio $${MINIO_S3_ENDPOINT_URL} $${MINIO_ROOT_USER} $${MINIO_ROOT_PASSWORD}) do echo '...waiting...' && sleep 1; done; @@ -68,7 +70,23 @@ services: /usr/bin/mc admin policy set myminio readwrite user=$${MINIO_USER_ACCESS_KEY}; exit 0; " + mailpit: + image: axllent/mailpit + volumes: + - mailpit_data:/data + - ./etc/mailpit/:/self_signed/ + ports: + - 8025:8025 + - 1025:1025 + environment: + MP_MAX_MESSAGES: 5000 + MP_DATABASE: /data/mailpit.db + MP_SMTP_AUTH_ACCEPT_ANY: 1 + MP_SMTP_AUTH_ALLOW_INSECURE: 1 + MP_SMTP_TLS_CERT: /self_signed/mailpit_cert.pem + MP_SMTP_TLS_KEY: /self_signed/mailpit_key.pem volumes: postgres_data: - media_data: \ No newline at end of file + media_data: + mailpit_data: \ No newline at end of file diff --git a/etc/mailpit/mailpit_cert.pem b/etc/mailpit/mailpit_cert.pem new file mode 100644 index 00000000..055d3282 --- /dev/null +++ b/etc/mailpit/mailpit_cert.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFsTCCA5mgAwIBAgIUEdY/Ljoa1qs4Wk+7iWlpAokmkzQwDQYJKoZIhvcNAQEL +BQAwaDELMAkGA1UEBhMCQlIxEjAQBgNVBAgMCVNhbyBQYXVsbzESMBAGA1UEBwwJ +U2FvIFBhdWxvMQ8wDQYDVQQKDAZKYW5kaWcxDDAKBgNVBAsMA0FSdDESMBAGA1UE +AwwJbG9jYWxob3N0MB4XDTI0MTAyNjE2MDYwNFoXDTM0MTAyNDE2MDYwNFowaDEL +MAkGA1UEBhMCQlIxEjAQBgNVBAgMCVNhbyBQYXVsbzESMBAGA1UEBwwJU2FvIFBh +dWxvMQ8wDQYDVQQKDAZKYW5kaWcxDDAKBgNVBAsMA0FSdDESMBAGA1UEAwwJbG9j +YWxob3N0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvZ2euy9sDkUI +DuUEc9WDIBKsPUl8JuW1dk7F0+H3uq+B8RSHqmh8F+FYn0c4tU55h6/Pq7DdSaMv +AVnnKr7lny+IWnEtmBLv6igzql/ce7N3f+025dP6x/4Gd29TVKx4faTQTDxHF2PK +rINl1uPF82wqii2QL5oBSNEmR0ASEsPjjLLFd35QjAdO4pSKj5UV4fUMGRo1M4y+ +2Wq3szp31SNGfsS3yxT2A7Rp+VvYf2NuW3ajivvga8iLx52BA6XtBCh6t4xnJfcV +5Xei3IYbMFQl8fcvMM17va7w2oAIbKtMV8nd9cWXaRxvWoExdzgXjzsEJFwv/geM +asn9BVaHGuR+vlbBahYl9GAxpLEW7Og29SyHfKKgGAmm6tNmegrm/S6wizwU5I+X +z036hGFEGysa2NdU2WzcBXUrz4pskVXMaqmCo0rP2b74mGqU0ppAfI/wqsQKeUZf +x1+0STO4r9TxlzslrD5i4eGB21PwR8dV2XHUCWGjzRDzpiM6hnYgXnT8DN1TLPD8 +pw1CZC73TqoOU5dn3Us/rcBNWAp3Gb0/gHyvsUbKyTzX8Ug1Nq1XfrD7W9CjgTcv +zsJ3OL4FvxFeAePwcZQTj/QdgrsQiEw1bNsmCf44Kaxlx6rvVTCTZjJLncoX0VJo +DkJq83j57PRouQNgH5LUfH49sCJtoyMCAwEAAaNTMFEwHQYDVR0OBBYEFBPeFFsG +GFjffYm/xp/VWV9aTzYYMB8GA1UdIwQYMBaAFBPeFFsGGFjffYm/xp/VWV9aTzYY +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBAAA/g37n4BQOfFtz +etD4WMhqG/yhdRJIvPPLUU//CsmljVniqxZlDIQ0KeA3kir2tc/TP6TOiwRx1REV +hw7CRd8AAnn9a57osSJ652Hjkdhfb4XF3RS6aKZvs89jW36F1PwRoDu0lH2ROWSL +pogeQbUKJMy5ekzZ2yY72fuMSolZHvQAjpwTIKUBXsfdDnAmozCBYPei3StwNFJ3 +0Wf8KGeYWYTXQ32rRy6vi/OlQ/9iM2l/7/Oyzm/4dlBVISPYSPv/p47yKnSersoR +2ZNVjKXZhq+Cw0kW9wuphn2Tixk9gyt2PfO+voACqgYV50uBw3bcf1UAPJO/Yxdm +L03jWQtQIo1/UIR1vhhtxzc9jJlifu9qtr3aUS26TNYUt5xYwg6Exj+Fh3+u4mjj +xom22TaxbOQGN1RKaXrUPIN1W/SYKOe0J+oARvzg8VdYPDpbJlueLSh3q7CVlFin +OtkjAH8S/4EpDoyIANAdDiHvO+Bukcx5K/bPUsure7F0XdjtjKPYpRjN1pWW9HTC +ESa/jBvEab0Glb4ngqrcKHs6TvLA2OxiUKpwVNO6TkU93P+/lEWalIyn2BRgKV69 +Qias+xfiU1CiuflP6zkzTq5JWbaI0qENBfzUT1sJSSI6LfEAMafSWKL2BcBsLT7a +cGLldaUHc8Vqm9fAFVq0p6+zxFkm +-----END CERTIFICATE----- diff --git a/etc/mailpit/mailpit_key.pem b/etc/mailpit/mailpit_key.pem new file mode 100644 index 00000000..859654db --- /dev/null +++ b/etc/mailpit/mailpit_key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +hFvkWRZjMYs0AR0xU827vN7rn5Mfpw== +-----END PRIVATE KEY----- From c2bab27339762ccc09d3bb03d146621804f3f470 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sat, 26 Oct 2024 17:39:47 +0100 Subject: [PATCH 19/79] Update project configuration to use mailpit --- .envs/.example | 4 ++-- etc/mailpit/README.md | 10 ++++++++++ pyproject.toml | 7 +++++-- 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 etc/mailpit/README.md diff --git a/.envs/.example b/.envs/.example index ff7e1fe1..34c0fbc5 100644 --- a/.envs/.example +++ b/.envs/.example @@ -34,7 +34,7 @@ POSTGRES_USER=jandig POSTGRES_PASSWORD=secret # Email server variables -SMTP_SERVER=smtp.gmail.com -SMTP_PORT=587 +SMTP_SERVER=mailpit +SMTP_PORT=1025 JANDIG_EMAIL=local_jandig@jandig.com JANDIG_EMAIL_PASSWORD=local_password diff --git a/etc/mailpit/README.md b/etc/mailpit/README.md new file mode 100644 index 00000000..95f9dd19 --- /dev/null +++ b/etc/mailpit/README.md @@ -0,0 +1,10 @@ +# Mailpit configuration: +Reference: https://mailpit.axllent.org/docs/configuration/certificates/ + +The following command will generate a self-signed certificate and key (both needed for Mailpit) which is valid for 10 years: + +``` +openssl req -x509 -newkey rsa:4096 \ +-nodes -keyout mailpit_key.pem -out mailpit_cert.pem \ +-sha256 -days 3650 +``` \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 845541a9..788c974a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,8 @@ [tool.poetry] -package-mode = false +name="Jandig" +version="1.5.0" +description="AR Platform" +authors=["Check Github"] [tool.poetry.dependencies] python = "^3.10" @@ -27,7 +30,7 @@ djangorestframework = "^3.13.1" drf-nested-routers = "^0.93.4" django-htmx = "^1.18.0" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] playwright = "^1.41.2" pytest = "^7.2.0" pytest-xdist = "^3.0.2" From 9542e51b0597e9d03a0520155eb974970a807c8b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 26 Oct 2024 16:47:24 +0000 Subject: [PATCH 20/79] Bump sentry-sdk from 1.45.0 to 2.8.0 Bumps [sentry-sdk](https://github.com/getsentry/sentry-python) from 1.45.0 to 2.8.0. - [Release notes](https://github.com/getsentry/sentry-python/releases) - [Changelog](https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-python/compare/1.45.0...2.8.0) --- updated-dependencies: - dependency-name: sentry-sdk dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- poetry.lock | 21 ++++++++++++--------- pyproject.toml | 2 +- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/poetry.lock b/poetry.lock index fc1db26a..9d3685dc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1396,21 +1396,22 @@ crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] [[package]] name = "sentry-sdk" -version = "1.45.0" +version = "2.8.0" description = "Python client for Sentry (https://sentry.io)" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "sentry-sdk-1.45.0.tar.gz", hash = "sha256:509aa9678c0512344ca886281766c2e538682f8acfa50fd8d405f8c417ad0625"}, - {file = "sentry_sdk-1.45.0-py2.py3-none-any.whl", hash = "sha256:1ce29e30240cc289a027011103a8c83885b15ef2f316a60bcc7c5300afa144f1"}, + {file = "sentry_sdk-2.8.0-py2.py3-none-any.whl", hash = "sha256:6051562d2cfa8087bb8b4b8b79dc44690f8a054762a29c07e22588b1f619bfb5"}, + {file = "sentry_sdk-2.8.0.tar.gz", hash = "sha256:aa4314f877d9cd9add5a0c9ba18e3f27f99f7de835ce36bd150e48a41c7c646f"}, ] [package.dependencies] certifi = "*" -urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} +urllib3 = ">=1.26.11" [package.extras] aiohttp = ["aiohttp (>=3.5)"] +anthropic = ["anthropic (>=0.16)"] arq = ["arq (>=0.23)"] asyncpg = ["asyncpg (>=0.23)"] beam = ["apache-beam (>=2.12)"] @@ -1423,13 +1424,15 @@ django = ["django (>=1.8)"] falcon = ["falcon (>=1.4)"] fastapi = ["fastapi (>=0.79.0)"] flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] -grpcio = ["grpcio (>=1.21.1)"] +grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] httpx = ["httpx (>=0.16.0)"] huey = ["huey (>=2)"] +huggingface-hub = ["huggingface-hub (>=0.22)"] +langchain = ["langchain (>=0.0.210)"] loguru = ["loguru (>=0.5)"] openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] opentelemetry = ["opentelemetry-distro (>=0.35b0)"] -opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] +opentelemetry-experimental = ["opentelemetry-instrumentation-aio-pika (==0.46b0)", "opentelemetry-instrumentation-aiohttp-client (==0.46b0)", "opentelemetry-instrumentation-aiopg (==0.46b0)", "opentelemetry-instrumentation-asgi (==0.46b0)", "opentelemetry-instrumentation-asyncio (==0.46b0)", "opentelemetry-instrumentation-asyncpg (==0.46b0)", "opentelemetry-instrumentation-aws-lambda (==0.46b0)", "opentelemetry-instrumentation-boto (==0.46b0)", "opentelemetry-instrumentation-boto3sqs (==0.46b0)", "opentelemetry-instrumentation-botocore (==0.46b0)", "opentelemetry-instrumentation-cassandra (==0.46b0)", "opentelemetry-instrumentation-celery (==0.46b0)", "opentelemetry-instrumentation-confluent-kafka (==0.46b0)", "opentelemetry-instrumentation-dbapi (==0.46b0)", "opentelemetry-instrumentation-django (==0.46b0)", "opentelemetry-instrumentation-elasticsearch (==0.46b0)", "opentelemetry-instrumentation-falcon (==0.46b0)", "opentelemetry-instrumentation-fastapi (==0.46b0)", "opentelemetry-instrumentation-flask (==0.46b0)", "opentelemetry-instrumentation-grpc (==0.46b0)", "opentelemetry-instrumentation-httpx (==0.46b0)", "opentelemetry-instrumentation-jinja2 (==0.46b0)", "opentelemetry-instrumentation-kafka-python (==0.46b0)", "opentelemetry-instrumentation-logging (==0.46b0)", "opentelemetry-instrumentation-mysql (==0.46b0)", "opentelemetry-instrumentation-mysqlclient (==0.46b0)", "opentelemetry-instrumentation-pika (==0.46b0)", "opentelemetry-instrumentation-psycopg (==0.46b0)", "opentelemetry-instrumentation-psycopg2 (==0.46b0)", "opentelemetry-instrumentation-pymemcache (==0.46b0)", "opentelemetry-instrumentation-pymongo (==0.46b0)", "opentelemetry-instrumentation-pymysql (==0.46b0)", "opentelemetry-instrumentation-pyramid (==0.46b0)", "opentelemetry-instrumentation-redis (==0.46b0)", "opentelemetry-instrumentation-remoulade (==0.46b0)", "opentelemetry-instrumentation-requests (==0.46b0)", "opentelemetry-instrumentation-sklearn (==0.46b0)", "opentelemetry-instrumentation-sqlalchemy (==0.46b0)", "opentelemetry-instrumentation-sqlite3 (==0.46b0)", "opentelemetry-instrumentation-starlette (==0.46b0)", "opentelemetry-instrumentation-system-metrics (==0.46b0)", "opentelemetry-instrumentation-threading (==0.46b0)", "opentelemetry-instrumentation-tornado (==0.46b0)", "opentelemetry-instrumentation-tortoiseorm (==0.46b0)", "opentelemetry-instrumentation-urllib (==0.46b0)", "opentelemetry-instrumentation-urllib3 (==0.46b0)", "opentelemetry-instrumentation-wsgi (==0.46b0)"] pure-eval = ["asttokens", "executing", "pure-eval"] pymongo = ["pymongo (>=3.1)"] pyspark = ["pyspark (>=2.4.4)"] @@ -1439,7 +1442,7 @@ sanic = ["sanic (>=0.8)"] sqlalchemy = ["sqlalchemy (>=1.2)"] starlette = ["starlette (>=0.19.1)"] starlite = ["starlite (>=1.48)"] -tornado = ["tornado (>=5)"] +tornado = ["tornado (>=6)"] [[package]] name = "setuptools" @@ -1784,4 +1787,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "9069175fd256356d8679c6eb7f0d8d77e48721829fd14e0cb8c3015988ceb66a" +content-hash = "60c6e07d88b94c82104adb6645029b46c461f8c20b41d7f3332c1fd422ed0aca" diff --git a/pyproject.toml b/pyproject.toml index f80ec98e..3239c9fa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ django-extensions = "^3.1.5" factory-boy = "^3.2.1" boto3 = "^1.24.27" django-storages = "^1.12.3" -sentry-sdk = "^1.7.0" +sentry-sdk = "^2.8.0" djangorestframework = "^3.13.1" drf-nested-routers = "^0.93.4" django-htmx = "^1.18.0" From 34fabe9051f1a307a8d68844f9c43671eba4084d Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sat, 26 Oct 2024 18:08:48 +0100 Subject: [PATCH 21/79] Fix favicon on home page --- .envs/.example | 3 ++- src/core/jinja2/core/arviewer.jinja2 | 2 +- src/core/jinja2/core/base.jinja2 | 2 +- src/core/jinja2/core/home.jinja2 | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.envs/.example b/.envs/.example index 34c0fbc5..d06940a6 100644 --- a/.envs/.example +++ b/.envs/.example @@ -4,11 +4,12 @@ DJANGO_DEBUG=True DEBUG_TOOLBAR=True DJANGO_SECRET_KEY=change_me USE_MINIO=True +DJANGO_ADMIN_URL=jandig-admin/ # Sentry Variables -DJANGO_ADMIN_URL=jandig-admin/ ENABLE_SENTRY=False SENTRY_DSN= +SENTRY_ENVIRONMENT="local" HEALTH_CHECK_URL=api/v1/status/ SENTRY_TRACES_SAMPLE_RATE=0.1 diff --git a/src/core/jinja2/core/arviewer.jinja2 b/src/core/jinja2/core/arviewer.jinja2 index 3b7f3197..32d492f9 100644 --- a/src/core/jinja2/core/arviewer.jinja2 +++ b/src/core/jinja2/core/arviewer.jinja2 @@ -18,7 +18,7 @@ - + diff --git a/src/core/jinja2/core/base.jinja2 b/src/core/jinja2/core/base.jinja2 index 194819d7..88324aa5 100644 --- a/src/core/jinja2/core/base.jinja2 +++ b/src/core/jinja2/core/base.jinja2 @@ -28,7 +28,7 @@ - + diff --git a/src/core/jinja2/core/home.jinja2 b/src/core/jinja2/core/home.jinja2 index 6199f324..ca6d3553 100644 --- a/src/core/jinja2/core/home.jinja2 +++ b/src/core/jinja2/core/home.jinja2 @@ -21,7 +21,7 @@ - + {% block extra_css %} {% endblock %} From 3135a5903d5cd691c13f20d860f5a43e0bda9b55 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sat, 26 Oct 2024 20:15:13 +0100 Subject: [PATCH 22/79] Update python and poetry to latest versions --- Dockerfile | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index e62822d6..bbda708e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,12 @@ -FROM python:3.10-slim-bullseye + +FROM python:3.13.0-slim-bookworm RUN apt-get update && \ apt-get install -y --no-install-recommends \ gettext \ docutils-common \ curl \ + pipx \ wget COPY ./pyproject.toml /pyproject.toml @@ -16,16 +18,15 @@ ENV PATH="$PATH:/root/.local/bin" \ POETRY_CACHE_DIR='/var/cache/pypoetry' \ TINI_VERSION=v0.19.0 \ # poetry: - POETRY_VERSION=1.3.1 + POETRY_VERSION=1.8.4 # Installing `poetry` package manager: # https://github.com/python-poetry/poetry -RUN curl -sSL https://install.python-poetry.org | python3 - \ - && poetry --version - RUN pip install --upgrade pip +RUN pipx install --python python3 poetry==${POETRY_VERSION} RUN poetry install + RUN dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \ && wget "https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${dpkgArch}" -O /usr/local/bin/tini \ && chmod +x /usr/local/bin/tini && tini --version From 90532a2f203c69542f4269d395b3cad0c12442f0 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sat, 26 Oct 2024 20:15:57 +0100 Subject: [PATCH 23/79] Update poetry and pyproject for python3.13, django 5.1 compatibility --- poetry.lock | 1301 ++++++++++++++++++++++++------------------------ pyproject.toml | 20 +- 2 files changed, 647 insertions(+), 674 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9d3685dc..9b2e79a1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,14 +1,14 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "alabaster" -version = "0.7.16" +version = "1.0.0" description = "A light, configurable Sphinx theme" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, - {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, + {file = "alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b"}, + {file = "alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e"}, ] [[package]] @@ -22,21 +22,18 @@ files = [ {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, ] -[package.dependencies] -typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} - [package.extras] tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "babel" -version = "2.15.0" +version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" files = [ - {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, - {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, ] [package.extras] @@ -68,7 +65,6 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -78,17 +74,17 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.34.140" +version = "1.35.49" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.140-py3-none-any.whl", hash = "sha256:23ca8d8f7a30c3bbd989808056b5fc5d68ff5121c02c722c6167b6b1bb7f8726"}, - {file = "boto3-1.34.140.tar.gz", hash = "sha256:578bbd5e356005719b6b610d03edff7ea1b0824d078afe62d3fb8bea72f83a87"}, + {file = "boto3-1.35.49-py3-none-any.whl", hash = "sha256:b660c649a27a6b47a34f6f858f5bd7c3b0a798a16dec8dda7cbebeee80fd1f60"}, + {file = "boto3-1.35.49.tar.gz", hash = "sha256:ddecb27f5699ca9f97711c52b6c0652c2e63bf6c2bfbc13b819b4f523b4d30ff"}, ] [package.dependencies] -botocore = ">=1.34.140,<1.35.0" +botocore = ">=1.35.49,<1.36.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -97,13 +93,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.140" +version = "1.35.49" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.140-py3-none-any.whl", hash = "sha256:43940d3a67d946ba3301631ba4078476a75f1015d4fb0fb0272d0b754b2cf9de"}, - {file = "botocore-1.34.140.tar.gz", hash = "sha256:86302b2226c743b9eec7915a4c6cfaffd338ae03989cd9ee181078ef39d1ab39"}, + {file = "botocore-1.35.49-py3-none-any.whl", hash = "sha256:aed4d3643afd702920792b68fbe712a8c3847993820d1048cd238a6469354da1"}, + {file = "botocore-1.35.49.tar.gz", hash = "sha256:07d0c1325fdbfa49a4a054413dbdeab0a6030449b2aa66099241af2dac48afd8"}, ] [package.dependencies] @@ -112,78 +108,93 @@ python-dateutil = ">=2.1,<3.0.0" urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} [package.extras] -crt = ["awscrt (==0.20.11)"] +crt = ["awscrt (==0.22.0)"] [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -191,101 +202,116 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -330,17 +356,17 @@ six = ">=1.10" [[package]] name = "django" -version = "4.2.16" +version = "5.1.2" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" files = [ - {file = "Django-4.2.16-py3-none-any.whl", hash = "sha256:1ddc333a16fc139fd253035a1606bb24261951bbc3a6ca256717fa06cc41a898"}, - {file = "Django-4.2.16.tar.gz", hash = "sha256:6f1616c2786c408ce86ab7e10f792b8f15742f7b7b7460243929cb371e7f1dad"}, + {file = "Django-5.1.2-py3-none-any.whl", hash = "sha256:f11aa87ad8d5617171e3f77e1d5d16f004b79a2cf5d2e1d2b97a6a1f8e9ba5ed"}, + {file = "Django-5.1.2.tar.gz", hash = "sha256:bd7376f90c99f96b643722eee676498706c9fd7dc759f55ebfaf2c08ebcdf4f0"}, ] [package.dependencies] -asgiref = ">=3.6.0,<4" +asgiref = ">=3.8.1,<4" sqlparse = ">=0.3.1" tzdata = {version = "*", markers = "sys_platform == \"win32\""} @@ -348,30 +374,6 @@ tzdata = {version = "*", markers = "sys_platform == \"win32\""} argon2 = ["argon2-cffi (>=19.1.0)"] bcrypt = ["bcrypt"] -[[package]] -name = "django-boogie" -version = "0.13.3" -description = "Django with swagger: better managers, APIs, configurations and url mappers." -optional = false -python-versions = "*" -files = [ - {file = "django-boogie-0.13.3.tar.gz", hash = "sha256:657799ae308a04ab32ac153c4204c5f7b8d12c032e89146d9112e662baa08c3a"}, -] - -[package.dependencies] -django = ">=2.0" -sidekick = ">=0.5.0,<0.6.0" - -[package.extras] -configurations = ["django-environ (>=0.4,<1.0)"] -dev-stack = ["django-boogie[stack]", "django-boogie[test]", "django-debug-toolbar", "django-spaghetti-and-meatballs", "docutils (>=0.14,<1.0)", "flake8 (>=3.5)", "hyperpython (>=1.1.0,<1.2.0)", "invoke (>=1.0)", "manuel (>=1.10)", "sphinx-autobuild (>=0.7,<1.0)"] -extra = ["django-bulk-update (>=2.2)", "django-manager-utils (>=1.1)", "django-model-utils (>=3.0)", "django-polymorphic (>=2.0,<3.0)"] -pandas = ["django-pandas (>=0.5.0,<0.6.0)", "pandas (>=0.22,<1.0)"] -rest = ["django-filter (>=1.1,<2.0)", "djangorestframework (>=3.8,<4.0)"] -rules = ["rules (<2)"] -stack = ["django-bulk-update (>=2.2)", "django-environ (>=0.4,<1.0)", "django-extensions (>=2.1,<3.0)", "django-filter (>=1.1,<2.0)", "django-manager-utils (>=1.1)", "django-model-utils (>=3.0)", "django-pandas (>=0.5.0,<0.6.0)", "django-polymorphic (>=2.0,<3.0)", "djangorestframework (>=3.8,<4.0)", "pandas (>=0.22,<1.0)", "rules (<2)"] -test = ["beautifulsoup4 (>=4.6,<5.0)", "django-stubs (>=0.12.1,<0.13.0)", "factory_boy (>=2.0,<3.0)", "faker", "model_mommy (>=1.6,<2.0)", "mypy (>=0.701,<1.0)", "pytest (>=3.8,<4.0)", "pytest-cov (>=2.6,<3.0)", "pytest-django (>=3.1,<4.0)"] - [[package]] name = "django-cors-headers" version = "3.14.0" @@ -388,17 +390,17 @@ Django = ">=3.2" [[package]] name = "django-debug-toolbar" -version = "3.8.1" +version = "4.4.6" description = "A configurable set of panels that display various debug information about the current request/response." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "django_debug_toolbar-3.8.1-py3-none-any.whl", hash = "sha256:879f8a4672d41621c06a4d322dcffa630fc4df056cada6e417ed01db0e5e0478"}, - {file = "django_debug_toolbar-3.8.1.tar.gz", hash = "sha256:24ef1a7d44d25e60d7951e378454c6509bf536dce7e7d9d36e7c387db499bc27"}, + {file = "django_debug_toolbar-4.4.6-py3-none-any.whl", hash = "sha256:3beb671c9ec44ffb817fad2780667f172bd1c067dbcabad6268ce39a81335f45"}, + {file = "django_debug_toolbar-4.4.6.tar.gz", hash = "sha256:36e421cb908c2f0675e07f9f41e3d1d8618dc386392ec82d23bcfcd5d29c7044"}, ] [package.dependencies] -django = ">=3.2.4" +django = ">=4.2.9" sqlparse = ">=0.2" [[package]] @@ -433,13 +435,13 @@ Django = ">=3.2" [[package]] name = "django-htmx" -version = "1.18.0" +version = "1.20.0" description = "Extensions for using Django with htmx." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "django_htmx-1.18.0-py3-none-any.whl", hash = "sha256:48f3b8a784467bfcc30562067b87ecbc4ad9b739cc269eec5f3789c16d2cb2ce"}, - {file = "django_htmx-1.18.0.tar.gz", hash = "sha256:db8a0cc15bcd0f7ae929bcb9108d9e6be228843092aca7956d977c31c4d95aae"}, + {file = "django_htmx-1.20.0-py3-none-any.whl", hash = "sha256:e36c0e0cfe53572674f0f885b7bd1d1281088cf3f8a803566ddf3e90d9b69fce"}, + {file = "django_htmx-1.20.0.tar.gz", hash = "sha256:6a97ff0256a247a2c20c85c1f81358fa0c9650af52e6064cb6664ae8619c9294"}, ] [package.dependencies] @@ -448,13 +450,13 @@ django = ">=3.2" [[package]] name = "django-storages" -version = "1.14.3" +version = "1.14.4" description = "Support for many storage backends in Django" optional = false python-versions = ">=3.7" files = [ - {file = "django-storages-1.14.3.tar.gz", hash = "sha256:95a12836cd998d4c7a4512347322331c662d9114c4344f932f5e9c0fce000608"}, - {file = "django_storages-1.14.3-py3-none-any.whl", hash = "sha256:31f263389e95ce3a1b902fb5f739a7ed32895f7d8b80179fe7453ecc0dfe102e"}, + {file = "django-storages-1.14.4.tar.gz", hash = "sha256:69aca94d26e6714d14ad63f33d13619e697508ee33ede184e462ed766dc2a73f"}, + {file = "django_storages-1.14.4-py3-none-any.whl", hash = "sha256:d61930acb4a25e3aebebc6addaf946a3b1df31c803a6bf1af2f31c9047febaa3"}, ] [package.dependencies] @@ -485,13 +487,13 @@ django = ">=4.2" [[package]] name = "docutils" -version = "0.19" +version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, - {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] [[package]] @@ -509,20 +511,6 @@ files = [ Django = ">=3.2" djangorestframework = ">=3.14.0" -[[package]] -name = "exceptiongroup" -version = "1.2.1" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, -] - -[package.extras] -test = ["pytest (>=6)"] - [[package]] name = "execnet" version = "2.1.1" @@ -539,35 +527,36 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "factory-boy" -version = "3.3.0" +version = "3.3.1" description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "factory_boy-3.3.0-py2.py3-none-any.whl", hash = "sha256:a2cdbdb63228177aa4f1c52f4b6d83fab2b8623bf602c7dedd7eb83c0f69c04c"}, - {file = "factory_boy-3.3.0.tar.gz", hash = "sha256:bc76d97d1a65bbd9842a6d722882098eb549ec8ee1081f9fb2e8ff29f0c300f1"}, + {file = "factory_boy-3.3.1-py2.py3-none-any.whl", hash = "sha256:7b1113c49736e1e9995bc2a18f4dbf2c52cf0f841103517010b1d825712ce3ca"}, + {file = "factory_boy-3.3.1.tar.gz", hash = "sha256:8317aa5289cdfc45f9cae570feb07a6177316c82e34d14df3c2e1f22f26abef0"}, ] [package.dependencies] Faker = ">=0.7.0" [package.extras] -dev = ["Django", "Pillow", "SQLAlchemy", "coverage", "flake8", "isort", "mongoengine", "sqlalchemy-utils", "tox", "wheel (>=0.32.0)", "zest.releaser[recommended]"] +dev = ["Django", "Pillow", "SQLAlchemy", "coverage", "flake8", "isort", "mongoengine", "mongomock", "mypy", "tox", "wheel (>=0.32.0)", "zest.releaser[recommended]"] doc = ["Sphinx", "sphinx-rtd-theme", "sphinxcontrib-spelling"] [[package]] name = "faker" -version = "26.0.0" +version = "30.8.1" description = "Faker is a Python package that generates fake data for you." optional = false python-versions = ">=3.8" files = [ - {file = "Faker-26.0.0-py3-none-any.whl", hash = "sha256:886ee28219be96949cd21ecc96c4c742ee1680e77f687b095202c8def1a08f06"}, - {file = "Faker-26.0.0.tar.gz", hash = "sha256:0f60978314973de02c00474c2ae899785a42b2cf4f41b7987e93c132a2b8a4a9"}, + {file = "Faker-30.8.1-py3-none-any.whl", hash = "sha256:4f7f133560b9d4d2a915581f4ba86f9a6a83421b89e911f36c4c96cff58135a5"}, + {file = "faker-30.8.1.tar.gz", hash = "sha256:93e8b70813f76d05d98951154681180cb795cfbcff3eced7680d963bcc0da2a9"}, ] [package.dependencies] python-dateutil = ">=2.4" +typing-extensions = "*" [[package]] name = "flake8" @@ -587,59 +576,54 @@ pyflakes = ">=2.5.0,<2.6.0" [[package]] name = "gevent" -version = "23.9.1" +version = "24.10.3" description = "Coroutine-based network library" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "gevent-23.9.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:a3c5e9b1f766a7a64833334a18539a362fb563f6c4682f9634dea72cbe24f771"}, - {file = "gevent-23.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b101086f109168b23fa3586fccd1133494bdb97f86920a24dc0b23984dc30b69"}, - {file = "gevent-23.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36a549d632c14684bcbbd3014a6ce2666c5f2a500f34d58d32df6c9ea38b6535"}, - {file = "gevent-23.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:272cffdf535978d59c38ed837916dfd2b5d193be1e9e5dcc60a5f4d5025dd98a"}, - {file = "gevent-23.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcb8612787a7f4626aa881ff15ff25439561a429f5b303048f0fca8a1c781c39"}, - {file = "gevent-23.9.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:d57737860bfc332b9b5aa438963986afe90f49645f6e053140cfa0fa1bdae1ae"}, - {file = "gevent-23.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5f3c781c84794926d853d6fb58554dc0dcc800ba25c41d42f6959c344b4db5a6"}, - {file = "gevent-23.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:dbb22a9bbd6a13e925815ce70b940d1578dbe5d4013f20d23e8a11eddf8d14a7"}, - {file = "gevent-23.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:707904027d7130ff3e59ea387dddceedb133cc742b00b3ffe696d567147a9c9e"}, - {file = "gevent-23.9.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:45792c45d60f6ce3d19651d7fde0bc13e01b56bb4db60d3f32ab7d9ec467374c"}, - {file = "gevent-23.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e24c2af9638d6c989caffc691a039d7c7022a31c0363da367c0d32ceb4a0648"}, - {file = "gevent-23.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e1ead6863e596a8cc2a03e26a7a0981f84b6b3e956101135ff6d02df4d9a6b07"}, - {file = "gevent-23.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65883ac026731ac112184680d1f0f1e39fa6f4389fd1fc0bf46cc1388e2599f9"}, - {file = "gevent-23.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7af500da05363e66f122896012acb6e101a552682f2352b618e541c941a011"}, - {file = "gevent-23.9.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:c3e5d2fa532e4d3450595244de8ccf51f5721a05088813c1abd93ad274fe15e7"}, - {file = "gevent-23.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c84d34256c243b0a53d4335ef0bc76c735873986d478c53073861a92566a8d71"}, - {file = "gevent-23.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ada07076b380918829250201df1d016bdafb3acf352f35e5693b59dceee8dd2e"}, - {file = "gevent-23.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:921dda1c0b84e3d3b1778efa362d61ed29e2b215b90f81d498eb4d8eafcd0b7a"}, - {file = "gevent-23.9.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:ed7a048d3e526a5c1d55c44cb3bc06cfdc1947d06d45006cc4cf60dedc628904"}, - {file = "gevent-23.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c1abc6f25f475adc33e5fc2dbcc26a732608ac5375d0d306228738a9ae14d3b"}, - {file = "gevent-23.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4368f341a5f51611411ec3fc62426f52ac3d6d42eaee9ed0f9eebe715c80184e"}, - {file = "gevent-23.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:52b4abf28e837f1865a9bdeef58ff6afd07d1d888b70b6804557e7908032e599"}, - {file = "gevent-23.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52e9f12cd1cda96603ce6b113d934f1aafb873e2c13182cf8e86d2c5c41982ea"}, - {file = "gevent-23.9.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:de350fde10efa87ea60d742901e1053eb2127ebd8b59a7d3b90597eb4e586599"}, - {file = "gevent-23.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fde6402c5432b835fbb7698f1c7f2809c8d6b2bd9d047ac1f5a7c1d5aa569303"}, - {file = "gevent-23.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:dd6c32ab977ecf7c7b8c2611ed95fa4aaebd69b74bf08f4b4960ad516861517d"}, - {file = "gevent-23.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:455e5ee8103f722b503fa45dedb04f3ffdec978c1524647f8ba72b4f08490af1"}, - {file = "gevent-23.9.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:7ccf0fd378257cb77d91c116e15c99e533374a8153632c48a3ecae7f7f4f09fe"}, - {file = "gevent-23.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d163d59f1be5a4c4efcdd13c2177baaf24aadf721fdf2e1af9ee54a998d160f5"}, - {file = "gevent-23.9.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7532c17bc6c1cbac265e751b95000961715adef35a25d2b0b1813aa7263fb397"}, - {file = "gevent-23.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:78eebaf5e73ff91d34df48f4e35581ab4c84e22dd5338ef32714264063c57507"}, - {file = "gevent-23.9.1-cp38-cp38-win32.whl", hash = "sha256:f632487c87866094546a74eefbca2c74c1d03638b715b6feb12e80120960185a"}, - {file = "gevent-23.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:62d121344f7465e3739989ad6b91f53a6ca9110518231553fe5846dbe1b4518f"}, - {file = "gevent-23.9.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:bf456bd6b992eb0e1e869e2fd0caf817f0253e55ca7977fd0e72d0336a8c1c6a"}, - {file = "gevent-23.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43daf68496c03a35287b8b617f9f91e0e7c0d042aebcc060cadc3f049aadd653"}, - {file = "gevent-23.9.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:7c28e38dcde327c217fdafb9d5d17d3e772f636f35df15ffae2d933a5587addd"}, - {file = "gevent-23.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fae8d5b5b8fa2a8f63b39f5447168b02db10c888a3e387ed7af2bd1b8612e543"}, - {file = "gevent-23.9.1-cp39-cp39-win32.whl", hash = "sha256:2c7b5c9912378e5f5ccf180d1fdb1e83f42b71823483066eddbe10ef1a2fcaa2"}, - {file = "gevent-23.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:a2898b7048771917d85a1d548fd378e8a7b2ca963db8e17c6d90c76b495e0e2b"}, - {file = "gevent-23.9.1.tar.gz", hash = "sha256:72c002235390d46f94938a96920d8856d4ffd9ddf62a303a0d7c118894097e34"}, + {file = "gevent-24.10.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:d7a1ad0f2da582f5bd238bca067e1c6c482c30c15a6e4d14aaa3215cbb2232f3"}, + {file = "gevent-24.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4e526fdc279c655c1e809b0c34b45844182c2a6b219802da5e411bd2cf5a8ad"}, + {file = "gevent-24.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57a5c4e0bdac482c5f02f240d0354e61362df73501ef6ebafce8ef635cad7527"}, + {file = "gevent-24.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d67daed8383326dc8b5e58d88e148d29b6b52274a489e383530b0969ae7b9cb9"}, + {file = "gevent-24.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e24ffea72e27987979c009536fd0868e52239b44afe6cf7135ce8aafd0f108e"}, + {file = "gevent-24.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c1d80090485da1ea3d99205fe97908b31188c1f4857f08b333ffaf2de2e89d18"}, + {file = "gevent-24.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0c129f81d60cda614acb4b0c5731997ca05b031fb406fcb58ad53a7ade53b13"}, + {file = "gevent-24.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:26ca7a6b42d35129617025ac801135118333cad75856ffc3217b38e707383eba"}, + {file = "gevent-24.10.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:68c3a0d8402755eba7f69022e42e8021192a721ca8341908acc222ea597029b6"}, + {file = "gevent-24.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d850a453d66336272be4f1d3a8126777f3efdaea62d053b4829857f91e09755"}, + {file = "gevent-24.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e58ee3723f1fbe07d66892f1caa7481c306f653a6829b6fd16cb23d618a5915"}, + {file = "gevent-24.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b52382124eca13135a3abe4f65c6bd428656975980a48e51b17aeab68bdb14db"}, + {file = "gevent-24.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ca2266e08f43c0e22c028801dff7d92a0b102ef20e4caeb6a46abfb95f6a328"}, + {file = "gevent-24.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d758f0d4dbf32502ec87bb9b536ca8055090a16f8305f0ada3ce6f34e70f2fd7"}, + {file = "gevent-24.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0de6eb3d55c03138fda567d9bfed28487ce5d0928c5107549767a93efdf2be26"}, + {file = "gevent-24.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:385710355eadecdb70428a5ae3e7e5a45dcf888baa1426884588be9d25ac4290"}, + {file = "gevent-24.10.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ad8fb70aa0ebc935729c9699ac31b210a49b689a7b27b7ac9f91676475f3f53"}, + {file = "gevent-24.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f18689f7a70d2ed0e75bad5036ec3c89690a493d4cfac8d7cdb258ac04b132bd"}, + {file = "gevent-24.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f4f171d4d2018170454d84c934842e1b5f6ce7468ba298f6e7f7cff15000a3"}, + {file = "gevent-24.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7021e26d70189b33c27173d4173f27bf4685d6b6f1c0ea50e5335f8491cb110c"}, + {file = "gevent-24.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34aea15f9c79f27a8faeaa361bc1e72c773a9b54a1996a2ec4eefc8bcd59a824"}, + {file = "gevent-24.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8af65a4d4feaec6042c666d22c322a310fba3b47e841ad52f724b9c3ce5da48e"}, + {file = "gevent-24.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:89c4115e3f5ada55f92b61701a46043fe42f702b5af863b029e4c1a76f6cc2d4"}, + {file = "gevent-24.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:1ce6dab94c0b0d24425ba55712de2f8c9cb21267150ca63f5bb3a0e1f165da99"}, + {file = "gevent-24.10.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:f147e38423fbe96e8731f60a63475b3d2cab2f3d10578d8ee9d10c507c58a2ff"}, + {file = "gevent-24.10.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e6984ec96fc95fd67488555c38ece3015be1f38b1bcceb27b7d6c36b343008"}, + {file = "gevent-24.10.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:051b22e2758accfddb0457728bfc9abf8c3f2ce6bca43f1ff6e07b5ed9e49bf4"}, + {file = "gevent-24.10.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb5edb6433764119a664bbb148d2aea9990950aa89cc3498f475c2408d523ea3"}, + {file = "gevent-24.10.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce417bcaaab496bc9c77f75566531e9d93816262037b8b2dbb88b0fdcd66587c"}, + {file = "gevent-24.10.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:1c3a828b033fb02b7c31da4d75014a1f82e6c072fc0523456569a57f8b025861"}, + {file = "gevent-24.10.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f2ae3efbbd120cdf4a68b7abc27a37e61e6f443c5a06ec2c6ad94c37cd8471ec"}, + {file = "gevent-24.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:9e1210334a9bc9f76c3d008e0785ca62214f8a54e1325f6c2ecab3b6a572a015"}, + {file = "gevent-24.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70e9ed7ecb70e0df7dc97c3bc420de9a45a7c76bd5861c6cfec8c549700e681e"}, + {file = "gevent-24.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3ac83b74304487afa211a01909c7dd257e574db0cd429d866c298e21df7aeedf"}, + {file = "gevent-24.10.3-cp39-cp39-win32.whl", hash = "sha256:a9a89d6e396ef6f1e3968521bf56e8c4bee25b193bbf5d428b7782d582410822"}, + {file = "gevent-24.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:40ea3e40e8bb4fdb143c2a8edf2ccfdebd56016c7317c341ce8094c7bee08818"}, + {file = "gevent-24.10.3-pp310-pypy310_pp73-macosx_11_0_universal2.whl", hash = "sha256:e534e6a968d74463b11de6c9c67f4b4bf61775fb00f2e6e0f7fcdd412ceade18"}, + {file = "gevent-24.10.3.tar.gz", hash = "sha256:aa7ee1bd5cabb2b7ef35105f863b386c8d5e332f754b60cfc354148bd70d35d1"}, ] [package.dependencies] -cffi = {version = ">=1.12.2", markers = "platform_python_implementation == \"CPython\" and sys_platform == \"win32\""} -greenlet = [ - {version = ">=2.0.0", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.11\""}, - {version = ">=3.0rc3", markers = "platform_python_implementation == \"CPython\" and python_version >= \"3.11\""}, -] +cffi = {version = ">=1.17.1", markers = "platform_python_implementation == \"CPython\" and sys_platform == \"win32\""} +greenlet = {version = ">=3.1.1", markers = "platform_python_implementation == \"CPython\""} "zope.event" = "*" "zope.interface" = "*" @@ -647,74 +631,89 @@ greenlet = [ dnspython = ["dnspython (>=1.16.0,<2.0)", "idna"] docs = ["furo", "repoze.sphinx.autointerface", "sphinx", "sphinxcontrib-programoutput", "zope.schema"] monitor = ["psutil (>=5.7.0)"] -recommended = ["cffi (>=1.12.2)", "dnspython (>=1.16.0,<2.0)", "idna", "psutil (>=5.7.0)"] -test = ["cffi (>=1.12.2)", "coverage (>=5.0)", "dnspython (>=1.16.0,<2.0)", "idna", "objgraph", "psutil (>=5.7.0)", "requests", "setuptools"] +recommended = ["cffi (>=1.17.1)", "dnspython (>=1.16.0,<2.0)", "idna", "psutil (>=5.7.0)"] +test = ["cffi (>=1.17.1)", "coverage (>=5.0)", "dnspython (>=1.16.0,<2.0)", "idna", "objgraph", "psutil (>=5.7.0)", "requests"] [[package]] name = "greenlet" -version = "3.0.3" +version = "3.1.1" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ - {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, - {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, - {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, - {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, - {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, - {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, - {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, - {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, - {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, - {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, - {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, - {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, - {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, - {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, - {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, - {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, + {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, + {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, + {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, + {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, + {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, + {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, + {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, + {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, + {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, + {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, + {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, ] [package.extras] @@ -743,15 +742,18 @@ tornado = ["tornado (>=0.2)"] [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "imagesize" version = "1.4.1" @@ -776,13 +778,13 @@ files = [ [[package]] name = "invoke" -version = "1.7.3" +version = "2.2.0" description = "Pythonic task execution" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "invoke-1.7.3-py3-none-any.whl", hash = "sha256:d9694a865764dd3fd91f25f7e9a97fb41666e822bbb00e670091e3f43933574d"}, - {file = "invoke-1.7.3.tar.gz", hash = "sha256:41b428342d466a82135d5ab37119685a989713742be46e42a3a399d685579314"}, + {file = "invoke-2.2.0-py3-none-any.whl", hash = "sha256:6ea924cc53d4f78e3d98bc436b08069a03077e6f85ad1ddaa8a116d7dad15820"}, + {file = "invoke-2.2.0.tar.gz", hash = "sha256:ee6cbb101af1a859c7fe84f2a264c059020b0cb7fe3535f9424300ab568f6bd5"}, ] [[package]] @@ -942,118 +944,131 @@ files = [ [[package]] name = "pillow" -version = "9.5.0" +version = "11.0.0" description = "Python Imaging Library (Fork)" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, - {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, - {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, - {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, - {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, - {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, - {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, - {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, - {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, - {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, - {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, - {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, - {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, - {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, - {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, - {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, - {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, + {file = "pillow-11.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947"}, + {file = "pillow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97"}, + {file = "pillow-11.0.0-cp310-cp310-win32.whl", hash = "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50"}, + {file = "pillow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c"}, + {file = "pillow-11.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9"}, + {file = "pillow-11.0.0-cp311-cp311-win32.whl", hash = "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5"}, + {file = "pillow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291"}, + {file = "pillow-11.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc"}, + {file = "pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6"}, + {file = "pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47"}, + {file = "pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb"}, + {file = "pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798"}, + {file = "pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de"}, + {file = "pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a"}, + {file = "pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8"}, + {file = "pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8"}, + {file = "pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904"}, + {file = "pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae"}, + {file = "pillow-11.0.0-cp39-cp39-win32.whl", hash = "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4"}, + {file = "pillow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd"}, + {file = "pillow-11.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944"}, + {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "playwright" -version = "1.45.0" +version = "1.48.0" description = "A high-level API to automate web browsers" optional = false python-versions = ">=3.8" files = [ - {file = "playwright-1.45.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:7d49aee5907d8e72060f04bc299cb6851c2dc44cb227540ade89d7aa529e907a"}, - {file = "playwright-1.45.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:210c9f848820f58b5b5ed48047748620b780ca3acc3e2b7560dafb2bfdd6d90a"}, - {file = "playwright-1.45.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:13b5398831f5499580e819ddc996633446a93bf88029e89451e51da188e16ae3"}, - {file = "playwright-1.45.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:0ba5a39f25fb9b9cf1bd48678f44536a29f6d83376329de2dee1567dac220afe"}, - {file = "playwright-1.45.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b09fa76614ba2926d45a4c0581f710c13652d5e32290ba6a1490fbafff7f0be8"}, - {file = "playwright-1.45.0-py3-none-win32.whl", hash = "sha256:97a7d53af89af54208b69c051046b462675fcf5b93f7fbfb7c0fa7f813424ee2"}, - {file = "playwright-1.45.0-py3-none-win_amd64.whl", hash = "sha256:701db496928429aec103739e48e3110806bd5cf49456cc95b89f28e1abda71da"}, + {file = "playwright-1.48.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:082bce2739f1078acc7d0734da8cc0e23eb91b7fae553f3316d733276f09a6b1"}, + {file = "playwright-1.48.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7da2eb51a19c7f3b523e9faa9d98e7af92e52eb983a099979ea79c9668e3cbf7"}, + {file = "playwright-1.48.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:115b988d1da322358b77bc3bf2d3cc90f8c881e691461538e7df91614c4833c9"}, + {file = "playwright-1.48.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:8dabb80e62f667fe2640a8b694e26a7b884c0b4803f7514a3954fc849126227b"}, + {file = "playwright-1.48.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ff8303409ebed76bed4c3d655340320b768817d900ba208b394fdd7d7939a5c"}, + {file = "playwright-1.48.0-py3-none-win32.whl", hash = "sha256:85598c360c590076d4f435525be991246d74a905b654ac19d26eab7ed9b98b2d"}, + {file = "playwright-1.48.0-py3-none-win_amd64.whl", hash = "sha256:e0e87b0c4dc8fce83c725dd851aec37bc4e882bb225ec8a96bd83cf32d4f1623"}, ] [package.dependencies] -greenlet = "3.0.3" -pyee = "11.1.0" +greenlet = "3.1.1" +pyee = "12.0.0" [[package]] name = "pluggy" @@ -1072,83 +1087,78 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "psycopg2-binary" -version = "2.9.9" +version = "2.9.10" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-win32.whl", hash = "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-win32.whl", hash = "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-win32.whl", hash = "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, + {file = "psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:0ea8e3d0ae83564f2fc554955d327fa081d065c8ca5cc6d2abb643e2c9c1200f"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:3e9c76f0ac6f92ecfc79516a8034a544926430f7b080ec5a0537bca389ee0906"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ad26b467a405c798aaa1458ba09d7e2b6e5f96b1ce0ac15d82fd9f95dc38a92"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:270934a475a0e4b6925b5f804e3809dd5f90f8613621d062848dd82f9cd62007"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48b338f08d93e7be4ab2b5f1dbe69dc5e9ef07170fe1f86514422076d9c010d0"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4152f8f76d2023aac16285576a9ecd2b11a9895373a1f10fd9db54b3ff06b4"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32581b3020c72d7a421009ee1c6bf4a131ef5f0a968fab2e2de0c9d2bb4577f1"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2ce3e21dc3437b1d960521eca599d57408a695a0d3c26797ea0f72e834c7ffe5"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e984839e75e0b60cfe75e351db53d6db750b00de45644c5d1f7ee5d1f34a1ce5"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c4745a90b78e51d9ba06e2088a2fe0c693ae19cc8cb051ccda44e8df8a6eb53"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-win32.whl", hash = "sha256:e5720a5d25e3b99cd0dc5c8a440570469ff82659bb09431c1439b92caf184d3b"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-win_amd64.whl", hash = "sha256:3c18f74eb4386bf35e92ab2354a12c17e5eb4d9798e4c0ad3a00783eae7cd9f1"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win32.whl", hash = "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-win32.whl", hash = "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:056470c3dc57904bbf63d6f534988bafc4e970ffd50f6271fc4ee7daad9498a5"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aa0e31fa4bb82578f3a6c74a73c273367727de397a7a0f07bd83cbea696baa"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8de718c0e1c4b982a54b41779667242bc630b2197948405b7bd8ce16bcecac92"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5c370b1e4975df846b0277b4deba86419ca77dbc25047f535b0bb03d1a544d44"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ffe8ed017e4ed70f68b7b371d84b7d4a790368db9203dfc2d222febd3a9c8863"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8aecc5e80c63f7459a1a2ab2c64df952051df196294d9f739933a9f6687e86b3"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:7a813c8bdbaaaab1f078014b9b0b13f5de757e2b5d9be6403639b298a04d218b"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00924255d7fc916ef66e4bf22f354a940c67179ad3fd7067d7a0a9c84d2fbfc"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7559bce4b505762d737172556a4e6ea8a9998ecac1e39b5233465093e8cee697"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8b58f0a96e7a1e341fc894f62c1177a7c83febebb5ff9123b579418fdc8a481"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b269105e59ac96aba877c1707c600ae55711d9dcd3fc4b5012e4af68e30c648"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:79625966e176dc97ddabc142351e0409e28acf4660b88d1cf6adb876d20c490d"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8aabf1c1a04584c168984ac678a668094d831f152859d06e055288fa515e4d30"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:19721ac03892001ee8fdd11507e6a2e01f4e37014def96379411ca99d78aeb2c"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7f5d859928e635fa3ce3477704acee0f667b3a3d3e4bb109f2b18d4005f38287"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-win32.whl", hash = "sha256:3216ccf953b3f267691c90c6fe742e45d890d8272326b4a8b20850a03d05b7b8"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:30e34c4e97964805f715206c7b789d54a78b70f3ff19fbe590104b71c45600e5"}, ] [[package]] @@ -1175,13 +1185,13 @@ files = [ [[package]] name = "pyee" -version = "11.1.0" +version = "12.0.0" description = "A rough port of Node.js's EventEmitter to Python with a few tricks of its own" optional = false python-versions = ">=3.8" files = [ - {file = "pyee-11.1.0-py3-none-any.whl", hash = "sha256:5d346a7d0f861a4b2e6c47960295bd895f816725b27d656181947346be98d7c1"}, - {file = "pyee-11.1.0.tar.gz", hash = "sha256:b53af98f6990c810edd9b56b87791021a8f54fd13db4edd1142438d44ba2263f"}, + {file = "pyee-12.0.0-py3-none-any.whl", hash = "sha256:7b14b74320600049ccc7d0e0b1becd3b4bd0a03c745758225e31a59f4095c990"}, + {file = "pyee-12.0.0.tar.gz", hash = "sha256:c480603f4aa2927d4766eb41fa82793fe60a82cbfdb8d688e0d08c55a534e145"}, ] [package.dependencies] @@ -1243,11 +1253,9 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] @@ -1272,13 +1280,13 @@ test = ["black (>=22.1.0)", "flake8 (>=4.0.1)", "pre-commit (>=2.17.0)", "pytest [[package]] name = "pytest-django" -version = "4.8.0" +version = "4.9.0" description = "A Django plugin for pytest." optional = false python-versions = ">=3.8" files = [ - {file = "pytest-django-4.8.0.tar.gz", hash = "sha256:5d054fe011c56f3b10f978f41a8efb2e5adfc7e680ef36fb571ada1f24779d90"}, - {file = "pytest_django-4.8.0-py3-none-any.whl", hash = "sha256:ca1ddd1e0e4c227cf9e3e40a6afc6d106b3e70868fd2ac5798a22501271cd0c7"}, + {file = "pytest_django-4.9.0-py3-none-any.whl", hash = "sha256:1d83692cb39188682dbb419ff0393867e9904094a549a7d38a3154d5731b2b99"}, + {file = "pytest_django-4.9.0.tar.gz", hash = "sha256:8bf7bc358c9ae6f6fc51b6cebb190fe20212196e6807121f11bd6a3b03428314"}, ] [package.dependencies] @@ -1379,13 +1387,13 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "s3transfer" -version = "0.10.2" +version = "0.10.3" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" files = [ - {file = "s3transfer-0.10.2-py3-none-any.whl", hash = "sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69"}, - {file = "s3transfer-0.10.2.tar.gz", hash = "sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6"}, + {file = "s3transfer-0.10.3-py3-none-any.whl", hash = "sha256:263ed587a5803c6c708d3ce44dc4dfedaab4c1a32e8329bab818933d79ddcf5d"}, + {file = "s3transfer-0.10.3.tar.gz", hash = "sha256:4f50ed74ab84d474ce614475e0b8d5047ff080810aac5d01ea25231cfc944b0c"}, ] [package.dependencies] @@ -1396,13 +1404,13 @@ crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] [[package]] name = "sentry-sdk" -version = "2.8.0" +version = "2.17.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" files = [ - {file = "sentry_sdk-2.8.0-py2.py3-none-any.whl", hash = "sha256:6051562d2cfa8087bb8b4b8b79dc44690f8a054762a29c07e22588b1f619bfb5"}, - {file = "sentry_sdk-2.8.0.tar.gz", hash = "sha256:aa4314f877d9cd9add5a0c9ba18e3f27f99f7de835ce36bd150e48a41c7c646f"}, + {file = "sentry_sdk-2.17.0-py2.py3-none-any.whl", hash = "sha256:625955884b862cc58748920f9e21efdfb8e0d4f98cca4ab0d3918576d5b606ad"}, + {file = "sentry_sdk-2.17.0.tar.gz", hash = "sha256:dd0a05352b78ffeacced73a94e86f38b32e2eae15fff5f30ca5abb568a72eacf"}, ] [package.dependencies] @@ -1425,14 +1433,16 @@ falcon = ["falcon (>=1.4)"] fastapi = ["fastapi (>=0.79.0)"] flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] +http2 = ["httpcore[http2] (==1.*)"] httpx = ["httpx (>=0.16.0)"] huey = ["huey (>=2)"] huggingface-hub = ["huggingface-hub (>=0.22)"] langchain = ["langchain (>=0.0.210)"] +litestar = ["litestar (>=2.0.0)"] loguru = ["loguru (>=0.5)"] openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] opentelemetry = ["opentelemetry-distro (>=0.35b0)"] -opentelemetry-experimental = ["opentelemetry-instrumentation-aio-pika (==0.46b0)", "opentelemetry-instrumentation-aiohttp-client (==0.46b0)", "opentelemetry-instrumentation-aiopg (==0.46b0)", "opentelemetry-instrumentation-asgi (==0.46b0)", "opentelemetry-instrumentation-asyncio (==0.46b0)", "opentelemetry-instrumentation-asyncpg (==0.46b0)", "opentelemetry-instrumentation-aws-lambda (==0.46b0)", "opentelemetry-instrumentation-boto (==0.46b0)", "opentelemetry-instrumentation-boto3sqs (==0.46b0)", "opentelemetry-instrumentation-botocore (==0.46b0)", "opentelemetry-instrumentation-cassandra (==0.46b0)", "opentelemetry-instrumentation-celery (==0.46b0)", "opentelemetry-instrumentation-confluent-kafka (==0.46b0)", "opentelemetry-instrumentation-dbapi (==0.46b0)", "opentelemetry-instrumentation-django (==0.46b0)", "opentelemetry-instrumentation-elasticsearch (==0.46b0)", "opentelemetry-instrumentation-falcon (==0.46b0)", "opentelemetry-instrumentation-fastapi (==0.46b0)", "opentelemetry-instrumentation-flask (==0.46b0)", "opentelemetry-instrumentation-grpc (==0.46b0)", "opentelemetry-instrumentation-httpx (==0.46b0)", "opentelemetry-instrumentation-jinja2 (==0.46b0)", "opentelemetry-instrumentation-kafka-python (==0.46b0)", "opentelemetry-instrumentation-logging (==0.46b0)", "opentelemetry-instrumentation-mysql (==0.46b0)", "opentelemetry-instrumentation-mysqlclient (==0.46b0)", "opentelemetry-instrumentation-pika (==0.46b0)", "opentelemetry-instrumentation-psycopg (==0.46b0)", "opentelemetry-instrumentation-psycopg2 (==0.46b0)", "opentelemetry-instrumentation-pymemcache (==0.46b0)", "opentelemetry-instrumentation-pymongo (==0.46b0)", "opentelemetry-instrumentation-pymysql (==0.46b0)", "opentelemetry-instrumentation-pyramid (==0.46b0)", "opentelemetry-instrumentation-redis (==0.46b0)", "opentelemetry-instrumentation-remoulade (==0.46b0)", "opentelemetry-instrumentation-requests (==0.46b0)", "opentelemetry-instrumentation-sklearn (==0.46b0)", "opentelemetry-instrumentation-sqlalchemy (==0.46b0)", "opentelemetry-instrumentation-sqlite3 (==0.46b0)", "opentelemetry-instrumentation-starlette (==0.46b0)", "opentelemetry-instrumentation-system-metrics (==0.46b0)", "opentelemetry-instrumentation-threading (==0.46b0)", "opentelemetry-instrumentation-tornado (==0.46b0)", "opentelemetry-instrumentation-tortoiseorm (==0.46b0)", "opentelemetry-instrumentation-urllib (==0.46b0)", "opentelemetry-instrumentation-urllib3 (==0.46b0)", "opentelemetry-instrumentation-wsgi (==0.46b0)"] +opentelemetry-experimental = ["opentelemetry-distro"] pure-eval = ["asttokens", "executing", "pure-eval"] pymongo = ["pymongo (>=3.1)"] pyspark = ["pyspark (>=2.4.4)"] @@ -1446,35 +1456,23 @@ tornado = ["tornado (>=6)"] [[package]] name = "setuptools" -version = "70.2.0" +version = "75.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-70.2.0-py3-none-any.whl", hash = "sha256:b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05"}, - {file = "setuptools-70.2.0.tar.gz", hash = "sha256:bd63e505105011b25c3c11f753f7e3b8465ea739efddaccef8f0efac2137bac1"}, -] - -[package.extras] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "sidekick" -version = "0.5.2" -description = "The companion that gives you functional superpowers" -optional = false -python-versions = "*" -files = [ - {file = "sidekick-0.5.2.tar.gz", hash = "sha256:3f1b2c65f2d9cadc4ad06ba57010d7aae0ef3eeff92a94ac3aadb9863b692a6a"}, + {file = "setuptools-75.2.0-py3-none-any.whl", hash = "sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8"}, + {file = "setuptools-75.2.0.tar.gz", hash = "sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec"}, ] -[package.dependencies] -toolz = ">=0.9,<1.0" - [package.extras] -dev = ["flake8 (>=3.7,<4.0)", "invoke (>=1.0)", "manuel (>=1.10,<2.0)", "pytest (>=4.2,<5.0)", "pytest-cov (>=2.6,<3.0)"] -docs = ["sphinx"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] [[package]] name = "six" @@ -1500,83 +1498,83 @@ files = [ [[package]] name = "sphinx" -version = "5.3.0" +version = "8.1.3" description = "Python documentation generator" optional = false -python-versions = ">=3.6" +python-versions = ">=3.10" files = [ - {file = "Sphinx-5.3.0.tar.gz", hash = "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5"}, - {file = "sphinx-5.3.0-py3-none-any.whl", hash = "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d"}, + {file = "sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2"}, + {file = "sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927"}, ] [package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=2.9" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.20" +alabaster = ">=0.7.14" +babel = ">=2.13" +colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} +docutils = ">=0.20,<0.22" imagesize = ">=1.3" -Jinja2 = ">=3.0" -packaging = ">=21.0" -Pygments = ">=2.12" -requests = ">=2.5.0" -snowballstemmer = ">=2.0" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" +Jinja2 = ">=3.1" +packaging = ">=23.0" +Pygments = ">=2.17" +requests = ">=2.30.0" +snowballstemmer = ">=2.2" +sphinxcontrib-applehelp = ">=1.0.7" +sphinxcontrib-devhelp = ">=1.0.6" +sphinxcontrib-htmlhelp = ">=2.0.6" +sphinxcontrib-jsmath = ">=1.0.1" +sphinxcontrib-qthelp = ">=1.0.6" +sphinxcontrib-serializinghtml = ">=1.1.9" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-bugbear", "flake8-comprehensions", "flake8-simplify", "isort", "mypy (>=0.981)", "sphinx-lint", "types-requests", "types-typed-ast"] -test = ["cython", "html5lib", "pytest (>=4.6)", "typed_ast"] +lint = ["flake8 (>=6.0)", "mypy (==1.11.1)", "pyright (==1.1.384)", "pytest (>=6.0)", "ruff (==0.6.9)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-Pillow (==10.2.0.20240822)", "types-Pygments (==2.18.0.20240506)", "types-colorama (==0.4.15.20240311)", "types-defusedxml (==0.7.0.20240218)", "types-docutils (==0.21.0.20241005)", "types-requests (==2.32.0.20240914)", "types-urllib3 (==1.26.25.14)"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.8" +version = "2.0.0" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, - {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, + {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, + {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.6" +version = "2.0.0" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, - {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, + {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, + {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.5" +version = "2.1.0" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, - {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, + {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, + {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] @@ -1596,45 +1594,45 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.7" +version = "2.0.0" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, - {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, + {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, + {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] -test = ["pytest"] +test = ["defusedxml (>=0.7.1)", "pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.10" +version = "2.0.0" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, - {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, + {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, + {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sqlparse" -version = "0.5.0" +version = "0.5.1" description = "A non-validating SQL parser." optional = false python-versions = ">=3.8" files = [ - {file = "sqlparse-0.5.0-py3-none-any.whl", hash = "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663"}, - {file = "sqlparse-0.5.0.tar.gz", hash = "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93"}, + {file = "sqlparse-0.5.1-py3-none-any.whl", hash = "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4"}, + {file = "sqlparse-0.5.1.tar.gz", hash = "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e"}, ] [package.extras] @@ -1652,28 +1650,6 @@ files = [ {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, ] -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "toolz" -version = "0.12.1" -description = "List processing tools and functional utilities" -optional = false -python-versions = ">=3.7" -files = [ - {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, - {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, -] - [[package]] name = "typing-extensions" version = "4.12.2" @@ -1687,24 +1663,24 @@ files = [ [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -1733,58 +1709,59 @@ test = ["zope.testrunner"] [[package]] name = "zope-interface" -version = "6.4.post2" +version = "7.1.1" description = "Interfaces for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "zope.interface-6.4.post2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2eccd5bef45883802848f821d940367c1d0ad588de71e5cabe3813175444202c"}, - {file = "zope.interface-6.4.post2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:762e616199f6319bb98e7f4f27d254c84c5fb1c25c908c2a9d0f92b92fb27530"}, - {file = "zope.interface-6.4.post2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef8356f16b1a83609f7a992a6e33d792bb5eff2370712c9eaae0d02e1924341"}, - {file = "zope.interface-6.4.post2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e4fa5d34d7973e6b0efa46fe4405090f3b406f64b6290facbb19dcbf642ad6b"}, - {file = "zope.interface-6.4.post2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d22fce0b0f5715cdac082e35a9e735a1752dc8585f005d045abb1a7c20e197f9"}, - {file = "zope.interface-6.4.post2-cp310-cp310-win_amd64.whl", hash = "sha256:97e615eab34bd8477c3f34197a17ce08c648d38467489359cb9eb7394f1083f7"}, - {file = "zope.interface-6.4.post2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:599f3b07bde2627e163ce484d5497a54a0a8437779362395c6b25e68c6590ede"}, - {file = "zope.interface-6.4.post2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:136cacdde1a2c5e5bc3d0b2a1beed733f97e2dad8c2ad3c2e17116f6590a3827"}, - {file = "zope.interface-6.4.post2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47937cf2e7ed4e0e37f7851c76edeb8543ec9b0eae149b36ecd26176ff1ca874"}, - {file = "zope.interface-6.4.post2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f0a6be264afb094975b5ef55c911379d6989caa87c4e558814ec4f5125cfa2e"}, - {file = "zope.interface-6.4.post2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47654177e675bafdf4e4738ce58cdc5c6d6ee2157ac0a78a3fa460942b9d64a8"}, - {file = "zope.interface-6.4.post2-cp311-cp311-win_amd64.whl", hash = "sha256:e2fb8e8158306567a3a9a41670c1ff99d0567d7fc96fa93b7abf8b519a46b250"}, - {file = "zope.interface-6.4.post2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b912750b13d76af8aac45ddf4679535def304b2a48a07989ec736508d0bbfbde"}, - {file = "zope.interface-6.4.post2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ac46298e0143d91e4644a27a769d1388d5d89e82ee0cf37bf2b0b001b9712a4"}, - {file = "zope.interface-6.4.post2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86a94af4a88110ed4bb8961f5ac72edf782958e665d5bfceaab6bf388420a78b"}, - {file = "zope.interface-6.4.post2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73f9752cf3596771c7726f7eea5b9e634ad47c6d863043589a1c3bb31325c7eb"}, - {file = "zope.interface-6.4.post2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00b5c3e9744dcdc9e84c24ed6646d5cf0cf66551347b310b3ffd70f056535854"}, - {file = "zope.interface-6.4.post2-cp312-cp312-win_amd64.whl", hash = "sha256:551db2fe892fcbefb38f6f81ffa62de11090c8119fd4e66a60f3adff70751ec7"}, - {file = "zope.interface-6.4.post2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96ac6b3169940a8cd57b4f2b8edcad8f5213b60efcd197d59fbe52f0accd66e"}, - {file = "zope.interface-6.4.post2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cebff2fe5dc82cb22122e4e1225e00a4a506b1a16fafa911142ee124febf2c9e"}, - {file = "zope.interface-6.4.post2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33ee982237cffaf946db365c3a6ebaa37855d8e3ca5800f6f48890209c1cfefc"}, - {file = "zope.interface-6.4.post2-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:fbf649bc77510ef2521cf797700b96167bb77838c40780da7ea3edd8b78044d1"}, - {file = "zope.interface-6.4.post2-cp37-cp37m-win_amd64.whl", hash = "sha256:4c0b208a5d6c81434bdfa0f06d9b667e5de15af84d8cae5723c3a33ba6611b82"}, - {file = "zope.interface-6.4.post2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d3fe667935e9562407c2511570dca14604a654988a13d8725667e95161d92e9b"}, - {file = "zope.interface-6.4.post2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a96e6d4074db29b152222c34d7eec2e2db2f92638d2b2b2c704f9e8db3ae0edc"}, - {file = "zope.interface-6.4.post2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:866a0f583be79f0def667a5d2c60b7b4cc68f0c0a470f227e1122691b443c934"}, - {file = "zope.interface-6.4.post2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fe919027f29b12f7a2562ba0daf3e045cb388f844e022552a5674fcdf5d21f1"}, - {file = "zope.interface-6.4.post2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e0343a6e06d94f6b6ac52fbc75269b41dd3c57066541a6c76517f69fe67cb43"}, - {file = "zope.interface-6.4.post2-cp38-cp38-win_amd64.whl", hash = "sha256:dabb70a6e3d9c22df50e08dc55b14ca2a99da95a2d941954255ac76fd6982bc5"}, - {file = "zope.interface-6.4.post2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:706efc19f9679a1b425d6fa2b4bc770d976d0984335eaea0869bd32f627591d2"}, - {file = "zope.interface-6.4.post2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d136e5b8821073e1a09dde3eb076ea9988e7010c54ffe4d39701adf0c303438"}, - {file = "zope.interface-6.4.post2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1730c93a38b5a18d24549bc81613223962a19d457cfda9bdc66e542f475a36f4"}, - {file = "zope.interface-6.4.post2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc2676312cc3468a25aac001ec727168994ea3b69b48914944a44c6a0b251e79"}, - {file = "zope.interface-6.4.post2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a62fd6cd518693568e23e02f41816adedfca637f26716837681c90b36af3671"}, - {file = "zope.interface-6.4.post2-cp39-cp39-win_amd64.whl", hash = "sha256:d3f7e001328bd6466b3414215f66dde3c7c13d8025a9c160a75d7b2687090d15"}, - {file = "zope.interface-6.4.post2.tar.gz", hash = "sha256:1c207e6f6dfd5749a26f5a5fd966602d6b824ec00d2df84a7e9a924e8933654e"}, + {file = "zope.interface-7.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6650bd56ef350d37c8baccfd3ee8a0483ed6f8666e641e4b9ae1a1827b79f9e5"}, + {file = "zope.interface-7.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84e87eba6b77a3af187bae82d8de1a7c208c2a04ec9f6bd444fd091b811ad92e"}, + {file = "zope.interface-7.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c4e1b4c06d9abd1037c088dae1566c85f344a3e6ae4350744c3f7f7259d9c67"}, + {file = "zope.interface-7.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cd5e3d910ac87652a09f6e5db8e41bc3b49cf08ddd2d73d30afc644801492cd"}, + {file = "zope.interface-7.1.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca95594d936ee349620900be5b46c0122a1ff6ce42d7d5cb2cf09dc84071ef16"}, + {file = "zope.interface-7.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:ad339509dcfbbc99bf8e147db6686249c4032f26586699ec4c82f6e5909c9fe2"}, + {file = "zope.interface-7.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e59f175e868f856a77c0a77ba001385c377df2104fdbda6b9f99456a01e102a"}, + {file = "zope.interface-7.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0de23bcb93401994ea00bc5c677ef06d420340ac0a4e9c10d80e047b9ce5af3f"}, + {file = "zope.interface-7.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdb7e7e5524b76d3ec037c1d81a9e2c7457b240fd4cb0a2476b65c3a5a6c81f"}, + {file = "zope.interface-7.1.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3603ef82a9920bd0bfb505423cb7e937498ad971ad5a6141841e8f76d2fd5446"}, + {file = "zope.interface-7.1.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1d52d052355e0c5c89e0630dd2ff7c0b823fd5f56286a663e92444761b35e25"}, + {file = "zope.interface-7.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:179ad46ece518c9084cb272e4a69d266b659f7f8f48e51706746c2d8a426433e"}, + {file = "zope.interface-7.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e6503534b52bb1720ace9366ee30838a58a3413d3e197512f3338c8f34b5d89d"}, + {file = "zope.interface-7.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f85b290e5b8b11814efb0d004d8ce6c9a483c35c462e8d9bf84abb93e79fa770"}, + {file = "zope.interface-7.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d029fac6a80edae80f79c37e5e3abfa92968fe921886139b3ee470a1b177321a"}, + {file = "zope.interface-7.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5836b8fb044c6e75ba34dfaabc602493019eadfa0faf6ff25f4c4c356a71a853"}, + {file = "zope.interface-7.1.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7395f13533318f150ee72adb55b29284b16e73b6d5f02ab21f173b3e83f242b8"}, + {file = "zope.interface-7.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:1d0e23c6b746eb8ce04573cc47bcac60961ac138885d207bd6f57e27a1431ae8"}, + {file = "zope.interface-7.1.1-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:9fad9bd5502221ab179f13ea251cb30eef7cf65023156967f86673aff54b53a0"}, + {file = "zope.interface-7.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:55c373becbd36a44d0c9be1d5271422fdaa8562d158fb44b4192297b3c67096c"}, + {file = "zope.interface-7.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed1df8cc01dd1e3970666a7370b8bfc7457371c58ba88c57bd5bca17ab198053"}, + {file = "zope.interface-7.1.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99c14f0727c978639139e6cad7a60e82b7720922678d75aacb90cf4ef74a068c"}, + {file = "zope.interface-7.1.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b1eed7670d564f1025d7cda89f99f216c30210e42e95de466135be0b4a499d9"}, + {file = "zope.interface-7.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:3defc925c4b22ac1272d544a49c6ba04c3eefcce3200319ee1be03d9270306dd"}, + {file = "zope.interface-7.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8d0fe45be57b5219aa4b96e846631c04615d5ef068146de5a02ccd15c185321f"}, + {file = "zope.interface-7.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bcbeb44fc16e0078b3b68a95e43f821ae34dcbf976dde6985141838a5f23dd3d"}, + {file = "zope.interface-7.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8e7b05dc6315a193cceaec071cc3cf1c180cea28808ccded0b1283f1c38ba73"}, + {file = "zope.interface-7.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d553e02b68c0ea5a226855f02edbc9eefd99f6a8886fa9f9bdf999d77f46585"}, + {file = "zope.interface-7.1.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81744a7e61b598ebcf4722ac56a7a4f50502432b5b4dc7eb29075a89cf82d029"}, + {file = "zope.interface-7.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7720322763aceb5e0a7cadcc38c67b839efe599f0887cbf6c003c55b1458c501"}, + {file = "zope.interface-7.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ed0852c25950cf430067f058f8d98df6288502ac313861d9803fe7691a9b3"}, + {file = "zope.interface-7.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9595e478047ce752b35cfa221d7601a5283ccdaab40422e0dc1d4a334c70f580"}, + {file = "zope.interface-7.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2317e1d4dba68203a5227ea3057f9078ec9376275f9700086b8f0ffc0b358e1b"}, + {file = "zope.interface-7.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6821ef9870f32154da873fcde439274f99814ea452dd16b99fa0b66345c4b6b"}, + {file = "zope.interface-7.1.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:190eeec67e023d5aac54d183fa145db0b898664234234ac54643a441da434616"}, + {file = "zope.interface-7.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:d17e7fc814eaab93409b80819fd6d30342844345c27f3bc3c4b43c2425a8d267"}, + {file = "zope.interface-7.1.1.tar.gz", hash = "sha256:4284d664ef0ff7b709836d4de7b13d80873dc5faeffc073abdb280058bfac5e3"}, ] [package.dependencies] setuptools = "*" [package.extras] -docs = ["Sphinx", "repoze.sphinx.autointerface", "sphinx-rtd-theme"] -test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] -testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] +docs = ["Sphinx", "furo", "repoze.sphinx.autointerface"] +test = ["coverage[toml]", "zope.event", "zope.testing"] +testing = ["coverage[toml]", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" -python-versions = "^3.10" -content-hash = "60c6e07d88b94c82104adb6645029b46c461f8c20b41d7f3332c1fd422ed0aca" +python-versions = "^3.13" +content-hash = "ded2739ebdae9deb42ce1318d41f22f4e3f6064c3eb0ecb8690c926d7b4b62f2" diff --git a/pyproject.toml b/pyproject.toml index 3239c9fa..73acaf9f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,25 +1,21 @@ [tool.poetry] -name="Jandig" -version="1.5.0" -description="AR Platform" -authors=["Check Github"] +package-mode = false [tool.poetry.dependencies] -python = "^3.10" +python = "^3.13" MarkupSafe = "^2.1.1" -Django = "^4.2.16" +Django = "^5.1.2" Jinja2 = "^3.1.2" gunicorn = "^20.1.0" -Pillow = "^9.2.0" +Pillow = "^11.0.0" django-cors-headers = "^3.13.0" -invoke = "^1.7.1" +invoke = "^2.2.0" django-environ = "^0.9.0" psycopg2-binary = "^2.9.3" -django-boogie = "^0.13.3" -Sphinx = "^5.0.2" +Sphinx = "^8.1.3" Babel = "^2.10.3" -django-debug-toolbar = "^3.5.0" -gevent = "^23.9.1" +django-debug-toolbar = "^4.4.6" +gevent = "^24.10.3" pymarker = "^0.3.1" django-extensions = "^3.1.5" factory-boy = "^3.2.1" From 3cf7e5842107981f54804a05d322ddaeda9e1679 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sat, 26 Oct 2024 20:20:25 +0100 Subject: [PATCH 24/79] Update storage config to comply with django 5.1 --- .envs/.example | 1 - docker-compose.ci.yml | 1 - docker-compose.yml | 3 ++- src/config/settings.py | 34 +++++++++++++--------------------- 4 files changed, 15 insertions(+), 24 deletions(-) diff --git a/.envs/.example b/.envs/.example index d06940a6..8bf30dd7 100644 --- a/.envs/.example +++ b/.envs/.example @@ -19,7 +19,6 @@ AWS_SECRET_ACCESS_KEY=minio123 MINIO_ROOT_USER=minio MINIO_ROOT_PASSWORD=minio123 AWS_STORAGE_BUCKET_NAME=jandig-cdn -AWS_PRIVATE_STORAGE_BUCKET_NAME=jandig-private-cdn AWS_S3_REGION_NAME=us-east-2 AWS_STATIC_LOCATION=static MINIO_S3_ENDPOINT_URL=http://storage:9000 diff --git a/docker-compose.ci.yml b/docker-compose.ci.yml index 683b5f72..34c98c30 100644 --- a/docker-compose.ci.yml +++ b/docker-compose.ci.yml @@ -52,7 +52,6 @@ services: until (/usr/bin/mc config host add myminio $${MINIO_S3_ENDPOINT_URL} $${MINIO_ROOT_USER} $${MINIO_ROOT_PASSWORD}) do echo '...waiting...' && sleep 1; done; /usr/bin/mc mb myminio/$${AWS_STORAGE_BUCKET_NAME}; /usr/bin/mc policy set download myminio/$${AWS_STORAGE_BUCKET_NAME}; - /usr/bin/mc mb myminio/$${AWS_PRIVATE_STORAGE_BUCKET_NAME}; /usr/bin/mc admin user add myminio $${MINIO_USER_ACCESS_KEY} $${MINIO_USER_SECRET_KEY}; /usr/bin/mc admin policy set myminio readwrite user=$${MINIO_USER_ACCESS_KEY}; exit 0; diff --git a/docker-compose.yml b/docker-compose.yml index 4ae2d8cf..3c5d409c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,6 +12,8 @@ services: - ./locale/:/jandig/locale/ - ./run.sh:/jandig/run.sh - ./tasks.py:/jandig/tasks.py + - ./poetry.lock:/poetry.lock + - ./pyproject.toml:/pyproject.toml env_file: - .envs/.example depends_on: @@ -65,7 +67,6 @@ services: until (/usr/bin/mc config host add myminio $${MINIO_S3_ENDPOINT_URL} $${MINIO_ROOT_USER} $${MINIO_ROOT_PASSWORD}) do echo '...waiting...' && sleep 1; done; /usr/bin/mc mb myminio/$${AWS_STORAGE_BUCKET_NAME}; /usr/bin/mc policy set download myminio/$${AWS_STORAGE_BUCKET_NAME}; - /usr/bin/mc mb myminio/$${AWS_PRIVATE_STORAGE_BUCKET_NAME}; /usr/bin/mc admin user add myminio $${MINIO_USER_ACCESS_KEY} $${MINIO_USER_SECRET_KEY}; /usr/bin/mc admin policy set myminio readwrite user=$${MINIO_USER_ACCESS_KEY}; exit 0; diff --git a/src/config/settings.py b/src/config/settings.py index 9cef592a..b8875fe0 100644 --- a/src/config/settings.py +++ b/src/config/settings.py @@ -21,7 +21,7 @@ DEBUG = env.bool("DJANGO_DEBUG", False) -CSRF_TRUSTED_ORIGINS = ['https://*.jandig.app'] +CSRF_TRUSTED_ORIGINS = ["https://*.jandig.app"] # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = env("DJANGO_SECRET_KEY", default="change_me") @@ -44,6 +44,7 @@ DJANGO_ADMIN_URL = env("DJANGO_ADMIN_URL", default="admin/") SENTRY_ENVIRONMENT = env("SENTRY_ENVIRONMENT", default="") + def traces_sampler(sampling_context): url = sampling_context["wsgi_environ"]["PATH_INFO"] is_health_check = url == f"/{HEALTH_CHECK_URL}" @@ -73,7 +74,7 @@ def traces_sampler(sampling_context): "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", - 'django_extensions', + "django_extensions", "debug_toolbar", "django_htmx", "corsheaders", @@ -166,12 +167,7 @@ def debug(request): DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" -# Internationalization -# https://docs.djangoproject.com/en/2.1/topics/i18n/ - -LOCALE_PATHS = ( - os.path.join(str(ROOT_DIR), 'locale'), -) +LOCALE_PATHS = (os.path.join(str(ROOT_DIR), "locale"),) LANGUAGE_CODE = "en" @@ -218,21 +214,17 @@ def debug(request): os.path.join(BASE_DIR, "blog", "static"), ] -# STATIC_ROOT = "/jandig/static" -STATICFILES_STORAGE = "config.storage_backends.StaticStorage" - -# MEDIA_ROOT = os.path.join(BASE_DIR, "users", "media") - AWS_PUBLIC_MEDIA_LOCATION = "media/public" -DEFAULT_FILE_STORAGE = "config.storage_backends.PublicMediaStorage" - -AWS_PRIVATE_MEDIA_LOCATION = "media/private" -PRIVATE_FILE_STORAGE = "config.storage_backends.PrivateMediaStorage" - -AWS_PRIVATE_MEDIA_DIFFERENT_BUCKET_LOCATION = "media/private" -AWS_PRIVATE_STORAGE_BUCKET_NAME = os.getenv("AWS_PRIVATE_STORAGE_BUCKET_NAME", "") -PRIVATE_FILE_DIFFERENT_BUCKET_STORAGE = "config.storage_backends.PrivateMediaStorage" +# Storages +STORAGES = { + "default": { + "BACKEND": "config.storage_backends.PublicMediaStorage", + }, + "staticfiles": { + "BACKEND": "config.storage_backends.StaticStorage", + }, +} # LOGIN / LOGOUT LOGIN_URL = "login" LOGIN_REDIRECT_URL = "home" From 5579ebe05eb2b98ac56884f9d8eabd663a354ae7 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sat, 26 Oct 2024 20:24:13 +0100 Subject: [PATCH 25/79] Remove django boogie router from exhibit --- src/config/urls.py | 1 - src/core/routes.py | 15 --------------- src/core/urls.py | 9 +++++---- src/core/views/views.py | 16 +++++++++++----- 4 files changed, 16 insertions(+), 25 deletions(-) delete mode 100644 src/core/routes.py diff --git a/src/config/urls.py b/src/config/urls.py index 67ee1129..be8c0dba 100644 --- a/src/config/urls.py +++ b/src/config/urls.py @@ -10,7 +10,6 @@ path("memories/", include("blog.urls")), re_path("^docs/(?P.*)$", serve, {"document_root": settings.DOCS_ROOT}), path("", include("core.urls")), - path("", include("core.routes")), ] urlpatterns += [ diff --git a/src/core/routes.py b/src/core/routes.py deleted file mode 100644 index 1b99d0aa..00000000 --- a/src/core/routes.py +++ /dev/null @@ -1,15 +0,0 @@ -from boogie.router import Router - -from .models import Exhibit - -urlpatterns = Router( - template="core/exhibit.jinja2", - models={"exhibit": Exhibit}, - lookup_field={"exhibit": "slug"}, -) - - -@urlpatterns.route("/") -def exhibit(request, exhibit): - ctx = {"exhibit": exhibit, "artworks": exhibit.artworks.all()} - return ctx diff --git a/src/core/urls.py b/src/core/urls.py index eb4cc5f7..f0546ccc 100644 --- a/src/core/urls.py +++ b/src/core/urls.py @@ -1,7 +1,3 @@ -from django.conf import settings -from django.urls import include, path -from rest_framework_nested.routers import DefaultRouter - from core.views.artworks import ArtworkViewset from core.views.exhibits import ExhibitViewset from core.views.markers import MarkerViewset @@ -16,6 +12,7 @@ from core.views.views import ( artwork_preview, collection, + exhibit, exhibit_detail, exhibit_select, manifest, @@ -24,6 +21,9 @@ service_worker, upload_image, ) +from django.conf import settings +from django.urls import include, path +from rest_framework_nested.routers import DefaultRouter api_router = DefaultRouter() api_router.register("markers", MarkerViewset, basename="marker") @@ -48,4 +48,5 @@ path("see_all/", see_all, name="see_all"), path("robots.txt/", robots_txt), path(settings.HEALTH_CHECK_URL, health_check), + path("/", exhibit, name="exhibit"), ] diff --git a/src/core/views/views.py b/src/core/views/views.py index 8e38659d..289e8fa0 100644 --- a/src/core/views/views.py +++ b/src/core/views/views.py @@ -1,14 +1,13 @@ +from core.forms import ExhibitForm, UploadFileForm +from core.helpers import handle_upload_image +from core.models import Artwork, Exhibit, Marker, Object from django.core.paginator import Paginator from django.http import HttpResponse, HttpResponseRedirect -from django.shortcuts import redirect, render +from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.views.decorators.cache import cache_page from django.views.decorators.http import require_http_methods -from core.forms import ExhibitForm, UploadFileForm -from core.helpers import handle_upload_image -from core.models import Artwork, Exhibit, Marker, Object - @cache_page(60 * 60) @require_http_methods(["GET"]) @@ -131,3 +130,10 @@ def robots_txt(request): "Disallow: ", ] return HttpResponse("\n".join(lines), content_type="text/plain") + + +@require_http_methods(["GET"]) +def exhibit(request, slug): + exhibit = get_object_or_404(Exhibit.objects.prefetch_related("artworks"), slug=slug) + ctx = {"exhibit": exhibit, "artworks": exhibit.artworks.all()} + return render(request, "core/exhibit.jinja2", ctx) From 79c5a24ee43c78323622ab28a769583fa117b8d2 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sat, 26 Oct 2024 20:28:59 +0100 Subject: [PATCH 26/79] Add route for favicon to include pages that miss the location --- src/core/urls.py | 6 ++++-- src/core/views/static_views.py | 18 +++++++++++++++--- src/core/views/views.py | 9 --------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/core/urls.py b/src/core/urls.py index f0546ccc..ec5d16de 100644 --- a/src/core/urls.py +++ b/src/core/urls.py @@ -5,9 +5,11 @@ from core.views.static_views import ( community, documentation, + favicon, health_check, home, marker_generator, + robots_txt, ) from core.views.views import ( artwork_preview, @@ -16,7 +18,6 @@ exhibit_detail, exhibit_select, manifest, - robots_txt, see_all, service_worker, upload_image, @@ -46,7 +47,8 @@ path("upload", upload_image, name="upload-image"), path("i18n/", include("django.conf.urls.i18n")), path("see_all/", see_all, name="see_all"), - path("robots.txt/", robots_txt), + path("robots.txt", robots_txt), + path("favicon.ico", favicon), path(settings.HEALTH_CHECK_URL, health_check), path("/", exhibit, name="exhibit"), ] diff --git a/src/core/views/static_views.py b/src/core/views/static_views.py index e1bc971d..c7016f94 100644 --- a/src/core/views/static_views.py +++ b/src/core/views/static_views.py @@ -1,6 +1,6 @@ -from django.http import JsonResponse -from django.shortcuts import render - +from django.http import JsonResponse, HttpResponse +from django.shortcuts import redirect, render +from django.templatetags.static import static def home(request): return render(request, "users/profile.jinja2", {}) @@ -24,3 +24,15 @@ def marker_generator(request): def health_check(request): return JsonResponse({"status": "ok"}, status=200) + + +def favicon(request): + return redirect(static("images/icons/favicon.ico")) + + +def robots_txt(request): + lines = [ + "User-Agent: *", + "Disallow: ", + ] + return HttpResponse("\n".join(lines), content_type="text/plain") \ No newline at end of file diff --git a/src/core/views/views.py b/src/core/views/views.py index 289e8fa0..66eb3cab 100644 --- a/src/core/views/views.py +++ b/src/core/views/views.py @@ -123,15 +123,6 @@ def artwork_preview(request): return render(request, "core/exhibit.jinja2", ctx) -@require_http_methods(["GET"]) -def robots_txt(request): - lines = [ - "User-Agent: *", - "Disallow: ", - ] - return HttpResponse("\n".join(lines), content_type="text/plain") - - @require_http_methods(["GET"]) def exhibit(request, slug): exhibit = get_object_or_404(Exhibit.objects.prefetch_related("artworks"), slug=slug) From 6314083be801d2041c521ea8367fea742e936d8c Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sat, 26 Oct 2024 20:29:56 +0100 Subject: [PATCH 27/79] Fix Black and iSort --- docs/conf.py | 42 +++++++-------- etc/scripts/compilemessages.py | 30 +++++------ src/core/admin.py | 3 +- src/core/models.py | 42 ++++++--------- src/core/serializers/artworks.py | 3 +- src/core/serializers/exhibits.py | 3 +- src/core/serializers/markers.py | 3 +- src/core/serializers/objects.py | 3 +- src/core/tests/test_artworks_api.py | 11 ++-- src/core/tests/test_exhibits_api.py | 19 ++++--- src/core/tests/test_markers_api.py | 5 +- src/core/tests/test_objects_api.py | 5 +- src/core/views/artworks.py | 5 +- src/core/views/exhibits.py | 5 +- src/core/views/markers.py | 5 +- src/core/views/objects.py | 5 +- src/core/views/static_views.py | 5 +- src/manage.py | 6 ++- src/tests/home_tests.py | 4 +- src/users/admin.py | 79 ++++++++++++++++++++--------- src/users/factory.py | 3 +- src/users/forms.py | 54 +++++++++++++++----- src/users/tests/test_users.py | 13 +++-- src/users/views.py | 23 ++++++--- tasks.py | 50 +++++++++--------- 25 files changed, 248 insertions(+), 178 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 8ade9a1e..b29c95cb 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -17,9 +17,9 @@ # -- Project information ----------------------------------------------------- -project = 'Jandig ARte Help' -copyright = '2019, pablodiegoss, rodrigocam, vjpixel, hvalois' -author = 'pablodiegoss, rodrigocam, vjpixel, hvalois' +project = "Jandig ARte Help" +copyright = "2019, pablodiegoss, rodrigocam, vjpixel, hvalois" +author = "pablodiegoss, rodrigocam, vjpixel, hvalois" # -- General configuration --------------------------------------------------- @@ -27,18 +27,17 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = [ -] +extensions = [] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = 'pt_BR' +language = "pt_BR" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -51,28 +50,29 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'alabaster' +html_theme = "alabaster" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] html_theme_options = { - 'logo': 'logo.png', - 'github_user': 'memeLab', - 'github_repo': 'Jandig', - 'html_sidebars': { - '**': [ - 'search.html', - 'navigation.html', - ] + "logo": "logo.png", + "github_user": "memeLab", + "github_repo": "Jandig", + "html_sidebars": { + "**": [ + "search.html", + "navigation.html", + ] }, - 'extra_nav_links': { - 'Official Site': 'https://jandig.app', - 'Github': 'https://github.com/memelab/Jandig' + "extra_nav_links": { + "Official Site": "https://jandig.app", + "Github": "https://github.com/memelab/Jandig", }, } + def setup(app): - app.add_css_file('reset.css') \ No newline at end of file + app.add_css_file("reset.css") diff --git a/etc/scripts/compilemessages.py b/etc/scripts/compilemessages.py index 2af14779..0521787e 100644 --- a/etc/scripts/compilemessages.py +++ b/etc/scripts/compilemessages.py @@ -2,10 +2,10 @@ import glob import os -from subprocess import Popen, PIPE +from subprocess import PIPE, Popen -program = 'msgfmt' -program_options = ['--check-format', '-f'] +program = "msgfmt" +program_options = ["--check-format", "-f"] def main(): @@ -14,26 +14,26 @@ def main(): django.core.management.commands.compilemessages """ # Walk entire tree, looking for locale directories - basedirs = ['locale'] - for dirpath, dirnames, filenames in os.walk('.', topdown=True): + basedirs = ["locale"] + for dirpath, dirnames, filenames in os.walk(".", topdown=True): for dirname in dirnames: - if dirname == 'locale': + if dirname == "locale": basedirs.append(os.path.join(dirpath, dirname)) basedirs = set(map(os.path.abspath, filter(os.path.isdir, basedirs))) # Build locale list all_locales = [] for basedir in basedirs: - locale_dirs = filter(os.path.isdir, glob.glob(f'{basedir}/*')) + locale_dirs = filter(os.path.isdir, glob.glob(f"{basedir}/*")) all_locales.extend(map(os.path.basename, locale_dirs)) locales = set(all_locales) for basedir in basedirs: - dirs = [os.path.join(basedir, locale, 'LC_MESSAGES') for locale in locales] + dirs = [os.path.join(basedir, locale, "LC_MESSAGES") for locale in locales] locations = [] for ldir in dirs: for dirpath, dirnames, filenames in os.walk(ldir): - locations.extend((dirpath, f) for f in filenames if f.endswith('.po')) + locations.extend((dirpath, f) for f in filenames if f.endswith(".po")) compile_messages(locations) @@ -42,21 +42,21 @@ def compile_messages(locations): Locations is a list of tuples: [(directory, file), ...] """ for _, (dirpath, f) in enumerate(locations): - print(f'processing file {f} in {dirpath}\n') + print(f"processing file {f} in {dirpath}\n") # Program args po_path = os.path.join(dirpath, f) base_path = os.path.splitext(po_path)[0] - extra_args = ['-o', base_path + '.mo', base_path + '.po'] + extra_args = ["-o", base_path + ".mo", base_path + ".po"] args = [program] + program_options + extra_args # Execute command __, errors, status = popen_wrapper(args) if status: if errors: - msg = f'Execution of {program} failed: {errors}' + msg = f"Execution of {program} failed: {errors}" else: - msg = f'Execution of {program} failed' + msg = f"Execution of {program} failed" raise RuntimeError(msg) @@ -68,8 +68,8 @@ def popen_wrapper(args, os_err_exc_type=RuntimeError): with Popen(args, shell=False, stdout=PIPE, stderr=PIPE, close_fds=True) as p: output, errors = p.communicate() return output, errors, p.returncode - raise os_err_exc_type('Error executing') + raise os_err_exc_type("Error executing") -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/src/core/admin.py b/src/core/admin.py index 2211979b..e5af7e08 100644 --- a/src/core/admin.py +++ b/src/core/admin.py @@ -1,6 +1,5 @@ -from django.contrib import admin - from core.models import Artwork, Exhibit, Marker, Object +from django.contrib import admin admin.site.register(Exhibit) admin.site.register(Object) diff --git a/src/core/models.py b/src/core/models.py index 8f301cb3..4197da51 100644 --- a/src/core/models.py +++ b/src/core/models.py @@ -1,24 +1,22 @@ +import logging import re +from config.storage_backends import PublicMediaStorage from django.core.files.base import ContentFile from django.db import models from django.db.models.signals import post_delete from django.dispatch import receiver from PIL import Image from pymarker.core import generate_marker_from_image, generate_patt_from_image - -from config.storage_backends import PublicMediaStorage from users.models import Profile -import logging log = logging.getLogger() + def create_patt(filename, original_filename): filestorage = PublicMediaStorage() with Image.open(filestorage.open(filename)) as image: patt_str = generate_patt_from_image(image) - # string_file = StringIO(patt_str.encode('UTF-8')) - # string_file.name = original_filename patt_file = filestorage.save( "patts/" + original_filename + ".patt", ContentFile(patt_str.encode("utf-8")), @@ -32,12 +30,13 @@ def create_marker(filename, original_filename): marker_image = generate_marker_from_image(image) marker_image.name = original_filename marker_image.__commited = False - # marker = filestorage.save("markers/" + original_filename, marker_image) return marker_image class Marker(models.Model): - owner = models.ForeignKey(Profile, on_delete=models.DO_NOTHING, related_name="markers") + owner = models.ForeignKey( + Profile, on_delete=models.DO_NOTHING, related_name="markers" + ) source = models.ImageField(upload_to="markers/") uploaded_at = models.DateTimeField(auto_now=True) author = models.CharField(max_length=60, blank=False) @@ -45,23 +44,6 @@ class Marker(models.Model): patt = models.FileField(upload_to="patts/") def save(self, *args, **kwargs): - # filestorage = PublicMediaStorage() - # # Image Filename - # original_filename = self.source.name - # filename = filestorage.save(f"original_{original_filename}", self.source) - # # Complete Image URL on storage - # print("aaaaa"*30) - # with Image.open(self.source) as image: - # print(image) - # print("aaaaa"*30) - # # fileurl = filestorage.url(filename) - # print(filename) - # self.source = create_marker(filename, original_filename) - # self.patt = create_patt(filename, original_filename) - print("B" * 30) - print(self.source) - print(self.patt) - print("B" * 30) super().save(*args, **kwargs) def __str__(self): @@ -91,7 +73,9 @@ def in_use(self): class Object(models.Model): - owner = models.ForeignKey(Profile, on_delete=models.DO_NOTHING, related_name="ar_objects") + owner = models.ForeignKey( + Profile, on_delete=models.DO_NOTHING, related_name="ar_objects" + ) source = models.FileField(upload_to="objects/") uploaded_at = models.DateTimeField(auto_now=True) author = models.CharField(max_length=60, blank=False) @@ -209,7 +193,9 @@ def yposition(self): class Artwork(models.Model): - author = models.ForeignKey(Profile, on_delete=models.DO_NOTHING, related_name="artworks") + author = models.ForeignKey( + Profile, on_delete=models.DO_NOTHING, related_name="artworks" + ) marker = models.ForeignKey(Marker, on_delete=models.DO_NOTHING) augmented = models.ForeignKey(Object, on_delete=models.DO_NOTHING) title = models.CharField(max_length=50, blank=False) @@ -239,7 +225,9 @@ def remove_source_file(sender, instance, **kwargs): class Exhibit(models.Model): - owner = models.ForeignKey(Profile, on_delete=models.DO_NOTHING, related_name="exhibits") + owner = models.ForeignKey( + Profile, on_delete=models.DO_NOTHING, related_name="exhibits" + ) name = models.CharField(unique=True, max_length=50) slug = models.CharField(unique=True, max_length=50) artworks = models.ManyToManyField(Artwork, related_name="exhibits") diff --git a/src/core/serializers/artworks.py b/src/core/serializers/artworks.py index 04751a7d..30e3627d 100644 --- a/src/core/serializers/artworks.py +++ b/src/core/serializers/artworks.py @@ -1,6 +1,5 @@ -from rest_framework.serializers import ModelSerializer - from core.models import Artwork +from rest_framework.serializers import ModelSerializer class ArtworkSerializer(ModelSerializer): diff --git a/src/core/serializers/exhibits.py b/src/core/serializers/exhibits.py index 502e7272..5981d01c 100644 --- a/src/core/serializers/exhibits.py +++ b/src/core/serializers/exhibits.py @@ -1,6 +1,5 @@ -from rest_framework.serializers import ModelSerializer - from core.models import Exhibit +from rest_framework.serializers import ModelSerializer class ExhibitSerializer(ModelSerializer): diff --git a/src/core/serializers/markers.py b/src/core/serializers/markers.py index 9b0ac3ae..7dd53f8a 100644 --- a/src/core/serializers/markers.py +++ b/src/core/serializers/markers.py @@ -1,6 +1,5 @@ -from rest_framework.serializers import ModelSerializer - from core.models import Marker +from rest_framework.serializers import ModelSerializer class MarkerSerializer(ModelSerializer): diff --git a/src/core/serializers/objects.py b/src/core/serializers/objects.py index 38f7edd4..0c789f25 100644 --- a/src/core/serializers/objects.py +++ b/src/core/serializers/objects.py @@ -1,6 +1,5 @@ -from rest_framework.serializers import ModelSerializer - from core.models import Object +from rest_framework.serializers import ModelSerializer class ObjectSerializer(ModelSerializer): diff --git a/src/core/tests/test_artworks_api.py b/src/core/tests/test_artworks_api.py index f1df0650..80e42996 100644 --- a/src/core/tests/test_artworks_api.py +++ b/src/core/tests/test_artworks_api.py @@ -1,10 +1,9 @@ """Test using the artwork API for Jandig Artwork""" +from core.models import Artwork, Marker, Object from django.conf import settings from django.core.files.uploadedfile import SimpleUploadedFile from django.test import TestCase - -from core.models import Artwork, Marker, Object from users.models import User fake_file = SimpleUploadedFile("fake_file.png", b"these are the file contents!") @@ -27,7 +26,9 @@ def test_url(self): def test_api_artworks_lists_one_artwork(self): marker = Marker.objects.create(owner=self.profile, source=fake_file) obj = Object.objects.create(owner=self.profile, source=fake_file) - artwork = Artwork.objects.create(author=self.profile, augmented=obj, marker=marker) + artwork = Artwork.objects.create( + author=self.profile, augmented=obj, marker=marker + ) self.assertEqual(artwork.author, self.profile) response = self.client.get("/api/v1/artworks/") self.assertEqual(response.status_code, 200) @@ -44,7 +45,9 @@ def test_api_artwork_lists_multiple_artworks(self): def test_retrieve_artwork(self): marker = Marker.objects.create(owner=self.profile, source=fake_file) obj = Object.objects.create(owner=self.profile, source=fake_file) - artwork = Artwork.objects.create(author=self.profile, augmented=obj, marker=marker) # noqa F841 + artwork = Artwork.objects.create( + author=self.profile, augmented=obj, marker=marker + ) # noqa F841 self.assertEqual(artwork.author, self.profile) response = self.client.get("/api/v1/artworks/1/") diff --git a/src/core/tests/test_exhibits_api.py b/src/core/tests/test_exhibits_api.py index 66365b98..e81e9d38 100644 --- a/src/core/tests/test_exhibits_api.py +++ b/src/core/tests/test_exhibits_api.py @@ -1,10 +1,9 @@ """Test using the exhibit API for Jandig Exhibit""" +from core.models import Artwork, Exhibit, Marker, Object from django.conf import settings from django.core.files.uploadedfile import SimpleUploadedFile from django.test import TestCase - -from core.models import Artwork, Exhibit, Marker, Object from users.models import User fake_file = SimpleUploadedFile("fake_file.png", b"these are the file contents!") @@ -27,7 +26,9 @@ def test_url(self): def test_api_exhibits_lists_one_exhibit(self): marker = Marker.objects.create(owner=self.profile, source=fake_file) obj = Object.objects.create(owner=self.profile, source=fake_file) - artwork = Artwork.objects.create(author=self.profile, augmented=obj, marker=marker) + artwork = Artwork.objects.create( + author=self.profile, augmented=obj, marker=marker + ) exhibit = Exhibit.objects.create(owner=self.profile, name="test") exhibit.artworks.add(artwork) response = self.client.get("/api/v1/artworks/") @@ -37,15 +38,21 @@ def test_api_exhibit_lists_multiple_exhibits(self): for i in range(0, settings.PAGE_SIZE + 1): marker = Marker.objects.create(owner=self.profile, source=fake_file) obj = Object.objects.create(owner=self.profile, source=fake_file) - artwork = Artwork.objects.create(author=self.profile, augmented=obj, marker=marker) # noqa F841 - exhibit = Exhibit.objects.create(owner=self.profile, name=f"name_{i}", slug=f"slug_{i}") # noqa F841 + artwork = Artwork.objects.create( + author=self.profile, augmented=obj, marker=marker + ) # noqa F841 + exhibit = Exhibit.objects.create( + owner=self.profile, name=f"name_{i}", slug=f"slug_{i}" + ) # noqa F841 response = self.client.get("/api/v1/exhibits/") self.assertEqual(response.status_code, 200) def test_retrieve_exhibit(self): marker = Marker.objects.create(owner=self.profile, source=fake_file) obj = Object.objects.create(owner=self.profile, source=fake_file) - artwork = Artwork.objects.create(author=self.profile, augmented=obj, marker=marker) + artwork = Artwork.objects.create( + author=self.profile, augmented=obj, marker=marker + ) exhibit = Exhibit.objects.create(owner=self.profile, name="test") exhibit.artworks.add(artwork) response = self.client.get("/api/v1/exhibits/1/") diff --git a/src/core/tests/test_markers_api.py b/src/core/tests/test_markers_api.py index 3ce10ad5..ab68ac22 100644 --- a/src/core/tests/test_markers_api.py +++ b/src/core/tests/test_markers_api.py @@ -1,11 +1,10 @@ """Test using the marker API for Jandig Markers""" +from core.models import Marker +from core.serializers.markers import MarkerSerializer from django.conf import settings from django.core.files.uploadedfile import SimpleUploadedFile from django.test import TestCase - -from core.models import Marker -from core.serializers.markers import MarkerSerializer from users.models import User fake_file = SimpleUploadedFile("fake_file.png", b"these are the file contents!") diff --git a/src/core/tests/test_objects_api.py b/src/core/tests/test_objects_api.py index d084ad78..621cc942 100644 --- a/src/core/tests/test_objects_api.py +++ b/src/core/tests/test_objects_api.py @@ -1,11 +1,10 @@ """Test using the object API for Jandig Objects""" +from core.models import Object +from core.serializers.objects import ObjectSerializer from django.conf import settings from django.core.files.uploadedfile import SimpleUploadedFile from django.test import TestCase - -from core.models import Object -from core.serializers.objects import ObjectSerializer from users.models import User fake_file = SimpleUploadedFile("fake_file.png", b"these are the file contents!") diff --git a/src/core/views/artworks.py b/src/core/views/artworks.py index eaaea233..2927f460 100644 --- a/src/core/views/artworks.py +++ b/src/core/views/artworks.py @@ -1,8 +1,7 @@ -from rest_framework.mixins import ListModelMixin, RetrieveModelMixin -from rest_framework.viewsets import GenericViewSet - from core.models import Artwork from core.serializers.artworks import ArtworkSerializer +from rest_framework.mixins import ListModelMixin, RetrieveModelMixin +from rest_framework.viewsets import GenericViewSet class ArtworkViewset(ListModelMixin, RetrieveModelMixin, GenericViewSet): diff --git a/src/core/views/exhibits.py b/src/core/views/exhibits.py index e3a2fe46..e65479d9 100644 --- a/src/core/views/exhibits.py +++ b/src/core/views/exhibits.py @@ -1,8 +1,7 @@ -from rest_framework.mixins import ListModelMixin, RetrieveModelMixin -from rest_framework.viewsets import GenericViewSet - from core.models import Exhibit from core.serializers.exhibits import ExhibitSerializer +from rest_framework.mixins import ListModelMixin, RetrieveModelMixin +from rest_framework.viewsets import GenericViewSet class ExhibitViewset(ListModelMixin, RetrieveModelMixin, GenericViewSet): diff --git a/src/core/views/markers.py b/src/core/views/markers.py index bd185f5a..95192e64 100644 --- a/src/core/views/markers.py +++ b/src/core/views/markers.py @@ -1,8 +1,7 @@ -from rest_framework.mixins import ListModelMixin, RetrieveModelMixin -from rest_framework.viewsets import GenericViewSet - from core.models import Marker from core.serializers.markers import MarkerSerializer +from rest_framework.mixins import ListModelMixin, RetrieveModelMixin +from rest_framework.viewsets import GenericViewSet class MarkerViewset(ListModelMixin, RetrieveModelMixin, GenericViewSet): diff --git a/src/core/views/objects.py b/src/core/views/objects.py index e7a01f61..3e29e5be 100644 --- a/src/core/views/objects.py +++ b/src/core/views/objects.py @@ -1,8 +1,7 @@ -from rest_framework.mixins import ListModelMixin, RetrieveModelMixin -from rest_framework.viewsets import GenericViewSet - from core.models import Object from core.serializers.objects import ObjectSerializer +from rest_framework.mixins import ListModelMixin, RetrieveModelMixin +from rest_framework.viewsets import GenericViewSet class ObjectViewset(ListModelMixin, RetrieveModelMixin, GenericViewSet): diff --git a/src/core/views/static_views.py b/src/core/views/static_views.py index c7016f94..4a8fbf81 100644 --- a/src/core/views/static_views.py +++ b/src/core/views/static_views.py @@ -1,7 +1,8 @@ -from django.http import JsonResponse, HttpResponse +from django.http import HttpResponse, JsonResponse from django.shortcuts import redirect, render from django.templatetags.static import static + def home(request): return render(request, "users/profile.jinja2", {}) @@ -35,4 +36,4 @@ def robots_txt(request): "User-Agent: *", "Disallow: ", ] - return HttpResponse("\n".join(lines), content_type="text/plain") \ No newline at end of file + return HttpResponse("\n".join(lines), content_type="text/plain") diff --git a/src/manage.py b/src/manage.py index 41464304..312127d5 100755 --- a/src/manage.py +++ b/src/manage.py @@ -7,5 +7,9 @@ try: from django.core.management import execute_from_command_line except ImportError as exc: - raise ImportError("Couldn't import Django. Are you sure it's installed and " "available on your PYTHONPATH environment variable? Did you " "forget to activate a virtual environment?") from exc + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc execute_from_command_line(sys.argv) diff --git a/src/tests/home_tests.py b/src/tests/home_tests.py index a1cc097e..6e6d5d6f 100644 --- a/src/tests/home_tests.py +++ b/src/tests/home_tests.py @@ -1,6 +1,8 @@ import re + from playwright.sync_api import Page, expect + def test_home_loads_in_english(page: Page): page.goto("http://localhost:8000/") @@ -19,4 +21,4 @@ def test_changing_language_to_portuguese_and_back_to_english(page: Page) -> None page.get_by_label("en-us").check() page.get_by_role("button", name="Ok").click() expect(page).to_have_url("http://localhost:8000/") - expect(page.get_by_role("heading")).to_have_text("Welcome to Jandig") \ No newline at end of file + expect(page.get_by_role("heading")).to_have_text("Welcome to Jandig") diff --git a/src/users/admin.py b/src/users/admin.py index 64b5c99c..189d1f8e 100644 --- a/src/users/admin.py +++ b/src/users/admin.py @@ -1,22 +1,25 @@ from typing import Any + from django.contrib import admin +from django.contrib.admin.filters import ListFilter from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User +from django.db.models import Count, Q from django.db.models.query import QuerySet from django.http import HttpRequest -from django.db.models import Q, Count from django.urls import reverse from django.utils.html import format_html -from django.contrib import admin from users.models import Profile -from django.contrib.admin.filters import ListFilter + admin.site.unregister(User) + class NoArtFilter(admin.SimpleListFilter): title = "Art Qtdy" # Parameter for the filter that will be used in the URL query. parameter_name = "art_qtd" + def lookups(self, request, model_admin): return [ ("no_artwork", "Zero Artworks"), @@ -40,37 +43,58 @@ def queryset(self, request, queryset): if "no_exhibits" in query: conditions &= Q(_exhibits_count=0) if "no_art" in query: - return queryset.filter(Q(_artworks_count=0)&Q(_ar_objects_count=0)&Q(_exhibits_count=0)&Q(_markers_count=0)) - + return queryset.filter( + Q(_artworks_count=0) + & Q(_ar_objects_count=0) + & Q(_exhibits_count=0) + & Q(_markers_count=0) + ) + # Apply the filter filtered_queryset = queryset.filter(conditions) return filtered_queryset + @admin.register(Profile) class ProfileAdmin(admin.ModelAdmin): - list_display=["id", "user_link","artworks_count","markers_count","ar_objects_count","exhibits_count", "created", "last_login"] - ordering=["-id"] + list_display = [ + "id", + "user_link", + "artworks_count", + "markers_count", + "ar_objects_count", + "exhibits_count", + "created", + "last_login", + ] + ordering = ["-id"] list_filter = [NoArtFilter] + def get_queryset(self, request): - queryset = super().get_queryset(request).select_related("user").prefetch_related("artworks", "markers", "exhibits", "ar_objects") + queryset = ( + super() + .get_queryset(request) + .select_related("user") + .prefetch_related("artworks", "markers", "exhibits", "ar_objects") + ) queryset = queryset.annotate( - _markers_count = Count("markers", distinct=True), - _artworks_count = Count("artworks", distinct=True), - _ar_objects_count = Count("ar_objects", distinct=True), - _exhibits_count = Count("exhibits", distinct=True) + _markers_count=Count("markers", distinct=True), + _artworks_count=Count("artworks", distinct=True), + _ar_objects_count=Count("ar_objects", distinct=True), + _exhibits_count=Count("exhibits", distinct=True), ) return queryset - + def username(self, obj): return obj.user.username - def created(self,obj): + def created(self, obj): return obj.user.date_joined - def last_login(self,obj): + def last_login(self, obj): return obj.user.last_login - def user_link(self,obj): + def user_link(self, obj): """Link to related User""" link = reverse("admin:index") + "auth/user/?id=" + str(obj.user.id) return format_html('{}', link, obj.user.username) @@ -80,29 +104,36 @@ def artworks_count(self, obj): def markers_count(self, obj): return obj._markers_count - + def ar_objects_count(self, obj): return obj._ar_objects_count - + def exhibits_count(self, obj): return obj._exhibits_count artworks_count.admin_order_field = "_artworks_count" - markers_count.admin_order_field= "_markers_count" - ar_objects_count.admin_order_field="_ar_objects_count" - exhibits_count.admin_order_field="_exhibits_count" + markers_count.admin_order_field = "_markers_count" + ar_objects_count.admin_order_field = "_ar_objects_count" + exhibits_count.admin_order_field = "_exhibits_count" @admin.register(User) class JandigUserAdmin(UserAdmin): - list_display = ("username", "email","profile_link", "last_login", "date_joined", "is_staff") + list_display = ( + "username", + "email", + "profile_link", + "last_login", + "date_joined", + "is_staff", + ) list_filter = ("is_staff", "is_superuser", "is_active", "groups") + def get_queryset(self, request: HttpRequest) -> QuerySet[Any]: queryset = super().get_queryset(request).select_related("profile") return queryset - - def profile_link(self,obj): + def profile_link(self, obj): """Link to related Profile""" link = reverse("admin:index") + "users/profile/?id=" + str(obj.profile.id) return format_html('{}', link, obj.username) diff --git a/src/users/factory.py b/src/users/factory.py index fc89688a..382c92ab 100644 --- a/src/users/factory.py +++ b/src/users/factory.py @@ -1,8 +1,7 @@ +from core.models import Object from django.contrib.auth.models import User from factory.django import DjangoModelFactory -from core.models import Object - class UserFactory(DjangoModelFactory): username = "Testador" diff --git a/src/users/forms.py b/src/users/forms.py index 7e321b84..6a8cb328 100644 --- a/src/users/forms.py +++ b/src/users/forms.py @@ -2,6 +2,7 @@ import re from io import BytesIO +from core.models import Marker, Object from django import forms from django.contrib.auth import authenticate, get_user_model from django.contrib.auth.forms import AuthenticationForm @@ -13,8 +14,6 @@ from PIL import Image from pymarker.core import generate_marker_from_image, generate_patt_from_image -from core.models import Marker, Object - from .choices import COUNTRY_CHOICES log = logging.getLogger("ej") @@ -52,7 +51,10 @@ class Meta: def clean_email(self): email = self.cleaned_data.get("email") username = self.cleaned_data.get("username") - if email and User.objects.filter(email=email).exclude(username=username).exists(): + if ( + email + and User.objects.filter(email=email).exclude(username=username).exists() + ): raise forms.ValidationError(_("E-mail taken")) return email @@ -63,7 +65,9 @@ def __init__(self, *args, **kwargs): super(PasswordChangeForm, self).__init__(*args, **kwargs) self.fields["old_password"].widget.attrs["placeholder"] = _("Old Password") self.fields["new_password1"].widget.attrs["placeholder"] = _("New Password") - self.fields["new_password2"].widget.attrs["placeholder"] = _("New Password Again") + self.fields["new_password2"].widget.attrs["placeholder"] = _( + "New Password Again" + ) class ProfileForm(forms.ModelForm): @@ -110,13 +114,23 @@ def __init__(self, *args, **kwargs): def clean_username(self): username = self.cleaned_data.get("username") - if username and User.objects.filter(username=username).exclude(username=self.instance.user.username).exists(): + if ( + username + and User.objects.filter(username=username) + .exclude(username=self.instance.user.username) + .exists() + ): raise forms.ValidationError(_("Username already in use")) return username def clean_email(self): email = self.cleaned_data.get("email") - if email and User.objects.filter(email=email).exclude(username=self.instance.user.username).exists(): + if ( + email + and User.objects.filter(email=email) + .exclude(username=self.instance.user.username) + .exists() + ): raise forms.ValidationError(_("Email address must be unique")) return email @@ -184,7 +198,9 @@ def __init__(self, *args, **kwargs): log.warning(self.fields) self.fields["source"].widget.attrs["placeholder"] = _("browse file") self.fields["source"].widget.attrs["accept"] = "image/png, image/jpg" - self.fields["author"].widget.attrs["placeholder"] = _("declare different author name") + self.fields["author"].widget.attrs["placeholder"] = _( + "declare different author name" + ) self.fields["title"].widget.attrs["placeholder"] = _("Marker's title") class Meta: @@ -221,7 +237,9 @@ def __init__(self, *args, **kwargs): self.fields["source"].widget.attrs["placeholder"] = _("browse file") self.fields["source"].widget.attrs["accept"] = "image/*, .mp4, .webm" - self.fields["author"].widget.attrs["placeholder"] = _("declare different author name") + self.fields["author"].widget.attrs["placeholder"] = _( + "declare different author name" + ) self.fields["scale"].widget = HiddenInput() self.fields["rotation"].widget = HiddenInput() self.fields["position"].widget = HiddenInput() @@ -254,10 +272,16 @@ class ArtworkForm(forms.Form): def __init__(self, *args, **kwargs): super(ArtworkForm, self).__init__(*args, **kwargs) - self.fields["marker_author"].widget.attrs["placeholder"] = _("declare different author name") - self.fields["augmented_author"].widget.attrs["placeholder"] = _("declare different author name") + self.fields["marker_author"].widget.attrs["placeholder"] = _( + "declare different author name" + ) + self.fields["augmented_author"].widget.attrs["placeholder"] = _( + "declare different author name" + ) self.fields["title"].widget.attrs["placeholder"] = _("Artwork title") - self.fields["description"].widget.attrs["placeholder"] = _("Artwork description") + self.fields["description"].widget.attrs["placeholder"] = _( + "Artwork description" + ) class ExhibitForm(forms.Form): @@ -271,11 +295,15 @@ class ExhibitForm(forms.Form): def clean_slug(self): data = self.cleaned_data["slug"] if not re.match("^[a-zA-Z0-9_]*$", data): - raise forms.ValidationError(_("Url can't contain spaces or special characters")) + raise forms.ValidationError( + _("Url can't contain spaces or special characters") + ) return data def __init__(self, *args, **kwargs): super(ExhibitForm, self).__init__(*args, **kwargs) self.fields["name"].widget.attrs["placeholder"] = _("Exhibit Title") - self.fields["slug"].widget.attrs["placeholder"] = _("Complete with your Exhibit URL here") + self.fields["slug"].widget.attrs["placeholder"] = _( + "Complete with your Exhibit URL here" + ) diff --git a/src/users/tests/test_users.py b/src/users/tests/test_users.py index 0bb37a02..41acf9bc 100644 --- a/src/users/tests/test_users.py +++ b/src/users/tests/test_users.py @@ -1,7 +1,6 @@ from unittest import mock from django.test import RequestFactory, TestCase - from users.factory import UserFactory from users.services.email_service import EmailService from users.services.encrypt_service import EncryptService @@ -35,20 +34,26 @@ def test_recover_password_invalid_email(self, *args, **kwargs): self.assertEqual(response.url, "/users/invalid-recovering-email") def test_recover_password_invalid_username(self, *args, **kwargs): - request = self.client_test.post("/recover/", {"username_or_email": "testadorinvalid"}, follow=True) + request = self.client_test.post( + "/recover/", {"username_or_email": "testadorinvalid"}, follow=True + ) response = recover_password(request) self.assertEqual(response.status_code, 302) self.assertEqual(response.url, "/users/invalid-recovering-email") def test_recover_password_valid_email(self, *args, **kwargs): - request = self.client_test.post("/recover/", {"username_or_email": "testador@memelab.com"}, follow=True) + request = self.client_test.post( + "/recover/", {"username_or_email": "testador@memelab.com"}, follow=True + ) UserFactory() response = recover_password(request) self.assertEqual(response.status_code, 302) self.assertEqual(response.url, "/users/recover-code/") def test_recover_password_valid_username(self, *args, **kwargs): - request = self.client_test.post("/recover/", {"username_or_email": "Testador"}, follow=True) + request = self.client_test.post( + "/recover/", {"username_or_email": "Testador"}, follow=True + ) UserFactory() response = recover_password(request) self.assertEqual(response.status_code, 302) diff --git a/src/users/views.py b/src/users/views.py index 76b5bdb0..1c5c89ea 100644 --- a/src/users/views.py +++ b/src/users/views.py @@ -1,6 +1,7 @@ import json import logging +from core.models import Artwork, Exhibit, Marker, Object from django.contrib.auth import ( authenticate, get_user_model, @@ -14,8 +15,6 @@ from django.views.decorators.cache import cache_page from django.views.decorators.http import require_http_methods -from core.models import Artwork, Exhibit, Marker, Object - from .forms import ( ArtworkForm, ExhibitForm, @@ -61,9 +60,13 @@ def recover_password(request): recover_password_form = RecoverPasswordForm(request.POST) if recover_password_form.is_valid(): - username_or_email = recover_password_form.cleaned_data.get("username_or_email") + username_or_email = recover_password_form.cleaned_data.get( + "username_or_email" + ) user_service = UserService() - username_or_email_is_valid = user_service.check_if_username_or_email_exist(username_or_email) + username_or_email_is_valid = user_service.check_if_username_or_email_exist( + username_or_email + ) if not username_or_email_is_valid: return redirect("invalid_recovering_email_or_username") @@ -72,14 +75,18 @@ def recover_password(request): global global_verification_code encrypt_service = EncryptService() - global_verification_code = encrypt_service.generate_verification_code(global_recovering_email) + global_verification_code = encrypt_service.generate_verification_code( + global_recovering_email + ) build_message_and_send_to_user(global_recovering_email) return redirect("recover-code") recover_password_form = RecoverPasswordForm() - return render(request, "users/recover-password.jinja2", {"form": recover_password_form}) + return render( + request, "users/recover-password.jinja2", {"form": recover_password_form} + ) def build_message_and_send_to_user(email): @@ -144,7 +151,9 @@ def profile(request): if not user: user = request.user - profile = Profile.objects.prefetch_related("exhibits", "markers", "ar_objects", "artworks").get(user=user) + profile = Profile.objects.prefetch_related( + "exhibits", "markers", "ar_objects", "artworks" + ).get(user=user) exhibits = profile.exhibits.all() markers = profile.markers.all() diff --git a/tasks.py b/tasks.py index 4194aa1f..75d12c76 100644 --- a/tasks.py +++ b/tasks.py @@ -4,24 +4,24 @@ python = sys.executable directory = os.path.dirname(__file__) -sys.path.append('jandig') +sys.path.append("jandig") # # Call python manage.py in a more robust way # def robust_manage(ctx, cmd, env=None, **kwargs): - kwargs = {k.replace('_', '-'): v for k, v in kwargs.items() if v is not False} - opts = ' '.join(f'--{k} {"" if v is True else v}' for k, v in kwargs.items()) - cmd = f'{python} ./src/manage.py {cmd} {opts}' + kwargs = {k.replace("_", "-"): v for k, v in kwargs.items() if v is not False} + opts = " ".join(f'--{k} {"" if v is True else v}' for k, v in kwargs.items()) + cmd = f"{python} ./src/manage.py {cmd} {opts}" env = {**os.environ, **(env or {})} path = env.get("PYTHONPATH", ":".join(sys.path)) - env.setdefault('PYTHONPATH', f'src:{path}') + env.setdefault("PYTHONPATH", f"src:{path}") print(cmd) ctx.run(cmd, pty=True, env=env) def manage(ctx, cmd): - cmd = f'python3 ./src/manage.py {cmd}' + cmd = f"python3 ./src/manage.py {cmd}" ctx.run(cmd, pty=True, env=os.environ) @@ -31,7 +31,9 @@ def run(ctx, ssl=False, gunicorn=False): Run development server """ if gunicorn: - ctx.run('cd src && gunicorn --reload --worker-connections=10000 --workers=4 --log-level debug --bind 0.0.0.0:8000 config.wsgi') + ctx.run( + "cd src && gunicorn --reload --worker-connections=10000 --workers=4 --log-level debug --bind 0.0.0.0:8000 config.wsgi" + ) else: manage(ctx, "runserver 0.0.0.0:8000") @@ -60,34 +62,36 @@ def collect(ctx): # Translations # @task -def i18n(ctx, compile=False, edit=False, lang='pt_BR', keep_pot=False): +def i18n(ctx, compile=False, edit=False, lang="pt_BR", keep_pot=False): """ Extract messages for translation. """ if edit: - ctx.run(f'poedit locale/{lang}/LC_MESSAGES/django.po') + ctx.run(f"poedit locale/{lang}/LC_MESSAGES/django.po") elif compile: - ctx.run(f'{python} etc/scripts/compilemessages.py') + ctx.run(f"{python} etc/scripts/compilemessages.py") else: - print('Collecting messages') - robust_manage(ctx, 'makemessages', keep_pot=True, locale=lang) + print("Collecting messages") + robust_manage(ctx, "makemessages", keep_pot=True, locale=lang) - print('Extract Jinja translations') - ctx.run('pybabel extract -F ./etc/babel.cfg -o ./locale/jinja2.pot .') + print("Extract Jinja translations") + ctx.run("pybabel extract -F ./etc/babel.cfg -o ./locale/jinja2.pot .") - print('Join Django + Jinja translation files') - ctx.run('msgcat ./locale/django.pot ./locale/jinja2.pot --use-first -o ./locale/join.pot', - pty=True) - ctx.run(r'''sed -i '/"Language: \\n"/d' ./locale/join.pot''', pty=True) + print("Join Django + Jinja translation files") + ctx.run( + "msgcat ./locale/django.pot ./locale/jinja2.pot --use-first -o ./locale/join.pot", + pty=True, + ) + ctx.run(r"""sed -i '/"Language: \\n"/d' ./locale/join.pot""", pty=True) - print(f'Update locale {lang} with Jinja2 messages') - ctx.run(f'msgmerge ./locale/{lang}/LC_MESSAGES/django.po ./locale/join.pot -U') + print(f"Update locale {lang} with Jinja2 messages") + ctx.run(f"msgmerge ./locale/{lang}/LC_MESSAGES/django.po ./locale/join.pot -U") if not keep_pot: - print('Cleaning up') - ctx.run('rm ./locale/*.pot') + print("Cleaning up") + ctx.run("rm ./locale/*.pot") @task def docs(ctx): - ctx.run('sphinx-build docs/ build/') + ctx.run("sphinx-build docs/ build/") From 6362f3c72b4e5b84870db4d4a8f72b87661f4895 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sat, 26 Oct 2024 20:41:59 +0100 Subject: [PATCH 28/79] Fix API tests for new storage settings --- src/core/tests/test_markers_api.py | 2 -- src/core/tests/test_objects_api.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/core/tests/test_markers_api.py b/src/core/tests/test_markers_api.py index ab68ac22..648d6dbd 100644 --- a/src/core/tests/test_markers_api.py +++ b/src/core/tests/test_markers_api.py @@ -34,7 +34,6 @@ def test_api_markers_lists_one_marker(self): self.assertEqual(data["previous"], None) first_result = data["results"][0] serializer_data = MarkerSerializer(marker).data - serializer_data["source"] = "http://testserver" + serializer_data["source"] # Asserts the serializer is being used by the endpoint self.assertDictEqual(first_result, serializer_data) @@ -68,6 +67,5 @@ def test_retrieve_marker(self): self.assertEqual(response.status_code, 200) data = response.json() serializer_data = MarkerSerializer(marker).data - serializer_data["source"] = "http://testserver" + serializer_data["source"] # Asserts the serializer is being used by the endpoint self.assertDictEqual(data, serializer_data) diff --git a/src/core/tests/test_objects_api.py b/src/core/tests/test_objects_api.py index 621cc942..2a5aef3c 100644 --- a/src/core/tests/test_objects_api.py +++ b/src/core/tests/test_objects_api.py @@ -34,7 +34,6 @@ def test_api_objects_lists_one_object(self): self.assertEqual(data["previous"], None) first_result = data["results"][0] serializer_data = ObjectSerializer(obj).data - serializer_data["source"] = "http://testserver" + serializer_data["source"] # Asserts the serializer is being used by the endpoint self.assertDictEqual(first_result, serializer_data) @@ -70,6 +69,5 @@ def test_retrieve_object(self): self.assertEqual(response.status_code, 200) data = response.json() serializer_data = ObjectSerializer(obj).data - serializer_data["source"] = "http://testserver" + serializer_data["source"] # Asserts the serializer is being used by the endpoint self.assertDictEqual(data, serializer_data) From ec3c48f87dbf7003aba9d781c2c1d2901a02394d Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sat, 26 Oct 2024 20:51:07 +0100 Subject: [PATCH 29/79] Fix flake8 warnings --- poetry.lock | 30 ++++++++++++++--------------- pyproject.toml | 2 +- src/blog/tests.py | 3 --- src/core/tests/test_exhibits_api.py | 8 +++----- src/core/views/views.py | 2 +- src/tests/home_tests.py | 2 -- src/users/admin.py | 1 - 7 files changed, 20 insertions(+), 28 deletions(-) delete mode 100644 src/blog/tests.py diff --git a/poetry.lock b/poetry.lock index 9b2e79a1..5ee76e58 100644 --- a/poetry.lock +++ b/poetry.lock @@ -560,19 +560,19 @@ typing-extensions = "*" [[package]] name = "flake8" -version = "5.0.4" +version = "7.1.1" description = "the modular source code checker: pep8 pyflakes and co" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8.1" files = [ - {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, - {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, + {file = "flake8-7.1.1-py2.py3-none-any.whl", hash = "sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213"}, + {file = "flake8-7.1.1.tar.gz", hash = "sha256:049d058491e228e03e67b390f311bbf88fce2dbaa8fa673e7aea87b7198b8d38"}, ] [package.dependencies] mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.9.0,<2.10.0" -pyflakes = ">=2.5.0,<2.6.0" +pycodestyle = ">=2.12.0,<2.13.0" +pyflakes = ">=3.2.0,<3.3.0" [[package]] name = "gevent" @@ -1163,13 +1163,13 @@ files = [ [[package]] name = "pycodestyle" -version = "2.9.1" +version = "2.12.1" description = "Python style guide checker" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, - {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, + {file = "pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3"}, + {file = "pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521"}, ] [[package]] @@ -1202,13 +1202,13 @@ dev = ["black", "build", "flake8", "flake8-black", "isort", "jupyter-console", " [[package]] name = "pyflakes" -version = "2.5.0" +version = "3.2.0" description = "passive checker of Python programs" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, - {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, + {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, + {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, ] [[package]] @@ -1764,4 +1764,4 @@ testing = ["coverage[toml]", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.13" -content-hash = "ded2739ebdae9deb42ce1318d41f22f4e3f6064c3eb0ecb8690c926d7b4b62f2" +content-hash = "8b9145884ec01ef92cf48e589d680facf135adbedd5ce9604986f5f32fde1d1a" diff --git a/pyproject.toml b/pyproject.toml index 73acaf9f..007f3750 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ django-htmx = "^1.18.0" playwright = "^1.41.2" pytest = "^7.2.0" pytest-xdist = "^3.0.2" -flake8 = "^5.0.4" +flake8 = "^7.1.1" black = "^22.10.0" isort = "^5.10.1" pytest-django = "^4.5.2" diff --git a/src/blog/tests.py b/src/blog/tests.py deleted file mode 100644 index 7ce503c2..00000000 --- a/src/blog/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/src/core/tests/test_exhibits_api.py b/src/core/tests/test_exhibits_api.py index e81e9d38..7f0f9114 100644 --- a/src/core/tests/test_exhibits_api.py +++ b/src/core/tests/test_exhibits_api.py @@ -38,12 +38,10 @@ def test_api_exhibit_lists_multiple_exhibits(self): for i in range(0, settings.PAGE_SIZE + 1): marker = Marker.objects.create(owner=self.profile, source=fake_file) obj = Object.objects.create(owner=self.profile, source=fake_file) - artwork = Artwork.objects.create( - author=self.profile, augmented=obj, marker=marker - ) # noqa F841 - exhibit = Exhibit.objects.create( + Artwork.objects.create(author=self.profile, augmented=obj, marker=marker) + Exhibit.objects.create( owner=self.profile, name=f"name_{i}", slug=f"slug_{i}" - ) # noqa F841 + ) response = self.client.get("/api/v1/exhibits/") self.assertEqual(response.status_code, 200) diff --git a/src/core/views/views.py b/src/core/views/views.py index 66eb3cab..7b7d2767 100644 --- a/src/core/views/views.py +++ b/src/core/views/views.py @@ -2,7 +2,7 @@ from core.helpers import handle_upload_image from core.models import Artwork, Exhibit, Marker, Object from django.core.paginator import Paginator -from django.http import HttpResponse, HttpResponseRedirect +from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.views.decorators.cache import cache_page diff --git a/src/tests/home_tests.py b/src/tests/home_tests.py index 6e6d5d6f..d325b977 100644 --- a/src/tests/home_tests.py +++ b/src/tests/home_tests.py @@ -1,5 +1,3 @@ -import re - from playwright.sync_api import Page, expect diff --git a/src/users/admin.py b/src/users/admin.py index 189d1f8e..ed3b70ac 100644 --- a/src/users/admin.py +++ b/src/users/admin.py @@ -1,7 +1,6 @@ from typing import Any from django.contrib import admin -from django.contrib.admin.filters import ListFilter from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User from django.db.models import Count, Q From a4e640c01a909f8f7b15adff3766e29e039aa89d Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sat, 26 Oct 2024 20:52:59 +0100 Subject: [PATCH 30/79] Update CI with python 3.13 --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e688e4cb..592d17c5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,10 +9,10 @@ jobs: steps: - name: Check out code from Github uses: actions/checkout@v3 - - name: Set up Python 3.10 + - name: Set up Python 3.13 uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.13" - name: Installing flake8 run: | python -m pip install --upgrade pip From 3bdf0b10ebef245f26c0265e7d621be48961c7af Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sat, 26 Oct 2024 20:58:49 +0100 Subject: [PATCH 31/79] Update push image to master only --- .github/workflows/push.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index ebb9996b..cc08972d 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -3,7 +3,7 @@ name: Docker pipeline on: push: branches: - - develop + - master # TODO: Change environment and login envs jobs: From de340d3e3b58bff93565e0d339f6bbd7cd1cf9d7 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sat, 26 Oct 2024 21:00:04 +0100 Subject: [PATCH 32/79] Update CI job to use docker compose --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 592d17c5..11442bda 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,7 +57,7 @@ jobs: run: | cp .envs/.example .envs/.env docker load -i docker_image_$GITHUB_SHA - docker-compose -f docker-compose.ci.yml -p jandigarte_$GITHUB_SHA up --no-build -d + docker compose -f docker-compose.ci.yml -p jandigarte_$GITHUB_SHA up --no-build -d - name: Test migrations run: | docker exec jandigarte_${{ github.sha }}_django_1 sh -c "\ @@ -81,7 +81,7 @@ jobs: run: | cp .envs/.example .envs/.env docker load -i docker_image_$GITHUB_SHA - docker-compose -f docker-compose.ci.yml -p jandigarte_$GITHUB_SHA up --no-build -d + docker compose -f docker-compose.ci.yml -p jandigarte_$GITHUB_SHA up --no-build -d - name: Running users tests run: | docker exec jandigarte_${{ github.sha }}_django_1 sh -c "\ From 12336e27b6c9d3f1dc12db1025ee08a1bc8d4564 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sun, 27 Oct 2024 15:08:36 +0000 Subject: [PATCH 33/79] Update e-mail variable name --- .envs/.example | 4 ++-- src/config/settings.py | 8 ++++---- src/users/services/email_service.py | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.envs/.example b/.envs/.example index 8bf30dd7..1b45b959 100644 --- a/.envs/.example +++ b/.envs/.example @@ -36,5 +36,5 @@ POSTGRES_PASSWORD=secret # Email server variables SMTP_SERVER=mailpit SMTP_PORT=1025 -JANDIG_EMAIL=local_jandig@jandig.com -JANDIG_EMAIL_PASSWORD=local_password +SMTP_EMAIL=local_jandig@jandig.com +SMTP_PASSWORD=local_password diff --git a/src/config/settings.py b/src/config/settings.py index b8875fe0..bd40d040 100644 --- a/src/config/settings.py +++ b/src/config/settings.py @@ -233,10 +233,10 @@ def debug(request): # Sphinx docs DOCS_ROOT = "/jandig/build/" -SMTP_SERVER = env("SMTP_SERVER", default="smtp.gmail.com") -SMTP_PORT = env("SMTP_PORT", default=587) -JANDIG_EMAIL = env("JANDIG_EMAIL", default="jandig@jandig.com") -JANDIG_EMAIL_PASSWORD = env("JANDIG_EMAIL_PASSWORD", default="password") +SMTP_SERVER = env("SMTP_SERVER", default="mailpit") +SMTP_PORT = env("SMTP_PORT", default=1025) +SMTP_EMAIL = env("SMTP_EMAIL", default="jandig@jandig.com") +SMTP_PASSWORD = env("SMTP_PASSWORD", default="password") if len(sys.argv) > 1 and sys.argv[1] == "test": logging.disable(logging.CRITICAL) diff --git a/src/users/services/email_service.py b/src/users/services/email_service.py index 7c5c63b6..815d56e0 100644 --- a/src/users/services/email_service.py +++ b/src/users/services/email_service.py @@ -9,8 +9,8 @@ class EmailService: def __init__(self, email_message): self.smtp_server = settings.SMTP_SERVER self.smtp_port = settings.SMTP_PORT - self.jandig_email = settings.JANDIG_EMAIL - self.jandig_email_password = settings.JANDIG_EMAIL_PASSWORD + self.jandig_email = settings.SMTP_EMAIL + self.jandig_email_password = settings.SMTP_PASSWORD self.email_message = email_message def send_email_to_recover_password(self, multipart_message): From 6fe3c673c0f1cc06df237afbebae53a245e5a8d6 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sun, 27 Oct 2024 15:09:13 +0000 Subject: [PATCH 34/79] Add sentry release variable --- src/config/settings.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/config/settings.py b/src/config/settings.py index bd40d040..6b8bb91a 100644 --- a/src/config/settings.py +++ b/src/config/settings.py @@ -37,12 +37,13 @@ ALLOWED_HOSTS += CUSTOM_ALLOWED_HOSTS +DJANGO_ADMIN_URL = env("DJANGO_ADMIN_URL", default="admin/") # Sentry configuration ENABLE_SENTRY = env("ENABLE_SENTRY", default=False) HEALTH_CHECK_URL = env("HEALTH_CHECK_URL", default="api/v1/status/") SENTRY_TRACES_SAMPLE_RATE = env("SENTRY_TRACES_SAMPLE_RATE", default=0.1) -DJANGO_ADMIN_URL = env("DJANGO_ADMIN_URL", default="admin/") SENTRY_ENVIRONMENT = env("SENTRY_ENVIRONMENT", default="") +SENTRY_RELEASE = env("SENTRY_RELEASE", default="1.4.0") def traces_sampler(sampling_context): @@ -64,6 +65,7 @@ def traces_sampler(sampling_context): # django.contrib.auth) you may enable sending PII data. send_default_pii=True, traces_sampler=traces_sampler, + release=SENTRY_RELEASE, ) From b6ebb4c2465b0f5bb6cd05c9e2521b9274f1a80c Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sun, 27 Oct 2024 15:09:57 +0000 Subject: [PATCH 35/79] Fix n+1 query on exhibit routes --- src/core/views/views.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/views/views.py b/src/core/views/views.py index 7b7d2767..8bc19e1f 100644 --- a/src/core/views/views.py +++ b/src/core/views/views.py @@ -126,5 +126,8 @@ def artwork_preview(request): @require_http_methods(["GET"]) def exhibit(request, slug): exhibit = get_object_or_404(Exhibit.objects.prefetch_related("artworks"), slug=slug) - ctx = {"exhibit": exhibit, "artworks": exhibit.artworks.all()} + ctx = { + "exhibit": exhibit, + "artworks": exhibit.artworks.select_related("marker", "augmented").all(), + } return render(request, "core/exhibit.jinja2", ctx) From 489fd174a002dd1062a1c01d8e0f36d63ace7c09 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sun, 27 Oct 2024 15:10:59 +0000 Subject: [PATCH 36/79] Fix logout as POST on django 5.1 --- poetry.lock | 18 +++++++++++++++++- pyproject.toml | 7 ++++++- .../jinja2/users/components/userbox.jinja2 | 7 ++++++- src/users/jinja2/users/profile-edit.jinja2 | 7 ++++++- src/users/views.py | 2 +- tasks.py | 1 + 6 files changed, 37 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5ee76e58..62817765 100644 --- a/poetry.lock +++ b/poetry.lock @@ -574,6 +574,22 @@ mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.12.0,<2.13.0" pyflakes = ">=3.2.0,<3.3.0" +[[package]] +name = "flake8-pyproject" +version = "1.2.3" +description = "Flake8 plug-in loading the configuration from pyproject.toml" +optional = false +python-versions = ">= 3.6" +files = [ + {file = "flake8_pyproject-1.2.3-py3-none-any.whl", hash = "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a"}, +] + +[package.dependencies] +Flake8 = ">=5" + +[package.extras] +dev = ["pyTest", "pyTest-cov"] + [[package]] name = "gevent" version = "24.10.3" @@ -1764,4 +1780,4 @@ testing = ["coverage[toml]", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.13" -content-hash = "8b9145884ec01ef92cf48e589d680facf135adbedd5ce9604986f5f32fde1d1a" +content-hash = "c0c631424a2e552461645e9f7bdc066d5651205c1e5f5ec8d5668556658b89b2" diff --git a/pyproject.toml b/pyproject.toml index 007f3750..aed96184 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,7 @@ playwright = "^1.41.2" pytest = "^7.2.0" pytest-xdist = "^3.0.2" flake8 = "^7.1.1" +Flake8-pyproject = "^1.2.3" black = "^22.10.0" isort = "^5.10.1" pytest-django = "^4.5.2" @@ -57,4 +58,8 @@ exclude = ''' [tool.isort] profile = "black" src_paths = ["src"] -skip_glob = "*/migrations/*.py" \ No newline at end of file +skip_glob = "*/migrations/*.py" + +[tool.flake8] +max-line-length = 200 +exclude="**/migrations/" \ No newline at end of file diff --git a/src/users/jinja2/users/components/userbox.jinja2 b/src/users/jinja2/users/components/userbox.jinja2 index ae77e4a2..b5543fa6 100644 --- a/src/users/jinja2/users/components/userbox.jinja2 +++ b/src/users/jinja2/users/components/userbox.jinja2 @@ -20,7 +20,12 @@ {%if artworks_qty %}
diff --git a/src/users/jinja2/users/profile-edit.jinja2 b/src/users/jinja2/users/profile-edit.jinja2 index 275d104d..3c367be8 100644 --- a/src/users/jinja2/users/profile-edit.jinja2 +++ b/src/users/jinja2/users/profile-edit.jinja2 @@ -4,7 +4,12 @@
diff --git a/src/users/views.py b/src/users/views.py index 1c5c89ea..27404008 100644 --- a/src/users/views.py +++ b/src/users/views.py @@ -166,7 +166,7 @@ def profile(request): "markers": markers, "objects": objects, "profile": True, - "button_enable": False if user else True, + "button_enable": True if user else False, } return render(request, "users/profile.jinja2", ctx) diff --git a/tasks.py b/tasks.py index 75d12c76..a46bf42f 100644 --- a/tasks.py +++ b/tasks.py @@ -6,6 +6,7 @@ directory = os.path.dirname(__file__) sys.path.append("jandig") + # # Call python manage.py in a more robust way # From 28fa6fc874f4998a4327d427dd41b23cccc4d535 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Mon, 28 Oct 2024 12:10:42 +0000 Subject: [PATCH 37/79] Update poetry dependency management --- Dockerfile | 30 ++++++++++++++---------------- docker-compose.yml | 13 ++++--------- run.sh | 1 + 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/Dockerfile b/Dockerfile index bbda708e..3cfd3aa6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,31 +1,26 @@ -FROM python:3.13.0-slim-bookworm +FROM python:3.13.0-slim-bookworm as base-image RUN apt-get update && \ apt-get install -y --no-install-recommends \ - gettext \ - docutils-common \ - curl \ - pipx \ - wget - -COPY ./pyproject.toml /pyproject.toml -COPY ./poetry.lock /poetry.lock + gettext \ + docutils-common \ + curl \ + wget + ENV PATH="$PATH:/root/.local/bin" \ - POETRY_NO_INTERACTION=1 \ - POETRY_VIRTUALENVS_CREATE=false \ - POETRY_CACHE_DIR='/var/cache/pypoetry' \ TINI_VERSION=v0.19.0 \ # poetry: + POETRY_NO_INTERACTION=1 \ + POETRY_VIRTUALENVS_CREATE=true \ + POETRY_CACHE_DIR='/var/cache/pypoetry' \ POETRY_VERSION=1.8.4 + # Installing `poetry` package manager: # https://github.com/python-poetry/poetry -RUN pip install --upgrade pip -RUN pipx install --python python3 poetry==${POETRY_VERSION} -RUN poetry install - +RUN curl -sSL https://install.python-poetry.org | python3 - RUN dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \ && wget "https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${dpkgArch}" -O /usr/local/bin/tini \ @@ -36,6 +31,9 @@ RUN mkdir -p /jandig/src /jandig/locale /jandig/docs /jandig/static /jandig/buil WORKDIR /jandig +COPY ./pyproject.toml /jandig/pyproject.toml +COPY ./poetry.lock /jandig/poetry.lock + COPY ./src/ /jandig/src/ COPY ./docs/ /jandig/docs/ COPY ./locale/ /jandig/locale/ diff --git a/docker-compose.yml b/docker-compose.yml index 3c5d409c..0446c33c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,14 +6,8 @@ services: ports: - 8000:8000 volumes: - - ./src/:/jandig/src/ - - ./docs/:/jandig/docs/ - - ./etc/:/jandig/etc/ - - ./locale/:/jandig/locale/ - - ./run.sh:/jandig/run.sh - - ./tasks.py:/jandig/tasks.py - - ./poetry.lock:/poetry.lock - - ./pyproject.toml:/pyproject.toml + - ./:/jandig + - poetry_cache:/var/cache/pypoetry env_file: - .envs/.example depends_on: @@ -90,4 +84,5 @@ services: volumes: postgres_data: media_data: - mailpit_data: \ No newline at end of file + mailpit_data: + poetry_cache: \ No newline at end of file diff --git a/run.sh b/run.sh index 13bb0be0..bf7219be 100755 --- a/run.sh +++ b/run.sh @@ -1,3 +1,4 @@ #!/bin/bash +poetry install poetry show poetry run inv collect db i18n --compile docs run -g From f2948e68d29dd13a720e8a0b795f6315631b64fe Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Mon, 28 Oct 2024 12:11:29 +0000 Subject: [PATCH 38/79] Remove Invoke from main dependencies on startup --- pyproject.toml | 2 +- run.sh | 8 +++++++- tasks.py | 29 +---------------------------- 3 files changed, 9 insertions(+), 30 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index aed96184..39518abe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,6 @@ Jinja2 = "^3.1.2" gunicorn = "^20.1.0" Pillow = "^11.0.0" django-cors-headers = "^3.13.0" -invoke = "^2.2.0" django-environ = "^0.9.0" psycopg2-binary = "^2.9.3" Sphinx = "^8.1.3" @@ -27,6 +26,7 @@ drf-nested-routers = "^0.93.4" django-htmx = "^1.18.0" [tool.poetry.group.dev.dependencies] +invoke = "^2.2.0" playwright = "^1.41.2" pytest = "^7.2.0" pytest-xdist = "^3.0.2" diff --git a/run.sh b/run.sh index bf7219be..66a7e3f4 100755 --- a/run.sh +++ b/run.sh @@ -1,4 +1,10 @@ #!/bin/bash poetry install poetry show -poetry run inv collect db i18n --compile docs run -g +# poetry run python src/manage.py collectstatic --no-input +poetry run python src/manage.py migrate +poetry run sphinx-build docs/ build/ +poetry run python etc/scripts/compilemessages.py + +bash -c "cd src && poetry run gunicorn --reload --worker-connections=10000 --workers=4 --log-level debug --bind 0.0.0.0:8000 config.wsgi" +# poetry run python src/manage.py runserver 0.0.0.0:8000 \ No newline at end of file diff --git a/tasks.py b/tasks.py index a46bf42f..589bb5c6 100644 --- a/tasks.py +++ b/tasks.py @@ -39,38 +39,16 @@ def run(ctx, ssl=False, gunicorn=False): manage(ctx, "runserver 0.0.0.0:8000") -@task -def db(ctx, make=False): - """ - Run migrations - """ - if make: - manage(ctx, "makemigrations") - manage(ctx, "migrate") - else: - manage(ctx, "migrate") - - -@task -def collect(ctx): - """ - Collect static files - """ - manage(ctx, "collectstatic --no-input --clear") - - # # Translations # @task -def i18n(ctx, compile=False, edit=False, lang="pt_BR", keep_pot=False): +def i18n(ctx, edit=False, lang="pt_BR", keep_pot=False): """ Extract messages for translation. """ if edit: ctx.run(f"poedit locale/{lang}/LC_MESSAGES/django.po") - elif compile: - ctx.run(f"{python} etc/scripts/compilemessages.py") else: print("Collecting messages") robust_manage(ctx, "makemessages", keep_pot=True, locale=lang) @@ -91,8 +69,3 @@ def i18n(ctx, compile=False, edit=False, lang="pt_BR", keep_pot=False): if not keep_pot: print("Cleaning up") ctx.run("rm ./locale/*.pot") - - -@task -def docs(ctx): - ctx.run("sphinx-build docs/ build/") From d4d51e248657613678be8f603c9569d2452b4d4a Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Mon, 28 Oct 2024 12:11:48 +0000 Subject: [PATCH 39/79] Fix double static file collection by django --- src/config/settings.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config/settings.py b/src/config/settings.py index 6b8bb91a..6e474e5f 100644 --- a/src/config/settings.py +++ b/src/config/settings.py @@ -216,6 +216,10 @@ def debug(request): os.path.join(BASE_DIR, "blog", "static"), ] +STATICFILES_FINDERS = [ + "django.contrib.staticfiles.finders.AppDirectoriesFinder", +] + AWS_PUBLIC_MEDIA_LOCATION = "media/public" # Storages From 9c88759d364edf1b738a163171dc9007bd15160b Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Mon, 28 Oct 2024 12:12:51 +0000 Subject: [PATCH 40/79] Update SMTP credentials management --- src/config/settings.py | 2 +- src/users/services/email_service.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/config/settings.py b/src/config/settings.py index 6e474e5f..1ddc7705 100644 --- a/src/config/settings.py +++ b/src/config/settings.py @@ -241,7 +241,7 @@ def debug(request): SMTP_SERVER = env("SMTP_SERVER", default="mailpit") SMTP_PORT = env("SMTP_PORT", default=1025) -SMTP_EMAIL = env("SMTP_EMAIL", default="jandig@jandig.com") +SMTP_USER = env("SMTP_USER", default="jandig@jandig.com") SMTP_PASSWORD = env("SMTP_PASSWORD", default="password") if len(sys.argv) > 1 and sys.argv[1] == "test": diff --git a/src/users/services/email_service.py b/src/users/services/email_service.py index 815d56e0..4828c7d1 100644 --- a/src/users/services/email_service.py +++ b/src/users/services/email_service.py @@ -9,15 +9,15 @@ class EmailService: def __init__(self, email_message): self.smtp_server = settings.SMTP_SERVER self.smtp_port = settings.SMTP_PORT - self.jandig_email = settings.SMTP_EMAIL - self.jandig_email_password = settings.SMTP_PASSWORD + self.smtp_user = settings.SMTP_USER + self.smtp_password = settings.SMTP_PASSWORD + self.jandig_email = "jandig@memelab.com.br" self.email_message = email_message def send_email_to_recover_password(self, multipart_message): email_server = smtplib.SMTP(self.smtp_server, self.smtp_port) email_server.starttls() - email_server.login(self.jandig_email, self.jandig_email_password) - email_server.sendmail( + a = email_server.login(self.smtp_user, self.smtp_password) multipart_message["From"], multipart_message["To"], multipart_message.as_string(), From f878ba738a4f8c1631cf7ea813c11aea9e3784c8 Mon Sep 17 00:00:00 2001 From: Luiz Henrique Fernandes Zamprogno <62183792+luiz-hfz@users.noreply.github.com> Date: Tue, 29 Oct 2024 14:21:29 -0300 Subject: [PATCH 41/79] [REVIEW] 503 - Document High-Fidelity Prototype (#504) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Criando branch para PR * Adicionando descrição inicial no readme * Adicionando a estrura inicial da documentação do prototipo * Adicionando tutorial de acesso ao prototipo * Iniciando tutorial de contribuição ao prototipo * Adicionando insumos para o tutorial de contribuição ao prototipo * Adiconando descrições em ingls * Corrigindo imagens * Corrigindo imagens quebrandas e texto faltante --- README.md | 6 +++- docs/images/figma-home.png | Bin 0 -> 277408 bytes docs/images/figma-login.png | Bin 0 -> 76931 bytes docs/images/figma-save-local.PNG | Bin 0 -> 137928 bytes docs/images/figma-upload-file.png | Bin 0 -> 264754 bytes docs/images/open-prototype.png | Bin 0 -> 202551 bytes docs/images/project-figma.PNG | Bin 0 -> 136317 bytes docs/images/prototype-file-downhold.png | Bin 0 -> 214227 bytes docs/images/save-file.PNG | Bin 0 -> 90642 bytes docs/prototype.md | 44 ++++++++++++++++++++++++ 10 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 docs/images/figma-home.png create mode 100644 docs/images/figma-login.png create mode 100644 docs/images/figma-save-local.PNG create mode 100644 docs/images/figma-upload-file.png create mode 100644 docs/images/open-prototype.png create mode 100644 docs/images/project-figma.PNG create mode 100644 docs/images/prototype-file-downhold.png create mode 100644 docs/images/save-file.PNG create mode 100644 docs/prototype.md diff --git a/README.md b/README.md index 9993c655..14dae991 100644 --- a/README.md +++ b/README.md @@ -110,4 +110,8 @@ vim /etc/resolv.conf ``` nameserver 172.21.176.1 ``` -- Access the localhost using this IP (e.g.: 172.21.176.1:8000) \ No newline at end of file +- Access the localhost using this IP (e.g.: 172.21.176.1:8000) + +### Prototype + +The Jandig platform count with a High-Fidelity Prototype which aims the development and documentation of improvements related to usability. To acess and contribute with the prototype, follow the instructions in [Prototype Documentation](/docs/prototype.md). \ No newline at end of file diff --git a/docs/images/figma-home.png b/docs/images/figma-home.png new file mode 100644 index 0000000000000000000000000000000000000000..3165f4fba375cc94d2318727676c7b410181578d GIT binary patch literal 277408 zcmbrlcUY6nvoMT;fOJ#{NEK9iLhnTc1eK!FI{^|vdJlvuU79Ez0TBhHL!^h^Ndf}W zYv@V|y_YZgJm+`Ld9U}6@A|&ID4D%yXLe_1XLHZaM7_{dr6jvcMnFJ7`BY8$6#)TB z5CH+9CMhw#XPcUq7XR;>`zzJQ1f~7VzwiK&`{SoNr1<7XY909pwo%kjBp|4WCqD<@ zz{59P)C}DT2&g*#{9a4qqhiA2c-!e1co=A?OItZR0>ReKmJlG!(FKo9Kp?9Ca{*h~ zLp<0mAvShSa$LBEW-fL+YdJ1`F%3Zt7bS?Totm#3MB7(W$I92|?m+P09?w5RfcQm&z}D^{A)w%&X|c1*{(~>AXzl(7{D+A) z#Pu)m59DC?my-+F%^jlS;{uW6dIfQJ_H?s?{H5?`(7!~K+#p~Nh_$@1Abtfx_#ZJ@ z(Esu150C#IpaS!FYAtUmAtVU3f{F@=T7sTGEXe=RK$eEgvG_AghYiTq{Jlud%)j^{~KS&+0)AQ&r;-t|3mk``~Kp}g8oR? z!R{ZS{007%%6~@uBeH)G|A$)s->b^n>OX37@pNhM@jAQdI6FJYD}kN7 zz_OtKv-|%#m49Z3-`n_I4*HKTzytsBCJ-mQ3vt8yiZq@ZYXk&mx1K61>cGr4W=JfU z#=r`fphMzX36*D`4`*3-vs{xmp&rocUrxi~j+3Gog^RBm>2h}^WH4@-c3fT#Twcf; zfr-&szFGi9KbO>`__B{0=fkJ9J{=*Mzh3}6aZ^f zpK+037Yu{>JQ1Sl=J8tW}HlWT3WF#El|Y0>;cXXy#`a_SIa6?WI-y*W)J=_ z{IB+bDWq~}=oR02Y^P;d1&4O@z$&78@$Fl((8u@qXrOB{va&Iyr9cWw%6kcFEoP}^ z%KxKTPg;_q6|D=w_U7Tul$4aCFJ8U69^Xw^Gvz4u%8GmX=g-jkdTD#<|H<$V;}3Tl z{GdIkV1Yo!^U4Dd$ksvLwlFqKqosWsR@gq-O{X zl$UgU1-7njcu1EN!Qbj1|B=JTC_njl6QB(xQvcmwx%7B+?-f8GkWsmy+(BD#anH{d z3d_OIDj*0U*Lw`KMDbdAWKWT3!ZpDLxA}PZjydahZUTBdOOZ~3T88TYzKC<9U*nuSjj)cGGl5_rV-mttc)9 z{uS{D>h+yYto7UBKh)DW-f}^;4hTW`hi(t?h>H|d|KbTB@ccnoddmgr_Btu1F~BqL z53A^=@1$>)?*G?v(kA<-2x`Yksv~=%)RX6KW`*je4B!a}XT7~A2$CM&3IE3?dVc27 z#HloOuDae+NK^zd9BzKN6iSF3sQf3UQJ9{*7TqqFqv zfAM9#LlFHB>3{#K-~MAv|D#zCaUZ_&++fe|)-y6n2c7$y^{(zszEEEJqIu-qwtny# zi9~L%O}k5Hj>7-YP!EO4#yN-^!|wkTfUw-QiL;?0|n56Z?ZDUfgUjwDIyLIx)Fhr%q94LN%Dfx%S)dT7-1gWApEHN;_F?CV4e|eb4xf ztBbeSe*T&B$DqF^CB^nfx_>O{m)f=MCCi!#tS1TWpJlfnF<+BIs=f#qq(RFFEiZ5XWuY4VX;OKeLkdpyf;|^8r zjG2|70hX@m@Pk_01BIN@U$1MCU-9#ZpTRz1*NIQVjO7Rq#bDQHl^6Z<UD{>H!=rJ2pm}9|LRsAYm0Y-B1K4gHu~^INv<_!Ju3@V8SGCdt*O` z;Ftn=)QD5zr&n@zb_Syhn4D@`c{|!8r~zFu@r8xF$g2xncQ7G|ps1)0gUoL^oDX$< zLxZ`HnexNre?&j`cVE#;)xd_bOuhR*O5Hv=gKC~xrP-O+n zly_xRwaw{feWW8Aa9Me2AO1|0Rd>a_nR2av@}2ld)y5sl;ECOuIyWhx*@a@_ScwQ< zr{A`F$JYL*dS6PvJmrYbC2C(H$OqJ^KS&cmgI*dLy}prMRaFI5(J>}ui)X17S)zIu zOxFBvBi>)uZ_7Qqy+2c?!e$_=E%jyKfqr1v`}enGcRFr|2`z@moICq1GNnp5vj&_m zvH`l{PB&~6qF1xvRI2f;0x`4+V{iV~3VjZyog~_@<(`#UtHG-S+3~tXdN~ypv>F;3 zwoXn@1Q|lR7kz#qsg=H&IQe>+@(MGmj}nYKhEJ3-mmaRVBq>C@!C6^l+F!MR!{41W z^e3oxT>B1jWI#^{T2>Kd8JSQ~b2Raqcw(D5b%dG)52q_9HVX>OuEC|_N}Do!mL8fv z$05Y*2rafcI1)%p8@8m82PMv(GP65W=a;xE`Ptp%n)#Is=YWar6^UlX6!U<(Do*wM z;qe-0b1-mqv|;uDD0{N>p^P-h{HT5m41*niB}hdz!FDX|S7n8T-zYCEOC*@py5#7t zU0hs%Ha{_r3!IXt@KVFwT78^4Oi3Zk_qEbLLaaDKk-gW7HkYe#`=&Jz&8tb{08vBWu zgrsC|fJ0awZ(GdY3CB(l23we%A$cQ!%;9%YHes5>RIWH{hc$FoLo(v_SK;Z<1Ju>s zuT@3lR$W>uowvT^ve@G0UNVRrWZDrp;E&(Tcj&PnbH-h2cf-9Pu{4{vt(bygAYPce6~lot)m7GZ^QLZP zFf}PsGF1Qb?)48ZxUFMXJ2}oZCMv8*s90qSfWPr)MIMitOW*Ck-rfxgV@(kV^vOyV z2$&#o&7 zn5es1!YZ_tI?SVV-RIs)Mb8;Ch+GOsDNcJ{H3%}SKM}qSipi`WhwoNGP-O9%j%`3% z3;h9oQ_m#Nu-k;D#L3gO&JCO5vWMeVqoNKwecj9hEZ97ajAEc5Ov|k4vZ`gYkK#$- zk$2!2nfF9nG8pJTPsr914Qh(CFKeWChEGjxW1ItSXCHTP6|Y8`TZVHX->#2u*F=^O zvjv{JPW!B8>M{7sQe+ttGheR7Uy@!OI$uF=tXS#l=*<5vDyvRjOg46EO=;SHfW-OZ z5Xtb1(*uJF%P_j{w~fIfkv8wnBLa^jMnyjc$Qld2?OEz3cN(|47RUwzlY(Ajoyi+G z7h0Mb$q)@3R3DSe{+xz?o53~EK zXj$J|@KBgZ#Ae0-CMxuCmK12TbF>YAMrPFyx=l|YB57gKQl6p+GDc^u1rRe2Bo}|& zO0&so{XJ4tLT^`gV=IxdP?&pJ(|bc#zbx=#y~2JBXyUiiIodMn3NUd|#7+$A!LRT} ztqb$;L-NMR?-eq1-X+DQwK?eFUFcU_e+o3GrpJ-=@8JyTa9;f-&J0^lK=f zYTNRTCTi?XVE2E0@9DRp@Px6ZtyVH_SGLj^@9!do;qmaL1l1qI!&Wng@v&dtuG%va zTpa~o)r_p)U2S#mK$c`js#9;QG{T+1 zcD2K1?n_B%I9rrD;BJxH2Xfjm%iMSpWGbFb72X|)pN6xi42CeY!u<5X^JD|lM~LW+ z45#|uda{l2WvGQ&#~ACB7+*IX>K&@lqV-Kmat5KX6dT;xidHJH{4DYaxhkjk-2AWw zuQotSOk<$r71aAY`|5nPgxq6XgwVWwEKWk}%dI4hy>gdc+w~<#^s1GaJ7r-A73`rW zr!~mo@U@PFXiiSkouqp$uJmxThT&MX#m8vldSZY{IX$4%^sNu2yI{W0wd7)hH#aoo z6Nw2@x+7j|Yl_@0d|_C~7q(ml0G26U#4y^HlDBUTb^i4x9K!w;Tw-3B-cLuDXSf<) z|D_YKne4z`@b7KdPGP%XxZE-=+OA&?+pz>| zRiI(VQ`?))fm8L%+#%*>6tB>ILq1GY)*EZRS?6A%oIV!blfkXi-<*vl4Qn&yeJ6J2NXHUuSYg4*sT3H!?OZ0d1IHE}J(wSV)Z7 zEH<5OwdcmmzxL#m6OXz0nJ*v4c0Ny{SA?VvJZ{(X9xNkH$sl3x21*2aC@-D2KT~`D zJlZpi2V{ip1a6201tLDb>S*?paUB01Ue;r*~*9tlHL?JwnLH=Es|CV~CotGB#7vN^c3)RCnG z&`}eLjCTBCxAUwIklUd!x!87M-4>8hyXU)>6H)FoBV9yJ?xlb}yC+Do5|>b`v}hH# zx`$ldoUU^(*@`_mb>Hk(xD>iPAGn%+O=;W#KM*E8!5?H+a!~eH4pOL6DTcRqaLwDf zY!^MRX=TNa=l$=RQFDp@rhJ)93V8h=Onn< zy;$c?`wXXQ+?^~bA-yNnj#JQ?Y$&!Z4CHC(;Ut9>CV4j^vSRT>gOS(I@P5RZkfdN_ zjsd-tJ`Zm?G^bSfjoTa_weJQM*GHg;Gcdpj|p;!Tiel!hZSmzKb|Yo3G{5; zCd1#4^KRkeunLe3B4b$)wNyEaLgJ!kQBVnzs4$3I`q)Q@H1zJ&M&~k{h?WTTy1OC7 zS;Nc3FMD{FRWr(27&;}Xd+N-m4zHggR?yBlm&Dy}?n;bGs~KK?gW`|4utv4MVMJVN zRrP=b_HOo}HV-%%sP0)-U!?>})E?)SRV8Pymk9n7r?KV*TRp@_V{Wu;RO1h+=*GvD zRDGjJ3cq-{W=u=U5dn1F{IF85!~KT?vRyBP`S`q+r%18DN1VRDOf`*@+E_MxJoO%{ zR*)m%uFaHENjqV_M34n{WYB=q?=N9HH;}fq;C?@Jwr&Kkm!mlG`YN#5C(|>oJOT{Xa<-ar6L}Aac!_>rQEz{`}->hz7@*6ojlMLqg&REL+(LM5Y>#ahw}Su zlW}rq@$)_9hRKY8`MxLl_0g_bYw!tkfvIJ{`!Z5;u21mgtz62jFywufl}O`XSfQBnroh>wV=Mv#Q5dY-g!e6i6+i z6z`43$bmZzF3acR?_urXl%uO>{oYO5Fg@jd30+-XkZI23=%^k8{58@jRv_3%=&8TI zKX{|=PVn%{==bH_I**J7{b4fI8`H6-4c_3@!^ZK7+}m5vB?xQSv*?3es z&XbeFF^c7k-qY(88j$P3w?dzxUh3Ud9uIsU;>PNC_BhY&mN@E8P&ad};Rvz&3&*{1 z4BVCVp7Qmr+Y!-u3s|Zr=sqynChvkXJ(l^l4uS-=ku9&%h;@LbI66{eO{4yS~XD|7{Oy-diDNYx6u{X z{*Z9SfOjEoz!jzrkwjMl$vKyVA?6H!0*ClWQ;3h4j0{x~RT7RJm;@2fD0?h;#RL(i_ye>L#)? zRiXJN#?uP;_$aAOzlMNZuehbMQ^fpo`evA*`z417eE5OEtzWG}KLn4F!B6ELne$lcEZa$E5`YO}`F;P!tzW0Dr=$6XBCn+7bCp5fKpDH;V!fb)nlIT2j(}&@$!J7LN%7bi+ z&IN4PUE##?qNR6itlA;vt0FylsxdSMz|4tV zv6Lqd#X~Q*#P=z?g<#0VW*4z%9J&RdqDQ77fRo^W4qv!XV%&mDgw(sk^k<*Hsac=J zrw$}5_ZtT%>#n~{mJZE2)N`1%=S=~I=X~V`k>6w9ZtE2k|DfEJI5GdIfk$F*mUFt_ zpZgnc&Gn(kwElWidtjJ4$J?AHO^?HFA!da}V`f3y(qj9^Nm4Dbk{Tym#6JdQBC#PQ z3=F;OD-@rQO|M0Xj_Qk#`ZC&6Hl z9OX1L0yyhrnOjNQl03PqxWFPw_hrg}&}9x0%W6u*^q{CoPWc41aa7h}g5k6O%-SZK zvZ@04Y=ng!V;?VL+!nn)0=fHp{gGDSoyPV~N8CQ_x%~?x%f4asz&eC)pSd!P z=sjoq+WLm@)Dvdc403GY6J?|(;$j?qO5TbSp8}gx6JriXoL2UBy#*A<9p*+Tovc+i z@@_4Mf!2bjiib^v!wcEu-q3bEr-{u=y?`3ie zq0oGZhGv|RRFt1;yh;5-I7g3cy51z&7Es+|P>9K|skY?ChN1xCN!hRVSPoiOy;_}6 zoc5!34h1BH&{x-g2ACYq4{Nb0zA;;Og{&?Kf7% zCM$AQA4>%ea-j0w8x`*7-`lin2)-^S6;P#0zy5rCM)k;YDz5~#@lB3F&8FhGPhzno za1UI}dQ2POcXn|+Is-?;G2Oq(=`A{k3{zif#|3@!TZ!-$nhqc!@sbbeuC4+HM$G+; z(qH_Y!B>*p-mgQWAt2^L>C|?p!L-u|um0>c;%V?5c2f^sB7wsNiLiC61u{ufJGHx0 zJGPZ_&M-LU`^U7X)SjBfHCFceN#A%zyBsvkhCP2B zZZUU2<8*R*v2sHC3<~NPdaiHjq)k_-#2UJp7r?as_$+u6wsYbLI}KBsKR6T7H;V~F zjeZgyr1ZX^2rc4$iM#PWGvddjcxZJhNzz`%3;hLE8qOXn*3OlDTuaxckWcK*v$Z0tR694yXiQ zX70PoGVuyo?#pt`6ATFl#UI4B_9l0^YgUEY#ZJq*#V7f{fNYeEp&pTGv@1+vr*C*Z zeY4~#ZQe4@+t%{9+1;^b?|)0dXRVApUXyK4(X61|=`0?za?Ct11wi!gbdkS-m7NSP zZ=d+F37pH7GORQ$vf#?=tNsMqw}-PY?`X;HgpT;e=nKyH?O{e?;f*zO0S%sWrU5q@ ziz{Vpt6xDL`2k}oy%?sm*6x$&GwaXydR6B8UXCopU!PmFR-m$3RL-f1jFHYHNWCV| z@R|*D9=imO0qDINkKHr%o;i4hBgqeG_Avp5cO$!H;IAZWO!Oq$68Z#X55IeU|Ioi< zR^z4p&~QnZlY#Ya%Zs1P?{=RshSz+j6{`}nE#L{0$iBPzx#w5d0P~k{q}2E;=%g(@ zWA-=ppJO?*I`?@$^6Z^uD|M}e4V#C*y_F)hAl@8XL3g|{Ju6!ql|Ua>iY4@1 z7QwT^zIjylJI$|xf^HxE-!c7c#8=icZbL{gtISWvEXbOMh<{4_{M5z&fvX!HojNdom?q4lGVZtnkw-;->#)AA zTVP+TWUA7mbN78-@m_fbWIwbmviAMTUi!T(){>2nZzL?ttaxD**hWovwR8!Hlirhh zXBs>0{^}tk^hd)8;cP`a{}qs$R#69LkB^WqB;t;pQFh#A9-v2ocv zbza)TB`i8`a4P%JtOIqD=RxXA^WaE~-xF;$pL~)nwJ;t|Z78&XkySHm)FuMsr#}PM z5f@L}EV`4V$W)oeT)E;u(?r9|+vZ|}5mJ>7GZ+ot&GRWJDt%P)t=I=`gI*O;Q&oM( zz);Qm2sFoAs2)~Gg#i3abt6j`7Rv5TbWENjM`T?Gv$bg=vck31zHXHJJbxjcJ3(fF z^7C3k*Y~I0Iy%Nw+f?&_2zNb*T}Ap?N|hF4jDDu}foXW`FQ$<9w8Lq&b38aQA`QFA zr6K^Hd5?{?4d0UOWm>poN(`@HU^OR~<(*BODavm5--b%@FI;?VqxdEgA~`7*^Rc1B z;fOL-Ecce;o{=#yB*subD{^A=Vx{J%PMm5u`Y;8PZRQi*Q#&tzX)-4BC)%6GM_h}n zqIah3*;A5D=`dz-v#9wYi);IE=obf8+>tsg=$azfJ(p;ouNc5&$xYRZajcHa%{kxb zSab`XedC!b)o`<{=&9A%@YJB)?+eZiukpKnd78K&&Vy`vBd+Fe_p^G zI2pySHLL-fni^Yt0|of8oRu#=qK2A#aRLK}ar2cYkW@pgVoO51+7OlVvZbilSXw=t zzCEHk7nG$^>ncxQ(s0K!%5l8fN};+M`l9*Nd%J7QG%^}6`bktS(t48E+41&o`u^_s zzh%SW^@C%#A5EV4o?n`qg+B+TMx;S~W{_*X1(c4BoZ~|*ZC@oWfTac!)OLYe3Uq6eo9!qT?nizFH^ zCp~SOHaw5lYk(@fBB0M#7JOdx@{>cTxgdMcb zM4M9g-#dk7tmIVG(MEF!F;DlBuiE4mV~voDxY7>40V<+hAqriSa4C(0+-y+xBhj>$ zo>?We6^?TAJucXK=Q6j*@_3USmoFwSky4=TqvselGw|{u8o}~tZZHJqdSwCb?Pm$d zA1?@-H) ztV3JaT|D6ol=Y=t9v=UG#uY}AAJL5JoZ=EDSP|Dg7l3l3=lqE)W%K0^v-%ew(2yDk z^l6QS-e}=x_bNMYzB+4$9b+R(uJdH+%*VaEwrwN7$5@nMM_9@_zAo-H!#5`R=iN7vDiR0u$l{VYgv?O1=GLL`973U`&KZ_+OWO__0ovU`p(i-Oo zcbQjH2)`wMT=bgeaC=@Vc5Cqf`;nnd&AdyeaGJZQhSSwWVX_+6dbp){|COS0-(&7F z7j~KPxXT=U;+Doi(bv!c6^#yJo8orf5B?ExpW9>N;e0Q3op{xD?g(=-DzDpEJqcsF zG~kl1cI@isbX*feF?ff)V02-}IOSX2{HUn__y(gG#NJzaljO1*PO~W;8k=#H3rc!Y ziX{7r$$NE6^WJC^b;RLTm!|fmsU7HJ>n$Dq(D_(TPABqvfWpVxC2S{Ia<&TJ0metw zxh36xphm^S#5#@6T+HjiOwTadLc#U%Y^BOGQX`D-q-z0*U5#N%g5WdtuXYw!Ud-d( zi{CT>O zAERV)?UM%(I>4TZ*WT05eKs^V}4M}e3|NVO61LLEs zOF)H9^Eb)E)Mq(qBYZ`Nw4oed3kt;`iENMNu!Q6G)%h2BFTz;@_DrKbRf`5WS#3@85+P<7Y^R)?a?f091>VADbz1oNUNH7q+1`&z#YDTH{6s6VzXfwjBJDH2 zt)(5XAvo>&s++2Z_{}9=MKOdA1GT|UkL-FV^}GB6(ZV=+i>BK%t`y6U@vnYjQ>UcN z-{kkxHKa{;b_vGK^n&etd0WL0z_4BWwxO?#(efrVA`!)1XiDWJ-ExzpsAJ!6BSXO zD{v#RS(ZRvaIM7?2Uh?(Gqm+YH@6&Josl0m%LK;S_|8O*6t^s|uW(E^+)nEUZ?Kxh zJvWnJ5^3LLn8inku!y;~fdIs{0q=;Q6I@3&5^@iUPYWL2H1D!$@{tMH>7iwQstdkM z8UyPs(R>~hcbNA7800$P%Wpao1swfz8%d)qr4`=3P3! zgSgf50YgG9e-U7o>6_N>nomWXp&p&G2>I9Zzx~K$vixt&T}>>ije(SY48|`V%IqWz zOox+rv$O$icn-nzKqKAoLacagbz_ht=OfF*uvE{%yVKuCgGb?kF@Wruw=?;3n#Vxm z@$Aks*_m|@15=^^IFo>rWj$P%LyHkbaQAQ;am(%5l~Zdb0pncOGv?+h?St;OD-}rrDSb5HBKqP(Dss- zh$~^b3N+1vKS}uv^IB8+GCP$=xr}4hBMFiuSH!uJsoK)`E6MQCv}(R&(d;3o8N~54 zc^kM)wPQ6rQ$P+QFV4o#|!nW8F`w+7o4A$69TDcLGTmXTgw@{yH&KL#jji zM}v3t2|wJm+?k;)K!AkCh2-Tg?|ULc5k$Bk=HlYwhJf|?xnV7x~B{i{3-5fZsI7rHs+W#w%QGFX+& zEEKPaRjZm1-*}1;pupN1J9tc~QFA!;xtkxA`#6K%WDyji_eTZ%grONMQQ$yx)Jpsidv^8HA_wS)WqWQ0CxlnK?E091C1p^l@R0$t9r}*D=zDP%lpFzB=TP zpX#(!k&KO(6pO3Mi&csoaoaozy3@D}{ z$Dj=Kz0E@o9mkLibGyHnw+TE!fc~A2M_V%uuInW=3p2QYqvwPTu1%ZOQ^iwI|8?Uz z-%j_rv)QA#v+22W%-npx46fty;;g&*=!q)9Hm0j@-MK3^(0cajEB0u+8U^a`6?qyu zT-6kG{NXBEwfbv9`U%tows^K3fjVz#f^VP4scsjieHkxi2S|8!5Na)4mNdf7w{7uX z{ZaAd-c#g~cZw7*&QbH!@r_aZ0zqS*59lT8-);GkPF2grP|mcx`{wS|R1Pr4!RTd( zQCPeEox@t_&g4eQ>2%b<1~k6=n)UcfR>ejNaYPu{s0o%r_}++?}`kEWdxb zqUSK>#=vs&P!x!~lhv|TCy{0UY@fAls}%3mnU#UfbS3_cYiqWu-e;_`v%PyvjcQQz zVh-(6ro1G~dHyqu&8VS%CzlX95<>y@{!Y>?I~ius9pE4<9dsrGI~sR#h@-Sp6(-Lg zh`!svlJ5>!s@SdLzm*9u&n>yFbqIOadt_;@D&gf3%gz|{sSV38Bd@7n#*^AD@fm@k zH1-!UDs>D-;o6GxUh&%>at_r2;D;S(_?YZfxpKOB?Gtd06VOt9^!<~;3aG|Ef zIGN&TuW_2Ut3RZ+tKZ^tM~{E&H@`OhqD>Lb_2DLYkl~9Bj>H+G@+!j$nV1T_5+jIQ z_t`_2dAb+)#7n)R%AK2lel3TJ?!5Ken^nH%v{F)s^)0Lb*o#)a6ionbv%ko|=RjLa zOACLyl_)`yW_LfAa1FQhNY$7xuDUv>1b?fgbo2hEVrZZJ3tg59qoeEK+Dy$_Io8^X zuiRy&s*e7IzwHZOumeT-{9VdL+}TZ905k9rg_a_XKbdxlXPdQ<;(dMhg-zd=()wFT zdFs4z&25IZ z(Wp85s_&SKMbS&R-okRe>?r|`rwOp`bHq$6Ug9f zWUJTIzuwQpfWMEstEF{+D>i&Bav%NHs-|nhK+-O+m%eWXJQ^V|8K2O~P5gnXwy*Hz z$d4Gt*jU?QQqGRePUwn#W9v89Dbn--ta#bey!UGo(BbNBZFxw^8JKf1$k@HM-F#LkWkkvX;Eq4e1&C5RtXe*dssjuwOf>G~#nf z(%Su$lwt+I)m7oCI*eW3VXKYA`t)LufJ}@IFEnXxjiWmuj+!%F7-G$vt~ut+mtMCo z_*2pw`h|m~KjG)<1 zA4}`~$ck|4T1+SX$5*+&)66e9JKJ4S0KK0p2e&^bbawAC6PTKubXn?2NWt6Z>8@84 zKG9^<$|`#b>4Ts|G#vwx|DcAsq`rZn}NMEE+5=t1wxye6mL zpE=tb)zXD6c~1PDM8y*CEm7wp^KOujnS|MwHC!ueK73_T|M>>y8v7Du%NE1!ytt&5 z&6Enb!hEbd1Y4Hr!=R?8Xq^w`Kk%^*b9o~y`Bf*7`KN%P{!_QK3%t- zQly;*j{XYmhO#x*UU;NA63PvL^`{6NWN5VLP+# zrn*+@t6%mbTt{m6hqie&3<#!YW*j#qM@x(&*2|h_$tYnDl&o@3UY0R5POes>fQb6u zd3Op9VAHWBA3*><9jACq3xMREAGkUn*vY;+$v!@7zJeFsn1NYo9}EN>B1Y%fPI^>b zetk_b3e@^C_S;`&Y02OzmMW&X;ap?of?P99qGmNob0aTOzqXRYy+4gmEo1mbiqug5 z-Xla2UBn@-t(0Y|+|6hW9^L279^`QtVSw}60BnwT#{MddeM&2cT8yk_)q72V^BtDW))!h5(!Q$i+=yrjZIv6p_4H>- zjMeKqLOQ%B>Fzr*jj9mkJ?rp9^MyrE5mSqbAmYew@U5PlMhk<>7WEE zqDUhvj1|bn$YO-YQ@^Aymruxz%B8h~k`Rn<)H!P z#}eJ{1*sHQ${+;iiV|~IGMhh}!pZsSc3nz%88*XPE_5#SDZ^GJafaqfh4(P6$Nqx^ zVb3#*eS$+4^?8d`lzmOzH0eTxX%DnZ{C8!>DTI}0&u5b=i%qh6c1?6q)7M{>@f(!3F~ij}S##|b*Y;l`2Pc#C{Km-XyU7_~S8X{XX8%Y4a9W`h zdtdk_NoCV3ov{;IvgTa}()I4k_hgCsI-fq@zn))$uKzIwj_1tS66I^E#TWkw-50s} zWp87X*Fpa5cxGjD1gvyj+ZiN#S7CZo!U~n3#~ejM^UXN64(n-PU=~lNsu1VkLmCm` zOExwAvvZChycu0{%%bpNGzVD_dUUz6{`~p#d_PiI!#9H-3metEhubd4+u&*U0l85X zDYTH3%QR=atR*DnLlw#5VrC{2VESeNJ`bnHD-t<}!`Cga6iw{o?>fQ)FUA6^@_2}8 z{$%)Xo8uFXM|G*RTkW4hIPx#2FC~N=Z=53yX{oBOwTuc+0c9@Qk)=SAcvKl>@|$^<#DP%FG;RvcpM4{-g$!hDxtqr>(Vze) zzT2i4v-we)ZnNEGHDF%_qv$hBm_K6fPG+br6G_dga&*a6ft}#mS<<$Ou&HpJqTRrG zvg;UIQTPaX`c(D;J-!R;qZq)RY&uH*M70P+VM{|K%N;qh{8xBnccvdYNd0h}$*B3_ zM1S}CJsrS`-{C^ut)8Nn+G_jGowJz(afVrg*k3l;-Fpp|YhH=1GcUp>Ey#9qr^>sF z^SQDEMr8v@&x~^;Go*jkP33-}S+`eNF9qzJBeWKuA}E-=S-Y@cCRxZqfk;xlugJ(R zoxxg1A$ebh`N+hg}Vbm%U%>Pv&1EV&z3AP_8#bwnU$@$1l8tFj=kHm9SOMK_Lt zt+FnYieE12WThE^ZMvdx3U4{6(75zeamMsclM0meMD$hEJqlKT;wcFhg!+oi=|3kHx*PKAJtd<^mLZb=&q3wQe)cj{m75RAgh_h5C^2Ug+ zi_hEaG$Cc4^HS2bysdN%t~hOH^>o(_!@i%NGeON_0Ozyi@-pQPo8S4pGiu5;fUf2t zwTIE|gADKeWp59$ACoT>hoiknT%*lsRH?O}E^_2l@b-wF;GQZo;q+PR;7U~u{eec-8u!BS<0izx_ z`VO=z-p*gkoV4wh(5-NzD@Vgoay-3N?Si?u-t9&*+Pzg_`fX$LFU4Ye;pD+IFbq|^ z-iY%rqg&aUtSZ_@e{=O+d160W+`4Xl<(rt4WY~O9TlZl`IL1%G%zo#1!d&l#!%e@d zi=#!9`DLY;?B(&I-az_?34EM-TFr;kby!6z`}PicVO)p+yiNLjI6R=}y<`Ej>G zmqgPJB_I3c#6SQvc9Ck^gllcX@|2M6m|*tm@@SDu;pAr1Zc^DNBy!p}4%PGSP*veH zq3Ywb-ECZR3y3-7=ij{N7apR?g31~XCsU}dCxgtL!j=`zvD77_Lpmn2f#=xj=b=pVp3JE5`F_4a)s|-~M25ARe(7|%5i~xTA*q$jiCP|Oz7+fY`*-mU zhp^CFnQ}O;ajfwBHrc~~d`2R~(94cy0MNu%&U;V=U?>peqrw|_)|C(Ut~rsT%>9BS z);*vr;HEan{O!`cyq(&tM7Iq`w^FwkQQ&?|1}9jP*=gU~IetFhznAsd^}dhum<1*8 z`uaxX61Sjy;xYhrWc_oUo`h*;tmru{`Jm{2MNl^>)4Bs8T4bgCYq-KN<=mj!>% zfOxg)zlwUNK-8>D1|*s&Y?vk~OY^oAj8OI_t7Anl8){!F)|_aLKQSKb!pPL)shmLCwf)_-%s|zh~HroT%WHYS@(+f!CCP9e(Y7` zW-BrGRLe(z;~FA!34JIc+;OK?P;3Whc7IqX<_r3$%bZH$!$P9rRn+~;EK-hFo2P% zDx&qLwVm8*X;xIBnEpcL*K0)Ztd8pLt&T<#^-SNx*Tp84r2h|d?;X|D_VxXuAfN;g zmEIIoq=nwAf?z?gAT9I~L_)8D(4{vK=^Ydl>Ai&BNgyB!gdSQzTIe0_=A7U2p7T8K zJMO*z-J3BKhQqP<%GzbkHRpGJzR%lyzxV61ObH?=txKU=Qt_Heb=Bk1GqcYH&CXz= zN5_LsOIPli$|i^mKfEi#T++l#VTpA_r`ED;b3oH``*p{DM(8FaJ7md6urMfh_1~OM zk`QO;n!-nC%iL7{CL9r;f0y(~dQkqOQlm3it7+Y)<}6=KXKZUr@$BCBwRdY1ev!fD z_7(b}y9tIt%vybq8iuH-)zWHBXtj*ak82Pv6v+VrPj;Jpb!@5k68GOdkIP0LIu?AR z$Obgby=Q{0KZ@E4u)iOmDzjX=RPLHJQ63xJl)GvUxd}~D3Mohr{bTVWcgiRA+J#*E>VQy!EoNt8Pmgd$FPM42pSN&|IIinarCX@$dfKF8HQ)^c66J%l}=Tcw^BBm%nc`l9c8oKbVM z&&k}dqf?jnT%?2^Z;Ic8Qix@hGxSO8VfhcsS^BsZ9+cmZ@H;OQWXjZl#`Sou8shh$ zZC1c*`MK68>W32WrOsOZ@T8zn0_Vikvc~)Z^^uFnvsKI)Xand_AppIQKRu{tUwmi0 zOrH>Ya6|#FX+Anu)>-Fs3hIRUy_i1Rt9HPrxy|OL*p?kh;mc_1MNAk@FFGMN;26&W ztqIVF1Gr>{>5p|Y10czLfNDB_ zU^`qY5v|4(HkE#<-ATT@JMNpv%7^Llus=NIwj2aYvg@o&?e?qHUh3tvWnJ{b8`i^V z*jyg9+P7NT9P`gOMTE`c??7EtPaz1wkeGw(q(S8+SN@>)`}vx%!#eVBD=EK8pmelp zRR+we^=STPBdFa&(%B+Uv@U)x;V<}|GF>@(w*;LQ2Pt=PSm>W$?@7+!)^g?%y8yX9?7E7CPhH;O{QD5{cvm_xMYYOw3B@yJ>0^C(WK zf#|46jIo=4>^2r`=y?g; z1iQ1?U*x;bVqlL+S3Eun7D{w%)0U&Qju&VvOQQY8YGXvYv!>`aZnFBvDa+CDo`03? z4$EXDKFH6n2b;3ah&%O6+AYC9_HH_qU}j419~c-gwz!8>m8@r9gpX`mAw+~eB}q!x zi_@_+h&x)9gS@!brDmKRyaeawn}alCCqJYmL07a$KY|3Yy%92vBXuj+fL7Ik8|MpA zmG6L_)@z*f0*0`_&yPVthYNF&hfrm&8c1kzHRxp%wP6`1vBOktQ-rR4BrNsIPGj+a-C-X8BHORcpSN zx45E+C(D##J{Bjs>iA(Lh+);9rC7`JLbc%ln?wBx z!>uQ#_JDF0o?$tQU|`V*6o~A0ZVwRFl60q`f-Ea+qeX@v3m_%ue9rJb1%5u;622IR zWI&s~ttD}WbPv?7+{}MFmA9Dsbcf@2HGA;*5lv-6))%-?yb*$C*Z|39ogmPR)DxK4 z6nCzo%FJ=vY5Y2=Dl;%B=TGBCnM_~Y((AH#+o$6OUj~ixZLFQQ^-+n>?eHQc)+Od% zPIjwy4iStPeUcSkA_vQIEQ3~+T$t)%sWG+}sFSH1OcCC;)r*R=1~+&7NHBi<{NAJQ z;2qXAF-%hx*)GyLcU zRN9AXXd`&ccb&qnk#{}()!(bq^0c_hE@kzFfnDw2Fh8e-0 z{dM8w(vu?^nBj+7YjA6zwU!C|P5b*h9!201Gq)b4G^i9=`IF=KLPIc#A2pMFkPi!D zwvs{hgL1!u#S@s5{*Y?+!CKMDJev23_BX|E*)kK?4-5{5`@u+J7HM<&%=SdR+Rj@0c6K)6Pa59Ki;``HYIpP=-8xV5C2FAlZ*-$jU zm{CVmgXAwpC46EX92^%2^wE8@prlK=M!15ieF4WYE(y1BI-h z;xY?*KKCStJK(O+o4$Qc$;0ZSuI;@vz1ebp zYP7;)<8aWKARh!dTlPTfddSi7HZpXw}#Kd(+^8b#H96KHiTPj;!- zo9F7c2?YmoCmmf)L70gx{u6x0WJI+n)yzO~qu+7$dizZnnLS4vnctdG*D1AKN7T;c zf}@=CW_+VPMdM*D^_mxlMv z^X>2F!5U3oY>SadUrRPP$Oz6P=}~5pK|W~1Ai2emKK3hIb1kms#DKlo#~a7KiPx?f zm|^bBlE3XqWtyUPKO8T<+S;jPB}r!#-E_3-GZU~;53)mVeDWjk)PSZFPI%8#B@cZLF~oJyb*#45hU|}+clUy`!huj! z4)syS)MIB*wGfU;l^Wu)bS>^HN!oDf6C2Udj-xg5S;gP3symw6Z?yDU=POOBo+UckEjv>Vx{Q{)uEF2-&^zP&GQxWBAv_ z?}T)|4)A;zaZ?i_I<&R-YVqqiOVhv)(V?`oXLOsFX|(j+X{hT1q2b1^lzri52Qpn7 zVtI1(Fjq4D#_K2YO^j++xK{&-rRLEa)<5}BPoz!axucYMhF{2{i`|#*mmk75Um`oqIJ2Lob@qLZ&JoSdoOc7xhE7L3wyy-JRnUq{dMs zv|2BkVIqu;B}37PImUSs50~(J--&flZkoX+?RjD#xjvB%;-37tWmCJ8p4&mC~{xulPHCGTqt*aW>WuW zx9&8Fg;eEMBv&4DRNlv(&#l-Ba_b*`(vptks(UOC^K?JW875kl6R$3IZ3r#QeQ1kU z;sNT8%2c5R%zpMnhCW2{@oC>#p=$7ZYKIYDW}$L-WBQYY-QZ~a)uhv~?}{F1Sx0DX z@C!zB$0vB~Bjhwfr99PD0NEmVvUf{G?NC|u+IR-m6=6uI_n zjKdSd3|&>j^0S-Wi8h>cBGa7Ze8b|_)hP?$%DSK8%zl*-iXd8IK#4YlsdL%mO`AAl0!Xxllu-qE= zHWSxGZbZ4m_L6bzZZbVl1QXQ(Z4=-Zz(Wx0HyfT5LuU2isz$mE7Ul5LO zL?>^tl}@d=<4Qx+Scd)XdunT4bSuWvV5GL`+>tuzc+FA&jTlw7QoY?xBtIl_6Umn` z*Rdme{u&gCb>hJMD09G=Max0cEG_0T9Nx-M(Eb+FdF^om(ODQ0GB;ZrMKIW>)H$1Z zkxY%6u)x+HL#T@<_*J+4Ni~7+oVwZ!DbLi6Mit=P8|IqG}MS`}3;ID1PLf+mm(qI{pi{OUC%Shq#COpbL) z8gX59e1FEc`ny6G!d{YD$n7b~C1;Zw8wE5Z zE{xNrZAsQR{;L}~F&FY+^jBV*_vc?J9_|)b^LbD&^`;}9brIblZjf}ZK%sw77N(sp zEdd-GcExW6W4Ek`^Z!_8XZ;Lzbh|M)Nj5O%L~=YPW1s0Hdh@&BcK-Kb)w`2X4Z+fb zSbCAS?qocc;71nSq?jjMRjf-YKM}W$zOc}i(`8Rd`A!w7uUeK&m4PbHM1Lw7jF#2^ zPUd=MJyU4Y9;OIVjjEV?r;78=qjY-phNhEcpM0#ERZ$g<1i$nTTh#r=yQ$kSg5A=c zzj?~g;~9fCM<3g@oK=B-7MTresNzib$`~IM=QsO5VwlNIa-{MREjBnY!pc%8gVHRSh|0&`1>FWYcbPsw#Wx|d!zZ7WFMu}+QR^QW znYInUWYk)2+H~fsFdJ0Eh4_y!9ymZjH^`# z3vTIhv?cy+8wYPRdVacq*vQAO`U3{;=eTptSNlyb?^2W)UP_Pl` z`6uCp{a#@q7Il#{`iCN{D5*HLrdtGQ&N%XFz7CFaBGPDgb#vxZ-?zrL)*Y+u3|HvEnGp{4iEv2pK) zGRjP%iIdH!8Nsf0m^AmXeN=B#$CV2P4%!ocb0{*DysO|EV|2~8f%C~;rAb?qp=5)r zqz!h^(>CR@%o<^Mp>n-z&21j-@ggzoNU~6yM#}7OR$)ICCia$HN7q0?R{zXQrVBWk zYaQMgUwvi1_E!2$%N3(3&P2S%Aq#{?gvevFgTAni8S~&0xoDppsOq^W3CN| z#|$M0qI;R>9UE+h19t=RQkoJyY8t*=i}Zdo&BD;EC~#aS{l>ON)0To82LgAXLU6(i?p2n zZRWE7b0N#gdo@x!cfEHTjBtCNM(ys^g9v_N<8+0ym8LW6A10LBne>M4Ele12`bd$1 zwF^5YHMogpXfQvixGTSs-M>$)6ki)$XV@NqIpLBf)A;Fja?2t2k|0J;gFGkDP3K-eT=?oqr3_XZoCu*0ZLl%t{VinPv$w8z+G?82_5xXCL-`4v0N$5u$ zFC;)%6R}XCJ6{$Erz(wG!G36J@8%I3I}($CsggN8$$S zq_@V6v)AC*hpCftT{pO>e7F-HrWcNq<%F=_Jo}`3d3y@s<1OCbg%;>Mwg?&m>-tj zB;*Axe^ApQBZWqRyzjS`CXX+>?o>p39vthLMVGFc#L@efY_c%p9gH)(3{CeprWL-{ zd&tMNd8G_G95lA(gvMa*5>|(cO&?4dFgST9mC!ZAI{R4}H+)dTRUN~QHa0fHDwxdJ zhrGqGWb(ZCSZ$b%_G;%Lj3nUU%5{vGlMYS%wSB@o_(ogfXmGYCj)3R)Ep1kkXGUxbqg|Iy5 zmaJXA)yn3|*!M%5D_@l?NwU%YYQ81fU%-{9!7E^iN!Eu$CSfEvKUa#}-18&DQadjF zO;;1%kdnvRTFCPu(eiNNyA=k-W0Gl^?&ZyFlPO0{50#H>OU=WllilWdi%+l8NC{Q` zMI?pqy342HRj_5%`T4!?7rILF+*3PzumMcO>{GVkctdQ;*r?&1yzE`O!#DaKJ$igm zQ{kBN83)ql5SS($rRMVCkIodDR9khTll_ zeo6(Ch?+}m6~#MK#pWUbCT3=%YtKh31&d+EsF6_Tx|XPr)TUcR8H`{qUU4K*Ala(| zWcSXjb1jY{$XJ6q$tAT@S0Xvxe|3=|XusSAI@kSWHl*P`f5R!^=rrVW-N*1<4)IU^ zhjx!jSuWqBB}fT(-%}lsxm69erHfg93;=pVLb_`^3~3lo2($2X1)LOD)s_V(i+Dc{ z{&_jub&uoM@3%R!UgQGn?^U(WC8xV|a^sB|Up5h~Ftt7?r{o-*4q}B+=O`qVdK@#` z6A`Q}VHZM5ItU&oigiH}6*EJ^q?i|8wg8mo_G=2TPI%MClXG6m`LQ z8sl3}S&2060}IH!=3fll?!za44GbXIs>a?SlAo4Z1@qY;NqOT>uju18ulm(f%lYS3 zd$Zb{%21f)20!(r{_jj3I`Wmq(fgr-(hMTOulMzPSnci^Fd`}6;Vm^D5Jykv95o zL2V04!<$=*qw!I9Vp%$8W-hHtxeG+?!5(1-A zX&Abu5UU3>v*odagGWx*{M*()^w|dYokVXPvXs>pFba2@zj*>x`PhH=V^11;VJ$6D z#(jW~>&Ww06flqY0uX#JKDnG%nuX&o;GO~}ynoNgfBpR?^?zJ~7^_DYA&t1rBO{ZJ3y zA61R=sB%F8sOG%>12$~}gA(pyNWiCiC-Y(?VGq(1S(z`d+${wDEj6;V>xNmh(BDG> z#`FfD1`9tXknn5t-;eD{xYBYl0?T}clP&R^9cC1)+J7AixPa7E037`H7C;TZQalpA zwY3Gjt4*rMP0Fza4}qi2tI@U@PVH;A{C)CNYIksDK>@msT%0MAt}{%HGA=GorwXQv z8~lEOUxvpShW}^o{~C&V#%1HA-hNRctqYp=zdu7C{*UwjpJ846Q1e`NX2Qa%2v5w9 z$_yNP?p@q;-MX_a{#|pW>#YBo)r(`s-rTr^cB+-lL*3Rf=LuEjNR)Dd0wcnbl9K*K zi2jT`TNUFSb%=r(V^p11{nY$jaUKIh=<;sRu`lKWuuW4(`+`+r`9j~$76 z|Au0ByN9UcT+m)+rN#b!68aW&>nXqg*Zbw45rq72jBVxI ztN-h6_|KvKpJythTQuw6v;Nm`N?fAnw*#9VE6;;0<^t^RgqM|-wKDuO7@8O-E~d!r z!oos;qYW#3b#Yotej)PW7yo(r{XNWxXc0=^-&ZRBHE7@#{6C!U|7TzS|IKhzsH?loBI#+8DsBW2#>yV> z^72Of8}u*bmOc1j3=o7}Fl8^#=!1hbc|sfNU1w*`yxz%pFl@TBB&m&gM6pnDA>`Rx zW5}6Opr*sAwcoxM1`jP)qytBG&V5IeDxq+CvbLbk8TU*#I(*f&ez$&Q{}|_3Yg~@K zhEel6K?4s&sSb!Ox{ImPlfA9%#r@c&)z$Waf$RA{e$WUVOEvCmzT^{GFXz5ao_Jc> zHm3fs`}5?*7?HdA-JoI4V26=4g_apb1*oW)S;rrjcj>?V%fhZ%Co7TdnQT)qZ?*N@tsPfE?NCY{CdT#-GRo(65PwHmCrhaK{?eYCsIQM{AO_zOHVi!skA_ zt`Dka+`6FzGt^fGnUax_l>*RZ&9`r}ii)UOj0Zeyk@mVrM@NKFvuG1w`%^Rj>3Ipj zE#)rnvzK9HU}$a$AS*0OQ}AhYaqtEA|KqKY!~ksfWzKL)?5FQ=8xECr7~7Ni;f<`i zDmrTcBm=#n$CdXh%qjs_y5143Y#$an@H;K)^8butlm2iv#m1*sH{o%%T7g^2p~l5T zdtcdK8x6@z_hG`wo{6$~&*-wKxf@d_WR?DcB)Z;s+J*LMkd!r6>W8W}i(FNDPjgB5 zsie(e!sX8I{+H}IVw(SgKP658J&{x_lD=}Dd&Wb#FWdo$Y>C^3Auqw~N$+)+{E7qf zncn!S{b`@3T{y#$xTvTOCNd&oW@#{|X1iaekSMm$p-YAc%IKKkI^Rvh3$uIw{?X&d z9iOq#Fw_~Kuww$)$ZbgYc7cWVU(EQw-ygz4?&+@X?m&;=ulw_`vlt~Hs^3??JIgtI z>P63I7?%HsiNyb5MI~E@lZKoLrR-B9J*_B45zD#R=f%oTbs5K^*joB+AVRXDnu+5{ z&p4zK+h!Wc-_sRz{M=2Ln?->;7qs~w8o(4ts}!PbP8CHB5)oxjcJ7QdGP>Ey_|r?P zY{c+!I2PT4^psg}K~BK>HP=Vnr}1GMr@m^w%{Pmv0j0)ov&$GY7BT3t$s!r+t6fS3u^&fg%|dyRFE^cxd{R_YM`*#I3#{UY%;*SO0RGoXwJr-D8NQgh#!H zpy;PZz3YA>%f75Y=h7*|J2~H|B3tJq{4vlp8_@M$4qs~N>&!mpsVewuJX~|*RfU^N zc8(`QKq(&}#aqQbm}QkI-S6PCU)j5hMhkH+1&YiE@?)dl*^x!D2%!dsLf6k|ly8c= zp8$wfagkf{RUv8-+!L1*AI=SFDA)wX011dYU|@T}r&mGF&(EJI=UMfeBk__@eL%XH zb^NYO_i=Mob+y^~*{K$VNl-y*kl$^{RVOCWbkNoCLL2P+&qG^wt|+vXl*ZZpExVu? zR#w*GV+UzhF*IEG)`D!U#>_PAH_A#f8o--dGfLV8)uxh-T$)ZXkOdq;#6?Qxk3Y1T zSR1Bl`1mLoy5p{hii_(JC-@my+BbHuW z_vA4afQasiOa0`qWMlmP`9g(0IR0jyl=ITZ-~3_T~3emvdmPtg6yOb?)Olg;y6>4%zr58lx7P51k$~#&2{ifQv-Dy&ENrn#{VWtPQP4 ziYoP9Y|H&)mtlUgnYx)&L6rWH=%6&%J0QIXtnaw+_S<(m->&U(a00e90VmLxE`zz| z8xAZB*-A?8voT}*+8*_)znt|IueH((4sW^2a93V-bmyL9Ww0=m?_p z#=du6XNHK4;d;WaH`KW0$njDKH>#LUrqA&txavG#b1qkTcNw-Oyz9vp4p5SpT9*D0 z@zXIUO-3~k=E(-j@w&46Lv}OT(XydkY+g(PwiABhJ~ugVMDGy}ndep$hnl=q3cHfo z%-%uu?A{Db@L56EYWzTrqx{L{IzA+|u0u+Kmke2*i zLOSOAJr}7VhjE)~+?3}=2jIn0Aoy{g0y@yU%y1@La0+CmLM}wRHM_$Q2Y^!#@e|6h zl<4kIjQ5)p@Hu>rxX|{Ks&|3EGrE?AFMh-d*z01&b^)QR3ojCYogV@jErpKGNan(l z*gInQT9*~A3Gd@IAT%AXwyVCZLABbOjOt1=7b1dcqd^8(TJZ#%^@&<7MtjCu{R{Ci z(B?(Tt7#$FPxM)d2H&<`mf`V-n^zQHwgq30@Yzn8o(bhjFS%^mD3DhRct{j9F}57YJc0Q(B-nXT(ev%zd0-8`240VvEC&XHi$ z*z~W6Iwn+%n|MZ*t%iDVNzm4PsE@Fn-n2J8h1oN|R5CvIuo%AH=(*l{h2AJEi19_B zB|w_KJOjJ&#MO9XNFcj%no=7jELyuiGf?FUo0@CO26CglV)Vufse0&L_SPz$t1z&_ zdjqAVF?(j$uS|YP+PM7Z!zPD+YQMR{eRGKIG5IasS(bzFgWG#rlfJ*LM@%Q{0H$O$ zX>DXZj-1q3WW(r_bVwxi?(LQQM<}roW89XD&g)o}K)376H($I9A$fJPqGbbRtTce^ zs&jEi(K@{{y5uZdM@!5puc_}v4A!?vPcaBz)Jb_{4j|;@u8CnO1{hf+FFK8mVe3&+4lM~}abk$k%n zri-?1yuhJDR-%VQ7#5{xrRSSK!?m&qfEy+OS&2ZkS>O>mTK~5Cxj%dX3ixR#nxu9+ zp^t+F7rLpPE*SMVxYP~<{_&OIw5c)W#2YT&IMx=?k$Z^R= zAXn*T>G9?$Cy+VbzU4|8WWt*knH0k!I~cIE#NOVbc@-#tWqPZKF#X|usU5Gl5u@(x z2IPr^Blh?wyN}<$s)td=7wd&DSZkT}WJ@LLvigoBwGRw}cd9x+7F#`ftaS5FO7csH zHt9KGh+#=4qH4D8DR$=S?`%_?9-qGVB`tw`C9lVH7?xF4pWa}5UCLxVCY)_zKyq!l zkew|p2ax^cJPqNReIotr`uF6>MQr(iaQQWpYJ)dzD^r*#a-| zh~jPIz-$m1T)}`e9HgvWq#ueBXqsSRAP5UuRJVW_r4)ibfhZ5h03(ReYvRRCXCA!n z=FbhPo>`FhEi*h2ku<1+VNr`cx8pFSSNH<7Oi}uzDXZ!#-E~K-&_&}P7IBfq7Ldru-3;dmX$_8 z(TOH;QuQAeJsssr5w-e=^o7=el;~Qpj%|XW$M;GqDRwX~S%36O#GH;H$fvkw_8M<9 zG>M1scV_xx8=1s(|E_SwIC^{()(sUIzPeY+qMqmS$a9E-ncy>hNZPp7p)ogZbZ95L z*&XoC&gQXv0<+w*?U~!&(Z{C>!Ib-F5Py3R}n}wWgqaHbm74%9yB+}I4S--TyI_n0H?_H+RM5hHm9w}6O z^B@YL!KPFQ|KLbA@Vknh41oT`a2h-b5;v0^k8JUqMLok^4F*hMgate1whm$($Vzg2 z7}}QS0w+QIhzH-F-Ar2_6S-Sm^@>jO-Qjqr5l91FZqz$m;-t~kgz-zG)m1{W}`N?h<1lmz|^EFi-!3AVjz#%abYf-&1sm+`aHls>pBS591Z!Ewt;s9<3` z)knw~48B>sH0xNx!q~heCmFTT=4g57be5p+*z>$aP|3K_&7n3dOB|Jv5p(>eG3t)M z2s0ifn7mTw-eeZv_UYbpLp`$8Alyl4ui`&}@%@CWPeIS0Jui&yCfi$oj4=NKSlpZh zhHnOMz}e-u7wj5E5vw9b?J3h+_4b|>&y+?0(WA;BC?uyglE1*mN)(J}fI0vF3WH0}_);+n&Yl9^Jh$Y z<*cd0WN}sM+qe8jZkA+q_0pw?1tw*VuYuaBloGJL*Pn+)vx~lWAiFLXG`^G9FQwU8 z-BA1mRcicl+0c_HtA-diMye@}R`jx={PV1@#vaf&lgn4rFSvMx zku5_2vF;Z~6V3kAz+CM1facue=D|nE&)8Neps6U zq|4{8NPR$;7|Deh%mFzS1@gl0px!j79oSMFql5{3L0>_107{0>w7YvImiT;8mhrQ2 zyR2(El3uXheeu+$Ynu&q0)z3RFz8`m=|ROegZyjtK|zc=Y}BYAek<&?q(Xb_S21F} zs{BRwptjWW(o5p(+m#?KY;qF6?IBjGBn1|s;s-r;1heyMo;rxfmikY7dAdS|44s#0AN=_CK=$~(6pm6m+oA6(dG3** zvoXaU^`)LCB0Oz0qQ(`FK3tZGG8viB#89~V{pi#_>SBe6y07x)rZ$pDD+<@u(IA6y zag*a*o6*t++EWLC%aIlj>~?NXiusOaCXEby6w7FA;X`-%uN*M8^422lue2p5{qZl% zp(TsjzZKvW9ZR>^IYMKdj;VAS(>*rZogM{YRsZ;wF#F>Mcp5K)#H0 z!tW*;Jga}-6IN0t?Er~lZ^ZEjP6Mdgxr-(be?8JJ1f`OydKX;yz~cFDQ;ALxEmk@X z#}n`xsAFS$>8e1P*f=3P{338^5eVqLi0^RshzCSo!Q`HI>@Oatktd`SLTe{r{PmU? zHeL{PwD0!*D3KeVcM#xG$$J-y!d;Zoc|_v50~Y3RWkSCeJ%weVhox7<6^UIwvH)R3`iqYCdGozb!`#o-A-`+zn;piloBF$EfmX+tJ_7I&0(pzu~noi z;Ys`Ej#>0fbE6#L@KmSKgP-GGaqbm@kiJQ#Ddpnt%4`zm&4ayLq-FexVnfkaey0$A zKpK5F5NAU*3-NYy*44JkT~Fv-o9K%aNyMy+m2}U=E6!)%9Q;f`i)Ne}oxHb}A*C-+ zHtP;wtbP8<;H}?)Qbs$bY1ayI=#XhZ2=ZX;Z+2og{<&;Ld$KX*HtPFr+ecUWFNhUcLJW0rhve1tD`2BAr^_< z;nt&-o2+gVetGF0z1N^vk2u`IT(p91U=fl`u&dm9R%S!A$z}Sm|M~ucoB_zE775c; z1A%J`x~kr@hG(Rp(9Q9v&f5uo4-`Zcx_SteCm>MQ;UT-%&Z`w6r4iG8Y?rAZ%8KEv zEJECF3O3o4kR=7VT@G2gkiL(WS%kl}JyGlU7(c1O71Mmn>7*@K z{%EjudM=2o$N*eTJIf~Je4T86qrA?o3d=ei>J)V47j`hpCdIIQE?PDuZM-_$Y7tfd z@wxhbg-Lzv=+AtrJ?XQTjhSqf;Xi2hq;a!InEC~krZ6S^C|Mc+XKGm&C?*}&!|yDD z_5B0G<4t>dzXBUAnm7{yS#{=Bbp>SBGfjy;B~)slP6dLNj^7|cs;}}Jc^%HN4!4t# zc-XHzgnXRX^#wVONeS}pAwxInL>e`pt1U49eKynhLF8$PYyzYW+!`7EC` zrLyBuhvj0M7w&CZy{Tl7svD5@Eh*CB3pYXk*Xtsqr=k#{jfvW!Yu{`2Q>m3+RQ+7A zG?nb7YiyrM!aY#Zj)GLYi*d0tYFsow&YX1u6*KCKJh1TXx4@TOM$OC>Wf!sCQ-+0Yp6kX3){%2P9x}2xCgoo1SB%chYZWcHtF1^ z$(O-nz1NYhWXP6h0C+a>FxleUqT_H@qxj{fH@M<%Ytt~&=8pIhkUQ4n^CdxuPuT*W zj}zk#jS}G3@SO27U7G=EB!a*G?cxdpvP{OL>WPJ5_m(lQCTSn+6lEoqj^oNRtLZV0 z8xkU4a7vB3!_)RUC><%V-W$hTsMV?uCan+!qW2#zHl=|AkUQJEsnh{#V6)Qj1=DH_ zLax3DI@5!%(FZ+cyz3+#RKwCml!)7oU=%5N|C{GWAUIFqEfG44A>9d!4HT(|fx(=p zl#J+wUW<8A&@0_seb+{bHiz~0+LP6y!`X0ws>N3mRgxQkKdrtcA9Fmh0y7zySP3zu zl(^#8BG~1?C<(y+W*sMm7@*-sQxr8i>8WJ+z6Fz{GQOH91}&#kN3SwjNx6hj6z4y+ z#<>kOVq=K)4#}xW6lc}tDL^hcO4x~&^q9XML`qh$DOS0wQ{&F9Raj5XJ6sTmk?@$+ zS2q9o4Ag3k(lZ%5{Niq8aEAI=!l1}T?WUG$TOmO{ay39HC=OB`=?wMGiNr(y(b8-GmIsYj8oGqY*8_NwPNlDPO0paF~}+GJn_q9yo^7YuMX*! za!V&|26D(so7G3kmrP1&!4AncU%1`hmesC-fgV=_UQ#ZeXdlLQL$^s6Eeidr)U=Qp zr&UXV_`zClqyChzl{sY#S=YK!ltWR1>OU`Lb@)Xa`!EP`=1#u{(4adZ3oUg!`5lQ**X`fgpU5-RzmyYyD#eBQV`CzfNuPMD|~k! zNX`*S+TA*%1H8CJB_%^(TK{{^+2wzTYW~(|{IA&qe)<2n3f&qnam^<@q??h6g+*C7 z32^@9j`&x3okq%Sc2g2CN(K=B7bW%XAI(IG3P^Cm4?&fG?nLGJ2@|Tp@o|W|^ZSb& zoZ%JHW-N>ja5WDU`uBy$tBW!{hCm>IssRu^Uo@5?0DCBa|11^UcBy(i60rND0bF$- zKLsjKj5IMl|D%YX2i&}Cfj(UZ8XDB;?z2~UR||jq@WeI~=3B_v+Z*<$!hygT_f^s2 z*|U!8?0=N3@z=AzgMVjbX%P6IQU=N9?r1DpePrW+d56WKp$>-lyA5P7HxCy~g!1}qW&=gjcL zwGs&Sf6WYlT-mG}X`sq_NnSna%DlHeX?>-#*pMtr-dn(Xlj}SJbB5<47-bv^AZBAT znu8U#;1gRpU4(;m!}dPS+QCqaAgq{~Uxc(S{)ur(WV z1RmH+97V0RN7;;*xU7i7#%rm^_ja=t(p8f8PuHwFqS8DE#cnBe&ON+AH9F_TAX!G7 zA|V^qB?0T~WK}I`GGpMLzrG^pUv)ZO+K09qkLMqCDIqQ-Mv!(#ga3z&gfVHrlSlz@ zO|CgR0_Y;z+6*#bnA4+?rp{Omd8^ao3x8vNA8Hm!<4L3K{2xU;YH;zRfrdhQGB!5l z-Eq2XB#-aMIM4d)-?;q>MM7i7C0Z+UubdeRm<@%74 zwZJ^Wq)d9-I;&^t{<|9n--+S{iWQGJ&%=+`5AHN>my;2?0fJ4SE&WjgrOp&f#rk8} z@1Ni_Qg{BlMyPWL(7d_7CTVUlz7Eg_nt{6aewkmPA7g>O=UQbTH>Pv*@(c(4>r;d7 z9Xl1EZ2aL=O7d8mFfT`(*kH@5rSBsJHkgWtF9WG$E20M@ekU0CJr{sP$CbAxG9FU` zt(Q3R-&tAh!OxCq=2O7Rlld!~Q`UGhTPNaPId08kv!#q;0jgv_{?StxZhi4`)5Oc+-Cy$lo2UpFKWTGpc9xZe#l51M*)VMo zD6AX{Gs)ka2^hye`oa+<>$uo}{)XiKq)GHO(rKU!A*9t;s0eQkH-0LXpNu!{FJOFE zkgu2|K|I|p4gz%wex_`L7)BrVS-eY?yGiM^Xu5Xt?6bBQ&{jek4%N;y-Qz$fjYkBE zv=Zi3uWv+irrWpZ>IMJ7h6}lA5kub|;zYwUSGE83HU(DaPWaT2J!vhB>iZXp?s1g> z?YzVKY$m@<>WABTv|Z9j@++(%?q*BU74-GuO};h|H&boTTb!Y*Ns|>LxJ&+#@6c|y zT@D`0?(EPZYkshLF_P)uGjZ?pl>T*I{_oW%BsFkb_Wf$dfFjGW+uIa>`?eMC2sYk? zOLZAtH}|Kb?M|jeMh7he@~mj+3UmW_M=CP!B7!Cx$IvM?P~+V`yS9`m589%%q=4$( zJFkPrW* z$V)0B1xgUlF;U@!{?g8oT~(2vx@I05$Q_Nbb!)-xw8e{T^z8TL`ewO;%o|D)!~s8Y zI&_i*g;@WCRDm&+a7CEfPe?=VM$|9?izuLpN)gDCd2SBzd^r3L$8Q@@?yg50PA9 zq2$1DIJ)~4%V;Gr;LnbGf{sE~lYITk_BpUzu^0J3;z;k`%O?;TIHZ#_r#<0fZ!K=x zS2!56Jfp}s_?1V%MSIgWjT!}hx>DRWZHV>l6t*)NGm}gupmjpR%(+sdy@{ufar>LQ z5bqG9sY=@5%RfHalTh4b%Mf`TX#C=4e)TB`b9OXx(8NV;@}+{L$6$Z%yAgso<7APV z&}4K5_I9}&-6k?@`j-2p>7?i1QquprAoBo5O$AUC?E;MyI8OFMa{2Q^jM?s=-+`rE z`^y?WOczRa>wZI!QeoQCgvYG_6Y8?nMJci`B2*;2fR*jrs6RJ~<35ZFw=slLnQfS4 z)@6}cSa{dy$ks9(jmZp54hB4wG{MvZ>mQE#i{BFpj;!mwshm&t*%ei*Zs}^=gT~Rm zo`A6|AKZ>wR|vb~NwWTgTkp@rl8iG+Lx2znzXmwAc#`nU2ox$mx3PEDRWah{h@F_3 zxm|`WIBa;p`#)lo?7?qwN$EvbDSZ`ovZ!(U-W&S^6BGIjo{oTtoB+~r;|ItWlZF5X z!*~LbLswH6qnuDPBC)93fQyc`Tbpfpn|FFe7hRJ2e~<9olPfL}E*kx=G+X|;z}x@^ zvzx7)KxFc_==;B(q=>wy%tX}G)ER^Rv{wQi{u&vfXZyd{dh58TyY5|>25FE^5f!9{ zZWs{-rKM4%VL-Z@p^+Bp29cCT1tbO;xTpWk_&^PV%G@xwpDUVE<{ zE3S2|$d4*~|DBI~VId7**8s??q~`x&4zFzkP7h%B|Bq^bpGIuCubRzX?al|mSyA}5 z;^z`To{H%Ymi~)%9Sx%YjnYn6yM}sm{DPg4>>OMUF;BvZ`^BJgD0D~B}Ias zGJvrDsPf=HSWLm}4o^G9-9|_S>>c=sbrM#kfRI|Wym@y4V*QDx26pS+ZE1mZhl2h0 zld$cuBz4<%Eq1*tGzo+B%M{!bLa(h6lpE;L0j^uI{GCyV^Iuci%v2?MO9;(wv6MQe zxsyWc%^iw2=szplpJ^dXYb5ZO2RvkvBKyHcgcaX!E0 z!h}M?UKSO1Un5nf=N)iTs>C6HyD0enPP+7G|5@DiiLI+ePhiYU-~F7(DDWk_mz6Lz zOL})0@+=4F+J|b?CTsztVC`w+dbc3ffQbXp|Ld=~J@(kIMlZOJGgd%{Q@;JA8G7}4 zW%LL^dG8S!3#YWCf1#t-{jx(^yLl z94!IK*eO_4wPfZ?2aEOZi;g@VBrR^^=fLKp_`lY(h7>)K`|g%h)(LiYP%4ZMShm9X6?N}62=E&hglZW=U!4NIW{*QZcV&qmWTli=Vx=!8;I#ZX&9)9 zX##pQbqIQ|3#is5;7+Okt+!W2#rW`eaMb<*l=f(Ej?mn=R}6~jM?|9!6$?OVO~N({ z*jcYRP8Xbg0Wc&@k|Jr9~2^Z$w zajj?M&^?jLwlERqCka&8m{tB|;PGoqDuBPalL&nWhy8DfvY>Q^MQ;_cm)B~7mEbyJ z3>f{9mcN=t&|$;*2j{soU0HPU%Na0laGyhfvS|#^B0%mRrDVimI`O5-KS``XBk~qP zfoEdaPBc?wde1{VTTQ&kz!rOdvvFzjDCQgqn5ot0S4<7Vo2}4a^i4~f4$ z*|2APG`ula6@Ac44gk0KIJJFZ#QKI8Vs-fQ-Kc%vrJMH6oFYZQiE5Z4fJrXaUjpr4 zTzS?0yQ)RX7>4uI)yLg^CS1w2vb6ZJ#qYxaIpU*MK=`_N3l3t2e5pDTJaM^Y4UV9k zO8_MM>r(l}i;m@1|J~On@!dl9=g3Zf@D6g@?JX@dJE%iT{o(b3BfEPR^7@*uk@)vT zD_NyM9ijQU;nwXGQ~_0^<(dBeJogs&V$8ByQR!}nsu?@q8qFWn4GqH@4?wcu^ncYf z{uE9l4wJ#e87K=+-Y!$e;ibJx*hJ7=xC zSk=A%9;^&LOnxvN@Ed+4t_@W*Br-M?XccMza*B19QC`G%-Y;e<(SMp%*08h*SwUxW z{D=KF*nInkfp{s2&YOa2F%V)iHh7Ciz0o|q{UmIbF&YZ{J-AqqL+z0}r zIlg;8Op_ARwKHI&qM%4fIr3iEY^&flm2(( z>W53SyDN{Uzs$yxE9@;`_8L6RVTbtV(qXtlCDQ-){YNC~w*jQO*2ONiPXK|Ax|G9S@;XkXe!G9+jpbFw3j=(@7i%xI=Ap;I+oc{ywDIqNotY{{M@*BG@I^(P z?8~rhi2UtgeV9Oj-wAErarS}2cB~j}SC6gz<&k2|t@@&tmz!C1t`BM4=drsdQwVl?qM90A^% z?qw@yFgx51|JHv_esR|?!He5@s9L9ou;G49HwbIjcazm*eAOF71Z4!DJM;KmI^#wp zW__z%e5;sXTLp@dXx&S#0-+v1bg_zZx178v_CXp$ozWtAasR$XjiWT$=yQq$k_I{zNeFp(RqaV;J3acl7S_RlSs zRn~O%u1^6OeRjXAE<476?nIb}Qn~N`XzG>)Q1a8$>ufCX{ycT|08mR-#yL`JZt@4W)B2LEwwLgS z-a3%UV)n%YzfPSn0YM#S8N9n^K(f_7)z}cY!`A;4jiWVzd-#8URETOe#a2h~(L*23 zGMQQUVsNeeR<(3JhtD-i_!WvmQr_nXSQ(T|niATMsMabbmGi*~Vz+r?M?#&Xs-g}{OdU$)(V?C(E(xJmRMy9lUj zdW!$D0Q{YWZ zU;K|j1T1J$f}|gTeePxaC=x|VO4EgPc6)3p3_a?1nwX^N>bbI-6jNt8JYPELZ#M=C z;xhk_sZ)ltG_XolHW4nEzje`VJz1Fa58z%rs%)o|$Q?xWO%Xv`#(IiqYYwuZ8eWec z3i|)YyaP7HYhE$wnD>sqF!9lUhl$KF6ge$$VeYr6Dj-7j?DCkq=J0oSxvw0n`soa$ zeD5`2!2Tcc+(g~enc^DDJ;F!lyL>U28w<{~G+^ZOm4u%D8b&A2_wQFmxt)E12@n0x zgnMp>7olxa&RG}e!-LcCMPD|8;Fgb+FWqNqAJ5g!Gf(YgbT~)aW-)H&W{O`7s`_Pj zh{Wy9ccdVCToN;XS@ix5Q{BbDByYJ08AnRNI_bB`alT=YBd!9(rJL%;J!^&sPIdGXN4sW)F9@tJLms}NBwKoRH&nl8{Siui+19y0aUtiG5CdyLc$mx5h zX-1tMHB%CX5pxg(JC)YV*d2OF^Ji|}X3_$6WiK8E1qTOzA3kO$CwM?d{16Og)%_;2 z$9*?c`-}T3SII%$Fkcv@DL@Ota`whEH)P7)_kafhM;)YmxE#y$F9DcdAV8#2G5;j-|z)6 zK(gkZ^KoeCb;Rim@%)Y+IbZm;BCCYu!InxC_>fK8Z`*O~ZX7cV8XP%ts(*ikPDIiL z;>wZZn4UerTkb?mpXss5N@mDnM=joBYNMghOxgRP(Q9^ffzjYgQ*G45ZK~{j9Md0l zn#66j`2PrTH~#Dn8&$V2_K!+@hxqPOc(hjn0gldb*^`{&Dh}tyGyx% z1akWHA2IdGfrp7SrnsLcuV3H~{EN@pUSB*7$Xx%X& z`Ja7+{(p=w9IQxMaJJ{DmOH3{z5;zYlsQn&z1QBZaosD#80g!2n!3#{M;?lZ|98#* zOZd<*j)b-&#;TWdtS!8InEKIC)fJ7*kDH87wm^9mOytOQ@%~lb ze@&g7CM!j3DQfyqViNoM+R#C%&wPM^sz^XJ!iwQl5e!M`KN{@)|x76SN%(4OA& zQ~G5)!w6m^+3#JCVt*V{=Vc+it3uf8+-#-x9aUC9Ydntsx7K**><@gT{D!5oWitiP zqBr~K)AR>CvM*UL$;&%Cx9hYde%UHszXEpHmDyG8L;t(|YWN`G6;7!(Azv!@ULERV zr&+i;^MKVA-&XtUGRT9tR}VhE;)$f=sV=nwkiFYGPvMWhn7)uV#aXjj%jhhx0zLlx zs^iPYFf0WLE&ksh(hppoB*Z8#Gwye#fe4KUf_YL08){2GqBzrbam0SOY{^g;c|?ls_q zhtJo)t*|j(@iT?R$Jv+UVxH$3r67e&fy}}4{7<8c()FD5E~O^)1*0WztWqKoIeTs` zbPir#(*)fv3B91xx6BL-g7Y069m?pSXBgPn*g`iVI?$i2 z{lmrutPgH1<@A#+;xa)9shj7c2mDP74h_n|T=0bVQsjGks=gRj>NKM0mD1Chv6uY< zeM)_!6HkcrJ2!g5Le7uw zV-nZ9n^;ITx%;@b29U?ZOif5D(n{be}YWnWbA(o1udunaew>q|Ty*`{ zMpNQ_`3`W*eKHiedOhw416Ny$hq}AL8hS1;-wLWeF)&TZ#!XCdUc#$Kb;3#AyCC5~aaF(%scX+!+X8 z5ijJW504r{qXX7bZ@wvCWof*AhP??C#jfb@&&2f^q+~|T$iurpStqTrF#5?fhphMUBcKRk=>Z2vw>368`{MMJ z4%R#+IyVqu3#=Jm2ZrC#_tuk&k7pN!!+-eeN(eG@{Ah|S$KsOCl9H2dq^+bXpBOy5 zS{NHM>*=}!3w=tYrltmJa)s78kTkfsxLr%QNJh6^q{d<$wB`>ok9ZZLq!)__|Gs?mz5+hdRbr1e^p%%vs5$?PG~8_2z%4qPEZBjG zz>#CaTXr3X5{L(YN6zu{b_@_XzLpMU>Lgy+AIQH&*}GyDDIdxKO?l@IfU1SxK$bgt zf8T+MhK3>h`9h91&B*fAdZIc5p*aIde_vmWZ7LQ+e(6_#fMqmR@Z#)@zHjdQ{5+K@ z7oWj*hStu(K{RO&fk5;O4?|yulU9gd!CBFPLqlrvrfQFm3I(5&pD!pXD%Jq#yMp~@ zPoVNs-rT%klvJ3wu7!bt;ZtU&EobYDhqlRy5vU&KEl0iqys*Yh9N<~+S8+1C{Z(H`b82UJzrz`xiq_qP|VRj zyZFpRSV~rfzVD34^p8>&RfGX&$y|6WBSUp*C59UH7*l4um!8<$3l9?~$?)a!(?mP` z>^hR2-LWo1(a2I@xuMI4$zB>M!O45QyL#NgZds* zlxic~B^lnA@*@V`$eidDz^%=(#@DW%|CTPvE5uBJX&cf~Q|EvEy8c)Zmp_>iwNPyu zl0RK|qy=RXZyG>-TK4N3;3rm=mpCbQPTowfMyn+D5if*8f~V+mOx>GC1z5%{B{!8q zrdo`u^7E{+0Pv=vHzK*DtV}Rw94H+Il26>k*y20txc!m$Ibza{g|V#N7HMan0M^F0 zu*v#GyxSbwG06N$J;hFdzxuVEciV*|g2WQT5>v0ICkZ#yl=Izp9uu#Q2h26_@EemE2n6^(Ru#0aWp`1-h1UpwUc3o29NXCx(m9;nCDCpveu%i$FJbCoN> zd!qRwz4XIKa49r{5?x8ltj1y$pA)F6w|_fkrl;>t0)@UZB!{)`uNqjHJ1%p6kprXdbHzo8iOS-_%3Q_Q75S+GL4t{?4t3i=r_H<%+&U4?A|p)n zI^JcH)hgu|+ah`aulJp$Kh~_=n;5#6MyT}3SmR?m53NhB%O}{rf}#JQnqhqf6ROB} z=wM9i?~_O7WinWY>H>}v0R?~2s^5?lZ$b=`kFo~&2!gBoKH>&_`aJB~{0S6g@w_(x zyv&**fEA&`8d$ZijC&DPD3~S`Y&|cXiKQctC`NzCtP3giD*T+Jq-Foif^KN?ORnyx z4~0)j`qNFf(^%jqsVhS`kSd^+2@xy$FyiQroBtB%Jc9n*bp7|+o40R2aJt=<7Z`fX zSauCC5B)V|;lV%2!!$@u-<-|nKA7QGoeXkLry2iRpeb3m=vFQ^mw_$^!*^r|O4BCy zzVvrhpPJ9BxcR6=T=DZj9=WCnCC>^6y3Rm`a01|rizWjYvg3Bf{$Q&m#Yx2_#=8qj zt)x)GUs!(pfaMh{FO(DiJF2jN=?hPu%CdkZjwKba$!StwZWuMzA;fOz;$TVa!u%(x zo9POgXhC&ec-oVb@!C&QZol4I36V(lDfV%Po1=MH`+J)&6EgPoEWVtWOLsxiIqyFO z&FC%LxiAFGRE^-R2o0WEdh6?@=m6)b?bu@S4d5Q6K`riC0}|>)2=Sk| zm51aYYBc8kDXmY6)Q#BYBYwOR@h$b;@Z!YK321BF>X-W#WMDzn4MlTeJr?Pi{YBjg zk`1 zko|BX0W^U7or^M-M(<)u+s_sq*R%BtAX~#feI)&I^89GeTXd84Q^9f@j#fx1>VA~@KO$@lgo`m#49 z;t)w2A>eNZGV=RM0>4LQh~S%!UkEyo9t%-yQk`xrrTVEs_KTD>uSFy(>YYb^*((yC z#Kg8sfq7^*Y$c8rO@4b`kXzOajf@~8%O5;wpY7r@zjB=6)+g5$eLM3+`B`py5M0Qi zwTBC@HX5UzlF^Vb1JAUM5*+u^FzgMt9~rZx1*e9@yOchy^ZXLjdbt7Dv(hvfkKMG< zp)7+wgQCzrT|U+upo%y+;!duU3omKlwd8^}?g~M8UBidY_vT1C_jUnNSUU~5JLon& zo_!Jga3I9@_GT9XhToA6FK>cx8wG4X_PyK3?MWXYmM`S*&xmvY@rm@JpQL`Y@Fm~) z?SsC6-iqxvpQxeE>tP}>+je@BnO*v_-|nav$da28F%S7V2Rx8KdkeFHYAb+$f6fuM z-~^ze;u9)$H6eVSeX>$JJ?Cad@zTd1-++d2teAds^m_q(4yY;UP3jw3hOn6cJKvP- zK8KX(y$;d4x?zi?So;%zN|~m`$ug#AB@O_RQ6Wq@_Pi$liR4tTh#fDhHjWf$Nv zJP_!gE;sWVsg|xHp=6-(?wxHED19yLHb~8i{FB?J~+?s5`6)4ET?-u zBX`wd&*r5*&6+n*Cw$?N8%FQlOlow>37jQpUWl?+7OD3Y6K3rz7(G%vgiI z=^mnMp?xlzt%ClQn#Vx5-l|7;69xVcwu%t zi_8a<=6)>+C-^DRRe$YRniN03$*GoC3qX{A`EKPWT~Z4VzNPHWVLK6s&hkq$#CT2f zR<*I-KG&7i#7xH?zH{d$T&k_}f}_l=ES0xAWz?aMAIU=}q{V^#@M*NbX>hZlf1OQ*9d_Uoh@ldtat*^_M=ct-Uwb zzx$D7x4Z7cvx|PnEdQ24eAl&LIj;zu#=3hP>`TLJ?$A)#fSDOp-jgvCbNQHZ-2c#1 zI$8?q%On%&m*lV*WY5T0^V3iU+k8RX`S8&!mqWXyt!;JFiy!s}Ctj!9R!m#39~L`v zPgWR5{Gc}Aq)HP!nr zE+?NHGujW)2dksKg2dBetM42PXxb7THfF;TP8lsLsDToVHK^w z#XXkPt051`B7;S&XG``MW(C)OM>jx;TYmZ^S^J+JjyWZp&g>7_*bLnN=?L=K{P`&Bx5s5=a~KKFyis!B_HImJk_?C`lfyoYS- zVuydVSTP0~h%q?L&}fIcPV&aC+hNNveq8Yy@b@V-DLM`#w7RZ)KmA18qHbP#O4*=J znn#Q|wykdEWY}knZdiQ2|C3Of7dVY(?(>zifihq6;NdLBfaqpR!DyzE(`39mWKM`@ zF45hDE?aDz3JCioN;uG9AEw{iT?je9XyNu3HP^SjUbyKWyHw_k_gaE52Hv~joSNxM zGEage#U?ouE2qC|dX_D7+bKCyw>}~ik-JlnW4!*txxW=4Mt^2iC6E4YWncGev?N9o7h!86*$8zHw>Nb zZOk=ffw6Hs0)$3FC%Tn@aBIowM0;@Xr?}uaHP4I=z`S>m%?{|^idQ+6dZmA*QDyap z(w;vL&s6JK|08~Co#z4xq}BQj$_YAk0MyZ$_V}UymSi>luqTqALU-6g^5YZgYz2#T z&K$pAMDOz%?EL3A4vTZId1R5BtiOF7jiO_<$V`SuNtx(`;YnI?BJa!yGC4+Mgd@|G z2Ek*oy)VcU5!4?~W7@?2hKW%=H#>bKsYuA5UGmaAjFA*+hj@XNaAXwIe2FhTdk}83 zwsW|z?vI&!gQ7jm*K_PB+I5rYCH=nZhMr2_-{ssV_!}Elh{{ z40{jE#>Sd|-w_YEjph*0slGqAgzCOL84ke9y&C8~T3mRke_s}039*siEMYA^IK2x+ z4&Wyth0nVtd}aC1k6lJ0U8~xpt2DNi5KpL!wY$dBN+E?q`ysXQee|+}gM;A@&$<{L zJ6LazSl907Ug9hs#d*>x>F+0gqwW$`(KJwb35xC4p8SiTO_xn>(k}b(m=D>iO{pd4 z{DdyR$!UcD(RiA2p$OEbq^LHIw;ZwOxN>3G{x77zGOi59g-p?osgEH)h5u&TlP31{-55yvCTH8 zg};AQRM-!lQvreX?U-9s@pb`yyPlC{Pq&anYZXL(rrnbhJei;H=|HDXJ$$oUED55F znUWag6_DgUt|~@fy9-qN7MQvrc#IgJjxA@pet)%c+kuDJ2QJqGvzb&l z5Fc*Pr*bZ3?N=C-Zn?5}(R{w|31gfxhPJT93*|SjN6|=m?h9Ky*|`J|)kB|B0jnw7 zv`uCT2kR$^r2vvSX}dgiF?coQor6GMpKpI_{N&1erHr9!u=_3eM*iQ}bj@Y;A2-+_kfy=jr^j`;1593(Lmf%pk=*x^3WRe zd|{)4pj*}Y;4hrYY-?{WV)yxd2k*5^C-Vd0tcAp_Ou~mF-dNo-kLgM)U#cDr*llSY znY(C{uK^_W6@X|IrcYH)RE*K|+Mj<;)4tGl2qu(2&!&wQp&O;(of;74gFGU>nAFcODZ2#6&_JvbjJS1(>&~0Iv zpeEV!J0$SYS%A!y--WcU!i1nUr`h{jpTFW0xWHCkhS#}?6G8e@c*EOMm6}F~T^rN4W{1DEeJbzcZUbvd-ZxGJr^F#o$G}hKjFQQF1-t#I8Ums?jna^2U@+S`vcYEX~=nfxRzH@m(F_(k*f|(*zJxxj^K(p-s zRWRoww9j$q@{4IYT6k!@WWZ;{DYtZ)7C2KRZhpH3Y0Vd&+d|8XuZ0$`Zf+qxl|qd` zFHAA!Ys<_1V$@2vs3GMQ2)znA1f#oe`P;|6UNwHFGGPr2*BZ(x3`(k1ta>GvJ`mr* znYvX4S<|cRCLqqy-ViY znSV~D=BEYUY#~9MMft@A;*|7N^BN9{y(gMdvJ` zHs@1EDf^givd0Zf=1kNt!#Mligs4!*nad@1VrDXA{i@T!|6M)qG8fK?TIB3fW9rCP zgoa5u++qgwxGbWDP`isV;_IO2K$tC}mpGc2*1c&dcwtV|Oluie`aA^M21D&Ftw3*c zZ`=1SSQPqSVW8IyLx!l#%A`dznZsV`c>gHkn;(S_0IkSf9bJ^ z>x`0)l}PpXZy)2R@F%zip1aBX@qJ8}{S5L2clZXacexi2E!m$L@Nc?7(;jMnqa}GM z+OWHU+iL_YzsMRRURP7#=sCTZhv1&1RZ2z?#iiymd0y&j?PZq~KFHHif&tl57W_JO zrH}`)5r(AczF01xIjQ{yxcG*OA(zjO;FNIHA+Dm;)HosQ>3YPj4p&M#A9ay-uvSeO zbwA`?N|KT_SMbtB>jl6&c>PJh^(=%H^ZzBJwAHy ze1+#NUv_VcUt`q~4Al=?2Aa@@2{c99r_FeTde=Jm{G@=oOKc6B@10&fZxbAyRtCQJN!p#;$+h7|6MnyP09%9Lik1xV8&tpOLs6fXIfxZjmr>!CD_# z`l0#bz88IA$o-~auVL8Lpko){?Rv9ILt4ku8nj1TUiCkgWU)=%7E87J!itbVgp(@6 z`M_LX{3cw|1j9B_7|~Pi`hBM12m$!$w%ZIiZ`^d7=01au%_l2p*qn}&vDw1KN`y6v zGuEFyq0?nqpdEnnZ za*qm9;QjJzi|kE(ze6=5h$$_Daq6u3_X}JunZ)~t6hOQsY4}b&6b)B&{%T1clArF9 z_+3)p`_ZSU(xA6I;Uz9zsa2Ca)BT>S8L>a6H50HSbVyFQ7~j|veX-uyv*!irU zN(*6eWtA0W%l)FaD6_gXpY-g?Be{q%%(kj)vfpFv7eJR#UFvhC!2idYPLbu7IY)Xi zWKyEo@|$3(Z>0~3g6zF>Hex7x*mB{j-p(uQK23Jn0WRY#!wsVji%z8%3h{W01Oj^D zF!8qesOU!t=zMv=wHilGoHk3K&4AQRo9P}v!!yh4fWuXfjmU(=os{W7^Pas95t`#8 zd2VD}x7_O1_Ojzssa0Km%!Y~ygM$Q7gpw*(&5wsE)!@F?r#Ihs zN2YB4Aj(;WVk~`xe*#zeW^NtShN=*J@n?-kzuoeFqqGopI}l)!b$GRdgBIk zW@79YTXcexbb(R@tgeQ?22LoMr-;<4S9D*`s&o4^Y9rEh*G46=CL_Cy_MxxLxgb8H zxrB#^JOV3&GyioE^V~z}`Kc2g-U8;(G9sXmj z-&?wLd(<79%+T=YxM}gMQb=-0bK+2*vk!OQSlK|SvCESyRc~VqPCR^?w*TRIzbUWQ z#+ajJ-&&yp5F+hY>3el9bBW0eHj_#W@)K~bT*7Gjt9}QIc=XR+e1W3Ik!zr`#!YOF zND(b`SU!;o1TSGVyYf1@(`#&F*4hR36N)E&6|@Q|fJqcm3Gx6ZY!xw!!)jv7O&TQ+=xCDdz zK`d?gkf=9*%R4g0+S6my;DnhAq@F*ivCYltPOiz7i@>u{5fmg5E4jKZ^PI)FG&)1& z(o#{P#k;HJn%oWY^d!b$*?!?dA=g4vmcLAN1f@l zMmPqnL03RaO{B3c^=s%&(v`@`8K4xM+bn{+Kgdbggsz?g+w_Gsf!Yi5=opg^(pb5_ zij}bf-1j)!-}YNI{~cs)N8X}N%6O+)ph3gXjq%HYV%d*if7h!8?;7tUY_y>&f5`Y09@U z@!@1Xq->j!(l&8Xmtqi-7!SjHdxMEhokS5MbrBamOmfx(2Bd}eB;pA-zhu{Lxfz6Dvl`%+4=33 zo{nD08OSL%9v;HU7~>8!_p8u%G)13$vk<>1O+@q*)4Twz?o`Uwhz^YA?~zXejaaLn(0bWoACAVh!4@!3J0fiyqS*Bl z*gGddSz3CJ4QbNqzAfAM$T&0>5lrAdTO$9{X19^inHaJ=t6;bS#&GQ?@;V)PRK$)l zVGBGu-#q-|dCSpyJ6C+D-=9V}_*>(#lCAA>-|OX4-+eh4JErnW*(dk|%j=25W=qyg;{s=%)LUI6qxeS!&}*82qqaBA;#3OKW07#!rDOmQ-M!q7 zPCN`ttQMDc+E{;}Hvyiy*PxcU&{_GBQOA}~(PlopE#zWl1@g|Rp^l7Qrb66rNyh7! zD?vA?Pyn2W(xmz`Thp|{#w3k;NXo>j@DcCSf&dFb&!U{Dlyk1(#N!C;bujr(owlVt)`k1Wkks&;B zu5XRTtkl0k``$5-*kB+6yzohx_;Xy1HWf(?l`h3#SFxslEN_z)6c~IZgwm81#`F4a zaBZ}|vX19dBomr(>Dln)IAZgUuL&lW6G0pG`1_w12wgncaOoDFthNh{vdO7q8J0eY zd85wou~Fp=z= zlRgY|2HkONz}4Lz20I0eEO&Y`AY@bfXj91Km(X~4t=Gw?^ctuH@N3p=un%rz(?RRp zC8Aq6>#E;#Pe~CfJb8!AxZkHa6kN1xaWg}khbmtC`(WNI7|KoD{c}}mJGITwwf`3HSPZ*x{I5y!2Tc*e?l&b;{jk+ z3N6tG44Q&yU{5o&M!z_!{eF+b%4#os!mD8V-k&moMK`Lnm=eqo+-Yr$X7|Au(@Shs zq5hYy>05}v-W=R_ax$XEu8%9H4I|tQ0%dr;2jiq0`aG8>rY21*>R2P7H@TPS`qsEA z|GlP5v^s0|&4Os#wwwnIEoF|tXBxf9{Jaukc8=?W)YOpAW6#AaM5mQ)-{j9$&Qm`}-4%lO+%GQXX7OYM90OAZ5m1;0P_8F4|< zX{cMYw=~&Q9&?fOoI?C0xx7osi(K@(Gab`dQ#aRlnYf%wlZx0b0Zvt+zJANXZG!$+ z^1=|V6UmD!BoMQ(-91rc7ugw_Y2gvuX|JtY^j!2V9;LY>(iVueVf!m!TrK0`>Kc1) z^1k%@?eHy1-S1|{xSI@mDZe{cKg@4YO=A7bxX+y;v=Hak;qo^DqSZ*}nLdk(%&Ez> zbvR0FF-2Aq>a}#2y6VBGwEmqe$hmonFV9WiN7$#{r^oODb`0C~|Mu{iQm6+BI0B<-MNU zd2QXx7gl`4Fz@nSC#d>ey(&3Huke49Wj%WA|+v}X`MGp8cin*!etHni@*jiAX^TYEPfnQ zn&G+Hr@B+!`0(A2RFa`!_Yy8X`S*(hYKNg=!KgymIz@;S=MqpyP0L+ko$$$zzgFM6`gpG936%$20` z$J{@kDCfJ*qQy^m#`~bMF|$8Zjj`TSPuz2Bqod!{{3O2O<7V2hTTgZDLO5Pwc%+ni zDlY{{pD*8(<;0spVe~bt{f9-2jBoV5&JMoP0UV{C&;>!*=M#a)C%k`O?&#Ep3I#Pn zs|N3B+hKEgVl*cIy{0t02_aNsz_e-pdYq)B-D1a9^(NspE)PkY_Mgd#3Hq*QUHJ(q zU8Y>mZMO0fw1>+I1row_!y%Gxr)#Zkr^Z0gJ%KgAwa!6+iJHw3fQvT^H}>|LsJsm`f!%_9fCH_kK&0tEirF~iMMSIz>#oi4WqFc=)L&h;RP!_YL?{`VfvcWEm_ zz5*4f5fotKkBRS{_SluW!x|~fCdnjeB{|Q2%y}B^rPBDCUZs0N(i&wc>6(vth+x?1 zKNU{OXRCo>u+@K@lKPOEUlCl=LlZQW*rSk9tCK1)fuKEfU^rg-LyUg z@vx&9(*A*+!%4-Y3W!G2*J;bNoodWm3|Act4EYk~lErPy$&%w{I`T&>HZHO)au-&(gFmL^_#LL^A@Q%_i`*hkketuP_ ziNVqArNd%R{Alo=-@7(pO_(uU2|H>=n<*iW?6(Gv+&jMGc~UQccq{(?DqE;L+ohiz z4hr*yDye=Ji&yP@&!Ee1(>gle2aFwXf>K|RZ4!8TW))r%pLhk;nseyY4?l4{m<(AM z3!@>|VtTIEP>lLRhQo(jnc*Pvmk(CtbaNP46bUC^kOwHsN~__!WDA9idx_`uZFjqk zROO_LYwC)$xkA{KC&c<~^bo?se{?1|s0iD|_7wTa0~%#n0058yD>qM>j9C!H`#aBT{r7TASMjiRSN0j}mfeHHsVXkH_a5!~MIRpieHQQ& zo3Dx5N{1sE>!A_&VZQh$J)B~$#19(={Dzbiw^YwZaj{Vb#U?EHv*JS|E; zL0C%T(^{Yeg~BxJ8+WDOIl1=pWSPGhKx_M@;va0f_FnrN5R;dqxvy^LCo9c3FrvSe)S%MBXsHptCNi!x9ZhhNQ zHgP}%#)wL`tNNwV>+|^5pZ%|Dg;5xfx-Rd?EpB{!qmU6|^9 zI}^SOvEp)Vq@;mtRmT@n*ZiuWkGKe&5?_lnE#)r^PKq)s>TKmUWlh{3(N}>o2$!l% zY}eg(`IXXHF<4ZhE7c<6R!Wnyl}G!0whg?9y9I^7*RFQMD6fSr7^gn%&^}_Zt;%;{ zhq!<<_QycP9{i9P?o+dinuszlf_p44QNU|>cxZRN=uwW>Ww^hm&por4Ih8Syv}0Uw z7>GyPd2WbI2@N%9e?MX2=k1zUaeH_4*2-5%l{wC4=U9koF8WH4r+>g_%Z2dHt|T}E z9=OR%4~GZYamQM){uFFKu&Rm*-NE-de>&Iv(03Wms}-Q(^B;P;W#Exi1AI5X$pTF1E{E{IU$45MD8=U6n}hDk_f5nh8=66aA#pArhap7+%Mu9o zT>L)HcGo_9qkfcABpS69DHw)UQ9tlRg^K}ge?tXH`WP2E`Y8LTfPZ3L1#3b*{BF%% z;>7*NysX~C^l`^gF3IS(8z+*cSNbfHlaWXC9-?m--%Qp>6Ms8X_?7cwDtB`LT$k-t zId0N;uc~JL?d0Fq;liRT5wQo7-MUm0x0~FYUUO1+Wg_Kxm$GXO>8wAuE@m_X4@QH6 zf=*`|Deme{xLE`+a+yhq#V;GQ@k|C&J+P8LNc%WW4S*mwPm)8g5wG)H-;zlGagJn& zZ`O@v7AxB*iap4T2ox}{nr$>-!ahVjbI#JnF8JC@oH&EEV-^ej3}EV>KKe`}!oNN> zXmcx(F2KY=`C2~2an(foYUnK0J^w87R61<);^$gq$|HuV>EP>Qrgc-ogoKucgE$U> zb%3&!>_)xWw*VVqp!_PoY!*~F%TCHYP(XCSUX!F1}WexCsdAk;`%8_7;2J>)m$ZHp8(r zB--Wm+Cq~j%tFPmS0iY+l@D^f=rLzM-RN4(X6y~)R34fH<@puvuDCBm=>OGF`&_tq z@sD;gl7SSpNFh*@Q~hY`40FviPdoPPJbsAI-`lT_fx9)|!wR&V@ZeCNmH%sicaFKS zL>&)FVg4XqraMI}tfL$+m1gL(MCwth#?xd7wi;m|fdI|wjY{^$}B6j_;0 z-;Q`^Wrg=`YA-5C@N*m<&aXlT;jgtRb;*rMLKoKSp9c;1)1cAXW3G`OxGIDoY>YP; zI-mfM!yEZupz^A@&3wRUjzjQt5RI7z@y^wN}>dN=9u>E>B7F#?z5c)r_sc(IV_ z5BIAq)g0@Y*NyNs1jdehu_apb010H2%c*#bb-%`MQWO47<^wWY`YhF2jT(gX0VEwD z`pvgokj6YcI}>IapF^jM*Lj1Pvgt2du{kd=c8&uf;el}TGCQRh)P&lyJ;}3#533Qr z5G&N=CPpR^gt&8FENx{Y7>R5ACPS7YMR*b=Qc}tJJ1&Z@%O@`H>;<H20pC_7d{1V`3*h@7`q! zOy;e|AV0q+oW?hyPnqMP=6YMIUpNoBwPwp_OLgG;g4tGOAp=4EYWS;YC61 z1994FZXDK+8mle=|M4!2L2X`8NFUb*g3xUdD>L3@7#p$|NwjxuE7W(sy@_ZKpaLHk zWNq*4z=3|pQq6132mC4Y8?J4LAidgzPZwds_hT0g88T^j_O7N0BxAsp=bE z20ciXMjQ_x_%0!1EG6$?hm6X)0QIY>Q7RQRP{a2n_2UGreav!qh_yK0iu3CKW9+S? zqWa$WUqI;;q)SBU?i@r)0g;rBVH^gO?wSFll$2(qLApWd9tmk2X_0b3y1VYd&-ecB z{pYTA*WwS>f_3JcIeR~Q@8@}5?{`9Me(W$g!)Lpnx60gJ5W?3CmxQG4a)k=8P|;uN zp*^QSTllh439w5xsNOts<+y0t_=m?05dVjqXuJ~^ugk-pf*Ra;CVrd)uAe8rEMsn{ zrS^8U>e(HD2RW$wj?vjmEJkTi5D$>o&XKAiqeUm^_R>Rf;p*wp8|LSSz=tsrdQ#HII#`cFW;) z6LrgP#P6!yb2=kkGyE=xlQ+^Nom8RFe3#aooW(C2?uV-&|E_%K-!#jYtV7xdFD+jH z8KTRo_oBs(@ycpy;nfTzKIdzN(QfB%J>#3y{V`0^?|>Z7fRTWIBdV#Ib%6i=DR0f; z52~#lC3{>sQ(#CS-%H${kc=qrHXcGK=t!^__k%q8U#JD`uwY;BU@xq01sZ1b>h(W{ zk#vR*BjJJF5?nxlzRX^H-(x=P?>$~>;Ste%xj#UvM8zE4T3a~}6fwf?MbuJ;Vq%?a zZFVfTvCXu}^|!P~)E-;uh#)@W{`GaVDR7?V$XV&k(pxgjSCNsC=wiZ@h>jpQ(A%*;zh4KWd6kwO&CQvC`h^$$2rlf7o28K> zVVB#vp}s!dqKMD++3Ma=Wx(7NgEGZR+UJpQeW~>Sp_lz;w@)kLei0b%8)#^V?Nouk z?rKBQrWZ#Ksj?Xn+T9>q$aovX$P*ZkX~w-B;tvRjhVQP}&u_~I&XL;tpa)qx(y0fL z9clr@QFYkTn2rKd13F`me@G_{^Gzmly6M|=g8LQF+hrVX@2o z^lK6JS4Q?-8O&>Wdc~JN=0E>Sxv~C-MJAK5vn@<3E_}E~B3oIfvHTITyL&?&h4nZ$ z7wQWh;(;ifFPb==bX9qD4JCXTf&cDqAYPyH{kehV!d;^X?gju0&vw>PQU(z zctSywusssM0e=L%YS;ge-Ky8Sy@3*f&Q7$>ukCwAO;bq4Fn7|30v$p-Hr@gi(^pXJ z>PIK}36Hb?LAj4R-~m_c9iw~5{4BTr!2O{oI;cU-1zYDHp~2fO6#&T;7`whcjAIB+ zNkNId{jd_*xx8nE3M2I%@%s(2C+%`mG_wB(XUb%3zODF=;#5$E0uaIjK5k0xg>UzF zEr&W*^;s_m{DN4EmTzRp{Gke?sl@)S8-ryF;_Ih-poRL3wZ8v8%?}6iWIpoA3GtIX z8LPP$fkU`rW(tt|1wm4A)#4%lzRAc)aY=HHG`?Q8G7=61-0S?WI}_>K|Dp={|DsB= zHzgf0wu4^B9$~f*<>?CBLZ*O~kQ9Uh;YmQi`2(QEfN-H`VZkEd_{+9oX=&+8W!0zm zJZB2dcW=ji&(6j*3s=z{RTG1(1(1jQM>1eGJ>c{ESvfUr9k* zB%$QW01eDDJw07iSt)6TKpa!&eQVGG`0}-g-CxT! zo5C0MbbnjirHu;ChG#DTnmA9dx@hmc+f^7q`x12h=y)yCXjUYv z7Df?vol(U0x@=Af9|HJfh7tq(7TOFJVtqx1rLL~7ZDJDf_3b1>@Vlg|jd*n32&13tHwpt8Vgh@CYR4>A^Z zUMqiO?NaMoFm&s~4!mOmVyp|SO_V@Ah+Cl`{r^Dv0wfpLem(p&roVB_4q$5uQ1yb` z1o+ee{V(Dayz-D0!5yld6ySVA8<}n$XL0;Txl)Ru=Z` zr;%%wiFUyCehE+%O|Fg~@c%B-J|A0F#s_$QDRit1rJ>t282KlCSihKA63pGtk^51z zmel|FSZNCO8RB#1!hs&zOykp+7XibKXtW3(ZZ_`+$DQ^2osX%Fo)yOyj%Z=bMjCFx zPpwyf8j!Pk{I{DBg3za7b5X3udsp5ZrxkUxTR^xI;1>f#`n~eX%Si#4SQYjzOa_#V z%yqsHDZ z7YG|W;(Fr@9OX^;LCYZ4Mqw9dIR7!KwZGC_6JD^ zQ>k;dyqMVQFU-_y`pQ(tg;Js)Vpz*-;M4f|OYvLs0Kgn&TGV30p#NE9+nyb#S7tNC zCHo?bM*iwq_Hvb+zD1R0r9Qn}*6vPtKk@O{bd0_hAB{cjZ@~(w?tGi+ zf>pFYRN)Tk&f{fmwjsa%YOEdUow27;(m-MT@ICe^aLl?m+35|sgZ~3|fDc_AlALd` zy%OYq$$inN&W7>jNUTi6Zc-33#S@adu*k^B===U%xT`Jx!dZgL(5G?@Fq@8Q>*?-; zAM0@y0&+|w(nGLJJPNIuoEDo|J@TG*{E7OS8WCnU1bDXk=3CvWycO`S>yG@7U}O$P zX#j2auD*?Q{N{B0a5^+EixKE)$rIl|UE^;&^=i9niVXFsWuB&ev}rmFvkV=H*e0$9 z4H!%E5Y!r%;914co?T=7Ol}-TaOVXto4@!Q#~r5`p1LCW@8c?>!V@fcn5135IRgfW zs;fa61fIH5sCu9eTxfSc6(_{6OZ&-MeoiBw7#iH0#!M-rm`V(i6tf>T#OI^}1viP- zn~kwnGzVtm&^kJJn}a~KOfeAdG;y0_~>;s;Ny;k-wTua7Sk<@_j2nI|Z5 zoUGXwFJr>TcD{jfJC4wuyyOc%*&k|H5Dz-E)s0xme(6y`Vb~b7M6GRIqmkA;HWv@_ z;Q@zC!MzustiF4^%X*T&llBlKPvFEA@gbFJT8o&^M(32M>&-hjR*ct_nz@$tJr$Kl znCqtjr`@f7Yc!ERj-Cu*))H{vowT;M&ue>EI~7y6>62;e%#4pixjdz(Y%WBYNW+-g zwe7wOQ=nW)P%zlB{6gw`ALlX@fA6wO6lW5Q6VXkE6{CGMx+{Ar zVMgUQ)^pQ^U?W6X9YxjF6l?A;%skUiV-d&cAW z)05t7#(}{$@(Wg=OV}kRTD`?`({$fr@60OmVA>G;X%k(YHPC*Cq5m#8zoVTwChg3t zX>@soI4GdqKfKD{|K@y7%Db52r%s z?Lm!60U?)B11u={flFWTs7afvE>EQQ~$@oODgUY8HFXMxXU<_cwwh>+oHqx_MvW+r94zZ?e&mE7f$?rB0%6 zfW3tQKK@UA$GtoQp5PS4F#dH7VEnQDe@}^0AW&S9MvOqm&?9fR{>C zxsy}_Y(~H72cZT&!`a6AdX%3E=EN)_0JvBZQ8cWSupj35(retnaPhW}S(x|?=o1&K z(78tU6;kgawPW-ww0E924ljqki?|klJ7IOQJ*R3J>SIZ=**xmv>1JS%RK1Q%8V>k7 z_5!|-mgfX-a&laPulTR`gK=aWp273)9=8Q*Yq$X_D6USv{7gr0f52$*vv3g)R8d^f zH)21`h>XaNmCoWG4s=3*^0VYjN2wuffi7Xk@BAQT=dHzZ^QT1sganUC1Id?LxoIg+ zgoOQ6U{8;#(pV?{v3&*ssN()*`qHrA4gfzztgP7NK~Q95`1AgKxNKA)J^wnIr)(%# z+{hnSigH)GQ7PD508&{xsS5xbXHZ`(#390$GG16VNq(3hF4D7@ipxVL}pX*#d87m zbREqTrtp#N9`|RhYHEcPhQTtXI;2FUliAf%gd29EMhPX3h|}|!oVSnO?O9RUILd7D zsX;xsOLz?$?{zEBQsA_4KO$P9V%FzR0u1aznm_U$Vvok zuy+69JcuNGAf)=z5CUP-7TY*tCiY(3lEZ1|y}*cY#tRkK_4AhYgq7G&@w?nrBg85R3(N#C}vq$--$;_F%CZ_v7}kOw0=B%Es#E6HsYQg>njI^Xd|sb+sbFpzNYY` z)LJu7B-yadJBTM2#JqIRfjKj^=3OIKmA@K;pG&VZ^nc9HWS{MdZ3J?c#G7}tKXf7f zx;{+~L_q%ZMh(OR9vSM($YL9p4^I)T4q*(qa7=T^$W5R#H75=RgPY z+vb6=Ljj;B|28oJ!r8MtNHKg2Hp)DRbUAh^KE=3owb=ez+2kxh)d(@K^wx;V4dkXY ztjy!j26|Zg*O4Ar$;iR{8PLVHL5WVg%rT75ivdFL_&Zyq$mohA~AJ=MI8+ECZM#}`zV1#B0 z9#%3Ed}>DVn>-o0cXlac{+l)o+GbDw8{eXESvrfVP84k=^&3AqVYTUn`?+S?*5IWN z`4m}8k4P2s^sAPa_Ut`*tmxc%|Lq}e0$%3p7eDrPV8Vv{-ub(&sCFPHxu5j0(X8U_ z6<*oJk^EY15-}79!|j1g#7_?@1L}p$oSy-q3ICPmbns~=Os=gRSV$`J2d(880>4J( zk$~xB*2|^}KVzrtK-+r1GW~Q-aq)@XR~r}}^pZj^wiZBqj8s z<>1W3qhBSl0K3(15LUw+ z8IrJ}Tj>OmZ46%IA6U^P2LqU!*z`-V^i-YP6*Y0LGMRNG$DW6d6VBP(Y ze3F~GGp2)`(2*dV;`;rSPr7fa1q0dM`Cc8&DIyK+0jWE_f#4bIu>Ua6;n!9$Kc(VbYQeB6sk5Ryo6GI5M?VA zxHrtEtV?4gx8B4s)u;)6M5UvwU&y#;ry2DU@`F+JA@T{2SlAf10v_DPTi@5%m_Klah} zSDEN9@{XKkIoPL#y}~q_^k?B5;X=|fQDg6w#*Ong>bk-xRDC&w^84wC@G0o*dyR}p zGx>iB>PW}Z7eAw5+ZpVz7qIE~zYB-x(UG^CNt&9G9`-bk?L@QR*LXmqAKc!lWxzsZ zO_RbvFbfvtyvL*$+`LD4T5ep`XkZpg>ZvR|F%$cNTO3OQ{b2Lm+)^NV<(=NwT2zUQ z+8Fm~%d#!YlE|#+k!NZ6cbaw7)StU}g;d(qp{UHvA&fg}S=Vm%=YlMYqW$Hg7JZ6h zynHsvMaG^6h6l0A2||irCzU08)bNEVzjUrI#Pex+wC56>WPS^ojI|s8uBpm7I+_=wzFS|MRT^DJR5d1~fnQ{T~V zbJ=~-jYaK6f)XagU({dNGvsw39HGw?0b1yINQG@^U~^qI?S zE6+ojk`PfZF$@FUVns$!hQV;?Ya^D8OS&v@ksQV&Ij-M&CB^PR_S28ck}I9n=>p^j zU>O+_G}~Yr#>P7gj40!z4jv3Xg3TPl+F%Uz)n$V(d0UV)%fe2{K|Z$m1p<<@flzBY z2Ra+Zs_n8n2TLCEZqMpP(MZxOZ_8;_6~T$hu5z#d%w844>!@J*tYNWw0>S!+WA_}~EGEG1_TNe;CWVV;O{ zD8Hi5IvdUEO`IJJwyU*o;k0M%`GB}!Tw~JWJPx?7jN{nI-4JcgFs8MDeBw(>KCyp! zUd?2$Hs^T>H8*BW&Z>%%gPE=LUi83}Pk2|=vpmK|?hSNrl%+Yo3KAj@Dq zSP};U)48xY5Vz!3dB^Fb#RP6~T78PsBv-GDM_A!_!Zra3Uk_Bam9y z9zcF&Io%SrXGkHoS@hcT%L)}}axoHr~ct&n{&k| zVc7tFMWuE-aT_jS$~`jc(`?q{Tzl{J{U=}72GKS;IAak&E=+j5?YW_V>(Z6fbU7Z& zcO3f`f98?_9__e{ckIG3s64XQ&4at&l;~tYSiMc8MMajuVf(s?K9p6ZWbW#ZH@n1q z!}Qm+B-JCBt28r|R}=4`V@%B4eAr8Pc(wmTv17KntBtTD_Fc7YPS~Yt@RjP0`grWR zFpO_>j1%w=lnE9)?NZk@7PWUw{8qA_TiZ;lJMq!x8yFOomnz$VLBE2i2s-iFTL=3% zrKYe0G(C=ay}(Kik0)NOJ}|s`P9kx!*yq||L*5y%B-D~Wt7A49QvSAI$GBo$1ZXP$ z%e!3lZt}e`_kXR4@wEDbB7w5 zgjrRj-#AmncCE`3S-!&6)EXyS;d-dVOeY3qvoMPIdS-L?A_gqus91LBYHzF;Ebfut zXSkKLDTSBSOh=eTIK8LH^hOkAY!uToL|UXX@*Ihd)s}kC4k6Poj(9CS?#Dm(3dn?l zHt#sMD20A^eYfMm3TO+Vg%!H`3@yp~$ggt&H`u+DBHya9t9~h}aV&C0-~yQwH?dBf-2;I$fNBPYcDLCY}MTrn5y`j_>4yJ`WzRb|Eg z{z}#~z75h?qG!25w-^#vwuBU7fBaqfZ(c-myq&G!I|bYAPAkf-r5ZPXAVS4n-_^rKGIn0{leWp8 zF=>15o4+{gJOM#@b2hWf7Gyuwr0jsZPDJM$-DTu^7UTO9g+unZ(tNVMEGE|^h{|%4 zpAHvZuE=AW(|2|>&s2;%yxkMCT2#+aZP;k5_FzmdADI4>sa6g-B6=_(Bi2v3k|phz z3^pd~DIA0tS*-R`o6xKwn=~W$!}p{2zK}ral0#kN!Kt*fNf@ZFyIcV)Sgzl?4jWag zwfS<-DJ~&`%W~SwY9{eRQ-!_ZG3V(eTBj%G2D1v58MFQ@%jjlDFL6^Tm}k}vIS)B` zkAWb?S_&?L%m~BIs>_W6R!}vyF;Qy0Ai@j7%W+lfI>HP7&GxF79jhOJGA$(K>z)4tha%mJg(t;NLf2u3bC}DCma8@n-F&kKEnpbgc>KNCKzUBic^w zh53IQf_7R8-3KGLhK-jl0Zj!TBq;0gZ_ysGg+1*=oJYRGz>t{etS&{ei2ummPJ96Q zrKw2;Us-`Ag-AAqKT!XQR$$qND=I!&bmkyqmI(oHO#2B&(5sEg5~VQ=z-a$4 zTwvGAI(YbgG&c&fE+s`e&G4mAu_%r8YKskXSb5x~AkmqAbJvGHa{aKmMn|UvFR0os z>f|W9xtw|~czG8uS2e?CAu~+tk2hacl{Zc4x|Pu)3lTO#0jESO0d>~rF>64#q57xrx1%uQ~s;B1B&w_t?xpC~t-D@kR6++hBb(^6!b71qK5&bEn!z1gi@N9xCdc=}k{_nxTGP)D0Qf7VT(WERqo!*eEum#Z7U__Zr?@2iMDue8sgvwl+s zaZF(m3G`gQznVl}O3%2@|0_`u7 z1ASQ5F2Fk*wwGEFcC9Ihj_uVi+Gj|*kb#2&_-a*q9|H&H5jXhFku(aZN|_NzOBM%t z;z7LTkRTKDUGx4EF6g^$eC=ah)qMsG78EG;#1R7GpZ>IZVY_pKkbWq?-`Y$1&X!b~ zSZ)P(%VmEnIfo*&PqjZ^>2_WVC0$mS_S`C1R(pF4*llg*rCT%8$Ebq&+l?gnsRZv% zgm2|+e7;agOwdd~gxHB%)@|(GT+4nY+myV7B@|UC{*K*wr}7;Rgh}g`#_TAVWk`=+ z7}`Ody~=TNu&v+h??rz@i&_&)6aUe{Hw4Xv_vX!Cnf2pGP0Yiz1>YMqv!JgnH7A4Y z_R@PdVL}S<`6gK@vk;pnfmMQ*jO zi&E&7jtCF^wc^X69#Bu&GbTcV-}miH=As`K-~7y0AD?$5=e?0yg3%>BrgBMA#vy~9 z^S;LPo*UV(r^9&W8}mvox5yyvuoTJnfBsSw=rfY3{LJqE6iOM}#Hva1#@Wdx!=}wy zVrHbQA0xzON0LqTtb5!o*HQ0blK+`>5Q8n0wrKS!={d8=g&}aDiWN2dzQmAS1YR^( zbFFITh8G-(H^R4p8_ z>^gOqc?mZ!RG`(@a@Bl>5rS#!#i{2%BK^7AAKUJ(sZ<{~c7imx(QKc##c)*)#iUFp zBZbHYzE^W8JS*q|7E2rX?Q!VCrfsC%hM4HpUxH;_pP}g?&8!IHa(kOJA^4El+M3%| zA^Mi%)Ye>wm(gFIw?CjaW1g+ryDBDq?SHaP&2x%PKE}HI*J~U3Iw}nO1?_TLis6{Q zc%(-L4Qr-I4T~v6KQQ5F)&1g+j=3U|SsC#BamC)RH0+Jpv`P+cGVS+eAfEQ5#o5Sa zMq9UO2GSALC+z+J>#-Z8mj(Qoa<~A}RlRjC} z5M=FFpY~~1>zlZ%ytC7VCln#XYQ9%pxgE5iP?=Ed6ug`V*;T2e)Wjred4efK%d`-t z1y>uv6S9IXHoXR0sj7l|sa>H1MtyvMlC^+z@uQ`C3QvC{qEwjPcap{`d8BWV8R?cl zUKGmol3~)dw#PpL0F&A4=Ck}_;(~NveZ!Iys0)qR1l>CnGaUnS?=!0jS?yNCa!=0q zy+^s76xJmQ8K1|5SX3U-Jqhs}EeN*YD((||s&~hhaTg+E6J(wwT-k6JS6Zv#r7`ch zeNpFo-#ODQHsxhPac^*VmKN#jTpeZh)!%*sxp;D8bgRw7-=ceSpK+~Lm)40CFpa35 zA%BYNnK2i8X3I~$XON6)UaZ3Bn6g?n`Lo{l`bFn!a3DS3t7e{B>bTLtHc3_eBgWVe z5|q6C1QI#HaXoTr8S_@xWvCI__u{VA9+|cK8=QnX9HVsOKAmMnkLLTrkK)S`SfvbU`bz@o` zjg1iHX+K32S|?olhK+Q0oX*@U7=RQMCVkR>CQ2^DQ?O=)7na9_?g1+m6rbwzy}>+0 zgZ(o_nXdkR>57~5(F$gdjz#uZI@p330lme}L-))kO?S6WXL~&!Vt{Sk8r;j2@LaEx zq9y6QM4oJ(!;)bVO>mEfL2teTvpw(O8rNy1I_iV`cgYbZ2)+(CnYm1RwQCWF6~%lm zv^*8bfCTs)fD>fkNF8>9F6*V~Hg>oe06F5L)p!}(P~2W;TB{c+HOV_x{hStgB&qz2 zfCZ0eDhuq*8)IeqZ}cg0mg=^R#TnZP+BUV7Pt5tD(v@Qm2B9I-jv?^JG82&=Ek=h| zU_U$Q7qCOg>vKWyT)QOmzB^OaIZ1APt2Erx(fvkaBo_+0oeJ{P95eUKGY=FCUrssN zYaG{4Wo{Dh(YI(fW*O65uZz^cMK(IzSVS$8gTQ}BU_eZ{__6m%fOF9!6TL9vH|RIy zF6D=;O)Wlv`2$iJv}4RfkvRCBV!!t{q_+2-Eav0BkZ8Z z>J)n_LKCtC?F@R(E(^}i43JtXr!t-KU=xB%F(&mtfH(( zdcI+uIOztyaqvSGGza{E5ql-d!B8r{($#MxN1UQ5}7J zUHnI>C8tFD#|OYNpuyc)P6K6jkNz#i=TXq5F+_`0WM@_G4l^mgr)7R94iA{Qp=u zUZ$q_h&nWh(hC?n_F#;n*Id$7jmVNeI7rf(RQJh<2*$7#+qY|XOCA76O|J=+lmsaF z+CIGTeq2Q;4}> z#IlZX=gw>hLNlO3__k2`baXdQF9p7R_QSFu_7&?n^N3eEdg!f1_>d*~OIh^ru4LF%|RQt!-tsNea9kNEL0;1I__#wXX2L-oz%&9HW!7rFhR< z|I*cTB^!oC=#uXbq5snBKK-?(`ds?t%U(w^Q5O@7GR%~*$+uUS`h8b&+8s+VT8s}1 z01I-$|8QMq9yxnQXup=LDPdQT2@6ypNt}Gp3l8FS`}HPQM3406%Ff{EEABCu`wBT8Zh`sbU4P8oZ|}liedQ~u(-Z))6QNOAJ1F=;YP{n zcQH0jr5&JvFmkP-7%&dEmR!h$4n&6+QZRuC0!j!v*B*q)n2wDV&j1#R@0*FMva% zkM7JKH%gvCi5YAsH_$Fao*$A)>5Lf#{lMXrQ*B(@J&xfrrcvdh?$ADY?w+}+eDj{X zEnS?el264YhGEw@y{bobA&su%dmWj3>FS@?t6T+LJmli3!v>Q5j)PV-fUrv^2*uv(A**Gq%jjyk zs9t}h#PYgp4O5w9QZEvahkNXS5KH}GTY6D87>mJ3AD|t+w`(K^_Z!QcyQLRx^tf;* zrOu@GL%ColK|bWhEaiikAE8mb=OQc_5_PpKnz37bE#6MjEKuZ8CfweX$5k3{Vgwrv zHT`S+^3wFRsSs({IK<>!m~5a|0&HThP#3Occ_S|h?_t*jpe>goXH4s|$9e7VsDX=N zH**d}iea*O$#dp!Cqu450SEqudvi}ESx+Ht3J0aV7_fAxT2KrQJmlRXyJ&Ea!pMSbax>kx?tx*S!SiK3dYd$m}V|;4wMTf z6ERH{iM>CewXsj>2c-DglP6oUWHOV{B)#oAE4_XLt6?L!106CVa1hLwm>@Ye25J=$ zIFi1tmq|D$(6Xbcbi%$i;`WO}Nf%}Dp^g99Y>ZC%ph%xh>hC4hW@8fYSo#KG;pzPgB}Z@Ogog!2Nm8WN!S zYc&PugQd4+z|~RMLZ0?(*upJu5%T^Oj`lspoKM_hbeS1UJmOqjURyIsZ4b*lr@+WL zaGD^{6YIRfnH6LtgyX#_B)wH-e413qJiLkXCuy9nXWpJROL4r-#$#?!-fuixFg3(D zRNR!=xxr0G|5Z`fG|6%vcQGEDP8yNZyJ!s@S#@n)laP2hP9~0{-%+x0843A#j|3p! zt<%&;05d)%!c+$)qnWq_Xt!-g=#rUaM9t4^0s3I+G*w-3TcMt7?nlRNXhr<$8Q1;3vN$o{+S}%q7GXf#WEGmqFN)=yAw4@iF z&Xjao4G26%xZsvVm^l|+>h66m`G7l2DbA(8wIfE7_ba$}usLu01;O+2V~)r-u$N>J zNlZNbE*+4~&H+I;_V@Xk&ptEt32;5Fo5l5LUI=3_QcY@CAF%f7%rp<$|KXol)K#+q z(>;mNa7v?cd1QXpH{ep-;0dv*c)ZwMB>4dxK*KOWohLMqGZSOUhQ^YMdiIo5`@jvX zLzJB~brbZ>y7D^^#H&H{pEt%amDP|A3m#b8I<@BZ~wDLtqp6 z9^2a^?;`0EGo{KaDSB0$o~N6*OgA^N>86AI43n|#SIyda@f4Q}Jqo6e)#7FN@JdxA zT|#%C0lgqzkVBoy5SI5&D|}fv$ytAUFZFCJYeWIyvD#9x`XEQL?-pN3vk);PrS1`2U&L_FU z&5U03=*b)4W8H{HwmCW#jMVIztjIsmOxr8EoJ7dL!=N(n9;BxYy11>#zAZ+b9Q!i{ z63?FrkOZunu8EFI1P61S?W$=_vwG)u`i*!A&m)1-B>jTmd^=J@@$K|CFA>z6>2D_j zn84(NsLJ_+kjb^))kqg^LAtE7eU^QOW#E8BAGYIOPzeTwtm%b`G7Sti$W4j_LjQ;- zht|l6lIB8NlR5c_(Kg0k;$8v?s;X@{plmR33Ov`Kse+$LxGJ4xJ?jQa${kt7XA)*d z-+wCO)Wc4aH!HJp^zecz0B7S#yNiPW5$Mb=5x%*+R-0m&{5k`PH!EEW7a8bo`4E>< zA_$(Q%evw?rlrf=o0~;qrqKL4ct=q~M{6c_B)BgT^ z$O!@AdUoqML6F|+cfz0wVeqGqefQ4t(bXb(z^#jX_=_}&)}KCXo1^<1xwl9SMNz=j zWI)EhKr{_jvtg5=zvK$S3CciXh}wTH)B0`R6@UfRG35|w{lI$rDmYlW+=uWR7007^ zo2l_~Z z--NwTk@t(!>#^uG6OaLoe@Mt9bjKrd8Si=c2R0@&*a+YcX&bEiZ#wUIH4#J@b!xzrz>}gxffy5ockwmG(- zBx$KB@66hyaDzNVGV~Tn*a2G1&OgTs;USTsJ6^x*HJ4fEj}G%%7K9BAKV!#CCR6gs zV&tXu0+#(R_-U2?PU(EP9-HNgLW2tRF1|WF+&QW*7!k+UoEp>6U2 zi9fcMRUYuH*O?^mA{@pW?nrxW@vL2gBAL=3-|g2Rxk2(lgYorwhz1!hb~|O$R^6=g zt$>^Qm&OnR*%AN@^FC>wci5y7wzL!g?DfplZGVc|%nW~6H*>?=o$hfL!wT;ep7Nzr zJKpY&+r~aT^vqp;O&jy|#RJKKX!{Y~og!x+NL%GgLtIO`veHluuq9U_F$ZxO&w6*6 zzyGl(h`0dh=Zx@NzHbd?dT#`~$MMK>3-;UVju(^l+oF|ISjw zwZM_Xluwoa&FO{ z?V|WPv}KNe?$hKolwld$AX@E$#`WIEuj7?*e}8(-&3IwKBnlO03>y@s#`sHlWmxvC z_o--&f8`nwd=jKrj~jr-9!?kW~C*9RIq(|H#QY$N-nn2vUh2t7DN%2KgaB%wNmE zADQv_*SjSVR1hc@LhpEF0J4HTB_Gm5+wMc36!`yelvr&-wqUlt^M}yq- zt{dB*EH=-lf&4Io6}|pHA15^aC`@x2PHH;_;=vHLK*F@kZO#GE_cyw4+W;&qmU3=c z^PzzncF|E$bQzDxN`S|Ch5IXSGBbSXldqUqxr#>{W1}=K7hh%f3@M|w-e1K!xQ}Op z9oBGpBMT-}h0Ba));vl;C$QT6kVGyUy8-X90X3KYq=35$(BKS= z)MP=kvxt7b3j1zhUg`_Ldd#TaF~g=b8;hwhQ?!w{#ZAxVA-K_)}5$fJIR$#PZj*T2Tl;PuGM}Z`@6?o`ODb zQ6v67E+wP;4Q15r+8aANy?{4d^@qCOg9uReUdn~lm-_nl!=!W|nNsqUlnjshB#iR{1S9g4Kcz zJyuDZD-Qp*FC$3qi^0{Z>+A69 zfQo7)dAYo2-w-PVy9NQeZaw=WzfQakR)%0=G`DQo|MOGjoEWezs5MKK3V54{koZ!y zpF@F1)q-xu%#K}1T8d;+?c~LNhL1$GHuan?WFL-z2-U8l+KhoG@ut^Xw|~3ahGSiw zx_B2XQC?o|4Ky572LPL@=^9+XzMyO7>)UAfyT(5U$Yehbe>3Tg$(<9%p84h8*yUT7 z!lmust&D*1dC2URRya)v{i&uj6IrTe!IzQC#UtNnXkW@fIDYyERua6ptSqO&Q6Rkx zxXAvhA_tH>9V4UEV`G*O6j)PBi@_DB{}#Y+fm1~(MkYzL4no)KtC^K0)Y=+{CAQZ& z^42{!xcCAvGtC$VTv-7gEPo_qTwR1txhS80Ysb%UX7$&U`hfQF+DPt#!_Ko?8H7Q> zbpJjV(RvB<;boiK;Y}u+b#-;+4Vbo&vOB+eMN`ps{$_LL>wtE)OTjKO8^BRY+0|mK zMl$8S7ei^IjN8q4KH*t;cF}hAao!q_`g{J*e3Ulk|7BSl$u2P(yDT{ec;!-SI121L z`pB1DU$g!Ib-l^E)it?C@K9JBc`Pl-$O`Wg!a`X;|95i=)>t5XfS()2i+%xsb5j1N zLQT!h(Fz<4qv{$OIY@ZD(kDhLdpVnoIOGfmaPqyhPZR3Sjh%EQBhi zsJS!9GO~fuumQj-L&jT%Eve>|+F)KDo+`&V8OX>&Zf@>Bkn{iRPA*;CC&?aNA{O{~ z);jr0W zf{M=IWZ$}2|3v(zPLf{rmKw?r{O_TFu5ccJN8J3+a*slQ3HZ8!fz-9GNYX(((4la3 z=XTYz4G5T7-7ITe)-tMbdtLDN@dNiwuJ}%@r$a-l&=v(Mv)_$}%UR0DUnc?QUSRPj z`~Pv@!j<>mKlAVLhBYz-9zA*Wr|mX8rZe|n50V$A0J0HVo`BXf=HUs- z!GZ2(`lXO30K|b-d&<`T{%+}(ay%W&=&5veA%P!k5HL-Jzkc*?At%^wJ~CXi?!#&X zZ}h*8YZ44XjG-Gqq5);ZZY(+4+X?sI%Rngt(-DB5dq}M6{#%yaP>XsZNU{5!`XvDT zi$&V8+5YFxAG#~{xQpA#>FmjMBJEf}lK;?Knm(|&av|JO-vUk0!h`{x5N4hp%@KSR zD})bcb$PYo*DYBuHykEpNgzT~KDc{YtzY{^Ljbo%5=qvE38yF9Z!O+3X*2^u6Th;5 z6=Hk)`p(cvMq+!D-42W{UEt-x!h0-bQU-7V6W>9cTg&acU`HwcC8=~H?9DloMH__Z$Zm)D#})IUu}ZC~IXyNXzhsBD-zi6R7h=+d8~D|eo= zg1dLvnKH*;asF_SnjihEF#-Kj4h$IA5LRC_mL}Zi)vIJ-M~jNv0Tn_GSWSS3liVUC&22g~y}&tnnDi zMQ+AO;6<@V?%dn$VvKu#x$dNiD4@K3SpJth;FPQW2m8-hcbO7>d>Gf_;cF()f z0m|s)m@sb zSfgMzuIXIpR!wmLFRDOoSR+@zP*6UxWm1_?y}*|Y{Xf-`I!K;)+t-Z&(fl~6&JaTS zLuXUL#-W%OQBYC5oxF?vA_v^D)(vW;b;pL7@K}L>8y)%!uWt!~ln}lS zXF4>8y*X?a3J0^-86jtXKndWVUB;uHmK0i5vRw)br`LSZDyJ#@U$2N0H!z$5XY9XS zAw**hmxunod?&XkEF7|hCQ}_7jQ|{T444l|y2RO?N_rhrdqDYPIcs(R$J+yYUykUr zI4I^o1pjE4s^t-IHXh`OS{*gis4MN`GQ<`q(lY%&;%b;APym+H>Jt~7vMM?&?pTxt zA{ve+oB=SQg80esL`^Hm6ig){1bW{(ALl3Ac7H4Y(m6o-<;?7QzRzH&3~xP)1I9W) z@Gk!~BmA*5f39(iKc;^cK8wW&>Df!xo_4M?g9$~t4=Y)kRImp`Bc!HQ@#8UAK{2N7D9m+(f16E^T*@6V#pH3 ziM~D%W;764IT5Xz1}*;-Fv)}4*x*f}@nF5V9g_(U{`m#cA-|G4Ac_&A>7q;^cNO0K z<;FEueoD{-M@y7@dXX8<+lljpZ7#2Z1H)C~c1G1^+=v+m9zya2Z=7Ab8Y5Kb3xMg{ z6#wt$0$Lm(F-(;W%oDoZ?|!wX;uYZT{mi}gdL`(x)eCW*zRBk!n#CE=k4p?W;5*=# z^2_+gpdVz`8?SVRMSpB)}&RZv3a>|%p; z&g=0(IJ6w78dJ*nf}vSUfUI!N;n4tN$%_)AR{4zzhV(wtWT_5{Rn3Q% zGx9i=FT>>m>`sXGD*a}=p;b2a4J0Vs%CFFaeM5cLzmr}l)^5M-X3mcqRAUz<As&yFSQO`v z-*i}(AfUGfr1vLjRf`ev!W?Q|PhM8=5{X+B-uK}VtKF_%?bvp@P!Bns%sx?sGQPghP?-rgAe9S`9zC>ni^a> z$e98rZzS-%PtRNQs|=GwPyKuNRvds=*M1L$*B&rB@E;4$05UEsCi+{X^`k&ZKH?22l7xo#QBQB- z_%}C$iAFc(bb8~U#G|BS-011|AsD-UUBknui{}e?iP|x-Cr{%J-iCYH!o})y7zOio zLOZ#kVUTjx0|baZW@bu&N^5Bd6k9M1SRmL|)9`_0x~d0OJ})4W&<1k2eVBobHBfgvx`ou|pi`TK z#%ivDK7g4gq6%eLF})$rQ}>JZWr0~dP{#+RWT5abTkaSGZbv^?Ds+LLy8J6eJ`arZ z(}J0pnK;8o3Hb4|NF1Z1+qTQw(ofr#o52SLnI`9W%9h)M14|ShdJy_W7K+LP)31BL zcaM>JZtEhb8odl`1jTGx_3Qwoz0E-Ew;)s~=9tV+TtctfZy!I?a9#NE95P zs;k)e&hQ1ST~0YBc=XJHRLlkW`Wl|+wlCZSKT?nC!k4=pc0SSdm$*ak;x#7Mj?|U3 zFe1+R;FAqKcu|Xr4co~AY9G4n)XFw6k28f|@i#Kmu!0$xD;LUTgMtj@jqNwrK#dPkA1c z+6H<=rp3_qt|z9VC2!S==_qy(y>dtg5Bbd+V-J6b0R%!`Yd$`2f5+yDwJuYD&1l~5 z5}~L;&|o_WG%T-5C-AdZE6!i^kjta%OmdlT#r*2zH72g8eX{a+^0e+b)pkd5n&+NjxmP%Yvld#5^H+BUB|hidvsjCy-grXq zxK>)+eF5hm(kJ6tvl?!M*n$N z&MljGC~)<3Ipcb#hNJQ6+VQ|z-OIgM1JmxT)PJ{j$+!=vSD_C>wdTV+D~-(&AQ((m z^Z65Q2gHK*qm##x)Z)$yc6!XLJ#2jC`BBM6VBSyup=ba*NjQ?l z`w@iAy}4B{?P|Gg-dlF!g@il{?N;fiB$k6Rh%+@fia*(EPn=gnY$SNtAF_AaPPuXA`7 z^ug)-9uQ2}mYCZp{^3<^cK|Jn6`a``6wb>w5{LOstk#i#=b`D^#!5h%CHqeQWhWZD z_9vA^6P_RCbl|Y3#&nGJ_bl_{Dhm4l?C|`BFqB~=7WL~*A_&l3k!9B2b)I_JyZpRA zR#dK4bUGnkCCz1R=FMx$37{k$h`wS4Oq>W>ABr_JHRRNLgBpZtp5Z>^c~SwDQ)7?< z`r}ZXV9gUz^pP)$Jc~a{RRPY&-06a&3SN{P`r|g=#xEu#|REAx08){QT0$ID(3hGVcg;-VW4tI_fC!vCXNs8d4%%qA~z zjqLMaCh9_MOHY?o$nYa1GYk-5gz>ItfA5~^Mpnqi4(z`szO#+`6qF64YD~KYtM07=k$FmW4aW@$e7#|(4j3hEkrOc zbUACz2|S6BCwpw-sSpQCps3fa1ke2&A0c>g2p>pqLq0f&L$?O005JGOq)N5Ug)k#@HajfB(euv}u@ zp;^!VlrWn6$hvls2hub_EV793QkvKNwH27CC@Fz86T{TzlW(VA2wpls@Ae8{Z>e9IykC6H6CCQXw0 z`b?U`K0F4Naf3xa6tRfdYM{Ri{sT%Gk zU8D#D+tD{cM?7eIsUIQ=S5l~D9cRDTBF-J8Tj~KWVqdXrD*VXJGHJ4AZ20oBa%g>J zQ+wAlQ%6fKEV)PCFrP)R^by}Ri+VHuq$S{BW*FB%*BaHSN3RZ81siT9EUHU~v0i<# zzKX1Bmz_H{`{ZgtQ%jVzy1bq{25>HoX^%GoHvot$chiQ<06vv-U2PR*-8l(*MGR3x z-1(T!g_4vheaM0?EuQz?DPr0?XwwZXGhSq`S`lqjqY0s;^R3FjZ>=#(%ok}4w}+zt z{IeVL_f?aI2*MDiTYot;-`s_9`8+GL6}|as<)K@QHh+QHm&;+&#=3ge;763mR9@q> zgbTk^AEryc8nn8gV&L2g^-;^#aaF&$73g_>B!x~;?S$QAwdn`Px=*3ls;a1vP75`^ zBNsqKNrJ+%Myix%D@2S$V)86uKwB-?H4&M%3&HT)8PigaduTmkWPY3O8%{`)F+ za*Gl_{S<`KvzkJUszJzr{EvcLL8{yvg=aF!npK(zCup*AxC2G#B3aDZg0SK|(p}pD z5HHYq>z`z(G;9zpea<{s%&Nr)P{k|<-TutIx&&!y0v`qKA*;$D^!naR69M?V3r@`LuEYUOLUbQt|Y)j*m zs@U~6q-Dmdl*Z#xJ-frJFE|xjAZIJXZxh&R2 ze?WTBfAuc`%^!ylSUID=V}E2j5;k0pu{So^IC_i3sh(3JA=Z?D3 z7RjNp!9d@^t_Tvm@E3heepMIPIYgA+bap^zEjV5Ia*CxpR>RJU1qDN@obD2_sl&Li zl^pDIqQA*;l>YBw$H4p_BttW+cp?@ner-$$6&Vj{zKsP~RkF|z{-QI7kv-TdwME4Y zPItl$Qtpf;eJPbrdn%QJ9H6j{2wg0*>@1vNp;_ocqjtJeQ+}e)6NVpW*y%mjS-=7D zP{i6l-Eej@gORpx7FyA4xWiiuHaLr6*I$W7F#2doK!35 z_7Wcf+=D?;A1-dL2c|B=ueLW&V)Nj7#CsMdPmRm9Wckc5Ar%|3N~`^(Dzv$kv5Q|+qwfj>n(^7FTi z1UCIp+VJ#y0fw-(g^-*Qo!vP4QhnX_IbVdXE}{XLhHTodA1h1fQ4eE=#pO5iQ(Km1 zr)?7r)T%UfR170x>aV`tmmDH~+IO(9x_PHSTtUGze3^kErLgSQ6e3mBenNfG4~GwV z&AS{?O?NqsmZ-71^hBhqTQq9Xa2a&4)D_p1Bp{tGcF|x5d8|tghQufJG&Pf~=JN?a zXSNYdPWpBE2)OxVOE7h@nVEhQr~*^H#79=#LH)x~J5ROf4g;ex8qG+n*witX421T8 z$kKTz2_jhY9PCW;=-sDnHV4=UVny9ylWOdJFkzE5Rp{v1$X^49Z@j@*JKN|uynw(g zbzQKpZa{csb$WsI&-&q&X17@ic+l{z*txy%AbzDBV(_ zoH7B`V!v}_e)(PIRu9LFFDySeDre%^eirEE_3a3=LGLw@^_T6cZupB& zDEb<=I%se)Bs=?F-!`m%gE!FnpOsK0m}nG&UQRVWr3PZ|s7ihZ1Ad|=_A9D919>sS z9D77p68v4DV(S|GQa|pM6K`nk4triniTGeT;|)Bn)sTbg;IhM4s+s6*FUL(0+@+3s zWO!@tAg<`$5sVc^zO~@0s_#k%m>Ku0we?*1teo|*%b}1A^HJoY=a|fBJLk*@XaWWk zn1CpfU+oB(>45g7@yXG3>KLKrj z?MiI_t{XK5;@+kk6&>8)|20!bTzJ)_ zv;$m3{$e&<@@y!L44oz?=~9hcq4Bj|K{JBq`#Po=S{^|)&SH}5R)cD+#(Y3n5L^kA zvw>R;Oy+t%CKfw!yDi43xtVN&9>1N-+Aqp-AAaQ^8d18FaLbwuQ$W0USV}jz)F8Z~ z`r8rSRUbxZzqV%h4r{txI+ln_0gRSb=h4?YVx@X0QgbZX^uoMJuP*@7xXQ}DAX?X& zryvGEqL)25LS=b>fnbe1PG-;GcbGTvl84NJxo==GZNhl=G^loQ13ZE1)4&h{V%G$jNJ z?JPZ$hO#0CZl$F-Gu2`(3bxj1)pTj4EpMdt@TtjRV?^$&vdHic&OFg^7F&~IMx_$ZSB+RyTUyM zE2gWBB^09q564PMj*UIaYaurs7IP_N3>*jk^fW`fG5oY2(N zvL=V)+nV{BjjS}uAXz*ZIFlq_Iy*6sPenIfU=>D~);gL%&0!RYCq(w)oEgo+p=$|u zbL&bw>_?mPX%^w4^#B>vn)82Zp@^4tOID~x7{?A zEk*E#=6DsRs?4S?YB7s;tx!w5anps-QT}f$sS2GUZ@fBihlUtF2;1BsMua3qfG5_s zQ`c+3+Ml6a&feQ;(F##D2*quwQObdQO`(5{DIgcl)!cL3&~uT(IG!fIrlG7AErcjV zg5(QA7c8u$5G$3G%4@8&vPRC19!i89MJ!C58)kjhZPr9(?5|aQ&9fd=JIVX>z)ZT- zQHa#6rBN=gC^lgVVw4&`#58x^LRCLHWz}5Paa?(V5lMsu@2{~vlu4HujO(Pd$o%y@ zugqgDc`2`|*d#|%vImPhDEos2Tty96`~5-cm%_GW87(p+n({ujw3?p$zH^z!c^R@u z`Z&oWGUdETX#iC?6-2VUG^qe&kW!!&Rn{zYu)m>^Mj23P!1ddJ5@%f58)G{Pdb?m^ zx@AFM4dIRfqzvAWOgB5QiYITC=cRN4g*7%a8{TQb%mP%RNQP-?n?{8bM@3nL<_lNp zMIeZ`!>t`*c98%3TcQ67R>V3Bqr_%cOG-n^W+=$ zo5*rw!N$mmq7^XP#LBYxLBq3Rb5`aIDnU1ypG#*{u#cDrT@x(e8j7iyJjQILWNXIn6elO!nhBV{nq<(}Y3CIj%m z(To>k>K!NdsIGcBux0mLN0|z-Z~C2|meTtHbiqV8+Ij+h29V3Qfrwa z&z>}vHk>N+M$K!FM;`y&bjd!?d-N{SrB#{5b z$EMdSQ1UhhMVlszHx17ssL(#0s{tknhsz(AOWtccbYiG3d? zslwt#HLRb_i(AiFKeu1ki-kaNc5A?8@qJAp`ele}PI(_wWFh(Y4{R7t`^P?uILYsW z+!`9lSQ@Rx)QyaMGQv|2AhG(;#_BH;OYHp;z7AGA2G%?a|H_%vpzY97aZ74R{I^p6(>_(V|9@Sp z+I0mn;-oP@igG@nFn$oBe|IqhRp=u45-YUgY#1Lw9xF)#i1hrc0e==FeP%)cUyTG6 z6o~<3utA6jO3w0m;;Lz?0Q86p>WmGLuMYyBH_(SJrrtrU_(ZIzd|)*3PB=jl-SAk+ z)d;A5E~0)d$Bx7@Tggcgm3~6Jqtx{qk=PJ1q)fCyK`|O{zqTZ({xLN*T9eWjr2C2h z0O9ttiMGcrARPGLYoSl?hYJvfs9nCh&qp`W%gD}nWMMhQ{I>Z@{njDcsLX+=+pOJ= zjCBf$m92{llq}b3|w_`pxKe$gv3_&nFi(C8a!r^Zz-&Ba* zy`K!QCe%Rf!zk?vL?>8EL1A%qS7YHf`0xw{GiWN3O6QF>bBj4z4spGdG9ziZgWqV_ zpS9iH&JrmK%;sC@^7MC4FD~j2$r>o-xXWzM%W^u383-Ecv2OFq=>GAjXCqag?vlr#l zbW1La?*cM9+nixBJ3AdSZO~M?1LOYhwgSElkQ}x6MNvwMYU)u9B^fkmavj@6(UwaO zv6PyI35;(5)l@}+_I3f)nxrI9i}m1><4Ne&sn)vPj$AL7uYDV0|RqILvxPnWEZB zBCjg^mRM{&99>ey_v5~-d#4Lb`{4A)Z95qfP?sL9dFOYxFJ=i;!L&#Ml~|z#VCl1w z^z;bLXcY&stFpsyp0MBsp!vj+BgeL7=$8bck$o2T>?}eod*nZvP@u>Gq~0wZoG!F_ z0{wzd_vazA_qvX5Hpcrq3irCKr!Li4#W$A-Bq1eCDNZk1m#fvA|@P?8c)TKot0t1Q|5PG${^_34@!K(oR_A-WT-qgGPrxa zRa+DSe~&0u;?^t4f(b}7KdfJ0{@gk6E?A~j#^cy-yB8b3Pc&vQnAaqp)12Kh6105U zpNW~rtxp)?-^xk6-W5LsbX~JTm*k=8)Ho4eM(6fUa&DV90!pYf0;Ra>v}&_Lu!m6Q zgs*Zw8#d{{6)7sb$>5!GjW~NW^NQmdTXLQkB>er{}_e0SVIsR*Uzh5XOt;UBxAbi{A zALgn)k&!#Ng)9a&qyL#JyI8bKfHRkO2#vS6)fiT2jYcwk>jn5i=hmJ zdwTp*CS6jMhR|>3Y}t-DdcHcJtLhepEg!`;r9FJG2rZX;a z^WV};ruil#T*~}U8f&bJ;#t&UHT6LYwEWx2+%Ki4tlKv(s*YmJ3|JjeGqjPeK8*RzKRwe6(9X!b1^U7PzCr^z^$2)nUnvGPZD1A-t9_#1s2DCZ3%Fs%o^qN+)U1dk2vUuDREc#;!yGkKo< z>5#4P7c1z8_59{+AUxk?*SV8Lvs6brGQNMA7hqqs%{V{Gvt^sN^z6_l4}H(xFTs59vw|D%3(}a=TZq#&-BV;Q zft_$6YrEO9Wj?nf6CfV#j!fXPUE1TSy-w6GbmRj1H-(2+y{DXR-TIUeu8)<7Rgg*g zJ7Jv_>m5&lSM*7r4z!2Yn-yd8t=G*Z8O`E=x3=K3-bBb3o+Vmu>z(VC;G%lOq|d7N zG5D=^Ci&eG0y!&%P9ARJn>1Q29nqTU$JpFF;c=fByUU`kJ&r`WZU+S7Ai73p;)7kv zZ&p3r8l%w$;p1u{dl$^ykhSw3EN&Ee10bSou6`kMN1+o*-7T&cCVdf6lB@ zsVVLE;=nMr9J;@i@I|i|u~L0fwQW414ZG_%RC;8riqoRD3cxnA*Brj`4|{w9a*kXt zFlU+a{C0Q$l*uY;<%h!m_|m-hUHa0B%dGi!BItgt(TMJ`;up4BHgWgX`3mT&!0A)| z;}l`j=Ou^j&`ZWxX>wOj6&pg5`wj#XL&SwbM3=*JhN53_M-L|1m;MOqCL{?Q7(5>-+_r|ZGz431^l{wSAN#v!21Eh zC!5hPWFgw47m^8mX+EXb2;7-}#JaCJel)ZH5M8ktr03S<6C!CR6b$mwX?At_yQmBX zEo~!?_5Ji$jlSeA2Wq9TW8;Pusl4D=Rs2Apd#I6xu#J~HTKdH-I(~Le zyCakR>)^<{LrTlpXHRQUE|1K%6!oiFk-;KAV#k9_sp>t)WBGp9;To{6=zDnso@->J zp|{)1%iZNprR92uYtNYRhc0dru}(g~_KC?jgX02KUB4b_K0gjQ1X{7$w4j~n9DHVG zAh_B;XR|LyxZ$UH^Qt-Xk5`uAGzq~4H{tBgXR|VV`jYM?8*YE&kLHkkKkyHzXie~b z>ff_^|I*oH_@wgI8tbj>!ViJKa=WK+l}f+fcOwk86y#Rwd60dS;my9GqyPtmZ?O32 z1&B1=EV8?A)I1FRc5eS>-x!`5YUpve?fR3`kL8@Bx7Qe6{;qJiv@8bbDs>3lhqY4z zw_SsG^K?uqS?w~v@Ui-TETIG-ZLRW~eHUzlQuQq=3@oOd&o)yPR@7*vO>#ox=|5rU zE!PIpE6dbjl4?#4Sl4O_!br`+W-nGUd~H}H8Cb?gp9jZjCwt@YywnDX26ht=aIx@NQ)xVQXlHFgthUi+O(^FDS?~Zy^zj``<59qbyN;Z0Bi_&nQyhty?St zoa4fJasiey_g{hYI{fESj5uW2V9N&92o*(8u+t6XKX^{^O|;Px(GnH+xUM-QMS2|S zJkQRuzT8l&*iWo|p|Zmn3gU9VHKnuAR?0$~cv1klyNf(_#QjRZG$-|L14S7gOoQt= z-}&z526YcVgYO$ar&^Nj!~eswq3?(^H90=8KVH;Y3#D`26Ewap*(~5AijCDA!7DRT z+!zK$Va#F~pW!6eCaVlY2_do7%472Jr1#)XzwX7v@_Yy%8rxG>p-l6m%BU^qdso1mRTjSr93$-7R#;v3i#z*2ZVDh|G?ba=Cv&YZnUbhRlOwRZ3%_-L+20y|2%*IO3E6n&A)`Z;+^38^4Vvh$J zFx&eR|My<`(_3kiENo3P)DJe+O0c8y6+wa~b?lh#)e`taHPGM?m;jD_(Y8@I^J_ixq6 zA#iD$J)-a4p(9)Ke>XRvEylt!wXi5EZCo#@)*}WwBd-1}Azd5!OEU!0zdT5vU@&WQdvFWep5yu39{b!=K2d=Lud4F<+;quP{9)6J9LcYfSTxP}uh zi;BYps?XRVy|6X-BvjW~h0NYKL1ia4n6kJN!4!hL1!AmML8UG)gK!4E69%2J$k3qUD=jpzhikn%X|(j zemq}3uU>Wy$utSKJmfdmxX3}h$h8ll)7vxfxCHdecxGODot}D}b7Q-ly2P;Jx5wTP z;p17Owc1x7UeCV^m1pnrf9$V%+-uO=lVpUK+u$ith1)+S-RnDJ)H`@O6ySY4i@x2E zm*F)j*Vnri;5o$1%h$yG=7ez_zXo5;dd2g8Y_z_bu>SOk1mPs95FV<`bM)M&?Tp&7 zfOug44AuGEI(_Ts_sX>P{5<4Y-6^0qWp^7h8qn}9KU2S$*pRwC_}t3wdT{Leh^)T# zr!@+)lyLbeMTa-M#|OPJK+u&1!t*(ce^srca{n~9+JV@bo)PC-LBYAX&=jj8H#yp_ zjKXupRPFhR|Mar>8CdOo|JvcukO^*&u2zPLu?Dhq; z>JF~=VP|txObPQh?hK)hr7SGa(NU~b9sf}ueSr(e^p(xiU%KE${XzhYbDz}w4Uy)x_Dk@) z#mUt60W`iLA9txsipi8%ngOQ}4rv9&Z@CGM+%9xC^^>EkiUJP)&*6vhhfO8>%_wI}gYn(a`nRoW?QF?cvVI98q2$#uae=oK zcB!`N@&m-cLG9{CXJ2y`vq{Vz&bX)F08#4)m`p7Dr$e#^e2c-CD$mquo zpK6eeO4>6ggUH&5ZHb_8aqo4hGp73LEW+wUts>v?)~C2cthGRZJ(G7^C8p<(8%V^4 z`kq#$r{|7~%{jiWS@d4eKE)V2R`WshHwPv^-!(<$Z*_Q2%(KJ5lDy&jl z-ERFV{plqPFKnifI`4GOr7bv@9^KgxM-;q*!&QTg5DWP*V^bEm0nEQG6bEp0)w=)- z3lENuvF=(gPs&mSt6nrFxc6oq6;{)Ka|EH0Kd0axD_zMdOD{4A@GMld52J7x064V6 zVg@4{J>bC}D7K?S+E%zZSPO1yjNOzN&te|wZY4yl)-brG+4 zDixlhCMCZXGYa&0wYFUuVkn?&sV_Z$HFe<0$Q(#jU;6N8pMJeT<7#awoOvBrjjE+8 zGt^Zot(i78-Jv1mhnW#IS-J%45VK!5I5QdR#zl>OeX5cHtDfVEG{T433~*37eBE(r z_VvlBb)D&_R~drUcB6CI@kOY8e;rfCgZ(Dxi&h(6MH}7_)Q4G_)kIm9!z&fi7>($@9|!dCs!NeJ`w zoH#{RpCV(lCbi@ZQZ2IrlO)k^8P9Na{N~`e8=76UF5^L36r?=g?`;bE`6L@f+j`@TdCMN(3`|?aK>n zJv$H&QSPXfVq_O@wVStL09U+OW}I1j1dD3=g_Ap<+qwdj--p+mFN1GD{8|PL4_)w# z#$y?Jcv%`tY{ODbNf09(qp)qP7|@diG7$P--7!QCyv02J091pxGfD`&RWAnguNrJx zzyXcriw6D$ZvoQTfhGjj{g;#o16l-r{HuUJ&s8D*`?UavLkM*MsE_c_7cHrVW)_7_ zT%x2OMZwVjF3|`Y3Md?EFo+wI$JuxTr|0QR-*Y@IRk!CZPuA(bM{`2fA~&%t zF?gixPGgE1(F!XzfihQ4mfy4A3W1NsEHNC;a#L@6AE;#e;Yy*=5fLasMakZ5zc*j} zG|>z1wX89DS)tue%T8~!;Q>pMb@Nt?d30gq z&b`#e4M?nNJE<{=3*%Y96+JUI-SaWjW4f>2+?2tS4Ch`F{nMIt72bLJH@9S;KH-J- zXc?NlDpNI3ws3W8OI*r?5#V?sSv)20-p*GX92Tp@*yQA7JSOg=^7gxP-v8-M643N? zxYY5CS_05lA5IUp9s`^$^y5ujakNxJi6Nj+U_qFWB44p^bWL1Rwq*kfx>JjWz~NQc zXO?HBn#FOYSXnZchOZw8-TWDMVu3yuL{?T;OwJW&9UQ0ET@nl&BXKOQQKEw(pOiiX zz2bbo0|KmI%b)vl`P|??6XGKqSrAU;kAQ3fK7!D(9x@83vj}+BB+cKEvR1Umu8W+w zz=Mt+A%2u>7oVJR%FlWzw?;XFMjT=UL%5l&)<-KuO0hT|+d0l`tVybDA_^k4!ZrSD zAf$BC=*a!9rY{3E-ou0Vfcdfy# z&j%WMZa+J+MQC~9G&goUoUpM9I0DfClTR*u_4;)TU?jFpzj5K z9WU24UpRl;l&RQ1APwa3Tff8iPRq*Rw!xq?_L}?w)Y4q!|1k-ag`FISVv*Nnn36q@ zdRrU4Io0o6c`)P$ItkbYP)rxpnUwOlZpPn9V%%TB=}5wfhBCJ1e$C>Np6QRS`=}Ll z(LHyppuF3?c@9zM*=sL=xk?n#$u($HFD`_*I$}oFq*HPGb(Zru)pl6-KLrs|9?i#J z5x;Jgon(Kg5_TLxFG+q3OhZPC6g{(Ohn%OSD(OF$#nCI4h{X+I65X~uvmrWWgWAp> zy`wZX!UTs>vN`3up6=>Cj1%sG<}y=ZhHcNniBD^$A371#Vf>-Wd1*2jSQ3>Fm1 zzo3u5$3W^6jp};izf-{tW|GvQGto~8W-*H_ZAy)83(hUD&aCZ{r_|_Q|J=6Yu)&Vb z>gqwPng4=^0U!Rg-7Q^mAkr>Xo-omIufmRY+`iOq*>)dI!SR%KoPJ~o`#87!85F|l zytoLkZC>L+^4D+xI2_MNXXqHg$Y|JtUkpeK(_+@QF~z!w>?D$|rt{>J_J+QmROmg< z(%aV*rPJB-xhhesw%Sp`I8I~CVM`=VgGG+a z>Aj@t+>K9*K^87Y_O5#|W5?T7kV5K8XR*A$r};>Dq1l~;jqz*~kjD9PzWuS(ES@bV6intRO3sjTB54DSv_2OeunN`5Pt!a zSSck$x@q<4_7fxPrYoL?S#5iS9q9yEnc*SkzB*5l=Cz{u1h#HTaU?MSEuz@QuwG&* zSGPyHTaON&ht95HFx)`H!y;kcp{P`o0@3_SzD6)(DhYR|;Z&)TSYqQ&a&MXE4d>in z#uno=)CFp10|t-Dn5Lyl&M`%!7H#WZActj|1&h!1O@&{m!l@2g(*O_>a%O8KLXG+I?>&$krgwFWQ_ z(>m|)5N2(qRpvS6yQt(RC@JB|49-@3Fcy(#E+;^a_x&m8irck5Qgn$a^F_CW=dnKm z6sZEo_QerWaqm9V__uWaCu$g&7tO|B7_n-W8Ed_z9&{MOD2fkg8~~+R;^o|<*A()K z8iowgul+trbdYRVPvV|(5Co2OqI7~;#C$e*+O%tTxIIGob6>o1H{@Yveoa8b7(=Uw zNZc;GwW}vk$y?Q<5cTlTUP0R@cjLQTa32XSpB=`=ccmnd=I&5%R_oasH{RlueRi}s zOJ+U$gP3HEffXhMHFzzG!4sCz#+LChp35A$DmSerht@jYGEMkoTa6>XH_+Y>ZLTzj zR<|Qo`n-agh<#zI>L2BT#s+q6^JYw5GXJLq2`LZlYA@syJ-c>^us_;abI|-gjA5jKJA#ge z@dIM6V#(6TA|K(JH-6BHhkdDZD4kvn!F9bssr9VrHW>y+Is9v}mbcHW|G%^~AZ3sQ zh=wjEDnq?SRr2t1*}SR58@F^8Z3mDex~*3AwUI>)d8W zRG6?#JUkX_wj8N*&IM?xaR59g5Hdy~OqEK29*PJR43(WoL^T*f9ybJcNYD3<8bETb znxLvkD@yy*4KIR0?buE@Uua5=o=RAMK+!k8>|-aF(2-!zcp9J8%EvpmJSQ7IR=ng* zDf9nf>n+3DTDxvxtfiFVZlNtLE(MBvf#Mp1Yw_Uj-a;u}3KVw>?(Wv&7Tg_zhv3kY zz0Y@^{XYBs{sC7K?zJ-Knl{FmQaMiFZ~eT}e(5t)Fc1LkgbM1_)WNF%vA>P#NruM@ zFLt`9R+6Mp(aiaYiLNTsfylsPDGB4YDA)0Z;^J^%p)$cU40;lN(qG(xU+}d=y^va( z7NgvOxl)q;%?G*^nh0_^Jii#wTaLbjFIziaj?ph#zg|d4{yYwK|9~Yllf(Rc$+#gh zvdwpcSvu02;uI4r`h{?MZtVTN{_|F+r?~CEE-g4DSKbQWt`UMv!89KWQV3~&#NgFU zL1`@+ck(_-5U@wg&r!a1sam&3LpP`e%1cDYd|36$lzaKlH&l>{8}>H7mox5ta#eEq zaZ89H5}4f3&`@JOL~7`@O(J^LG*;z%? z&M$0qwSaL4vi+STFfWtnHJf6;vOsGKsn;!=B1D-nlDZX489M88d3EvVWuec>qnK3^ z9U|uaZ5bLxZEv01Ru|XbKQW!HPOasHJO4#=X}^gbK!b5oaNDG1%@6HS?UR2FEpXMp zl(p2(2Sh)fdtDw2_m&qZFX&NPgDHW054?)(w9+>gA8=X(7E*E;lE>;wKz;`;MwE}vkB|fI_!)^zFi;uFcwrQy(~r2gWl91QZFSY`^5sRRu!hsv^=w0 zP?8u@1q8f@%w8*Vi7MU&jZj-3?3#7TNtdG!<@?08|Ho;16X-|_TUh!Zi8wP#V&E30 z!AE6S(e4bgI!cY{7Wzq?^<*&xd-mU)^Z4WpSf!JN*Mk=rk?1`kx?nhv$#LHtYBgz69 z+NmmW6|W|mZ|rdG7W$5neQliRGO~nVlh;ll?Fbw#|F`Db`5L4?6Ml-T56&tTcd|E7 z@1iRrc3rvr4XKtGN3&UzmAUZ`Nf0DP%@RgE*^n{n=y%b~0PWIMSK_aK9<~0l>4Iwt zeT-o`qQf6=ObpKJa3m^iBTJK)VG7920JWvrP^Il_KjLdvQ#}Dz`2}b7>*lVwMAqh&X(7*V6{3nIX0!^WMKa0W>r{G<&mm zKN&J+e!q?NpF&JO{6Zl1&0{+`502W3FkmyiA44y7)3z+8dfoA}N6H2@RdZ`P1yL0- z5_cm6%dtI>$5)`Yf<#ny2=hw{VQEmkQ!XNk1z_V3}8n-ahZpW|U$r4>{cr`liNU0xJKUVv+OHOkRvd zP`syDbfG0!YLxrIDr0xyspSO0#!oPr$-~??&bR;);qYk42fV2D>Bc3i_j*>KMO}*KyirX%^AB`Jo`Pd+F?K?#DpCYqy zV-L=Rm2yBteH>UX!25VE!Pjw}6>+j^vkPyM(-r*GI^+37O4}0EuVmi~zC+RAGUIZ~K{F;2{6pGf6&ALjZDZu?uDp{svc_>V1~2HQr;fW3JfCTm+5zgJ_Tr6FuL zbk+N7e#A0ys7e)_HXu5ni>q4z5L(|MQ70yy*+y=3<9zJ3C84Qh23(&~nJwGi=D4Rp zRLT4P**@`d1Q0hrU^G)&FV)B4wAd6MQPLZ`fBJ3E2}!j#e_*rG)-mn^9~YS4x#K=w z;Gi`u$s74l8636ME?vm^`xw0C+r@n5M!hjITVHu%hH2+d#1tQM4m)0JrYhfjq+*U- zWX|;4{EnJ%;H3#2GTD{Sq5VVjc%4Xnju43%i;a9iRO%JA3r?$@Cq2En;^4MVNZ+%` z+U&JhnfDAdEep9wfxk;ATR(pC>Qjj3C4gnU;c+O6wRm`AxX|v6sl?NIzjTHGlJ$}P z?fcbCk$Q7nZoym3D$tkDbcA#pczlb4;wXTE*g zt{q;ZC7?>wZJ_#VQqO+<7E^4bhvhtZ_nhdc#BvH&QPa?zuy9-{*vc2*cCA_7vTw1{ zU{BBl$)SnU^ggihT5n-+Vyhvn$8mJN<9wt=wMhY8sBqM%3hwjuJ09Kbbz8nerRiQ>m!tm~ zeH>9a2R#a9w%Unw)O_HX%l=qz=N%>z1{PQnE*iA%1~tYumDq2T3prSr_@~KkYDRZF z(%x@DL#Qt;i7v`N+3ouY-_F+^WHm$vYk$q4bEtM35_PAx&sC8b6WRX3+8mvF(w6B) z;{IG10@#H3;my_{qLdC-v_>WX9aX{}ztwlj+C%P6{sQd~WeP9-Gwj!TQkBW)pRe^czpa5lcinCmh|ki zd!NJ^2bTjmSL{`)9ArmwEQWsb)>uR*Ebc7+0-dl~riChFY+QKAcr^)1+dT_~divEg z)G64OGSyViJ!kNE>d9j9sc5)AK*gP0D1dy)@3*|; zNWsf@-l()9-aqb+TVfJev?#Z|F6S+ytTjuuO)vudL}__b+jrNub2p#YoKbZCohbK4 z#y-2jdT}ucg(3_O)J`zzK2M`2-xlz+*X4-F6qg9~*EidvRrw1lA8+(_EmI#W5Gvo^IZJP?tqDrZ zdJ@5rM4d_0(vblS!>h8BVJi#5$d>xLUN3mS+uE1thnT+XlPfmg_AKQm?jgSk4V z>}C^~)hDSO9i#7n7SIDwK3*NoNPH)`es&jikWmzuZRqXYtWuKNzK;LOjW|VKD*Q5I zOZ$k)eHKB%7o*(oyabsvi-MoenrfIjmXUIEyF+mm?r+AHp$k_O`SmCnf$*tti zvT|tKTHxPY;!*W5(lF=m9Qc?wxN5_&I4RRJdPF_%5!|1RQPumd4H_nJG3su(G%KYw z{cR*kx?Zacxg9t9Q0$k`U8)9!hL8yCy!i(>3H=4{@vfAg5L*vZYZJs^+q>$so>lR3 zm%@Oc6;1S~>ba_>R(|NMj-5NJGG9Aun72be@gd!`cPxz$L|}$c!>wc?b#TD)lE_x{ zcXZOF>LRaHfJOq}w9M5RAHP0OWh5(^mB+w7nn3G2uEEGzfmi6#YmN0BjU+qVK zu}>9X864&2RL|3AO(}0O)KJ|z*Zqw;e&VjSg04S2ntvcPey((_=B?c44UNpNYKxgU z3OFYx;b-2GY0ZHttJwuk1z)cQtgT{dYJ^PEGKCGk8^2W6@<_{&{r2NYYa+2dkF8~@ zya?82x!=?z(B^oKS;AxG9eM z=!02N&o37(NaWn0&~^IQANH%|0HFpAiLUWi{*Ue`9%`rw*l?!GOEvh0=F{)<{Pyih z(oJ$`GDe?fXY7Q%zyf&w=S05eQ?%>o9_8DiOZ2+Y@2g;I@4nb*#lmn2iv^TNLLaCZ zJEFEd#5xDW&iGYW#|oDwhr`Q+ydDQItCnx9kN@lq+#C{lxSSkeSI)M{DH!0i=)-h0 ztr%8w7c84Ue%z}(46MRsL*;(Bk>1L`r8qqCYOqK1tQ0gj2vjR`STwA!TiCDpadxT% zntK>1ny*dQ@;3~*=^BIgGWbWV`rXqX>zNl?&Ms1m&8YxAIX(OwnG(JLeCe?Lw3sRA zmRdvFWQfuzS>G41)V{#CE#Ewy0seHjet#wWs3r;zT5PNBU?@Y&|rGj>4q45P#C4`QpKL;R?UbVXRL_o(Ae0N}l62+%f=?dx=yo74Na z1ngcwijSG@PF1MFiGiB2eRW^tR^}^k@lSlyRPMVNJgtJlgk>;sd{#HgX#ae#2XzdT z#rS?+y}L#i_Po*^#JrlE9RFpr3@S~Dm#!L$>Bvo_;pkAd>bukSyb8O?RT2Aj+Xs1@ zG1vFVhPn6i55|@7B{{91E6tT5tl(x_2_px$lx2oX%qDQO%x6BJG!y4I!S}+HcIOPQ zJu}Q+@Au>$02e^JB~Db@>i0y{?Oo=f`VG&KIZK1{NSbq^K-eCCZIEQKO_BbU|0Db) z;4|h)Ta@{V=2P9P^OLd!h!R=NrwQS~M8l8<1daFL%=gx#8eh2Ba_2V)YpDUlp2)TE z>guPSrUQS`Tg=SuO}y11gQ3IgTRl(Ms=G;xJB3dEyx9{KHRRBHK0{yfQYmvQ;7?)9 zd8Y_p<@?#sxh>&AOC(!2OT^w=-s1l=;iurk7Ig_;>B2~j?wg;XDfDABaqX&W8lGdL zw3r<@R5vW$~5 zp8mBcPdUEe0SLLPKIaRsrbUPcJ{p(oIxpq;9I5 z9u!0NZRss{m!BN$a|~(B(v`(da?=xY-7eBzI1h<7UPsRIED=S{g45>_jI7mhB4U`Z9IxS_nz+r{b=O@kkK@-%?uDWU)X5%P&8d43 zzN&^Z|3r>rWBV#-BNsREnX0IVz)krFN?t%=omgijXGpumCFPFRsO1^8+l4Lf`Y^}K zfmG@6p8nt_5@Itir)J?f<{h=|ufU(`da`6}eoPilCa8F;ZVU?Y&cEt)s+!M}eFo5% zevnw|OaY>6JI8gXpuyY@>`Y+!gHdCVp1X?Y?WK;4I#I;M5f-4 z?DnV1G^bf1FikNrM= zDH+cCO>3p!j`raVo?-l0tG)m+@&7BddJ{%ccGvo02KPr{)c1W+n#ZHT8KL|EH>vo4 zn#BeaGx&d-rS)eJ`z_1e)2JCP(`@b2aMn*3U*TE-p04z_C7G74#xk_4C$TS=pV&ZRz&4wQPHNPAJ=-il$tMNx3 z#R5a+w=ijGd-$S5%R`&%6wXq6UhD?zL!LeneLRlL3LymY{AcE3|1pgZ*4*o{79SF0lPno#g``d#Z)c{z&6^=*nZm}7xDxX@o<@X)K6_C=wYVydSW&X|et2u> zDVLwLYCIHfs2f^p_BIDxrf#`bN7ESvNcXU3RRn*vF!-E=uy(i&~)OG&vcKo#tTi*uqt!ATrU3S3-u z*vb0VBirHJDHliEbq)lk<>eBPE9e-bZVbR;jkz~!AmCsRV-8`CXa`K$))ZH3I~F-N zr{UTj)JZ3e6xSD~Ecy47Itw2DAR$>(gIR#!KiPQorSrEIH@CuCuns)WbgFC(f}9lB z0V!9u#yu__YeLB8U18>OZ#11&IckuM^eFm`%Em+4DY)NR~1?t=p{jvxq&Aid|pET;Dj<*A%`IS7l={ z&oIzp|7T2YrkGhM|28~Toqx$zQoW3_DH^;3QZ#~BRxrX; z-ps8e<}l?Yn((P5jQpx?{z?Zl1fd0?AU7kmo)5BY?e4-KuR1b)j+?@eYc!nKI#F-$ z?zY)`$Ye90kRXkgy(R6Yq;V%Y%xeQ(r8NoAp2;wy$;F^T<73oP#t|?o(x4z6}9q7iXJ{NDQHZ&^u@%NqoaLzVqLeF1)tMr1G{t6(;QC62$JKt zXGkKO&?Ja>>VurZrnmy2+jKtA=T{WBCA$a5V4*4vTZWfDe`28-u8V_rU>L2}eQmSX z>VX&Qui2opn*FQ-IZOk$8#jUhVj!j!A|UsBRpkV>8zV6TCGBn&^OB6pgWAf?2vuvF zHOnF%^}4J9cU`)Fa5zTd5Q0D2?3*W7q}aTSC2Sv|KbzT|qSd|32U1NrTKhzzHjB(b zI%eOyws4iy$7vjWe0a`pS@V?;V3lnSi?Ch2#-(aFHoaPpPb)pjvtg9)E$XbYJJO#{ zoPtp)5FVan*W~ZFxrsoPwZ#3{Nmt7Jhl$k>>rAgm)tq`vm)swm%UQlo7`0^fwA5F- zg)D?ptys7iaM<+}8pSjJr+e+REn6Ibg_4 zu%9%2HCw^d7^08peFIW*-zbgFp9m}S3*KKm$x zZYIbtC|=1So25kaY{7QUEfyin%FCB{_+)N(WuT4rkBI*t1*4rI)2WkyU=Gpx$hXpf z{?G=FrzOiF(pMks_6ivA8Q#&CQ=Q`xJ-?nhndU6&2n&jSs_c$I{vsV}hY)ESu;%xS z%xsNQ+C~rPCi`<=ab5D~2J`;+E?~PIx;-oam*`IV1`S@+?bW~2J-+*Oa=!RyKhpbg zvhb#dqtsGK8dqmuhh5`!@@w*FiU1rYP*;~pFekU9=jc@VQ*tY@{zO`l0r8cxrOSD- zU8BbivCV+T*|D?YFo%tPh;1p+Wq+OV1gylLhPb>f$w%z+&axDibTdio9~ZOQ{@F$W zRKhjisWX_PN4tH-anJF%anjx+_P9)YKHnnD56;{!)C2R6b2*#Z{wLS_%A)dI(J7iX z{Cu$f+1UGD@~?Yv0lAzB3?&0P52vB()Uy;;jqRXi97zjoYGXYZRhbw5BxXnfOYm>Ev{wj>{CAwLnSmwed4=MGJd93(JSsLN3m%Qeo4= zS|+x@tAnG%L$jVxoL0n)p6_{l=GIQCLqSeXFtSB?78m2&`}4R^?12e^Kzvj&;pEvB zb74aowZ8lrW4P?EMzq5=Voj!xOMA&FF9~Q1tWWf)PmT&bjzX3mu1$q`J5mMEQ$4*b zIoc!(uPjQ-%1w7Oa;J+nF#_Jp8o96yTpn6#UCM9doBt>YX`b5m@0BLj1bqh{Y|WJ$ zP}}V1iu}+phjV+{(n8Cal#wf=CGwM~Pj2px7mzJ10QanieL;48#Et|JZUcG)-N)U> z*}2O>;62z#$Urg<>&{O(vCRxO;fqB%#Y$(8Qj36RYjS;trl5+w+3w26=$R)|zz>ZL zq46z7J9lC}AyG2AR#%u%R2w`*9Rs=Z=U;{fvT=Q%S&Cs|68zwvqs#9J+kLr^p-G^E z-!cjh+y0Bf2xutuD0`B+r*KhDd^K1|`ZcmE_ME6>(A}}NIjDd1on|3X!&LB}X;Syr z2g22W+(e*X7k5Snms^{GNGtqSh}w=SONja{>0Y+|0PiKS-we>?QgU&igbgRWbgL=%)~a)F{^Y|vSTAqJ!)V2vYh}bo#L(+;k2Lg-+owp*!;m}FzO9|r8C&7k z2)xK#rm}eKhgX{6;s49CkQj{=|E-_D`*WPRw=;;N!gB8WV6XiD^u04$A>UqXQ<D zUKh|zBgKZ3>FI2s`}q9`m?z$GFpN1z78HgtDUOYb#3Z_mEDh(2H%w1cbME1(Chggi zV${l&E^~@bd}SwCiM2_6?yHi~3Xdq1LZF;P>%z%RUUIu=|o;@^6@< z#pg#LraP39G_AQyg}?2z38LzEaE4$)@460tVltN8Jmx#%oy4B;>U~ijqq*Z2UB|!a3i*>jpb%FY-_)p% z8=MX=FS-+I`$9X$5BHyBs>ZfXH&|IM5yIHf?YW13cWf)=$Js(4+5K*TC3j2QiO}>z ze}lU0LTJ6_;$a`3M`cTMIsi(av$?eFJxOT7x{eEWZ~wi>Av!WO*48^kMQH`sP;;IV zOx%HJy3RZl7=THhBbV5|+6e+H+j|*8;qcbe8GqcFt9N;WSBAh!<9biVl!hP9HqQpa zm0GV;AE*U+WZ(OU=FbXusyEOEAcR_PgBJ|JsUi>e3a!;%c$g_+P|LTR-?d(UaBd7= zXmfyH4uL5_3}fw;$#y)i?&pVeL>dCC)2e~XB7>zqcF)J`_4-I z>P$J|#G|Zrk-jY0F2i$U!Uk3~ss-n5PT>j9G5Mj@O5phwE~=~HhU#{y)n(js`BGMv z8t1aX9xxZMw4bB2wvrWFgTO*$Ilci|5%aD3#v?Z+k+SRmI%-(87ydJAPuoOR?@ydL z3p3vyOjz=Um3?}*rRo-FF`J`%l=g(dV_Cjhf!a)3=&zoeFiYZhkXgaze!$KboJCKV z)Mw>cH(_M>YjU&30@?eGzmx3=^?RXr?pVb{7OiDlF z_Os2v{yv)P*hnv^XM>J|FB9VB^;t-HT-7Dm6i2d_UJKa-pso2m_;@RP?Ei@Zd*_Gh zUS;f5O_Zrn{n>2^m6y#dfnb|Q&FxH!=S6w`55ei6!o}i2iq}3?WO^$LSp|#3^|@@d zyJcC!6Ux?A5vqO5`dSCQ6#NoCdN_A%d^MWe0ZLT^j4<&dmgyIbR&}N7+pG*KVt@Fj zRq`HC^zH_KF_o)g_I%lk-O{mvi1r*5;mH(*0tc=ty&QO;?Fpr&j3#nkoZBwn_C;&s zmQ(poFCvgoYB(=Ac$>JQH62gb8694862cP%OgmOcd|;;S1`B7W5;T%37o6klujSkrfK4kM=jzLk<0;H{)@uK0S^tG|6mgc{ysXT^x zTwrKId}9qY?cMSjJ)fnOOsjNGN#?Y5tW6%!uuFCq8jZH=3bd6>sgieGEz$tkZ_PFB zi@98Cbazs`a1#?38x`1gZ$DtOKPZ}j+Mh7Tyqza4g;3x0@$UT4)mh^aBv8Tj^Vepe z2~3Z6*)?_Z@Tl>-bI%BP^xE|5fX$Qv7xPZjhTQn6k&C9@c^vE0UHhDG$sqv|p#z(o z!QDvy{)5wB~#L0&F#{1V& z=#m%I4q1E|YljSidnFy`Oh&5W64AFgG{*()bYJFErJZyD2Xk01u7TO@CMi^sTkNGT zg$7h|OvT3h?m5VtVL)P$i)S`8b{DrqQX}@%^EW?0iLsmY>-7gOJ-@ERk9>~DWlg~T zW(vB;lP(xyLPty9jGDYA9P!Sdplh44At$FYkVBbC24)=JeH?G z(wrIant(DZH#g~c<<%x{J5~gyieWo4TvvD7ZbHO|bd-RY1(L3`HZP4YW0}kIUJrdc zI>eHDtDzINXa%Uo=epC@h_hSzwLpzcgoiuMmz78*hYxhKcHjCWiU6+6O${~RvF_Rg zAVlqdZuSsSeyVIqU-1`155h39^+c-iuny+FTMbi4m@rdcg>{*P3NG#+QX9XteZ78) z+#xHgS*-&7l3eM4iquVf$us$TO`KswLoH=9e_F_yBop_m`;*~|!f%nz&C{qgOr&o_ z=en6X$XXau2S3E9J=V;=m*WCxB9@h77FN(Xu@k!mhDSW&&4HV*{RM>t_h3|J#~;*M4)**%X<>D#YG$>-fer?=`w>y~pH~ z(62xU+43XximfyDb4DchwXD8Npq%AD@%3}#`JUrXc{xSqsI+*YU4c!`sbZ{mnWo?4 z&a#AvGWjyAxPHS4r_xg|1U}JdLwCmu?s2ovQ&(}uxP?a&Wha*Mqr^NnIsz>>e{-G*jTH|Jucoz zm=vo?EozP1ccbas`Gx~o_U!1rQq2gk3eZMI4z!Eq=kcNjr({r449{#qs>Q0LeEnBB z<%fhJMz*oSUnMglqP=Ic0lhO8EJCd@aF33f6!Uz;6+itlLoGKAd=;IGW$RHN#}dle zl#euwsikwJ{hYAjxUVHpS%RK#AR0eC_63sfw@tqhwvPcS&U;13m3c8Ir`I1C-Ae2r zlws|++?#&G(qJGno!h%K)d4*@XnEOB=wOC}TRd1Se=*BGzyf+rf5-XHEydSLRG>ha zIs4EiOfwB_^Kpw=P<(-hN3~nMY~Mg|-$pGlH&2O@I2C|=D3-soP$U(K4n|8ebTf{9 zESN%VmctC-sp<1nE?>593lvWu{J3pWQ{t>sC~#fU7e;O+^m|>2%F`0ATz|AM(2jn` z?`TYRXM_1{V?ES{h0%F&1^W@~ZNNqf`iMC9ErEoj9T*Qm4kWL1)783+Msn)onSb{9 zbB1)J7^-3O8j+4J*{1EIG!ZC*+&GJ|71`BO)hUW^pv@3;)kXd;BPGnRGO%FFt+?!| z)_=f=$f8luvn2CGPgOP6=~N4TRZp!f_aLcoy~hGQWNC} zrF^bcx|6bTQB)$$EFnDJXFQ}<-%*n!!c+DhGd|X!pNGZa6JqeKeoZMxCI}Oq<8gOm zFi(tQIc>=`b_W-69vY?%L~E*novr>8Nj{LXo8zs`+ty#Aw7*8{4D%k*z)LBj;+mr6 zA&`q)%2t2IS+i#tqf<|eEPCL6Of$r9e$l{Nr}tkY2{{JysB7fm+Oh3B0K#KoYJsM$ zjF}MxbKF;aY@BiEjPz_^=K9auPp+Pfzc}(=a-`ndx{c@1$DcYBT)=baUbx}lzbHxa zGT&-K{u&kcKMpm_Oo%cXiKLsoTSi^8Lc7gX6|%BWDEt!AW}%FmvWJuUj6qTMUh8YJ zjMxjYfsCBVR5K^{Z!JTFtYb>*`*Q2DtIBSIvPepimivEmXL>!~prlbC-N>XFy^{uM zL+0yLGPduZD83lT!;8nS8PRw69#%r=Yb%i^urghX$cslgo&UQD^v~(EIIvJGE$W{J zS{{)uFPN++6_&ogR>IgsGHkx;cG{-%DV4jIZ!ga1r}_X^aG z*Zz+BYpQHs9+ID56W4Cw(^DCKWI&30p}U8hFY}L~{Qc8crertNHDfeh4{iQA%WS^a zK}N4Eg!~A?aM3#E!P#9L4axt*dHy<9n* zh3qKQ3Mp2&KglEIvt+-rNV7hP^5;fBZ~7PJzVT%ZlB2EIr8;dUETr+w$y~PJBm2SE zHFoXA?oIEH;XzD$dUd2c->dSMw=QKIr~mq=_&`1u^#5kx{rwrE^#7Z=RsNbZ z0=XnI!=Iu2{r`d*<8Ls3s?&Air~WxY$lOZ!Tl25Z?tdNUZ!*{aKSwN10DG(1*d+0` zL^pbg!tmd3OqNFLeC^_{t$`6U67p8_mptCTZU_?U{elpsJw-=jFet_d&!~mu@dWKB zjGBT63?jK-S30d(T<=jZZu9or2itohwR>(Vks5yZ-ziGR0^$A ztLBG17UNj3+xDpx32_<$ieVb2hgRp&K?MhvTU%un38d#;(aIRPJE&bBG%DXXf$cIC z^6x8bOhGyTxB$JeXS`HB35k10d2YKlxv9upJez-@6b^n%)22F$MWx(@7u^G=8OKK} zp-h5>a^Y!s$*AXhm%*K2Gx?9CMQ8cSztp@Alm`GUgFq!1$_^Ov8`f0^8t5l@SM;-9F?AIAv_Ndj$vFj8a=Xo7swL5105tnJNE4 z80|!(r$ppbGkefOl$Bbe=dx?8r_#PS#S)8Ev*OQ?A&(NZFE}NjLiMPCU_}^J3@d1` ze@*@7u~2Vqhni9KrbXD8PlD_D!vkda&ZGv6JNo6+FTvpo*Ru+@eK(lH2-BmOYZ&OY zH}g~dj}Y_)$C2g`o0b>E?Ow7@83)2@4o+7%^nT4hpLK4fZhoMC0$*TzRf*@(fc3-QrVg!eekyIuvjYwamQ^$bJ9t-xuKAPFHLF=zI;@sbZyf z)Pr($JIW`RI4~S)n%hJNOS0J%GdF0l>8*C?Tm{9HoTVbKf?1>_k-)7-A5`9VK$PP^ zU{I833Pb=a&gZ7`&tYFevyOEjp|EHFiyX!sh!OZi%48fbOk?o!LjooSHrH-&gLhmo$YmYQ*R2I=))`6K4MgMdZ=@VtOVs zU0M2xr<6Fc#MhN#;lnuJ_idff=|&)g)hB*jD6in;izzd0LyDFdooA^@!fg2FDV($j zIMiYza6f`LEz;G@AUOp8Jk}}gLkP}v2kJV?Q2W0tT`57^GaS!9aIhh7hPviM4vm`8 zAIDxdGNC#EzR-Gf`h(d2`#%JO)_NZM? z=B-``qK&`Ho2--vXGnrGLJk}+^{|388W zgT^BiU6%ho9Xr`yrxU{%NX-_(y=ii^VInU0h*p3ZIz^P8t)jF@fF2K)773~Bpjnv~ zu@4z9@p*tajWEX$J&f;#{lG3qh?l2S)Z_7%wB~}f#3tbVT$HkKWxh+rESw--Gl|7EEg2-=}P7>%JNM3A}WWwWC!IAu&34gXG#H+ z@b{}G&uLfCykn}vmgXcJq-z^yQg_(SZQo<7H8j%j;dRbAXea9vQpP=7)(KWL;MdW@9$9imEyw(t&R6QudHGuUSr{iyvsuG z*`1hpdIw%dps=Rk{n_Nbo;f;AmS@z2!vHl*2rV&T{-X1J4X=S5I*FZ4126^KcuA<+ zfQfe0YK0GKjG3RZAn)NtH|-MYALn>oLz2d6t`$}Dx%@#c&6bpF9iGx2+!H-Cv1VXC z$k8a8QXpJU921nhqPcBX**)2G+ThW3Wgo;*23E{mc8rXXzpQp zWRgY}hAwZQYVlasuZZ(!%cCx_a|z5Zpl&z!1|?;iF%dqZs>7G+mi6R_3x z-|-izL126SSKb}@Y7C{_)#89V5a@(xBfu)*AOP_`2o_gd|4gi4LVB&h1-IF-X5}Kt z`BSyfB%MXM#)r3csmjF_b`L2(Zle>H>+mlk~pJr8+=gczhB^qUlK2SSFBd!Z^F-xj=`HPNl*5^>-8h9lmn z`CwNQOa3nYIRr5-fs|Hg%qcciuPfp9ir2;_nj8GyNE+Ce4iE`BvI=QSw*XIzwg}nM zLqa;MSCJo^ePPaSQ5V7DNT0l^P|3>i+m0l5Q&Htz$i9m#o|~PV6)FAjms|s<4l=)XwNOXl&p(J!MFGde3O1)|jF{|MYb7iehGIf7oL4=N zH$X9fZy(SBpe0T;O=-ZG`VOu1Wi#6zEn4X;Hv49Vk;7(@qr}XUDpzEBZl+o$>3Sig zsjP}DPRx*+uGCD!g3r>Dx($N zi;e!|m-Cj`ugW!;O!0PW@_%{IGraFFCxOF@8l- znKyuh5`qTPy0?_p^fNl^kn3yJAIg&@TKePtPTgygSEqIMu~M<#ZV7+G-#Ezg!60iQ zT++!{%l5+3Bnh&6dPFD_(!ra0w0wosh~uHe(K>)1-QFVrjw?lp(hJtD1B-NG0&_R|1 zZQc}e3Q^$RS_KrW)bSU!=&moqbSAxNLLvvv@_CG#t{^-1D|Yk0)Xx_z7|Uz?X-uLmCYMBU)o{{LX2p{p5a{*DTDEl*73kPB%?M@JT5jpShGMP%aQsrAM>2ShVwpCW-Yu-!-bK*?vX zR=6pjC8C^uNp|bNpeAjk7n4gC%74y*bX{cA0H<%w-tzVlKj+ou5Az$Bqd_O@f z&*xWF*PC->yOY2}aX*%Sk^&TeLh2;y#0U(hzFInKU z5gX6fX}N+shhs5sv5}*~Pn3Y(_v1}$c&rlo@P;mak2zf(UR0f*Bk^Ei zHYY{MX-ZLSCCyMLJlL!=xyr&7ROafqva7MuRLMOhe(tG9mk8{ ziu-myo?R$`siJIWv((7?4dl4;W*I2dJ5IRr8*Ch3wi$5$_)3K+OUiF>`sf;~IvcW5 z4t`YJccy^FPujhTZ>G|TR*tuJ@fK}M`#l}9l7STv!>k+XmQ`$x*p-+y+Svx0Pr=C- zd8S+{!2pEUINW^6-xYthNC>LT;NsM%%a99*yiBJs7|ZU&w}W^})FB_$$Y$SfX)dz< zbCS0Yw>k0$A-C52*$$eE3+AAkl1*H{y$RCyL|PGYd3glSI2X4TfFH+a6NDGhG96$d!~6f00T765yl=AyhIw?qO5l3rWI}pnoCYD#nxsIF zRu-?(HwR&%i{}A{^@w%ayQ%Ln$;D8t2G!HFdY?1x?6UP`?+o>h?sya(i%Pu*^qY=# zTTuK#G0B^i`Nn6Hxv62qgMFS99r;t-BTKSu?24gIv|0aTx+7Tb!LothQJ4GfQEbL7 zFiH77`24U5oZh;hz3G$tv0^Mda+U#~W=D3wFa;Ba)fckWggs^2&qoYc+r{iKZDl_L zkq0nvB_QS}PoIVfT}D##%?m>w5BE7Yrx1>`8j`9&;z2@p3o zi0l)h$eUu-MJ6JkPUb>}>7mV{MQymR2Z4Q^9d|a&LDE`j^k7=CQJj0ueo}SRxrQQk-*Cc7 z-e5YC84nO_mxcSI`S^#Ic@kJyYI^To=ahwgbxVIk5@GCaZkl2oP!^&bzJ`)*T0sCS z?^8>h-xbHi3gZMW@Ka&95 z?N&n)_d)@|Z%Z(0An5V)DF7G$iTd2$g_yW!NNF=?&XU_9sncIWpH=L71g=6aV$b%E z1Y3_*<%-7|${bCQ7qQ`|^clSJYGM@w(x%gTv(LF(2#=|!)mlWzfCaEM^nNMDP#B$F zr}p3ORquPJ7A^0iSkx*(Q#%yeUyU;wWQX3@}AtC1x(o^vT*oOk7S@K| zz2;or?eduX{Vo<9yJz(`$y3oO!@^p?$D|t8T=rT;A~w@%^OVtZMN6Gp1p~m*r=1EV zi;Vpg%~UKHWEGY-W|CPVob;W2z_pL8V5$^`DtxeT|K=n!er+cQ174%PC7{mF$~0Us zw21#1f3qeTcx}t{&48(#Mb_EDD;Sf7=;MjM6Un5}O0ppdvcsZ9RTneeP?t)eP9I7q zX>0A7ewkfx(HYKzGfe^C3p6Wm9fy0)qArA`hQH;4wH1KB<)+{9FVt~}n0@Mr>yoQb zxpTz!(W{4erC{}O1vsV|h8iXsS`=I~D_Z!yK6@60UN?OOn%Z_yz)SzR!rN@?t!EBq zh5;9Sen=j*?5VnuD}A1lWGH~G8Mm}+vvMPyLws5V-pLg022gdIO#uj29g7Q5skE74 z#Bzg{{XErSx#*c;iykH3b1DOG21ynA=O*rX3%ynH!W3G!T_ugmw~80~MNy9dw9w81zj0saqk3qbeeu{805s=8Ags^gb^| zWp>f*;MMvGz3V6R-^Kynzj_IS3{9!_>n(q95P{oFmkT4Y>9~%0N(&EIaU_BEOTUb84yK1^V;G3GOPvF1qQGj8DC54kWF8pesK{!OP% zgw)5vvG>2Yp!;s~+{uPiBVt6R@UdRALfRuK&g6U3s=2)L*+noHtfVk=^jw8EApOEO zd3?%Zfwyj=+LEg+0_i^v<@~Yuu={@) z`^u;`;&0nvrIcbV#jVAPI~14FP`o%4cemmiDDI`WhT`t-4#k2y1b25!xat4C_3pZB zy$^3bB`Y(N{BmZ_9NA}Y(eL0CqOxJRVKzEQE~D#rD|OJIb1G{yx`RYssFiF*gXa9C zp`l_-N`2Pf#-I=iwtpFzC2j<9c)E1rPOheQ7TZRs%C@|rM$h%#ezPA?UwYqRuS9_j zj{E{0J&LWawRPBgVUK2?ZO(%Ga*0MhX^XAn%Yg<|;a`C2nCRkWcuxua+R@}446Wxl zOI&#Ac|cK(g~3a4rWOe@kP^1y>HeIZda)5n?0u({A}~r~eKb?NeLXx817z#AT0D zOyTTfz8K)mc$m{rWLMIB;+&SYXNUanOMC*#L*#aebt&6)FMXN9t+mYP+wx@(9l{~4 zxH*Wp)e~wefllipHnw$UGTo!jwWDM^y|-dMA^d@JUcY2NN_&gZ%**VtAzp-`FhD|G zknXx^Y|BlT@y}vjm7*$(n5|SCBUCc-qR0cGjF9FiOmki4HPdRQ=9a>qsa1?(oE-JT zbh<=2N&dLx%Dex;WS+^*q@~!yS+@it4s_vb)|~-0CzV8kX+ecq9nb}T6BA1D=vFrn>#yTqT*6;V4K}csv9jnmm&ZhENq|g z?q?}eYvQax_ldad{F*lG+;Skm&Z?}mq<%Y;VIXQ>8UrtBKaKJncS+iR*nVaV1G~4Bt@qOE@00!R<=%>@Tj0|BzHe(-bQG8`Eo*G5Vie3D^H}G<9dt$f8 zTLc_?>%OG5TXC9IP%yPUhxlYEleJ^#I{HYZe^|ewK!G5l?_&qtOQiWo01X+*xOw6U zVp_}GYGT``<{Nl8M|z3)sir8w;i zY)H`47lueq9abY+^P8?M^g`g`VXj42=Oz~tdrw{L6#{42VSQ1b4tb%tD!RrAD z1hcH1xOgBI2!fc`9`Ehfg)Qc1>LFIrOupBgzE{K3-0msR=0l&|5XTxb25N;QvIdkt z4olmk>-L99QCFm4jBC*O3?I#WY7@?X+OzgVQ=|YMd;1D zdbSHYyZgC-_l*ckz*0bLqq1c4B3Gm!X9(0^pv}brt z-&;rO&TPfy1!teSTpoXgu7df-rbfWhV#ST!L| zjxG{Vwpved+e?U!rlxyv>8!5Ch8^OwjCtUE|28ZZ&@l#0>AD~Ls)`Qzy-!sv4^z9Y zU^C&_kKi85)JXb*zT*rRD7>?SKiE++WUOMg?_ChtO4+_InK7E)ch_e6vlI2jxEP^o z>)8s-h?dfSU9|L*wPnLnR_ecc#pThK;* zPQjcbr>3`o_is0cy*qYo-1>jz5zVh`YZE#Q)2~lwT z3BQl0;>S%%kkuAJufY7KLv%V0>1kwgEJ&a+8%1arv)h9DJ_c3SMbof0WLxr{UUl-S zIhrzy94{v7>Q%!c5ZMfI<6O?}?l`v#JfDv}?|%)&w&_!Y?Fo|Y`Q6^PY7?m47MTnc z64q#y9ZKGpJO@!5Qtu^6$0)XyIiHOblD0*@z5wy$AC%KhrdA1yuFm;Yv=(w_!IXaGzqg@U zV*lXk93}rDYc&g5zz6syi9}Hz1~~+H<_wps{Gd^$mdtl%)2n%#e%YB?qNjM)_!35T z^^K($edcf&#Huu+?D=duimd(q)6gUe7sAp-asN1E!x40{|8JX{13qC)D7>8WXVEat z@~V)z(vbU&jlRFy8q0gO0=SvH3cVa}8*TA@H7n%6MoR2@u2>b$w6JH#h^Kn|kyHnB z5{2{s>svGv+_(WYY%eZ*8wd%w;zW`P!PkpRf?{?GyduzE$gB23BOlyPFBjbWo$Nf< zJod7559el_ov02IV-2SqqSbWJvV{%)BHwOY`Hg%9xF2lI`Tei5GsotB=Th=o+R2jX z)n258xBC{s1R)bK#Ak-Q)%m%~a{sgI%w!j|yj%~PLPWt{zhg1*bf&_$EY7#xnu^F| zo|1|riujaGko<1uuZ0`N3{awY1uMM;HWHjWoEaHeI-G1v)teyUiMV0P-TyBquo(t| zO%pL55q|a0d<%v*H-HnFTL3G`K9Z29mFObJh0U79=HMe{HUwP6$-fhQgU5aoofzfePF6lRQQBZ=@HN)8fD4a#KLN_h>3^)5+C?svIMw z`y39kubjL=nps^`Z7ETz2$2egFcwE?x31|Ssn7JYoW!oxCyO9{-0%M}`sh5MQrDKg z0pf1yE!;PA`*plxRqmWoDoF}v;7Ba0r2Jqtd=SNG_(6e@J(tlm{IK}4rs%=xQ&dBdg?sKvz6?k&-7WzkrA<&p|A|y5d<88UKP;M?o3FPz zJb;9(wySI_+kR=-z4E1hHwl?jI<{xL>dIqHQ-h69Ra`$D)MtxQsu-%kUcKUY)>xn^7cW3cW#WT3zn)^^94FEi$rH`t~^N}k=sNkY)y-=3q;Ht zXUsL`GJGpU-@>~Pz=&0BPtm+v4jGw>0z0;x{{Wq8!vA3nja(alAa@?z$}7X@h}}Pv z*PbeOI0;O>)qe>amZr6Ce_(MT-)hrut0U>4?CYDDULIQYk#dLk@!j7IP;8Ga+4oz` z?1oI6k=;y<&ktq#gv^7^K5B_jQa*K}Fn|Aq1HS#R!uTM8(%J0henxZEQGB6n%bDj} z0}&{WN}E3Q@@f+BYq6)nwV8#?5KIA)JCoA?2Lg%EI9bsfX$tBej>irJQs=&Cp7Gzt z@7SujVE3qrw5@VoD)bdo$e2pHfAJLsh4?xQN{31g6gC0A>zxtb|^ z>OM}3U#g;%3Y;BY7|e<*(Y_;6cPSX+Q!AFE(~p)}=wHe$7i=q6!E$HH|M`YG%LaAr z3Zb%IK=P{rQI23!?yHTgeK!MC_BjYSQ4R1E_*6D~yJA~{;s7f?mRD0iq9b2Zq$Hw4 z_ne7gs%uyIv-onMnB|bF#Ip<~yGUJrz1lFBh{Uc<2}%8+LZLZQ3< zosp8VFu7*|&xLRG)vnxWfwO_0^gX&XRx#z~|FP~6f-{>wNBnn}|5Zy#x&U^)`{j(| zZ|_qKN7@#I#jTRtVNSa^hG(|d56G;jqH)sOr!9Cg&ovLid2Cb^_oE+Jb=(vwAF;{S zNuf{g!B1ra9&7D_4o&G-w>ZjP#r`=1R(q60CYOo2CiksR>y%HtCF-p2>AkknA!se* zfJ(cN9>J_bQPs4mUAp``ue)j$uyEX48DIUfCGz47!O5P!T7--ZEj{9KjA&~icbcbF zA+5QgFdfvvT_^n$5c7o@i%G2vOoaVcZ)T7hr_s>-W^kC(9+2W$!FUE4R=;F#?}ld% zQ$-vaJ6(8?hl=6so`%KUXs}}MHtNlM3Ci(3z#lj6tWsae1D6b|aV3sz!Wh)z>-wmH zNU^#2Lq+t@*EdAMXOrS>tI-j-0QCx&`^c=lX_U_XK4b--N2+T?Ec+g|X%#LU?y|;7 zPZ?+D<>_+iL;i*Fnbq%D>(XcpEid=4ws>U%X34@66+d%}t z_&`%<)VSWX9xT(BL!hndE%&DBmq`=nh)?CMKyQvFpCRFNBeB3>zam9f*{_t!AnYOlKz zZDXN!2Uk@5RY9MM8?*^lIdjBiX5SNi8ineoLcQyGCG71 zbRpF-00G^%o=2`ho=*m}+HLT(w5Z)y1(LXWgf>qu2M}P@1Vv?-s|Xi>%*yXi+4v>X zH4tQ8C|qFY;=j$6c{?YDp@d8RwR0Mum)|Ein4+MJ~qe|hdDH|Fy7QU{# zUJdM-R({_oT^11@Y~@n*Hg&p-Z!>XFMF=o~{`!HpwOOikOdA@^NA{I+UBO?ZtK^c) zQ@)tmw5^>G*Nbh>gq z(?FJK1=A{{HdXN;X^@;<(s<5b^!Wh!2)3mW)om}T7j8p}tS?nuF8Xl*2`=v_s&8}l zrE5rvx8rN}RyocPk^$??HrT3rkTy`xHE4JIqUb|pmR>@KVr8ooD#zp%bBGenVk2#X z2aV{8I&1Fneyg+g#FBxtKD(M{8sf=%iw0a$@rc4Yfn)*BV$DhK3s|1h=+%9Lmv)7J zAxhDp>)9kNS6xBSS=i9kuadd*@1jetnwsEi=wO|KLy*s6oZ$29-Qzv!bHTaWhbUMb zLh=mTwX)t@7}N@{m^AL6BmdXPtoJlH4{-YKWWFEt zII&GE^0rT>4fW>(4e)o?OtS?c(TesOFyiT@x{ay&VG4kq)!|kZ6b63He9ykh^A?2t z^q6UuXDUdkyE2&0xvS>0u3&5(Nj3AY4*iqx>sC0= z2sT^vJ>Q0&tG(yQJ#9~qq+l`e;uX10#A&bF6g^^rghDqY0i@3fM_zEE-E>lR!8SzY zo>1t45mEi`KgB$~rtD4?gx|V*7sj=l!_nOcbRbxH4RUwG^5iM<*K;ehe*)U!gH+cr zdP`C(&UVseUN$Eu!YV3|hi5Upbhj1AGUVVm^!Th#}pv`Rg{ z+U*{>nd?~sea&@b$RI33s%jsLr)^#}N4q%hipI?cv&hs88@i zFoCfqf<)#XttlR#kkj4{4M8Tlbqa?s)z-S6h3Ma@0+9?doE;X7s#?8d_nlIy0HqL@ z1J|OZ&-n-lJoA@ZvGlK!b!sz_WV|(whAB&?-G}NP#9ZxC4T3AnSKjobIrux@Rh2tp zW-9Yp%9ciBim*Qx+|4brG>u zKQWR4jDK9(K4Rj=mGuoE6M?+>7vsMHh%7~70S;|*1DJrnWXZ)8c-FWQ$7InV&Ia2O z$jUj+dJn^T=$H8b8SM?8ZBe8w!4^|-`y7b3Pm%(4|qnU zm3V8-ou6^r$er)6X!BKk63;XRL|2B@=a#-$dodEDz}Uh^Ona76#@!n%d40Gf@g zFMuCBUEQ?d_Sb)NDY%>hM`4zU8jEKA9@982VcqIRkx!DH1H%P*8wJ#Wu%hdkN5H0& zE8b%DDn;|Evo>){JJ&~m&ZPvQA~_tXVbsgdT6QjPARS8Y>rueyEBt)ck(e8z)8mxSDUf&%wkXO065m%~MH%VC|@5F5DAi>2*et)&nO*8<6zn^?4i& zYNESM4jk(3y3w^M2PNPXna1A@O(Bl{ab01tCs>qUVFFwBVz@}m8;De#`}~O_b@rNn z!sQp13mZ{e+m#TX+DZzd{dI8C1H5-$;KT~-(7R*~Kr|H0e0vNaCMQ^3#WMBA@2p0 z&e05*_nBgcqW(fgBZ1-*|DM-6Q|YbU7RZOacM^@F)z0PVN5UlGQERR6kQ1$F{#-k= zu(LN@SCq?h!E7aUVOM~dq_^WSDfx&M(bsbr(Mm&j!{#K%){2z1uH7n)@_q!|GHx zZO(Fxfy^K+N$ORL|9s+jahH7+I!rU= z_fzB)|5cDGjJ7HtF%G6p_Zo1E)n8;EQSAZ3P3w~sk4|XX=B*Yo>z=@`au2_dU}DMO z@I=2RH<4p5tW}D)?%SQ{Sep9h2b{ms;lBKl-5kA1Z$(T*#%p)2qpUobUi_n&ao9nC z{OKC%8<)EHVw1SDVcA*u{+`;cVEpp1Q%fk5D%+RqF$AR+F^4uiE#u`yIHyw+X|2ve z%f>g53}@a%^}FWp5u?gVJngk>Fed}tg#1n~j3Hu(m8&u-53re8{ZNJ9^)5p?(InanV46*So2^a?us36=DhZ+JA#*TOu!$S&2TE47dt6psg z6MeK*1R|})#*G~WJ$U4SjG|t2mZKu}(mw{GbUxem5#C=Nh;j!<)rWEg_r2u0V~ivtQSW@;pC`^p!{t z%eEpePJ;4Uap&P+7jNG#5CL2;p0iiYpEBLh*-kFyx+Jn+>1Q=|o;L^iP!164%8rG= zMTAW}NAt}AhfYU5Jw3(c%Ae#=8b^=czVKV}GAdpH&ew{5RRnd<>nCk#4??O){43ps z`pQaHrt2h&?4vet@*BM}($p|BR1*rlr4S)o^}`8{@7StO2m|xr<{$La?ApfA+y@E; znhjvf%b*W;DB>^BL*|-NJdoFV+Mr?>DM~r3vUG6fP^;$1uh2Muno#s=Dtn@edPL6~;Pa(ngo-@|=H3SjN za;16H-EO|KBUOu-t;Yy(W@zNz?$!$l$4%sPN$=u69~^0?%8YD=i7FE0rhfu21)Q3l zut*QRFEbc^za$mD)3=6`+{^lQHNeS4&O{0YHi7Rhht_j&I^CW*`=ms!xpjl|*PdHp z;=JjevyHmXeeu#wbrY6|4yQ?Gm`f~KPfTJFmFodfn0?XMzSM<4| zMDesDuHQ-3WxTYW0U_YH+<06LUs}eajtwN$Xg+Hmp(eZwB{tp;@59I6Ilt6z>x_dw z6F*-ZQ=YRuKb(3WgWCt7-q#3OL`v|MAQXlnh|qIs-ofXoyEZZPU|?g(Z)6A2#7S3w zFGGwJl5~~-WoLcGm6ohx#O1k7AwbOGnYL8=V8jurx7+W`xS!elP(S{#0S!$BLK(l~ zu#Hrmt(8#}t5TSLQBP#6R7p2ix<6QBFa5s7Zg*IEIY-F8x9`mwF@#c#2sw7OwYUeO zrwn;ny$6S@D<#|PkHf31`~!Go$*-_VHVLm6aFf8;PY3lot}Rin^sFNP;)?$u*I9{u zOmF=+dw`w1B(fw76pG5qduyVg=5R$3y?(4Y6ZrBZyo<>GbT6mu^273~HUgz54o!If zM*b{7zwV44qyn>hC;(Zn6=?{1++4Hz!o3BxZ*B^9lQpf)lRMzE44KgJFR}w@LZbR3 zU(GXQ=FBe=Ce|NL=Pk#)E26MT)B5ugV<#D4HzOUVBwQ==xh_EpXP$@p)!w7(C(Wk6 z!i@%R{9%y_UmtuF2vie0(~IAi>rV|)J}FQ)h(5jbtnTQZ<9kjycMrq{4G%USI(_1^kFZ0e#I7ep`ZiS}0@Jjkp9Z$J@NO$|3$h_Ce znMJ(qd1Ig{eZqY19`0>1Qg*kF&{4f|t*tE|K2MK5b@0SnC&Rp+m&su%#_Lb~%TBv2 z-d8=R1ILqXDk}Z9*>h!Wi6In?5i#Cph9aet>BX-$15B!tJ=Rv2wA#I6Cvtu;I(tnC zbI>nMO<3|(N!B&B%z3yUDNy1-cew0UyhkPIZ%c0Kz1!ow)Vv<&Q5J+eLt?z_Cws_% z6<4<_d+T~UqbzgHT2-AzJJ&y!TqufVj{BYGSY4I%Ow6y}&{MW4*6p@<1MRP+)U?~B zSQH`8dC;NFF6}nv@*lsp>nh;_d<|viME*u?t%pfX$@=Tx{@S5t_H7p|C9gJ&*6Y>P zgl#j)JY0X_c>o~rjE&1cocL>Kggo@81Qc0bzlu8z!R4{t?h>3R&`cVABK_Zu_6v{X zIniWar+Z0KW?*Whc{KdnJCNU_J=0el4@d{Bd8YB;0ltL!k66{J<-iKt*B4t5?Z(Z1A%antsa0}AXzY7z zjmM&LoNrUOz1y`!4e7pKUX(Kh$UrL#EaJ8~XR7aPpK*pEb?dIWPjPx>~1ti8UC zW%^o5{waTK$bq>A`VTFov~96EKK z=O)DyYFU>Y72&EdT?Df=_S?A$6&O^Um?r3_{Q4{DQV+kZoxc|h`y5pT&d}e^M<__U zP!OKi))?6|l+3%l>@3 zO8-)8i{Jp!YPW1XELc`{Mwv@2_u|X4AoB4sQz5gzbEgx8AyAETgh#owHv&HVpq|H5 z;*Hc;L1l$O!;oyDMqhr_G0S{vZ@-Ld^umvrZ{)GYIoQQ2K!AeLfE58c09QTP!}UD( zY|3VTzLN3kp|)lN4v*55SA3j5Fjbc~wG1QGmf@OD!HH24CWckkHb9JhyI$Koy?Yqh zIi7MK!y{l^Lx7+9_%y6WZ#XjKf~8wRWcTmcTLyY(T6qcJrX|_(ET-8RZ-3#<5kBB8 z)IZ#JvDbw)OXPJ6!89o&&c8$JwV?T04cZwY1E#$Bb4bhlc@HU_RssnX6cxL3gxq@_ zB0L>-&v|IPIZ~Crbd{_TdhKJ1AXaDlyD4}3Z->14bxuvA_qCIcY&8!o_N4n6zUtb7 zI6l~3shK8e9J=lM;cRjRmY8LVwG)Vm2j%g{_f6qn5uQ5PBa!v$Vjm}-bRXsR9Vz{# z=o1)+WM3b&EUBR%|9sOh)Bh-XcWDe{t9^a~#gJ}}6_oG|X)itAZFW$koKiFTJPo5S z)Rx4oprb=a^$VbnQ#nt2De7=9PhtV`vhxC`H;5MD!5FEN$3a?2)YZ&$RUnSYHwnvF z-xsOvw#JiRMSaVoo*$zG;84E9`NkT^yg7n6G=`o`;o=y~d#V4NpW5-PCmdDwezP3+ z!H81W=5Q6s_tK0I1gmhlx{``|f^Qtwd0)3&_xA}KB~BE)l$z2s$EJLQkK|_D>yZi` z=~zw^_r$o6QyDCEgF#4%>F}2$k^56vr!BIh3 zBrd2h{)!5}_xOv6;Zf9z|Aq=p;&jEYYrem~@zzdS{nW(^`pjSBc3f9lZIx&OrHrg| zJ85%TT5jUH9Ob_>ewwdA6IBCuLPq58Qu5x3&Zw`U=P9mr@cB?ePT-h~OR{+xg6|W3 zz4zEM^0- zpOrr>3xH0VZM>hE(C!?ZFpIq$F4Ggr`%Go0&SFCH*V;gkF0iiv-uL68rV%;dJKx)Y z^Sil_tOH5RXg)c zcZWOAc!t-pgbuCeoquhU?|e3Tf`8B4oew~}4jhfge@s1hx*k4veRF?bOC0n~Yw{0g zfkd1-;IjJp=K~k0dm`a>jW3~M9r_4Y@B(Mo)C#_!i*1CXrnE~Ce-kIx`je1|{>qnM z4u2%R-UcQ}cJAIj ziCinrF36ZK*viU#3R)JkvLVm$A8IUOdIj(oScoa@Cyr<$+1SH3x6BUuT>o>jj2=^Z zoUHZEa`7f^vl9InK4xY|jS72w$GHBKK*2p{#wm{l#U*DnMFdv>oAym+;YDcEdc%n= z;WlT*<^^~vg?~Z9@_UdrC_^Er+dBt0(F5)#(muj2@gO(Q-gKU=$IO~}Qh&%=&gA(W z(mUIN!b(;OMKeASmm`8w^+Ly**~nQ9ZVj{kpuKb!&J^!_EK%z$WHz{&2IR}z_V(@z za#)_ACks7eaUVPfD;`qzJp68$*s&FlXu+Ub*ZnZw! z=*u5|oyYnu{cMS|a;#&~`3KVjUZ*m?d8_+r@I&Q4ljAZ4{Ex|FFn4J; zZ$;Cox|JWuaUcsO>rE-~uRiIBe_DATIW~*IH(`S@Ylf3mJV??1$h;PS~2r6L>Y>o}k@D)Mx9~+pp(fdQA z&gQ`GAQaq0h8XE`kbid(W?{Ju+l-ux7vW-;c54%;d|37Frd~hYpl`-bbdd&* z4CV_q`Oo!ri;e4k&nUY@U2@3s;1L?y{8}#)n}Mrpk}ZF)Rm$(q<@mSZDL2i^1G`*Jd58e5;$rHzkAI}eQ7(V8 zefV)`U*$N)`P8^>>%AG^bv8CZSXts3mpnWN+UGND+Y|Yy>g=bNP1^B#-P$)&|L88y zK~(rx?}>*wB)7yp1xYLoBiUT}kIw=iC?S58TP*GaxtQ4}BW{vkV7^yV`3jO=Ehvh@ zk0dg~jO#x#f-K*t?i5~E*fMM<$qH_PV{z5RUnh^7p~$p3D{*q}5)^~+CQrrvgP@wf zVq;^8q&w4Q#1Vu=usTny}9hQ&I+2oMh^CO-Sx`EBnC@8+}k)|%_u8n&f0!kTm( zR&C;?w$7WOQ=+93UhI)d!AKN5>Dqwp-@|!9e|q%u-~8cg^*qB6fbkl(y~6<|$^&`K znc}D)7$+3vU zOVW>LEe&}UMKKlK-M*?#898nplsLxE;R&(CWY~O1UHR1wj&mb_2dk5FHB%({C#S;+ zvB`Q8-rDyxPKPPmY!KxKXGv3j_vl&ISc`hYL+0PRD1HJvrBc+0&f}`<{-IH#^vXX` zm!qSm9fOyVu%eCTtrbs09ey`v&nh*x;mR;;iha8frXcqG#3ThiL7OxI&$8YFopOrr z{iL(udmZJIe9mQb%!Ib2Z~Tx3@RRT_?z%h2R>nZ;9nv+WJlQJF6}+3;o~C1B z=8@!({e{b%*z{`wOt~j}I$xgwv2?R20YKNf^=DZN%HOZ_y32nC67IHfX9>QG}O?lkFcqBGEz?WK(RjkhLX;F0-+%Kb<;I7U~te1s%K6 zGcs9!Q&WrBNmRds`Nj@RtA6XdNVy}u0r-0|8ow&Um3?!r`v&9NdJ}DP2K=gv@k5Mr zq8m^y%Z=`a;_qvb_YW^GS|?If89s0{;&^>yUhon>9X?$5|7o|Z)#Sv?+pB|frvJ|$ z`3GYfU~}Nz*^IBQvWiGBFi=}dny?e$Cv^Uyd+MeRZN1~Ov|Lj%`<9s{#Wg81#wkqA z$fi?J7)`Z-tHimBr>)&~2i;I-PBD;7-9C!H6|So24mqlP17-cRlHk~p(m_^y`YipO zNPz5++oAL{!{skILie@+B+=-8f@#B0Z>ukO6is!I>aE$3_eB%HrvK|_g^!57&D8kO z+oh;6-j_;04ZE_dXQ`Ki%yO}DH2!Gc)~=VisW!51Qx1+R#2T5Jya>_27V;071-&~w zZN}iLF-0nAX!UJGofCZ~plG_`DP?X}2$xUaTJmO>BU$uMoKZk)uLOpWXc%SO$U{~m zXcJ@3HwERBKaJ767!2h{L%|bz(4l21IqTB~N^7IkMTvOVHW3dD=?uzE8J-`}2%Uu( zt#72DPgVMPoh84mDfoU4^LlmGV9w-NJ5BpyegtgSv(Y5oEqpb6I`b!g75#0(9D_6o z2jQ7{#VFqPtv+1E|8%1LNI7){CVJzY=YW=xTKev=Ts!4od_G8GkTf0=k>S3pBB}@R zd^Nf#tz0VShMGF8beqI<_ME>O0U2vn3@2|VD_!z`1L4wifyEK=<-hyOYxxD80yGmm zIh)|VcgrTtp~~mjQib5AEY)tn78&qeZZ5`>cX`ax;4u{PlE|y&UWueGDMl9&Nsm5l zcfw?cDeMi5#Ldzu3>r&iov<&XLxW7$btS~2>EFDfdUMvPUq>11fP0X;Ta(m&{>Qxd?_U9y&a_XNtqi(nh&NPPORfwH5hW(k7esI3Xv?By54I$ znWloX$9Dk>pG^IDQSe-0-Xy!8&;bVG&nLV58DdnS#sjidwvT#bLf+}^c}flA-e7k< zgOZ^3Q?s`}oT`7tWnh$W02*&347ITtBXd==9eg)^d*b?emKgARN%cTrxF|AGFn-D%x8_9V1}>c+U>Y^`Vi?dd_FwiT!U+*<%*6i5sX z$1XJitR**VI~B)x1cn@$j~)AsI~&f0YSbkYw3wZo=5MtCCzRCyvUh%OgLFkY&c%f( zyxL_#d--$|{aZRf03rJK5w!?GQvcfRK`{b9FU1PfHO(5tOr@ZG+}D-%mg9{yP?c@& zvHtSq$Jv=@0OV;bx;4EVOBG&Y#ydnlw~mmD48wO4P$+n7YHE7d&)1F=zp$<`2W1rOw^&+9;0+Y;#4`E*Zain!`J9GD!7e8o@mMIh5=iY(Q}M zX6*Uu9dluMzx-6k>$dzykHAMcMM%OdCQ{=!0zbikM+Y5NLR(7z7iH{{#fq;w&l}Vn zzwd}PgzA}J>9@;h0Yu*V78w7@u6_ZwS@jo%U1O-uO?U0yQZsRp^XY=n$~$h9<-qX^ zc>uDPsFK73tJwUYA>_&tzX@@`j=!2-1)*mf#rHCG&3V^gX25NRxEm4+B7SyarEc*% zp$s@i{w}PCq1G;h1LMaOR#$r^te=CtZf5oJ1w(m@0$PewuyHv+ugGb=JdZb0dQPV5 z^Kgq-`WbhKqss#TbFya;&H28aM5z9lkG(Kzus%9*)>&SIH49;yUkVJIn~M=#4#V%X zK2+8bYX6F={n5t8ngw2kX&jX-`3_~6;ULmkcN9C+9wa3M%tuGsHKb=QI_dUV`)RCp zE4)Lvs>2RlPxOv5Qh@}sramq6|C%6E- za(}>mcknVJxUSDWdsa_;*XB#{`LxrT7vbyszWXnG9g=0>Xg+d$2*W@sdYVX8m!G$= zHq)Fj@CKP7->ci%PN4&3{VS17vpt!oge%gD=)(r`!*zh-dd}|#4jyZ4X0G_pC&jHud-fsZB$P3C-|>sdHm^(2k19pRx+6c-r?)UaQp zi8OljIat60U$wutHU7>zhH6|@=6D$w--;Z+_++>@8FLRa5OdFi9<4Ci-ai!4w>+<^ z5PNbZo7?v-m~f2Yx((YkNi~{!IYOMq;c+6E%)udfpR}nku#T*E4`9#L5Alew|DvD} zUAyDlh%#@%ZFI5qSF_gSog4$D#jydKs6vOUZmV@(-P=ZsSC|6d_6(N*`@K1j^7?fw?V*Tv%fNb6~TpvC4xe4UFVc zh!?J)Bj)70De`$N%?7PB6jjg#Nj?pu`zop0{Oa`n%|Ic3MD5MV7&xFl87$6ZIxNHk8rDR*^18oiGk=8Xb6O>VSuxeJaZeU{GN zzIOOr4@gAB*!$?!X#cz=roqZPMhilm3{0k!n$Lx-k!$|!$by9upGKC&9}9zZjxKV# z-%93y8Hc*=SYu;@6pH-R%ES^CqCUjE(0cge)nJ0TR)eDrIQ8BBvH>cM zrA*7s$l`3(R-5ldl3sVW5OTXd6xI;_>m?-xh#YcsPwHE}@yyOE?q9m96!48EP}Nv~ zTLz2g@EIsyIiqyy|-m@k!#&cIbHyb ztC~P!eR$wNvGwchHkD`*uCWT;%X6KaNm}pIdNtojsd}N%Q&t#HzR6gkQOoYSyy%yV zoL3#~Px{Jox0Ro4Z|h$veOKJglV4j#EFL~Vh`EMP?xQBNUW|e2-*aD_Oye}6IegK5 zTmHOrI?lWEil{(`uFnN6q#n{?*9YUxem^$D0@tgpPU<>i;go{#F z6Rof8SPCrB^=4V_JJ7W%$ubqsY}jT8rtENT0yNR6nf}dLm%ba(dpAX$1nNQvJ{5=>3qoI z1!`*Zos0-Np>GH}Z-HJ22=-ZjwYuBk=A6q&xREYBsdICN=`&& zeEM1c*SsJ9BmMKw3M0bb6%Y18wUdE|;koZVqhex&HT&)Ol0BfA{#u2IO`|!#Bnd=u zEfkWG4N-O&3lsCbCr zE);xW^lR0SA@Kw=$)f95>PZ-|nJp|as3%Q~-LH5^rc|#jb%^CH^Q_6<^^5pKf}X6o ztV##wL{?oHsQN=A5c%8B6Ree_sjJC$iE*ODqkj9t`KxCfW^v9%C1!rB%bFNv{7fX>Tt1=5ZrjPFa9-D z{ikZt&Xv)&e=k2R0GxRHlHvmy_%=8e;JsG&OfrP1&}SM&RLP1f0HgI!PNBFp4& zxkOWZ3Y~kRS5tJd94nVgF(4{$Xjcl!5ho{H1u@8RBIEICvbt~Jo=jS^hSS&o;+c0YgbF>YsCY-oDp4P zVwjV03GOzJ0rQJ@G_2`GJ?0hMhC_|L<@~sj2A6u2?eH{pe9c`Wy_*EhUmje)uNc^^ zMlmouy{sEBFxR|xKsaA4!FXMuwAvG(S7i-a9^E9bvX7wS7qqkgW- z$pVXeAe-*KsX@I#_*@E_}?Okdu@<*4Ixw;LsH9;ff zGlzhK*e9%qQy!a{76P2*-B|T>>_cm{D1oQ5*!{+RE@)pA-wJb?G@0v^*VZ83KfN)F zBHb8b<6(#6FA74Jt^m?2(eCy1FfAU%Qtr`TUE>d`d zAvp6NL?t|!#rV3!Jtojx(&6Nc#G>n%U9VKw}T3lI5)tL}ts_%)guF91&m4HXziUNh%R{|`)lcTLk#-gpYQzNnn z#0Eno2af~9$d#)vgTDL_{+w_b3c+k#2vUazenLdupip<}vsPTO!k@)FN;o-fJqFpY z3ek>a!ma8jT6c3_C{Zq0;A~`g(!28OYO+K8FbRn`>>?8xo2eVbdkZMezEoO+2`PP# zBznTA2jC}gbS}<7zDP=P1vx^=f0~9i@&R%4%H0m_M`yLt zz04R2yw<+Hd#q9Sw*DKC{F@`MdmEb zL-u-AuWWSRV|K!F*pS&H9)tkY1F12!O97un(JO@mAsx%X%~@D70czpLB(73qH?{92 zu1_z?gJe*G#%OfR=|3cLzSm%CD_sxN;pbu=th!@b{3OE@pPD(Ww2J=6&!M3->oimu zocsu@gwSS|O(x4d?iZ2mH>I0c8wWD5eNgOliZJGk%(u*KBIM zyfKxh{-zE_Gl3Bszan(mhc^i}g8X*5Y%DFs$L*!G_U*i@&&gZs+lfZMxP9gUpG;73 zI6($9SGPJR9W`V)Nl+y!rjaOZ??>k=xN-OE$# zD9QNlpCG-iF`nsvPW*SU|DDDyk@}=LlgH-b$7R!n&xKj3?5CPcc7$(pkozz^kgojq zLKpnJi$ul>#k~_zQqZ9%>E_KK9f7|oK?_`WABdR7%1yn*U1ti)WL8|{hBuj|mwX18 zT`|P_#!+0k7u0h}KHV)I3k&JQ-FWF9SlSMC*|T%cw@ijLB4{duo(HVzBTnASB{zE7 zg+eb7h0@jY2SeFm7p|kh)YsL>RGxydNK3Rnaccm4vUbgJ+EX{``E?)0bX`ZRDiZzj zQoZsiHRC(aj+G}}h5TPB<1F@tDI>q5MX>s#h(#VK9)X@w6mBKZgd}+B=HL6x_dyld zieSOWHqt%v2Ye}2Vmz7{D`hE9_3Es7m-Uk7<8-J=uNgZbzFxzjwRl;d7%(%TG)$dY zx3q5JZz5tt!D}tv?~bPD2V`xg_2kxfTgwmg8upf?g$;IFEm(jz}!T5w~}@ zk@0LlNDJaAtB3NdsCd9 z)+Au9H$cSD@64b}*+$xD#Px<=CC)f^$ z>snppv;$(aXqhL*T7Z!d6Rxk}uHLm?>si13jM`>8+uMnhgr7c-PfX0s&IaPrDjF~U z(UDbD1YAv@%oRD`ou~j!UxN_Iu~Pef*HMTW2`tJ{baTG?e?uOJxz>?!K>r{802;;W zEyr#dH@e@V*D5J9=2yEL&}{^UZ`VXzB7?}d4Gfh!58Ui3KwQcI%6+9`zdwbkJ z@?Q6pA|(unU8n~MBDp-qk~m)(_S?0+xbbcWS`_48nNi0g64lNA^@^`HdNzhu+ebGo zTZm}(XMJrqVbZba({hv>iT0v7u&^pu`6@^f)g2U;iu}aC=^BNf*Sj5Vje5`PfMT4p z73MdE(bkUt*Nck9=nkG73J0h#vm9%8lPKy>QI8Zu-eJh{L5CTAt0XOb^jWaAo?1EK z=cBaxESZroymjP)4(+;saIelp0C{yWgzk^V2{_HL|TqI6=U#h z;LfPA3?@%gDB@u8nPu200kiH!x*yvRDM#1~a?5ao`W96K9la(&6P{telGL7T$DCRN<*T4hjubmy!o-c=&~Telj^^b>2Vz@TXjR?O)nsO=>8 z=Ok(E;NZ?!qUkD362skMTLWQ=W$_L+pi$&8$%ZMh)L40KYAw2AtEj#^9 zSl&`}8?FC#V-=^vuGi`IXFYY=g#(2Am_0APZS>=_Gt#zq0S)a(D{_`Xms7M(M#)D) zHji6DFp*P4d`;F_+^pZdBLNmroGDJurQAZo3**Apzd}&rY||( z^c*mkB$3U`*HrU>I;XdLG5C?EZO*WC;OZ!D*wd|i=ZdAt_3946n?{{{Rd04K=Z?=D zdUE!j!Hz!CGduaQtIVj@4w}g&cmGzvY3K&9ZQq3`(l!wt1s{@!xpH;A*Wt*s7a{*1 zMpCx@WjLM`0_-XEMnOitn;lJNKsbxSuJ`A&Hps^u)tD#)E=mV#X9m#M*x3qoq$%OS zbuYO*8o5)``4(IN^}y8=PK&u29T5OEnfbZ;q%Vr0GSPfHVUq|`o*i}&S4k*@b?XE6 zhu;O+$Ij2nGLH%qpoatdnJz;j;qo%D+acXW^__%N5hgY=AYZnR|IuwVh z)a4*zN0=m<*pQXukgdxhp36>LnfPSm(V92$O*y#+)9F9-ZFWnlr&fcAWfO5`uJ1d~ z+aI6s(0~KOpzGO?owQ|l<4;V1CV_Hk;*S@CEl>{~SQxyDtxy;h1zZ-QV+(Sz#@NYa zoW^N0`aILq(*T!E0aA>)vdIB9rKDeZd8|iJ@2|%q2{V3|E(0j(wS0JY(biatD3Je9 zaH!m0TDBJ=TKnR?!+^%^L>bmx*fd3dx11eGVCg zgPX|~MjDnTZNidRk*4tsJL~qwIiw0`P2Lm<{GVH;>n|p3$xJ)z+lfhQ@Aj7xNU5ri zw_EqaxaO|sBiy^hO%}*8iFJbs1)@nPHf}{9>UZ3ekh^u8Q%2dsS1`E>0ZbfrXuuub|ELsHeY*nNxsy} zTMK{GemHiwO>5EFiR=#liSl-y{&>_!tt1JiD|ow@#xf{^!F;RILF(xd4SlG>eLTaL zv)#gIZELlwpB!M1DBH0g<-A(InRDkUjbEV5$ekjp!!|c31WJ!{mkGi@!c6-lBOP~s zI_x!!?9Ejs+}P;i&A%JeFCWly_y(AfuN4v@7CjHumQIDzp!izLxyj1S!T$74ygC0!kS5D0!u58jtXwF@>;t4%6CMcMT7147cTz3uiIafY>!s+IQECaDC~t) ze;GzYtFC6YvbGbQ0+L;;2&g5g40Znvp+TX$1DuS`x}-PYyhjm;ahc;c@u?LoW=v-n zsZ|8eXJa^eL&t}2+yF;*@_U-`P&x`u0oKZOuDNe~8<)9CXxm3Quu27dUr?XNU|-NW zOovafXiA5UiyJYIVViZgVqQg$Nq(y6Riyl@rqL}NXJlr4!&e56pYRN0a_GyLVH#36 z+yE;)1R-TXATtp%YmG-oI<-KKuKKQNB}$G<_b=e(Z%<)euK*`Ns zh?qo=&0D=C{lnv<->kgaK6Go^R1?YH9bc#&3*Jn+pt2H!fGHihYMALy!05rT=}eEr zYLAOZrr!G8>}qWBXOg2CvR7!b?lAb>+i{z&>-mjzUK3JHgP)W%-*+ob+lXn&H%Z=P)!DX1sS0@Sm#I0?=~#jDA~B;yZ-MO^LZfe8x>8+cCp z7`YYyOe)DcbeR{@M9PE6hDoD5AEBMZAoUsH(PVTzLIU1M>uUTA*#9)gN&lZzj+0|I zfe&?oDfF%%-qCT@Z8fG$Yvbl%-y3}%bD%RJu3pGZcTRQduD#Lew+Z z1IJ3EuQD;15KWS85zD#kJG5d+wHFKrpIsIS|K^@4>vYc|L5%jhex@>IG20d)7e4MD z?OJu8jgcr3UR=1*KClq$?BWhw{M@|CdL);$a^nZt=tkuEYb_%Vz3V;t)P+pHK;?+c zoMkagb^lG_yOiH`Ipj;l#Pb<`9rpFNL$~LUtRk^^o(LA$(NpZrzLf8z4n-H(QnxNG zWi(*z+_Okq%DZ$i6De^4hboo!2@U>9e?)i_IGUB z6hN$1DS%g4fSTAG3g*{YzhNqvD7m$^`KoOpowg73j|YSHZGpClMEdL9%$`@P6HX^P z{cTYZY(9yao>jagke}1(FbrWb-3>1@SxIGE7tM%`ztTwhNdJd8ij%Xj(;)ag>|6KQ zL=qn&P**{VGBbE^J|tfkW@J^Y!_u+>geE~T0>Z%2G6gx$e^Jgz3>*F- zgU5jGcYHgW$WAP?FkjEfg{)`i{ReXi*d5Kas{G8tpc@}$FVNW<6;7B_9Rr^MgpFZ3 zZ;yQ;UMDq~dr0UvoYc=nYN0?go+=aWYF&$9et}u-*hxsN#PapeT}K|U)iH2EGH(`R z$HyDRgtxAs|2s7%D%XIH5rKMf*C3E%H+&L2S57bhm`R$D#`(t0$iX?EzhFH~+Fx-e zeC_C7HA#rZUtCtEoH@pp74A@Teiwb?Qt%JzwVpQfxrHZD{Lol(m&cMxLP-Xj&IK$PzgO#TaT(W zP0yWDr{8UnLA1i!YCKPvgGIR(cGFCtGo;@l*x(kx&f{GO=u1L%g`gF~)L?`Wiqm`Fj76-EcqO(Yuw+MQEjS*-Oal-vT}L(WbJ9UWawZ_r@< zU&Fq>K80x>m{&N@+>fI|AHs0HUqft(To?Q}_;cB~&F zt|uBa^?fsl@_NVJ!?UhI(Ec?0x6R-)8GAOblyt|17?tohGNQ5Nr2v-3qNvLo$wmNo z9Eyz`rvt0plDGIjaj6@Tm}n zS0R;c=qL>O&w$_7 zkCiK|UJ+;X-)xy7Jt(EA+<iax}iR?rOHy??x zrL8)WCf(_W;yRxtatggv4=%~*}hy>S0zJ?9kcqV3!uFT`B>%=tJXL|u8 z3)ceW@S8c%Cve&Wi#c$(Nii1!5{UCE<6!yWo7mWHOxi8U+~0}9X*6A4u{L@%L5Gsi-VhFvuxCG(wL?&p>lLA-@*_tTG0m|0i|E;Gv%i4soL zXm|hCEa659UbghYD}IMQDMph2!X2?xfdOYg^XE?- zz+_g?=>iQ3!5k9+lLzMglkVxdh;Azp?r6dw8vn{4CYxQ?aL8u-Q?@Oj?|i$xt&Nbi z_mx92n>T1Ii5B(DC~JyloFSJYk2#Qpn0Uy=k`g>Z;)oaEWpM5dc@SVoF!}QAHs61$ zJ!~}8ir1i|W2j3K%SmX#K35*Z>*k3`@MMXm$?u7}z_GZTvmS#lp^NeW!kgX?hmm@e zUc&B78#Q2$UZPYB0@V1M>zg(k40=W$H_W6b{M-?TN%+G&l+SFN{gr_ zo+EJ2FBfvoibh@B$VUEkfV|H6@Y;u&)M4n zJGl03o6J+tuh$+NN;NOf_G8-JWAscvz3v>vFk&W9{-iq&>}4PT*E429m@@E;LCT49v-#Q~HB~ zcVZx+U(jC74EohvCb25$8X{LxdY?iC+*kJV2NS-~d%s$!692sWm*fJKFtLaP?a8aW zg)>BzM6NV5nQV#>>0*pw+;TGY#?X9&^QwO9s?Jo?fVFW4VCIoyM2L#jE8KI9ZHaT; z6&-^!=X9#jE9J%vxe);pFhzo<* zp*d|$n^`)z5-pUH#pd6C#qM>4a3D_}C(vLoa-9_bWAwC)tL+JlW6MHxtix>WC&Qqv zw6#@{xah|eUW>9c@S0NDVT6*#DI=B(`B;&aa&hmTxx7;- z=rSfVse|0-rj+LEmv_=E1Fk?-PWrj9Z9WKI7{+;d-Gxurn?B^p>I?NJVuozrV;r|k za6%f}mCRm(px%!uFp`%-ccbDdN7G5aTy~AiUYNk7F*w;iA2Q(mN~PdL+b zDt_+|BkJj=b7)4mTQ2IRZjpinJKQ}awSk6$J4}E4o*tR2%AvoPwcbPS@nv$k+U}k> zWG0E(NXyU|aJtkA7xrT1PX9LNo>tdlAUGJgvdqWs7!56Nndd->-w0)qHsMPaA@@dm zjDKXi%jf3xm8J8~k<0Gag~UZ#=0LA_6F_h4!d(4EL zKi0xH%8Hig*t=yD{*CO`H9-mgyW7W2BOr45nl7{zxEb4n{Nor#FfdpK+Gl;hX)!{@ zYEk_AOtT1h0J}@~SUd@W?u=)daoyEaCbKD%%Pm#1g%O`fEtV5wn8fQu43Bv$w4l{F z?*7+lzvaoE>DzdI23H(hECQZw<1sMe!3ain=qLaP~F)F-I87xRrHH>Hx@__PhRP<(OqrDuo3&i0B3$OWAB~j7EMti`s}hDf|?l&zVV1dnb;2g z!mV@?FfR{kg<`2iH{Eg<*$bajd3OI-Pas21?cmvc;h#Tftlf8stGNaepsv20sKO{+C{Q1r zB9FAzUZoxMrU#zue)z-m7=&SoHTGP@4G4uSkREnCKp&HwKj`s(pc#Zd!3?PtBE!eN z9b)ITfs>PEl3u;AumyCwzfsYd8tBkWS!TuIF@O)>>hF^Q6TuJ-)6Sc3C6=<0(Q%(t z6FQIG8v0Lj11K$)`p9GJ}JBAo8h{E9ajozxhO%_e$kg(Gb zSPi>Dm>_0-@kYioWjg**Ow=x;PA;iU>dvIw77gT1#$fd<)i%2x(xwa>VY?|m{mKz zY_XMt((o^NqnKBUQn(iZO`DiPTl?~W^da9NCOHvL$Bs5yG9m`lT`ij&&wk*LM{iEF zHSV3M{}Bkkh2a>Zn%)`;>f`R4q?kIwyDjUQ%54F~4pAB$?jzyjZ!8TJy;sW3?pkP| z`Z%JLbeo(++mOu=S`}bq+WTf&YFY)=*oe#zR)1a`u}P;;ox0Vdl=c!h03v@N&e*`TXGTOnNP7MKYMLqZ1o+zxHi^)0FkO&|KvN2ZVBVY=A5*XUMsxj!S^S-yCeBW^%B{SXLSzJ`7?D`4uQ{?$S z)93o$eyjI?x;^|mbLHz~2RY38G64eHNe{Y4U~Db_Yr!&r!2clf=OBpgJfQ$9aBy)J z$Y<7s{!a z9uhQRR=>D@!U{@&NidBoCHS7yx}U%t;M`s?NNuGv$Tla8Hd8bhw8hg%NCIiY0wtc) zhKdu%3Ch$=;wiLpY4h{*&aTPid7KmyWkTIJR5cK@3RC6CptX&a51@J97J3uvz=dbl z>!$vR(3fdD{Onfnn2jQ0;h@QjY$j|H^mZ-eS#aP0ABg`Sic-MfGzGb3dKo0!n6@|fKNxI;XcJSNkEuntB)1_?eiL(V2?^z+Qc ze_IDK+ea`SmqY14GVKa8F}r>Oxie7EenXYy6-6K17kzWN^I@xYDEV1V-2mnL;PgZW zz6ifE`_~l*UMAQ$)f?U^;GB4EL|3whSWh-oLa+AcH!0-n2MPXDa2yvwP3GBFIz)9C z$dKzo=G7?O3!UQDb-;N(U^&%Ajf>UHj$r4TW90lUL{u%&5&X9m*p2xeTah{nW~C+j z&c5!YeDlQYL&T^ur4omIl#Hv!>aCfYpMRC^K~_xQn%%aOu*+3AsT_(lz^9XO4R@=C z(enfMdxY|Z557z48wJgGD{W{+<4Ys#&Cx+9o5Ix`_4TO~igb^iAo6dkMk!Ow?NcgZ}WGGHJY2r7p>(Ny~!x}_(KbH8#blV8<<7w@u|E~YRilGmBp6@L(69Cnr=gERyge^cofLaAQeS%BT z=zx>n^*<{Ina=;p$e}hx!o{H!;oiSGh#U;R^;S!$@=UOM!Y#h;|oTwixXtpX^Tt=|jas4z*ST;b{h*cHRhf>}q+!eV`9=_othJ z@t9N2yEeOUB8qbt;0Zg$Kid#fa{C04*eDw2)Y237wLf7R5?8P74~7`j(BN4T4NuoI zi2>$+16}y@nYpJ5P&IxqPGrdd{(KU2Z420M^2JC4YB*bEoY2}?$e$NZ>+l`5c-^HJ zc6(ytohZU7r}vA_u^+C;vORviV&(Kb8xt$1Qu2N$sG-m_BZWSs{qx#{+N82g%A3~32q^N7_VHwlh z?b=y(=?#?P)k`2`*iaqjzADY`EpqFp755`6=ZISL9UVV`Bi8Nsh)WSa-H?J%AyQI4 zY|*9nEM-kUf)>T>pgh7e(gL9QmPC}Cj9`pQB#kVl8ZS%ANjv)p)Fj!A>u`0{*y3-Wd`)s zr5|ilojYm)cmAf!RaD^z~Sc42tuHHhCm$xBto7pAq0v_aPk(`>>h~-UOG0f@7A=!t9yfUx17CZo0EHu zkvS-NjheQii76;H@R+_UbDgCj8~c*Hq`{g0Rnz`&>w=9I_3^?{Z)3JV<|*{4w0bq zT+8H083DX?ptwm=2EN=S>PS!K{2>6{j_=jRDj?$7h^8eVH?oW*W;sSUFU2VzC`&ZN zp!h1ShM3^_z@!TpCS*K$uf{U`$#%eTVYbApz#dcCRcpn}Yw~m&Aj8U;z18DuE5~C< zZ`QO*4zUdy2rjSH)%|6Bv-p*3T{BiD3l~4eE2q7aEvY2~tz3;h&-Dau`7pPqnnh3d zHtIB<^hMsb>41jQvgsLru@SaK#+Ix z240LcAsKG~<>&nT($c(sEk+dn-P6Md86xbWMo`YRJy}8^@Cm((C$pP@Rk{EinUhx#R^=dQI% zaVg%ZN5zU>WPwk-;Zh!trCSMsU%$0r|Dk?%@c z-Hp15v&S9hKDk_~YG{Pz2zczx7D%M?yH%#I@X*rA98mZ_U_`){l$3ZrZh3@ZO>QV; z^VaL#wDJrcHwMWn9Vz^P*8ZQ!iBjC#MlNuGNAVu5k=$s&PEvfHFCQ7?R7ea^q!0#t z2FXG(wb-YFD1;V(#p7Idcvy?PE`ZExvhYH*|Cq2zCSjsZIj149 z!B55Y>GR@0oMXD?9&onzzm*R2=QK&#me~zp5EbDJs>Ysht4L)!x3Ybe1F<)kq3^~f`Z3FD$cGp z@A(VxcrZm@J`wr7WC|a81O^`F%qCR?8B`D4o0+=IGvzk5oQ{Ie^aqU~)Xy3fx|6di$eh z?K+HpN7mMXH9PO$74VwfQ-NRuyBc^irh*C_bJZ8dphzpDHd%$qfH&zGaa|YYj&O2R z&QSg3I}9tUdoM&tYd|&Zjv3ST%nthH{U*US)utJJLF5O-Dc*TULc2>tg#R4uJTLdz z;FkHb(SwAQ>h#_6Ec2$<1ZF`JVt-yY7;B@ZNcL}bi#=11MC1+)0&1T_9;}qvhBL_A zP+Q@~77~GnBKQyI4 zED0!qaO_iE@!P!=682NYsB-$e3G&{L&h<_dtRI1)@v8C@RORi)p`sWc=F`q$#l9KJYT}(5-M#O3|8r;|3N8Rfuk(FHnB_80!Hvk0fXQ&zf z+CP*;FrLi`M;6$M6FKC{jsNBt%C>B*{c654VJAhB@M5(n#2FEu2L0kLCxK(BBiX_X zvj}^Fy<&v8_?9)@EFOIVGpPOPf}h|0l{6Il67RSFME=x5>=u{a?sbmOasedb1eYng z0c&E9eh}ttW4KR=2inM+hj^PYF1ihEMnq7Aq%CROrRoQoe4d-Wrs$zy3H}VKOd#v* zduuPe?^)4_@6b(oIfL=Ca^{vga^k&cJDH~w=d}xe**)3#Rl82#hd$CldXUGdU;vo? znu;v#F)E^xVt{|OJeBH)Vu*;N#7z_kZqw6u;lo&ODJfmlOLilyhd?D0Yk68+atXDS zLLzp}Ze(vb<|bn26$LV^`UBVs%KCLX=P~y@Jp*Lk5xdV(JQ^c}b5E`vo!RcdZN4y9 zjh&PYDr<7;pt5qn927mgSS7`u)SsT8_*cTwJ~amNm2SO2D-nn8R>Z9OLPS57A^UAi zJdv4<|G`3ZDAXVvemAuR;e4|ZTHw(^@+K<8)lNX13_}?*PkNeK%(reSA@6l7>Ppyd z)X30vU_Xg*>=;j&A#Yt5k!Q669q8_Sl!U>sKn78iw)t<@nS`Ws9BuntN%{K=-#x1t zO0U|^{D&Yo?@I$8p62CQrMw}=f4v{!%>QN0I6`IJ^Ee-&p?V*!Mk;BSZ?nS&@!Ar26^g>t`wHInohjdW}Qj+n0dz z4|E{95mIaGK~QP3CZfuPT!iENF8>Wdjv56e7DY$5J|G$E={0}!{_cTEkdYh;5>#lB})1)=g+S5~srjsP8L++UN z6+D&p@`77#D0LOD*L7!Od35D%@~wnwn>B01PL(5$-^U0?0xk6%9hiC_|H?Pr=daA> zZ(5dMC{knsR@8`@)e#a37)Ifp4?W0+17tVq%pD_fnp871)__JCkBt~BsI%y!LaE=I)gIaLeH|n&Mf)u0BZ0{6m|Jd)ruGkE{V&qCnbm~r8 zB@ij}h4$AE*&yAL0*~?lKywwQU|4E0)5%QYV=#V^M0z?$(;=7MT>Zw?Q1$7FuSAWN zxvF{L7Y0#lozvRD0hyFNW&JN{yYCDS#t(G{4e#!uiXG zolbdl7ukcF5Iuie&`ybyBy!4#wm<2_Z`j_1G>d@b`(4+0I7BQ zoI5*@C<0R$4CV89iSM_aX5`O@f`W3g#Y5xz{kIbq@K?e=AF*{|aWUQgI9G>VTh)@t zpG5BU$VMLj3EZGHbpA(y`(ygM_!2f8W;ixe%3wRWI4zxe7`C%4rqR*)K#mYY zu6&i*QX<3iw{C&}>IJ$3{JCxHbLL0jpaDx)?_5;#Sx$PkAjV_0ZoE&eVbtqWOhLw+ z7cp`eAAz{f#g_8-bnJ_uR3dIC3fM>c`o48~ycw#W8{YYcA!_|@>EtE34b(~=vO0+y zsp9bDKfu0gTdrs+eBK!KW{pr&!EWdHKw$yl$4kj;P@J?D8Fy-Tf~Ha<9_MR1zhcM) z;Itq`2;=WxR}|FYbMlN~mGH3b2KW3W5`3@5a=Qa%3&e-flmKpqDxJV3kTIEV%Yr|m z)f-5?RHTK#GkZXUp0s2ysCBAQn%ULN)DEo$!Yt0dwlZ?7!%(C`FDd4y_HcH+DxRL! zb=ld#+vhVN{J zAD-H%zYFGPN?*H=oSnD9e;}RdOEgb2(>E!=6KF7AnXRa(0MBoE>~(q=#IUl+_J?Ik zq~mYL)b~iRwUWaTV^CVvimd$>!TLdzl4<4$8)SV3I{A^Ot1Yk+xFJ^Fg0rjUE9s0)~2U_96{Ct80aJeUsYo)wo<%6 zxnU}47#$~$BmHIVmpvC{l6dM=@MiLlSUGtK2VDjZYlF(Mz|TeG-w<+;TENDO;sjbw zKbH>%7Z@>cmr_RKRn2rMF==)QGhCom-g(!tYv{s0hMeKXqouA>$tB9WB!?mxPgphEuQRlEupuqrA77N`Ff zVAidiRXWxrQc^Ul z@~Z)L23=pq+EcD*LSckC&@Hz~w8Me{eVzXr9%AZMTKca>nBu_3cL6W4RZ4 zR9(jiy@9>c!~J6TVCI-!5Vo>{d6f~zzrDgNSiPg$*Dhid#S?ZKRYH88YGyse z07nD$Rr4zS7TNcglCn(|PTyEA^Rhqgd~c{HSvP+x)mX~cgt$60gh_eG!)DTszrI88 z#j^sM-Kr~@;R8^Hs0-h}_n+{WS;k^@2m>>!CZx1gW; zYzy!j1WUJNJM8;$%rV!a5fl=aGnLwi2;hMb@tk-y=vY?vDOhQWdQ90wq&ul~ehrU27{2r%j=)B%}q!=Cg_yA%QSgP0fWfuf7@ZTIMHfP_e@t`yCEzFH|ns45|Ep0Dcm!1NoJ^11qY zFN!v|@8zmD0V43;UDk6PuGFYvb2Mxco7_0x>7|$v1fel7FbplidThC+rHAJW$X~^W z1{=b?xtHS`ddJ_rnsz=_+!hy(XE}G_{U$sQN}92!J9YCCQXtf^{O{EQdAX3Zfg%Mw z+Q?}lTm-H^&5#qxH*HC@bV1v01uX}IcV5;(p!b^&@3JOZ_$hFvh7?PzU$^3a4|jW3f@eKyI2LI zLx7e|9W2b4MyA~n@#lNd@$vHfDiWzUvX%}Z)R|NRH4j&kYKre7>URPH-puU5$rmuy zLLMDCj!vUWk;m~QBRtYmGfALgeM3kqjFuw7w>C3tQY}Zz6+7H%5HvnaUw|DQ9fX`D z{CqR~urEAzNO!g5gD6bb(t)Fm=~M$XA^-(ggk%+FCrm6M<;AGV594r59+Qjc~s}e;c8dNU-62b zAYm!7rX)1CyZjyYfBFg0v5P+=s(f9J>U69b)VkabC5j;*IeK>7y$I;4{1n&!;{mmu;pA?YSR>)|$Foprn8R#W+B&f$pGM)Z( zXbvqkHy0IF5D8dsz27n{HZ={9Am!I@#oIh@ttwu4W(Y$@whw3bY_vMcxVSW8`RVDN z^sFpJwGbi#{MIf&H~XXYKgMwMUFW3OG8DRT0?fk+8laf|Tb`W0%Fc}Qr0Dz-uI(aL zO@aM*-xH3ZPfd%B2b{dU&Atl3hP`L!S#jAamW&3xsAWW#5OfBtL)Yc*oyC=mT0gcn zjLsx4>{-t5+$C4GS;{}gLxf7FH;o6b;P#REq;I4T0VGyX>%v3z_N>Mr`I&*nBXc-N z8@L8;%}YlW6+JeyF%z{CSnS6KfBo~9%`90A{kzd0e?Ft3T;^jUe;$6KoNTu2N7rX7 zT~e?|!0sJ5+w>|k`w`Brc|uL$Cc7JL=5&H3Pf2%6wafYEVngciHY5TfA3Sj4zx@-* z)}*D6%*k7IG%-@gj+H^g=k z%@{J^{U3y4xtj7bCIXTon7of&XSlCwa#+=lwpE=CeL&&mEvWsgJOx*YY<_tbcwqmP33Rk1;X}B@o{>S z#Z9CkR7wm%}DwzoWN=1ko!@=DI!uw6Xzd!e;O<)7-Q69E zyA^kb;!e?0ptxIbcZUMS-7P?IcZV;}Iqzrrmof4yWA9tmTGyOxENJ7UmgY-eI2T+s z>|9p258_N;`ysZrjwH1L(4A@xcL*5@Z+TxMhN#mZp`nDGS`M_-q2+aNzV7tfHZJlR zJiS2Ab}=W&h71j-gYb*TyeBHU6n*A(@e8CbWns=k(CxaRiR^>|Q@FVHiV}JICC{rv z2^zuRZz$KUfY%2^?-_8$c5vOfH-59z+hQV}UAN7pzy(b>{dUVOg9qfRe8Ba8YG_tZ z`SX$)*({+0=3(fLuT%?1@oHa66pqyuwG@x40OS$IreY8YS)Jp=kT49o zLCQ(=X}L3e&OoSVgKWDlEFnKBKlC-?#(bbO-43h1d;`>ezLdF$+~S3+{>hMf2z_h% zRz){9a#)5#E|@U}Manj#^R!u4DmTr8gOr>)cPhIzueQZWD?JX0#5VtYU&j6?lr=}= z%t)gS!9RCUyI07YRh5~;Sa?TDjR(MY;A$j&1J@s+-<9K#l#*f03No4%@` zt{ zz?9qZwTz_im9}ssiGcLVA`y*Ug=NHZV#Ilwoh|460>4ly%}b|7vieYXL&_5xmr8J8 z+lsX7cJ~#|K{)-(fxx%4l0y#vfcaA8L7m<=>9^;g53-(mE)+bzZRn*Bw5G-N{A(_% zvwA8_B(L>jQpA^^Rt_WaiU#UGm08VskAV7FlFB2s8&DgcCD6M5*LzRJAIAP_Z;WS^ zdMM8MI8MDJANe}OoDA@as_ZO5f3p#{S#jn4MMOi-EO;P&$ec=n3rI@z3!sXU?;C;b zA-NcxI=^{NU?R{DJ=k1{BGM!SzYyI^z?jP~sYbX(-y%~_X@?AO{A?{kM~YHkJ?Ts8 zup%yZl+bG=IVUA^B#Vr^DW)lw4D8658eytR-ZM)Zh_A-L)`4-&4&7Yz>`5Uo)P=Cp z>1Uck!TxS1i)U#~K}${0UOuX;#)Yf5u%z0m&(6RMiyM{;wXdo#>bHSEfuBsf>nqAQ zWW7?=W^rIJ; zLIQ4i28M`!K2Q6cl$V9$Tq*NzhSyt+Af=6jA)+~4`v~pUy5O;Jg6?W*b^fQlV^ud} zQ(!tQfAsqZWjAY1IWILo` zY}a~hx<$0mSjhkU9S7*Uz0$b#<{PH3-bAzc9}qJvMm{k$o5|4g-Fawe_lj=+Pm zDM{ZGG~+ii-I9lUP8*96I3@Iy-y6ocvgU*t%cX%XB1d|E*=$b83d)e28a0p9qKy3Kc2jy$r@z;r~JvluHGRH>> z@=ofMq+@JVHi00gDw!`8I@l}vkMm&HV=i2u_$4l&Z}d(tJ56~Ts@!gT;0l^3ge(a8 z&6D>^hFxtA&SyV_iwbTEtKJ{umBipe&ik6=ac`T6vO{9XC8Cqm=jaw1B?axW>r}A~ z%%3V*xs5H?DBI0t4TPK)eZ~*;e&sU6HI7|6`~-j-|988d?`F5edVtB0AkeRNnk-$5D4T{L`iL`N%F#&`8!0@7`>@$xsIs>wG6mZ(nzWbO7p@v5)i(JSET(d8d2Q zSm?Txh&2!-Zba41ozrDgugPska<>2nfO}Vqdanag)e+tee7!PN#xmXxz<#YHoY@ta zkJ;D2~+xU#j_--x>?Go|Cua{giQ?Q;%aH`AQ$a*j%zI!5$k%!%W_ z-rD~?u2xTdETaCTQY$6ubAys z?-#OYF6o3_q#Yt&u7gE2{F@(!jAazu8&n>F?_N0)ukM8PeTVcCK?pbeZjyO(x3}GA z)9*#E2PItt$Jfn%N4|H~P2_n1QIj4p0w)RPaD;)&wtm69k9J*{uKXlW>a86W0Lr_# z@0-UT_DPoE0=*&~?#l&Vmfdar*bWFcnsn70m`=ZCn1W-X3px#ImgtF&Gp0lqvVapzx@ zg?Kq%ElWpOw@6qmjEdd3b+p7CaTrkgG13d>S(<$>{%JMwXP2EZsrd4bhkg3YMO=Oj zzsFpMIv5|~F}7B8k!|6=Z$(&Clbs>+l05>|8LU#|nU~?uV5kj&UtI5_ujRpF2A&fg zuPJ_aC=<^vtr)I#_KaX4jE93`e!L5)^Z!ojq$h;B z-D5`DBcK{pcz_0a`RD30?oIx$0FNIvxt4S+Qr|%|J5fip!E|25RvHTbzOU)JFAnT% zVSnetWj0R4!2_!ql0W0eK($vFA-(x+X4}WpCZ!s>#Af0u)#{RqgQiQmL_Hl8;4EtZ zm=3`5cF3IQQr&fEv(V7e=|_SDU;ex=nZ72>zfd#IZeM=(uv1iI`E(>lfU3z0lF}d| zHnsy?*8?3F=Zq7*bQ)cpxcGUM+X8Y;e#ZJ*G(-Sw%cc`?)A0J$VAi5Z}*Y-Dmx8#lZY|uN#i>Y#hGcdc|i_*k$9sc5qNq@2_%mdXfVV;;G3; z&NmK9LH-}RaWm?qhkLS;3n)#IL#Cu}E-i#!k_ZONokzm99bp!Xt0SlN?em^^)>cG8sj3N~lk#8#p!nuc5n=@CDPOMQ9Rm z1527;aFmB{w9#Nf*J=EOp-eI$knJic=!G!oNDZG&WZ@Xeue9YlYJi za>_Pw_#P)o=P1L?ct?m%syladuAEK0vOlugiMSTzt2njo1YqT6@*=(=Um@(rj>SFs z;F@~-0A48uN%Qwjx7XIGjqgL0$x`g*Kh}uWRO#OBzYY6FjzdqezV+PUh|s19>#JP% zVFrp$K`+p&&+_6bB}1-Ll3U{B7g^#uKeycI65uKuMcKAT>0}=wFImlPYrbT`9*wA( zE{|K64`DgPA}xZ$FepYAT@b_tXA|z94Qfp8G*&q{7Qbi;Ys8~6hd%A-1N%%z#}M7<`)uOcSuBWzbmVN=(IWnS%>lAWVj$%RC|!lN>}tjX#&V zTqLC5F!DJ>c~&GO_kGMb*b*KlTcIo*`?wT1b#l4QRt6GTMA*uP)Y-ptTq&?I|CEvT3ToSF(kMAI*v(~E=BLhM3-+v^e7ez)>-zw znqJ;~GOZ+&9h0!}W&k>9seiXF?Z3psD)#DFR&+dffv|9Z`<8Xjw=olAlzI`QfX}?aRcHDHc=~H#9MuA;(Psy7}st!SGa3hbt3- zK|rs6)I56&sz?==-G(fJk_nUOYCUT)va*S8g&+mCo2jl96?U>kJL>L!k9tt*-AhxAvdfL~ZYj_3g>@ofmGa zJY}OIdFgMXsu}22hlpsfYqUZf z-;QPN(T(nvmX?NoIqRe{h7chd5hUYR+@$y)9TNv)9~70=H%ev{^^m&W@Ip$n;&K&C z+n3c)(0h3(j;&)1(%1KTK1<*=maQ|~8eR8CjGR&*YYq3@S2CQ*7XYAYGKF-z7Y26L zX~$Z8nIYFXsQSnAR-?=CG5^}jrvtxm3mxtwnAvly0u>#DeXehWB_^qXuA(YBZ2?1N zD3+#1+60X?u@6SDnjX~ok!}pn| zjbUBq*4GK4FAGA+btC_MKPm5%pa=ApiPvJqR`f6+Eza&=fVdh&(29)!-?o)|o#B76 zgr{rx@b$T4ccRWVFUVnVSc7h)uEIoHck6ZF^HJFlCjJ@+SJDK+=`Vt&BB-f2znbl& zRlCO;6xHMtV5Rnp8p8;w?0@93K$7<0Kiw*T7&(hhGxWdjKYqoTppAbwy>3mdSYuZ- z$NlBoyIl(r*nG1m8P7H+57Q1DB9bB03ghR)(!%L=06}4lt24o==GlV$UdXD-wt@6 z2J?&u1{gmg%0zkq+i%K*TTgNdz_fqX(5=Q7BPM~yh{^}f*9Sc&a`xZgkXo8H1HJ^e ziahj-EBoSVXfbdjf5#GbC-PXkD9cx$SqH{Gv5%ET$(QxN?AkH0ObmA8O%5&po*uH) z7@=UL7LfP*0+RHL1>8@1E$|ax!G-dv%?GzW;_Yoh57iNPr2ozeamb1|QDdMRU;t9; z<9jgBmB>)>j@T1Y`Rr4%2ELNff-|W_le3chCRS1f^EPZeoY1x@XgSbs}I&Q}eooLJ*YewoMD3)vL}9oQZA)0p*wMCX^I9d*wyYw7h_^jyDB zk2KpuKxg9j>uJ2TI;HACs4NxT&j-J|1G&G9(3!?(n^4@$9}@ zC=1z79EZqY7(Z^J(>u3N2qZomFGRSoqm9WUt&gfhlKB+s8;-pTWY9LWLq#D+_Lx)+ zY8}D^<%JDHR{2=CCd1?ECMN)sy1Fk)^PpD?im!xSixwzwkC0lzJ*SJ#!)0*_@+V^B zXSPF`Xru1;DaLqc2Z=n1L_C5jw^)a~RQW*S`Q_LTlb@lj-x{&kIeRL)Z47P=UPwuc zxxV1x2!kp&pqE1yUC3S_D0E`MKX`lNzp_sF9L6$8a2%`?oLLECf6{rg=4c79F6ilo zattwgI1lL>-k*$wAT8GR#f&$e0kPEy8T&%%i4>ULd*A8 zS=v*iJHhB9(sfAMODX4>J@E0O8|Way;+TXVa=_8lbL;+enjpt6yvN@{3f2I~{8jc$ z`ao469R_NF6Wo;}XcruN?m7f@E*)?g^cWTMPX&u7#~E1>2pd{illkgq3UI=gnnW@s zWu{KzsKceSRKy7&-2gx)F)78}jqo=#{Zbcv3I+?pjmf*f$cR?#Ahz)DodB~6kS)Ei zmP5FUE}|u$K$`2@?CL3WY|nnP8JI^ga3K_%>XXq372BE3%eU=`_YHU<30txxbx9B3 zC>`CUpNyzqbo`GacJR9*=H1el7sm*hGCa%gLP>J?7r$xRGKqG8l`^9*kFKC*>$<~; zAd5ryPnpuiIB?}L);GxA-Q6tzGUN?;iuwPYD=Q_#*HSRdH4E(!31v1A0t0L$QI_3X zISZ)vn;{)G_l8?kH`~N&M>NN;Fr8E+iy|nQvm|g$TjZ0Nw#l1;sxE&~>UaflL%VUBoPs=r z%P@UcSnw{@Fun)KQg^Yrm*qO_up9NtyJMtsIjZCzteTj`!z6?aAHC~6!{z* zOo_xm@aoxI9acTO{;*m9N z^{p|(yw{>MG;1f6p_d10Y#Y-@4SkUd)Dw`HZw;Btugx&F#yWQUU9;tu=khnyDR4q$ zMd~tBvv@&c_K|ex_QSxgkkS=!epwn|P!1H>fN}uBh?JrWvZBh;=O$ugC56okN{l3I zN6sJfSww}!Oa!%3n>`87W zQO$sPfaJjDJfUuxUaBEF&&e(ndUBwN`H;jlPzXnVlpJmgJ>~ zQ6H_a$rFV|@85_`#hPb0Yue`D-@L_zlf0zv2NNMf=1EIq9^sqLgz+*=`aY0OU2fDO z?#HlgwyT;-Q=*%8nMO9#>Fii(;8cA~X%MRMprZ?2tz?)pEULE3pEXA~Y#q9YMO*K> z9Y)!AL-ucyb~dmq39<8&5I6-GduCRcm~VEx~K6vI4&^m zVjS<3-TD`yZ-&B-afS(1&XU+9C5hww^IHw!8vkbTNY||GU)4qm&e51vUp={2{GF?3 z*R~eKNfxxla|unEnSi?vQ!Od<8$b2Mxj6DSIgXQ`W;_zLOJd4sFI=;U@2!mpOutLQ zFy923<$r_{<2YDRbDgxMa!}Q4cX3bYYMa={zX0xXhThd$(d_AGm+B4d^I^ z3_AZOHjroI>?})%Euo+ggU!i-@KteT+T9+NeFu+J{NGToydnn&RaTlkvF_nLlm$-P zVd*z;s36MN+bIUdFyLDyNg{6?m;h&SYK0~-WaeMXMqm*)_-EV6dgW_=W)C`&9a{uZ zMfkeqVB%*?Uk5L`&ndwypacwnlL;r3=@|*4Kj->0VS>8&`1yqynIyrJkZ%cX+In2O zxAYjB1}amN{2vUV3A}&m9Gs-s8n^o6Ji9KJ)AP@%^2n{cTZ_!YKy}Oyq7z3n&{}L< zA+!sf8D5NXHO9u%XIHvoH<}{rlR)6_%5X-W#~h`B710l(s!p<@)7svI49>l`PgKsQ zx0>FM??P_p_PTl=IoMfzqpi=T>0C_%5?Ymb-a;*8_Z{q-EH~ed0<49&-M`-7{YYu> z4}K74yK$BoefUT?%l&t%(N~`6wHa0H;R?3I&fIDfKV1lBIi<&lofKpAs2sQ+`moj z8U-9QJdez=^JZj~-e$mwV>P=DZyX{U7THacnm!%tEin9Pi*^W=QWFhDcEHEta@uv{ z8X$B_GzQ4okl<1I_BieAVDuw;AJ_j_(F9CRLWcW~J(uO&^FzlZ5D83~fW(`uw@_*! zv-89!^wc~%kI@!XGeq^j4?1#QdY9|mH?viKtc&QVbrAF@vKF^2k)VNm3IGY!5D8>m5Cj{QD7ujw6()j6)WpK z{7HvPsVSrhB!C?-EOw%f_KqXQ0^RFrQxRIp;Rh`c3R(K>;C>PTuErgNlrF}f>m>o9 zW^cx&a|dxpjV9-q+tGN&yQeoTI72pNKy@UT;&Ni}e~%YXp1|RC6XjFRhd>0N8~Ghm zwGq!GCQ)_<%dTn9`<0goL^#$*W5R*h#7c^IS}J0FOWM1vKDVf4^97m=Vn~Pw7KYJE zti<%V2*!#vubpyGx{UDx@<`Zh3XOS=xC`|ZhgK@ zKIR=Ff81U6%3iN|o7R>GFMaD@u}m|cYlvlk4;^Z=kU+huj{Gy84}%EXjqq}=#@MCC zFyKK}j1yR4T3)3oPRuI(C35-@>-|zvzIOc742&TEPu}&vC~t6w)}2ND5@4P)`MT`SCLNEp7~7-+Met<*EKb1IOVWjZ(uM za&3Ur-|-dN1rDo~=hqKRhiZu$b~-?xb%>oGzIXSrZ2UGv$uRlQ1IkO2WKrRbmcCW2 z4z7@({;U@)VB`!8z}Lmq^%YeK8`5Y&xf>4qYfE&dzwc-KgiojL;g`o>*Uv*HRJ8q%6dyi9_zCl;KMfP>1Z7$d zaB>EO@=QXV_I*jgo5~m|Zh{}WrG-?eh}mrALPi8A8-Ym;P$>d_oso9R1gBach)dlo z?ODS{t^|w!y_2LdLpG&|3e2rQb#+7j&3i_tnRv@~air(;X)|Qu;^8Um>4Bqhy1{dZ4Cefp9lQ@jFvHVb&x&`-0^G)r*$@j@>jJ z77Kk?3~>gKy1G^oU2-tnS!RW6kWP`;gyo(UfZepG-5|w-g3LpY-mO33(&eB5@J`bG zsd^($pA>oo>SxpXWzpN)NwRkvT6|6ZY0Ex<`9P%^KrG&hWpDzn?jj8->cq*0IAY(4 z1BC8eCIy(APBgS5m>|*w39rUxb9}7bp~vit1~PIi$Aq1+!(tf?VieRQ(uv-X6+q=!N0zr)=VkI*@GlXsLt+iTKM$+k8`SisHKkr=`F! z`kk=R{er@BMahnQffEI=C7 zre;aE>MO1nn2pw=7mWKx3RwqB4ByEZr`)+gSB;uq%>(mUkNyi@uIbF7K;#YDWrgTuex!OX{R0E~xQUhSaaVyr^^4tclf62sWa(;HiVYYEGgli2 zX4lW0D%&`fhs`f0h~?jY$lJ6yXKBLY}NH7%0a+&wUc*MZ{1I{~WBuQJ$XO_6IZeF4~sJ$f;lBWpYNvQh@V zJ6tF=#-)SjX#{56^aTmt(9D27=<#+M2>U%4(7z-mh*xUJwogk9KJ4&ivyp3VXNrH1 z6!gwa9JJHHTfe_-?PykG@_r*=Q<$E1HoZ(^f~Ddibg!nd^HE!9{{VH_NuTja*I?mI(p z@D20aZEht5?p7LM;U_;fqAf9ezVzRkG!Vp93diwk3)X$sq1lR4UyQdF%v6O?J4rpt ziF11sc;vm}rugomyLN^z)_z9xQWzSjRJXw#?g#$yy%DL^_E1{;;~B*=G9ileJHp7LaD3Kpl7Tl{F@3zPzd8W~E0#TE zEkxiXDiv+#C6(FtwJ^5|}m8NetVH_!6SD@w#l&&g#wx}x< z%U{-D%Ho2@hY4N*py!}{^~j(z>7OXU)AA`C5?yO{sQFl~r~Lq2?0x&6#3rA~uppIV zm9=B-g;N=bi}X@TrHB)B@cxjk5oHgs_e7vB5$E?3N@@9bQ7a5dDTK$e@hZ;EV% zP`d1$2ILhPO%PQzuBc35RF#dSRuFuLY%4n?lmuI2{{Qj|NeJypLxjz4(d6G9!HgJZ zUngfH!Dn5JwMK%Z7Y5t?47#t4`TBKGnK;W5+<|Z;QW4SJI3H=G(xAm41%uJ-X_ui* z4CJC5yU(}MYIondt&4s$>tMoTD)b7LgOkN{%h?^fER59!bPlzB-XDa>`Ykr3py2^M zap&*`Q_Q=^Ps{?NEKty=v=mtA(N8v5{+$WXM-_Sj0|Muz4g+5%{-RQTj}ZMQnOsS_ zc#ubKdDhwHv9tQfag`(5QrP}P=pS%lVmg-@aViN$K?wc_kN62|n$b9F3h28&tOAkn0Z-L3WgL}n|b17}_Uxl4I{sbTI?RE8mU-+^s&L6^Q zD~-FBA0(e=Q~5-Y>Cy&M&e`yMaR`v+Vso7ImH2|A-rZE@^^o$Tce&DseHSr1 zOc1etG9hI@^Rf7SN&Hm?r6CUdhY#s*2=XlO4#BvG0NHy^iI@M>npE?OPtbqJ7{bi{ zwTW1or?wZ+xVZ?rxI{H^@zISag+Gi5=GT4kB&iyuq;o7+`xYN+x2v?Xl@Vc#>lGpG zLX2dOsfkr8sl^97##LeHMlJ0ub#%pICQU~*7z)hQuLaXCwVRQ6>~a&-E7%Qc2QiBR z|G_3h#vWf1hoNGj=zlvp>Nr|k@Q8=rRO2&%feu{Y;oeKkdfbU`K2S><5&Bd=w@{PcQJJRRppd=}&p*>)B!m|DS94PWDUugVs93O9A@G`*eyEsL5!cb zBi7wQJ)9YvLP`^%D)p=EHPs%}1sj%NvoXuL%zn%NfmI`e#k;=Aw-Tzp zDX-3aWD%j_`Yz%m_0SAhl=)+{|A$u%Oqz$vb^2@mm0Z*y!Zw0XiL_G2!X5&wJ%$OT zz>mkhGF)Ra90FMv7Cjhg|H9bg&|stBye}rlLSr2XO`IA!zwXK`(}(EuQ*MO1Tr-;9>3_o#|tWxOUhw_Kt2s1Hd~&tFCr1TTEqc zfYEGzc8`2^NR!Pgl)~F3(tDJLJUiaxy=~^2$c)?Aq(xf?Bm%hQ>+|3Yfpm@mh}TNIMWh!i*jH2n8h<^P6&z#RT`Uk{ts5F-KmCbe`XwZuHs z`$ENn_NVVQEFFXu$9Q5%{0a)n1Bc>m9mqQ!4B_jU7}srohzre8O$i7P)k8}9a2v2D z^$mZU4V<^*Zm>%XHtSg#{&Wy)_)U01RW-1VL8@nPfoiH8K%}BcGQciN)uQ2do~+H9 z`7SBSCu8+*hZ)`w9>SXGEFP&Zfh1)+a@1pv3g!B}^k*n+T}Q2~`!R#VmhJEk7Nl)# zNQ59ZpUaCqFOj;d4FOGtbN`0AVlnf7MuBhNLp!ZHku?K^2);M6u=r3?+aQXf8GIFX z$T=cpl4}yQG4K@m+JGxw#2w>2YT5^NSs)ozXFE@Gw$=6HrgVwoiS6C6 zorJD?_SVu$U5VP8f`97Jld>y+he;S#9=Oq2lviz92WT$Ie4@I3e$-LV`V%{bK^@C8 zC^4v6JbZ~q*Fy2Q3@d;TMvKBnAiDfmm0<*M{;IbzWGRhTkp0~pE1xOY=g8nq9&Y7~ zuJUq<8nFYAHdU`cM~vLLsb{U4BBkp+O2L34)IDC&E|SUS9OMM(O(Mk+m4s3ozoi~y z*7U-KQK%0;y#=a2aPhVd>>Y1N2Noi0udbSydp?M<$@xyeqZu{MpN7q!hfME>mX#1} z4a50l5rUkZLRG_MVDvL*^flstpDqnXI}RYNm|9|XWdmgFU=A5Gj;O~*#zUJhbUf7HXX%FUl&un^8SnH(v=6Uy1w z5ra>_(Xj1>*XyBLqcFdVcH&Zc*eAz!64`9YOHvc7f3qq>LGSKjo5{0%;~{YR6pwg! zM3o{07RZ%ss?S^>58qgFgFcnKBcNd)FI`?feQmKntcT`x(_1C<|Jx;~=CQ2zl6hIS zW7lh(WVF8@hK1-th^V6!TPlyB@NOZ;4lz^{_?(=aT;0v9?t!J$h#$|>M_giH#sL|r z?>~&U>%^cxlf2t;;La=sE32xHaJsM`4~=qW_}$%|8DkYP7n2+}H}}p-tWevnK79jL z=6Z1a8UK*{Iwa$opx_aowCh1$&?UXqPhPl9FxCTq}pVbYUq~EMc z2OW+(PyJe6nsu2{mOES;*VqfdJ3XZDd?b_LpOyK7#>Bgg(JB`OD2*5svHx`v-jV;S zk+tN;!K@~wcOyrnz;-F1TBk;Q6eBGYT2NO8|oZ zjY!w$TQkB3Z=O`}(8e&Kl+VXBpQgpIB)6jow)8yE%B`dF613EOCH$f26ZGoH9%WO^ zE#Mp<7dLVBMeeef3V%Ry$dNB4E3EhPz-c1=SCnNe&CXKRZ_}x+&&w<1=QRJc)qBLJ{3-VByK*m%X z&SeyzT!)3FkPcWa9n=9((z#Z$J~iLT+5GIwJqa=&f+8Q1!N>t!LnijZIIP%W6f(x* zL&F+0^6>KRm6zpWf~lb&4S!!dx8G5>KR+JXJx>-$%Oc07riTBGCd1!#MRIa;FFx&u ziAqY3@_Z{%Ov+LFS}-uE3PuFyL#skk%%ezmW6jinOn(J0;jvL;*gD5A9eNcdnLqg_$;Wv0ri1O{Dh}`( zTg2jN*%2kp*{uSfJS*0Z(6}nKZz7;n`iH4q7B|Tzq4+Tv9^r{@a78#fugEuU2!tDz z4E1RVxx)Czm=@NA93o5`8fTLgH`-TkLUn^#-QI#ABWVIO33=umQuILA()$i6vf6-R z;B}74qFz`)NWG7NFRPb7Up{-=R?<&(1PtkRVBFeT2`>GKDzAr&5AD^|>^^!ua1^2Yv4OM=-s`Np=T^p?N6KO`( z8V%)iiW=dG!@XOHq~EZUH}?6N9JC#|Q%3(yr?*HX<-p&E#uj7>5sfuDNQHWk3OOSg zq20;Q*%~Z*2z(OYWh;oXs6|SIUji;^3+hV5y3Z6Saz~uUYg$%A_5ZkoJSIsVC~W%iKnKr){)@=vWAP4c*Z`=aZFn3oB$*&1xtOp4^hgMDNoVKugKQylH6Kr6 z2p`bIn|D3b*{yD=h$PSTn~s2%RiYCVK`e-@RQuKi=X=n;U|jU5;(E}@It{rY`i~z> zu)HDe3yaMai2}Fxa}$RU!ou!tEo(3)88%k_xF4*APBF^ zE#|5-2Oc6fH#auNH7>KAaqVu0p@ro8U*r3j=PtOR)1Hd7Em974bc3bMiKYi_ZgJC> zhBme(kELCO=!>)$GRlB}`9@lCQQy=iFBbxNcZl2X7)JqW;f5Yz<-!}I#C=I(0HG}e zW0OlT@YtWvpYn^L{Vnl0a<3x0cx<)5MmY%=KO>HIH5~WkxeM&zRh^BZX&$3ZS z@1DUL%L%_^Xi>3WO*!n$xNOYWj*du{%|A4;kYosK{FJ%qj#~ww&2C{+5R7EO77&7S zeDaUTsjOfG_==*rMm2_G5yji7n@wC#otVRI>woo52M{6|+r?r8_J0o{67bBQb(tXG zCB&0xpLq{iQTDliN9+At)X2qsRvC3h>E`el@YiW-ijQP2E%7H-eEip}AXOzF{iQ^# zoHsXHw3QPs5EWF%1%Cy~L`F^H54Ly|#_gb_xk01$52SKM1@&VEZ(0IHpV)IhRzEByWIXHpWu(tkB9d=5yyKBy~rg!4E2x>m|LHL5?GR|Q50 zB%1)sDSWySW!$XWsGLo4#`y;HjhlkH8?EAR2=!Wi&yF)SUFvPo2YtKFHlNz{d3_EM z9JL6U5ou!X$ILS|9nb$-uEnF5oMF<(F%q?)Sj-1f{?3HGpNN>*x}vth ztwKLW6z?j>1#>zo3d_}M+fXyLcqRO1xoPJU(Incu)W>tAEfkUspvE@XXM)c0JT7ZR z91VKjlZFXxYC8o5rf=rJOA*$x#Bq4mY0;xk|IkdpbClY&0o>$9tcnx7ohg$2`EQvT zEd^c$nNs(*xC1Mw*xtN0i6>RDSk?`9{+ezNo+@1MOg-bJOc<&(tR8~eUd_PHAT9O% z-(sZv2tw)M0_+e=NZkYCg3a|99#uegplolba$cx>Il!zoE8???zW;-wFa*^)j6GQ5B=3p|)HNZOopg5V^e z?U69jNYJ)5dO;@3@IS~-HLaU?bLz7@?_$rdDAd}_rt|9e23ROc`I1`6l_(jS{|tFa z+j24i(xZKM9%71le;-xlh~iy#1qZPxXdtGia--y#AVvn||476=wI!UUqh9y_BvVeX z15VWD+q^j`k>bT)$|(xE04Ks%6@x-;8(AV|S9-T(deE3waPjbB+x;HTR>O*96L%wt zocabL0P1RLvp)6=xt-YECE( zb+71Ji2aBhNAsWruayG^+m9BsxOih6cA@ztRo$kOqk% z+kk{7!!Wx-^6Q|iAoYq0UuD*ZUf|M!5ZOp2Ti}vd0J%COpZb63KDwh}l&KtdVws^S z=BLwE-a(Jaq4YXCxY9f(MdX1qj3d~ajJAbdnhHENgX+$!%j#RM4t2S`30X3JN|F6x(|Q7eG*3<0BMMmk z0HU9_A`U>6L0+;~7F;!GN?BIw|86@~w$9FYWCbZH*z{K4`iflNH7SVg23Unc|HcL- z|AvFVA4p|;yStpj)R6#U?z{Fs)^3y6z39>NpjPDDUVgAN=>#R{OLZiZJ-7tm2%&Ao zx{OlLakv#22cmG{8AF15G3LU1elMS(paa!8%;u4!l@3;aJS2BaY#H~3%r-1aQr-dO zW&|8E@Em0t#@hRjrpUSUR^l~A=cr!^gSZVyo8@Ry;kg!n_N3YxG!YiSo- zOeCM6d+u;mVvMChf3lTbohobI6|x>E>F=lu$%kr_i40|$J17_1G=}C;5B`KWHnpEn zDKr4BoANou)T60rzGGoJ;kdpRaJ9CDH0j{GYmdK>tD_*4mLL)>$T!s5dX*b`J?NWegR%H>jZ z*@gTwNj@Acu{UHe-mj$O1JiM!A^$9q&y<}(eXR%JIfW$wJpVzk3Se8~Kty3Sqr)M@ z=cdv15ccrL*pWj}aEBQMXiAzxX6NN43SM?;=o9)1yahD|`ykA0ZU(if%1g>+c^zZnd$Z;;p~&qcinsPZNUXgVs@CPNM>8hX zr4@sr4xoh5z7mTfR|mb;1DLC3w4!mU90atZFW41-n6RKG_kpkDI8QfKey)36uf;2L zMxJ~Rr7(_O3!rL}pb_Qe?ikBh)BzdgY9xciZR3>npPwnzwP_v!%o9Q{L0bA`v^o zU<4n@HCN!R59Y%~528uek*oh@xfUP07u+wWm+Gb#zi`-ZeY9Ol^eI2~m*r+?A2e)` zeO&6vzeZ{XcG*qeab<6SMSO zs0hd_*g=;LRbhCim)j?Uto9;ryqD_y!>We+8gzbDwG+4enNs!KnS%Bbobz*3hA=Ap z)MV-#{AnzI!Vug(X;1fcH?ipxS>8Guop(0JG}U!hT=laWLFDgC9oXtyZb4sV`Dzh( z$N$ej!Z}ekYT3wY(!NRSHtUA)tznN48QaLZl1y8daeXd4O}I@Sc|h@M4!?aT6Sg}c z6LKdVDU)Vd`t?d*fTnK&_3iXhw$dxTm8PMyBHex9a~aV=mc7#dF5qY1XxzW*no zz6D%LMa|=B9C>%xe*+E8uyu>1@3?5V-@hA{6H+_<p^MJ7{jX&HF{+QLMM5@3i4ml@VTmHasVnbK8Y|7# zqF%Xl{afB9{g9owUU~4pBUP`5{iCTe&JOTrN-_Di61$5cA|n}X5m z(BzwADGUCsz(+cT%&@wDrG4h2k;?0*>KAOgp_OO)_bw97IA)^~(LVpU>+e@6}Y)X`Qb%eZ?B2@^>CEy7U%76O3c)mu>;W zz^!#5GzR0Vtya(30@T}EmAiSQrnZll zgH1;j$U0CG72z^AP*P!vnc{0mAhf86z1DhP3|mK8i*N$Vn4jA#bYhn=hq239rlA!h zXE09BJAY=Lxv60AD;$BCMfl4u!TsGc_%KKsQ_MA67at`{aU-me&NPd@Eibu@;o3yi z=Gt5bVMXzqxnNJ)MkR6YS;#z9xa9*SjX1KwC9|#zY{sPs*N70=y+v~6HPn#7Q;fI5 zjYNdqw5D*GZv>ERF*E(b89koelMi)Ac2yF|jVJVTO|_4Nwd&C^eVk1`6idyaovO5u z*5ta<`^mG8e%%)CqJ*dP`AAiJ)y<7xG_pJ+ylbJ5V-gTL$nX4`o~QJL#L@OTZ<5k2cl*@k%#VHxBW4c;36r zH;T9RI0m`-*t)khY4aYFN3XvhyMltrvhQNL|S zQys19_sy-cjpG0g>VP@$7&?r^Wi)xAxi3=T3faq*Y~Da)Auu{7KOZ~ExESl#&!1a< zRvg`}g6@93pZc#GS?!z|A{oD2L{{3}*F-vVx|g@MjqTO9+Rpg$3|ki-Y-xmBZuTzI zdnszrrdZR+l+9I5k!&HBFPw+>1j)ix9K}khX}?QH#_jAhQ>j`cyRx1w?-zI`xW$Q6 zhX(Wz)WB-59DFJAl))r+zun0*iJ2MD3yXqn1Tl<9SQp@2M93fITAyKkiitT*1G%wjIfxbX z!JIA5%~d{MXl;ocQK=Zr9U&&)fK8a)7xHj4#8(IY<0QQpen8`5hHOgwwl${seLGIr*EIRo`%ERA-Ik9b7@s-FZ*h~0!QQBEaExhMW?M?N z=&3IQvW2>7tq@L=%6y-pvElLuv!T3-jinc0fD0>v>C%Hy!#6~5_ALDPupWJ!h{plF z=9;DZ?rVLtKg}K}w{=$ST1cC@o~qy9E$;{of|*22c@b9axn{8Gj^D?7JDF+@0<}du z|1>^N!f`T6z|3ba<`A^*LgtUPc6Z$7l8MBr5xH(W0xz^IoJ!b-;2FwI!7KwC2oOgy+T1+4dzv|ZC=3hTJRQ7KVyvRc>>X(UeigHv6- z$Pq__hK(H}uj2e+%G0OxXz!a)yl{`G1gxhw;m^ii;L6jiZ#R!82YP6FpW&_8ENJw4 zTG>JXZuhX$7kKQN*^ckoGz2-0J!dUmN<@A)2cQTr$9XuE`lX+7k9?HAVj;u5Xy4r- zXOUd8YfMFF1moJPhS~gI03<=%zVgZ%!2Ltk0G>J+X9Bn$+ux~zvN#*2OfyVuHp}6F zD-cFNrH5X_x0R!E{|>yjejlpayU^C&ijL-H9BWHJQep_|u0z=U_djBrsSL`DLd+!@ zF4DCR?>_S`KKQ5+IQL?tc5g-9!OeK>gZ*f1?M8ch3tC&+P*dZEB|Qxm>YI$gN^JPa z@3G-%6ZZHOh_qG1mol9ix)X^tuj3C-y5KTukXIZ;?YoYhVITTw9>m=5j6=LImj}rX`ti=zze)SH1AuBLkEvwUv)PeiUcSV za$rr+VTtho{`lBFR5V1Z#U0+T!_}rxfOu+03yrs-en=CxBIRmqImbA(TvtaU9fE!mW)6QJ#al=-qV{EIkM_%S>`{ zewk2Z4dYPFQM%tNeD5-Wte$t4cqc=Uuw88kRnUEOFZ(VQK7v^&WfCq1%IBa2Fu$7# zXv$Bh>IlM>M-Zy3M7ZLBNSk``xlm>m2$Gi5Cy3w5!wByF5TQf6g!yIOdnvS%qxUEh ztO!#6*%Y?IlGrZ+Eb5cBmie7^#}THoW*^EYpw>W@Uy6v!A?k;CEv^S&te_`cvJCUoLY_+h|Eb-bu^#%No-h zAJ?-lYHoWp;P@y_3YyR;s2l~T9gGPS4}ZHNUh$1l+ISU6WQ+ta9ee`2vTLBa zV+CBLhEpCeCmp(Z`7kah8Zv}ur}i7iP{Cblgsa#HdzJzA%!v)vAMAj-vK_bGc3ZSW zPd}W=1n{oLkI?L>$Ku>`kT734`2?`TiDzDZ6P|=3XftL+&&n7IH&9VskPoDrq;Q}O z*xD4m7zNiXo7QI2&>j*^x_rQMM}Unal22}}pE~#(4_Y&@{u;V$q&xfG@ABGU^Xwzp@J~2vp&j{g(}sBLIjlgtcLC11_-VYK9GTU#5B z9Xp2V>T2=JCZ50Ym9Gdwd9+%;@z}9r2P!Koapjd)p0NZl6X)8)48{@ZJas;81rHTzg-EzG#KmtS}t-YIh;fUI|^{Qe0G| z!_3slT{#^&p+H~9AOx@?WD`^4466z=3e;FQLxV*#HSkk^#gIG2z6%eVgr0 zwAkIqH0h9}(;$WBLn%pm7^vOrdBZxTkNv6g`WKVHZl50w&8=u@YDBQB1LlyI`T`f) zyX>f=cshMSgcT}eCs~khO@xu+j3KNFAi`7ctR$$lYC%r2>D|78-zkR?1T|Y&qdBTd z2QAeZ6YCr#?c9Fa*8~#4yfziK+YqL7jVY+u$1fAWloV<=+&1;pPczxe1YZ7qaxoz0G*AHjbG%UU%3AHqU z9ck+nA62lX9EZFaIGlbq7S95lM_vdeD&vlz~3Le2VW?zL8N9Qp5NXKhc~t`$%9%FW?%CSTzSKFxa}M( zR@`}L^!65u}u;%1Q!7@c(!9q=fE&B#eN{yai3_R#7SW}ZGK*7D6C1JOt8NqEI z!1u==Bk=D(A@I^;@IG=s!VSHhg(PmtB&+6qB3Gm#fM zv=jc<{sBLm&VJ=__@4Sb{LlPRq~`=!XwEAZW~B#$D2MGI!26f`;raFV;D7p|=oJaE zbOkrQ3D0l8FY@Sl;J<~r>R#ZwWzv}iYSsv5ZOqZsbrgbt=Xm)2tclDd@E9Q4FQ+fs zrs<4yVKkt$G2sZB%y4{TiAsRu6PpD%ZBh{D#sW@OEG{lPCNjs6P<~Rx#c4EA-Ll5* z2;rj{>FX^n{H(=?dwzH`uDNuPAa;ifBi*}dHWNQO-i_^DUa6gnNno^p z5$$dadF8mczu>>4{ohmtlfL&|{0LU$ua2IPAwz}?8H^jtzKCy~bDuCLJ{6#{q$BOq ze}QSjCvKaQdP*X_P@3g2!-MD1<~p93W6m+(S(_42{_W)f@X)E?&#^@5)3-zS`+9@ z1YWlbZl_ahybaNFT!qR=2rccMXzz9iAHz!vvxW9=Jp5`8JQ}-*L&nDgL4y&#)T}WF zzcn2pqZyHS>vu9_$QTskOaKoC9@W)IE-1sSg$uE|)P>H&oAJ@cZCH1p7H(fFygok^ znsk)RJ{M_?9{7$oq1^36dF5XCk|Ic*N7vLfaO`SFq+XB3^JXF^K@W3c9#W&0jB+`F5w-X z=9(j{DS0Xo2@8L_YzkVC!*tONBNnYe2?<{rdV}e2ji;#If*)yZ$wyojV#t+L{omIYtt>U&>P`AQ9IT zXW;FBBk<=qnZ*-AB)U(}2X^(Bh8aX(QFujA#bVt0@_Qs;oNr<=|l6h*1 zFD$fmsa!`3&KG|R?AM0tC_r(I#r!jCm6Layy{194-Rk2<(9nepl6v&gs+eoB#bZ3UX7S(Tr}AIHNcVS6sRn7hSO& zo74t8U)zZ=r76NYP`T}iwlapix~ZKwd0~Y3H$(jHlq-RZTjH+GWugSo< zPCU2I^U+{lNVA^7m8WFLkRfBzQI-b$&x)SFK5lg?U~Ve#**U<27XlAo4E+8g;M+@q z*(s9wV+P;%8M^0w>Yx8a_i*^>Il$#nAGw2pyYg8S*H;z*53G{j5sTvb7^ddmB$q{z7)oZ zz31lkF0W6-DOzWmfQt&Ga^h?JdmD{6e4fkgD>SbCcD0l?F3Rz4TG^AgpV6~7(z}zWj5zD~putM^9dc(6~}NGJtomE4NFl(E&@#|5!@oAhlA=PQ!H&xB}xwD)KL zI}Z2EGgL~FPkZ%=Qp}z}SZGmZT1@bI*uSqAF1E2Az0O*aI<*@4DM?66FvG0V!lF^4 z-5W%$GXO_Kg*m0gSUIZ%b92%K3C!Sh1j0dd1Z>z^U5j-G>Vzh7e~9IkE!Um!`$}Oj z^gJW|4t2kb!4WINQ&E<@89|+x40U12n1Y5wZUK~RHIUlq#6ThblQDicm2FK%{}^YE zkfS%jnmr9gbIVXRPYQF2b5UqjL8J1(*;0l2^20dP(1ga0E;w1eU2UN6%SVD-2ufor zQp;9gX0Q#$rb9T|*oLFKnqkx@VD{X6q^cYUw0ID4s*#aqr3r`{T3rGRiAl)Gqk#u* zba;9MMcxURmXd-*y#{(3gp|W90iV|fr>6;Cs}X8#7%HzD4p$Jm>@pM;&%#2Iv^l<0 z0k^Xm&TuyZsTSzqL&W2SUqORv@!6O+Egz++NlNUlu0Ww`ZK3CkUzbW{Iq1 zGLqw_$;d!pVwLX&n|4jffU5D z$#k_#B8<4qB%i_^((y3C`C-$~p}OOMor!kJ3zszq&MU>qq$`_==Jcy(EfU(unrlB# z>AyvocUI3?ES1v;5bk92)dvA5)o;`+GMjroiM-{u5QvW7LAqxE^T}eP0G9>*4ptvS zg5zh>ReKzgLPcmcFqNwoD#V*>brH;&F^*w*b|b zh>O$5b&RF_#~IskOs7V;YuTwhWhDI3I}#MzI5aG_WR{ zF~6)3*I&B=N%KpwN2SH9RW0c1vPo^1%Wo|G6n_JvZo8$n!hOpb289l=PQ2tB5Y$}RX#A?3S2x*B2O=&U-plCF$E?SKQ$XDqCT*ML|GCK@sh({@nDY5cka+uQ_L;N)ki{q@Cb2^z= z=DhGV{yjTaDn~XmeRZGmyp-;_k@Cpqr@0=q{fI1F&Yz?7Uq|`iw8rwr&+@rjs6I;R zo`p1K#;0pO9Zw`!dv~DFYi`A%&-D|5u7$%Pw074bIpr`G&N~LRx_>#}L1N;%Z9snU zIXL&c)q-dkskUxoV=` zQwX&bcuG`|rNq2aHRcqlVCZ8Y$rA{QsZEkri*%anw|BX4xTy_xkF-wDpBJ0nO)%(@ zoR|nxLIT|M4tp>HH`GuXEGW#*#I%eQq*;uDFb*cBq()ynp6!_qi@WRd#3RQkB{8e0)c?&=VY9E zjBX`t*x-*b5t&7EP_}#}R-Pk;3{?iA$Eu#Mwm|FsjVRUUC&yUv@b@asCXH8a#0B ze-rP$_B{UZ<}n&n-NFF33>h+HoK|4c$iteSU1KLz7#!aywCNN{sZgY6(;soYIuosp zHNxjEYbFa#VAjSQ0PGuAHDduZ7u^8eXTJ^oSN`9LpuO%3!pE-g`8k;RFP>eEZ~Q<;q=14;KNYlr} zYP@DQ*D+5jMpM`HjMyl^gyueJDs*y0S~?=A(-y=En@y>xNZ z=kM6QBWscwtInB?^Vckdq9hmpYLc1|0Uyot-C?kv`&#r`&zNoi(cS!f-{K}pXV3Z*pjJ^DQ9 zQ{{9D(wPGto2CQF7XT?2OKDe*Y~PFw88T!{2n=c<%iI%+k|ZtH)dj%ZH0ry!U!?mq z)Xx?qN`&LmEa3cn;CsuZdrVsDv$+qXzAu^jNO6t&SJp1(_~Vg4_b#Bmo;80zO=9H? zt3>8Hso(CVF@im8u}17FdjFT{9@db}qkcbrNasIUD|Q*B*kbWdLmVLhdp&vP)+J@HFRW=em2d9em=46Ieh z+R>bTaor?^TdB;Lh%Tlvg_RMgn8f=N>Dh~DJh`SsDpM}UcyL*9`oB$Oxgv+g9f~(h z4+p8NIj;*dB+cjf^vh)wpDvDjqQLn%RUs4(;z+|5)+?|!SC~n_B32@U*YjaMBwsGNm5|NJPj^ATZfekw6GZ2 z->!5ogSB#l!4P!R*_I?G!0YniP+cpk+HL6ec;TaWhoWuKY_T9QIR#FI7D|mC7E1!G zDJfK^CgCqQL_)Ej;_LEwP~Y8wW42nf1#3`L7%i^=7QhPJBi#h@d&|WEkSnb zGFXqw+(QDbXI&|ZOUFTQ{+``Tg4S&fx9d>)^;b`_SErlYH|8xDUEXWsIm3>h+HObl4N zRr`rA1H7{^2ESjJS!T`N;XwPzuR#Cx`=D8Q2^2}a$DxR`3*m-pgpTbSoO}~3!XyZ0 z1{3sm{U5Y9-wD;UnItX5t%gy0n5bgSVfGPxCX!V$PCxKh;wCxlu{t|Gr0?y;$L_*~ z=gx-7*k=WGj5uf63|xQ1Ihea<5q{t5#~ZD~H%o~2g{-B=*azQcjE0G-ljP>17S;cyM`f z9EYf!swr(;rk{ADi!Ga8hu_lFn=4+r*j!$`? ziD2@JO^0i!V3`aXE_l<7L9ak+vJzz_YJBn{J#N3jgzHxuFt1btqd_5U@S(t)S6Cm5 z<#yImPd6K}EH@Qd)R8~CWk1#)uEx>k4mg>J4hCVR>ofCmaMqmJSUh_c7R{QD`9%dV z>U8i0!{~5%QPI|pR}SvQF57OD%&WsC=La!wx)KK6(1vxLZXY^rl4kF*K~-%#9({Vf&;%aqX5fz_V(o1t zZEd_E$mAhg&8fy@ymM;z^QRiz#<;CKHANC2}WkcyO|9GH{rsC@Ca_}lOP zh=07X1A80^$O|ixBJSfP>X0$57%6%^BGuLKO)o@pUK( zEVy?we9u1u-y`?I_mAHo@Zw_#ZhTAlxs`Edf)|+Bm+r1EFKRsjI9bhP3L-@5Z1ack zo60UI=S|0rpSl3EXXFaA&pdHGm0)e+S<`cH)s@Rpdd^(zHCXVs+HQE|UF8FUO*ylf zW!B7%@1|HQ*Hca1YAfK_Nykk;@@Kgcz9rWA) z-L}vGru4b?18uML1ltDbSxyf_Nz(%+mz8}MGWl6`oEEa@xI|QUyh(Aal>#4g-UN72 zjpFIgbhQi_GGt6OFu~YFeerWgfZtJH`tWYxg`>bx>Z4<@8h}Q+=Yef>5B22_(tVHb z1M1j=1NEWY@3YqIqD){~oY#|L`kS?anGj{ITh`RwMI!OvsXu^3H;B4z|)6-4RunUI36Zr zmuE|wzg6A9TlBtv&@&ZX(TJniLu1tAbe_W|N(Yz6Xu#Y9=kq@_PW*|=@%L0#9R5gu z^Sfh+X&m?UTEW`btaTj&6Ws677|M0>D3ufc{+7y~%beqwOhhQJB1DhHx_R_igt+Uy zLhL*RZ@>k+ryi?Uw4iLd8_YlSH`QS?!iQ_paPuu+L22o%=-J_cHEaL=_rD8`qjS$a z7nzxvFdErq2)*nSg2`Ui=3TpXEh;N3@&5bo3tz)*ZaOhB5p(Cx6=d(l7hjC4uDS|0 z-ERUUot-KEF zj#T5rih69TYsJA%Ck}PFu)ocY9rdl)R@I1&<+b#8C2ZPbm{rz+6-#}XSsXzs^}mAr z9Y%fUWm_?a=5;elvM{|U6L~o)$j(T{{5kn3otBB>!gS1|zZcCb#NzqW#QEvPSt!g; zrF*T&&9cH^(4O)+;l}~o-liG>JZYG~zKLJO+V@!+1!fz@H_W6^tXELKExmiPz->&Y z(}`dCTOA*aU#Y5$&?jZ0XmKfZxQR$OY3CP9rB-Cjn~$PJMM&*Bh`RElsOgL#lvajw zm(0ZM+~gC_C1lS*ap@u~pIM9rt7f3Ez=~w?S*Vdxd^YCKTZ)Tv1Mt)z!?E&KGzF~4 zUv(uG&CW-0iXIAe61{67rcEzEUZVPh*&wAZ5&HBQn7g0=#kmPEs&!DLlw#qc94s!; zz*XH0hr^GcIS;9&i*fmdg~-v`(0S|-_U$W2Go`|imW|?!1QN8Vp-Rz4p@tzT7a1js zQJP^!vYxK0XcRT)VCLLn%qmVtvQ7oHIRk~$i?CoWy+ccr5K2#R**si&P6|wp8Z;d} zjH5Lj=rHCZGb0_jG+L^4H0TxO(S*wnZ|!~@*uNi@b`uivX5;E}OOT&rkO^QJGGxdY z2)ycVNfKtBMJOnRa{4@|<}HVM*#%H!#;q(7*bHsB`Y0m9@e9iX3<)nJy+lt)2sczA zxan>9U;8J5Z#|3PNACz9yux?w00`UK5OKt*#Ss*iWT@sWrGYW3Er3P6iXdN)}4{PMqnO7k(lEz*|LK;V}vofSbBS*8w_L7rieE(fZt5jr9B` z>3QdFDe$qUQX;wo)MW-cDI2H2O1cagGGvT5SZnr!8sOz};05X@U!?F7g(Dr&8=^Sg z1^nZnL=-XVPzC=az#yc=muh-onAn1KrmNSvne zsg<7DN$*%o_w^-sD=Ba9Q5kSJMEQ=_BpwZzw0-ulltvCrQZq3<5O`X_9?!V!IIS^M z&{)EGlpq_+<^= ztgI}tz|Cf$naIn?$T&d&v)1om1hC0uLTzm=Dk>_3Ch=6n-o1O_=-7kn*94Jn?SJ0j z4=AvHTQX|vN>P|m28~)?xg0K-kmL5FV&x-V&ln~o;+V}o>u~jXdMurzMUq7clR<&J z3>D5@q{D?vb;2a{C)emvn4=WS8Di?k&(b@yEJmDDkcnKg9_mmKU3LfBI=j)_*@fnA z2lc&P*gSrr@!M*5(KqbE@zxI1*qdO^Y{KG&UM!oZL{7RII(Bm2=bP^jEbC`xB%!pJ ziQWuB0_SF1k)D=_g=K}9S(1&?qD;)2osXppi?EEs!npVO1{D^X)#DoGnN^r!Qo+b3L?#j3ud((o|H^G`d@%eG zW27(^Abr85_{t-9;rgrQVzwoE{sg!}HApGD0+-(TOFa6of8fby|AGg8`a^u}v!B6t z|M6{n@}?y{&t)vbd7u40e*MIw`1R+{!Fk1T+aI+V$X$39KKX+`P zLHE`Fg?jGN=*<$?RI~4yKO)i*w*oangsYDsxMMxwl~(>0shLopbE(j_9SFf)8xbns zA3c)5={EfEVW_4{_EFhivF>X>f%@!A#PL|6&>5hxrU|X(c!Znl5NWE79#J~xodwMm zw?bi#Q-70jMu68wy8|ISRNalw?rFsXRW!Nxg(rPt&>#Ha2wrM-;oc@ce*TNkNzJEFW z`eCj$I}cKxsQZrvPfhfK3>h+HOkp%QfxqsPG-MgRkVKTSx#4)Qfe;V%@v*L!efTn| z*))ie81~uAK5b)QlJ}`YfW6Pg8ye!#5l6bRU*Xg^B00?@`5tEfybLx!y}41+D2@kf z%$BotiRc)@+O$`dOss!gMhA^c@p)vDd@xd3Ph%aYwXgr=y=@X<9&eJH|9+n}V*3#E zlZl~*-+``|H|@gHAN~X>DUHaCGwt0MO}2C#t}mu~9oeS8x88aSfBfSg@zt+>RgkZz z8cZ-h|NQf~^2#gm#1l^lpT5b-$>N<)KKUf>z4u;}m6Zt%;NgO`lt25~&k7ADO&NWmfEwz^5~w1BF#9sb1zL>)dYuw#n$rpGPK^@9xoUj>HZ%VC z{UqFXX9BJ~*MOW1CXBttVw2ZF41B{GX2fLWYmk0nVy7Y3yP6I&&fD5z#G*k#~<&+K}qdiPwhR|q{BR` zaa_ZkBqK^JdKgqP$$zF}YOsXtTTpGFK}gBt%ILw3RjY@R2Bs*#J5EqRMQNrnW^Cyl z7Dzav%nT$vaTO|+Y8Yrn!1u|JAw!0YVSvph&6o$xs%u10&s+#)N`^EZ^+E9HUWE2- zMWne72n=IOJ*%e$0zf!!MTVeSb^-KX{V{Z3z6ZKHegxfZ--YJm|! zhoeVPs3?sF6Lh!S3H|^36ZCi84`t@?cf1dUh|hyaXFDQ&OkHa)zXiH){v6u>`XA`- z{0TId+z4ehy|<61u#D3iAGEu1*P%}QPm>a+%WuQ2-}ryxJa5$2Orf3A!Egl5KnVAj z+hChH4ZpwtGsw$HrRF%Y1;DYQWLgHUx?~}~aO)~;)0^?vnm()IG6n>jK~7i%WPYws z_$;97ZG=I9HE3I(m$Z5rtXXVgAC7|%z(avGgM)7R9ij5Jg1S9UW4!t2!QgL{2<=!1 zPNBtl88T$Zm=yF8DOME#f4ms@Glf6(37;GRPc%LGtlg&V9Brg!)z3hW|F!JFynn^PN&(3{OLC0Jmg zHl9Gil#l=|osXzBQ0gMk=z{c&Of1QeAw$MwVrnpk!U30LR$xry0u#V0HI%{}hIBYS zVA53y4GH7pJC1SWN*aWDht@#(;k2lr(XgHLaZQX288T#?5fHmcdAzZvLzQ15g7DRA zFi8^{y3RWb!(AN+Z2JJgwJ#&IXA|IZoJ8vO3toNk`w($E5Q#JItjsEadg%p1>sNj5 z(b&=fHdJ4bWfqITWqA z0W%gZm!uK;E;vjD`01ND>h$B!wRVK&Psh^BmgCaZ^N?sU2$^Xj!Mo4r&de2>$LWh_ z;7CFuUTkurRW=9R3+%(!zMZW{fQN)WCOmbdS2&|a~T-+zj7}!|ONnoGEeV^yRakC#{&D2-{8#Z{4KWiz+ z@AVgaOg~H+pLdYx&IIvfB9^?-hCNkl;RQNnl(!hwCwZuRA@b|TenUGCPCBE(u7&*>C>m?9$JF|Itp3? z{jJvtZDAj^b)z|ml$0RFE4^nhaR0?29MmK1Gm@-KA!4L+6T7)r#?;1W`_I!6v2Syt zf{Zg8rPa7Qx&o8P0~mfmsD zv+-<1=*S-UpZ}{cAsudS7Q}SKWfuf(xU&`E+T#ek{}Mu#eKdvpf=xID;@%_P6{ORB zCg}k`BJ_@MO*z6X^@zBgBA-G#+F%quh!qN@@QEDU`JwPp+$;UDGN3Ywa9nZMr0acF zr3SpO53x+?>~)>{zE`m<0nY4)un;2WZs00^Zya;Iv zr{nPsKMqj(9BdO)h5(ylX0y)Sn*q;pi3C0oZ1lOic)>>^1DIS*Tn;2Gp>BsQw)Lr2 z*4pjs)0c_hluLUwhr`rm@w?c!@3?@wIPR+Zq+=i`*lLieCn!!c4Kx`tWXKqAu-WJa zhh(aGs4$p@EAPJ=Zaj@n8iR(}k53k28o&I@;31L8;DPqLX-Qn4Ov7-T%vcbh1jl^* z_8aJy6CrwTSLL&4=z3ZB{v{FXB(NE8k6($(<{a2u>CowPL&|_ImrMBJWz)~ASFa|S z?P5X7vSP<*5z~5YX=%aRZ@-Q0+qWY-I~!mB`qzc&XV&`V_TaDuPx!plQD$ z!G3@3cDo>!Po?JaSi$Ac++2@8KlEeNR_%n@7`@O3ev+H)jsz;Nxd;RjNZwQRZVQ7~ zp^OQHnkIfKO^ooRpk_rY3j9lLScK?#=^85}MNP<3;P2T(6>dogATvEg*G}{ZgCatW zAmT9~(yd3trlq-ona;^Vvy9$Q^qm||1cujyWyqMam_*S~h71`pWXPBRxLpXn9^-gER z??t$=Mm!sTU&PTBy+cC8Y43HN1C!q|&1e}TgC`Wh0f!&IuC(Dnry066x8T+vKZF~; z^i8B@=0K%Z!B1^Q7x3U5s~#!5qBzN*B*PgDkxtpYmV1Dc-b2`x_pT^~{RNZnC9H0gkOk)+`p51~cd z*U~nxH*phn9xpfVG;F&g%*Kg6IVqGGxe*A+W9%_}aU`9d84- z4-x*nC;Cu7D7OK3(Kz$fclv)eK74B}Q0Is~I7Q*|0|!WSw)>(d2yCXcKjUwFe!3ON z=re9k7I+9A%`kk{!cHtM>pc&Mhl6CSrglB9yWz7~c@7P#!@x%$eT1DmcVgzunMhAh zhruv*pP)=C@7=o>_uY4&&?dh9_S;cVP#_5DcvMwYiA{_#Qh2mr0-Mc97Zw&yDFT>D zaD%2B-~Uns3ui@7_5(Km9PrM?XD+-SS=N&1Ss7CiTAEt170TH6E3|(#8bJW_-%Roj z2KLeF4F#aq`C&2#hq^rqx+$zgq=|&h+H$T*|HB&7e}e;zzAsmg>bYtruAfY6b>h|qJw>~mjDRDvKQ5A8(o?SJ=*Cv;}Y{8i*N%;aug zu(ohZy@)^X<}>g;^?N}!`~UV!_@93S!FBZR@_pjnf!F>K7w4l09o~(Iy%UkHb_8C3 zs^?lXgm!-veTf7nu0=Vp2jPpxP6_Zz{W>UpgDt z+_DO1EiMrzm?zro^FT!-4DSV7(_jF0ugp~!uFq^ z!gFkW^vu)(`>L&qlXFz)UNU8)yBNL>f3q1ZJ&J zhK58KHUr(_>KzY>4`N)nq8M08V++T_{(|*Gh&QZFJDGdn{FJXI%8NHDO7J+x+t%vhmn_a1Pf>Ou^1GGgB8G^|E)$++C1dv55A+y>-D0dq5|FB-AGAE!HN|tker+h z6_Z$_1e;>6uCB(GEn9H>_;H+n{`pw6Xc6-A@&vKmSF3pK+O;@z=n!Vlo;@O8#eLDx z(11OA_6T#=8n)3pMX-189&Dhw;W>-^$R0$#dG{kV)^1KgUiuv9w5F5V1rsbZ0~LRd z1cBBHwEz2?@HdcvI83+?zJ>0!zeC7D!f0RXR5Bz2n41`zgl6(LK2RrglEytB#{wZ7 z3Bw(9LvIMcn#gX1#Oc97eE^iy;U$L=&Nd>Hodku>MSZ&uK7RmSUx2>75Q0GpA?Y`E ze7ZxBniQNaAM6gV$X6_HAsXCbc@6L}TScRLWlSt4MeA6Gj8llIv0^4eh71`pWQ-Fc zovjFMd~@)yZ1L1?1(#L*~1OItSkip_PHaAW2!_ke< z_H{jRZhjY$`r{(sOrCSTPh5+Ja8(~u)lQ0I_eSw-{C$0i-3XiIj=LV(^p^C#J{rX` zhK4^(6U<;3KKd;%Xs}T2LsrufbnIA%Lm$15WBYa@;PauT{4kmiY{!MEMx^N`hXCdY zE}MO>^91pcD}*DdsaSgP5?pohLKuxYs94=)3L!bkgk=khv3kuysAd-8!-y7J>;bg- zf@j2J-52zrqT>*{y#x0feW6JPjI)5mvw@^@CI7xAI@YAoWST7@hN&y0t}Gm<-NcCa zB@NrYW|qCwHTdFOp6l}@4O>ODi3aU-PZh;Ej(&E925=?4%N9Kmg*p*16rCJ&*%Il? zdDf)T1Z)8Fh%#izIDOILY(R~zg2t?=u^1f*`4MP3gphM;%1H;>fjw~>e^_(%+UdZ` z93a;sk(pU0U||Muc`@+0xxkGxq`&9IiM&ko?xT3zQ4Ytd2QHfiETZRf%rrh|B>%!3 z5BnGX9E}$@(HL|I{k@RlF%BW#Z+@R>F0sa)YOEot}daqI~-rd1A*m8Hn%)g5KB*O)d3vZ`!+JH0hs#vMtCo^ z(AsXEg|_zjP^;K&%c+y!!#*ec^?MNZ4AU$NA!KhxptYRZHhoxeu9v1dxXh)%-%aex ziGj*gsYgUb9iNIit}z6IIRSc$1uBynDkBFIlm;V3Z-hc`I1!Ws1chD?zeWi|f)Po{ zNl<7=KP!G z$dDmpih@losb(*N_NLo=!sosX{WpIO<$|+;lyoQyrbG9|??b)h{OD5>!W9REwk{Lk zGGxRfU8llDX-53-j1>HJUOFBr*5Sv>I%wYgCtiQx2l)H1?}fdq19iub;OO4%(WfR4 zOjN(w=E4&m74G@rr*O%tGMJ3L&Ff7iXf!IEyL<+&y80{>oKuGT>zvqZ8%H*B0+E|I z4fkFA2+qo19X&HNybXYT8}&)iA`t$1F9%F>0kxI;IY2*+&iAoq=%eSl)=T8@U|-o*kmG;3EO*D0@qImNOVCNUC+1l*4o`g zef^_*f!3(kg%pFN<@<$slGboxB5(sefA@0Wzvcr5dQVBRM3UCh_`({*gMo?S-_nrx z=Zht>b+W+P(yTQdLkgvTbs_M(3n^`v0KdNo`0+UsNqs6TrkdtniKI*JM$($^LY*9S zus;m&tK$QszjKVfe`_=@WMv$O#q7dBJSi*tmCaj{AWahBj#$kZ$HO z>HlN$`6ctuD`(%1>sEeez_t)O?t5)0XtU=cMTd^ zmw7S}3b7Vw2oc^L5{C#0#9>V)b&&L37-o$rBxTM-Qf@Ky*?G`r0?0yNmL^b6*XP z9dCi#}i}xeRxa#g- z;hmSCL2%P6cw^bXS`Fg~*8H^v!uVZP7nEhCxcFu^`&=wcE%!CAHx<#@@L9t|H%&}y@Q%v-6uiZe^;Z>O$| zx-i!CRaqngIOgw{HEiuWfVLN; zH{AW^ZFsHoRp@8OG2$|Y4d1Z_tSFj;b?eqe&zydE@WBT~c=_d*v0%Z1=-H_UPTzIc zU5AISc?oMuuZ^A^K9Xx$vWVoLP^t>HE(119rf$K-x)n16eLI_Ex)%QF?y1~=9*dK zl}TaN1~$eGJ&*4Po;nmY=}b^5B+`?$hne`DL;X90ede~22;Adw%yo`Z8x^<qEX^2zG-9ztvE}o_-I<_cx^b3C;{^^X+B}!QXPQOLxiF%=tbsj^Pvx^M|Kj z>H*ctij2&4H0A(DV=nS)l_8+FHrTi)WNk7~9djX;5A+Dz90)MxA;Sr5GI;<+aE<8(1OXE2Tf$s*k$9|u8xl)mQL69EAdEsk1e!rUImT9l| z1W%QJ-NBe0#WQi?l=-~(3^PhhHoZuFLQEP{fe7-ihgnBawe%cv40acWWo$9+Om&x9 zIw8}y8>lH!Rm)3iEn zO^g1h6&2IC<2ersoU2@<4*6b6Y(Ao(T*1rIK9RDlP zA1J3LNH7e~qcUp^EnSrGK@|WRR~LSB(bwG3YgNlk1TEg@(?B;=Ru>{GXD+dpoM*>C^W9pz4Ac5U0b@xUw+GbQ;+llW4jC%ww%+<#{l#XyTvk$ z^`8i}p5i1=J}A{4v^k1Vm!c%}qfsYO`&s?goAGP&>SA~`BVe*9vXA5Z1}SP~5p$x( z050fOLXL5-(qj^)wNva$C@@mn(0QmgxKVPOxRMsM9$$E!^x^FX4Cf+Q(-AoYXE$yanK7-Q zWGeP#_b8^$+d!fi;c2IE=Ydjz+2`O&i#>KjX6)`kvF0o<0Es!b$GYR4D^i4<9i7 z;71YhPqLMFclV$G{!gBqaMd)pVH7lO(9wjuqn(o#-CXqP^z zHyv;)`G$}%sSt5(`yd5zKE%ZdfmaBM^m5V$fmmqbF^XUlU-VC-P@560O25SISdU2{EJ)S;kJPhdlzrP=Y49KvoRo4%Kw{VC0ff(qVVDfvfji-xEsV0b7H{F!IypwOf zAI>z%qb)m^S6_Vezg}0Ec)j``r|N@ko^d z*_t5Jy-dN}g|6{p*C!8=`e(#!nDPR6dY#46KuQ!Ca1z7&lLVS*!lk%`2*Y9^zKr{i z9Q0cRm@5MB2K^ep)(O36>%ScM@iHli>3B}};qT@h{%W!&Sh0%^qh|MQPv>yH|GYq2 zfzARN!#D}J2#^e2{MV1vNc{(hI0NNf!kuUQFC#8T@Q@umN=-!)(&1AEMP5{qH7;3z zfZkA9ke@w6dvr-XHs3`7{)+r2U>g7Ch(jRhAVl~I0Doz+?SN!RaH5={incK{DER#M zZ?5UL@tmQCihr;X$$X5X^37uxf%|H-Pl2E-9YjX=V*_u1Fx{(0lsp z`}3!`dRQ`WUmIrttXz8y(XxcMA55SrgluC)#U)XW+0mU8y1P@^R@oUF(xIFblI#}T zi|@T%qT+MRZ){rp4&NIM%?-BoQm67|<;6TI#!)(h-DUM!pE*Y~5>G_>iq`KUgwe4p zsGeb59;9B+Nn4n;=P%yT^#Y0WP;);v&mCBmmCaw2>;64p(Fc!Z-`xn$DAK~IvRM#E2ITG? z{cc6C?yBe+dA_Kb!E@Ib4&YBO>px8F$LA?ABy~M$?~CsBc%A^e4cj}M0%C?ZPh1sF zg!0$~@?-;&Wz#Nz)RF?4TZ%G}nbJGmB8Chj*WCbhnzFz+#O8$Sx5a3A{Rnv#VU#qT ziY0CKYfoAo3VpU#X{#e@ZjZ1?;{gLX>9>Af6DB}9qk$Qsyhm^W>D`i3X;a?EiODmc zmnh!!0@^o8v!AP`YGw!wsc@M^7kp8-erE*RuefvULni;!)nbA% zxCmZDh(JAW_hSKf48eig9?646Wc!^5&}MlG;@6(gKb`A!?l-%~DL2sQB$$|(K=2k7 z92{Jo*<{9XN6P5e?-o_k88iy7k*Qs#vYDA9Wh!{k85|0%3E z|AP|!fKEfpQz}QjN$?*9=!yhY%^*N#gEHad&m5x|s*VtV6;5!%lj3FQ;L2g-VkHO( z$>{fDcNqq6KWj++rkG_sSXR8@>L?U5Bd#N{Wr^~_y!Uma<^H}guGO=P`zyg+s`L@( z#uLSHwfK1mtT5!SbwYvJ&v_kRV_^{%44q-RZI^ZGYPHZpOwk3r@@k7?P8=bz1<1t< zi@idQezA_gHMwBmBr(_?;pO1oQF|62HUGZvBJa5fwvY3a+#>BaL}g94CV?VH?D=Y_ z-^U5IyOA&ygDh*oH=H5CQ^M!6dH70+2*C$)=z7Ly?Y&3o3#|pnBR32eR0PTGJn7Hc zIJf+25@`LmDa15(etc!T-T?Zr#XNm+YjTfEL$Ljp8MNq5^AK`x19S`OMwU@A}{CCjWEC}9jIibq(G|bLa z|0A0PF<=&Z(}LLA!#nO;nV{v0WX0pwhnbpMpO#!4e{m!d8hyUgtpBh^a0+0FBO?!! z3rkxzTO9_Q&vZvS28TVl?On?`X5#|b?aE!4ZH@0kr`1>Wg4+@vAFddfUy$R!_=3D$ zNAc7Tnbnp+1>I3v52E~fLsI_&h3hw0{Z z#=}V7JMj8KhKBh}>il?2H}6CE_Avb&MMV&}xC1N6+@M^Z_tXM9Ur=KzzCo6_4^qTJ zHE-)tz1CN$J8%{27p}-A^l$O(NzA$x#3JP@6SCP z+gr7EgHv7K3qFortg>2+0GAza68lFby(UFSPYA~`-8EORLdc^?^bRt-jEQJ!C z475jVjU{1~n1+X-Zc7IMD{WyM$iC|&^=HAN7n~1WN6xuk8V#V;A#FfJPeThM7bSMw zkT-F1W`%x(1TWFZM!x%W$2eTdDI$F^EZRY`(=JtqN3U_b`<_uOjwB2cmk_UB_hQ8$ zn9&f?Zjfl*6x=C6m9R})5yi9!nN*oIG+Pokri$VqcRT-tN=i!PI@-BV)@wU0@Z67@%=@u2bAsx7)2+evXo7z(={hv@DuMZtn!CRi5ZAdh^2=k{G0k z;&F?|H`&neHxKq72&sCmlm1ZyrFj1cgBhK2+j65$~xz@8b7g|C+Na1YJ9kSK`PrV-B60e*cD>&&Xo0|AGiL(bz^;PryfUDFB&-m(H7?~UT`W^l1KP)q zrb7lzP-+4N9=SpwuB8ncrB(ew%p7t#P@S>-GV6h}9OVDLy&+=*X;q$CdgcE{9tgPR z0!AX_@bPk1IV;F~a1J{40qIl|18Ho?2x#wVHW($TH1Y&j8W7yRIitd{*G-t#&rrcUtBUF$z+6=O>snR-RAf5=V{X&T;Hrc(T? zao5s+Fzjg#!;4nU^>&KcdXmv-Fk?LpbDNrwWzv633FKXknbu9@#=2Rkv@Tvs!e42I zzqE1R#Ecxn13b}xsb~P@9+=#IZ?ykj5y|JLh2cEFJ4YNF*)$1e~!1~36u z?AA^k4dJ8JE9T58vt76E-D01&?Of=k9omW<-26G)2hT7O%%V{3)5Q0EC)Pqz4-BId zA4xsYt{nEZiv4Xz`cYNqB4|m}fsRm&OfAjLhCrCIg^kT0bD*7&bW|TIsaCtiE<~cR zZ!G28AlZ$@ytcYJ)!#{zsy>4}OY!NA;8A2fn3h!=YDPxv%%C(n0f%jWlAO$pj9}c; z&`>Bfb@jrE3b^4|LiFXAzZwRDgWmjDR@T;otnW5_$^>z-u}IF%guw!>sGbj_`;0-$ zM{$WdB?ydvIxUw)O6%{pkc#Kttsx+!uB&gFiaTiO#wQxBUekn~s8oJ3d z!%|hR5D?n-KGaE`m>U-tG|B#RGa3}NMixoOml;v{u{7})&4D4sHXl?Q5;emTmifTS8CjdmOVcr>h49AO*^+%YoxLhaIm(G>* z{v;ww;JkTK+Tm9P{e7}4T5TG)> z4`WVB+V0oQ5tp_Qn)u`|%E&xL{$rHj3hMQZcbn6|27i0~*yY3sCeqRh?}VEo^K=?|DC9R900Dx|`xvMCmIW1U7@y$kA^BlSKVr_Izo1hi=Tm zA1lUjJHRXDU`zJ{{rkDO;DEM$7bTldTNOjkyVHjE-DE%V%|**rEb;p`bn8|3n?mrF z_Yv=|C!O~$dM?T|(CA7^Pk(CCj+|!kyXC6aycVy)4!q}H;va8vnhj1 z`vmB0LX+#g(UGa056@dHV@^K&kNEyS-GDh|`-yzFj&yF3Asq%Q*q8v8TZIYsz*VNC zC|%8vUYVnU3=mZJ zLwe=)1KY&zLH=023bLAQBa1WC&ZO>1YujP&+mrYs;nH_guXu>l$EnqNPFAZE8d;=f z!O(;I+Ho0ndH035iG3Mr^>TU~GXR2qq)-uM;ayM@rtACRFDy8)8Vcmtd z=+?Nvuc^C$3e}3TxpC)pv-lQ!i~cB8-Yd>v52{CaI?2sSPk^UE17YT5!F-=VdkUTL zM{AdF)9>~CQaY>EX#AA)XV(jxAHLDHR|t@t&>@ik#s!xNB* zP|+dW@J;&Os9}FU!o&%lMyV;^$kp?obajk|Sfwk#GEKm?pI~CRvFj0YLii-svs;52`Y>UL}@6gX?78Jnq-W+5%z`+U9}-E3a@V)uM~TtU9@ z`n)G zgKYBGY3naxS;b03KYurP(kzaQzm@7$0U4(vjTxu==TZ6jJj(L9jGLSU4(r=I zC@#XLT!-!3?J*^BdxSx?#-KIYsKhCRrS?@f@-7aaz+_C1TuB@VU;Z2|rbb%X032c6 z<40Fng(a^oHZ>IZTkTqRDOyJhv1ncmWF>ktHA`6`K2+Jcdt>CvGg%>H+P2Fj)cLv> z^yAB!fDC7JJv{KK__vpo(Bespt*lYM-0`DYoa0k>O6?pt<=F-5lK+wF3=lyO=z)j( zPB}NvNlLy5`cn|DfbXKB4AS`*WLitwA*>vQ0>}y-%iDFcR`tl(7#hU6l0kpkBtzrN z{`blshJQOfX1|e3y18)zw+VjXR~Fd!1yx1Er_0U$dnW|BDVF@q?Ch9>@zlLUS%$tv zb^RD1{6EUAw6s+6iqGZx?W3RWHSSqwzqADBF%8WF}4tN?;!fkF5gV-8;bhd5FWr&3Si8 zj{LBGEjF4I)dGA?4@~Q8leZN~!u~)1F~@NK%_y;<_H>n@!Pm?xWq` z>vrgC<$H)ztkyRTxJTBtU06|A^pSeF1l85mz^z_EA$I1SkUq`C^lsMg<4hm2e8SQ9 z>un3$a`(M4;_#ojuz!O!Gc8A|PV*!P8rkUP9;=GmdV4YwdJNP3*^(R$u`)hYpmex} zQJ0tIPmMAPAb=|xrJy=Ako@#)g+5_H(1~`6&!Jl*i4O;1&R*kv)ADTSvMa3K{EE~{ zTW{q;0ab?qfa%fLw?G$#lnI~GY|G`@iOcSCQD%AEdvp5ZTtF#`98DW`hLYUQ)4B*lmH~^nCB%5uKO3YH@{_lNL5+TN`sj@iefsU#t(AcrXQDxD?a% z--uhB47~~N_)`9RjRJ0&ClE_D=axGi4_%>*(U(et$7pnyPqDKU} ziL3Uw#MT&iZ0;6zc)!1_>3#1ju?x(n5zYm5!oFTkdS-s_F-@sI-@J4}P*j*I>-^vG zo#iPe0t&H4i{k1cF%7)3d5gWv>QnCPFzx^CHxJ>2X|5n5D_e%7*CcJwi^DWUp@A znG^tD)C6Bf6=!sM&{u<~aiGCZ96D0TF=V21aP`H!8UC?+&j~;ISoUp1>k31O1Xwvo zn98+Pm&1Vox`O)hkTn+&dHHGwt}KhII>X_b5BIZ8XnWwnD+Mb+0s(1 z1vYh-)8@Lghd{ZXJY6E+xM=!FHclNdX`cllKVpr*`_#a+2j|MvX3p4^Xp@sU$C$Ha zWmw?!hx_tIsxV4mik!^R*yJAWm;vu%`g8NS;ZDjj2P~$rZ?OI=Y2sIC>-4M6%_YWtq91P7jO_kf-4D1jXuV6ipF@~Q-GW9B-f9P*B@tb*FCSu z&-(B9B3@oFhPcFvIBIaonoSz0H^M%3U_IW)E^5oo;oe%5!j?RLW(20t|}bvt0%*?lYT zc}RI~yN1Qj%l6EzfWN%x0Q@zeJq=(ix~T2G12SqNY=1woPqte>@Pb-gYWMt+8LbMR z4M!~pB9r6==Hacu3?--0$Lz82()_gM1N#wIN{)09x!FTa*}VX zA`(>VJNHWU`PB3Kc<7hBRI;$QAI7)uB$e6%_9+(?6~TP94TKEr z0Q+ruua67kj6Pl;fKm=I4=*od0-xWf_x|A_ToO>k&X5;S#7gUBvLZ}VcgN9OVmO9U zastc}(%XussXLR)4LMg>m$Uy__Nhhb7z!`}7Li7WoXb1dc*>DEhr#ME{@`-sm$Y3c zqNGwlcHnpK(tGw6fPiwG{_~kT2_R2QLMz)m&R3%;=g(BqNsbGAw`tWOa(3et^Ty(t z7Oqau$W{$p^^d+6GcgB{@{*&rt&UPp$cifqPa4^Y z0I`m3#0(^9ZVu>{&l#gd5sN>x4)9OCe3;)NuHDAI9Pw8A=J|@ofStk;jglhEw4L8@ z^0ms!?4ZZ}{6Q2f1^7W5xF7*_weE3;sofRcCJ^s<`fr;FMMjGjS-82otXI-Nn<~;3 zNbG&A2S@hL@?(G&NS+#tC*5lTlQm=0tfLS~$bu4Afiu`n2{%+ASzznq)GRVD1dYH5 z%K;ppSGsY{9E1E6$>pk=<$}U1k)HVb&hTE#7trgM6Zlo!L+YJ%k*DGd1$Hzl_fo`{ zf#O2+*?GU$#8&Ef0Bg}n7nROW4K$8Qf8;_oLXa3x9Dlhoxh zG6ZSN;2!fkE3BExoGdBpsT6xVc;HS3C8tKuL&{WWXUjy4&mm}>yKWB-|Ls4FLn^GP zPcn%sKgzYDewH$;us!bWxVjw5Y3^W-0|-~5v!~gn;|RKz;vwmCa{TBC0(jZpPt25E z@G#`uKy1#kiWYY6kvwu<2^Drh1?dKC8d!l8?XFkAw$GXMq# zt?NSD@lh=V0-2gG<}K~|{=lG98p(68F@cuPTP7IEOX%5gB%-0`DOV=sqsUdaJ>4Sm)CcBk9%Pv$MDX;l})s= ziJCTF%|tz*qEl8N55tc$Lre>A!1&bGEDo5(<<`$Lh_~YzPdI=Av z0ck81a#GB7BQp8zm7sXs5cDagwL$CC^ep+Svu56P>-O6^BdYrmw{THSv&(c1@qoo$?hs08p2JD%d%2>@pugO`Mlve2YInax(=&t{MKZQ;B#5+m zi(Pu|bMoVp!A$jF)qY}2Dx$b^QXeooTVRvLuv2U!{iLFc!&kGD+l9Mk_;IRAelZ!& zCMyT3WX}kNha?CG=4+2X3u@7;%r%Q_PR|y zJioj7qVcn~tvo-DKhLJt49vr`I+zY!Pj1FgY4Ev(kd@s+I4Y(PM%Cy=0B>&i1|~@w zrKq#hYvVmHcbOJj9uTGioZV^G0YA#~V0U0BLQO04+TWgLgGPh)z!BS*Xm|2Qvwl>E z{b1)qTL(_Ah;RGK*pa=4+fxBCouf*{CiExyZtcS*taAQNUj{QcgEvYrA)@5d$OnVO zx1ypayG`YxZL49qH_%aA3P%Chd)YCTEQnJKg(i$m5XuNdJ;`s%$U&8F~bJc*wXbpl4p_gY? zkjCzpKJsy!+7tapEJLv(tRazrDq6yt42JLn{PV@$Wvm0Wp8fTDS;amJ3u#)W^h{1gPPjo{_ZjLJ;@TO0&ffXVGiTzS=yI}zQyThg#M7t+^_aYs!t^n zTUbDBfIfT^e$aRD2>aEYBn(H$r4v`G{|ckn)0#d9-|pF2>=lqv)xJj@c9kq+s^mePSdhA*U|bkH^gOZ&)ZGzAx55$zug za@Ggk>`~eH>7<(3%E9L1aQo!SvhQS=b!_y0u^@pCQrHwbmRZqizxR8{n7HNUv-inS zkSiU>&X0eQDHfs*|F0btUW==!AS>aocQK6u^)mc`tqUPZ5B9(%I-EJy1lnoo5{7;{ z0+;+(CD!&X+AJF`$#SPH?R5F@Ai1CF4b=VDIt{JWI zLzM-oZ}N~)p#$1Akz`^A+gH8y8BDN|Q2YB%y$CNuzU3Hn&A_hlJURs9;6C7X+bJ6u? zBxM6jq}?ib`LWJL9Ndx&WV5@6s-QWG%XxIhfYJt2Iz$~4x3@Dg8@3-_ZlBO(iJq8O_veMHpaIdXk>o>g#At+WU=)l*g963Q^W<(6gxSi_Xb%eb0k5W zS48|bX8SKa3~@N?TREplvjL^r{CM63O;LB`>$fgpZ*38xI}g1-nDZxJIAeh;*H0z!R%SwF%ZHJe{43h228XJ-gIF3W4s ze~UXDaS%ZX;`TFrk`zIJ%*lRU9=3LcTF44k*hUrLd>3qgDB`)L6V8TEM^1o#HWQ>< zHS4TnX5{Y0^$pjjEf54O8V8yZhW~jFC@3hl zH-1jXap53D-+VoPBQIm+5(R^`;6}W|h~ioV&FL>P0;MFKIDv|y8oRLY zfs8Ebzk@|*LSpbiR|ma^B?F{-rK&=ei{VE@kvnL;0YXyy+@4(dKni8=xc$YS9=*R{ zam&-49ZcLlJ03qBE{da+lLfEaN4a0HQNLILi}oi0I@HDL5G2LQ_%-#+i(+&ylJ*Vb7^Lno=SXr=(yg=HIUJA zsl?@^5{5vAiYch`N~ZzbS#th)xG3qU@L`D{=EY(GcC~`QR8JieRtBI`>_`il$hhnS7{SXnBAb?KqR5E30BM8`?FXa<^ui zJ@Xbw?tz=?F|!@%XTjvd1{BAtA!gjTRsnw}5dhr%thy!m zaK*M|6N~@nt09o0P4-Vy8JWo9QZX;$a@vQ<@p;tLVZJlND4mD~T9*-iip~_t_glFT z5copsao2>BGp)R<4Y>zCE$C{3#fQ6qF%ponyvMI%M~ zIGFjX3-4!v{%gt)sWDQt4xv}Evj_4RDLdwl@davbex6DV{TH_LDgx`@7@WNp- zpY`H6|D-yXPG_39T!rDw(a6T`mpj{kT-Mpzmt=vKV;HW(hnefljt~&Hf5}?5 z)ErOs`H-Ptm|56>Ygw1=3yPg$aLkdH?%1$%>|VbVQcor1fYZxGRw&Kw#O)QI=FPGpoTFb#TDfoVL_zZ)fpH5YmC5Y^=PSmSDonYn1R_xW_);+(yWpYD zsiHHvnK58Z(DZ7`%G4jew~4@~O{zXUZMZ|`ybZl(g04sM2wS0x+Q4yv0$jl9{eAKH zGcovS0=66j-w&R|!6cgiCAVl3#>GT>fHfd~XCrAMbP!fgLr`S|;|k7Oj=5|H1f#3wH%h=7 z;DPiTwqqeg%9ti$7*?!=Q>(q2_LE5kK@diLt>o}zBSX5Eg6Nil1`*0OhLXKiAgU0M zMh3A<^*f6rBsynrp`tj>dOfEWq4^)|flzE*@foSaLa|f(eI1+>!r=pAwKODI5J`tf z1)wPvKj9bNzSr7D)Rvt$Y!iW@c)v+-eC6;bXbQ_!rY5vmA1rNm+r4$;wIqG-ppRiD zrrk^?X2}1%lT9O$B|g~(Go!6jY0`GLh(qoq8YW4a^trvmz}^nq)T9B&aF=B_+kRu= zn6m3s$Jy%s^O9$wsd?{0f>I{&fi0jYIn2j_^D00#2{MEkess-(TS=>}I;vpTj|)j5 zZX_x>H;03+>)Y!*_$<-xtq|$NwAdc}+quKyl~~(=|7AGtYSpRyve8z~eb#+V(pl_j zz-7YeuU$;bm=bmWz3Vyi<=Bje$zxZ^JX$&boJ-XRFQ_u&b{3^fJo|sH6($b|2Pum` zaPyNyRPs52b1!AMvXF{ZXw^!LT_E}3>y$sIHrm;=^3y9iZpM}B01Tx486`w$2JZr= zG2e63{fTh464n6!1rUljJ!Xj&L-2aU}>Y)i&aF3t1!jfB3G)@dK51o2hQPf`t4H( zBT6Nv@C{t8F4f81G~wJ>gj0&la&1g0BU?Cs+{6N;w+ZmrFTH#?tGLUlGk(D)DQhXm zEPkkg#3`PmpVm_??_P(!DOp?%nK#mputyt~76Q$UT%!M+jlkD8MFOC%2qrjM5Rmgn zobaQ{UvQOA;qdWSRjKcF^fZu> zzwls~(8mizYv3S!Y*3;14uBSO?&HOSJSugZ9UlW{@uehcY8bIZ)q%5l*btXPlf2^i zF6|q~$LFDwOEIsnW(!LkdB1CvH|8a#f6O}$-dJ&E+2spQP&lfp;%jNGS#}$v`!ws- z1_=u~ef5c=_Ud3I5jtxj-a4r`EbXFYHF`r$@moV-O@6}&X3{^qN{@g8-^D=dr7{Eo z<63gNYaKo7A#Ujn|1P~%vD2`#dvevr$`A7=MY6WxL=*%Wd&B;prH-i?W?P7A?Tl8r z+ng9l{rir)DPab$MILi$0?2t_5_FM|{56$!-jZb=uqBTKQH{59X6aCbi5|AS4nCWG zSjoji5Q(5x#8ey+k5~8jhi1H(O4HDCXw7e{^NI^09}h??d|sssR+81c08&7`BW1^e~%@Mm5R$_PgL0p$={e?5619L3{ zNCT@5Fzg3mb$7jv3kyH;D@G#}THt#_b4+)5of{p_G88 z>p?fSz)C*4JxVts{sze04FRZCCzbG)4ww1FAhQ0e#9! zn=NsyDt=j&8E7zsktkSGGPFxC?0P++MYCH$O)>89BeBTAtZ`Wju=QxMHgZsY{5f?t_+@rI_g zF=RXkmK-lfTn^_TP&&!u#Q$URP$Up_YhhpA_nG}h^N~_k zW+~zl1YRLl0Y0Xm*9Eu!IM*`2OOihw#E=UGU|n=8f@i4c;O{`ndv~W?)a75)EiL0^ z_hH4W=&0EP5+qe*Ez1TBWs)*^yi%6@iHfN+C|sKJ9=7eQTI4MpnhK*%=MTUG_NJkMFepD8{71dOtWf(?2%>P(Nv9sM539=gE zE5oiyW|J>8xSQx6_Kn?!u7yD#lIw49wTdP&E05!3=v@kxQs?b5=2?(chXvyao%uU? z{dEQeTzC)xRXaG=3AycCXxcduOH&or4XrpS)r%Pj2N4#apf1#StK#3Cjqck)jr>_k z9QZXji~a~C|sH0)?MSh^luORQ=XHV*d!`py(A(#ZOl>)FAWM+NGVC>@21logd!DT535<&TJke?^`1)D++=FLup8u*-4 zH$lSmR`)*(k~z$O<5Cg8qo7d?+R)VMyTCQDckDZ5?>ie_lyv9A97bSC?|_IvgeSHl zxLq;VFQt^bJ9!2?Rq9weRtMCGf%9*v;2rEvHv*#VSnG`&*lblszU|35nP#A-$$;)f ziIW{J=zhL-dvS&7jv zlUpz%v=2!c5Y{hck%H%9HND(i$(uvakO(y_!(RCt504k?NFyaMuE>g#Bb1@2)?Kic zw8#f4yqoqKh7b6(=ItbEI=aZ5Yz-3=6JR-SvzI1*syu%q;1&phu5&(7p`fCYyduDP zcz6iB_qiRV8e}~`a=Y0bEZEu$F$Q9gfecodNu#7uiU}#!e7-d9zoY(L9Y6xY3*(3k zS9A#L$=*4%O+&~0k6@EMeWmzjFi+d8`7>o9pvx3o=86P@saDZZu8P8t1&`Ve(}sf= zFLQlnZHcsLrAv>P4?|-oh&}WSKVw#GS+g;9IZ}glWyhiK=t&e)9^c-|!oDTKg(3+k z2j*o=0&q?U$p;;PeOu8eNn#+-B5)AoP{Ejdagy<4ln@MY z7OVHz!?<{@I{k)_58|ZC3|;M<=^!}{(X627BI}^|WR{-PbPI)ET}IGZ%Vz=Oc9N2! z-}o#itjWCL-{3h}HeG$fO-wE#n%y4P+Ty>_ET0TRfKi4@ju z;IT`uJ1ThbzYIl+s=;hs1%VyW6cic;%x8H>lH2xf!shaMJr@qnzYS$|gLjw7DMPkW zsGBq(4Y5RLK*Orh7cn8fejYQQb@WOu5T1-YzL}%m|PHCY!lNyZr3v2*a3F7d#EGa1tA;p*Fv!)qn zo9hG=thr;u#n2f|?PcD{DG8aM*s&`bl_|T$nyV3<^Iii2$Ud1I3leBFQ)(FInuhYs zqzjHHvA}PMgH19h)QIXu09tiJc7EPl4-oX32hbYB%c=Ql$;e8TO9*B9i&YmbqWhqR zpfuw`Z)`FM$7f2dD9n5_RCAvpsu!x9B^5ph>@q{o5XGwa2_)$8#Q?@22_{b>de zV)_x?)TwCW+{lfZdZn%unDEQGT7?IpYsbPjK4A=U5o0f13Cf;?t2v_{jSDym5P5*K zRFwRuOpgKKWDo_#QdgxO+)YE)_aU&1?U1rp>oU3yLv^YFIolPZIUz~;4vr{U;=AfV1N{wIC_kpl3Vw z${MVqA`riEhK}o<@oxVVO~^ns)1*P>I#+v(X~{(7ze84|VNAtgaiU?az!AZ7Pc+4g4atus2Wdr{g`i-oi;_V*gpJhL-n}UP)X(I$Y~$X zEcKPN+DI;|4e0&yf37f1G2gep2ghCJH{?4NesaipV0TAySHH`i#IUJFn72wN%uN``_0t6A%K{vOhJyp%)F}Oxdq2N!)l#5mU=sXk=;);eygn5;$4(I;`qi zTsRo0>Qceo&BbSpWFiBI&jfg)-L^IYPUWHNvWCV|D73LMk9qOVS}A~TfGL#!A2VPD zov_QAB1d(>j7XFF%#kG{LvIxkh5JSa8)AaQnCsv!s^f1wMc5(;2WATT%|T(7~rA z(IyO~-)}g}Ow;ikzQwwU6Gww5%`7M1cSeOB%6Kj#CJO*`rl&v;Rq@iB4%ie5-y=U3 zl98s2`MCT#U%V*!2VRT|Txp6+!*2(tf4OLtQ2X#0%cv+ z>*sN`N7EML$IkCec;!q~py%LRz!N84yK`jR1h+Kgttx*+e+kR?vh8SQX(=>083T0~ z$of`RQ6X!J;_jZzlOunKaW<6(j_>ds24f$qN9v|(|+CW4a;KxJm`Fq^h8X1f(7^&zbcVd zF{!Y!iImT&8hn+l#Yrkz<|$c~5w!XM6BMjmcWp{dI%+`cT7K_A|5+srD=1y_7W(85 zV3v!Z>$z4H+3s23c>`&sqkRUG_*|j&eWz?&=1Yw4*rKivorT2m5Nsm71q2>@LJV~p ztO9w!4w=kmp*Q0sY;z}QU49r;5R7orAzdD3UdROYZQIJipSK{4!yEv#iic=6%EsF- ziY#k^W=7ROYij(+AF%hQG{-ZWpp(FrUNrmtf*uyW1ywp9dwK~`ggMc>@d96Oa4APe zT>>R@q>axn@{O5&7CvSy1j!u6CXs8~0Zs&_?PSK9{Cd58R%;7U{s*d4sj8=0iqTXR z9S${;x;0fh%~@y1BIZJWsjToU*qE0xptvm#7SV3IO4v+FROJWr;Z%A=`n)VN{r8Aq zDb}@YLw9$h{ze2zl(lHG{mBBh>GS~c7n{fBAPLWOmCWcS0n10X^&R8JqI*5?B*!^? z$})K-%Ho1n3iy&Nks|qTy&IYo&sNg@;eY3d`!A7N&o9buN=dm(Ay~~PhpJ8n*>Ii6 z_8aqS=C`J6^zc^5@lL^2;uW7#r;2#!#zYKD;5HeM7m26oJOC@8j4l{!CNksiFKInR z2q8aMo9OA;`Vf_0*0-H_ls8SqUz^g?IvhX`Cv!qhVBwAz4CB)l7>n543TTtVn))@< zS`0`Jr?Z1JHLd<100lw%zL@DbuGSNhMqe;NAMwK0(gmkig9K{Bv&yIq&!36erCBfv zbE^T7`Uu_Y_t;@;YeI7y-EW?T^t3eOCHEPi*>4KfS9%r+T+?Vam|2XHS$UY2lLY!I zgm4_uCBU4)<*)$r7nh+p&4L753#B0dkGC6chYd$t4KSq_pp@%iMk!|JC=vEKQQzXE zZ$UDj9FG8fuU?NE%8Yzu70nR!Hm5ipX03|aj~RLr#%JUuBCDVPS%pO?D(uz?uXEt(a zCT|S(Q$KWVRz?5{e>dgFjbK0dks+fmSYQz5%6F_s@Vys=7Ab3tvZinF{TC6Tb`}q1 z$y}%kXNvonWM$1#|8swV|Mh<&@ZO6E)f|I@efY-w;HKwDf=++nzTEGn4yX4Pe)iX^ zn!8jGw#uSeP-wIWY{5(`jZG(ABjFOIMj2OK{Yc@dzQdj%>EZ1 zMWmrpN{5%enK%E1;D$F4I)3Ox5Zcb-0Un#FtfGOz1i0`cTu>^~$$v*$>k-_!9)WkB zlgj1UKOwYxqqzT6gZ&E!-h7to=_Q1AZA5VGO9-xi4WXm^qIXD8Xmn7dWz(2BISWTJ z#ut~R8L`ak#0!6Y16wv9Mnh9)uXZ}o@cII%sBXbKZ|%UI_jh4o$cu}Tw4?X=D?^41 z88T!{0+{?|qW8K|;LG!Y&y@jZ(=;@d#3|O?W%8HF+*@V?cPx;!dYO1-f;Jw!kG(8a z($M957iU7u`B>wZNlwQ)zX%Yd= z!z`1hYv}k(bdA%*gl-PKhs{IBgEf2O-^HXhlgM9~M`@WMk;nWlCULJQ0q!I*`fB>+ z^5_e`k4a?C1Hbp&Jc;;CF-T-EYwz;4QhHW11gFRO<+OZ(@^uHj^G2F-EXV*%RNjen zZ92V&N#rk5oE$jsyhO(4w5KGvEl>~=8UIr71zb3A{2k(W}JAeLs+awPdP54@RxHy>Cm zCPDgYG-_mJrDOK25-gZM3v*_dV&VMRm^XI@X3Z$Z^wMcqzH~lTp1m0J%VuI81-`y? z@jNVBGEdw$V|o#0(0z**&OsR+Pbz3{65&4>tQx&NkF7Q zC**;>LxYgh2ZgTR5dU3 zIq7288-E-MDko#kT;ybBh#kuVTO}a@gxat(kbs~f73r}_8Mk3eCT1?oM@Fhy7(xhB zJMF04jf!?38Vs{AD>sSS{9ttYz%Y<7CzS(3EleqCG+sgM2VE`%Jl$|5sNizh(ZzMp z)`2!Ee;;qt?smh+yUC(Y$DpAyi_kY&ap(Xlj@P20I{>FH1y-{jmI2!beM_;rV@+zR zyV{zby7R@=UGFpxAN|%3)vGZj6MC-YE+@RyruybbhK!TIeUH~G2;CDB8iTcT8>(q0 z%L7FZRE5)_%rBM>Seum13aiw@x3A`ctDw8(F6i$3U+BK^f6(9kTj;)g5B2E-5Rde1 zxTPKuSMRO=%G@GouDlic|Nbou_x@S@>c0Fx&|LgUsPan$St|njDjo(DX_-*ac-0I1 z9ftbkITS?TgID4C$?YdX;MFIjYn;y@g}CpR%|f%*vF?lC7wI(o&qL7Nbw6~Uz6h+H$e8M2!t&PHz``hDI~Ytf z{hFB~nJ8wWG9FA6|KwbW*c=ECBi0pU+aQz{R z(#ixgYd#MZ?^HlcTK5NBI8ys2Y|f+54zTPIB=J7UnuTkx{|s{T3Qs%D8pftgoAAqD z{t~y`atp4%{(50PI+l+E2M*vDzxag+tQmaYefJ4sSU(EisS^c9R~72YUxUwUi=OEX zo{q5rzzpjOoKN2+qsP25Y@f*2dbtsHkei&b>7_bgU8YeRv2v z_tl`S!_m)r^68H~2kY_5+k5fi8@uuLx`TM*{R4RZ^&NQf#jSYtoqZzjPM1$;MNcVE zH^;uFPse`yRDtu);RL98auZc3R21UQf9$~Sx~OeLk7P_9#<>-8^m-U9Nk~pj6(&wj z1ZyG^bSmM4R1y(F2t`QZrH@1G_~h2X9}4}g(fH|(Fd`ZYH0E@qdpZ$ux1xZpSuH7r?KNXbk=5~W8XyCsvPOt1C(VT8PZvkv7)t8loo4P5~xG>NIOrcqfYnMGa% z_?J5#{-MBUIo+HaF-Fj}lhPc}$E7(M<hlbrH(5r0pL@C>Rv)4;wO(ZB50DWPLv- z5#8u+s7CeP1E_3w!x1sUkerT;tPGm?_0~*QQp6mhMeO%qq1yOe#n6Tme z^CSI0q?y_c3p*UQRCe?pjb4~EVeWI_(&0ADZ9++ZQ5%j`B(-5S386P?p`nJYQx z^gVIA6VLWQlaPb-!ZNIwPIYAt!P{1e%Do$Lq_G=qZZ6yY;OVKm7N@8?ePY^)x{IHy z_fGTh(SQ9={ZhS(TBdqG17$!N;{_%)`!*Qv_nEltbDp(cS))`yt$}*wCD7mTBWSPx zFR0JCOw!yfoeLFf#O4->%_iKR_X`>aBHcEjAsgKDQS>CgLnllaE7P-uIcD|`%yDW~ zTmV&Fr_Bm@H}A)He*83Q>pS45v2`Nx(e`ru^U1Xc9;w3F$^b61>X58aiSbp23>h+H z$T*!4)6ivdk=JC7lSp{)hrstfki!3N1U{&d{NwU4$L5GHD*`Sqj7C6U^T+2=9874k z)-Z#8*FJLy_z^uHi)&*&%^=x=*$`m=!`GBbL@lT3U_0>leLeBqy$<;0R>_|)FJ-V6 zF8ktTt>M9zHh3M1%~1bkH}He?z>g_yf87g|M-2gS{@8SLNwP!&$Kqm*=Wi{M{2|91 z`grLWaL)$dzbQT6r}*BZa$^6$LoKhcS?3uk65-76{IISkZybKJ4LC%3W`kOM4{I8; zX>BIorz&{15u0(iJzemJs&L!2?N~m~H=t<#;ZES4Eor#;(rb{Nog?P?rxUhq+jhdI z?^91bg$Eye5P$f?AMm%o{SE8auNNAbH{EoT2rE{s5L&-%p0^iaFom#x|9%9V`*7VV z2doMGuL1dJ+WhRBKy70&O7mAh#b!{W*J6mZg%g3Qb;v;X$ru~hOe*{MbvRw{QAKg6 zu4#bX;e^}mL0x?lnp@h?)YK~eu5WBcWmO&BQ;&`g8x9^W$ALrT;+dxARx~%a!Dj1@ z#y+vgNJ~IYR&=l9xrlyT3#xa&M&|c z3Ug*;W6ty}ESQsr6^n~7e@-s)b5fw!X{g^A|GbX`ys9kvZ2tc=>$^`G2FUxzwKz_I z3P5TbANPWoe2lZS!4<59R&NykTzLna6ihIg^fX~mM9l>;v!;Vi>4hTVgEyw26!s$& zh`{Mgq|RLfjZP1hE&&;OHzJ;PG}&Be31>s6)st|}B%m5vLl{byj8z604MyRN-e|VM zlu&>~eY~&H!J*J-M0`q@WMYA}3I&OYHSOTF^V z6&`ZIZtFs8lLG;&Kdm_lNr{O_vFM>zF|j&4NTi1nVW$UySl#i!?RCQw48Se!IvFaB zPT1u4y4;doc{;}=cEHf?!7Z$lUeRB+UWHOc_BX0MpciZ&eaBj|IYqp1r{H~lSc zRl}H^h4ds7Qk4$0Hg=-R;e~IY$hpqwThdW{!>ncrtg)`vLPHS?vlP)fFdEHBN-`rc z(J1^W_Eb41nDR~e(CSl=pPPw{lth?S0VrIJIL;S`!U=SCy%1Flnwn|&CIIv5N1`B;20f_^Lz@lm;P+dCEH@rm@EqWBoG zZ-etY=JKQTa9pgd&hd^F-1cJeiEnp|;5JP1ortraZ1ljflWM>$M>iTi*oC*= z+KHp(O%q}kj3@v54%K4Qh66bI(IG5V1hAZhI`;WHDsX>nQLV9q*yIIw@UjfP;PJGMUYOdIv%q-MhI# zii`d7a$K*J1GSFm4N))|9&ZVZiDlMEW}=zlA(7)q2k>5XPntNsw<>|%R90SIj2HwB z^uDc)Qh9Uu&+(pkIJ`~gD!Y385c8&VCX6|MQxRg09v9lWDp1?}CeB;hh3WlFW5iNI znDW?Q#F4rj6c^7FYlf#A0)YV1)6;R@dFKgY*X?%0>2$*5@sM2V7uQy;S|!4?Y15)l zOiBPT7l}?MsfYf z(MlXTOviM+t*sM{O|58a@9idQqL7|yL0*m(Y4lq%EgiX8$uJpD!Q6isU^hR8$IppUgWB!~xESQ~(8O0fxS(1tQv-7ZIexV?Q znfzu;rV~MaGkV&a6l4sHiK&s(55p}NZeP6FLT+p0hf}Z`c?zJ=04ghz_1#d1ZRoK3 zsH646@9l!q5kOPhbm-M)nDuI?)jFhQD-dvXps~Ia?b(^o>UA(d1C`o{#I!KfCN09M zL_t6$B_#@T!3uwnI@IA4rM&RY_UjEaNP1juxHvr|#Ccm=(3PNpJDcLC`_%NWIYEV_ zfNFqXefzluJA)qiJY|2MLP8!ma4A8@mke%u|6hNQ3*nm*#jZjgWQZ~23Npkgu(p&8Y-un=_ng=oV`NYJ^d z94WosK6t!-_^1s#Iva3gXAPR$X#&7zniXbP5;KuMJr@PVNpO@`qPe*fHa~TC6xB&J zsbo!gCDN!26f}coQhPYHtu$Jor936Nf-q2-n39sI?Ij>duMnE%?0=iF=&8Hh>~v9gMn&L6-PxnD z4-cFoHB=V*UiATLLlh6?S!3*5KU}_E*xOp+MF8rQ1n4Lo6h4-+U+3%T`CP@U;NKEe!~6T?^j} ze}(s<{|DbA_Y1Am0YUEx*B?jVo#)~C<+tGf*TV>`e+|I{+Yml}5aG5)M5w=y7k(5b z`kpVnN%#mJ5R`7ANt}`)%8k?98UJd@WPpPAaq zSi$+Fep6v(l@5w;tfVsMpXyDR;x?1SKxH{5P}wRhiINt0LXwo;v4A(aaoLIVQG8>;}5~#Mc+k9qlReyWRs{ zKi-o!4*WijgXiuH7O%KmrmPQOf{?x_oot1yu4Myu9R3B=swNov5v^HNb5R*;4EeBT zl#zH#^5j@$$VtG;l`C<_9e3bYzxov(ee_ZM?svb#4}bVWeC=yr!Yq@s zGDJvNT;x*gAFTb`+TMxU`bOBgC3DGse?Snxt*z}s+jsY#L#VE<7sT$i?R#rUdwBsYxM*sl-^hrcPR1}LKe`9?_ zY`tW>LPw_)uf4qs-}%u~_}UMiz@0yM96$Qii+JO`JygE-exDgjFzD%3Y9i|s0!|aRH|`h4g5LS$N33kZMJFNhgRVJ!@84QqkFLq+IBbnjBm7R>PcPMMhydoJY3cz(Re(SigBIcGz{)q3AK7E23zc%XCLhqd)@+zu zO>iCGiwy@`(dIS69Idexbpsga-P|ogL00b z0FnqIW58e=2Ye2k@9evCI()%*zVqjE&c-=mV}mgmY?CoT1PKr*=Pa#On{(dD@q4ej zXEnQ;-R(`JWY5QG|Z?Jp{l1p9nwtb08d~5v=wBkj_kTv!aZMojHzpO@;V73GdSvln6zW53T3E1r$BM_oL5ZuB9rphg2>YkApF4h5xn>F2z>Y75PI~N zh*$T2gQsIx)~rb8dzpf;OiuR}VKi`E;k=Aje91bY(~CMI;vNIM{;fVbwwhPNFCKTn~gpz_m zJU>as9afOAb$P%aK$w@V8U&}qftlqcSiW>2iVO2#G8s`&kSqFSBh52bEL(`1Z@daC zS1hLe`M6@;YOK5b63m-Blct>ptX;hv8`fQlMGNMjysQZG=gq{7a_XQa0rt8S3PpuA z?)jFcmM)yBZADdG8yZ`?(cIdDQWDvbK3{Ns>+S6o9uCF> zp`fK_?)i{@45916lTAaw7ISbi2 znQ#d|(0W)i^N^8Ofc%^+WO~?IHW#`1c_=Q+gxf*!(P8XvQg6>gPH8!2&MC%>Obbmi zlx(nDTC*z;nK}6=%*{r2hKJ(FM0R#I@^aj;(QyWg3+{}3tSWNTAbN-wY7jT$89B(#FQP$?2f0qOczCiHY;HL7XJY2u87RxAYqC~XprKU!OQeEdpgM~%oANL(`|MpX&;YE3%$`w1ZG-BQjoJcT+gY%Z z>QO;TISjZ5Ml;M*H}gvikef&Op!{TbGO0c0QQM&UW23s)Pk|tA0^M#GT-kZZqgh%8 z-2*q*`@&Mp$#GCVjnvNAH7(s&YOAFMR8Dj)Gu;BP$Uxx-NU3JDz2fIBdF72M6HxntnxTw1C_E_H2LE^^18*BUJ1j>4YYkH46Eqx(%FjTZpkcR zb;)k3#jThzPq>~I!fvlGzYhBO%f&jz@e>CTuR5V9O$R7?5e^CKV7`a_5cgsPc^VQ< zVA@`Dlu$fi`E8VD!9VjXKaCTCyC^rh6D@qywRF z9$#}f;#7tqy7#YFzJRS&o7B+Z8Et+Z+V?ZObn*$*bXBUM!^79mnx7<`m(k?sfjvLM zYp0)8Lx+d&4WGw()5>V_BavLl?5uqqFP``-!ciJSO#$M;9`wHbdxUDVw`+E9eBBJ- z{R@FRX=r-WOyIJjvvO&H;tqKzhZk)5%Szkikct(f?CO~QRi{RnnUz$s0y#V;oBH&$f zfoseA=WThOvi|WvMfgM$s@)IY{-@yG^(bOJEo!JXl9rt(Yu=`MZ~#}XqWdw(cYMLH z9(zw_BZS$QJ)7nu z&?Qnt2^UkBR7pXcqy8Hy(at(_zxpFYT50~QkznO^cz6F9F@G0pxzy0955LFYHo`L0 z`q8ZLbvhl$%Jjfyv%+LFA}=QkS=kxLrQhUZum$eIxkb3{%Eh>z<*FsPdfh^-SW=D* zw>|AS6Dm{|$!F{NfXkjg7~pG<6}H9=dlTrX$HYqm5aExqM&6xBCJC-%$-35GPazpE z3|}VHzsDI9j21gGW@N(Ywg{WPv*=+kS>eph6YBxnl4Crh6*hM^ate!4m|ukAk|O%e zMy6E{bMnm^zZBEk;ADkXX%0LTai9Aet|WRhY@Tdn7ZjnSARmP#r6?-MLs6y`W}1!Y zj5gTVf;Y}!iz^4Y1qCSJG!+(!wFfdBl%Lf8&p>gr!m*4ViXIy*sdZIv zqTMcJQGN;v3Q<%XMgWoJ=-9dOxrOM5f-oCPEjWn{8B z;mXgayzrXWbVa&9I=VkuS(LU6n@~)jn=Z-|)gcd+UtvKOvfWmi0MfNHX3&5nBV__U z@E%ZHbezeNLuFZrLaKX3R0m7T3XqdQ?T!i|UB9X~+o=uZQQIk^^2$YiUM}S$A08@y zc0ncDpn=+8Rxa|WjTL3l@if3>Wi#KqqWmo6P~LNL&)z#Xe~=)`c3_$Z$7Ih$Ms6Vu zNb`_Mvv&*i0sZa|E6%B$x&CHSgnUoaWM{(RFO;}l*=$2a%G$ZmCu z;7LEbrls^HLNsa%c*iy=<3U96ESN68UJXzNpR91v7tMfi$!h3lFM@IPRWK}B14Ho) z=-6#EAID0ka2Syn{)E`!ox(EDwEiZ=J+(Rr*7JI~kuc)*RYJjPyy_O1Zg{V7N!&MZ z;k>jqB7X895^c@UFIoljRky-)*>y0`wZ%HZnK_hix~{KRSUnr&E`e#)Ref==i{(T| z3!;18K)mWC^&8ZWU3M+ypxGX>_*x!e>wDprO=nn zg<%d|W8*tvD4C_kK-Zyb@cP8D{cnr5Zd`vO%(s15q|-QWsd7H0jgMocCM&K@w|+=i z7V`&MqHM!KO6OL@wmd_5A8_y3%9irP>n0mFP+3x%Qi&bkj~L~VF|v|+;Y#s$l7z1Z z(bu0tqO*;zPxpZ93SCoQI-8EaLOqI(>*+-7N@?MV1+-ox3M7F zF4Z+klW4ob4Z3ojQNeNXJ>k6id$_ahOZQOBc->| zt}>wdPy>Fy=Z7fGm_=jh`Rbmb*;ex!{&wOqTru+|dj9us^MmpD;oswxilYkx#?5!JBe*S#uw+KXhC~}vf#G}ovmyG#uon$hIvm5Qfe zDFW`e;|?`MG7?^V@kKN>H3=)Z>B{!)+p+zv?RfX~A3%<^05NvIt5L!|F;vu?LZ~|m zOVFA2nDLUjQ;pdB=6+l^=XPr2+ScoQ{={E!plJuz&A1+(+13gFh+in5ojQdxo9LPHJ~{=1tVPdx9X$De?|_hQ${uhEc; zS*t28lbqec*b^ACK_)b_#7CP5k+@I0Ko z*>M@NyJ}XdADqDNZ-OVc2np98gr$5H46a;tPkQ2kZg_V-j3vdZF}q|HqOmY`ANeVY z3tquHuL;4F=G9w}>QZxu9lOu0L-DL@uxQaDb&q7SsIEGWM;`nZuDP@U3umSOh_aR1 z)QK~TaJuIGC@)$At9iHusfTz=!@H8AvUT4d(UVaC+oBuPkfDh*pG4>1z6$HC%VEmV z)?fP%K8wJ~&9Kg1k89^xurP-j-XxM#v<;{DNFHaT&OnbKbWyq)1_$k+&LIUcCr?4l zze$`3^d1LMT^;NgxzivVzpXevsvJBIw;%(i^W2sycaPT^g`*(y<9S`vBDoq zCt?AbbGM5ReOSqxO7c3KPQJcz62#%KpfEoZOBa;jvX!%O`Kmd%;frS@F?SyZ%s_-C-ggp>`RfYpP-VcAxGAzb89i>6mIHXpWwUhp8kY)Xk?X%NnBrj-CcbCdG9N z*D94066Q}?l8#;q>!^c#hY9mub4I33o90v7)H0rqc zM5@%{s~z4{LPrjrucwEv^7W4rmo^fjL+WX)Ky76`YFpyM3OhfO1_7p##4}PjZl(N0 zzO`J4?w$C`OXN`v8x?#$U0aPrdt7JF)12l3h&s%99?i)U0VRXeBz`rfNu+vRb#R#t}ftLwoa;_RCF%@>fUt5lShE7n2J>!zl-f!1Z`39DbzmG6LY;Y!tQb;{s3 zMFAYIIE*;O#fnq|D`%5X+=k+rLJ@6Z3*Dt_`nw?Z^&s;6BZ`~pp3bxiU|v@^cKVpG zAcnVxM$=v@!+=nZiZxkPSm~MTsZsGsQX9_}EG`86T%{tnQ6DzpRwz__!R$ zI*=A^m&%Rv%H_!E9Sc#lu5e!2?bHb3%Q72qZH^6p+zaCzA^n4P^4X8u4> z1I6wc*f8S;nR*P+xiOI%kA`Oac0hwC-vC&|2=rIeqwBhJsw^WP_a?WRFYt_EN= z+Juss%iU}o;)B!_Mw1_@03I6`iUN4+%iD3SzBN z%8J|DX?U9aP?(jU4;=v>J*FrwU#L`+p{&rHqq_7RP66CQLjqPBvr?AV4^Cw?3gCw+ zJwK+Y!%Js|mbWM#R{ka}b0tXKgj*8om3lmeI)y`?k^X2tIcN*7I^1-uUP z{Rfrfo;nG`b-on9#;h_}X0L;7;dL-(6oWrpABt23@QlLc=<&58!~H0h z&p(QJGt#$(>PFx|MLw>-|DXzBhNmWqM=I(E!x7ZgHqtc=H06k(zP_2Js>=GVkw_FFb}vlF@H-;5 z9&YdGhR^30YYBIBbctU+mfa6?I$2pWR)$jmPX#!iPKO2gxfv*8&xVCr^tT6Ymt9y@ zYq?+NopDqEGfI6^@;O!oaG*;EUyBa02-PKuDi)0+LUoTFVa4bH%iH`)Ax?kur4n(S zx;=7n<^pDJ8t18ANd<6vv?_p^)G`{Zyrcqn^o+gNo&dNIlQL@f+`f3!uu;J$pN(fs zafvuc_)jHdR3ytL8JBkW90M$lY-AP9KNz7hZN#KpV?wVZIsfp(oRz+8^~Y9mV};{O7Y~I+ zcf5wkroSkPUseRCOk{)t@x*?FpZKj%tg?b8;q5{Ag+~!Rv{OAwftAPl{9+;T=6VtD zpq8GTx85#9UU>rH=N?A9y_qIGG)Od>gfdhpW;rglELMqC9#gKnb2H*C^=fDucpSu& zJT5!BJ|D~HMCe?_g|z}JuUUyJl-}w~`*>?3!p}a0*v{7|4|O7p%PzX-O@to#8KV2P zBHq!ev^z?xJ}XyAXLdf7pYoL+=Ow!JMMNlHv4cC5I0nL_aZVr0c%ar5VXZw@L|x(d zNceZm1535;iTsX7d_-z|;)airqP}bx6Jsblhe3x~b`x&11HnDV@UFJKz+7FA%k)uP<~AYINCSUmwmMGbmzv*kh;M>mC24`H1dd^? zJ-dbE2GJeL?WOrF4{xVsa^IQ-HGr0?aOc!UV$vnYJ@vt zh;-06CC#zpA?A=>w4;%<@eEs*=ohqp=rZ9@yEbN&KyTC5u30(Cibz)e^7~R&Y*uyw z+Zur59Y8hRGq%2E_?zOvV2f2&n(}vW47-fJc@~f};9FVVPF3szZ`>a%vuvKt`uE}X{@G5B?soUw%;GiyWO(Bp!ATOM6R)lkTrh``_yI}?}FN^zN zC5)BKI~%FKHz^j(T#l?b=RBS7DKFO>qdOl)PZ5p%hyQ>e36He8y)Afa-@}+&UX7*m z1|QQjv|91@p*+}}#c;c|KYt_>!}HHSk0<{8J1m>$!%*IS8(Q+v+EEUdBNqnhXZW6< zBQ!1(LN)i?eX0x$7so2cj|82`3RBK3n&WEw=#62eu_2?F{-B0P>6|Vo@4!g-ZzU)# zUauc#s%mlg$VoIcwTd-d8=6{hvZ4w{j#l8KcA=7v*}3~5j-RZ=!NbSJ{!l24 zGiPdXivF&vYeHLFC&g7q+tp}k?La6Trm5LT@6z;ymC~#bx7p0F+blwCRx?aS#pvZi zr?0-LG9HA&A=Ee5psBSE^-a|{c6vX~)SX0ieFgoVLS@YfR8$|Mex@c}C!t*=(~60x zYm)vTEqM$~^3Sf6Ga!blkKC=XQ4il`}KH8T^B$8=KyrTt?w>R}kblb~_?tBfA zSD!@W#mAJeJ#QjnJHM0dQ3$krExrD^o_XOU=YQX&fa5u<(4H=d(&UPgrD*}E0d zLpu;XNW$lBeg=_Ee?>I)dfQ(??8t7!+nSYlXu=fR`z9jK|B2#yUK|_U{kjrQQue*o zcYb6G#rg8%h*utku+rly(B zjlS_WgxSLQa}q9Zp}b~?Ae4W$isSuU=0mL(Hl?8Z5stQ?rQ=bQ6x5+?kbB(G z4Ri+!VQ_7L!Q>eii$clh;69e6s^U$YKKdjIv%|2bF~$y2KhV%ZbF{20r&$x1VRDIUx4z;fBWGJc*V9vA{jq))c7up9#bNbNG5^q?rt%d&dSPC zL#78jkPiztqmxVgv0otZ=U=K@lZP(12s)RCCZIYb>dy!Tr51DrWzc!Dkf1t{sIAa^ z-Z^CELZ4TxZqUHEw;PEDO2>G@>%F=%M0$CB;8CU7YKJbTK>0Nokzh+_FQt`TM$19E zWC{|ACve&q!F%>J;p3luCqDJ}*CQ)ao3&?COBcTQoxh^zU|Mw&O;*O`VC~t)tIyCV_9M#lq@6A>E-&dahGI|be!7p!r3U2EVW@?j2<_AKs zEsUvKlS92%hmUQtpuwl@xpm8Ih_!!NiOR4$W_CaP#W!fEN5eh-Xq>H8zjL+nnjVJFq+tC>roMX2t5acPJLH?Dm-X`W3)c zWoM7|()49Z4e*U^igMUvQLgu&YZV1-lJ8SIFVaw&ErgjbUJm?y%2LRj=Fg{TO5dgY zy(eW!_^nh1PoDywqaib|V?2wl@ow6G+noN2@U69q;+xkUUP^geN5lGb3hoa+1MFy2 z(*2ReN_i(;PFGR>A3h5F?vS#bLC0KCLha`4Dks9qnXQ|Ddq8o|JynRbSEK1?@4)-l zeiG}JEyk&;jrjX_QCXy{c$3O@N`E(QLBXPLVD8+xu-mm;+e^k5ekIJVfA_!sZ|JW6 z2{v2;n9~gRTBvSs-Alh6-=;QwH{4EYcp6BmShc)(=3~G8+Z#|{z8sl%eoqOUV7|64 zgga(WZhy^+XkK$y^M?@Zg(%zt1W(h=q7G+(yI)q0^7|fE*0KdFzx8KD@6lrwh{mE= zFn<zWYo2Vt{WQC?Pz&aQ5;_V1EK^KjtcaYX3+43A5=jb6}qk3vM=e+4iG!}!; z7ebg_BdZ>(xZL?YV>B8Qe{*^8uhU^2+5*`^4-Ip!;s#m^kq*E|9kOR5J?LksfrG$q zd+UEh$CcCZ>qQVd!b<3@l;AAr*{fa}FDS`ArmIGWR(kew-HgXMugaHVT<_T>IFI)X z1{38wDn978S+!gBpG7IZf@KLfxoMoI`VotU5Rdv`Nc4#M$<;TWpn;Pqm(pOqXg_j_ z$HIt3yfDB={d-K5jUY?|LW3Ky4>Cv?1YUxX+r?xu;{JMyaBr1$A=XcdD;L^2s@s9L(&p@AgsuK;v{giT@4@#=$sENR?3^@*EazlTc#+L&xbqf@!;Ue zO{lE>13q~dFtbDrOv7tCEjUz}huO1dix;Vq$)l~U4PW}w|HGN%FJUFsVdEek0_$6h z_|0EEsBX-M-IjUQdN++Q$-lV?u%z2JPzGr(k`Z#&b+MIxO+v9-T$GP>mtTS_)~^-{ z-_@5c#fEj4ir=!*LM&Q12lM946z8#mc*&x;n+{;>&QsWb zq!vd`Hj*^Z-*q@~x*0xyNLT?+S9J8xXfVQTGQ(oF3gN%a^lLTSU^beSU)q*PB;$uv z081nii9`|!EAE0>Mza1UD?S5W#clFf*6n2FtcXXIu!c8cBZWUhQI12+7#swR?}W z(KE14Q8x0rwCv89typ<2+ZB1VZ3kYf1`f5VC#4}q!%cSG%u3SdPXqg#6}QR!4HdgX zW(6+C|9TBct$NZBobCc%sRAB5rYLsV3OAe5#V(gwk<7nyGXaYMXriI%u14UIqrj;S z8m3NwkqF0G-3>f*O0oFmys*KR$EvuUX6tBnNzLmgzi@`~K8WI$%c-8ydzi|S*ZyVL zWp%knDQ}iVs;g_xd;Pg9piD`8zC#Fyw_*-8*>rj$Hr(+AfQ-D=$SYnAr_%|8VGxa@ zWWr%fs(`--jWus05vf5Y)!}qTO#zLb_*XElyc+o0KG}e-C7+eUkBk zE!5aLjoTLg&94Et+}UzBGedE??shqmm6d_aOb@J93*B1>91fc}-fA_&Znwfh;X3NP zc|V`)al88BJYTq7Hsofzke%s3ZjKxIc^>5Dx+yI-m`oGfcd+GZBuZ^05EhD87Iw)z z-tMOjbUz$+3$ijC$fvxO6lIEE&UYT=IVa0Wzb>(#t)6*)J6%cEO}(D2w-ph8i)~|H zz2$Am;Bfs*Bw|R!Xz(_{!q-T|71u1CV{~Lq*M=t(+qP}n_9PSAwryi#J2SD}aXOgT zb~3T;a!n)`Mi!j zx?Wl$FLylu*10ODWahQ`d-#w^;BErx+}|7-3(~Khbv_Q#4vO-BCs8>XJPC1S#PsSO zczTUM6~v!bu+2L+^MU=NwdhfUP_y;2QV6<}LLPbzJm&OU>c*O5zB$3dM37v|xrmlS zW=G#*cZdL#%<6P8E4_Id7`cmrF>jV0;2$1&d#9O+xKUmdWnG45k|(WDJJ6j$g!jIH zra*uMUf0;wC6(lj-!>QkOP?9j13S+LiN0&Tf45?!fh`AfrJ_zi8}|J#>&~cJA1qxJ z9zf&vSqE+Es%kN2?{OjMJ_3s7H*)JE^R)V|>nhtDvUHHY`Xj;c!DNhs$G9M-Gw<22 zgQ5^z2n`AimDOr3cl0H_R#n6_1*~9^Z~A%hnVK6R?-TtQchz0 zX;xp2+d@A1_%}1tBph)Dt@8tB6i3|L+)7HCbl)d!zu$e{RY1@&jtwS54ry`p!elTo z0<$sM>wUa=LD<}&b!&9%ESgh@(Ji)(*CPZoe6`(i`Fv3+RN_ zz3<5KRN>bzp#bf9HF&JW9CFX=st@q`lHnmbpsrWiSC+nQZPybTZh+9+4?S0=OQ8CJ zO1KOKjG-g^7#<%B^PYtFA%Xk!f)QUW*u-@sEEf3=7kyya0CW8D4J}56-O%_5g)t;; zByw0y)P);^?kCl@X4ATv!ALr0re@mrUVtjBrB=t=K^q4AelSzwi(hLsr&?}k_nXCm z4M}CGB}vy|E&BoLVcCB28A92>@(u^}F3)NWC$TUJ^w3Cc4RksteGM<-c|vwgn%Ywv zRH}=D2^Y=semm5_O&Cv}daHIS6VsC!PlhtUPYG+3Ge|gKlGgA15r#>>`Vyxvc)zbV z5czq#PAK9*a}%sdJHU)P>wK*Ro>|D3c*}ovKJ(`c9R6aH+s0cV5~#M#c?o!!u3v8~ z#Ggo~(O#bKHb3;Q*bQyozxt4>1ruNZR)bAkdHeNz>oOoFP>Q5E zZ`g}PjIz9p8G=@(4j5P|@EKkKEuRNrU<$u3qG0T(nWU5kt_O$15dKf*%A(|kffz{* z53U!Csx|f97RUAPD7I^jx2*1lmA9S|&|aXv_4)F_(>33PdO+l#gyOSZp6rj9G)Bj! z@qP8@*Dfvxipe*8kERW!Wk-dS)>5ZeD76@nl&NCmkJ=|2LB0>cNS4ye_;t%%8fK(3 zZbPx}&ZqhTbBcOp8Bq#`5Vy7dqhq-$>0I@ANFL**fy<* zw60(Rp${RJxU$XxbFcixIoO46_}l=f0qv?%yk?!&X=QTr2Bw&(7*quH)2!pR_o%5X z#hTG?WO@-TZTxt|IabtN8H`Oq5YFO(1P2C=G81S#l2yrl0dEY()4!# zAc8fN*6CZ=Q>4F~7lT$JPWX*8s(VgibmVCg47ZBkNoh1xVE3scb%YEBnZS>0<|o(W z8%sI5p#6Iicn^;Lvj-%;l|Oh+up&kZ)28D$2`rYMcvRR}5zg@-sqERf(5m!CGLNa#EA+AgAn%M)oPR`47wY=W= z_9vmH-=8Hx^_z`SD@)U@ma!`-ICIQB_A%eFPvLp8Q2GotH*DG2gYhy!1?K@--Zb`tb)taRg( zVm1a{^%zQcxdtZ()LbOnHCHP2R5H{Vivk4avJks>55+At;E0O$R*qK^ z(w5k3{QR?PTciWJS~}~qtBdjZ`3`PL_k_!{vTy6VPrj(J&ys#eGP!}&kGzw__)gpZ zFS$*110zIyooW2y^m0Ay|G`0g;NdPU%s0C@7am&Y%WA8S>k=b){M4`04t*>Xp5du> z;C!%?{J{PT^}HB1987fO*AZL)uPINJ75HYNKDEg#nC!djU`pOoB+$CSi+%Fl$4&-& zCK;a4kRzdn5KLh9AF#HTWPsz;25|@_(*kaRpo!?k0^EXE;n}GHKEsFMueos2JkGxR zRYd#;3KGe6ccAqBg`&tWDp57ClkYk%!6f=3iSe^m$slfOD5Zw7#hQ0T^-{nq7+xVGm#a8V_VLoMqc{?dYe zg`+-n&POQ`kf{*A6#lrmo=nL*5pS>hP?Q zQpgcHbWHjiQlz35cQoi$K0ZGn=(5w~hF zEJOggkuA4ghsx4`LnU^8+IW!%0D{xy+BrM0Wf^hc6~)en>Hvb2#!K6S9tk6RUWC+t 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

UHn8ZVU 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

diff --git a/src/users/urls.py b/src/users/urls.py index a4fcb038..99804ef9 100644 --- a/src/users/urls.py +++ b/src/users/urls.py @@ -27,6 +27,7 @@ related_content, signup, wrong_verification_code, + ResetPasswordView, ) urlpatterns = [ @@ -40,22 +41,29 @@ name="login", ), path("logout/", auth_views.LogoutView.as_view(), name="logout"), - path("recover/", recover_password, name="recover"), - path("recover-code/", recover_code, name="recover-code"), + path('reset-password/', ResetPasswordView.as_view(), name='reset-password'), + path('password-reset-confirm///', + auth_views.PasswordResetConfirmView.as_view(template_name='users/html/password_reset_confirm.jinja2'), + name='password_reset_confirm'), + path('password-reset-complete/', + auth_views.PasswordResetCompleteView.as_view(template_name='users/html/password_reset_complete.jinja2'), + name='password_reset_complete'), + # path("recover/", recover_password, name="recover"), + # path("recover-code/", recover_code, name="recover-code"), + # path( + # "wrong-verification-code", + # wrong_verification_code, + # name="wrong-verification-code", + # ), + # path( + # "invalid-recovering-email", + # invalid_recovering_email_or_username, + # name="invalid_recovering_email_or_username", + # ), + # path("recover-edit-password", recover_edit_password, name="recover-edit-password"), path("profile/", profile, name="profile"), path("profile/edit/", edit_profile, name="edit-profile"), path("profile/edit-password/", edit_password, name="edit-password"), - path( - "wrong-verification-code", - wrong_verification_code, - name="wrong-verification-code", - ), - path( - "invalid-recovering-email", - invalid_recovering_email_or_username, - name="invalid_recovering_email_or_username", - ), - path("recover-edit-password", recover_edit_password, name="recover-edit-password"), path("markers/upload/", marker_upload, name="marker-upload"), path("objects/upload/", object_upload, name="object-upload"), path("element/get/", element_get, name="element-get"), diff --git a/src/users/views.py b/src/users/views.py index fb60ecf7..80658a18 100644 --- a/src/users/views.py +++ b/src/users/views.py @@ -29,13 +29,15 @@ UploadObjectForm, ) from .models import Profile -from .services.email_service import EmailService -from .services.encrypt_service import EncryptService -from .services.recaptcha_service import BOT_SCORE, create_assessment -from .services.user_service import UserService +from .services import ( EmailService,EncryptService ,BOT_SCORE, create_assessment, UserService) +from django.urls import reverse_lazy +from django.contrib.auth.views import PasswordResetView +from django.contrib.messages.views import SuccessMessageMixin log = logging.getLogger(__file__) +User = get_user_model() + def signup(request): if request.method == "POST": @@ -72,8 +74,15 @@ def signup(request): ) -User = get_user_model() - +class ResetPasswordView(SuccessMessageMixin, PasswordResetView): + template_name = 'users/html/password_reset.jinja2' + email_template_name = 'users/html/password_reset_email.html' + subject_template_name = 'users/html/password_reset_subject.txt' + success_message = _("We've emailed you instructions for setting your password, " \ + "if an account exists with the email you entered. You should receive them shortly." \ + " If you don't receive an email, " \ + "please make sure you've entered the address you registered with, and check your spam folder.") + success_url = reverse_lazy('home') def recover_password(request): if request.method == "POST": From cbbcd3e65a40aebb112a409368fbcbf581d07353 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Thu, 21 Nov 2024 16:58:01 +0000 Subject: [PATCH 53/79] Remove old password reset files --- src/users/forms.py | 8 -- .../users/invalid-recovering-email.jinja2 | 22 ---- .../jinja2/users/recover-edit-password.jinja2 | 31 ----- .../jinja2/users/recover-password-code.jinja2 | 31 ----- .../jinja2/users/recover-password.jinja2 | 46 -------- .../users/wrong-verification-code.jinja2 | 22 ---- src/users/services/__init__.py | 1 + src/users/services/email_service.py | 35 ------ src/users/services/encrypt_service.py | 24 ---- src/users/services/user_service.py | 23 ---- src/users/views.py | 107 +----------------- 11 files changed, 4 insertions(+), 346 deletions(-) delete mode 100644 src/users/jinja2/users/invalid-recovering-email.jinja2 delete mode 100644 src/users/jinja2/users/recover-edit-password.jinja2 delete mode 100644 src/users/jinja2/users/recover-password-code.jinja2 delete mode 100644 src/users/jinja2/users/recover-password.jinja2 delete mode 100644 src/users/jinja2/users/wrong-verification-code.jinja2 delete mode 100644 src/users/services/email_service.py delete mode 100644 src/users/services/encrypt_service.py delete mode 100644 src/users/services/user_service.py diff --git a/src/users/forms.py b/src/users/forms.py index 172bfee1..7fb3b6ec 100644 --- a/src/users/forms.py +++ b/src/users/forms.py @@ -171,14 +171,6 @@ def clean(self): return cleaned_data -class RecoverPasswordForm(forms.Form): - username_or_email = forms.CharField(label="username / email", max_length="50") - - -class RecoverPasswordCodeForm(forms.Form): - verification_code = forms.CharField(label="Verification code", max_length="200") - - class UploadMarkerForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(UploadMarkerForm, self).__init__(*args, **kwargs) diff --git a/src/users/jinja2/users/invalid-recovering-email.jinja2 b/src/users/jinja2/users/invalid-recovering-email.jinja2 deleted file mode 100644 index c83aeafa..00000000 --- a/src/users/jinja2/users/invalid-recovering-email.jinja2 +++ /dev/null @@ -1,22 +0,0 @@ -{% extends '/core/arviewer.jinja2' %} - -{% block content %} - -
- - - -
-{% endblock %} \ No newline at end of file diff --git a/src/users/jinja2/users/recover-edit-password.jinja2 b/src/users/jinja2/users/recover-edit-password.jinja2 deleted file mode 100644 index 1d0068a9..00000000 --- a/src/users/jinja2/users/recover-edit-password.jinja2 +++ /dev/null @@ -1,31 +0,0 @@ -{% extends '/core/arviewer.jinja2' %} - -{% block content %} - -
- - - -
-{% endblock %} \ No newline at end of file diff --git a/src/users/jinja2/users/recover-password-code.jinja2 b/src/users/jinja2/users/recover-password-code.jinja2 deleted file mode 100644 index 79fa95ad..00000000 --- a/src/users/jinja2/users/recover-password-code.jinja2 +++ /dev/null @@ -1,31 +0,0 @@ -{% extends '/core/arviewer.jinja2' %} - -{% block content %} - -
- - - -
-{% endblock %} \ No newline at end of file diff --git a/src/users/jinja2/users/recover-password.jinja2 b/src/users/jinja2/users/recover-password.jinja2 deleted file mode 100644 index 1d8efac2..00000000 --- a/src/users/jinja2/users/recover-password.jinja2 +++ /dev/null @@ -1,46 +0,0 @@ -{% extends '/core/arviewer.jinja2' %} - -{% block extra_css%} - -{% endblock %} - -{% block extra_js%} - - {% if recaptcha_enabled %} - - - {% endif %} -{% endblock %} - -{% block content %} -
- - -
-{% endblock %} \ No newline at end of file diff --git a/src/users/jinja2/users/wrong-verification-code.jinja2 b/src/users/jinja2/users/wrong-verification-code.jinja2 deleted file mode 100644 index b3a8ddaf..00000000 --- a/src/users/jinja2/users/wrong-verification-code.jinja2 +++ /dev/null @@ -1,22 +0,0 @@ -{% extends '/core/arviewer.jinja2' %} - -{% block content %} - -
- - - -
-{% endblock %} \ No newline at end of file diff --git a/src/users/services/__init__.py b/src/users/services/__init__.py index e69de29b..f79e22ec 100644 --- a/src/users/services/__init__.py +++ b/src/users/services/__init__.py @@ -0,0 +1 @@ +from .recaptcha_service import * \ No newline at end of file diff --git a/src/users/services/email_service.py b/src/users/services/email_service.py deleted file mode 100644 index fd23ec18..00000000 --- a/src/users/services/email_service.py +++ /dev/null @@ -1,35 +0,0 @@ -import smtplib -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText - -from django.conf import settings - - -class EmailService: - def __init__(self, email_message): - self.smtp_server = settings.SMTP_SERVER - self.smtp_port = settings.SMTP_PORT - self.smtp_user = settings.SMTP_USER - self.smtp_password = settings.SMTP_PASSWORD - self.jandig_email = settings.SMTP_SENDER_MAIL - self.email_message = email_message - - def send_email_to_recover_password(self, multipart_message): - email_server = smtplib.SMTP(self.smtp_server, self.smtp_port) - email_server.starttls() - email_server.login(self.smtp_user, self.smtp_password) - email_server.sendmail( - multipart_message["From"], - multipart_message["To"], - multipart_message.as_string(), - ) - email_server.quit() - - def build_multipart_message(self, user_email): - multipart_message = MIMEMultipart("alternative") - multipart_message["From"] = f"Jandig <{self.jandig_email}>" - multipart_message["To"] = "{}".format(user_email) - multipart_message["Subject"] = "Recover Password" - - multipart_message.attach(MIMEText(self.email_message, "plain")) - return multipart_message diff --git a/src/users/services/encrypt_service.py b/src/users/services/encrypt_service.py deleted file mode 100644 index 6a8e0d1d..00000000 --- a/src/users/services/encrypt_service.py +++ /dev/null @@ -1,24 +0,0 @@ -import hashlib -import secrets -from datetime import datetime - - -class EncryptService: - def generate_verification_code(self, email): - datetime_now = datetime.now() - _year = datetime_now.year - _month = datetime_now.month - _day = datetime_now.day - _hour = datetime_now.hour - _minute = datetime_now.minute - _second = datetime_now.second - _microsec = datetime_now.microsecond - - today = f"{_year}{_month}{_day}{_hour}{_minute}{_second}{_microsec}" - decrypt_code = str(today) + (email * 4) + secrets.token_hex(16) - verification_code = self.generate_hash_code(decrypt_code) - return verification_code - - def generate_hash_code(self, decrypt_code): - hash_code = hashlib.sha256(bytes(decrypt_code, encoding="utf-8")) - return hash_code.hexdigest() diff --git a/src/users/services/user_service.py b/src/users/services/user_service.py deleted file mode 100644 index b79df83e..00000000 --- a/src/users/services/user_service.py +++ /dev/null @@ -1,23 +0,0 @@ -import logging - -from django.contrib.auth.models import User - -log = logging.getLogger("ej") - - -class UserService: - def get_user_email(self, username_or_email): - if "@" in username_or_email: - return username_or_email - user = User.objects.get(username=username_or_email) - log.warning(user) - return user.email - - def check_if_username_or_email_exist(self, username_or_email): - if "@" in username_or_email: - if not User.objects.filter(email=username_or_email).exists(): - return False - else: - if not User.objects.filter(username=username_or_email).exists(): - return False - return True diff --git a/src/users/views.py b/src/users/views.py index 80658a18..8ffba392 100644 --- a/src/users/views.py +++ b/src/users/views.py @@ -8,6 +8,8 @@ login, update_session_auth_hash, ) + +from django.utils.translation import gettext_lazy as _ from django.contrib.auth.decorators import login_required from django.contrib.auth.forms import SetPasswordForm from django.http import Http404, JsonResponse @@ -22,14 +24,12 @@ ExhibitForm, PasswordChangeForm, ProfileForm, - RecoverPasswordCodeForm, - RecoverPasswordForm, SignupForm, UploadMarkerForm, UploadObjectForm, ) from .models import Profile -from .services import ( EmailService,EncryptService ,BOT_SCORE, create_assessment, UserService) +from .services import (BOT_SCORE, create_assessment) from django.urls import reverse_lazy from django.contrib.auth.views import PasswordResetView from django.contrib.messages.views import SuccessMessageMixin @@ -84,107 +84,6 @@ class ResetPasswordView(SuccessMessageMixin, PasswordResetView): "please make sure you've entered the address you registered with, and check your spam folder.") success_url = reverse_lazy('home') -def recover_password(request): - if request.method == "POST": - if settings.RECAPTCHA_ENABLED: - recaptcha_token = request.POST.get("g-recaptcha-response") - assessment = create_assessment( - token=recaptcha_token, recaptcha_action="recover_password" - ) - score = assessment.get("riskAnalysis", {}).get("score", -1) - if score <= BOT_SCORE: - return redirect("home") - - recover_password_form = RecoverPasswordForm(request.POST) - - if recover_password_form.is_valid(): - username_or_email = recover_password_form.cleaned_data.get( - "username_or_email" - ) - user_service = UserService() - username_or_email_is_valid = user_service.check_if_username_or_email_exist( - username_or_email - ) - if not username_or_email_is_valid: - return redirect("invalid_recovering_email_or_username") - - global global_recovering_email - global_recovering_email = user_service.get_user_email(username_or_email) - - global global_verification_code - encrypt_service = EncryptService() - global_verification_code = encrypt_service.generate_verification_code( - global_recovering_email - ) - - build_message_and_send_to_user(global_recovering_email) - - return redirect("recover-code") - - recover_password_form = RecoverPasswordForm() - return render( - request, - "users/recover-password.jinja2", - { - "form": recover_password_form, - "recaptcha_enabled": settings.RECAPTCHA_ENABLED, - "recaptcha_site_key": settings.RECAPTCHA_SITE_KEY, - }, - ) - - -def build_message_and_send_to_user(email): - message = f"You have requested a new password. This is your verification code: {global_verification_code}\nCopy it and put into the field." - email_service = EmailService(message) - multipart_message = email_service.build_multipart_message(email) - email_service.send_email_to_recover_password(multipart_message) - - -def recover_code(request): - if request.method == "POST": - form = RecoverPasswordCodeForm(request.POST) - - if form.is_valid(): - code = form.cleaned_data.get("verification_code") - - log.warning("Inserido: %s", code) - log.warning("Correto: %s", global_verification_code) - - if code == global_verification_code: - global recover_password_user - recover_password_user = User.objects.get(email=global_recovering_email) - return redirect("recover-edit-password") - - return redirect("wrong-verification-code") - return redirect("home") - - form = RecoverPasswordCodeForm() - return render(request, "users/recover-password-code.jinja2", {"form": form}) - - -def recover_edit_password(request): - if request.method == "POST": - form = SetPasswordForm(recover_password_user, data=request.POST) - - if form.is_valid(): - form.save() - - return redirect("login") - else: - form = SetPasswordForm(recover_password_user) - - return render(request, "users/recover-edit-password.jinja2", {"form": form}) - - -@require_http_methods(["GET"]) -def wrong_verification_code(request): - return render(request, "users/wrong-verification-code.jinja2") - - -@require_http_methods(["GET"]) -def invalid_recovering_email_or_username(request): - return render(request, "users/invalid-recovering-email.jinja2") - @login_required @require_http_methods(["GET"]) From 879cf07009c65a8adf37b690665c88d51a195121 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Thu, 21 Nov 2024 16:58:53 +0000 Subject: [PATCH 54/79] Rename reset-password template folder --- .../users/{html => reset-password}/password_reset.jinja2 | 0 .../{html => reset-password}/password_reset_complete.jinja2 | 0 .../{html => reset-password}/password_reset_confirm.jinja2 | 0 .../{html => reset-password}/password_reset_email.html | 0 .../{html => reset-password}/password_reset_subject.txt | 0 src/users/urls.py | 4 ++-- src/users/views.py | 6 +++--- 7 files changed, 5 insertions(+), 5 deletions(-) rename src/users/jinja2/users/{html => reset-password}/password_reset.jinja2 (100%) rename src/users/jinja2/users/{html => reset-password}/password_reset_complete.jinja2 (100%) rename src/users/jinja2/users/{html => reset-password}/password_reset_confirm.jinja2 (100%) rename src/users/jinja2/users/{html => reset-password}/password_reset_email.html (100%) rename src/users/jinja2/users/{html => reset-password}/password_reset_subject.txt (100%) diff --git a/src/users/jinja2/users/html/password_reset.jinja2 b/src/users/jinja2/users/reset-password/password_reset.jinja2 similarity index 100% rename from src/users/jinja2/users/html/password_reset.jinja2 rename to src/users/jinja2/users/reset-password/password_reset.jinja2 diff --git a/src/users/jinja2/users/html/password_reset_complete.jinja2 b/src/users/jinja2/users/reset-password/password_reset_complete.jinja2 similarity index 100% rename from src/users/jinja2/users/html/password_reset_complete.jinja2 rename to src/users/jinja2/users/reset-password/password_reset_complete.jinja2 diff --git a/src/users/jinja2/users/html/password_reset_confirm.jinja2 b/src/users/jinja2/users/reset-password/password_reset_confirm.jinja2 similarity index 100% rename from src/users/jinja2/users/html/password_reset_confirm.jinja2 rename to src/users/jinja2/users/reset-password/password_reset_confirm.jinja2 diff --git a/src/users/jinja2/users/html/password_reset_email.html b/src/users/jinja2/users/reset-password/password_reset_email.html similarity index 100% rename from src/users/jinja2/users/html/password_reset_email.html rename to src/users/jinja2/users/reset-password/password_reset_email.html diff --git a/src/users/jinja2/users/html/password_reset_subject.txt b/src/users/jinja2/users/reset-password/password_reset_subject.txt similarity index 100% rename from src/users/jinja2/users/html/password_reset_subject.txt rename to src/users/jinja2/users/reset-password/password_reset_subject.txt diff --git a/src/users/urls.py b/src/users/urls.py index 99804ef9..b5ae643b 100644 --- a/src/users/urls.py +++ b/src/users/urls.py @@ -43,10 +43,10 @@ path("logout/", auth_views.LogoutView.as_view(), name="logout"), path('reset-password/', ResetPasswordView.as_view(), name='reset-password'), path('password-reset-confirm///', - auth_views.PasswordResetConfirmView.as_view(template_name='users/html/password_reset_confirm.jinja2'), + auth_views.PasswordResetConfirmView.as_view(template_name='users/reset-password/password_reset_confirm.jinja2'), name='password_reset_confirm'), path('password-reset-complete/', - auth_views.PasswordResetCompleteView.as_view(template_name='users/html/password_reset_complete.jinja2'), + auth_views.PasswordResetCompleteView.as_view(template_name='users/reset-password/password_reset_complete.jinja2'), name='password_reset_complete'), # path("recover/", recover_password, name="recover"), # path("recover-code/", recover_code, name="recover-code"), diff --git a/src/users/views.py b/src/users/views.py index 8ffba392..fae3ee20 100644 --- a/src/users/views.py +++ b/src/users/views.py @@ -75,9 +75,9 @@ def signup(request): class ResetPasswordView(SuccessMessageMixin, PasswordResetView): - template_name = 'users/html/password_reset.jinja2' - email_template_name = 'users/html/password_reset_email.html' - subject_template_name = 'users/html/password_reset_subject.txt' + template_name = 'users/reset-password/password_reset.jinja2' + email_template_name = 'users/reset-password/password_reset_email.html' + subject_template_name = 'users/reset-password/password_reset_subject.txt' success_message = _("We've emailed you instructions for setting your password, " \ "if an account exists with the email you entered. You should receive them shortly." \ " If you don't receive an email, " \ From 48c7c892fb2ff0800ed10351bd845295e01dc583 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Thu, 21 Nov 2024 17:05:27 +0000 Subject: [PATCH 55/79] Fix black, isort and flake8 --- src/config/settings.py | 6 ++--- src/core/urls.py | 9 +++++--- src/core/views/views.py | 2 +- src/users/services/__init__.py | 2 +- src/users/urls.py | 42 +++++++++++++--------------------- src/users/views.py | 30 ++++++++++++------------ 6 files changed, 42 insertions(+), 49 deletions(-) diff --git a/src/config/settings.py b/src/config/settings.py index 8ec6666d..c8f5dc3e 100644 --- a/src/config/settings.py +++ b/src/config/settings.py @@ -9,7 +9,7 @@ from django.utils.translation import gettext_lazy as _ from sentry_sdk.integrations.django import DjangoIntegration -from .storage_settings import * # noqa F403 F401 +from .storage_settings import * # noqa F403 F401 ROOT_DIR = environ.Path("/jandig/") BASE_DIR = "/jandig/src" @@ -196,10 +196,10 @@ def debug(request): DEFAULT_FROM_EMAIL = env("SMTP_SENDER_MAIL", default="jandig@memelab.com.br") -EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend" EMAIL_HOST = env("SMTP_SERVER", default="mailpit") EMAIL_USE_TLS = env("SMTP_USE_TLS", default=False) -EMAIL_PORT = env("SMTP_PORT", default=1025) +EMAIL_PORT = env("SMTP_PORT", default=1025) EMAIL_HOST_USER = env("SMTP_USER", default="jandig@jandig.com") EMAIL_HOST_PASSWORD = env("SMTP_PASSWORD", default="password") EMAIL_USE_SSL = False diff --git a/src/core/urls.py b/src/core/urls.py index 10353b61..766a916e 100644 --- a/src/core/urls.py +++ b/src/core/urls.py @@ -1,12 +1,11 @@ from django.conf import settings -from django.urls import include, path +from django.urls import include, path, re_path from rest_framework_nested.routers import DefaultRouter from core.views.artworks import ArtworkViewset from core.views.exhibits import ExhibitViewset from core.views.markers import MarkerViewset from core.views.objects import ObjectViewset -from django.urls import re_path from core.views.static_views import ( community, documentation, @@ -48,7 +47,11 @@ path("manifest.json", manifest, name="manifest"), path("upload", upload_image, name="upload-image"), path("i18n/", include("django.conf.urls.i18n")), - re_path(r"^see_all(?:/(?P[a-zA-Z]+))?(?:/(?P\d+))?/$", see_all, name="see_all"), + re_path( + r"^see_all(?:/(?P[a-zA-Z]+))?(?:/(?P\d+))?/$", + see_all, + name="see_all", + ), path("robots.txt", robots_txt), path("favicon.ico", favicon), path(settings.HEALTH_CHECK_URL, health_check), diff --git a/src/core/views/views.py b/src/core/views/views.py index 54c0f2e0..22e33593 100644 --- a/src/core/views/views.py +++ b/src/core/views/views.py @@ -77,7 +77,7 @@ def see_all(request, which="", page=1): if data: paginator = Paginator(data, per_page) if page > paginator.num_pages: - return redirect("see_all", request_type,paginator.num_pages) + return redirect("see_all", request_type, paginator.num_pages) paginated_data = paginator.get_page(page) paginated_data.adjusted_elided_pages = paginator.get_elided_page_range(page) ctx = { diff --git a/src/users/services/__init__.py b/src/users/services/__init__.py index f79e22ec..744f9d1c 100644 --- a/src/users/services/__init__.py +++ b/src/users/services/__init__.py @@ -1 +1 @@ -from .recaptcha_service import * \ No newline at end of file +from .recaptcha_service import * # noqa diff --git a/src/users/urls.py b/src/users/urls.py index b5ae643b..4315f6bc 100644 --- a/src/users/urls.py +++ b/src/users/urls.py @@ -3,6 +3,7 @@ from .forms import LoginForm from .views import ( + ResetPasswordView, create_artwork, create_exhibit, delete, @@ -14,20 +15,14 @@ edit_password, edit_profile, element_get, - invalid_recovering_email_or_username, marker_upload, mod, mod_delete, object_upload, permission_denied, profile, - recover_code, - recover_edit_password, - recover_password, related_content, signup, - wrong_verification_code, - ResetPasswordView, ) urlpatterns = [ @@ -41,26 +36,21 @@ name="login", ), path("logout/", auth_views.LogoutView.as_view(), name="logout"), - path('reset-password/', ResetPasswordView.as_view(), name='reset-password'), - path('password-reset-confirm///', - auth_views.PasswordResetConfirmView.as_view(template_name='users/reset-password/password_reset_confirm.jinja2'), - name='password_reset_confirm'), - path('password-reset-complete/', - auth_views.PasswordResetCompleteView.as_view(template_name='users/reset-password/password_reset_complete.jinja2'), - name='password_reset_complete'), - # path("recover/", recover_password, name="recover"), - # path("recover-code/", recover_code, name="recover-code"), - # path( - # "wrong-verification-code", - # wrong_verification_code, - # name="wrong-verification-code", - # ), - # path( - # "invalid-recovering-email", - # invalid_recovering_email_or_username, - # name="invalid_recovering_email_or_username", - # ), - # path("recover-edit-password", recover_edit_password, name="recover-edit-password"), + path("reset-password/", ResetPasswordView.as_view(), name="reset-password"), + path( + "password-reset-confirm///", + auth_views.PasswordResetConfirmView.as_view( + template_name="users/reset-password/password_reset_confirm.jinja2" + ), + name="password_reset_confirm", + ), + path( + "password-reset-complete/", + auth_views.PasswordResetCompleteView.as_view( + template_name="users/reset-password/password_reset_complete.jinja2" + ), + name="password_reset_complete", + ), path("profile/", profile, name="profile"), path("profile/edit/", edit_profile, name="edit-profile"), path("profile/edit-password/", edit_password, name="edit-password"), diff --git a/src/users/views.py b/src/users/views.py index fae3ee20..3b7609fb 100644 --- a/src/users/views.py +++ b/src/users/views.py @@ -8,12 +8,13 @@ login, update_session_auth_hash, ) - -from django.utils.translation import gettext_lazy as _ from django.contrib.auth.decorators import login_required -from django.contrib.auth.forms import SetPasswordForm +from django.contrib.auth.views import PasswordResetView +from django.contrib.messages.views import SuccessMessageMixin from django.http import Http404, JsonResponse from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse_lazy +from django.utils.translation import gettext_lazy as _ from django.views.decorators.cache import cache_page from django.views.decorators.http import require_http_methods @@ -29,10 +30,7 @@ UploadObjectForm, ) from .models import Profile -from .services import (BOT_SCORE, create_assessment) -from django.urls import reverse_lazy -from django.contrib.auth.views import PasswordResetView -from django.contrib.messages.views import SuccessMessageMixin +from .services import BOT_SCORE, create_assessment log = logging.getLogger(__file__) @@ -75,14 +73,16 @@ def signup(request): class ResetPasswordView(SuccessMessageMixin, PasswordResetView): - template_name = 'users/reset-password/password_reset.jinja2' - email_template_name = 'users/reset-password/password_reset_email.html' - subject_template_name = 'users/reset-password/password_reset_subject.txt' - success_message = _("We've emailed you instructions for setting your password, " \ - "if an account exists with the email you entered. You should receive them shortly." \ - " If you don't receive an email, " \ - "please make sure you've entered the address you registered with, and check your spam folder.") - success_url = reverse_lazy('home') + template_name = "users/reset-password/password_reset.jinja2" + email_template_name = "users/reset-password/password_reset_email.html" + subject_template_name = "users/reset-password/password_reset_subject.txt" + success_message = _( + "We've emailed you instructions for setting your password, " + "if an account exists with the email you entered. You should receive them shortly." + " If you don't receive an email, " + "please make sure you've entered the address you registered with, and check your spam folder." + ) + success_url = reverse_lazy("home") @login_required From d98742726146d61e1c9c03c89dc39bf2cc6f59cd Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Thu, 21 Nov 2024 17:11:06 +0000 Subject: [PATCH 56/79] Update reset password e-mail text --- src/users/jinja2/users/reset-password/password_reset_email.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/users/jinja2/users/reset-password/password_reset_email.html b/src/users/jinja2/users/reset-password/password_reset_email.html index e261c607..e00e10f0 100644 --- a/src/users/jinja2/users/reset-password/password_reset_email.html +++ b/src/users/jinja2/users/reset-password/password_reset_email.html @@ -1,5 +1,5 @@ - To initiate the password reset process for your {{ user.email }} Django Registration/Login App Account, + To initiate the password reset process for your {{ user.email }} Jandig account, click the link below: {{ protocol }}://{{ domain }}{{ url('password_reset_confirm',args=[uid,token]) }} From 075df895fce3ba9ffd062b5b9678668d06239847 Mon Sep 17 00:00:00 2001 From: Rodrigo Campos Date: Thu, 21 Nov 2024 14:34:12 -0300 Subject: [PATCH 57/79] Fix login with e-mail not working --- src/users/forms.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/users/forms.py b/src/users/forms.py index 7fb3b6ec..ad9d083f 100644 --- a/src/users/forms.py +++ b/src/users/forms.py @@ -144,9 +144,7 @@ def __init__(self, *args, **kwargs): self.fields["password"].widget.attrs["placeholder"] = _("password") def clean(self): - cleaned_data = super(LoginForm, self).clean() - - username_or_email = cleaned_data.get("username", "") + username_or_email = self.cleaned_data.get("username", "") search_by = {} if "@" in username_or_email: @@ -154,21 +152,25 @@ def clean(self): else: search_by["username"] = username_or_email - user = User.objects.get(**search_by) - if not user: - raise forms.ValidationError(_("Username/email not found")) + try: + user = User.objects.get(**search_by) + except User.DoesNotExist as e: + raise forms.ValidationError(_("Username/email not found")) from e - cleaned_data["username"] = user.username + self.cleaned_data["username"] = user.username - password = cleaned_data.get("password") + password = self.cleaned_data.get("password") - logged_user = authenticate(username=user.username, password=password) - if not logged_user: + logged_user = authenticate(self.request, username=user.username, password=password) + if logged_user is None: raise forms.ValidationError(_("Wrong password!")) - self.confirm_login_allowed(logged_user) + self.user = logged_user + + return self.cleaned_data - return cleaned_data + def get_user(self): + return getattr(self, "user", None) class UploadMarkerForm(forms.ModelForm): From fa4ab9dd7b07bd5ab5a7407786f2b091d1f489b7 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Thu, 21 Nov 2024 18:26:59 +0000 Subject: [PATCH 58/79] Remove old credentials from example file --- .envs/.example | 9 --------- src/config/settings.py | 1 - 2 files changed, 10 deletions(-) diff --git a/.envs/.example b/.envs/.example index 01605030..771576a0 100644 --- a/.envs/.example +++ b/.envs/.example @@ -48,12 +48,3 @@ RECAPTCHA_ENABLED=False RECAPTCHA_PROJECT_ID= RECAPTCHA_GCLOUD_API_KEY= RECAPTCHA_SITE_KEY= -RECAPTCHA_SECRET_KEY= - - - - -RECAPTCHA_PROJECT_ID=jandig-1730288777649 -RECAPTCHA_GCLOUD_API_KEY=AIzaSyDlXg-ey8TF7jWWHyZysiCxTNmOKdqlLk4 -RECAPTCHA_SITE_KEY=6LebeHAqAAAAALfIfbLm0znmZcUxG8U1VDy7iUDB -RECAPTCHA_SECRET_KEY=6LebeHAqAAAAACQUN1laIgne5-rcTy4q5-4Br7Po \ No newline at end of file diff --git a/src/config/settings.py b/src/config/settings.py index c8f5dc3e..37e1d0ac 100644 --- a/src/config/settings.py +++ b/src/config/settings.py @@ -207,7 +207,6 @@ def debug(request): # Recaptcha RECAPTCHA_ENABLED = env("RECAPTCHA_ENABLED", default=False) RECAPTCHA_SITE_KEY = env("RECAPTCHA_SITE_KEY", default="") -RECAPTCHA_SECRET_KEY = env("RECAPTCHA_SECRET_KEY", default="") RECAPTCHA_PROJECT_ID = env("RECAPTCHA_PROJECT_ID", default="") RECAPTCHA_GCLOUD_API_KEY = env("RECAPTCHA_GCLOUD_API_KEY", default="") From 3a5d0dde9d8879648f204291151bcfc707ac7ed3 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sun, 8 Dec 2024 16:17:41 +0000 Subject: [PATCH 59/79] Translate community page --- Makefile | 3 + locale/en_US/LC_MESSAGES/django.po | 20 +-- locale/pt_BR/LC_MESSAGES/django.po | 240 +++++++++++++++++--------- src/core/jinja2/core/community.jinja2 | 20 +-- tasks.py | 17 +- 5 files changed, 182 insertions(+), 118 deletions(-) diff --git a/Makefile b/Makefile index 99c09b28..4a786ee5 100644 --- a/Makefile +++ b/Makefile @@ -28,3 +28,6 @@ gen: translate_es: poetry run inv i18n -l es_ES + +translate_pt: + poetry run inv i18n -l pt_BR \ No newline at end of file diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po index f20300e3..dda748d6 100644 --- a/locale/en_US/LC_MESSAGES/django.po +++ b/locale/en_US/LC_MESSAGES/django.po @@ -338,39 +338,39 @@ msgstr "" #: src/ARte/core/jinja2/core/community.jinja2:7 msgid "An art experimentation for digital exhibtions in physical spaces" -msgstr "Uma experimentação de arte para exibições digitais em espaços físicos" +msgstr "" #: src/ARte/core/jinja2/core/community.jinja2:9 msgid "Cell phones and tablets are used to read markers and thus open “windows” where other art objects can be found. The public is invited to transcend the exhibition space, taking stickers with markers to be pasted in other places, creating Temporary Autonomous Zones (TAZes). The public becomes a co-author, and markers and digital works are reconfigured by spaces." -msgstr "Celulares e tablets são usados para ler marcadores e assim abrir “janelas” onde se encontram outros objetos de arte. O público é convidado a transcender o espaço de exposição, levando adesivos com marcadores para serem colados em outros locais, criando Zonas Autônomas Temporárias (TAZes). O público se torna co-autor, e os marcadores e obras digitais são reconfigurados pelos espaços." +msgstr "" #: src/ARte/core/jinja2/core/community.jinja2:12 -msgid "Know" -msgstr "Entenda" +msgid "Know More" +msgstr "" #: src/ARte/core/jinja2/core/community.jinja2:14 msgid "The Jandig project is an investigation into the intervention of markers for viewing works through augmented reality on urban space. It is a collaborative digital art project that proposes the creation of Temporary Autonomous Zones (TAZes) in each space where it is installed. These TAZes are formed through markers spread across a space by artists and the public – who thus become co-creators of that experience. Users interact with markers, using mobile devices to open real-world windows to view digital creations (Licensed under Creative Commons)." -msgstr "O projeto Jandig é uma investigação a respeito da intervenção de marcadores para visualização de obras por meio de realidade aumentada sobre o espaço urbano. Trata-se de um projeto colaborativo de arte digital que propõe a criação de Zonas Autônomas Temporárias (TAZes) em cada espaço em que é instalado. Essas TAZes são formadas através de marcadores espalhados por um espaço por artistas e pelo público – que assim torna-se co-criador daquela experiência. Os usuários interagem com marcadores, utilizando dispositivos móveis para abrir janelas no mundo real para visualizar criações digitais (cedidas através de licença Creative Commons)." +msgstr "" #: src/ARte/core/jinja2/core/community.jinja2:18 msgid "Our goals" -msgstr "Nossos objetivos" +msgstr "" #: src/ARte/core/jinja2/core/community.jinja2:20 msgid "The Jandig platform makes exhibitions possible using augmented reality." -msgstr "A plataforma Jandig viabiliza a realização de exposições com o uso de realidade aumentada." +msgstr "" #: src/ARte/core/jinja2/core/community.jinja2:22 msgid "Each exhibition is made from the arrangement of several markers, which use adhesives, stencil images, stamps, or others, in different sizes as support. These supports are also delivered to the public that circulate through the space, so that they can make local interference and that it is possible to “viralize” the markers while the exhibition is available, leaving traces and providing interactions between participants/visitors." -msgstr "Cada exposição é feita a partir da disposição de diversos marcadores, que utilizam como suporte adesivos, imagens de stencil, de carimbos, ou outras, em diferentes tamanhos. Esses suportes são também entregues ao público que circulam pelo espaço, de modo que possam fazer interferências locais e que seja possível “viralizar” os marcadores enquanto a exposição estiver disponível, deixando rastros e proporcionando interações entre os participantes/visitantes." +msgstr "" #: src/ARte/core/jinja2/core/community.jinja2:24 msgid "To see through the “windows” and see what the fabulous images reveal, the public must point their devices at the markers, so that the Jandig platform viewer can read them and show the content in augmented reality." -msgstr "Para enxergar através das “janelas” e ver as imagens fabulosas o que elas revelam, o público deverá apontar seus dispositivos para os marcadores, para que o visualizador da plataforma Jandig ufaça a leitura dos mesmos e mostre o conteúdo em realidade aumentada." +msgstr "" #: src/ARte/core/jinja2/core/community.jinja2:26 msgid "Borders are the graphic elements that trigger the recognition of the object associated with each marker. For this reason, they should not be covered and they should always be seen completely by the camera. Placing your finger on one of the edges or bringing the camera too close to the marker makes recognition impossible, for example. This characteristic must always be taken into account in the production and application of markers." -msgstr "As bordas são os elementos gráficos que engatilham o reconhecimento do objeto associado a cada marcador. Por esse motivo, não se deve cobri-las e elas devem sempre ser vistas completamente pela câmera. Colocar o dedo sobre uma das bordas ou aproximar demais a câmera do marcador inviabiliza o reconhecimento, por exemplo. Essa característica deve sempre ser levada em consideração na produção e aplicação dos marcadores." +msgstr "" #: src/ARte/users/jinja2/users/profile.jinja2:21 msgid "You have no Exhibitions. :c" diff --git a/locale/pt_BR/LC_MESSAGES/django.po b/locale/pt_BR/LC_MESSAGES/django.po index 52101bf2..024bbba1 100644 --- a/locale/pt_BR/LC_MESSAGES/django.po +++ b/locale/pt_BR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-06 15:42+0000\n" +"POT-Creation-Date: 2024-12-08 16:02+0000\n" "PO-Revision-Date: 2020-02-17 18:13-0300\n" "Last-Translator: \n" "Language-Team: \n" @@ -26,11 +26,11 @@ msgstr "Inglês" msgid "Brazilian Portuguese" msgstr "Português do Brasil" -#: src/users/forms.py:32 src/users/forms.py:93 +#: src/users/forms.py:32 src/users/forms.py:98 msgid "Your e-mail address" msgstr "Seu endereço de e-mail" -#: src/users/forms.py:37 src/users/forms.py:97 +#: src/users/forms.py:37 src/users/forms.py:102 msgid "Your username" msgstr "Seu nome de usuário" @@ -42,7 +42,7 @@ msgstr "email" msgid "chosen username" msgstr "nome de usuário escolhido" -#: src/users/forms.py:45 src/users/forms.py:129 +#: src/users/forms.py:45 src/users/forms.py:144 msgid "password" msgstr "senha" @@ -50,69 +50,69 @@ msgstr "senha" msgid "confirm password" msgstr "confirmar senha" -#: src/users/forms.py:56 +#: src/users/forms.py:59 msgid "E-mail taken" msgstr "E-mail já existente" -#: src/users/forms.py:64 +#: src/users/forms.py:67 msgid "Old Password" msgstr "Senha antiga" -#: src/users/forms.py:65 +#: src/users/forms.py:68 msgid "New Password" msgstr "Nova senha" -#: src/users/forms.py:66 +#: src/users/forms.py:70 msgid "New Password Again" msgstr "Nova senha novamente" -#: src/users/forms.py:86 +#: src/users/forms.py:91 msgid "E-mail" msgstr "E-mail" -#: src/users/forms.py:87 +#: src/users/forms.py:92 msgid "Username" msgstr "Usuário" -#: src/users/forms.py:88 src/users/forms.py:104 +#: src/users/forms.py:93 src/users/forms.py:109 msgid "Personal Bio / Description" msgstr "Biografia / Descrição" -#: src/users/forms.py:89 src/users/forms.py:108 +#: src/users/forms.py:94 src/users/forms.py:113 msgid "Personal Website" msgstr "Site pessoal" -#: src/users/forms.py:114 +#: src/users/forms.py:124 msgid "Username already in use" msgstr "Nome de usuário já em uso" -#: src/users/forms.py:120 +#: src/users/forms.py:135 msgid "Email address must be unique" msgstr "O endereço de e-mail deve ser único" -#: src/users/forms.py:128 +#: src/users/forms.py:143 msgid "username / email" msgstr "nome de usuário / email" -#: src/users/forms.py:135 src/users/forms.py:141 +#: src/users/forms.py:158 msgid "Username/email not found" msgstr "Nome de usuário / email não encontrado" -#: src/users/forms.py:167 +#: src/users/forms.py:166 #, fuzzy msgid "Wrong password!" msgstr "Senha errada" -#: src/users/forms.py:185 src/users/forms.py:222 +#: src/users/forms.py:181 src/users/forms.py:220 msgid "browse file" msgstr "procurar arquivo" -#: src/users/forms.py:187 src/users/forms.py:224 src/users/forms.py:257 -#: src/users/forms.py:258 +#: src/users/forms.py:184 src/users/forms.py:223 src/users/forms.py:258 +#: src/users/forms.py:261 msgid "declare different author name" msgstr "declarar outro autor" -#: src/users/forms.py:188 +#: src/users/forms.py:186 msgid "Marker's title" msgstr "Título do Marcador" @@ -120,27 +120,39 @@ msgstr "Título do Marcador" msgid "Object's title" msgstr "Título do Objeto" -#: src/users/forms.py:259 +#: src/users/forms.py:263 msgid "Artwork title" msgstr "Título da Obra" -#: src/users/forms.py:260 +#: src/users/forms.py:265 msgid "Artwork description" msgstr "Descrição da Obra" -#: src/users/forms.py:274 +#: src/users/forms.py:281 #, fuzzy msgid "Url can't contain spaces or special characters" msgstr "Urls não podem conter espaços ou caracteres especiais (i.e: .:, /)" -#: src/users/forms.py:280 +#: src/users/forms.py:288 msgid "Exhibit Title" msgstr "Título da Exposição" -#: src/users/forms.py:281 +#: src/users/forms.py:290 msgid "Complete with your Exhibit URL here" msgstr "Complete sua URL de exibição aqui" +#: src/users/views.py:80 +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly. If you " +"don't receive an email, please make sure you've entered the address you " +"registered with, and check your spam folder." +msgstr "" +"Enviamos a você por e-mail instruções para redefinir sua senha, se existir uma conta " +"com o e-mail que você digitou. Você deverá recebê-lo em breve. Se você " +"não receber um e-mail, certifique-se de inserir o endereço que você " +"tem registrado e verifique sua pasta de spam." + #: src/blog/jinja2/blog/category.jinja2:8 src/blog/jinja2/blog/detail.jinja2:5 #, fuzzy msgid "< Back to Blog" @@ -167,11 +179,7 @@ msgstr "Ver como JPG" msgid "View File" msgstr "Ver Arquivo" -#: src/blog/jinja2/blog/detail.jinja2:13 -msgid "Categories:" -msgstr "Categorias" - -#: src/blog/jinja2/blog/detail.jinja2:35 +#: src/blog/jinja2/blog/detail.jinja2:24 #, fuzzy msgid "Back to Top" msgstr "Página inicial" @@ -198,6 +206,81 @@ msgstr "Por favor sobrescreva o bloco \"conteúdo\" de seu modelo!" msgid "We found no content on your Collection, try uploading an object." msgstr "Não encontramos nenhum objeto por aqui :( Tente fazer upload." +#: src/core/jinja2/core/community.jinja2:7 +msgid "An art experiment for digital exhibitions in physical spaces." +msgstr "Uma experimentação de arte para exibições digitais em espaços físicos." + + +#: src/core/jinja2/core/community.jinja2:9 +msgid "" +"Cell phones and tablets are used to read markers and thus open “windows” " +"where other art objects can be found. The public is invited to transcend the " +"exhibition space, taking stickers with markers to be used in other " +"locations, creating Temporary Autonomous Zones (TAZes). The public becomes " +"co-authors, and markers and digital works are reconfigured across spaces." +msgstr "" +"Celulares e tablets são usados para ler marcadores e assim abrir “janelas”" +"onde se encontram outros objetos de arte. O público é convidado a transcender o " +"espaço de exposição, levando adesivos com marcadores para serem colados em outros " +"locais, criando Zonas Autônomas Temporárias (TAZes). O público se torna " +"co-autor, e os marcadores e obras digitais são reconfigurados pelos espaços." + + + + +#: src/core/jinja2/core/community.jinja2:12 +msgid "Know More" +msgstr "Entenda" + +#: src/core/jinja2/core/community.jinja2:14 +msgid "" +"The Jandig project is an investigation into the intervention of markers to " +"visualize works through augmented reality in urban space. This is a " +"collaborative digital art project that proposes the creation of Temporary " +"Autonomous Zones (TAZes) in each space in which it is installed. These TAZes " +"are formed through markers spread across a space by artists and the public – " +"who thus become co-creators of that experience. Users interact with markers, " +"using mobile devices to open windows in the real world to view digital " +"creations (provided under a Creative Commons license)" +msgstr "O projeto Jandig é uma investigação a respeito da intervenção de marcadores para visualização de obras por meio de realidade aumentada sobre o espaço urbano. Trata-se de um projeto colaborativo de arte digital que propõe a criação de Zonas Autônomas Temporárias (TAZes) em cada espaço em que é instalado. Essas TAZes são formadas através de marcadores espalhados por um espaço por artistas e pelo público – que assim torna-se co-criador daquela experiência. Os usuários interagem com marcadores, utilizando dispositivos móveis para abrir janelas no mundo real para visualizar criações digitais (cedidas através de licença Creative Commons)." + +#: src/core/jinja2/core/community.jinja2:18 +msgid "Our Goals" +msgstr "Nossos objetivos" + +#: src/core/jinja2/core/community.jinja2:20 +msgid "" +"The Jandig platform makes it possible to hold exhibitions using augmented " +"reality." +msgstr "A plataforma Jandig viabiliza a realização de exposições com o uso de realidade aumentada." + +#: src/core/jinja2/core/community.jinja2:22 +msgid "" +"Each exhibition is made from the arrangement of different markers, which use " +"stickers, stencil images, stamps, or others as support, in different sizes. " +"These supports are also given to the public who circulate through the space, " +"so that they can make local interference and make it possible to “go viral” " +"with the markers while the exhibition is available, leaving traces and " +"providing interactions between participants/visitors." +msgstr "Cada exposição é feita a partir da disposição de diversos marcadores, que utilizam como suporte adesivos, imagens de stencil, de carimbos, ou outras, em diferentes tamanhos. Esses suportes são também entregues ao público que circulam pelo espaço, de modo que possam fazer interferências locais e que seja possível “viralizar” os marcadores enquanto a exposição estiver disponível, deixando rastros e proporcionando interações entre os participantes/visitantes." + +#: src/core/jinja2/core/community.jinja2:24 +msgid "" +"To see through the “windows” and see what the fabulous images reveal, the " +"public must point their devices at the markers, so that the Jandig platform " +"viewer can read them and show the content in augmented reality." +msgstr "Para enxergar através das “janelas” e ver as imagens fabulosas o que elas revelam, o público deverá apontar seus dispositivos para os marcadores, para que o visualizador da plataforma Jandig ufaça a leitura dos mesmos e mostre o conteúdo em realidade aumentada." + +#: src/core/jinja2/core/community.jinja2:26 +msgid "" +"The edges are the graphic elements that trigger the recognition of the " +"object associated with each marker. For this reason, you should not cover " +"them and they should always be seen completely by the camera. Placing your " +"finger on one of the edges or bringing the camera too close to the marker " +"makes recognition impossible, for example. This characteristic must always " +"be taken into consideration when producing and applying markers." +msgstr "As bordas são os elementos gráficos que engatilham o reconhecimento do objeto associado a cada marcador. Por esse motivo, não se deve cobri-las e elas devem sempre ser vistas completamente pela câmera. Colocar o dedo sobre uma das bordas ou aproximar demais a câmera do marcador inviabiliza o reconhecimento, por exemplo. Essa característica deve sempre ser levada em consideração na produção e aplicação dos marcadores." + #: src/core/jinja2/core/exhibit_detail.jinja2:9 #: src/users/jinja2/users/components/item-list.jinja2:75 #: src/users/jinja2/users/components/moderator-item-list.jinja2:31 @@ -220,13 +303,10 @@ msgstr "Escolha a Exposição que está vendo" #: src/core/jinja2/core/exhibit_select.jinja2:28 #: src/users/jinja2/users/edit-marker.jinja2:26 #: src/users/jinja2/users/edit-object.jinja2:63 -#: src/users/jinja2/users/login.jinja2:40 +#: src/users/jinja2/users/login.jinja2:46 #: src/users/jinja2/users/password-change.jinja2:26 -#: src/users/jinja2/users/profile-edit.jinja2:31 -#: src/users/jinja2/users/recover-edit-password.jinja2:26 -#: src/users/jinja2/users/recover-password-code.jinja2:26 -#: src/users/jinja2/users/recover-password.jinja2:26 -#: src/users/jinja2/users/signup.jinja2:32 +#: src/users/jinja2/users/profile-edit.jinja2:36 +#: src/users/jinja2/users/signup.jinja2:47 #: src/users/jinja2/users/upload-marker.jinja2:52 #: src/users/jinja2/users/upload-object.jinja2:88 #: src/users/jinja2/users/upload.jinja2:107 @@ -268,12 +348,12 @@ msgid "Welcome, " msgstr "Olá, " #: src/core/jinja2/core/header.jinja2:26 src/users/jinja2/users/login.jinja2:21 -#: src/users/jinja2/users/signup.jinja2:14 +#: src/users/jinja2/users/signup.jinja2:29 msgid "Sign up" msgstr "Cadastro" #: src/core/jinja2/core/header.jinja2:29 -#: src/users/jinja2/users/signup.jinja2:15 +#: src/users/jinja2/users/signup.jinja2:30 msgid "Log in" msgstr "Entrar" @@ -488,25 +568,16 @@ msgstr "Editar Exposição Jandig" msgid "Edit Exhibit" msgstr "Editar Exposição" -#: src/users/jinja2/users/invalid-recovering-email.jinja2:14 -msgid "There is no user with this e-mail/username." -msgstr "Não há usuário com esse e-mail/nome." - -#: src/users/jinja2/users/invalid-recovering-email.jinja2:18 -#: src/users/jinja2/users/wrong-verification-code.jinja2:18 -msgid "Click here to return" -msgstr "Clique aqui para voltar" - #: src/users/jinja2/users/login.jinja2:20 msgid "Login to continue" msgstr "Faça login para continuar" -#: src/users/jinja2/users/login.jinja2:36 -#: src/users/jinja2/users/signup.jinja2:29 +#: src/users/jinja2/users/login.jinja2:42 +#: src/users/jinja2/users/signup.jinja2:44 msgid "Remember me" msgstr "Lembre-se de mim" -#: src/users/jinja2/users/login.jinja2:43 +#: src/users/jinja2/users/login.jinja2:49 msgid "Recover password" msgstr "Recuperar senha" @@ -537,22 +608,22 @@ msgstr "Digite sua nova senha." #: src/users/jinja2/users/permission-denied.jinja2:4 msgid "" "You dont have permission to be here, please click on the button to go back." -msgstr "" +msgstr "Você não tem permissões para estar aqui, por favor clique no botão para voltar." #: src/users/jinja2/users/permission-denied.jinja2:5 msgid "Take me back to where I belong!" -msgstr "" +msgstr "Me leve de volta!" -#: src/users/jinja2/users/components/userbox.jinja2:23 -#: src/users/jinja2/users/profile-edit.jinja2:7 +#: src/users/jinja2/users/components/userbox.jinja2:27 +#: src/users/jinja2/users/profile-edit.jinja2:11 msgid "Log out" msgstr "Sair" -#: src/users/jinja2/users/profile-edit.jinja2:8 +#: src/users/jinja2/users/profile-edit.jinja2:13 msgid "Remove account" msgstr "Remover conta" -#: src/users/jinja2/users/profile-edit.jinja2:19 +#: src/users/jinja2/users/profile-edit.jinja2:24 msgid "Change Password" msgstr "Trocar Senha" @@ -605,18 +676,6 @@ msgstr "Objetos" msgid "You have no Objects. :c" msgstr "Você não tem Objetos. :c" -#: src/users/jinja2/users/recover-edit-password.jinja2:14 -msgid "Choose a new password and repeat it." -msgstr "Escolha uma nova senha e repita." - -#: src/users/jinja2/users/recover-password-code.jinja2:14 -msgid "Insert the code you have received on e-mail." -msgstr "Digite o código que você recebeu em seu e-mail." - -#: src/users/jinja2/users/recover-password.jinja2:14 -msgid "Type your username or e-mail" -msgstr "Digite seu nome de usuário ou email" - #: src/users/jinja2/users/components/createbox.jinja2:5 #: src/users/jinja2/users/upload-marker.jinja2:11 #: src/users/jinja2/users/upload.jinja2:10 @@ -676,10 +735,6 @@ msgstr "Sou autor/a desse Objeto" msgid "Choose .patt file" msgstr "Selecione um arquivo .patt" -#: src/users/jinja2/users/wrong-verification-code.jinja2:14 -msgid "Your verification code is invalid." -msgstr "Seu código de verificação é inválido." - #: src/users/jinja2/users/components/createbox.jinja2:2 msgid "Come on! Create new content now!" msgstr "Vem cá! Crie conteúdo agora!" @@ -715,14 +770,14 @@ msgstr " e em " #: src/users/jinja2/users/components/elements-modal.jinja2:36 #: src/users/jinja2/users/components/elements-modal.jinja2:52 -#: src/users/jinja2/users/components/userbox.jinja2:49 +#: src/users/jinja2/users/components/userbox.jinja2:54 msgid " Exhibits" msgstr " Exposições" #: src/users/jinja2/users/components/elements-modal.jinja2:88 #: src/users/jinja2/users/components/elements-modal.jinja2:92 msgid "This is a Jandig " -msgstr "Isso é um " +msgstr "Isso é um Jandig " #: src/users/jinja2/users/components/elements-modal.jinja2:100 msgid "Share this " @@ -779,31 +834,52 @@ msgstr " Objeto(s)" msgid "Edit profile" msgstr "Editar perfil" -#: src/users/jinja2/users/components/userbox.jinja2:28 +#: src/users/jinja2/users/components/userbox.jinja2:33 msgid "Jandig Artist" msgstr "Artista Jandig" -#: src/users/jinja2/users/components/userbox.jinja2:31 +#: src/users/jinja2/users/components/userbox.jinja2:36 msgid " Artworks" msgstr " Obras" -#: src/users/jinja2/users/components/userbox.jinja2:35 +#: src/users/jinja2/users/components/userbox.jinja2:40 msgid "No Artworks yet." msgstr "Sem Obras." -#: src/users/jinja2/users/components/userbox.jinja2:39 -#: src/users/jinja2/users/components/userbox.jinja2:57 +#: src/users/jinja2/users/components/userbox.jinja2:44 +#: src/users/jinja2/users/components/userbox.jinja2:62 msgid "Create your first!" msgstr "Crie sua primeira!" -#: src/users/jinja2/users/components/userbox.jinja2:46 +#: src/users/jinja2/users/components/userbox.jinja2:51 msgid "Jandig Curator" msgstr "Curador Jandig" -#: src/users/jinja2/users/components/userbox.jinja2:53 +#: src/users/jinja2/users/components/userbox.jinja2:58 msgid "No Exhibitions yet." msgstr "Sem Exposições." +#~ msgid "Categories:" +#~ msgstr "Categorias" + +#~ msgid "There is no user with this e-mail/username." +#~ msgstr "Não há usuário com esse e-mail/nome." + +#~ msgid "Click here to return" +#~ msgstr "Clique aqui para voltar" + +#~ msgid "Choose a new password and repeat it." +#~ msgstr "Escolha uma nova senha e repita." + +#~ msgid "Insert the code you have received on e-mail." +#~ msgstr "Digite o código que você recebeu em seu e-mail." + +#~ msgid "Type your username or e-mail" +#~ msgstr "Digite seu nome de usuário ou email" + +#~ msgid "Your verification code is invalid." +#~ msgstr "Seu código de verificação é inválido." + #~ msgid "Exhibit URL" #~ msgstr "URL da exposição" diff --git a/src/core/jinja2/core/community.jinja2 b/src/core/jinja2/core/community.jinja2 index 2a987e54..cd3ab6f1 100644 --- a/src/core/jinja2/core/community.jinja2 +++ b/src/core/jinja2/core/community.jinja2 @@ -4,27 +4,27 @@

Jandig

-
Uma experimentação de arte para exibições digitais em espaços físicos.
+
{{ _("An art experiment for digital exhibitions in physical spaces.") }}
-

Celulares e tablets são usados para ler marcadores e assim abrir “janelas” onde se encontram outros objetos de arte. O público é convidado a transcender o espaço de exposição, levando adesivos com marcadores para serem colados em outros locais, criando Zonas Autônomas Temporárias (TAZes). O público se torna co-autor, e os marcadores e obras digitais são reconfigurados pelos espaços.

+

{{ _("Cell phones and tablets are used to read markers and thus open “windows” where other art objects can be found. The public is invited to transcend the exhibition space, taking stickers with markers to be used in other locations, creating Temporary Autonomous Zones (TAZes). The public becomes co-authors, and markers and digital works are reconfigured across spaces.") }}

-

Entenda

+

{{ _("Know More") }}

-

O projeto Jandig é uma investigação a respeito da intervenção de marcadores para visualização de obras por meio de realidade aumentada sobre o espaço urbano. Trata-se de um projeto colaborativo de arte digital que propõe a criação de Zonas Autônomas Temporárias (TAZes) em cada espaço em que é instalado. Essas TAZes são formadas através de marcadores espalhados por um espaço por artistas e pelo público – que assim torna-se co-criador daquela experiência. Os usuários interagem com marcadores, utilizando dispositivos móveis para abrir janelas no mundo real para visualizar criações digitais (cedidas através de licença Creative Commons).

+

{{ _("The Jandig project is an investigation into the intervention of markers to visualize works through augmented reality in urban space. This is a collaborative digital art project that proposes the creation of Temporary Autonomous Zones (TAZes) in each space in which it is installed. These TAZes are formed through markers spread across a space by artists and the public – who thus become co-creators of that experience. Users interact with markers, using mobile devices to open windows in the real world to view digital creations (provided under a Creative Commons license)") }}

-

Nossos objetivos

+

{{ _("Our Goals") }}

-

A plataforma Jandig viabiliza a realização de exposições com o uso de realidade aumentada.

+

{{ _("The Jandig platform makes it possible to hold exhibitions using augmented reality.") }}

-

Cada exposição é feita a partir da disposição de diversos marcadores, que utilizam como suporte adesivos, imagens de stencil, de carimbos, ou outras, em diferentes tamanhos. Esses suportes são também entregues ao público que circulam pelo espaço, de modo que possam fazer interferências locais e que seja possível “viralizar” os marcadores enquanto a exposição estiver disponível, deixando rastros e proporcionando interações entre os participantes/visitantes.

+

{{ _("Each exhibition is made from the arrangement of different markers, which use stickers, stencil images, stamps, or others as support, in different sizes. These supports are also given to the public who circulate through the space, so that they can make local interference and make it possible to “go viral” with the markers while the exhibition is available, leaving traces and providing interactions between participants/visitors.") }}

-

Para enxergar através das “janelas” e ver as imagens fabulosas o que elas revelam, o público deverá apontar seus dispositivos para os marcadores, para que o visualizador da plataforma Jandig ufaça a leitura dos mesmos e mostre o conteúdo em realidade aumentada.

+

{{ _("To see through the “windows” and see what the fabulous images reveal, the public must point their devices at the markers, so that the Jandig platform viewer can read them and show the content in augmented reality.") }}

-

As bordas são os elementos gráficos que engatilham o reconhecimento do objeto associado a cada marcador. Por esse motivo, não se deve cobri-las e elas devem sempre ser vistas completamente pela câmera. Colocar o dedo sobre uma das bordas ou aproximar demais a câmera do marcador inviabiliza o reconhecimento, por exemplo. Essa característica deve sempre ser levada em consideração na produção e aplicação dos marcadores.

+

{{ _("The edges are the graphic elements that trigger the recognition of the object associated with each marker. For this reason, you should not cover them and they should always be seen completely by the camera. Placing your finger on one of the edges or bringing the camera too close to the marker makes recognition impossible, for example. This characteristic must always be taken into consideration when producing and applying markers.") }}

-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/tasks.py b/tasks.py index 0d82b838..84e85342 100644 --- a/tasks.py +++ b/tasks.py @@ -3,7 +3,6 @@ from invoke import task -python = sys.executable directory = os.path.dirname(__file__) sys.path.append("jandig") @@ -14,7 +13,7 @@ def robust_manage(ctx, cmd, env=None, **kwargs): kwargs = {k.replace("_", "-"): v for k, v in kwargs.items() if v is not False} opts = " ".join(f'--{k} {"" if v is True else v}' for k, v in kwargs.items()) - cmd = f"{python} ./src/manage.py {cmd} {opts}" + cmd = f"python3 ./src/manage.py {cmd} {opts}" env = {**os.environ, **(env or {})} path = env.get("PYTHONPATH", ":".join(sys.path)) env.setdefault("PYTHONPATH", f"src:{path}") @@ -26,20 +25,6 @@ def manage(ctx, cmd): cmd = f"python3 ./src/manage.py {cmd}" ctx.run(cmd, pty=True, env=os.environ) - -@task -def run(ctx, ssl=False, gunicorn=False): - """ - Run development server - """ - if gunicorn: - ctx.run( - "cd src && gunicorn --reload --worker-connections=10000 --workers=4 --log-level debug --bind 0.0.0.0:8000 config.wsgi" - ) - else: - manage(ctx, "runserver 0.0.0.0:8000") - - # # Translations # From e0167ec69f5c81afef7607d6de569b839dce63f3 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sun, 8 Dec 2024 18:11:36 +0000 Subject: [PATCH 60/79] Update all core serializers with fields needed for details modal --- src/core/serializers.py | 94 ++++++++++++++++++++++++++++++++ src/core/serializers/__init__.py | 0 src/core/serializers/artworks.py | 21 ------- src/core/serializers/exhibits.py | 13 ----- src/core/serializers/markers.py | 13 ----- src/core/serializers/objects.py | 23 -------- 6 files changed, 94 insertions(+), 70 deletions(-) create mode 100644 src/core/serializers.py delete mode 100644 src/core/serializers/__init__.py delete mode 100644 src/core/serializers/artworks.py delete mode 100644 src/core/serializers/exhibits.py delete mode 100644 src/core/serializers/markers.py delete mode 100644 src/core/serializers/objects.py diff --git a/src/core/serializers.py b/src/core/serializers.py new file mode 100644 index 00000000..b452dd83 --- /dev/null +++ b/src/core/serializers.py @@ -0,0 +1,94 @@ +from rest_framework.serializers import ModelSerializer, SerializerMethodField + +from core.models import Artwork, Exhibit, Marker, Object +from users.serializers import ProfileSerializer + + +class MarkerSerializer(ModelSerializer): + owner = ProfileSerializer(read_only=True) + + source_size = SerializerMethodField() + + class Meta: + model = Marker + fields = ( + "id", + "owner", + "source", + "uploaded_at", + "author", + "title", + "patt", + "source_size", + "artworks_count", + "exhibits_count", + ) + read_only_fields = ( + "id", + "uploaded_at", + ) + + def get_source_size(self, obj): + return obj.source.size + + +class ObjectSerializer(ModelSerializer): + owner = ProfileSerializer(read_only=True) + source_size = SerializerMethodField() + + class Meta: + model = Object + fields = ( + "id", + "owner", + "source", + "source_size", + "uploaded_at", + "author", + "title", + "scale", + "position", + "rotation", + "artworks_count", + "exhibits_count", + ) + read_only_fields = ( + "id", + "uploaded_at", + ) + + def get_source_size(self, obj): + return obj.source.size + + +class ArtworkSerializer(ModelSerializer): + marker = MarkerSerializer(read_only=True) + augmented = ObjectSerializer(read_only=True) + author = ProfileSerializer(read_only=True) + + class Meta: + model = Artwork + fields = ( + "id", + "author", + "marker", + "augmented", + "title", + "description", + "created_at", + "exhibits_count", + ) + read_only_fields = ( + "id", + "uploaded_at", + ) + + +class ExhibitSerializer(ModelSerializer): + class Meta: + model = Exhibit + fields = ("id", "owner", "name", "slug", "artworks", "creation_date") + read_only_fields = ( + "id", + "creation_date", + ) diff --git a/src/core/serializers/__init__.py b/src/core/serializers/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/core/serializers/artworks.py b/src/core/serializers/artworks.py deleted file mode 100644 index 04751a7d..00000000 --- a/src/core/serializers/artworks.py +++ /dev/null @@ -1,21 +0,0 @@ -from rest_framework.serializers import ModelSerializer - -from core.models import Artwork - - -class ArtworkSerializer(ModelSerializer): - class Meta: - model = Artwork - fields = ( - "id", - "author", - "marker", - "augmented", - "title", - "description", - "created_at", - ) - read_only_fields = ( - "id", - "uploaded_at", - ) diff --git a/src/core/serializers/exhibits.py b/src/core/serializers/exhibits.py deleted file mode 100644 index 502e7272..00000000 --- a/src/core/serializers/exhibits.py +++ /dev/null @@ -1,13 +0,0 @@ -from rest_framework.serializers import ModelSerializer - -from core.models import Exhibit - - -class ExhibitSerializer(ModelSerializer): - class Meta: - model = Exhibit - fields = ("id", "owner", "name", "slug", "artworks", "creation_date") - read_only_fields = ( - "id", - "creation_date", - ) diff --git a/src/core/serializers/markers.py b/src/core/serializers/markers.py deleted file mode 100644 index 9b0ac3ae..00000000 --- a/src/core/serializers/markers.py +++ /dev/null @@ -1,13 +0,0 @@ -from rest_framework.serializers import ModelSerializer - -from core.models import Marker - - -class MarkerSerializer(ModelSerializer): - class Meta: - model = Marker - fields = ("id", "owner", "source", "uploaded_at", "author", "title", "patt") - read_only_fields = ( - "id", - "uploaded_at", - ) diff --git a/src/core/serializers/objects.py b/src/core/serializers/objects.py deleted file mode 100644 index 38f7edd4..00000000 --- a/src/core/serializers/objects.py +++ /dev/null @@ -1,23 +0,0 @@ -from rest_framework.serializers import ModelSerializer - -from core.models import Object - - -class ObjectSerializer(ModelSerializer): - class Meta: - model = Object - fields = ( - "id", - "owner", - "source", - "uploaded_at", - "author", - "title", - "scale", - "position", - "rotation", - ) - read_only_fields = ( - "id", - "uploaded_at", - ) From 03a4f6ac71c95c9b20691ac3dc8bec544f4b1f96 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sun, 8 Dec 2024 18:13:51 +0000 Subject: [PATCH 61/79] Join viewsets in a single file --- src/core/urls.py | 10 ++++++---- src/core/views/artworks.py | 10 ---------- src/core/views/exhibits.py | 10 ---------- src/core/views/markers.py | 10 ---------- src/core/views/objects.py | 10 ---------- src/core/views/views.py | 1 - src/core/views/viewsets.py | 34 ++++++++++++++++++++++++++++++++++ src/users/forms.py | 4 +++- 8 files changed, 43 insertions(+), 46 deletions(-) delete mode 100644 src/core/views/artworks.py delete mode 100644 src/core/views/exhibits.py delete mode 100644 src/core/views/markers.py delete mode 100644 src/core/views/objects.py create mode 100644 src/core/views/viewsets.py diff --git a/src/core/urls.py b/src/core/urls.py index 766a916e..054c854b 100644 --- a/src/core/urls.py +++ b/src/core/urls.py @@ -2,10 +2,6 @@ from django.urls import include, path, re_path from rest_framework_nested.routers import DefaultRouter -from core.views.artworks import ArtworkViewset -from core.views.exhibits import ExhibitViewset -from core.views.markers import MarkerViewset -from core.views.objects import ObjectViewset from core.views.static_views import ( community, documentation, @@ -26,6 +22,12 @@ service_worker, upload_image, ) +from core.views.viewsets import ( + ArtworkViewset, + ExhibitViewset, + MarkerViewset, + ObjectViewset, +) api_router = DefaultRouter() api_router.register("markers", MarkerViewset, basename="marker") diff --git a/src/core/views/artworks.py b/src/core/views/artworks.py deleted file mode 100644 index eaaea233..00000000 --- a/src/core/views/artworks.py +++ /dev/null @@ -1,10 +0,0 @@ -from rest_framework.mixins import ListModelMixin, RetrieveModelMixin -from rest_framework.viewsets import GenericViewSet - -from core.models import Artwork -from core.serializers.artworks import ArtworkSerializer - - -class ArtworkViewset(ListModelMixin, RetrieveModelMixin, GenericViewSet): - serializer_class = ArtworkSerializer - queryset = Artwork.objects.all().order_by("id") diff --git a/src/core/views/exhibits.py b/src/core/views/exhibits.py deleted file mode 100644 index e3a2fe46..00000000 --- a/src/core/views/exhibits.py +++ /dev/null @@ -1,10 +0,0 @@ -from rest_framework.mixins import ListModelMixin, RetrieveModelMixin -from rest_framework.viewsets import GenericViewSet - -from core.models import Exhibit -from core.serializers.exhibits import ExhibitSerializer - - -class ExhibitViewset(ListModelMixin, RetrieveModelMixin, GenericViewSet): - serializer_class = ExhibitSerializer - queryset = Exhibit.objects.all().order_by("id") diff --git a/src/core/views/markers.py b/src/core/views/markers.py deleted file mode 100644 index bd185f5a..00000000 --- a/src/core/views/markers.py +++ /dev/null @@ -1,10 +0,0 @@ -from rest_framework.mixins import ListModelMixin, RetrieveModelMixin -from rest_framework.viewsets import GenericViewSet - -from core.models import Marker -from core.serializers.markers import MarkerSerializer - - -class MarkerViewset(ListModelMixin, RetrieveModelMixin, GenericViewSet): - serializer_class = MarkerSerializer - queryset = Marker.objects.all().order_by("id") diff --git a/src/core/views/objects.py b/src/core/views/objects.py deleted file mode 100644 index e7a01f61..00000000 --- a/src/core/views/objects.py +++ /dev/null @@ -1,10 +0,0 @@ -from rest_framework.mixins import ListModelMixin, RetrieveModelMixin -from rest_framework.viewsets import GenericViewSet - -from core.models import Object -from core.serializers.objects import ObjectSerializer - - -class ObjectViewset(ListModelMixin, RetrieveModelMixin, GenericViewSet): - serializer_class = ObjectSerializer - queryset = Object.objects.all().order_by("id") diff --git a/src/core/views/views.py b/src/core/views/views.py index 22e33593..960608c7 100644 --- a/src/core/views/views.py +++ b/src/core/views/views.py @@ -84,7 +84,6 @@ def see_all(request, which="", page=1): request_type: paginated_data, "seeall": True, } - return render(request, "core/collection.jinja2", ctx) diff --git a/src/core/views/viewsets.py b/src/core/views/viewsets.py new file mode 100644 index 00000000..4370f630 --- /dev/null +++ b/src/core/views/viewsets.py @@ -0,0 +1,34 @@ +from rest_framework.mixins import ListModelMixin, RetrieveModelMixin +from rest_framework.viewsets import GenericViewSet + +from core.models import Artwork, Exhibit, Marker, Object +from core.serializers import ( + ArtworkSerializer, + ExhibitSerializer, + MarkerSerializer, + ObjectSerializer, +) + + +class ArtworkViewset(ListModelMixin, RetrieveModelMixin, GenericViewSet): + serializer_class = ArtworkSerializer + queryset = ( + Artwork.objects.all() + .select_related("marker", "augmented", "author") + .order_by("id") + ) + + +class ExhibitViewset(ListModelMixin, RetrieveModelMixin, GenericViewSet): + serializer_class = ExhibitSerializer + queryset = Exhibit.objects.all().order_by("id") + + +class MarkerViewset(ListModelMixin, RetrieveModelMixin, GenericViewSet): + serializer_class = MarkerSerializer + queryset = Marker.objects.all().order_by("id") + + +class ObjectViewset(ListModelMixin, RetrieveModelMixin, GenericViewSet): + serializer_class = ObjectSerializer + queryset = Object.objects.all().order_by("id") diff --git a/src/users/forms.py b/src/users/forms.py index ad9d083f..9c95695a 100644 --- a/src/users/forms.py +++ b/src/users/forms.py @@ -161,7 +161,9 @@ def clean(self): password = self.cleaned_data.get("password") - logged_user = authenticate(self.request, username=user.username, password=password) + logged_user = authenticate( + self.request, username=user.username, password=password + ) if logged_user is None: raise forms.ValidationError(_("Wrong password!")) From 0b8b74a778e65d39e67eee9c1c09e31efa998bbe Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sun, 8 Dec 2024 18:14:08 +0000 Subject: [PATCH 62/79] Create profile serializer --- src/users/serializers.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/users/serializers.py diff --git a/src/users/serializers.py b/src/users/serializers.py new file mode 100644 index 00000000..b2f8a82f --- /dev/null +++ b/src/users/serializers.py @@ -0,0 +1,21 @@ +from rest_framework.serializers import ModelSerializer, SerializerMethodField + +from users.models import Profile + + +class ProfileSerializer(ModelSerializer): + username = SerializerMethodField() + + class Meta: + model = Profile + fields = ( + "id", + "username", + ) + read_only_fields = ( + "id", + "uploaded_at", + ) + + def get_username(self, obj): + return obj.user.username From 9a497b046fd1333f5c6412fb2cd1913bace60cad Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sun, 8 Dec 2024 18:16:19 +0000 Subject: [PATCH 63/79] Remove old element/get endpoint --- src/users/services/__init__.py | 2 +- src/users/urls.py | 2 -- src/users/views.py | 48 ---------------------------------- 3 files changed, 1 insertion(+), 51 deletions(-) diff --git a/src/users/services/__init__.py b/src/users/services/__init__.py index 744f9d1c..22146443 100644 --- a/src/users/services/__init__.py +++ b/src/users/services/__init__.py @@ -1 +1 @@ -from .recaptcha_service import * # noqa +from .recaptcha_service import * # noqa diff --git a/src/users/urls.py b/src/users/urls.py index 4315f6bc..e1f7b3ba 100644 --- a/src/users/urls.py +++ b/src/users/urls.py @@ -14,7 +14,6 @@ edit_object, edit_password, edit_profile, - element_get, marker_upload, mod, mod_delete, @@ -56,7 +55,6 @@ path("profile/edit-password/", edit_password, name="edit-password"), path("markers/upload/", marker_upload, name="marker-upload"), path("objects/upload/", object_upload, name="object-upload"), - path("element/get/", element_get, name="element-get"), path("objects/edit/", edit_object, name="edit-object"), path("markers/edit/", edit_marker, name="edit-marker"), path("artworks/create/", create_artwork, name="create-artwork"), diff --git a/src/users/views.py b/src/users/views.py index 3b7609fb..4b31a674 100644 --- a/src/users/views.py +++ b/src/users/views.py @@ -270,53 +270,6 @@ def download_exhibit(request): return JsonResponse(all_data) -@cache_page(60 * 2) -@require_http_methods(["GET"]) -def element_get(request): - if request.GET.get("marker_id", None): - element_type = "marker" - element = get_object_or_404(Marker, pk=request.GET["marker_id"]) - elif request.GET.get("object_id", None): - element_type = "object" - element = get_object_or_404(Object, pk=request.GET["object_id"]) - elif request.GET.get("artwork_id", None): - element_type = "artwork" - element = get_object_or_404(Artwork, pk=request.GET["artwork_id"]) - - if element_type == "artwork": - data = { - "id_marker": element.marker.id, - "id_object": element.augmented.id, - "type": element_type, - "author": element.author.user.username, - "owner_id": element.author.user.id, - "exhibits": element.exhibits_count, - "created_at": element.created_at.strftime("%d %b, %Y"), - "marker": element.marker.source.url, - "augmented": element.augmented.source.url, - "augmented_size": element.augmented.source.size, - "title": element.title, - "description": element.description, - } - else: - data = { - "id": element.id, - "type": element_type, - "author": element.author, - "owner": element.owner.user.username, - "owner_id": element.owner_id, - "artworks": element.artworks_count, - "exhibits": element.exhibits_count, - "source": element.source.url, - "size": element.source.size, - "uploaded_at": element.uploaded_at.strftime("%d %b, %Y"), - } - - serialized = json.dumps(data) - - return JsonResponse(serialized) - - def upload_elements(request, form_class, form_type, route): if request.method == "POST": form = form_class(request.POST, request.FILES) @@ -644,7 +597,6 @@ def related_content(request): exhibits = element.exhibits_list ctx = {"exhibits": exhibits, "seeall:": False} - return render(request, "core/collection.jinja2", ctx) From a29a4f291c48b4e68971ad74079512d0d61e7386 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sun, 8 Dec 2024 18:16:46 +0000 Subject: [PATCH 64/79] Get the correct API endpoint for each element type --- .../jinja2/users/components/elements-modal.jinja2 | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/users/jinja2/users/components/elements-modal.jinja2 b/src/users/jinja2/users/components/elements-modal.jinja2 index d06d1d9e..c78ef5f8 100644 --- a/src/users/jinja2/users/components/elements-modal.jinja2 +++ b/src/users/jinja2/users/components/elements-modal.jinja2 @@ -92,7 +92,19 @@ $('#modal-title').text({{ _("This is a Jandig ")|tojson }} + elemType); } - let elemUrl = {{url('marker-list')|tojson}}; + // Select the API endpoint based on the element type /api/v1/<>/id/ + let elemUrl; + if (elemType == "marker") { + elemUrl = {{ url('marker-list')|tojson }}; + } else if (elemType == "object") { + elemUrl = {{ url('object-list')|tojson }}; + } else if (elemType == "artwork") { + elemUrl = {{ url('artwork-list')|tojson }}; + } else if (elemType == "exhibit") { + elemUrl = {{ url('exhibit-list')|tojson }}; + } else { + console.log("Element type not recognized"); + } elemUrl += element.attr('id'); if(elemType != "artwork"){ From 3fa262ddb20379c38bc17643aa0bfa4ca13b42a0 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sun, 8 Dec 2024 18:17:25 +0000 Subject: [PATCH 65/79] Update date format on details modal --- src/users/jinja2/users/components/elements-modal.jinja2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/users/jinja2/users/components/elements-modal.jinja2 b/src/users/jinja2/users/components/elements-modal.jinja2 index c78ef5f8..5a421bc6 100644 --- a/src/users/jinja2/users/components/elements-modal.jinja2 +++ b/src/users/jinja2/users/components/elements-modal.jinja2 @@ -23,7 +23,7 @@ '

' + {{ _("Uploaded by ")|tojson }} + owner + ', ' + - {{ _("in ")|tojson }} + date + '

' + {{ _("in ")|tojson }} + new Date(date).toLocaleDateString() + '

' ) } function usedIn(artworks_count, exhibits_count, element_src, element_id, elemType){ From 8d939e199ef3f505c6522b4944df64d72ec2d538 Mon Sep 17 00:00:00 2001 From: Pablo Silva Date: Sun, 8 Dec 2024 18:18:16 +0000 Subject: [PATCH 66/79] Remove link to author from details modal --- src/users/jinja2/users/components/elements-modal.jinja2 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/users/jinja2/users/components/elements-modal.jinja2 b/src/users/jinja2/users/components/elements-modal.jinja2 index 5a421bc6..ae554b00 100644 --- a/src/users/jinja2/users/components/elements-modal.jinja2 +++ b/src/users/jinja2/users/components/elements-modal.jinja2 @@ -7,16 +7,15 @@ {% endblock %} {% block content %} - +

Download file: