From c0019e10d4e585cffc1200aa2749dce62b6947c8 Mon Sep 17 00:00:00 2001 From: Jarek Potiuk Date: Thu, 28 Dec 2023 07:37:20 +0100 Subject: [PATCH] Remove Plexus and sqoop providers (#36460) --- .github/boring-cyborg.yml | 11 - airflow/contrib/hooks/__init__.py | 3 - airflow/contrib/operators/__init__.py | 3 - .../apache/sqoop/.latest-doc-only-change.txt | 1 - airflow/providers/apache/sqoop/CHANGELOG.rst | 300 ------------- airflow/providers/apache/sqoop/__init__.py | 42 -- .../providers/apache/sqoop/hooks/__init__.py | 17 - airflow/providers/apache/sqoop/hooks/sqoop.py | 411 ------------------ .../apache/sqoop/operators/__init__.py | 17 - .../providers/apache/sqoop/operators/sqoop.py | 264 ----------- airflow/providers/apache/sqoop/provider.yaml | 71 --- .../plexus/.latest-doc-only-change.txt | 1 - airflow/providers/plexus/CHANGELOG.rst | 256 ----------- airflow/providers/plexus/__init__.py | 42 -- airflow/providers/plexus/hooks/__init__.py | 16 - airflow/providers/plexus/hooks/plexus.py | 77 ---- .../providers/plexus/operators/__init__.py | 16 - airflow/providers/plexus/operators/job.py | 156 ------- airflow/providers/plexus/provider.yaml | 61 --- airflow/utils/db.py | 8 - dev/breeze/tests/test_packages.py | 6 +- .../changelog.rst | 25 -- .../commits.rst | 343 --------------- .../index.rst | 97 ----- .../installing-providers-from-sources.rst | 18 - .../operators.rst | 38 -- .../security.rst | 18 - .../changelog.rst | 25 -- .../commits.rst | 282 ------------ .../apache-airflow-providers-plexus/index.rst | 105 ----- .../installing-providers-from-sources.rst | 18 - .../security.rst | 18 - docs/integration-logos/apache/sqoop.png | Bin 42874 -> 0 bytes docs/integration-logos/plexus/Plexus.png | Bin 3881 -> 0 bytes images/breeze/output_build-docs.svg | 68 +-- images/breeze/output_build-docs.txt | 2 +- ...release-management_add-back-references.svg | 16 +- ...release-management_add-back-references.txt | 2 +- ...output_release-management_publish-docs.svg | 16 +- ...output_release-management_publish-docs.txt | 2 +- tests/providers/apache/sqoop/__init__.py | 17 - .../providers/apache/sqoop/hooks/__init__.py | 17 - .../apache/sqoop/hooks/test_sqoop.py | 406 ----------------- .../apache/sqoop/operators/__init__.py | 17 - .../apache/sqoop/operators/test_sqoop.py | 189 -------- tests/providers/plexus/__init__.py | 16 - tests/providers/plexus/hooks/__init__.py | 16 - tests/providers/plexus/hooks/test_plexus.py | 66 --- tests/providers/plexus/operators/__init__.py | 16 - tests/providers/plexus/operators/test_job.py | 192 -------- tests/system/providers/plexus/__init__.py | 16 - .../system/providers/plexus/example_plexus.py | 56 --- 52 files changed, 58 insertions(+), 3838 deletions(-) delete mode 100644 airflow/providers/apache/sqoop/.latest-doc-only-change.txt delete mode 100644 airflow/providers/apache/sqoop/CHANGELOG.rst delete mode 100644 airflow/providers/apache/sqoop/__init__.py delete mode 100644 airflow/providers/apache/sqoop/hooks/__init__.py delete mode 100644 airflow/providers/apache/sqoop/hooks/sqoop.py delete mode 100644 airflow/providers/apache/sqoop/operators/__init__.py delete mode 100644 airflow/providers/apache/sqoop/operators/sqoop.py delete mode 100644 airflow/providers/apache/sqoop/provider.yaml delete mode 100644 airflow/providers/plexus/.latest-doc-only-change.txt delete mode 100644 airflow/providers/plexus/CHANGELOG.rst delete mode 100644 airflow/providers/plexus/__init__.py delete mode 100644 airflow/providers/plexus/hooks/__init__.py delete mode 100644 airflow/providers/plexus/hooks/plexus.py delete mode 100644 airflow/providers/plexus/operators/__init__.py delete mode 100644 airflow/providers/plexus/operators/job.py delete mode 100644 airflow/providers/plexus/provider.yaml delete mode 100644 docs/apache-airflow-providers-apache-sqoop/changelog.rst delete mode 100644 docs/apache-airflow-providers-apache-sqoop/commits.rst delete mode 100644 docs/apache-airflow-providers-apache-sqoop/index.rst delete mode 100644 docs/apache-airflow-providers-apache-sqoop/installing-providers-from-sources.rst delete mode 100644 docs/apache-airflow-providers-apache-sqoop/operators.rst delete mode 100644 docs/apache-airflow-providers-apache-sqoop/security.rst delete mode 100644 docs/apache-airflow-providers-plexus/changelog.rst delete mode 100644 docs/apache-airflow-providers-plexus/commits.rst delete mode 100644 docs/apache-airflow-providers-plexus/index.rst delete mode 100644 docs/apache-airflow-providers-plexus/installing-providers-from-sources.rst delete mode 100644 docs/apache-airflow-providers-plexus/security.rst delete mode 100644 docs/integration-logos/apache/sqoop.png delete mode 100644 docs/integration-logos/plexus/Plexus.png delete mode 100644 tests/providers/apache/sqoop/__init__.py delete mode 100644 tests/providers/apache/sqoop/hooks/__init__.py delete mode 100644 tests/providers/apache/sqoop/hooks/test_sqoop.py delete mode 100644 tests/providers/apache/sqoop/operators/__init__.py delete mode 100644 tests/providers/apache/sqoop/operators/test_sqoop.py delete mode 100644 tests/providers/plexus/__init__.py delete mode 100644 tests/providers/plexus/hooks/__init__.py delete mode 100644 tests/providers/plexus/hooks/test_plexus.py delete mode 100644 tests/providers/plexus/operators/__init__.py delete mode 100644 tests/providers/plexus/operators/test_job.py delete mode 100644 tests/system/providers/plexus/__init__.py delete mode 100644 tests/system/providers/plexus/example_plexus.py diff --git a/.github/boring-cyborg.yml b/.github/boring-cyborg.yml index fd98dc5767e09..2ea0914434abf 100644 --- a/.github/boring-cyborg.yml +++ b/.github/boring-cyborg.yml @@ -118,11 +118,6 @@ labelPRBasedOnFilePath: - tests/providers/apache/spark/**/* - tests/system/providers/apache/spark/**/* - provider:apache-sqoop: - - airflow/providers/apache/sqoop/**/* - - docs/apache-airflow-providers-apache-sqoop/**/* - - tests/providers/apache/sqoop/**/* - provider:apprise: - airflow/providers/apprise/**/* - docs/apache-airflow-providers-apprise/**/* @@ -391,12 +386,6 @@ labelPRBasedOnFilePath: - tests/providers/pinecone/**/* - tests/system/providers/pinecone/**/* - provider:plexus: - - airflow/providers/plexus/**/* - - docs/apache-airflow-providers-plexus/**/* - - tests/providers/plexus/**/* - - tests/system/providers/plexus/**/* - provider:postgres: - airflow/providers/postgres/**/* - docs/apache-airflow-providers-postgres/**/* diff --git a/airflow/contrib/hooks/__init__.py b/airflow/contrib/hooks/__init__.py index b2c7612989489..63306a5ec3b42 100644 --- a/airflow/contrib/hooks/__init__.py +++ b/airflow/contrib/hooks/__init__.py @@ -311,9 +311,6 @@ "spark_submit_hook": { "SparkSubmitHook": "airflow.providers.apache.spark.hooks.spark_submit.SparkSubmitHook", }, - "sqoop_hook": { - "SqoopHook": "airflow.providers.apache.sqoop.hooks.sqoop.SqoopHook", - }, "ssh_hook": { "SSHHook": "airflow.providers.ssh.hooks.ssh.SSHHook", }, diff --git a/airflow/contrib/operators/__init__.py b/airflow/contrib/operators/__init__.py index faf1899606a3b..0bfa8e6724614 100644 --- a/airflow/contrib/operators/__init__.py +++ b/airflow/contrib/operators/__init__.py @@ -1099,9 +1099,6 @@ "airflow.providers.google.cloud.transfers.sql_to_gcs.BaseSQLToGCSOperator" ), }, - "sqoop_operator": { - "SqoopOperator": "airflow.providers.apache.sqoop.operators.sqoop.SqoopOperator", - }, "ssh_operator": { "SSHOperator": "airflow.providers.ssh.operators.ssh.SSHOperator", }, diff --git a/airflow/providers/apache/sqoop/.latest-doc-only-change.txt b/airflow/providers/apache/sqoop/.latest-doc-only-change.txt deleted file mode 100644 index 36cd4c153e278..0000000000000 --- a/airflow/providers/apache/sqoop/.latest-doc-only-change.txt +++ /dev/null @@ -1 +0,0 @@ -99534e47f330ce0efb96402629dda5b2a4f16e8f diff --git a/airflow/providers/apache/sqoop/CHANGELOG.rst b/airflow/providers/apache/sqoop/CHANGELOG.rst deleted file mode 100644 index 87dde5c591ffb..0000000000000 --- a/airflow/providers/apache/sqoop/CHANGELOG.rst +++ /dev/null @@ -1,300 +0,0 @@ - .. Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - .. http://www.apache.org/licenses/LICENSE-2.0 - - .. Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - - -.. NOTE TO CONTRIBUTORS: - Please, only add notes to the Changelog just below the "Changelog" header when there are some breaking changes - and you want to add an explanation to the users on how they are supposed to deal with them. - The changelog is updated and maintained semi-automatically by release manager. - - -``apache-airflow-providers-apache-sqoop`` - - -Changelog ---------- - - -4.2.1 -..... - -.. note:: - - Mark apache.sqoop provider as removed according to `consensus on the dev@airflow.apache.org `_ - - -Misc -~~~~ - -* ``Schedule plexus and apache.sqoop providers for removal (#36208)`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - -4.2.0 -..... - -.. note:: - This release of provider is only available for Airflow 2.6+ as explained in the - `Apache Airflow providers support policy `_. - -Misc -~~~~ - -* ``Bump minimum Airflow version in providers to Airflow 2.6.0 (#36017)`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Fix and reapply templates for provider documentation (#35686)`` - * ``Prepare docs 3rd wave of Providers October 2023 - FIX (#35233)`` - * ``Prepare docs 2nd wave of Providers November 2023 (#35836)`` - * ``Use reproducible builds for provider packages (#35693)`` - * ``Prepare docs 1st wave of Providers November 2023 (#35537)`` - * ``Prepare docs 3rd wave of Providers October 2023 (#35187)`` - * ``Pre-upgrade 'ruff==0.0.292' changes in providers (#35053)`` - * ``Upgrade pre-commits (#35033)`` - -4.1.0 -..... - -.. note:: - This release of provider is only available for Airflow 2.5+ as explained in the - `Apache Airflow providers support policy `_. - -Misc -~~~~ - -* ``Bump min airflow version of providers (#34728)`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Prepare docs for 09 2023 - 1st wave of Providers (#34201)`` - * ``Prepare docs for Aug 2023 3rd wave of Providers (#33730)`` - * ``D401 Support - Providers: Airbyte to Atlassian (Inclusive) (#33354)`` - -4.0.0 -..... - -Breaking changes -~~~~~~~~~~~~~~~~ - -The ``extra_import_options`` parameter in the ``import_table`` & ``import_query`` methods -and the ``extra_export_options`` in the ``export_table`` methods of the ``SqoopHook`` -are no longer accepted as arguments for those methods. These should instead be passed -as ``extra_options`` while initializing the Hook or via ``extra_options`` parameter to the -operator which instantiates the hook with those given ``extra_options`` dictionary. - -* ``Validate SqoopHook connection string and disable extra options from public hook methods (#33039)`` - -.. Review and move the new changes to one of the sections above: - * ``Validate connection host field for Sqoop connection (#32968)`` - * ``Prepare docs for July 2023 wave of Providers (RC2) (#32381)`` - * ``Remove spurious headers for provider changelogs (#32373)`` - * ``Prepare docs for July 2023 wave of Providers (#32298)`` - * ``Improve provider documentation and README structure (#32125)`` - -3.2.1 -..... - -.. note:: - This release dropped support for Python 3.7 - - -Misc -~~~~ - -* ``Add note about dropping Python 3.7 for providers (#32015)`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Apache provider docstring improvements (#31730)`` - * ``Add D400 pydocstyle check - Apache providers only (#31424)`` - -3.2.0 -..... - -.. note:: - This release of provider is only available for Airflow 2.4+ as explained in the - `Apache Airflow providers support policy `_. - -Misc -~~~~ - -* ``Bump minimum Airflow version in providers (#30917)`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Add full automation for min Airflow version for providers (#30994)`` - * ``Add mechanism to suspend providers (#30422)`` - * ``Use '__version__' in providers not 'version' (#31393)`` - * ``Fixing circular import error in providers caused by airflow version check (#31379)`` - * ``Prepare docs for May 2023 wave of Providers (#31252)`` - -3.1.1 -..... - -Bug Fixes -~~~~~~~~~ - -* ``Move libjars parameter in Sqoop Hook to Hook parameter (#29500)`` - -3.1.0 -..... - -.. note:: - This release of provider is only available for Airflow 2.3+ as explained in the - `Apache Airflow providers support policy `_. - -Misc -~~~~ - -* ``Move min airflow version to 2.3.0 for all providers (#27196)`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Add documentation for July 2022 Provider's release (#25030)`` - * ``Enable string normalization in python formatting - providers (#27205)`` - * ``Update docs for September Provider's release (#26731)`` - * ``Apply PEP-563 (Postponed Evaluation of Annotations) to non-core airflow (#26289)`` - * ``Prepare docs for new providers release (August 2022) (#25618)`` - * ``Move provider dependencies to inside provider folders (#24672)`` - * ``Remove 'hook-class-names' from provider.yaml (#24702)`` - -3.0.0 -..... - -Breaking changes -~~~~~~~~~~~~~~~~ - -.. note:: - This release of provider is only available for Airflow 2.2+ as explained in the - `Apache Airflow providers support policy `_. - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Add explanatory note for contributors about updating Changelog (#24229)`` - * ``Prepare docs for May 2022 provider's release (#24231)`` - * ``Update package description to remove double min-airflow specification (#24292)`` - -2.1.3 -..... - -Bug Fixes -~~~~~~~~~ - -* ``Fix mistakenly added install_requires for all providers (#22382)`` - -2.1.2 -..... - -Misc -~~~~~ - -* ``Add Trove classifiers in PyPI (Framework :: Apache Airflow :: Provider)`` - -2.1.1 -..... - -Misc -~~~~ - -* ``Support for Python 3.10`` -* ``add how-to guide for sqoop operator (#21424)`` - - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - -2.1.0 -..... - -Features -~~~~~~~~ - -* ``Add more SQL template fields renderers (#21237)`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Fix K8S changelog to be PyPI-compatible (#20614)`` - * ``Fix template_fields type to have MyPy friendly Sequence type (#20571)`` - * ``Fix MyPy errors in Apache Providers (#20422)`` - * ``Fix MyPy Errors for Apache Sqoop provider. (#20304)`` - * ``Remove ':type' lines now sphinx-autoapi supports typehints (#20951)`` - * ``Update documentation for provider December 2021 release (#20523)`` - * ``Add documentation for January 2021 providers release (#21257)`` - -2.0.2 -..... - -Misc -~~~~ - -* ``Optimise connection importing for Airflow 2.2.0`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Update description about the new ''connection-types'' provider meta-data (#17767)`` - * ``Import Hooks lazily individually in providers manager (#17682)`` - -2.0.1 -..... - -Bug Fixes -~~~~~~~~~ - -* ``Fix Minor Bugs in Apache Sqoop Hook and Operator (#16350)`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Removes pylint from our toolchain (#16682)`` - * ``Prepare documentation for July release of providers. (#17015)`` - * ``Fixed wrongly escaped characters in amazon's changelog (#17020)`` - -2.0.0 -..... - -Breaking changes -~~~~~~~~~~~~~~~~ - -* ``Auto-apply apply_default decorator (#15667)`` - -.. warning:: Due to apply_default decorator removal, this version of the provider requires Airflow 2.1.0+. - If your Airflow version is < 2.1.0, and you want to install this provider version, first upgrade - Airflow to at least version 2.1.0. Otherwise your Airflow package version will be upgraded - automatically and you will have to manually run ``airflow upgrade db`` to complete the migration. - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Fixes failing static checks after recent pre-commit upgrade (#16183)`` - * ``Adds interactivity when generating provider documentation. (#15518)`` - * ``Prepares provider release after PIP 21 compatibility (#15576)`` - * ``Make Airflow code Pylint 2.8 compatible (#15534)`` - * ``Remove Backport Providers (#14886)`` - * ``Update documentation for broken package releases (#14734)`` - * ``Updated documentation for June 2021 provider release (#16294)`` - * ``More documentation update for June providers release (#16405)`` - * ``Synchronizes updated changelog after buggfix release (#16464)`` - -1.0.1 -..... - -Updated documentation and readme files. - -1.0.0 -..... - -Initial version of the provider. diff --git a/airflow/providers/apache/sqoop/__init__.py b/airflow/providers/apache/sqoop/__init__.py deleted file mode 100644 index d263980405c34..0000000000000 --- a/airflow/providers/apache/sqoop/__init__.py +++ /dev/null @@ -1,42 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# -# NOTE! THIS FILE IS AUTOMATICALLY GENERATED AND WILL BE -# OVERWRITTEN WHEN PREPARING DOCUMENTATION FOR THE PACKAGES. -# -# IF YOU WANT TO MODIFY THIS FILE, YOU SHOULD MODIFY THE TEMPLATE -# `PROVIDER__INIT__PY_TEMPLATE.py.jinja2` IN the `dev/breeze/src/airflow_breeze/templates` DIRECTORY -# -from __future__ import annotations - -import packaging.version - -__all__ = ["__version__"] - -__version__ = "4.2.0" - -try: - from airflow import __version__ as airflow_version -except ImportError: - from airflow.version import version as airflow_version - -if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse( - "2.6.0" -): - raise RuntimeError( - f"The package `apache-airflow-providers-apache-sqoop:{__version__}` needs Apache Airflow 2.6.0+" - ) diff --git a/airflow/providers/apache/sqoop/hooks/__init__.py b/airflow/providers/apache/sqoop/hooks/__init__.py deleted file mode 100644 index 217e5db960782..0000000000000 --- a/airflow/providers/apache/sqoop/hooks/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. diff --git a/airflow/providers/apache/sqoop/hooks/sqoop.py b/airflow/providers/apache/sqoop/hooks/sqoop.py deleted file mode 100644 index 872c4a0462b70..0000000000000 --- a/airflow/providers/apache/sqoop/hooks/sqoop.py +++ /dev/null @@ -1,411 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -"""This module contains a sqoop 1.x hook.""" -from __future__ import annotations - -import subprocess -from copy import deepcopy -from typing import Any - -from airflow.exceptions import AirflowException -from airflow.hooks.base import BaseHook - - -class SqoopHook(BaseHook): - """Wrapper around the sqoop 1 binary. - - To be able to use the hook, it is required that "sqoop" is in the PATH. - - Additional arguments that can be passed via the 'extra' JSON field of the - sqoop connection: - - * ``job_tracker``: Job tracker local|jobtracker:port. - * ``namenode``: Namenode. - * ``files``: Comma separated files to be copied to the map reduce cluster. - * ``archives``: Comma separated archives to be unarchived on the compute - machines. - * ``password_file``: Path to file containing the password. - - :param conn_id: Reference to the sqoop connection. - :param verbose: Set sqoop to verbose. - :param num_mappers: Number of map tasks to import in parallel. - :param properties: Properties to set via the -D argument - :param libjars: Optional Comma separated jar files to include in the classpath. - :param extra_options: Extra import/export options to pass as dict. - If a key doesn't have a value, just pass an empty string to it. - Don't include prefix of -- for sqoop options. - """ - - conn_name_attr = "conn_id" - default_conn_name = "sqoop_default" - conn_type = "sqoop" - hook_name = "Sqoop" - - def __init__( - self, - conn_id: str = default_conn_name, - verbose: bool = False, - num_mappers: int | None = None, - hcatalog_database: str | None = None, - hcatalog_table: str | None = None, - properties: dict[str, Any] | None = None, - libjars: str | None = None, - extra_options: dict[str, Any] | None = None, - ) -> None: - # No mutable types in the default parameters - super().__init__() - self.conn = self.get_connection(conn_id) - connection_parameters = self.conn.extra_dejson - self.job_tracker = connection_parameters.get("job_tracker", None) - self.namenode = connection_parameters.get("namenode", None) - self.libjars = libjars - self.files = connection_parameters.get("files", None) - self.archives = connection_parameters.get("archives", None) - self.password_file = connection_parameters.get("password_file", None) - self.hcatalog_database = hcatalog_database - self.hcatalog_table = hcatalog_table - self.verbose = verbose - self.num_mappers = num_mappers - self.properties = properties or {} - self.sub_process_pid: int - self._extra_options = extra_options - self.log.info("Using connection to: %s:%s/%s", self.conn.host, self.conn.port, self.conn.schema) - - def get_conn(self) -> Any: - return self.conn - - def cmd_mask_password(self, cmd_orig: list[str]) -> list[str]: - """Mask command password for safety.""" - cmd = deepcopy(cmd_orig) - try: - password_index = cmd.index("--password") - cmd[password_index + 1] = "MASKED" - except ValueError: - self.log.debug("No password in sqoop cmd") - return cmd - - def popen(self, cmd: list[str], **kwargs: Any) -> None: - """Remote Popen. - - :param cmd: command to remotely execute - :param kwargs: extra arguments to Popen (see subprocess.Popen) - :return: handle to subprocess - """ - masked_cmd = " ".join(self.cmd_mask_password(cmd)) - self.log.info("Executing command: %s", masked_cmd) - with subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kwargs) as sub_process: - self.sub_process_pid = sub_process.pid - for line in iter(sub_process.stdout): # type: ignore - self.log.info(line.strip()) - sub_process.wait() - self.log.info("Command exited with return code %s", sub_process.returncode) - if sub_process.returncode: - raise AirflowException(f"Sqoop command failed: {masked_cmd}") - - def _prepare_command(self, export: bool = False) -> list[str]: - sqoop_cmd_type = "export" if export else "import" - connection_cmd = ["sqoop", sqoop_cmd_type] - - for key, value in self.properties.items(): - connection_cmd += ["-D", f"{key}={value}"] - - if self.namenode: - connection_cmd += ["-fs", self.namenode] - if self.job_tracker: - connection_cmd += ["-jt", self.job_tracker] - if self.libjars: - connection_cmd += ["-libjars", self.libjars] - if self.files: - connection_cmd += ["-files", self.files] - if self.archives: - connection_cmd += ["-archives", self.archives] - if self.conn.login: - connection_cmd += ["--username", self.conn.login] - if self.conn.password: - connection_cmd += ["--password", self.conn.password] - if self.password_file: - connection_cmd += ["--password-file", self.password_file] - if self.verbose: - connection_cmd += ["--verbose"] - if self.num_mappers: - connection_cmd += ["--num-mappers", str(self.num_mappers)] - if self.hcatalog_database: - connection_cmd += ["--hcatalog-database", self.hcatalog_database] - if self.hcatalog_table: - connection_cmd += ["--hcatalog-table", self.hcatalog_table] - - connect_str = self.conn.host - if self.conn.port: - connect_str += f":{self.conn.port}" - if self.conn.schema: - self.log.info("CONNECTION TYPE %s", self.conn.conn_type) - if self.conn.conn_type != "mssql": - connect_str += f"/{self.conn.schema}" - else: - connect_str += f";databaseName={self.conn.schema}" - if "?" in connect_str: - raise ValueError("The sqoop connection string should not contain a '?' character") - connection_cmd += ["--connect", connect_str] - - return connection_cmd - - @staticmethod - def _get_export_format_argument(file_type: str = "text") -> list[str]: - if file_type == "avro": - return ["--as-avrodatafile"] - elif file_type == "sequence": - return ["--as-sequencefile"] - elif file_type == "parquet": - return ["--as-parquetfile"] - elif file_type == "text": - return ["--as-textfile"] - else: - raise AirflowException("Argument file_type should be 'avro', 'sequence', 'parquet' or 'text'.") - - def _import_cmd( - self, - target_dir: str | None, - append: bool, - file_type: str, - split_by: str | None, - direct: bool | None, - driver: Any, - ) -> list[str]: - cmd = self._prepare_command(export=False) - - if target_dir: - cmd += ["--target-dir", target_dir] - - if append: - cmd += ["--append"] - - cmd += self._get_export_format_argument(file_type) - - if split_by: - cmd += ["--split-by", split_by] - - if direct: - cmd += ["--direct"] - - if driver: - cmd += ["--driver", driver] - - if self._extra_options: - for key, value in self._extra_options.items(): - cmd += [f"--{key}"] - if value: - cmd += [str(value)] - - return cmd - - def import_table( - self, - table: str, - target_dir: str | None = None, - append: bool = False, - file_type: str = "text", - columns: str | None = None, - split_by: str | None = None, - where: str | None = None, - direct: bool = False, - driver: Any = None, - schema: str | None = None, - ) -> Any: - """Import table from remote location to target dir. - - Arguments are copies of direct sqoop command line arguments. - - :param table: Table to read - :param schema: Schema name - :param target_dir: HDFS destination dir - :param append: Append data to an existing dataset in HDFS - :param file_type: "avro", "sequence", "text" or "parquet". - Imports data to into the specified format. Defaults to text. - :param columns: Columns to import from table - :param split_by: Column of the table used to split work units - :param where: WHERE clause to use during import - :param direct: Use direct connector if exists for the database - :param driver: Manually specify JDBC driver class to use - """ - cmd = self._import_cmd(target_dir, append, file_type, split_by, direct, driver) - - cmd += ["--table", table] - - if columns: - cmd += ["--columns", columns] - if where: - cmd += ["--where", where] - if schema: - cmd += ["--", "--schema", schema] - - self.popen(cmd) - - def import_query( - self, - query: str, - target_dir: str | None = None, - append: bool = False, - file_type: str = "text", - split_by: str | None = None, - direct: bool | None = None, - driver: Any | None = None, - ) -> Any: - """Import a specific query from the rdbms to hdfs. - - :param query: Free format query to run - :param target_dir: HDFS destination dir - :param append: Append data to an existing dataset in HDFS - :param file_type: "avro", "sequence", "text" or "parquet" - Imports data to hdfs into the specified format. Defaults to text. - :param split_by: Column of the table used to split work units - :param direct: Use direct import fast path - :param driver: Manually specify JDBC driver class to use - """ - cmd = self._import_cmd(target_dir, append, file_type, split_by, direct, driver) - cmd += ["--query", query] - - self.popen(cmd) - - def _export_cmd( - self, - table: str, - export_dir: str | None = None, - input_null_string: str | None = None, - input_null_non_string: str | None = None, - staging_table: str | None = None, - clear_staging_table: bool = False, - enclosed_by: str | None = None, - escaped_by: str | None = None, - input_fields_terminated_by: str | None = None, - input_lines_terminated_by: str | None = None, - input_optionally_enclosed_by: str | None = None, - batch: bool = False, - relaxed_isolation: bool = False, - schema: str | None = None, - ) -> list[str]: - cmd = self._prepare_command(export=True) - - if input_null_string: - cmd += ["--input-null-string", input_null_string] - - if input_null_non_string: - cmd += ["--input-null-non-string", input_null_non_string] - - if staging_table: - cmd += ["--staging-table", staging_table] - - if clear_staging_table: - cmd += ["--clear-staging-table"] - - if enclosed_by: - cmd += ["--enclosed-by", enclosed_by] - - if escaped_by: - cmd += ["--escaped-by", escaped_by] - - if input_fields_terminated_by: - cmd += ["--input-fields-terminated-by", input_fields_terminated_by] - - if input_lines_terminated_by: - cmd += ["--input-lines-terminated-by", input_lines_terminated_by] - - if input_optionally_enclosed_by: - cmd += ["--input-optionally-enclosed-by", input_optionally_enclosed_by] - - if batch: - cmd += ["--batch"] - - if relaxed_isolation: - cmd += ["--relaxed-isolation"] - - if export_dir: - cmd += ["--export-dir", export_dir] - - if self._extra_options: - for key, value in self._extra_options.items(): - cmd += [f"--{key}"] - if value: - cmd += [str(value)] - - # The required option - cmd += ["--table", table] - - if schema: - cmd += ["--", "--schema", schema] - - return cmd - - def export_table( - self, - table: str, - export_dir: str | None = None, - input_null_string: str | None = None, - input_null_non_string: str | None = None, - staging_table: str | None = None, - clear_staging_table: bool = False, - enclosed_by: str | None = None, - escaped_by: str | None = None, - input_fields_terminated_by: str | None = None, - input_lines_terminated_by: str | None = None, - input_optionally_enclosed_by: str | None = None, - batch: bool = False, - relaxed_isolation: bool = False, - schema: str | None = None, - ) -> None: - """Export Hive table to remote location. - - Arguments are copies of direct Sqoop command line Arguments - - :param table: Table remote destination - :param schema: Schema name - :param export_dir: Hive table to export - :param input_null_string: The string to be interpreted as null for - string columns - :param input_null_non_string: The string to be interpreted as null - for non-string columns - :param staging_table: The table in which data will be staged before - being inserted into the destination table - :param clear_staging_table: Indicate that any data present in the - staging table can be deleted - :param enclosed_by: Sets a required field enclosing character - :param escaped_by: Sets the escape character - :param input_fields_terminated_by: Sets the field separator character - :param input_lines_terminated_by: Sets the end-of-line character - :param input_optionally_enclosed_by: Sets a field enclosing character - :param batch: Use batch mode for underlying statement execution - :param relaxed_isolation: Transaction isolation to read uncommitted - for the mappers - """ - cmd = self._export_cmd( - table, - export_dir, - input_null_string, - input_null_non_string, - staging_table, - clear_staging_table, - enclosed_by, - escaped_by, - input_fields_terminated_by, - input_lines_terminated_by, - input_optionally_enclosed_by, - batch, - relaxed_isolation, - schema, - ) - - self.popen(cmd) diff --git a/airflow/providers/apache/sqoop/operators/__init__.py b/airflow/providers/apache/sqoop/operators/__init__.py deleted file mode 100644 index 217e5db960782..0000000000000 --- a/airflow/providers/apache/sqoop/operators/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. diff --git a/airflow/providers/apache/sqoop/operators/sqoop.py b/airflow/providers/apache/sqoop/operators/sqoop.py deleted file mode 100644 index 8aaae63dabda4..0000000000000 --- a/airflow/providers/apache/sqoop/operators/sqoop.py +++ /dev/null @@ -1,264 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -"""This module contains a sqoop 1 operator.""" -from __future__ import annotations - -import os -import signal -from typing import TYPE_CHECKING, Any, Sequence - -from airflow.exceptions import AirflowException -from airflow.models import BaseOperator -from airflow.providers.apache.sqoop.hooks.sqoop import SqoopHook - -if TYPE_CHECKING: - from airflow.utils.context import Context - - -class SqoopOperator(BaseOperator): - """ - Execute a Sqoop job. - - Documentation for Apache Sqoop can be found here: https://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html - - :param conn_id: str - :param cmd_type: str specify command to execute "export" or "import" - :param schema: Schema name - :param table: Table to read - :param query: Import result of arbitrary SQL query. Instead of using the table, - columns and where arguments, you can specify a SQL statement with the query - argument. Must also specify a destination directory with target_dir. - :param target_dir: HDFS destination directory where the data - from the rdbms will be written - :param append: Append data to an existing dataset in HDFS - :param file_type: "avro", "sequence", "text" Imports data to - into the specified format. Defaults to text. - :param columns: Columns to import from table - :param num_mappers: Use n mapper tasks to import/export in parallel - :param split_by: Column of the table used to split work units - :param where: WHERE clause to use during import - :param export_dir: HDFS Hive database directory to export to the rdbms - :param input_null_string: The string to be interpreted as null - for string columns - :param input_null_non_string: The string to be interpreted as null - for non-string columns - :param staging_table: The table in which data will be staged before - being inserted into the destination table - :param clear_staging_table: Indicate that any data present in the - staging table can be deleted - :param enclosed_by: Sets a required field enclosing character - :param escaped_by: Sets the escape character - :param input_fields_terminated_by: Sets the input field separator - :param input_lines_terminated_by: Sets the input end-of-line character - :param input_optionally_enclosed_by: Sets a field enclosing character - :param batch: Use batch mode for underlying statement execution - :param direct: Use direct export fast path - :param driver: Manually specify JDBC driver class to use - :param verbose: Switch to more verbose logging for debug purposes - :param relaxed_isolation: use read uncommitted isolation level - :param hcatalog_database: Specifies the database name for the HCatalog table - :param hcatalog_table: The argument value for this option is the HCatalog table - :param create_hcatalog_table: Have sqoop create the hcatalog table passed - in or not - :param properties: additional JVM properties passed to sqoop - :param extra_options: Extra import/export options to pass as dict to the SqoopHook. - If a key doesn't have a value, just pass an empty string to it. - Don't include prefix of -- for sqoop options. - :param libjars: Optional Comma separated jar files to include in the classpath. - """ - - template_fields: Sequence[str] = ( - "conn_id", - "cmd_type", - "table", - "query", - "target_dir", - "file_type", - "columns", - "split_by", - "where", - "export_dir", - "input_null_string", - "input_null_non_string", - "staging_table", - "enclosed_by", - "escaped_by", - "input_fields_terminated_by", - "input_lines_terminated_by", - "input_optionally_enclosed_by", - "properties", - "extra_options", - "driver", - "hcatalog_database", - "hcatalog_table", - "schema", - ) - template_fields_renderers = {"query": "sql"} - ui_color = "#7D8CA4" - - def __init__( - self, - *, - conn_id: str = "sqoop_default", - cmd_type: str = "import", - table: str | None = None, - query: str | None = None, - target_dir: str | None = None, - append: bool = False, - file_type: str = "text", - columns: str | None = None, - num_mappers: int | None = None, - split_by: str | None = None, - where: str | None = None, - export_dir: str | None = None, - input_null_string: str | None = None, - input_null_non_string: str | None = None, - staging_table: str | None = None, - clear_staging_table: bool = False, - enclosed_by: str | None = None, - escaped_by: str | None = None, - input_fields_terminated_by: str | None = None, - input_lines_terminated_by: str | None = None, - input_optionally_enclosed_by: str | None = None, - batch: bool = False, - direct: bool = False, - driver: Any | None = None, - verbose: bool = False, - relaxed_isolation: bool = False, - properties: dict[str, Any] | None = None, - hcatalog_database: str | None = None, - hcatalog_table: str | None = None, - create_hcatalog_table: bool = False, - extra_options: dict[str, Any] | None = None, - schema: str | None = None, - libjars: str | None = None, - **kwargs: Any, - ) -> None: - super().__init__(**kwargs) - self.conn_id = conn_id - self.cmd_type = cmd_type - self.table = table - self.query = query - self.target_dir = target_dir - self.append = append - self.file_type = file_type - self.columns = columns - self.num_mappers = num_mappers - self.split_by = split_by - self.where = where - self.export_dir = export_dir - self.input_null_string = input_null_string - self.input_null_non_string = input_null_non_string - self.staging_table = staging_table - self.clear_staging_table = clear_staging_table - self.enclosed_by = enclosed_by - self.escaped_by = escaped_by - self.input_fields_terminated_by = input_fields_terminated_by - self.input_lines_terminated_by = input_lines_terminated_by - self.input_optionally_enclosed_by = input_optionally_enclosed_by - self.batch = batch - self.direct = direct - self.driver = driver - self.verbose = verbose - self.relaxed_isolation = relaxed_isolation - self.hcatalog_database = hcatalog_database - self.hcatalog_table = hcatalog_table - self.create_hcatalog_table = create_hcatalog_table - self.properties = properties - self.extra_options = extra_options or {} - self.hook: SqoopHook | None = None - self.schema = schema - self.libjars = libjars - - def execute(self, context: Context) -> None: - """Execute sqoop job.""" - if self.hook is None: - self.hook = self._get_hook() - - if self.cmd_type == "export": - self.hook.export_table( - table=self.table, # type: ignore - export_dir=self.export_dir, - input_null_string=self.input_null_string, - input_null_non_string=self.input_null_non_string, - staging_table=self.staging_table, - clear_staging_table=self.clear_staging_table, - enclosed_by=self.enclosed_by, - escaped_by=self.escaped_by, - input_fields_terminated_by=self.input_fields_terminated_by, - input_lines_terminated_by=self.input_lines_terminated_by, - input_optionally_enclosed_by=self.input_optionally_enclosed_by, - batch=self.batch, - relaxed_isolation=self.relaxed_isolation, - schema=self.schema, - ) - elif self.cmd_type == "import": - if self.table and self.query: - raise AirflowException("Cannot specify query and table together. Need to specify either or.") - - if self.table: - self.hook.import_table( - table=self.table, - target_dir=self.target_dir, - append=self.append, - file_type=self.file_type, - columns=self.columns, - split_by=self.split_by, - where=self.where, - direct=self.direct, - driver=self.driver, - schema=self.schema, - ) - elif self.query: - self.hook.import_query( - query=self.query, - target_dir=self.target_dir, - append=self.append, - file_type=self.file_type, - split_by=self.split_by, - direct=self.direct, - driver=self.driver, - ) - else: - raise AirflowException("Provide query or table parameter to import using Sqoop") - else: - raise AirflowException("cmd_type should be 'import' or 'export'") - - def on_kill(self) -> None: - if self.hook is None: - self.hook = self._get_hook() - self.log.info("Sending SIGTERM signal to bash process group") - os.killpg(os.getpgid(self.hook.sub_process_pid), signal.SIGTERM) - - def _get_hook(self) -> SqoopHook: - """Return a SqoopHook instance.""" - # Add `create-hcatalog-table` to extra options if option passed to operator in case of `import` - # command. Similarly, if new parameters are added to the operator, you can pass them to - # `extra_options` so that you don't need to modify `SqoopHook` for each new parameter. - if self.cmd_type == "import" and self.create_hcatalog_table: - self.extra_options["create-hcatalog-table"] = "" - return SqoopHook( - conn_id=self.conn_id, - verbose=self.verbose, - num_mappers=self.num_mappers, - hcatalog_database=self.hcatalog_database, - hcatalog_table=self.hcatalog_table, - properties=self.properties, - libjars=self.libjars, - extra_options=self.extra_options, - ) diff --git a/airflow/providers/apache/sqoop/provider.yaml b/airflow/providers/apache/sqoop/provider.yaml deleted file mode 100644 index 66e12d4eb6586..0000000000000 --- a/airflow/providers/apache/sqoop/provider.yaml +++ /dev/null @@ -1,71 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - ---- -package-name: apache-airflow-providers-apache-sqoop -name: Apache Sqoop -description: | - `Apache Sqoop `__ - -removed: true -suspended: true -source-date-epoch: 1703288116 -versions: - - 4.2.1 - - 4.2.0 - - 4.1.0 - - 4.0.0 - - 3.2.1 - - 3.2.0 - - 3.1.1 - - 3.1.0 - - 3.0.0 - - 2.1.3 - - 2.1.2 - - 2.1.1 - - 2.1.0 - - 2.0.2 - - 2.0.1 - - 2.0.0 - - 1.0.1 - - 1.0.0 - -dependencies: - - apache-airflow>=2.6.0 - -integrations: - - integration-name: Apache Sqoop - external-doc-url: https://sqoop.apache.org/ - logo: /integration-logos/apache/sqoop.png - how-to-guide: - - /docs/apache-airflow-providers-apache-sqoop/operators.rst - tags: [apache] - -operators: - - integration-name: Apache Sqoop - python-modules: - - airflow.providers.apache.sqoop.operators.sqoop - -hooks: - - integration-name: Apache Sqoop - python-modules: - - airflow.providers.apache.sqoop.hooks.sqoop - - -connection-types: - - hook-class-name: airflow.providers.apache.sqoop.hooks.sqoop.SqoopHook - connection-type: sqoop diff --git a/airflow/providers/plexus/.latest-doc-only-change.txt b/airflow/providers/plexus/.latest-doc-only-change.txt deleted file mode 100644 index 36cd4c153e278..0000000000000 --- a/airflow/providers/plexus/.latest-doc-only-change.txt +++ /dev/null @@ -1 +0,0 @@ -99534e47f330ce0efb96402629dda5b2a4f16e8f diff --git a/airflow/providers/plexus/CHANGELOG.rst b/airflow/providers/plexus/CHANGELOG.rst deleted file mode 100644 index d576f7ef30c71..0000000000000 --- a/airflow/providers/plexus/CHANGELOG.rst +++ /dev/null @@ -1,256 +0,0 @@ - .. Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - .. http://www.apache.org/licenses/LICENSE-2.0 - - .. Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - - -.. NOTE TO CONTRIBUTORS: - Please, only add notes to the Changelog just below the "Changelog" header when there are some breaking changes - and you want to add an explanation to the users on how they are supposed to deal with them. - The changelog is updated and maintained semi-automatically by release manager. - -``apache-airflow-providers-plexus`` - - -Changelog ---------- - -3.4.1 -..... - -.. note:: - - Mark plexus provider as removed according to `consensus on the dev@airflow.apache.org `_ - -Misc -~~~~ - -* ``Schedule plexus and apache.sqoop providers for removal (#36208)`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - -3.4.0 -..... - -.. note:: - This release of provider is only available for Airflow 2.6+ as explained in the - `Apache Airflow providers support policy `_. - -Misc -~~~~ - -* ``Bump minimum Airflow version in providers to Airflow 2.6.0 (#36017)`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Fix and reapply templates for provider documentation (#35686)`` - * ``Prepare docs 3rd wave of Providers October 2023 - FIX (#35233)`` - * ``Prepare docs 2nd wave of Providers November 2023 (#35836)`` - * ``Use reproducible builds for provider packages (#35693)`` - * ``Prepare docs 1st wave of Providers November 2023 (#35537)`` - * ``Prepare docs 3rd wave of Providers October 2023 (#35187)`` - * ``Pre-upgrade 'ruff==0.0.292' changes in providers (#35053)`` - -3.3.0 -..... - -.. note:: - This release of provider is only available for Airflow 2.5+ as explained in the - `Apache Airflow providers support policy `_. - -Misc -~~~~ - -* ``Bump min airflow version of providers (#34728)`` - -3.2.2 -..... - -Misc -~~~~ - -* ``Simplify conditions on len() in other providers (#33569)`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Prepare docs for Aug 2023 2nd wave of Providers (#33291)`` - * ``Prepare docs for July 2023 wave of Providers (RC2) (#32381)`` - * ``D205 Support - Providers: Pagerduty to SMTP (inclusive) (#32358)`` - * ``Remove spurious headers for provider changelogs (#32373)`` - * ``Prepare docs for July 2023 wave of Providers (#32298)`` - * ``Improve provider documentation and README structure (#32125)`` - -3.2.1 -..... - -.. note:: - This release dropped support for Python 3.7 - -Misc -~~~~ - -* ``Add note about dropping Python 3.7 for providers (#32015)`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Add D400 pydocstyle check - Providers (#31427)`` - -3.2.0 -..... - -.. note:: - This release of provider is only available for Airflow 2.4+ as explained in the - `Apache Airflow providers support policy `_. - -Misc -~~~~ - -* ``Bump minimum Airflow version in providers (#30917)`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Add full automation for min Airflow version for providers (#30994)`` - * ``Add mechanism to suspend providers (#30422)`` - * ``Use '__version__' in providers not 'version' (#31393)`` - * ``Fixing circular import error in providers caused by airflow version check (#31379)`` - * ``Prepare docs for May 2023 wave of Providers (#31252)`` - -3.1.0 -..... - -.. note:: - This release of provider is only available for Airflow 2.3+ as explained in the - `Apache Airflow providers support policy `_. - -Misc -~~~~ - -* ``Move min airflow version to 2.3.0 for all providers (#27196)`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Add documentation for July 2022 Provider's release (#25030)`` - * ``Enable string normalization in python formatting - providers (#27205)`` - * ``Update docs for September Provider's release (#26731)`` - * ``Apply PEP-563 (Postponed Evaluation of Annotations) to non-core airflow (#26289)`` - * ``Prepare docs for new providers release (August 2022) (#25618)`` - * ``Move provider dependencies to inside provider folders (#24672)`` - -3.0.0 -..... - -Breaking changes -~~~~~~~~~~~~~~~~ - -.. note:: - This release of provider is only available for Airflow 2.2+ as explained in the - `Apache Airflow providers support policy `_. - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Migrate Plexus example DAGs to new design #22457 (#24147)`` - * ``Add explanatory note for contributors about updating Changelog (#24229)`` - * ``Prepare docs for May 2022 provider's release (#24231)`` - * ``Update package description to remove double min-airflow specification (#24292)`` - -2.0.4 -..... - -Bug Fixes -~~~~~~~~~ - -* ``Fix mistakenly added install_requires for all providers (#22382)`` - -2.0.3 -..... - -Misc -~~~~~ - -* ``Add Trove classifiers in PyPI (Framework :: Apache Airflow :: Provider)`` - -2.0.2 -..... - -Misc -~~~~ - -* ``Support for Python 3.10`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Fixed changelog for January 2022 (delayed) provider's release (#21439)`` - * ``Fix K8S changelog to be PyPI-compatible (#20614)`` - * ``Add documentation for January 2021 providers release (#21257)`` - * ``Remove ':type' lines now sphinx-autoapi supports typehints (#20951)`` - * ``Update documentation for provider December 2021 release (#20523)`` - * ``Update documentation for November 2021 provider's release (#19882)`` - * ``Prepare documentation for October Provider's release (#19321)`` - * ``More f-strings (#18855)`` - * ``Update documentation for September providers release (#18613)`` - * ``Static start_date and default arg cleanup for misc. provider example DAGs (#18597)`` - -2.0.1 -..... - - -Misc -~~~~ - -* ``Optimise connection importing for Airflow 2.2.0`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Prepares docs for Rc2 release of July providers (#17116)`` - * ``Remove/refactor default_args pattern for miscellaneous providers (#16872)`` - -2.0.0 -..... - -Breaking changes -~~~~~~~~~~~~~~~~ - -* ``Auto-apply apply_default decorator (#15667)`` - -.. warning:: Due to apply_default decorator removal, this version of the provider requires Airflow 2.1.0+. - If your Airflow version is < 2.1.0, and you want to install this provider version, first upgrade - Airflow to at least version 2.1.0. Otherwise your Airflow package version will be upgraded - automatically and you will have to manually run ``airflow upgrade db`` to complete the migration. - -Features -~~~~~~~~ - -* ``Removes arrow higher limits for plexus provider (#16026)`` - -.. Below changes are excluded from the changelog. Move them to - appropriate section above if needed. Do not delete the lines(!): - * ``Adds interactivity when generating provider documentation. (#15518)`` - * ``Prepares provider release after PIP 21 compatibility (#15576)`` - * ``Remove Backport Providers (#14886)`` - * ``Update documentation for broken package releases (#14734)`` - * ``Updated documentation for June 2021 provider release (#16294)`` - * ``More documentation update for June providers release (#16405)`` - * ``Synchronizes updated changelog after buggfix release (#16464)`` - -1.0.1 -..... - -Updated documentation and readme files. - -1.0.0 -..... - -Initial version of the provider. diff --git a/airflow/providers/plexus/__init__.py b/airflow/providers/plexus/__init__.py deleted file mode 100644 index 0a4758aeaff35..0000000000000 --- a/airflow/providers/plexus/__init__.py +++ /dev/null @@ -1,42 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# -# NOTE! THIS FILE IS AUTOMATICALLY GENERATED AND WILL BE -# OVERWRITTEN WHEN PREPARING DOCUMENTATION FOR THE PACKAGES. -# -# IF YOU WANT TO MODIFY THIS FILE, YOU SHOULD MODIFY THE TEMPLATE -# `PROVIDER__INIT__PY_TEMPLATE.py.jinja2` IN the `dev/breeze/src/airflow_breeze/templates` DIRECTORY -# -from __future__ import annotations - -import packaging.version - -__all__ = ["__version__"] - -__version__ = "3.4.0" - -try: - from airflow import __version__ as airflow_version -except ImportError: - from airflow.version import version as airflow_version - -if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse( - "2.6.0" -): - raise RuntimeError( - f"The package `apache-airflow-providers-plexus:{__version__}` needs Apache Airflow 2.6.0+" - ) diff --git a/airflow/providers/plexus/hooks/__init__.py b/airflow/providers/plexus/hooks/__init__.py deleted file mode 100644 index 13a83393a9124..0000000000000 --- a/airflow/providers/plexus/hooks/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. diff --git a/airflow/providers/plexus/hooks/plexus.py b/airflow/providers/plexus/hooks/plexus.py deleted file mode 100644 index 9432fe5fb7c8b..0000000000000 --- a/airflow/providers/plexus/hooks/plexus.py +++ /dev/null @@ -1,77 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from __future__ import annotations - -from typing import Any - -import arrow -import jwt -import requests - -from airflow.exceptions import AirflowException -from airflow.hooks.base import BaseHook -from airflow.models import Variable - - -class PlexusHook(BaseHook): - """ - Used for jwt token generation and storage to make Plexus API calls. - - Requires email and password Airflow variables be created. - - Example: - - export AIRFLOW_VAR_EMAIL = user@corescientific.com - - export AIRFLOW_VAR_PASSWORD = ******* - - """ - - def __init__(self) -> None: - super().__init__() - self.__token = None - self.__token_exp = None - self.host = "https://apiplexus.corescientific.com/" - self.user_id = None - - def _generate_token(self) -> Any: - login = Variable.get("email") - pwd = Variable.get("password") - if login is None or pwd is None: - raise AirflowException("No valid email/password supplied.") - token_endpoint = self.host + "sso/jwt-token/" - response = requests.post(token_endpoint, data={"email": login, "password": pwd}, timeout=5) - if not response.ok: - raise AirflowException( - "Could not retrieve JWT Token. " - f"Status Code: [{response.status_code}]. Reason: {response.reason} - {response.text}" - ) - token = response.json()["access"] - payload = jwt.decode(token, verify=False) - self.user_id = payload["user_id"] - self.__token_exp = payload["exp"] - - return token - - @property - def token(self) -> Any: - """Returns users token.""" - if self.__token is not None: - if not self.__token_exp or arrow.get(self.__token_exp) <= arrow.now(): - self.__token = self._generate_token() - return self.__token - else: - self.__token = self._generate_token() - return self.__token diff --git a/airflow/providers/plexus/operators/__init__.py b/airflow/providers/plexus/operators/__init__.py deleted file mode 100644 index 13a83393a9124..0000000000000 --- a/airflow/providers/plexus/operators/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. diff --git a/airflow/providers/plexus/operators/job.py b/airflow/providers/plexus/operators/job.py deleted file mode 100644 index 21002dc0766f1..0000000000000 --- a/airflow/providers/plexus/operators/job.py +++ /dev/null @@ -1,156 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from __future__ import annotations - -import logging -import time -from typing import Any - -import requests - -from airflow.exceptions import AirflowException -from airflow.models import BaseOperator -from airflow.providers.plexus.hooks.plexus import PlexusHook - -logger = logging.getLogger(__name__) - - -class PlexusJobOperator(BaseOperator): - """ - Submits a Plexus job. - - :param job_params: parameters required to launch a job. - - Required job parameters are the following - - "name": job name created by user. - - "app": name of the application to run. found in Plexus UI. - - "queue": public cluster name. found in Plexus UI. - - "num_nodes": number of nodes. - - "num_cores": number of cores per node. - - """ - - def __init__(self, job_params: dict, **kwargs) -> None: - super().__init__(**kwargs) - - self.job_params = job_params - self.required_params = {"name", "app", "queue", "num_cores", "num_nodes"} - self.lookups = { - "app": ("apps/", "id", "name"), - "billing_account_id": ("users/{}/billingaccounts/", "id", None), - "queue": ("queues/", "id", "public_name"), - } - self.job_params.update({"billing_account_id": None}) - self.is_service = None - - def execute(self, context: Any) -> Any: - hook = PlexusHook() - params = self.construct_job_params(hook) - if self.is_service is True: - if self.job_params.get("expected_runtime") is None: - end_state = "Running" - else: - end_state = "Finished" - elif self.is_service is False: - end_state = "Completed" - else: - raise AirflowException( - "Unable to determine if application " - "is running as a batch job or service. " - "Contact Core Scientific AI Team." - ) - logger.info("creating job w/ following params: %s", params) - jobs_endpoint = hook.host + "jobs/" - headers = {"Authorization": f"Bearer {hook.token}"} - create_job = requests.post(jobs_endpoint, headers=headers, data=params, timeout=5) - if create_job.ok: - job = create_job.json() - jid = job["id"] - state = job["last_state"] - while state != end_state: - time.sleep(3) - jid_endpoint = jobs_endpoint + f"{jid}/" - get_job = requests.get(jid_endpoint, headers=headers, timeout=5) - if not get_job.ok: - raise AirflowException( - "Could not retrieve job status. " - f"Status Code: [{get_job.status_code}]. Reason: {get_job.reason} - {get_job.text}" - ) - new_state = get_job.json()["last_state"] - if new_state in ("Cancelled", "Failed"): - raise AirflowException(f"Job {new_state}") - elif new_state != state: - logger.info("job is %s", new_state) - state = new_state - else: - raise AirflowException( - "Could not start job. " - f"Status Code: [{create_job.status_code}]. Reason: {create_job.reason} - {create_job.text}" - ) - - def _api_lookup(self, param: str, hook): - lookup = self.lookups[param] - key = lookup[1] - mapping = None if lookup[2] is None else (lookup[2], self.job_params[param]) - - if param == "billing_account_id": - endpoint = hook.host + lookup[0].format(hook.user_id) - else: - endpoint = hook.host + lookup[0] - headers = {"Authorization": f"Bearer {hook.token}"} - response = requests.get(endpoint, headers=headers, timeout=5) - results = response.json()["results"] - - v = None - if mapping is None: - v = results[0][key] - else: - for dct in results: - if dct[mapping[0]] == mapping[1]: - v = dct[key] - if param == "app": - self.is_service = dct["is_service"] - if v is None: - raise AirflowException(f"Could not locate value for param:{key} at endpoint: {endpoint}") - - return v - - def construct_job_params(self, hook: Any) -> dict[Any, Any | None]: - """ - Creates job_params dict for api call to launch a Plexus job. - - Some parameters required to launch a job - are not available to the user in the Plexus - UI. For example, an app id is required, but - only the app name is provided in the UI. - This function acts as a backend lookup - of the required param value using the - user-provided value. - - :param hook: plexus hook object - """ - missing_params = self.required_params - set(self.job_params) - if missing_params: - raise AirflowException(f"Missing the following required job_params: {', '.join(missing_params)}") - params = {} - for prm in self.job_params: - if prm in self.lookups: - v = self._api_lookup(param=prm, hook=hook) - params[prm] = v - else: - params[prm] = self.job_params[prm] - return params diff --git a/airflow/providers/plexus/provider.yaml b/airflow/providers/plexus/provider.yaml deleted file mode 100644 index 4ae273970a460..0000000000000 --- a/airflow/providers/plexus/provider.yaml +++ /dev/null @@ -1,61 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - ---- -package-name: apache-airflow-providers-plexus -name: Plexus -description: | - `Plexus `__ - -removed: true -suspended: true -source-date-epoch: 1703288161 -versions: - - 3.4.1 - - 3.4.0 - - 3.3.0 - - 3.2.2 - - 3.2.1 - - 3.2.0 - - 3.1.0 - - 3.0.0 - - 2.0.4 - - 2.0.3 - - 2.0.2 - - 2.0.1 - - 2.0.0 - - 1.0.1 - - 1.0.0 - -dependencies: - - apache-airflow>=2.6.0 - - arrow>=0.16.0 - -integrations: - - integration-name: Plexus - external-doc-url: https://plexus.corescientific.com/ - logo: /integration-logos/plexus/Plexus.png - tags: [service] - -operators: - - integration-name: Plexus - python-modules: - - airflow.providers.plexus.operators.job -hooks: - - integration-name: Plexus - python-modules: - - airflow.providers.plexus.hooks.plexus diff --git a/airflow/utils/db.py b/airflow/utils/db.py index b3353f9ba0310..e2acedf6c570c 100644 --- a/airflow/utils/db.py +++ b/airflow/utils/db.py @@ -605,14 +605,6 @@ def create_default_connections(session: Session = NEW_SESSION): ), session, ) - merge_conn( - Connection( - conn_id="sqoop_default", - conn_type="sqoop", - host="rdbms", - ), - session, - ) merge_conn( Connection( conn_id="ssh_default", diff --git a/dev/breeze/tests/test_packages.py b/dev/breeze/tests/test_packages.py index 214b124f92dc0..eb7b3a4d8493a 100644 --- a/dev/breeze/tests/test_packages.py +++ b/dev/breeze/tests/test_packages.py @@ -109,17 +109,17 @@ def test_get_provider_requirements(): def test_get_removed_providers(): # Modify it every time we schedule provider for removal or remove it - assert ["apache.sqoop", "plexus"] == get_removed_provider_ids() + assert [] == get_removed_provider_ids() def test_get_suspended_provider_ids(): # Modify it every time we suspend/resume provider - assert ["apache.sqoop", "plexus"] == get_suspended_provider_ids() + assert [] == get_suspended_provider_ids() def test_get_suspended_provider_folders(): # Modify it every time we suspend/resume provider - assert ["apache/sqoop", "plexus"] == get_suspended_provider_folders() + assert [] == get_suspended_provider_folders() @pytest.mark.parametrize( diff --git a/docs/apache-airflow-providers-apache-sqoop/changelog.rst b/docs/apache-airflow-providers-apache-sqoop/changelog.rst deleted file mode 100644 index a11ad4bfea409..0000000000000 --- a/docs/apache-airflow-providers-apache-sqoop/changelog.rst +++ /dev/null @@ -1,25 +0,0 @@ - - .. Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - .. http://www.apache.org/licenses/LICENSE-2.0 - - .. Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - - .. NOTE! THIS FILE IS AUTOMATICALLY GENERATED AND WILL BE - OVERWRITTEN WHEN PREPARING PACKAGES. - - .. IF YOU WANT TO MODIFY THIS FILE, YOU SHOULD MODIFY THE TEMPLATE - `PROVIDER_CHANGELOG_TEMPLATE.rst.jinja2` IN the `dev/breeze/src/airflow_breeze/templates` DIRECTORY - -.. include:: ../../airflow/providers/apache/sqoop/CHANGELOG.rst diff --git a/docs/apache-airflow-providers-apache-sqoop/commits.rst b/docs/apache-airflow-providers-apache-sqoop/commits.rst deleted file mode 100644 index ce1fc492f19ad..0000000000000 --- a/docs/apache-airflow-providers-apache-sqoop/commits.rst +++ /dev/null @@ -1,343 +0,0 @@ - - .. Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - .. http://www.apache.org/licenses/LICENSE-2.0 - - .. Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - - .. NOTE! THIS FILE IS AUTOMATICALLY GENERATED AND WILL BE - OVERWRITTEN WHEN PREPARING PACKAGES. - - .. IF YOU WANT TO MODIFY THIS FILE, YOU SHOULD MODIFY THE TEMPLATE - `PROVIDER_COMMITS_TEMPLATE.rst.jinja2` IN the `dev/breeze/src/airflow_breeze/templates` DIRECTORY - - .. THE REMAINDER OF THE FILE IS AUTOMATICALLY GENERATED. IT WILL BE OVERWRITTEN AT RELEASE TIME! - -Package apache-airflow-providers-apache-sqoop ------------------------------------------------------- - -`Apache Sqoop `__ - - -This is detailed commit list of changes for versions provider package: ``apache.sqoop``. -For high-level changelog, see :doc:`package information including changelog `. - - - -4.2.1 -..... - -Latest change: 2023-12-13 - -================================================================================================= =========== =================================================================== -Commit Committed Subject -================================================================================================= =========== =================================================================== -`97e8f58673 `_ 2023-12-13 ``Schedule plexus and apache.sqoop providers for removal (#36208)`` -================================================================================================= =========== =================================================================== - -4.2.0 -..... - -Latest change: 2023-12-08 - -================================================================================================= =========== ======================================================================= -Commit Committed Subject -================================================================================================= =========== ======================================================================= -`999b70178a `_ 2023-12-08 ``Prepare docs 1st wave of Providers December 2023 (#36112)`` -`d0918d77ee `_ 2023-12-07 ``Bump minimum Airflow version in providers to Airflow 2.6.0 (#36017)`` -`0b23d5601c `_ 2023-11-24 ``Prepare docs 2nd wave of Providers November 2023 (#35836)`` -`99534e47f3 `_ 2023-11-19 ``Use reproducible builds for provider packages (#35693)`` -`99df205f42 `_ 2023-11-16 ``Fix and reapply templates for provider documentation (#35686)`` -`1b059c57d6 `_ 2023-11-08 ``Prepare docs 1st wave of Providers November 2023 (#35537)`` -`d1c58d86de `_ 2023-10-28 ``Prepare docs 3rd wave of Providers October 2023 - FIX (#35233)`` -`3592ff4046 `_ 2023-10-28 ``Prepare docs 3rd wave of Providers October 2023 (#35187)`` -`dd7ba3cae1 `_ 2023-10-19 ``Pre-upgrade 'ruff==0.0.292' changes in providers (#35053)`` -`b75f9e8806 `_ 2023-10-18 ``Upgrade pre-commits (#35033)`` -================================================================================================= =========== ======================================================================= - -4.1.0 -..... - -Latest change: 2023-10-13 - -================================================================================================= =========== ======================================================================= -Commit Committed Subject -================================================================================================= =========== ======================================================================= -`e9987d5059 `_ 2023-10-13 ``Prepare docs 1st wave of Providers in October 2023 (#34916)`` -`0c8e30e43b `_ 2023-10-05 ``Bump min airflow version of providers (#34728)`` -`21990ed894 `_ 2023-09-08 ``Prepare docs for 09 2023 - 1st wave of Providers (#34201)`` -`c077d19060 `_ 2023-08-26 ``Prepare docs for Aug 2023 3rd wave of Providers (#33730)`` -`c645d8e40c `_ 2023-08-12 ``D401 Support - Providers: Airbyte to Atlassian (Inclusive) (#33354)`` -================================================================================================= =========== ======================================================================= - -4.0.0 -..... - -Latest change: 2023-08-05 - -================================================================================================= =========== ==================================================================================================== -Commit Committed Subject -================================================================================================= =========== ==================================================================================================== -`60677b0ba3 `_ 2023-08-05 ``Prepare docs for Aug 2023 1st wave of Providers (#33128)`` -`59f5f58e2b `_ 2023-08-03 ``Validate SqoopHook connection string and disable extra options from public hook methods (#33039)`` -`ddcd30e7c7 `_ 2023-07-31 ``Validate connection host field for Sqoop connection (#32968)`` -`225e3041d2 `_ 2023-07-06 ``Prepare docs for July 2023 wave of Providers (RC2) (#32381)`` -`3878fe6fab `_ 2023-07-05 ``Remove spurious headers for provider changelogs (#32373)`` -`cb4927a018 `_ 2023-07-05 ``Prepare docs for July 2023 wave of Providers (#32298)`` -`09d4718d3a `_ 2023-06-27 ``Improve provider documentation and README structure (#32125)`` -================================================================================================= =========== ==================================================================================================== - -3.2.1 -..... - -Latest change: 2023-06-20 - -================================================================================================= =========== ============================================================== -Commit Committed Subject -================================================================================================= =========== ============================================================== -`79bcc2e668 `_ 2023-06-20 ``Prepare RC1 docs for June 2023 wave of Providers (#32001)`` -`8b146152d6 `_ 2023-06-20 ``Add note about dropping Python 3.7 for providers (#32015)`` -`13890788ae `_ 2023-06-07 ``Apache provider docstring improvements (#31730)`` -`a473facf6c `_ 2023-06-01 ``Add D400 pydocstyle check - Apache providers only (#31424)`` -================================================================================================= =========== ============================================================== - -3.2.0 -..... - -Latest change: 2023-05-19 - -================================================================================================= =========== ====================================================================================== -Commit Committed Subject -================================================================================================= =========== ====================================================================================== -`45548b9451 `_ 2023-05-19 ``Prepare RC2 docs for May 2023 wave of Providers (#31416)`` -`abea189022 `_ 2023-05-18 ``Use '__version__' in providers not 'version' (#31393)`` -`f5aed58d9f `_ 2023-05-18 ``Fixing circular import error in providers caused by airflow version check (#31379)`` -`d9ff55cf6d `_ 2023-05-16 ``Prepare docs for May 2023 wave of Providers (#31252)`` -`eef5bc7f16 `_ 2023-05-03 ``Add full automation for min Airflow version for providers (#30994)`` -`a7eb32a5b2 `_ 2023-04-30 ``Bump minimum Airflow version in providers (#30917)`` -`d23a3bbed8 `_ 2023-04-04 ``Add mechanism to suspend providers (#30422)`` -================================================================================================= =========== ====================================================================================== - -3.1.1 -..... - -Latest change: 2023-02-18 - -================================================================================================= =========== =================================================================== -Commit Committed Subject -================================================================================================= =========== =================================================================== -`470fdaea27 `_ 2023-02-18 ``Prepare docs for 02 2023 midmonth wave of Providers (#29589)`` -`655ffb835e `_ 2023-02-16 ``Move libjars parameter in Sqoop Hook to Hook parameter (#29500)`` -================================================================================================= =========== =================================================================== - -3.1.0 -..... - -Latest change: 2022-11-15 - -================================================================================================= =========== ==================================================================================== -Commit Committed Subject -================================================================================================= =========== ==================================================================================== -`12c3c39d1a `_ 2022-11-15 ``pRepare docs for November 2022 wave of Providers (#27613)`` -`78b8ea2f22 `_ 2022-10-24 ``Move min airflow version to 2.3.0 for all providers (#27196)`` -`2a34dc9e84 `_ 2022-10-23 ``Enable string normalization in python formatting - providers (#27205)`` -`f8db64c35c `_ 2022-09-28 ``Update docs for September Provider's release (#26731)`` -`06acf40a43 `_ 2022-09-13 ``Apply PEP-563 (Postponed Evaluation of Annotations) to non-core airflow (#26289)`` -`e5ac6c7cfb `_ 2022-08-10 ``Prepare docs for new providers release (August 2022) (#25618)`` -`d2459a241b `_ 2022-07-13 ``Add documentation for July 2022 Provider's release (#25030)`` -`0de31bd73a `_ 2022-06-29 ``Move provider dependencies to inside provider folders (#24672)`` -`510a6bab45 `_ 2022-06-28 ``Remove 'hook-class-names' from provider.yaml (#24702)`` -================================================================================================= =========== ==================================================================================== - -3.0.0 -..... - -Latest change: 2022-06-09 - -================================================================================================= =========== ================================================================================== -Commit Committed Subject -================================================================================================= =========== ================================================================================== -`dcdcf3a2b8 `_ 2022-06-09 ``Update release notes for RC2 release of Providers for May 2022 (#24307)`` -`717a7588bc `_ 2022-06-07 ``Update package description to remove double min-airflow specification (#24292)`` -`aeabe994b3 `_ 2022-06-07 ``Prepare docs for May 2022 provider's release (#24231)`` -`027b707d21 `_ 2022-06-05 ``Add explanatory note for contributors about updating Changelog (#24229)`` -================================================================================================= =========== ================================================================================== - -2.1.3 -..... - -Latest change: 2022-03-22 - -================================================================================================= =========== ============================================================== -Commit Committed Subject -================================================================================================= =========== ============================================================== -`d7dbfb7e26 `_ 2022-03-22 ``Add documentation for bugfix release of Providers (#22383)`` -================================================================================================= =========== ============================================================== - -2.1.2 -..... - -Latest change: 2022-03-14 - -================================================================================================= =========== ==================================================================== -Commit Committed Subject -================================================================================================= =========== ==================================================================== -`16adc035b1 `_ 2022-03-14 ``Add documentation for Classifier release for March 2022 (#22226)`` -================================================================================================= =========== ==================================================================== - -2.1.1 -..... - -Latest change: 2022-03-07 - -================================================================================================= =========== ======================================================== -Commit Committed Subject -================================================================================================= =========== ======================================================== -`f5b96315fe `_ 2022-03-07 ``Add documentation for Feb Providers release (#22056)`` -`f41bcf1e67 `_ 2022-02-09 ``add how-to guide for sqoop operator (#21424)`` -================================================================================================= =========== ======================================================== - -2.1.0 -..... - -Latest change: 2022-02-08 - -================================================================================================= =========== ========================================================================== -Commit Committed Subject -================================================================================================= =========== ========================================================================== -`d94fa37830 `_ 2022-02-08 ``Fixed changelog for January 2022 (delayed) provider's release (#21439)`` -`6c3a67d4fc `_ 2022-02-05 ``Add documentation for January 2021 providers release (#21257)`` -`39e395f981 `_ 2022-02-04 ``Add more SQL template fields renderers (#21237)`` -`602abe8394 `_ 2022-01-20 ``Remove ':type' lines now sphinx-autoapi supports typehints (#20951)`` -`f77417eb0d `_ 2021-12-31 ``Fix K8S changelog to be PyPI-compatible (#20614)`` -`97496ba2b4 `_ 2021-12-31 ``Update documentation for provider December 2021 release (#20523)`` -`d56e7b56bb `_ 2021-12-30 ``Fix template_fields type to have MyPy friendly Sequence type (#20571)`` -`485ff6cc64 `_ 2021-12-29 ``Fix MyPy errors in Apache Providers (#20422)`` -`5bb76c7780 `_ 2021-12-16 ``Fix MyPy Errors for Apache Sqoop provider. (#20304)`` -================================================================================================= =========== ========================================================================== - -2.0.2 -..... - -Latest change: 2021-08-30 - -================================================================================================= =========== ============================================================================ -Commit Committed Subject -================================================================================================= =========== ============================================================================ -`0a68588479 `_ 2021-08-30 ``Add August 2021 Provider's documentation (#17890)`` -`be75dcd39c `_ 2021-08-23 ``Update description about the new ''connection-types'' provider meta-data`` -`76ed2a49c6 `_ 2021-08-19 ``Import Hooks lazily individually in providers manager (#17682)`` -================================================================================================= =========== ============================================================================ - -2.0.1 -..... - -Latest change: 2021-07-26 - -================================================================================================= =========== =================================================================== -Commit Committed Subject -================================================================================================= =========== =================================================================== -`87f408b1e7 `_ 2021-07-26 ``Prepares docs for Rc2 release of July providers (#17116)`` -`d02ded65ea `_ 2021-07-15 ``Fixed wrongly escaped characters in amazon's changelog (#17020)`` -`b916b75079 `_ 2021-07-15 ``Prepare documentation for July release of providers. (#17015)`` -`fc917af8b4 `_ 2021-07-10 ``Fix Minor Bugs in Apache Sqoop Hook and Operator (#16350)`` -`866a601b76 `_ 2021-06-28 ``Removes pylint from our toolchain (#16682)`` -================================================================================================= =========== =================================================================== - -2.0.0 -..... - -Latest change: 2021-06-18 - -================================================================================================= =========== ======================================================================== -Commit Committed Subject -================================================================================================= =========== ======================================================================== -`bbc627a3da `_ 2021-06-18 ``Prepares documentation for rc2 release of Providers (#16501)`` -`cbf8001d76 `_ 2021-06-16 ``Synchronizes updated changelog after buggfix release (#16464)`` -`1fba5402bb `_ 2021-06-15 ``More documentation update for June providers release (#16405)`` -`9c94b72d44 `_ 2021-06-07 ``Updated documentation for June 2021 provider release (#16294)`` -`f47e10c388 `_ 2021-05-31 ``Fixes failing static checks after recent pre-commit upgrade (#16183)`` -`37681bca00 `_ 2021-05-07 ``Auto-apply apply_default decorator (#15667)`` -`807ad32ce5 `_ 2021-05-01 ``Prepares provider release after PIP 21 compatibility (#15576)`` -`40a2476a5d `_ 2021-04-28 ``Adds interactivity when generating provider documentation. (#15518)`` -`4b031d39e1 `_ 2021-04-27 ``Make Airflow code Pylint 2.8 compatible (#15534)`` -`68e4c4dcb0 `_ 2021-03-20 ``Remove Backport Providers (#14886)`` -`6e6526a0f6 `_ 2021-03-13 ``Update documentation for broken package releases (#14734)`` -================================================================================================= =========== ======================================================================== - -1.0.1 -..... - -Latest change: 2021-02-04 - -================================================================================================= =========== ======================================================== -Commit Committed Subject -================================================================================================= =========== ======================================================== -`88bdcfa0df `_ 2021-02-04 ``Prepare to release a new wave of providers. (#14013)`` -`ac2f72c98d `_ 2021-02-01 ``Implement provider versioning tools (#13767)`` -`295d66f914 `_ 2020-12-30 ``Fix Grammar in PIP warning (#13380)`` -`6cf76d7ac0 `_ 2020-12-18 ``Fix typo in pip upgrade command :( (#13148)`` -`5090fb0c89 `_ 2020-12-15 ``Add script to generate integrations.json (#13073)`` -================================================================================================= =========== ======================================================== - -1.0.0 -..... - -Latest change: 2020-12-09 - -================================================================================================= =========== ================================================================================== -Commit Committed Subject -================================================================================================= =========== ================================================================================== -`32971a1a2d `_ 2020-12-09 ``Updates providers versions to 1.0.0 (#12955)`` -`b40dffa085 `_ 2020-12-08 ``Rename remaing modules to match AIP-21 (#12917)`` -`9b39f24780 `_ 2020-12-08 ``Add support for dynamic connection form fields per provider (#12558)`` -`c34ef853c8 `_ 2020-11-20 ``Separate out documentation building per provider (#12444)`` -`0080354502 `_ 2020-11-18 ``Update provider READMEs for 1.0.0b2 batch release (#12449)`` -`ae7cb4a1e2 `_ 2020-11-17 ``Update wrong commit hash in backport provider changes (#12390)`` -`6889a333cf `_ 2020-11-15 ``Improvements for operators and hooks ref docs (#12366)`` -`7825e8f590 `_ 2020-11-13 ``Docs installation improvements (#12304)`` -`85a18e13d9 `_ 2020-11-09 ``Point at pypi project pages for cross-dependency of provider packages (#12212)`` -`59eb5de78c `_ 2020-11-09 ``Update provider READMEs for up-coming 1.0.0beta1 releases (#12206)`` -`b2a28d1590 `_ 2020-11-09 ``Moves provider packages scripts to dev (#12082)`` -`41bf172c1d `_ 2020-11-04 ``Simplify string expressions (#12093)`` -`4e8f9cc8d0 `_ 2020-11-03 ``Enable Black - Python Auto Formmatter (#9550)`` -`8c42cf1b00 `_ 2020-11-03 ``Use PyUpgrade to use Python 3.6 features (#11447)`` -`5a439e84eb `_ 2020-10-26 ``Prepare providers release 0.0.2a1 (#11855)`` -`872b1566a1 `_ 2020-10-25 ``Generated backport providers readmes/setup for 2020.10.29 (#11826)`` -`349b0811c3 `_ 2020-10-20 ``Add D200 pydocstyle check (#11688)`` -`16e7129719 `_ 2020-10-13 ``Added support for provider packages for Airflow 2.0 (#11487)`` -`0a0e1af800 `_ 2020-10-03 ``Fix Broken Markdown links in Providers README TOC (#11249)`` -`ca4238eb4d `_ 2020-10-02 ``Fixed month in backport packages to October (#11242)`` -`5220e4c384 `_ 2020-10-02 ``Prepare Backport release 2020.09.07 (#11238)`` -`fdd9b6f65b `_ 2020-08-25 ``Enable Black on Providers Packages (#10543)`` -`3696c34c28 `_ 2020-08-24 ``Fix typo in the word "release" (#10528)`` -`ee7ca128a1 `_ 2020-08-22 ``Fix broken Markdown refernces in Providers README (#10483)`` -`3b3287d7ac `_ 2020-08-05 ``Enforce keyword only arguments on apache operators (#10170)`` -`33f0cd2657 `_ 2020-07-22 ``apply_default keeps the function signature for mypy (#9784)`` -`4d74ac2111 `_ 2020-07-19 ``Increase typing for Apache and http provider package (#9729)`` -`d0e7db4024 `_ 2020-06-19 ``Fixed release number for fresh release (#9408)`` -`12af6a0800 `_ 2020-06-19 ``Final cleanup for 2020.6.23rc1 release preparation (#9404)`` -`c7e5bce57f `_ 2020-06-19 ``Prepare backport release candidate for 2020.6.23rc1 (#9370)`` -`f6bd817a3a `_ 2020-06-16 ``Introduce 'transfers' packages (#9320)`` -`0b0e4f7a4c `_ 2020-05-26 ``Preparing for RC3 relase of backports (#9026)`` -`00642a46d0 `_ 2020-05-26 ``Fixed name of 20 remaining wrongly named operators. (#8994)`` -`375d1ca229 `_ 2020-05-19 ``Release candidate 2 for backport packages 2020.05.20 (#8898)`` -`12c5e5d8ae `_ 2020-05-17 ``Prepare release candidate for backport packages (#8891)`` -`f3521fb0e3 `_ 2020-05-16 ``Regenerate readme files for backport package release (#8886)`` -`92585ca4cb `_ 2020-05-15 ``Added automated release notes generation for backport operators (#8807)`` -`4bde99f132 `_ 2020-03-23 ``Make airflow/providers pylint compatible (#7802)`` -`7e6372a681 `_ 2020-03-23 ``Add call to Super call in apache providers (#7820)`` -`97a429f9d0 `_ 2020-02-02 ``[AIRFLOW-6714] Remove magic comments about UTF-8 (#7338)`` -`0481b9a957 `_ 2020-01-12 ``[AIRFLOW-6539][AIP-21] Move Apache classes to providers.apache package (#7142)`` -================================================================================================= =========== ================================================================================== diff --git a/docs/apache-airflow-providers-apache-sqoop/index.rst b/docs/apache-airflow-providers-apache-sqoop/index.rst deleted file mode 100644 index 7a3a74514591a..0000000000000 --- a/docs/apache-airflow-providers-apache-sqoop/index.rst +++ /dev/null @@ -1,97 +0,0 @@ - .. Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - .. http://www.apache.org/licenses/LICENSE-2.0 - - .. Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - -``apache-airflow-providers-apache-sqoop`` -========================================= - - -.. toctree:: - :hidden: - :maxdepth: 1 - :caption: Basics - - Home - Changelog - Security - -.. toctree:: - :hidden: - :maxdepth: 1 - :caption: Guides - - Operators - - -.. toctree:: - :hidden: - :maxdepth: 1 - :caption: References - - Python API <_api/airflow/providers/apache/sqoop/index> - PyPI Repository - Installing from sources - -.. THE REMAINDER OF THE FILE IS AUTOMATICALLY GENERATED. IT WILL BE OVERWRITTEN AT RELEASE TIME! - - -.. toctree:: - :hidden: - :maxdepth: 1 - :caption: Commits - - Detailed list of commits - - -Package apache-airflow-providers-apache-sqoop ------------------------------------------------------- - -`Apache Sqoop `__ - - -Release: 4.2.1 - -Provider package ----------------- - -This is a provider package for ``apache.sqoop`` provider. All classes for this provider package -are in ``airflow.providers.apache.sqoop`` python package. - - .. warning:: - - This provider is not maintained anymore by the community. It has been removed and is not going to be - updated anymore. The removal was done according to the process described in - `Removing community providers `_ - - Feel free to contact Airflow Development Mailing List if you have any questions. - -Installation ------------- - -You can install this package on top of an existing Airflow 2 installation (see ``Requirements`` below) -for the minimum Airflow version supported) via -``pip install apache-airflow-providers-apache-sqoop`` - -Requirements ------------- - -The minimum Apache Airflow version supported by this provider package is ``2.6.0``. - -================== ================== -PIP package Version required -================== ================== -``apache-airflow`` ``>=2.6.0`` -================== ================== diff --git a/docs/apache-airflow-providers-apache-sqoop/installing-providers-from-sources.rst b/docs/apache-airflow-providers-apache-sqoop/installing-providers-from-sources.rst deleted file mode 100644 index b4e730f4ff21a..0000000000000 --- a/docs/apache-airflow-providers-apache-sqoop/installing-providers-from-sources.rst +++ /dev/null @@ -1,18 +0,0 @@ - .. Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - .. http://www.apache.org/licenses/LICENSE-2.0 - - .. Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - -.. include:: ../exts/includes/installing-providers-from-sources.rst diff --git a/docs/apache-airflow-providers-apache-sqoop/operators.rst b/docs/apache-airflow-providers-apache-sqoop/operators.rst deleted file mode 100644 index 817317526a198..0000000000000 --- a/docs/apache-airflow-providers-apache-sqoop/operators.rst +++ /dev/null @@ -1,38 +0,0 @@ - .. Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - .. http://www.apache.org/licenses/LICENSE-2.0 - - .. Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - -Apache Sqoop Operators -====================== - -Apache Sqoop is a tool designed to transfer data between Hadoop and relational databases. -You can use Sqoop to import data from a relational database management system (RDBMS) such as MySQL -or Oracle into the Hadoop Distributed File System (HDFS), transform the data in Hadoop MapReduce, -and then export the data back into an RDBMS. - -SqoopOperator -------------- - -Execute a Sqoop Job -^^^^^^^^^^^^^^^^^^^ - -The :class:`~airflow.providers.apache.sqoop.operators.sqoop.SqoopOperator` operator is used to -execute a sqoop job. - -Reference -^^^^^^^^^ - -For further information, look at `Sqoop User Guide `_. diff --git a/docs/apache-airflow-providers-apache-sqoop/security.rst b/docs/apache-airflow-providers-apache-sqoop/security.rst deleted file mode 100644 index afa13dac6fc9b..0000000000000 --- a/docs/apache-airflow-providers-apache-sqoop/security.rst +++ /dev/null @@ -1,18 +0,0 @@ - .. Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - .. http://www.apache.org/licenses/LICENSE-2.0 - - .. Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - -.. include:: ../exts/includes/security.rst diff --git a/docs/apache-airflow-providers-plexus/changelog.rst b/docs/apache-airflow-providers-plexus/changelog.rst deleted file mode 100644 index c4e0c709432e5..0000000000000 --- a/docs/apache-airflow-providers-plexus/changelog.rst +++ /dev/null @@ -1,25 +0,0 @@ - - .. Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - .. http://www.apache.org/licenses/LICENSE-2.0 - - .. Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - - .. NOTE! THIS FILE IS AUTOMATICALLY GENERATED AND WILL BE - OVERWRITTEN WHEN PREPARING PACKAGES. - - .. IF YOU WANT TO MODIFY THIS FILE, YOU SHOULD MODIFY THE TEMPLATE - `PROVIDER_CHANGELOG_TEMPLATE.rst.jinja2` IN the `dev/breeze/src/airflow_breeze/templates` DIRECTORY - -.. include:: ../../airflow/providers/plexus/CHANGELOG.rst diff --git a/docs/apache-airflow-providers-plexus/commits.rst b/docs/apache-airflow-providers-plexus/commits.rst deleted file mode 100644 index ea185d00dd28a..0000000000000 --- a/docs/apache-airflow-providers-plexus/commits.rst +++ /dev/null @@ -1,282 +0,0 @@ - - .. Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - .. http://www.apache.org/licenses/LICENSE-2.0 - - .. Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - - .. NOTE! THIS FILE IS AUTOMATICALLY GENERATED AND WILL BE - OVERWRITTEN WHEN PREPARING PACKAGES. - - .. IF YOU WANT TO MODIFY THIS FILE, YOU SHOULD MODIFY THE TEMPLATE - `PROVIDER_COMMITS_TEMPLATE.rst.jinja2` IN the `dev/breeze/src/airflow_breeze/templates` DIRECTORY - - .. THE REMAINDER OF THE FILE IS AUTOMATICALLY GENERATED. IT WILL BE OVERWRITTEN AT RELEASE TIME! - -Package apache-airflow-providers-plexus ------------------------------------------------------- - -`Plexus `__ - - -This is detailed commit list of changes for versions provider package: ``plexus``. -For high-level changelog, see :doc:`package information including changelog `. - - - -3.4.1 -..... - -Latest change: 2023-12-13 - -================================================================================================= =========== =================================================================== -Commit Committed Subject -================================================================================================= =========== =================================================================== -`97e8f58673 `_ 2023-12-13 ``Schedule plexus and apache.sqoop providers for removal (#36208)`` -================================================================================================= =========== =================================================================== - -3.4.0 -..... - -Latest change: 2023-12-08 - -================================================================================================= =========== ======================================================================= -Commit Committed Subject -================================================================================================= =========== ======================================================================= -`999b70178a `_ 2023-12-08 ``Prepare docs 1st wave of Providers December 2023 (#36112)`` -`d0918d77ee `_ 2023-12-07 ``Bump minimum Airflow version in providers to Airflow 2.6.0 (#36017)`` -`0b23d5601c `_ 2023-11-24 ``Prepare docs 2nd wave of Providers November 2023 (#35836)`` -`99534e47f3 `_ 2023-11-19 ``Use reproducible builds for provider packages (#35693)`` -`99df205f42 `_ 2023-11-16 ``Fix and reapply templates for provider documentation (#35686)`` -`1b059c57d6 `_ 2023-11-08 ``Prepare docs 1st wave of Providers November 2023 (#35537)`` -`d1c58d86de `_ 2023-10-28 ``Prepare docs 3rd wave of Providers October 2023 - FIX (#35233)`` -`3592ff4046 `_ 2023-10-28 ``Prepare docs 3rd wave of Providers October 2023 (#35187)`` -`dd7ba3cae1 `_ 2023-10-19 ``Pre-upgrade 'ruff==0.0.292' changes in providers (#35053)`` -================================================================================================= =========== ======================================================================= - -3.3.0 -..... - -Latest change: 2023-10-13 - -================================================================================================= =========== =============================================================== -Commit Committed Subject -================================================================================================= =========== =============================================================== -`e9987d5059 `_ 2023-10-13 ``Prepare docs 1st wave of Providers in October 2023 (#34916)`` -`0c8e30e43b `_ 2023-10-05 ``Bump min airflow version of providers (#34728)`` -================================================================================================= =========== =============================================================== - -3.2.2 -..... - -Latest change: 2023-08-26 - -================================================================================================= =========== ==================================================================== -Commit Committed Subject -================================================================================================= =========== ==================================================================== -`c077d19060 `_ 2023-08-26 ``Prepare docs for Aug 2023 3rd wave of Providers (#33730)`` -`1cdd82391e `_ 2023-08-21 ``Simplify conditions on len() in other providers (#33569)`` -`b5a4d36383 `_ 2023-08-11 ``Prepare docs for Aug 2023 2nd wave of Providers (#33291)`` -`225e3041d2 `_ 2023-07-06 ``Prepare docs for July 2023 wave of Providers (RC2) (#32381)`` -`e45bee8840 `_ 2023-07-05 ``D205 Support - Providers: Pagerduty to SMTP (inclusive) (#32358)`` -`3878fe6fab `_ 2023-07-05 ``Remove spurious headers for provider changelogs (#32373)`` -`cb4927a018 `_ 2023-07-05 ``Prepare docs for July 2023 wave of Providers (#32298)`` -`09d4718d3a `_ 2023-06-27 ``Improve provider documentation and README structure (#32125)`` -================================================================================================= =========== ==================================================================== - -3.2.1 -..... - -Latest change: 2023-06-20 - -================================================================================================= =========== ============================================================= -Commit Committed Subject -================================================================================================= =========== ============================================================= -`79bcc2e668 `_ 2023-06-20 ``Prepare RC1 docs for June 2023 wave of Providers (#32001)`` -`8b146152d6 `_ 2023-06-20 ``Add note about dropping Python 3.7 for providers (#32015)`` -`a59076eaee `_ 2023-06-02 ``Add D400 pydocstyle check - Providers (#31427)`` -================================================================================================= =========== ============================================================= - -3.2.0 -..... - -Latest change: 2023-05-19 - -================================================================================================= =========== ====================================================================================== -Commit Committed Subject -================================================================================================= =========== ====================================================================================== -`45548b9451 `_ 2023-05-19 ``Prepare RC2 docs for May 2023 wave of Providers (#31416)`` -`abea189022 `_ 2023-05-18 ``Use '__version__' in providers not 'version' (#31393)`` -`f5aed58d9f `_ 2023-05-18 ``Fixing circular import error in providers caused by airflow version check (#31379)`` -`d9ff55cf6d `_ 2023-05-16 ``Prepare docs for May 2023 wave of Providers (#31252)`` -`eef5bc7f16 `_ 2023-05-03 ``Add full automation for min Airflow version for providers (#30994)`` -`a7eb32a5b2 `_ 2023-04-30 ``Bump minimum Airflow version in providers (#30917)`` -`d23a3bbed8 `_ 2023-04-04 ``Add mechanism to suspend providers (#30422)`` -================================================================================================= =========== ====================================================================================== - -3.1.0 -..... - -Latest change: 2022-11-15 - -================================================================================================= =========== ==================================================================================== -Commit Committed Subject -================================================================================================= =========== ==================================================================================== -`12c3c39d1a `_ 2022-11-15 ``pRepare docs for November 2022 wave of Providers (#27613)`` -`78b8ea2f22 `_ 2022-10-24 ``Move min airflow version to 2.3.0 for all providers (#27196)`` -`2a34dc9e84 `_ 2022-10-23 ``Enable string normalization in python formatting - providers (#27205)`` -`f8db64c35c `_ 2022-09-28 ``Update docs for September Provider's release (#26731)`` -`06acf40a43 `_ 2022-09-13 ``Apply PEP-563 (Postponed Evaluation of Annotations) to non-core airflow (#26289)`` -`e5ac6c7cfb `_ 2022-08-10 ``Prepare docs for new providers release (August 2022) (#25618)`` -`d2459a241b `_ 2022-07-13 ``Add documentation for July 2022 Provider's release (#25030)`` -`0de31bd73a `_ 2022-06-29 ``Move provider dependencies to inside provider folders (#24672)`` -================================================================================================= =========== ==================================================================================== - -3.0.0 -..... - -Latest change: 2022-06-09 - -================================================================================================= =========== ================================================================================== -Commit Committed Subject -================================================================================================= =========== ================================================================================== -`dcdcf3a2b8 `_ 2022-06-09 ``Update release notes for RC2 release of Providers for May 2022 (#24307)`` -`717a7588bc `_ 2022-06-07 ``Update package description to remove double min-airflow specification (#24292)`` -`aeabe994b3 `_ 2022-06-07 ``Prepare docs for May 2022 provider's release (#24231)`` -`027b707d21 `_ 2022-06-05 ``Add explanatory note for contributors about updating Changelog (#24229)`` -`88258921d8 `_ 2022-06-03 ``Migrate Plexus example DAGs to new design #22457 (#24147)`` -================================================================================================= =========== ================================================================================== - -2.0.4 -..... - -Latest change: 2022-03-22 - -================================================================================================= =========== ============================================================== -Commit Committed Subject -================================================================================================= =========== ============================================================== -`d7dbfb7e26 `_ 2022-03-22 ``Add documentation for bugfix release of Providers (#22383)`` -================================================================================================= =========== ============================================================== - -2.0.3 -..... - -Latest change: 2022-03-14 - -================================================================================================= =========== ==================================================================== -Commit Committed Subject -================================================================================================= =========== ==================================================================== -`16adc035b1 `_ 2022-03-14 ``Add documentation for Classifier release for March 2022 (#22226)`` -================================================================================================= =========== ==================================================================== - -2.0.2 -..... - -Latest change: 2022-03-07 - -================================================================================================= =========== ====================================================================================== -Commit Committed Subject -================================================================================================= =========== ====================================================================================== -`f5b96315fe `_ 2022-03-07 ``Add documentation for Feb Providers release (#22056)`` -`d94fa37830 `_ 2022-02-08 ``Fixed changelog for January 2022 (delayed) provider's release (#21439)`` -`6c3a67d4fc `_ 2022-02-05 ``Add documentation for January 2021 providers release (#21257)`` -`602abe8394 `_ 2022-01-20 ``Remove ':type' lines now sphinx-autoapi supports typehints (#20951)`` -`f77417eb0d `_ 2021-12-31 ``Fix K8S changelog to be PyPI-compatible (#20614)`` -`97496ba2b4 `_ 2021-12-31 ``Update documentation for provider December 2021 release (#20523)`` -`853576d901 `_ 2021-11-30 ``Update documentation for November 2021 provider's release (#19882)`` -`d9567eb106 `_ 2021-10-29 ``Prepare documentation for October Provider's release (#19321)`` -`86a2a19ad2 `_ 2021-10-17 ``More f-strings (#18855)`` -`840ea3efb9 `_ 2021-09-30 ``Update documentation for September providers release (#18613)`` -`ef037e7021 `_ 2021-09-29 ``Static start_date and default arg cleanup for misc. provider example DAGs (#18597)`` -================================================================================================= =========== ====================================================================================== - -2.0.1 -..... - -Latest change: 2021-08-30 - -================================================================================================= =========== ============================================================================= -Commit Committed Subject -================================================================================================= =========== ============================================================================= -`0a68588479 `_ 2021-08-30 ``Add August 2021 Provider's documentation (#17890)`` -`87f408b1e7 `_ 2021-07-26 ``Prepares docs for Rc2 release of July providers (#17116)`` -`0dbd0f420c `_ 2021-07-26 ``Remove/refactor default_args pattern for miscellaneous providers (#16872)`` -================================================================================================= =========== ============================================================================= - -2.0.0 -..... - -Latest change: 2021-06-18 - -================================================================================================= =========== ======================================================================= -Commit Committed Subject -================================================================================================= =========== ======================================================================= -`bbc627a3da `_ 2021-06-18 ``Prepares documentation for rc2 release of Providers (#16501)`` -`cbf8001d76 `_ 2021-06-16 ``Synchronizes updated changelog after buggfix release (#16464)`` -`1fba5402bb `_ 2021-06-15 ``More documentation update for June providers release (#16405)`` -`9c94b72d44 `_ 2021-06-07 ``Updated documentation for June 2021 provider release (#16294)`` -`5dd0802799 `_ 2021-05-24 ``Removes arrow higher limits for plexus provider (#16026)`` -`37681bca00 `_ 2021-05-07 ``Auto-apply apply_default decorator (#15667)`` -`807ad32ce5 `_ 2021-05-01 ``Prepares provider release after PIP 21 compatibility (#15576)`` -`40a2476a5d `_ 2021-04-28 ``Adds interactivity when generating provider documentation. (#15518)`` -`68e4c4dcb0 `_ 2021-03-20 ``Remove Backport Providers (#14886)`` -`6e6526a0f6 `_ 2021-03-13 ``Update documentation for broken package releases (#14734)`` -================================================================================================= =========== ======================================================================= - -1.0.1 -..... - -Latest change: 2021-02-04 - -================================================================================================= =========== ======================================================== -Commit Committed Subject -================================================================================================= =========== ======================================================== -`88bdcfa0df `_ 2021-02-04 ``Prepare to release a new wave of providers. (#14013)`` -`ac2f72c98d `_ 2021-02-01 ``Implement provider versioning tools (#13767)`` -`a9ac2b040b `_ 2021-01-23 ``Switch to f-strings using flynt. (#13732)`` -`3fd5ef3555 `_ 2021-01-21 ``Add missing logos for integrations (#13717)`` -`295d66f914 `_ 2020-12-30 ``Fix Grammar in PIP warning (#13380)`` -`6cf76d7ac0 `_ 2020-12-18 ``Fix typo in pip upgrade command :( (#13148)`` -================================================================================================= =========== ======================================================== - -1.0.0 -..... - -Latest change: 2020-12-09 - -================================================================================================= =========== ================================================================================== -Commit Committed Subject -================================================================================================= =========== ================================================================================== -`32971a1a2d `_ 2020-12-09 ``Updates providers versions to 1.0.0 (#12955)`` -`b40dffa085 `_ 2020-12-08 ``Rename remaing modules to match AIP-21 (#12917)`` -`c34ef853c8 `_ 2020-11-20 ``Separate out documentation building per provider (#12444)`` -`0080354502 `_ 2020-11-18 ``Update provider READMEs for 1.0.0b2 batch release (#12449)`` -`ae7cb4a1e2 `_ 2020-11-17 ``Update wrong commit hash in backport provider changes (#12390)`` -`6889a333cf `_ 2020-11-15 ``Improvements for operators and hooks ref docs (#12366)`` -`7825e8f590 `_ 2020-11-13 ``Docs installation improvements (#12304)`` -`85a18e13d9 `_ 2020-11-09 ``Point at pypi project pages for cross-dependency of provider packages (#12212)`` -`59eb5de78c `_ 2020-11-09 ``Update provider READMEs for up-coming 1.0.0beta1 releases (#12206)`` -`b2a28d1590 `_ 2020-11-09 ``Moves provider packages scripts to dev (#12082)`` -`4e8f9cc8d0 `_ 2020-11-03 ``Enable Black - Python Auto Formmatter (#9550)`` -`8c42cf1b00 `_ 2020-11-03 ``Use PyUpgrade to use Python 3.6 features (#11447)`` -`5a439e84eb `_ 2020-10-26 ``Prepare providers release 0.0.2a1 (#11855)`` -`872b1566a1 `_ 2020-10-25 ``Generated backport providers readmes/setup for 2020.10.29 (#11826)`` -`56d72e3ff8 `_ 2020-10-24 ``Replace non-empty sets with set literals (#11810)`` -`16e7129719 `_ 2020-10-13 ``Added support for provider packages for Airflow 2.0 (#11487)`` -`0a0e1af800 `_ 2020-10-03 ``Fix Broken Markdown links in Providers README TOC (#11249)`` -`ca4238eb4d `_ 2020-10-02 ``Fixed month in backport packages to October (#11242)`` -`5220e4c384 `_ 2020-10-02 ``Prepare Backport release 2020.09.07 (#11238)`` -`0161b5ea2b `_ 2020-09-26 ``Increasing type coverage for multiple provider (#11159)`` -`b9dc3c51ba `_ 2020-09-10 ``Added Plexus as an Airflow provider (#10591)`` -================================================================================================= =========== ================================================================================== diff --git a/docs/apache-airflow-providers-plexus/index.rst b/docs/apache-airflow-providers-plexus/index.rst deleted file mode 100644 index f710b1ab28d94..0000000000000 --- a/docs/apache-airflow-providers-plexus/index.rst +++ /dev/null @@ -1,105 +0,0 @@ - - .. Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - .. http://www.apache.org/licenses/LICENSE-2.0 - - .. Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - -``apache-airflow-providers-plexus`` -=================================== - - -.. toctree:: - :hidden: - :maxdepth: 1 - :caption: Basics - - Home - Changelog - Security - -.. toctree:: - :hidden: - :maxdepth: 1 - :caption: References - - Python API <_api/airflow/providers/plexus/index> - -.. toctree:: - :hidden: - :maxdepth: 1 - :caption: System tests - - System Tests <_api/tests/system/providers/plexus/index> - -.. toctree:: - :hidden: - :maxdepth: 1 - :caption: Resources - - Example DAGs - PyPI Repository - Installing from sources - -.. THE REMAINDER OF THE FILE IS AUTOMATICALLY GENERATED. IT WILL BE OVERWRITTEN AT RELEASE TIME! - - -.. toctree:: - :hidden: - :maxdepth: 1 - :caption: Commits - - Detailed list of commits - - -Package apache-airflow-providers-plexus ------------------------------------------------------- - -`Plexus `__ - - -Release: 3.4.1 - -Provider package ----------------- - -This is a provider package for ``plexus`` provider. All classes for this provider package -are in ``airflow.providers.plexus`` python package. - - .. warning:: - - This provider is not maintained anymore by the community. It has been removed and is not going to be - updated anymore. The removal was done according to the process described in - `Removing community providers `_ - - Feel free to contact Airflow Development Mailing List if you have any questions. - -Installation ------------- - -You can install this package on top of an existing Airflow 2 installation (see ``Requirements`` below) -for the minimum Airflow version supported) via -``pip install apache-airflow-providers-plexus`` - -Requirements ------------- - -The minimum Apache Airflow version supported by this provider package is ``2.6.0``. - -================== ================== -PIP package Version required -================== ================== -``apache-airflow`` ``>=2.6.0`` -``arrow`` ``>=0.16.0`` -================== ================== diff --git a/docs/apache-airflow-providers-plexus/installing-providers-from-sources.rst b/docs/apache-airflow-providers-plexus/installing-providers-from-sources.rst deleted file mode 100644 index b4e730f4ff21a..0000000000000 --- a/docs/apache-airflow-providers-plexus/installing-providers-from-sources.rst +++ /dev/null @@ -1,18 +0,0 @@ - .. Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - .. http://www.apache.org/licenses/LICENSE-2.0 - - .. Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - -.. include:: ../exts/includes/installing-providers-from-sources.rst diff --git a/docs/apache-airflow-providers-plexus/security.rst b/docs/apache-airflow-providers-plexus/security.rst deleted file mode 100644 index afa13dac6fc9b..0000000000000 --- a/docs/apache-airflow-providers-plexus/security.rst +++ /dev/null @@ -1,18 +0,0 @@ - .. Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - .. http://www.apache.org/licenses/LICENSE-2.0 - - .. Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - -.. include:: ../exts/includes/security.rst diff --git a/docs/integration-logos/apache/sqoop.png b/docs/integration-logos/apache/sqoop.png deleted file mode 100644 index b4bb262a604b59fc91d44d2aa16887b8fb7f86a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42874 zcmX_n1yoe;7ws^>00K&PH`3kREge$QjYyY(ba!`mO9%)f-Q5ie64D?g@b3Kn?>*LH z0keiXH_o@uK6~#k@|~(2`YWPWAP@*$L0(z|1VU&4f#A52A;2rb{G(;S4+K|91ubOY z%MaNi0{9!{qrAQ=2!x9Q`-bBxW?ceaBy^L}bJKLTa`XJ~$r9x0>B(yAWbbPJ;iDz1 z^C#=HO^5nX){E1h~!-H@)L4YfEWS#G*K7@_0yy z1zj+%?)6?SgmMW#TkNap<< z)9A3)H#;X6v6Gzff)Rv2eKd5KAGZC+GZ2atKxYt;X$(>U2L&>LSVGVP=#=oz(G8n& zAm%ehD@Fx&jB40Ac-o3;Rr$*nmPYqNcF#?293knU^3yk5OPVU<_eS%bQrR`-jXfa$ z%)m$tZgoyI@QgGF8$}osl%Xyk=*#W~1_dU7&Ch+=PY_(lX=W)L;HF2!={Z^h8$y4O zqimBZ9y-UK5nt*2%o%*%dBJ8HJ=l%T6Eyz4S+5Z58D8=o;mTNJnhfF3#I{I;I*7R28Ra?e zE5gMvhsXfm<=EmYIfO~!f}r#)81dTFloM(~B|avtg60-<&S%zzwx1q(-uCs>$I@N< zXJ=-GoO+n1ZIegRL3v-sJq9Q|0VDZG7aRN|R)d^uw0YMy6@vNmun=Lbl=`Rfl+de< zPPNTX5wA&J=f=}Wga>+a!Y9A9VDPLnpzq#-x=_lN2>)TpJ1CcLu(@fmY~*BS;m|&Y z5=k2TZoig5aG^mUrz8kxpLre^&J5gDp6^Fch`G&#Y)*YS=Tlg&2r_Y~j_Asd%)+rO zVRS|(t5XU=>2lt$qOdxr!`KA>bOdkGoHLE@;^Oc15M8ltrhQwL zRZ9K54da!sZ|71O6w6>M4hOfa9KEZJ13kn!_~mK&R9>PUtcUbNO|z$!*LdU3r;JGh zrxUj5jk>nvhOp)?Kyk$XwwwrA$2`z{;1iA`4hdCk0vv95x|0rp$NApdJjgZUP&Lpf zvu*%Kl24pif7H5g#sGbl%Mmv=Hk26ptY2m`HI?B)v5Y&;d zht``+Q&(jxEu!d+pJ)$GGspd?g393h-j&%mVZ#fGFVQ~jm{@n<$q+hirWV4NC{0rI zqOto1CAOR1AR^ZXH-^#HE5y4F2w8D^Sa;CKaP+O|be3DZrKTh2O1C`KbB190gGQ<| z1&;8{laC&oi_rc+4SmO5`LJhbfipJlH|;`8vZuUA`S@*h;mabvCaNCqg^ZMM357jK z3!7cU)6Cua3hsnkDs^SeB2{Ysmh0%uVE5OweaAt+AlMyE1)hpsOB+dTVt1cs52)a#e&wvEmmzR<9bwX zj)``ldj87pZewBB^(%UXvSzqCjW_=h(WA1T=TNvzrM1z8X^W8~ zf+W!kyXqPb^(h3iBNXR-T^Qy=BxyZUzJ~nukPyp9$SowpLVrUiAGjKM*d5}mZ^kV) zq5Vf2)*bY-?MlHaL~!i|05fZp8eUO z<1v09Z{1P0Q{V*l{DFTHs}T8xf~Jn76dR!#egG{!vkixy`?dv5f_Z$u8v{XZN0ATa79{x>%4ATw`K4AuLf_@d}gv+gs zWwly#kkMBn)&yu~)#OS)?fQYIxh!{9PS+LsM5LM1B($Ov?H+6^X)A?s6^va z`1IG5dH1$8mcc^`bX$SvywDTB;wXvoR#+Z$<}5xhK`69u%681X!Z zHT4mwD##i0oR#3c_%gTvdmOlcAX!_9WQ@q3^l_v?a4 z<~=e54wR5c(@j$7Gr`^X1aCHhpV)d`cv9YAJeN^S5^-0xU0Fk!(cpM<^O+FMjpXGT zMHgyOyw~|7SD-4ggM>j@C{zclKT!Vo)ArN9ky~rfbmnEjn2Tfqh=z{C9EWJ3Lzmc024Eo`jVWb7!8zDa= zxPL>BiHF-xzP+Qr9jY1gOV7R(i%d~Q1bzi`W2jh24D=hK4NBADV825fq``=S%Sv(F zdjE`lV%kehbRk0Ru4jPvviBxGiH8T<@cXWYnIUokd*7Y|TmvQ)b^KowMVA8O6U&b3 zcM%d5BA|iF3~{iX3dsHpb{`4H++k-Y4-1+ZBz$TTS^j$InRLIukebNHr60W;Gpl#b z0N0%qw95QI)s8D&|K);H>RBpqGYrSsUb1^ZbNZVtf9r9Y3_O1D$LP`??4rea4;QN; z5}v|$BRR9$?)0xH>yg++np59p{Rluh2SbSw572YZ%joVVb~v>9)-W!*af@*qAv=9-p~K1R_SDtJ*+@ZrcF+D)se%uHzO zyK(op;4me5v;Q+8DAx{tF6A8A)-T+rh?_H|ZSk{I(;W)IUZ!uAgl(V+;?H`}ORC{l z%QxK^0R4|a5pvll5W#GZ~OC) zjQ2wzZOdO=*%w5C?r6qr8TsUW4_jH)S)Q+bNu_?lZd1l<>$2iZ4)pDxAmveU#tr3m zwp_Ne(~L$xdq`b9!%HEv`Xi5`Isw!I)s~m*Doeji4 zm;lN0`Z?^II`(Cm&ekO#r)KbX**&mM1!YQ`dsi1IsUCsdg@EmelHdgG^DA$?bY^=W zfu-y+pWPq9l=u7x8LxZYKuE8*7HpBYw!(!^Sl#C-`Mh@*Oe9Bdu<`hL;Dzd10}lwT zjK@OUh1%@dEPT(>Gi!sKZLwk-z7i*GVoNTzXmg8LzyA<*DKLuFVp9CI-Im|e27ul3 z0A)S+X~FjX4#Srif{gvv3;T}#3u!-Lf>MG_;_Wv-{Cw>kmimfI6>2W^x!!}5d4hZ( zM`34N*#z6MrZtJ%Xkf9U!*1p2(NQM-|S zvgMnSI7VEX%P0|DE0R;F%g6#=>FyiG7jf^x@!v|&5F;!22}ctCLF`7xAG9^)bP{Ly zqRM@Q*8uV4SO=d=sG3B>{=zl#=@whXN@CwcYy^ppn@Zfe_FWCxnVt-@YqXM97_T^6hAedGSzcQuW zb{qbQa2Y3W+pjWZ8<6&-CGk{cRS*8P@lMCydBy%az$HW`#L4O(WGN~g!;M}^kcTz|71B%d|kWBk^h z-C&^-sdTL(tSGNcUw|e}k2W^72=^Y^F2K`zm1yWs!D9#9q&A@~xPtx_CUv6iEo}AW z+IamHPJ4y)=A|*?)are_a_M?q@MrMb?E^)wT9v!Ly~#aYhaVJb_UBqwb>w;FvDa^# z9YUv9quS=?VqJ+Ib9>6Js+M%{Pu5SLSvY*h_X++mdb-b&cW+Iurp!2w_THbOm~8$N zp**JsVds1&`aTpw$1bP3{Bb_);lbzd&rOrA!WCm@r;G_Y{Er{mCUWFt92nHObt+n+ zCa#x)idG9tOVQ=!qMlI*8|-NLEAK%yrdT^}&-*Rke9SGwo1|^{4t!`8<~i8S3GkZp zz+=@|sbeok=k6)$bpT(g5!t^dj`$dwDvTzqzFuo2tkJ#XyVmtn4=)#?fW(xI;87qz z+XuIx8vEJO<#)YhJ!Vg!b`zb}!RgE~VaC}!en-$V(X|{T%_YyUkcj5<;x=(}7H$5k zpyWTBK9f);g@9l0J@&Q!@HEr1>w{3k3XvwW$C0`2+D=kc>IMC3V^DZPzShcIzGlyN z=2$4wlK8z>d~YSuD5qcZ7lD043R?Ku*orG6El7aVzfXNCW?!ayO0%QLhi&K6LW4Ld zhl*>}83g_b#I`(h(xFc(MdYn${-YS->U+bi-aRUNL#+6iK1B{$bE%a7Yk!@QtSpo| zvMRcFq}W#c?rzB_N#gO%O8*#^;_(?*MqoTk^9Q`?I7fbHM$r4@?sFDu?l5Xt})j`o4*mp&`as#F0}4&=%e5#xS}_DmuBoDSvk1R<51|k_2fSxrZhA%cY*jo;v7NNVW<#@&kh`0T-%n+hu04sUQ0W)F8CGLXBf>9lp1ph{(f=$R$ z=R1Q8o1^{u`~}=C^HtgL0H5W85_LBaV!I4E9g86o7cYKPpp*J&q7S4i78mILD+h zNz7TmaiQwjko^VL`L8UE{KeW@dmp_c;GB?l616^CYl*Nll`#|X$06f?v29I#CRI*2 z{5NTKbCzh-#UzC!uhJ8bywxbghfPEC`OUt}p^Fid+*QwaKBAhWZ5f0Zp4^ZN@VDy@ zuluMrM`jhm9mu2NCgOQIiF^-X!I0jr%T2;?);lSNdV2>SJQP8sxUU)%kn=UIpwEu1 zf2q|WDRoss>Nc0g?5|se__$h8C3+V0g;!6V{YFmz6)OM=gL|BkFG6H<=JN09x|&qU z?WoqM;m6m%bYwAw=+HT*5qHn%{8j87nOVyHE(Kl}HAhzTM{X>j^$(|Z)2x-J#v9Zbq}K4Zw<)sl z=F5O@rMK=Hl)kOl(3xbgMCv)lhN6}!_mTL@qd_bT9>(aiZ>S^Js=k!S#I8uz* z!vb|?s`h%tW`d6-7JIzbzJyEcl30o2>O4Dn1_iNF8RneJWc?YpFUM>S)c)SuQSsY+ z$%rDy%=Ji>PI&z35NUol;y;wTaq!$Qx4O;2;BKj<`d5VQ&M2h|LyMyse2jP2*2a+U z63k~x{>wM=LtSykLay;Rd0sc^{3iyoP(EdPN;i0JwjESC*n^iCeGkv&78(A>`AFGb zqTTo5f%?6+Gt=)0hu8l4HixJn!J$=xt0}YXM6igvimUdOs?gQjzu7B9cWHxq7LRpI zMLkXZ8;6bWsfxYBuRk)XEUFfz+>vEWwLP}8!>gEEJP#Cmv!|Nnl=FNPB)B#3c_(=t z<2IJ89dKxL)#^Ru;s3R;Om+UuTlSO@d8+U` z+Qf7G-S4Y#C4Fu$UT6>ZoM(`N7M=f?APIvKVbOnW)rJu+d?n*AEnYj5NLjOlKgzQi zEqbA(XQCg;IIfi|dqHzQ&q*`Y?TUVO(pnjF&Kc{b=a@D{_uxJ?(=n)2C-2mhQ~O^J zeYGTvVT59;wuXi6FRqb?U+bNuY&?YAm;XTvPg^=^82bcV+mZ2{XW3kBRD+ zf)4G>o~vRjU(~E~T01x|%VGss#tso{-bu-?8B~~{PcP^^&_AU+1>%*wy7tu~58vUk z-0{0D@#ow60ri_xpvh0oSeUml*N=j;tPT2>(7rav@`tTa+`mZ}OWWj2ETg{W?x$Pj zE>!4>&L#WIm)(=y)j@&S4wX_yfvW#0030AW;Fjqp-0AnW)ocvrL@AVxtSS`6e};yf zt=zc!nQBlv$v;qeR_Fg*>BC3&qgC-Dh{1ML8olOIXs_JBH!ggx<*K((shD11>QNg{ zhn7*x27i|eSh$%y<$J#GLelj3r6rqYi(dGpm+HQtIkFgozL`qMu7~#ye}T;e_h~A}-d=oY|KaHVw26 z=EFB)7P>~G)5(6D`qDQ2-P+3B&$v2*x!UiGZP zVckMb)Y9S{rn)Kc26|WBGtUo!f73I`&Xh>}rySzoj+}8_r3T)dIVmUf`)T$rxykV| zzugA_U!VIF_UJ+lLgrcg`!Yjp(OT1X z6a$U-v;P-R{hmb#Sz3F*AE!ehtzz9rFS8&!D`7Kt$--!in0xB8WxcGVJ($R6pJS{h zoxV1^oH;$AeB0i5g@0u2{+D>&-4iL0)0cBrECk9}rE3|6Mn)J?knL!@DR!5cOIE#6 zXW(ejlR1+W%sqSLNYd4q$(=*S7XR-@nV;foCKL51ZILO`)=z%1L9A)JDS!3Ho^7lh zi}hjBdm7dfyLmTh`2xY$_Tv);d`llBt4S8qR2lmz3M|hcfvr!RgZ5Z{D!!JQ)##;+ zkkpp>Njix)2EJ8lwv6`%3)R+lsoeQZons5+l>3alCD9#$V+-I&E@74*&Qb+GMnfba zo0vpMKlfDFmVw2ctC*#>vQc~U0@+Tk*$0%lb3FrcS97_A*$Lj1abjlBScHA+AFJ~&)yu)g*r?oo@|L@hUSgpx%7K=P)t z{?sL|i{EKJH0Wjp9a#QHDn(Js$pa{x8s5t z>;&(XGvF4G%v16t+ z>w@rwVr`z=^QM-esoQd2yTg6!J!;p1m}Nl+9B~tGPpVYzw-gscUTugxID=BMCpa3i z!|GHY`fk^N>ZR?PSrll&;+coC9SuY{Oi6yaQDWs0PegyfAg}E_Z-OLMQ z`b7!NdK-M%g1AsKs}>U<1bi9N*jQ~Lb)9$lkyzxQeJ+l5*Fq}fDDl5$M82cmTc!|9 z5u%wb_`6ymxNoSF(+$-53tWBX3o*vb5*5N0a%uhySKY9{e#NhuB)=tNY<#SD)}p8!&^8*s#P`jGjCU1W)7Tfn$S%zTMj2-s22Am~eBDm( z9imwLW4=HHY`Z+y*0Z>2VSKmScMaHcut@b-rz5Z6@S7q<-=x!1T z8>X+ziZ>q8NC%Xr@H@5#Of%;1*;am!K-{phl%&L_oxR`XZpp~``Nt>el_J-bh+Y4~ z!Mn7IC!(7<^F?yS9d|~7Y2%gaDwWb$ACG^2oF4RXE{;$v^`5sIe3Am z>6j>(zizy69m5jJs9)N}!>z9P>9-6+Ymt`ht%j}h6YK*om-Yh_H z-8wy+x3eCZ+JdULsqH?bl!U1yBm!v_-r_2J-zkwhHc6tUv@MLh?&Nrceqzcvr8a37 zwXB;7Aj6zJmQGe+aN}3saE}WvS0Z0v_HHbwDfQruAZxt~`CN=zp^1Lys`;O@R?dd7 zgQFCQT%TOxx|_Ol1JwGjKv)BGk-4-Y%J^upC$xtLnE;A9ps}`nCPE@lZ<`L3u0MWF zNinH(mp*X9pfrL`Yp-Znw;8z<=zx1T8&gS$h;8i;g6~MfuGr6ITWh+RX3{YIrsdrW zZD2DCEmaq-1by3M@6?)Rrdj{^{&YHziW(@x;VoQYcxJu)L-uELXUizkKL?4u(8sK8 z)AurSuDoew{Qt3+xAXY=dCG%&Nkr8~bsoF1#-%JRxL<5212-o2O-+f9N!|(ZDVrtm z;kD0QHc%Jo;74DXKM%$`R4I>eluoqFg~-N3|J)K0c})JlEPyBobkn#!myDZ;2WV!T zR_8sD^l-{e3H$j;0u>%>R)s;-q4<*16L`Ei4$8R0QE`N0ZL0=rtQH$U$7I%1g*8OY>C`Xk4BNA#DJ3?t#m?Bb=lcaUHMtfqZbrqY@m+LM7_Zq=DQ?%hZ zc^*u6U{P*dfWfasgkGiwU`vDje7c$#KUh0ParvolW#GIbqc0fs!#jc>JH}2`LH$#$ zJfaOF)dijS?+NE7psH}9`X}q`bTI1#Z`1_dFYKPVN+tM`4W?$?MsE&*QZgrg1ilWs z0xpsEuXY(4Up5`OC~e5!jn=3^Rp6Q(en&3m^%rbmvTrI2W9PBTms<(>{}HanYZx_v zPo+6*!^{4{dgSMO%cS)ZJ5HFRaZST4@(m8eoHbqhBu@G=9&^;PAR|KFnPl~t&3@iQ zoKYK>wigDICa#a8BiZ}>@DzjZks?Qj`+$#MuC4lJ=MbNEOA}QXijkjsE~B%myE1G!#9<2Qpg5?pkm0wrc2tZrPblZ{5(su? zUsH>PGr}+;xeX<6>l7aNfOgscWeMJ|rG?vTHZ~7+UV3+(eHp(R1-faqi}di*sq#2u zCb9L~S2fECa2h>ch2`MS{VBt_*H(UF`h-pmZJYxUO=+eW{crS+Dy8H(=H4VfpGyJd zN5JtBX9ophr)=e=v+wdQR&$aCwp32@c1=LnB23;92i-rH$h}*9qVoO!Bjz3JnCz3SIQhuNoQ%{Dtj{V=(&AD_I zlX<3~!)s*kX_P-4g~+T{Q-?Dii|1kNX!b7G?m1H;Sj`sNK4V6`q#CHE`F)JDni;Pv zETf)}kZfW})4Hls=G#~rN~pMNP@drXC(i^Cm>E_p^NBHoY23PS%dK1F5UXWO|DK8~ z+rI3T3U@}X=(u=~XHruOnSajj)s3qGA(8X@bM{36aB?|Q1_k9INy`ky zBf2tCiV~dY4~N%~2g;9$f}&ZSka$cs_>Vc6Uf`+t$85Yc!$s3mv@2-wAmP=NVf7l1&603_;_XHX6`cC2{<}rfY$) zEj8ZH)sP&R6(V+-veB}~4e>T>@zh^osrDFsD~tYD#*t>9(Q21)I`X4cFTQP4C+`3m z%)TlS0K<@ezT`(@-`YOuP!qd@(~{^3h00`1I^TCwPa{GjXx54$m$qx975gidvV)I> z+bJ0V7rgILHN$FPq=1S$@Xj8Xl`x2fL`9tUP?*}*w6o3DVb3k!1)tnye!cvuW6=dTurt;4o|PHlwEk|^U;V_#KXpok_YfzWXuKfr zv`jC^1Iq5NkO2Ml(^VXMhfHpHFC)d*6$-)BawA#q3afQxRagys7_aW6JKv9Hh?1FU z!;FH$NZc~~dIBY(tr^2KbL0qW2q4ijKfuIE|-2VIs;vZ@?l8mLLr zSL)En7PLp!bE3-&yvUNC8@HK|@K{QV7M_7>18)T#VHapF?53LO04|1kuLlRdsiwaj z65YxL_NF#ZnTHGG_WVH*|a#q*o}{oZ$VSp$oa}oyN&Op zhArZ+jK+pv*IX__MLSA(5H^>zz(wJ(DeP0riGZsxOACHbKMSanx$MY7cJgGLqSu4Y zhglypEr~__3oBA!JGOkb{;~TZwPY(BQudK=T<_ zu2+Y6U`3wM`HiiTGN=%S0=M7>RL4QsEfb#8xZ3lN++(qXpr1mG`P@9Pu64dIV`jT3 z?`i=k)#?)3uWi{DB&L0Dk_p_Rb6FU|{NbugD76k)lN?P&SCxgiwvw;;jQBM0&_5*( z5Eo&F2H{5@)J?Y0v5f7N4O+7Npul_?ls*{L3aU8(jGpQf8Ag3enBpDz==2R~n+qV` z>mpAp#h+`)#QE#FiE1c!x3U}tUnp%2_oUCjmN@1KZ9HB`TqZVebI#p-G_AE^s!^xX zm`9$Csi62o8H5b8)LJVyWvy@YzLbwMAFSXx8BUm|b)sWRp0_OFLZ85w4 zBmP|w=qX*V*rL0>`BH3f(LX*I?ZbGQoqtW%OK!Bz_5Ng?&{)S88*DebZKJ)2C5Tm0 z&-?Ew>DmyAlD9cpSGipqSYF|gLWVAo4o)LEkDcIpQq9s}^<_4w7pe){%ph(2+P_4>Qd>>W>k& z0{UvrY3F`h%-oj}wol0$JdFF?leT~8#bcpQH9uz!&ySVyKZNk<+!~qvC5ScOmUG0l z6F#*`tw9T?Z3jcc@n-$rw{O@h0XD#&DkV5YGM14gePIbG8C@?QYOEElb?A$&FJRx9 zB;oEHi(fZn>X|(h0*$_6V_mM*%|l;Pp!TN0 zBYGIOr@7ko$0jPjmI+$M#V6J|L<`#9^(LG1FUsj0I4~xrl-5T0nueR^X(z{^Li5k9 zGxjSJz=!Ce$-uUgEc9RZRsDw>=u8w#yk4n}&GzPf27e_31cP54vpXheC>Dte&I`JR zCp`YQqiI-EGrykiKB3ZteM;paYf(@=z37i(FZs7nLeH#McB z6wr z9G=Pe)?H%k0-z?E%gSXTJp@k3cpSQpNQ^Q{?5=JZFKM=1@WPcJ&XMXg6wJbmaAH_ceIHjupw7?svU~wY? z$v!~mAa7o@9O=D*z@gH4a9Ng_lHrQ+%KVYIe$?dvvao+2UtM6Nj4k*trqfaq;CD;~ zjmnn7eqy5wOK%@5KM4~`OW&%P1pHblb^+I1-tX?IkSCRJ5l*8cVm&p~2zdoL^yA$GPt3$6am6)227qkByLVH>)NluOn^n zr(RJ#tj^q6u73Qd0O+aDh8a#92-rj%=4%3ul&F1IM&O04dFDsCB2KgC4_}Iw3jnzW zhLsryQ*^!YfU5km{I^K9a8%nhx()A;NrHa>7z(g=lG@q+Nwri;ucY49SgHkk2NhDt z!l67tnwQ-E?00bE@rMyCWg%}!XOTs~^w94N13Ivw3FI&i)MiwMh#G0<%q*S)z1RC= zRmjJfL;^ZR8vhSBrF!@ISirC(|GSw*g~1|kqxxI%X6vemBeSFQG4}T!@VRAQP)uj? zbHhb3S=4Ue-=;DaW_5Ve<{eY4HZMT#Z0M=l`Mv5p8;d~V#Ginnsw3^>RsbX-Yra)^ zTMOpmgG{{`kg-{B0j~O~phmqImcx4d+Wnd-83N}(8(Y2GJxtw-TNWelbX1FUo>WLt zlmK%UGLHoS#F)i+i=!M5`ooDe1XYDB425j6w}@( zl{Vr!OY+U`Vl70g5=Qmcl*wAvAv6p~W|`}i$0cqSth~-!gdQTy1JGi?0d(4VO()uF zG*xKMSl|!RJK?ao>xhNHhD@DBB4+BaoyZMkuhjvOEzSHnMc%^-gO1D%;cz&qY^(@M zf@@Qld8)d=o8(;-bU1rrAT@3Rn04nJ7I~O#@p^|YRWVo`0X1q%doqKnAJ`Rsv}JwE zqZWY|p4ol^<$vIgL!4032_ep@P;ikwj5_)*owxRmt<+E^kdF2x5LrfcH{;+8@$lJp zWm;%-PQw>7;*=e$56S~9cH?q84OzOg(P_BZ(r^_1dC4p%Izj3~)V39!W#nBWLcu_z z2SE@dTW_u!@u%jNzIX5FNgPfY10D>jzkF=FkniBzd1GQ8AT!AXxIkD>U*Vve5Gg*C zAnet*RA)i}Jn8|0;uG5Eq~+~Flp35o?@Da5~ z2i?n>(YQ|AY{{S1$ilAL=C*JT-UR_FS!H}nQ zDfJed5x#Di7xX)-vjv;@H#d>}WH|%DLC-Y3PdXN}!w32jWH;M&{Lkxyv!9Gdvar%S zt}+;L-Ritlq812yp#7_x0b3fd&FXRQc*6{A) zo^a8P@|n(rsiSp49B^V<(YjIkEX`?dxSsY4Xq^Av{nSL`S0~El4H_$(h3P`JHr;6kMwSHOPO@Rck11hree|SN!TA!Pt)%B!!_R{nO694m}R|E{G5B9ri1@aUj8paPBVqGvglr71S=-DBxjTs7C(WY1p{`w1xZXm*D0m@>MHIvCQpJHmEiF- zTiNl+Xs_zq03%LKgP<)&j1u1bpl-PofcYexB_cGT**OC~*9x{)OE~-ONdBkQgI1ZO_O@E8rolKO983Oz zv20Nq^eX~(w=UH$Q@39cdQP;AInit0JZ*K&&-rd~so1fG?ZAuqd*C}d0&t3UXc0U6?ZVInUz%zVvl zVN~>6Y$}H%AcppT8h&HxpbtHA*)w{xEgt+~sggBBi%rr%u9@;KU&HVN>f0(~DDpOcbYZNcH2}pJH5h2{^Ie*E6GPVCHmVfp3i5W$a1!aPwc? z5{5o%qlP^XI)amp*0yT7^#gec0bthye>e&UwxjQJs7)|&QOUy6U6g++<7m$ZZ)$Pb zxRNw41G_k~QB)Q-Q|*4qaIEF!zfMKQln3h>Vpb0fkwq54KV+8EWBM_!QtGI@y|&6467K<4h>89p$?8;PM~&(C10+*|+LKC@jjYTM3Qv%N zMhVtj=ADJ&y6oq(3kU-NhR%wFgU%;4pJry51_w;nt3_rw!tVY(@72^EIVy5M@C zSJ3Rg*>g|BZs<%oDWToJU>eB;2nD| z`!({Bk_6XDCBSf^B$`w*2J_U>E0AsG6Gpa~q(l$P#D&em(0%&-;)$A@<)$&V|T0dd_r;Cx$e) zg@(ux4#)#;;fkE0r5?>Y5@^iM@4hppCej=_`=E)3|7bY0thR&ytDF2?adBSxfT+A4 z^r7yaImK$)(#7O19Ei{B&`C0lCeShw^KrTkCBPFP`WKy{k}qZ%L$d%k?|nl1!aEE~ z+K{eyA|e{HStuL3yn)6%c(nVl5){;&+5U*QPpJm66kpP?ZFy8A^nfMVzqr&bpoIR6 zx=u^l*Ys#>Zgtp>g&cu+8h^%n_6ex4kq7_?pES-9W%0WRhqH{bVB?u7rw{yd zIf{_s8yIL=yb6+e>(7Wh=mC$?;cgnZJgnRL)~mp`{D7j@ley$x54ld^q3_L#PDT+L zCW=dX;S#*bvenRa_@Nl#Bf#N&TIcIzwqpb`PHsU`-PS%5P&a-K!k^jV;?oG#4BCU?x0{Yn3Ms67nS{|ME4mL*& zS2-^?(2;X+8k^6NS0F3!$O{%mqU57z>=_m7BJYXC%%)W!eQ_5+l+a@_@ry8_>C!tB zHR)(AO*z{4U&jq*_hhFW!Wv0qUm}et){XE`|KXs`Vf%7cR>u~8RV%Sp6i}a`wlJ|Yl2r}x2W!X_ znO4Gr2EvS|@&nlHZQ!acR3;E0Xgp!KQ0k*U-JDr&!2TNS!cEgP)}2^sMd5aP zY)+EhRK~FKb|<<9;XI|0!8?})KV3^Ekas>EJCe55P**7KVsQ&($xeTkt*YWrN9%vE#bO%}jpOT?O93#P(dznN1YKq}F9W^-h2443$4(ENv&-nlr{(Dq z?j$`tHfNt7m3BC^Yo#46j|6u%Ks89tOgf&%s1We<0dsL8jqs~|KU7;lXl68d{F6$) z474kLh8^@CNLdeXs%R-^M@!+Yfddq2gFYrf2b(Z61Z{v}6q$PNfdwM<50JFOGrk+o zv|poy4W7Q@<-U+n=d86{Ok%}B&_e;ww9OkYd&EI{UHS=E@m z+7=XorQNo!(dBZh=+NH^gg4AWtLfA0E1r)6UUm~U`8RDG2_t%}w$0ve4EHQSk8v%f zIlED#6{tI)e{M3Q4--sK4=U#~GFAYfhxuIlg$FvTPQB>usd(ETqb@9bE$6CL7m69a6^W~fAaD0k zA_1Emk2Cpyp{!@V`!A-N`xR~ccNWYJAH;=G8oSwohY!(G|1S%Wl&r_s6o`2E$$x*- zLmpL61G#wOf{akOuZE#GFM<7;v+grZ9*PJ| zxX*Ff1L)3OF*Q2sD*4ii(4qi+Aow5?sJp<%?*}3S2kx+Bp`}GRje--O54y|A&^WRU;(_$-rrmGkKL&+F5f$ZgJ5%?JY0vqLXR4fx|X&=2X8ypD+7vWeK0p7vJy zEYx{}dX|cur*Iw(E zpA2!YYB%1c+FuyM>Hi;^t~(y;|Bs)|m2q~IahWHn?7a>l+u4q&i0r+oa7H03GEdgo z$=;Pcj_fTvWbZS6AK%C0_dn<3{eHckujlLedcHnatn@PU6-cE{#kMs6ArAM88k$=8 z;G+6ZA(A5WSBip$lbd)J_L#J;vaDX()dPW^gi+x*<-jcL$q5#w$Y(EGCiFc-Tc$zt z2e4B2TJnRR{zMGngKwzWCW`Ub1ZSeFNcevMj({lZ1MrTUQ^v$atI8;6p zQ`3?kP69!eeP5&m4q$6Z(3%&9HUZVfR2qI?V3O5&?p}(I>A*xhAseDx4GP(jduASm z7e;WQ$g8mGO!;N*0ldgzKEKqNolJ^i-%>Pvo$m`%BFMdhe8<^Kd=Dgo%u;n@BDaWI zy-WTqX5f5;!M(Vc<}Z#NOU9%4&%A)K<9Kh_CBX16x4&n{H? z@b)KqA^qLc{@#O)3@&Z)$K$vg&|EstqhEXTDw zvo!>*#FGp?8!?=BX$mu;w6q_Qf$#0RKWfZH7yYe!oaaeJlsZGBfIJ9gj_(Pz6{&Ub z@QlH?msaTMp${GEoo1B_p)Uj3H&PUGrMeMfpyQIFhK$S`M5=l21(9Y4y$Zsngr^Pb zOG7%raWJBp^O(C_e{_?$IC9f}il$#FfZU;mz*&}CQ+u?0?^8RC zuwJVVjxEc}`CH0rq{fGPHO8ZAq}zPxFT>GYd6?~0BWyQbaHLtUu}p3iqQYgEh?ylq zk`g`Hx$_Rf*58i2IR_&Y&L;s@n{Lxdt?}&bg$KAca~9SfV`GS@Tje5H2Hll>zEp7u zEnB^qoBC+cnaD8YUR{@csRg=PokA98G+no-q_^5lcz0W2S7K@$?bd6jbEJpTa)S>H zIe32me1&~)^BM(Nqcg(4_7u6S$b<#`nse}JGix~DVQ}V!tBt{$@^(A-uN+0tPJBcDj45K2Ex>* z&gHdwwCgkJX9-v^jgX7HVErg4ivFvqG{gO7<*(PQ4tIH2e};1AfxG@Mn-r0uG|5qB* zP>%s&!>>iI{1$J!f}%cJ&^q|*GQ7^PtRDlc~|)c}LD1_Y!;tKSb(- z{If9mXOb)9Nmv1{%#FD`2K@6kYoIvtcfBOH+Rfr^AI2#RQlJ2b0okuQ--YZRNdXxX zB@1zvUT$6yuad^+ej}TZe&O7xeP;GWvt79bB>9L604|fC;#nHVFv%+a6ho*mJKJSW zeyn`tzs+(tn(@`?^8c0H4xAt~IICJYKpc&hrjt3lS!jeGTq!~EqrLs+9o5t74xR4_i_qe87)V$F)c&!u0}34W+n#B88GwvNLV_BGp?b$BmcJmt=Ye4 z%Q;SnV;Q;hn*Jg*tdeV~k!V+rv(P^mt9Dy>$nYI?zY=qj!vtB3!+Q`?XEIa#$-rF$ zcj3&mIR_HF5!#{t*jBTV`N6%>&%dFmaUA3~;YWCOcrhHT!&Uyfll2mYmxcvtKmB5F z3T1-id8A`|E9Evi&TKvh2E!CF|)ma`qXa)AH-eU3~?a}c?DPqbYT~0OE?gLeA|8L0&Z#h=nk~QO2bam+95^=Gd5vjU} zm_-8cim01PF$+k{ zbK8#c7tu#7(3Sq9Gs6CR2fr#t|IBYvJu8VO3?3UZxZgU#mrI#F*k5I~iNur8DBI zPt_uxF?3^$3Ou<*Jrp7oj3uNmewkbqStUvsti^78#P4i=6%Gl&C@~BTJ+7a^yTZlg7^1 zbO7a=zR$l>2%xP1cz16RM!u-7LY@+Zvpe^s8zLDh=8%cv)7QeMNNEM*i?Pnh{Ek?; zGDoA%i>9}A;$&;98RC9&l|Qk6f=7sTZ!YL+8gPhMjh!~IIXN7!ZmF06hoaB3d&~}M zxG~xVP?i(ZCI@F>^*1z1D+fRL!1sR|tq!-)HFh*r%{1MhvdksT5T0(w=B42GjGY=# z&-ja;-+sw+gbNzY6*yih*z)}O=Jfm*^K|l@V@07ag`M;YkTlY}PeO9DaXxoJEPg9k zFrF1r)|vvX7$g6l0L&|!OlA8wVdWF=?pRTxdm2P zuL}!sV-}FVA5w2Y@bHf3z#%w}^2Y<%pKE4rN=(7nww=3JxYByjYur6T%375IERG*@ zZXhjaPJgUeH6~hp1H=-PoaUwWn z*|k@UYj_*}Tq*?}`ESG^_n<(jHweXD8jPO#oOZ>tN)B(nxeIY*<$xvqIBVu{4r<|_ z|HP~KxtXZdIBuV5kD*HbWste47bJkHpPY9|Duh$6d!hGgXCj}goJj=v&4_J#w2$q< znub2d{WgA>a|WqqsPAAk@xijL8Ur|Bt9o=&TILMWk09`{C*h2xlTrUdY3;nRE}LZN zd-%;k&-}QwOPp#ba2s3lmOUcKG%dkG77K7+?E+!M3B;otvsA z9kj(-(oEvsRr4BkJua=l7sEQ!40VZw3Oy5t2U6R#*fmyfUNhoy9jl`sz!hYj^ zAKa}Ws&~?&j+6AsxTkY_zav13;F0`#Be;lkHZ(h{zQy;aV!Sgy+W1em-y+5MG5zs+ zehn22x$RQYnLO)TtP(SnOqI!*IWWUzVQh@v?CipN(0y@1L^~ZxENdR)zqodfi zDJHK$8+y@SmHT-0FWG}oiJc?Ff@emM5-sJPZ&sonGjJ{5*DbWp$dKH$R%qn%%^eVU z{3{bERrrH?JK!gibs(j1`a_-eomqgRQFe>7gA)RqQPBT1o7kg_@UF>68}w(Mg+}Hs zFxOoy#ErD1-S2#3YVN1nJGf5afg}baBOSsS%TP}YP7t+3e>UP9pd1NSo7?i)!;>{y zWa5o1VR;Q13dtze=7C=8JQHR5ESNTpj|&UKk7=QV3q9PFVSf-wmKmj2*mzJW2zr`I zV+7xWWbR$y^UTEbxO|NjePc3tl~{}8Ox1(4xH*FFT7$CkxGR6H-TK6HDyKmk9}-rL zqn+5Enqz7Fuxq<^>&}TR1zbp?>QqPP-h1CXmCXht?+_kkOpCiCOw0lOZsr4d04z~@ z%&;=UMu)on<~DhXw)@hky@&z-YR4@1kXa69d#4~Wml&k4&?4|OqkIpT(4J{!W;*S9wnzN5s6Rpa@vQwb^@ezn>l^e+w5bV%Y^)KkCKMK{s~rslWUpfv`>=;koHrN91tkTxVHSTG?}a17-G9h5IBjOGe|z;IkIO zVfIwFZ$*{apcXd=;N1az^+07LSU>1EzkD7L(HW3|N<(#qvxG=w%B#ZTyEYz<=fQZU zgHX8FrSj0)pOU;#Cd0M`mXopi@`vO8Ke~c?6;8x9FFHd|i#Fw*XUJP1D}~Ytw#f9( zF|)Qp>&uN}w;gXT+T4MF&?F$H9WmQW#+@u!xR3{YBp@zSMm&U*n7gjCYv=y55`3v# zi_iiru&*o$DKX;0D23r=h-U_E|4?YJ~pIDR?P}7RDDxf z$py=AuXO?GopQ*#Qqr*=8gaqt?4q|aAkbS9mKq3L$DX2rO%jw#p zh4cA2X1$n#;(7-u^BPGY`@L-ut8b|xac%j&5oHSnuT^liMvQH#`y4sFd+VhMr)AzV z4q2&Gdyh&>T*oi#{`y?dzsFYA5VFSq{s-A>H2e_ZCAFbvEc71tOAw+#K@O=GRqlCT zKCosH(etzJe8%}}AIjFuZr5h5`YjCtjHEHL3KtJi63U&i@NQ#3qT%iUTW-MDs;y@A zTloqcIGyHG8czAF;7$_OO%GNsv??16NTRo`q|1ykAQ^2MPWXaM2xlu9da){$>Q)_o zlr4;RxY0I*o zJb;9{P>@y#x4ENMMfUDkJlSyjb}l7r3Va-4T}x)9ONKWWx*I}Bbh2h0%Jg^*$cI0GMa|8bC!mv@!Gs1lOl(SM)juRxwIOV3;G zR4&!P*X@s56M?eXBHR3;i|hvz)dYG1{v^>QQ{`W zqD6Ok|8XaLsBQr{?T3Ir%h;4v#Tk63%GbdzQe) zY?Wzm3h|bfq#1faI&&*NV)+A>Jpr~I#D?O*KVr1T%aU84@nA!mQbh2`cqSw-xBx4C zJgU4gl;2!WC&)+F-ciY3QFHd%NBbalxzNjnzG<7qj88W9v>l{g)kbt>MoPpyw&o;n zcN{-{&Deqg!h<;kcS}H)9>UrCe*47a-il(`p0}rgvlI;{?;{rLXK`T))X&0E{t?&; zvHD)1>Ca7&5g3OrYyG<9`vg;CV{~6M{*xRCzvjcAzx+>1a$008Rl5D7Tilb3} zp>&Y710PgZCN@Pp$AMiakS<;xBCy{PQrZA9}&{c!$3+bF77-ekq zsN-bmmi+z0y8bB9`F98!9Yyo#JlEc3vhH*?6&U&sg#u`Sk&MPBamMc#)+@l9;j=Y| zuyRUhjPGGHhngl_Uy5!?Z}rQG2^wCg!udq}&6Y2{iRGvunvhIaX34lRIIWr>8SPA)Cg_CsMxY{JULd`J<49oJOKGK+enXU`MW^Vj z#HoWO9JBf4&HC%|^e!}&7I++(=?5*31cmj3_DED?goG9~bDNCL8;@-!BPM=cC@cxv z30;XKN543e!fxFBR|b|YKnOhZpVKnd4*?`Lv9i`DgDT`~e(40XQiQ2Is*$=Uc~9Ob zr5Re{iHRsE!)XbsSm>15590emZ3k{eV{h#|=PUQeFh&LgrBNQq2Xi@1@q`Pl0KZ^- z-}D36Q_PEBN->5Vm_C#OM?M)p#+-h^EAJO?t!*)*iObyQPkB=I z?j?CO)2M8N2!rKbmoUoqTLizD(@E$;S6^zhp|La6HGkvkM^TOxcT^?WR{1Ubz$z2^b-{TzGreSpU3{&*`H za-0qAJ@NfOv682+nlm)#)3b0}%>(a0?L0ObObwlzoD+R0~uuycaHw4Nx zC4jEDq<}WT|IUEMg~b9UF}9(4!tflZHym}cvPDNG)eDoU|%Qq5q6 z3&H#72-4*jYt@*Tt!t;ytG4^w;>|t~9Vz{z=W89x8HtuKxSIjcGeV9EdhGk}=Uf`$ zo$NhW@a9rOwOac}L`&R&x%V^6J8^!X*016Dya;Mct;R|Z!ayRYTFHEc5qUg_M&ZQYVt+Vn51kwKLK47Xfd?m13 z(A&RMap7*Ibx`sJ+VSJ;s{1rX2R-`(eC5C&3qPZa;2~RVUR3DE6Zir3lI+CePPQXfmEjpFY*#yfgxZBi|iP^zs97 zk4;|fuhI(J#GuOOlVRy#sXt6~w1<;(laQhJ@DR8;#bL~#wub`gU^AVS^+C_MpkAr4+Mo-fAMFkO1vJ0mLT6vI zY;fP__SUSo2|xtifl5!p1X|#aC7m?#^p(|V?GFV`!l+HAE9e|Pmi%Wrbj@m z!;tGUMn}z=7H3sbyUT=0_$^)(^cU$)u5h7drCa+psE^Sq49~Crk`-@lydfQJFteru zI=ob{vVZm6YYEr=f{s5UUBrsc=Bm zGQ1yPwA;#n)A4ySb+*D_0PvW|l)PwME%lahBT0}r4>FTwga&!5=Z0(T{-Rk$5-F?& zC-^qn(!?>JtQjHhxJ3ny_b^uzOl-^;%46Lf)Zvc$f22ZkH;`3dP@mRn3KVu`t}TGO zAFJ20j7T#XH(xUYHmdF#od`VDzIfOm;WwyWe)mxUfMYf>`VQ>qZujYpEf$@b%_-!c zD@#o{P0@AF_zPw&NJCqZx_ zcK!#x%~;RNEUK${LTP}~mX$=oh2k*H2rOawuc`pcoBC+}o=6&-AAnq0AS-S`4?oa=UEiz`A082!-=yJ`8h7)xJ$fz#IwS{f{#9hAzSvsFt$~UrL z_H<*a;X)sKKJe$`IhSg34E{7Qz3KmaKK?QE{?3X1T##<7{(G3vSFQaV(aD)YIb>#q zNSB=>-JJ${I!VVM7Cs3=qjHD16$)aYQ@_u`YQ2(uqw_C+V~4V$xB1H9N7V$^0j*E$ zE>m!Hp#Y0}{J6uHKl>TG#{{?-;@f~zx}gztZy&835s5v`$7;YB&~?ge11F}4XJX=2 zYY__%Ge@x<=ME`s=!%FR0aA)}0kO8J-uqHLm4KEJmwESe2hfTLPYd0+(bz&@T=sV= z1J#j7b<)kzMo@RYm6LNlP^)Fhn}Mhd9Cb^ZrqOwD&Qy6q;N4f%9MfE>iry<5hh9v zn7k|^2-+VZG|+N5b_B&VSTL?^GjO4Y5}fLGc}O!hSsow1+i&fu_QShquj9r8N@U*K z@mpn$wHH(SXWg8NLMo>Y^V1buW0gTWzqLE+1Xz{#is{l*Xr%Vp&^iU3-Ue*X{z|Q- zE5j2WWqN53WiD^H{Uo_s|0`Io+zj?B{-N7^K~2Y7Wr|$V`^{_@D79V2{%$+qwGS|5 zO>pxA@b&$ZZ84e81L~|bpNq;-k({fe+YT$8H1`&oGv(W?r3mDE>euAqIn)GeE*!1b zD;s4&P@vuD(lGa0Wu$8yth%(_sU~R=i|XtZSUy`ZPg$CsrWwlq^%*u^jhU$PX6O)W zz3jdsG?jW7^rE|&b6}bwf`=spcoURd7`J0xrapHv`Ouc(_;$5aS5G4O!D?Fi5`%TmQBKbY3LlqLDa98hlF23>9WV6@a zR7218M}6?s32ST&Z8}RlU!1In5}*ghDRbwl_#y50Z)DCP3yqn5UjILwFokk0SQE=< zB4iO}Bp+O!wb)Hi5W({{M{DjFjQ7#mp=@j?+6b!l5ym8yO6d@^yZ#gW=&rk<#W{S} zo~XLv*cJ~sStb3UbaBOC8uRI>uDpn;H}#f3?+4GVWQ3kyK-kfrQNATfQaSY}Z{w-e z!)%i(>O?Hhq!%;ybnwyY={Ea?y~*Z zdqyk&(q`3|%H?VovnZPp!E*=D2hw2Wo)+w)Q#%x2T6LM1{Raji_J;M zg!EQQ+Zoml(CI%%U?be`p~d^YzPXh(fGsxBK5OXA{4WX5W;L=89E2!%SRrO*2M zg3{1|>de-`K^Sf88WY=q13V;AuKYQr(-$hXs#Es`p!gt!!=CMxw^8-%rj#U9Eo@YY zJourzgFxhCFWL_#aZ14-SkCTVdmD$0l14~`jPSZ4VCugwQV1Vj^le8KGF#~A{Pa5v;pSYIIsxpkL~ zkx4w=6(6 zW&~#fg?nuE2{y`C8eP|s2SzSUV&H(RN1J(rS)fze`{)1JTkdWq=V)4z3%%GO+~r%+8)3BKmO@F|qf<^$rZqkm0DvoL%o$gRclhM@guw z^UWk#Y1F5YXSuDPZ=9}bwo75!e=3}*^x>*6+$};5xjE!*D_J(&(W&>7kipV!+Mfx5lcodxpl*@=v&sTtEN!Tp-Hz9yGF4o98vj zFQ2G)u!ri8?xBsB3gW9pKw@K6O$F783ueD;g*d;}ScGs(DIl?KFCw_A(FZ@=@Y4Q3 ze$P%$)JYZsIN2Y6QacXdS_paHDeJqAlvcIbg*fKo{gq@}XkuO7OZ-}=JKFyaW@T#U z^AhjL5<8dSs$Li?d3CJ)2}VTwpv~~bI0)Av~KNb=UZP^i$eJ;epYfmt?sLLVP10qM4+l zH{(;+Ad8>%7Qb8^<{jR5FqW<1qwDejzw$Fs=0RDQCq+sKU`m48K=(b%KIF|R@ZI$(nDstz-(F<{t!UdR+@t!{$KyS!-eAZ$K_+a90Z^Yh9@H8PIYYP z#s10z3AS(JRZT?5PV_Cfb+6*wy4zfsT#LolaoeTm#o1?#T^Rc9RBFbm4e&JRNuH|m zSUl}j7WRKNB?H^457?oux;Mzo)+?n@o%{0SebML6^j7e#KN{forH1-N$w_71-WMV4 zsfzo5n6r3193BpSiJWa|`TLeU2DGR{Z?=}rmWJX=h2ON8rI=0g>08dfSmIq}`;u%a zx{JFLNM~v&F|A?Xn9-gk+*zVUFW;f>38_Y?!5r;>ULi=`kD{iZUIDt?zciI}VpGuOD z`r??Uw_P^;(8QM>_Bg~cNk15wb#>fJ2gnIGSFd&Jz>(0fF7%_Lp#{jN`F7B1+d`vp{=aHCUx`Ie4>cFmIy zM9>o_UDZdRY6%h^&6cy5Eu~se26PI~_gx8D61mR29*UF4D)0!>x4Qws18zX<@0{C@ zJ9;|o9OiP%3S4}|-wszTYA%3z#T`V85538Q?HokK+PfW%%R+1@?uWPaj!XZ%D)}bs z_9D%PYG}gsXi|l4TcRKPhrfxS`jzaryn%eTDjC2hh~TYIEFE(k4kb1O1PKb7(_0YJx9x+u??rvj7A zl;O)9p_Bxvt`4QGnK3i39S`f?kk8v1kNAqcT*Wqhc{?us;ohfzOR2Eg@{Gn-1 zu>^e6+eGDUeD~sFfbP+4wCnk|`aZs{o@5#|5|Fmsh8=3lgF-uje#Bp-EdjNzZFRx& z3t?~Qj`Vg^m;~IB)Lkn6Q+zMnoE$pK;(ONQJ|z`N86uh&l9Dg$9|LEWC-_Azpw)(m zgw0E!;j-@vFrlI&zE@W>#e-!wE2&LFTIg9O&&}uUeKa3-uQi$w2-L37c_Ej*$kE1f z>|>uPeL{HxKOgR|-L#3|7C~{sf}(XhlN5bTxO;g>ebqa#cas@O$ewQqcPhV~Z))-_ z=Vrs$l*Un}%Tb3D(yv%N3K}_IBG9r# zj`sbi70n|f?0uGn`w_|Q0|d-S%_Vg!aGVvVmajBAtSJSD`V42?hU^1KDpdc(tFE|Z z{kYg226+NO*R^(Iy`WZ$KvA&2)$$2TF!ZwcRq1A{31BIq$RP_~3uD3S1K%Wm1DJ5aEj(vS)v~OY={)06 z-7lP^FioS?uRv(FyE13nU^3llkzsV3BnoOTy9=0?ZJjYYXX^or{5{=#((<$@Ih`eBz z4dOEd_)a!vJ8ztHSr=PwaXea8qtx{3E5VpX7VExvEVWz;`JRPNsgh9qO<^w>^g8`j z@bp^FypvybMJTm7wb`5)_*yoDubcuFuzB5WmvSzMQdMDg4hd9tFQOv$#IV@H!%SBk zqQUTqa-MR*Hk0xGekNJ2AfO?9v{00aVwb-z#FVWZeszVWKJ>i%{F)5ha$R;yMyA%k zJXTu`E);SjFUvJAyE#j;!NxB99`j}2*RVVqb-z$%3#@zvEh_>NSD@zz^(qp7_YNL? ztqLl#z4KGA?VEt3fA#@}didT-c353UPL5O#^w{Q73@Lqzd%bYBJ1Q?Ua=Y&i)oH27 z-K`RHKQ}0u_%}P5)gwHkIAwWbvd^!oZd4roA|xw)c6w%y-_n_f?g|U)<@4J@fynG)YC>cbf0>~t5sz6BOcl&5?u@UYM$AN1_ zp$yKnqIOQO_?v{+&?dDi%2tBss|eT|8Ka7AZ_z)#DOKu29eDan&D0l-Q^BDbz zX_5IRS<>{8@Wb!4eSYk_V(Yq`-}iGj<~BmRUn&U+I|lx}=Y+Ql&Sca%L(cbjAeA7W zpuCsmFwgT}1yk4&51U4cF3wc48?XEOwN4AryDv-q7EsYv|<=74!yTSbaDVWL5p zxp&+2lgb~x2oAWAlELgZySR`Yqu94fyBRNT@G}9hv8o0;MOwz$tfx<3eLv)LS=JsQ z9J@(>{i;y`HNEUqfmdTM07I>Ykom}=nY#>IGES*mk^1(f){{GDb%1A?((=Mk8G{7O z_stKkq5)**{L>i2TRzLJ48N-T*09p9x&jv}q(wh>77l(=CKjhf2{>&vxe9G{Ck{AC zw+|v9U7IjBe&L%RoAi{;IH%3R9!C8xbHZS+L{g%GX?@|Wx(xoP+a>xdsLJUKAdv?X z8jq^cT;(9kNiFOZMX&{coEzdX0^fFE$5U{<{}_Pn(PrQ%0|;`aZJ{w=`gMPQ)S{(Y zD}*%sdC!`GJ97O@B^u@L0Sx6O*;r4aekXwDc`f4i{QhvKhQa(yt{}nlgdZ206Sgxv zi$dLw>Yi7f#Cu@ODsrs)mwN1JbmMi(oUhN$p1|F!auHKR_1|c z`*SJ?o0C)Q^aahzJjTCktyo74E{k~uAMWnrC~o5V(K&x|GWM#5Gm!!Ep#-z}gCXLv z#nHVQP+*<6;Q~U(52|z%ix!I0|EO9BX0x9%FH9k7iuY$_RfYKVy+qByqtO-#xAQr? zxe1Xp&GFB(V7S`%tE{x7(u&Db`nA=iINdVv6Zo>tjqoab$_;!7UO{smy6E*wh1U>H zOlgB7vfxh*kdttSC zs(SO2Y9y*d@1`E0j0p;CT-YW<6U;Kq(`OlMWGbEkPy82sK|*(0X&AdWGOP8q^dlb$ zx?8u2-3^1lV%~w^yWMdFDf#)$iS|K+Z9%vWvRyBqNxys8>icSAa*D^Ah|5n-X^=Bl zAH&sC4p*p}E|UH`zF4o|8+-P&lO3|JG)2v+N0cT}q$GWt+&3rQo(a+UhH3aRhj(4l z>etu&V>*AS(*iwNT2bjDU*Jj;Oyh4oy54eVSTjrGrCFh2>0ng-JioQ^r>JJ|xWSQ7 zi%h8$>XYYO>a#+P&~ZOQ3+;c*1vc#ljeZ zeHCnZ&M-AH(>R`2m4g>esDCUZiu!?@q=xR?d(${nsdhXfc5P!5K-U@*U`1#|HMPsN zZIzYsLTN2@%>;5yX4=l}Cor)aPN)k-y8wJCwW;uvz0%R$9ZUIXIR_j$*;l%GLi$Ip zR6?|(z9bm4Ds=uCr^~8BLPF@vKM4G^e>8&M__gNf4Ua-O$RDykux)E3YhAh;I{&y~ z7IpF`5WejA)wLiXd}lHqgsjMU5PftPAN}=)Hh-j=k9MBx$h)c+xwaYN{XI2h$N$!g zXQ8HD!TCHR{cqW>)Pq#An}iY$sgnoI$MASL`t7a@aD1YLe9&OO5p71bk7VB}I9vQh z|Cpxk0?YN$7=g6W2lE82Wo8u{{?;pD`vXxiA0=7QVh9i67USTSlMggqHn#_cBT?7O-|XBxwA8=)2@k#Co!8CK9nkk3ZX=ktU`Wqzw z=lWWwij~Q>Yc53&pcNl`wpU{mj`-u=@?QZaQk<5x=3lmo{~#cs^OcUbzzJGTI6fKuAl{gkEp9creoBY(FU1t4Bz^*h*4}3e zNR3TqwuvQ%!doSyTTgl2(0_BEjPJ|fJ=~8;*gW5yl3c{vx&m=%qDnXSwbirbsfMw= zQ^Cd?ap{yk6uM~RbzoD$l^gI?OP5FYEFz@Y0l(Z!L$@N*IXYe=7mxq;aWwxviU9Jz zwVEWxk!V2{mv^4DQJTjSw2q?IY39_+3$^42U4xO(9TuZWPp1oG4eF3o%k>hfv&5kC zNGAVg*!W`8$|uy!ZGDfKT&CQ}JDOwKQy9M@X>}+KXMTOd8C1uAP*U63qIsl|J0yV% z5p)z5p2hU?)-v_i?>VKCZqK$`_LkNm2$V5JnTG;ndjOfd#IO_hHia@p5q%qc{Z?$%HDx1HO; zfngmyZ$vakF;dg=IHHlu^ah!}zn6u-r^W;q;Ah?~aIy|nNZrHKn;^kDH7$Rkez?u4 zB(AjIUB*Ops~#ZOeYlhNsMbLJ_o^z7j(MlouZkwTht4|IediMgz*{tlm=yPcWjL_< z(gF_g3U#ErDA?Vt?r7^JIpK<9h%34wg>RkXK`N(8kzkHt!xoX`XRnruj9NCt;x)yC zyfxXyIDrkbn--QjKNhgA$0+U&*zUO+{*60ZQO)r4$bw_PY&2Q^WW|VxG~H8f{ztz0JeZH{M0>y7sO21&bGc(!HmJ|L({op#{NGi)VK64Jx+U8| zjjIf`imurQx^16#Q?GP=1dPFR9ycu(TVO} zDlw-1i!3bo1PnuL>5oQ{7}|t?>axcij(J`%p`8raqN#x`qo$)3uRuOv1;tbWupthb zewoca_=Hy&x2Wrgpz zsC*8Y5F${NSFQ{x@Ey&i!vA>GyeM;-@+HXk_0sKqD1*IlDv^so zcfpIIxzDfu?b!%R-v$JSN5oFit}S$WAc$ zqm#DSWMJIb$miC${4?VzodTX*xytP)dKCddx?JUewf1>LdQghOc4qXZhN#tEec?dJ z3;^yHg_x2d^ij|&S2_-c8>kF!HYbX!#*bVWC7NwWp^HZ?jvJ2e1)$&mx*yegGSBy1+=1??f}ky393mxOcBm*Du~hPl_S?npaJ?1 z=Y<++W6k3|`u{3~?C+OG2N6l8x+l(RI0ZlbntK9X{>TJI>l1u&A>NQIWiCwM7#f(M z3Xs8X%7u;3(7M^d-R5*8`~7HZCuMbs28#d=YS5WUH#EFaFCY!wP$MVZhpqm;WBzAc zG040#NO6#!-$bUbXD;FUzJ2eSfY}QtTDWmHJLYZBl-cxE)G6R|QA7Y|&>eXUI`8Az z)1ucr!vQj7zsuUH-EV+8XSF<^Ez{ril>^87%ocLV#ZognIPq$vVoFy<6_qdXZeT2M!dXDh zV%DV#3N}pj8j_2P7;R0MEMCFgrf({CSY#CFqF>Y?SkAH;SQUC=k7Ym?>Qn@dx)e(1 zQMRh*9I<6?7ujFGDpu_Wy-TLt7Pc}_bk_RyP)2)lwC`sHuYt#GGE0Rh;v1fv(pL)F z`F~|j*E`;oP_$yndh_n&U+d%x&>&PsQ>_hSR$Z8FZS9|;B={E~G>--cUHF5G@)oD` z);SRYQU^8?n4YReb%ZSa%N4p{cEoUF-D6zx1kD$AV3nX5^sa`s@|!MUug2WPci6Zt ztBoVvZE`j2ST>ZHf2ex9i1cuH)VyEmnKq4d$v44+2fV5$WV>&9_Q1ve%Iv>X#y`5* z>-a>O3X-DdL=x^`wjHnh0nt1`3OBs9zpU0nt}QK~)`&04I!w1(_bp#%3wY*Be$d|&D_?G*bn z)&gaJwxs7FNU6ctCc(MBR~c7R$2$tn75GDxBM4~<%p?$WP6=h*3GJU*hSI9)sxKMv zFBC`oO29HkKz!)%pr7s1;DK&5>tMDmhS4?nrhH&*M+P4o%5!`1!B7p%FO&SpLuaQ7 zZ06Ei=XJ4jGYbDGDViz?lN7|N{d@cc)cC-P!7ERvUZO#wL13T}wf@>;HpLo1awppR z^F+@2BZ0INrGp5dW%spuR>q?z5;6)9R@|oKm6D6Osv>p|3w zEFjtQV<&1OamY6oA1?5vhhQu3%T;}~qfVjXud<(75VJH`WsTu#YEpar9bhffaDI%} zsw~<>oVK;0$gO|=#swub_RChYpwC>N#pE8HsIeWTLpIWa@4@SKlh74 z=?87P$VG#>L~$AZ=k%@W=wC&xOzmHA8`Dma;#J1kHw9Pu#l7J8sJ|*9RD%KuVWC=m z$GU%o-1Gr)n-(qWZ1><>O-rf6)XXr(H`RiY@0!`AL5OWX-anf|aKhW#C4NN622cgB zSOx{;Ar9>^i=vzoE!FlbjqVCYKC9F`fj@ChwRbC$?B zJz_ZgCm_l0cV0i?n7bap5R>MtTZn8Gb?)&7(%=_~ihg%H8Wqw8=3qacP7t?OqL0{M z=$*8v@UC+nfG}i!Dwo!cI8-EKp-K$eDRSD3W*0`I`<4OlDcH6<_ z*4_E+@PT&6ySpkCXxtB*e6Q&?EABEvqvUxyedm2U--2z&=B}r;xu3iFLa#`;%eX`) zVgqV-yQ=BH{`uEs6QE2t!0J;om=%FRuz`hQCj;oxcA0`UKm6}V|ASgN>l@3F z&t~sVAHAqgs9#)<=x)2SKS7m){q5y{N^dA-WVHX50gOGMIAW;S1?X#Ezx3)Ik8ZO; zYa;PZzmUCHanEdorbYmA`atu_iq~z@!zdo#eKmc$Yqt^YK`C?YGEix&#Iu*BuTu)l zC>Pe(n^2gIwdBjg;uxSsP!1@_`g|i%<$4O7p->n0%O!$Tp;ITvqVE3Ub6c-k0Of#A z`|>-8Q^||#8v`cu3+rmxVzojlSTKNSED&L?;S};2OMf7$gOF|UHXKX^))$xhKfc1m z@h`7($wi$`uzB52bXqT)+tv0@>30Nl#3H3#4>>(xg>^>kJD+!_Ls6w4u>Sw5yncI? z<^U=Rs7y-k2jzJlD{_cV^9s%+w$fH~3L4n2f;*hD-?~tQ#P@3HERZ2CJ2lAfF)wuq zsG5a%1Y=6`Y9dk}(hB-;GQM5sBq0CCy0|<#Qnc+LAyQ@2tqf`8+lWfV&t__R8*eyt zd!#CWJeH1%HfS|u!ym*t!TfdSrXUpE=qP)4sQaZa$?sVp+8WShGun{0hU(-{`AiFChl=XS9zHaE(O~HQDpL9+@l{Aq zMp6&{|JpnAuOzpy?`xg1GP90TX-1k_=9HOOj>oJF=LzSj6irbqa2~KMvt#9iN{T}n z4mhAWBO-Z94MfdZRJ0Oj#WK_s!H3Ry*Yh8|KfG(b`xmaYVC}u{eShzLeXi?f?|t7b z9p$w3G+9CmvYvcT>E23^J3pBhh35Y^SiD(2g`)Bo%L-&;D5g{`VC5|+@OxtjFgHFX z0^k`IHyyvb!OIha{ShJ%0#zAztdhUjK`;8{_T)+0*+U;cl;g>cqvK&7PNj7tBZPYV zW>a)nFN{%6c69g1Qc^gpb6DX~4KC7NLa$P1xV#MPc0m02zH9TGDZn-7GF{F270{$0=uZFtmJJY1eC{p6B6i1Gti^bT~WPDP!V)^ z&Z1WSpc^c;t_eQqGTN$M{+*)!e0ikv@hmcUC~2#H4L35#qH3J3}s_qEjR?01$8b;zxSkE0khbwTh2I$f$wu0X@f0USC zEO%YjU|E4H(VT{iZv@cD@I71=%4rB_aLSy7wApk!q=NQ8W}P&-I=6E}E^Knc3+J%( zPu3s?*fA`#QvyfM*2pEL5=K0{Rydm{LA5#z_G0h&T-J{;r>Tp?i-Qt+x4e`FM>(;G z0X@x_kCVJMQux;+Ir@z)?*S)O-41OzFn|#$lStL5LZ>S&%9lq)FrHU`jVHC;M_A`^ z;R*9lAFlctGMZCgjd?)^2`g zDz1C}wAA%i8e8_lsvGyMVGDVWB7M}{4y9ko^2l0DW@(-x;4^m5Js1ufbu?d0PFYlI z>Hyb~Gs7NgLpml?OXbzl9LC@Qb%4#I6OpsIb))PkNtqw7#&fUrXA+085BP0yf_r!M zVROnUxe^;QMW5mo7MZWijpmGXe3M{-%gaG{rF@zKy5N~R!e!Il{oikf zl7L9?y2=clOhSvm_u6YN=oNmLI#Jp#?G3UUuH6xJqq;G58(&{9k!6K{n3L*^Mcdr{ zp2Hs+O=tFgLZPR#A_CpUSNZO0r0$1;i+t%+*Gygqi5;o%bFC{q)bs2>a|l zSr*yiQnqjK)e@ST5%cb7%t>`1YjxFa~g#~P+f2DjAd$xpos%+!Te z$<2;>$b9}++=3q=Mfv*n=;Q_}^ck|XDEtTFW?AZGtylY1aa)d<3skkVP`{(IBW~hx zIBs5tXorokqU6sT{djL)$L9D=;crW#Av(dc^(P8sqAIX0C#eQAl5LYN#QT;<8*J{1 zh=_b;4UWc-(8%XTKmAiKQgA6(K)BfM_dR8{+*r4k;N``dE~`Qcq16G%qC*WFu*(7G zhAOEuX~QXQio@a#pH|ZAIfeDZ4Xr25eHKtI5q;z27-)xf`fgv3PjlM)AfBjCGFA5!mIlz52TFe#Qg#(>)J}6GWF` zFsF;yv->(sgS0gGJF}Lw{WXxJ@6i_$alsqsg|+~t(S zY`W;T;z2zq`?-;}un63!@=JmrBg1RTb^;Fl%6M~pcy*&II(6Ec|5^(8Y|(`P+xjFK zS}@q!2e1>s>F=v#tos+m_F?4`N8pQ)10I7egK!}!wWFtpSL+O47qFXrH*v2FovVMk zFD3NmSoU?<2(Ot8ukS?p?Vzv2k|%qLd**og1zh0tm9(bkS(sDZ>L-U$A_O@h0e|`7R9qwMXw*S15SV;PjJ$<7@*lDGCA}bK}tLW5~hCv$-v?y$}2v-(zQHaQDa=E7X*h#MK`|CYsE?)7*NB zj6w&yz_)u)dXv!DQV9FI)bsLj?>ElBeU?0R+dc8Vv3}Q7tDa7bYe~0WsZN9>BF|2_ zPyo6;*+&WW@oF3Ka8n!WkZtIxda#ukXV37AuY~iO;24?Fb+d@DZJRw>dHGG5nX;tF z-;Z)h(>%WZwFXtYwfQaG3SAAX>uA5eOkK3ZB*LGr4L&Ms2##a5t<>S+@VWiWnBi^!qc1v}6oxEHbOn7j~YC+6f&g!=yzR;5qibhTYr*1aa zFNu;^0~;8xtG|REZ~vKJd$^`NyC(Pm!2EL8jm3qF6eEcV z)YQ0(IWA?657OZ@7PA>&rS;O)30n4K}u> z-(apmY5hrvk!><({tbm8G#ybMjS20TT1>6(mBv2Oi+J^}NmL*t}S_=*HJ+4`lBu=6S!=l*{k{%{H6rAvaj+!|?-=%rBa#M`$+P711YEd=Gu;j@X&$ z`JzVh_Y0#`R?TOR`bvMGWxl=OliDDj_vPFTiwLH*#vm1O{_o5%{R*i8ANomK6DWcJ=w|JprEH^b8L z9(;DFYh|KG#8IP5oKbTn4Z1Xx@kH+ZKOAkuB8?jkc8HZn4~pmbeQdhPA3pc*Um@vvepKrFpZS3iemWQfG1*JShMM=frAGBU^wwM`8vXb>c$6)({&Se zULIQ20d9F={p5d{bZ38ZF*2GBXe>GA`G+&vi4h3fj6xwK5ogSwcWu$fb$FT8p= zKCyvr8v18tS~TpKUKydjlN*f6b5B;#-2v+b0>Uxnd~7Xk0>BfB;iWATe;^7k&~aP@ zmZEoQIhzeA7<@U~`cFg9zRK~D@i#6asXx8v!qkb1diq!J*Dw+Wahe;wE=h@@OZv+0 z3O~iZ0ovVJ!cTwIsEqB?jkFBG#D!vq(C$dvAEGhSLM6c&RXPD4%xL`^n;#!dtQy0n zq)#8J*>oIEzxFvA9adDG=YK(twHA=Y5BQ|E9TpURBdnNr=MNKMc49?^6Qbl6a% z>fc1*P9LpUYir`fMSRAhN=MGgTJ&U`u>$wr#*1u`AEO$gG5Uq`9g*e>1)dS~>F^Ql zX}c%mf8TltZu?Ekiz{V5S#^iogA>ffCb^l-y@ypl1GPARmqx=DUNtg{?R4w|A!2+M z3!9jn?&Mt$885m0oc6(byw9Z>I5Pg&hL4ufaailDqUXNlYEv2JoGfPiwO69KAE*8g zi_I&>ISzbPg!yZ1SJ}#luZ+UuUGe_<5VE6VpRZ|9EV73Vtu1Dq;5-#r&bNf-Ybo0O z@<#zY@=gSmcB85P>{7N0*5GEE!HG7`j!Gr9c_WDfh~}T<|)fV%{RK zoK9Mr<+)nZQq_(0+x@1G*>~3B;&*F&O|ya^!^B!I%%Z6>AROw(ux`q1!C)^m2`vAJ z6fNNH$Cs*(SwH?KL!!abS~56Ku;k4fxk>KdUU?@bmppRS7C(P`=@-(n2vCXTh~!y1 z6evxFf;!4XVR?{tBaKm)V%9vVIa6y93?if0wdU2-joJef-|!w8ja$6l3l+B~6euRo z2HL07umuG})sB5Z{3Utg8hU>?ufgU9ayVh77u%HRUS@{%k>}{GGz|2Ipt!wbW}8T2f&*dY^aNDR&l zEoBOej%T+K13c~V&wNBK{AR?@V&Qo{unm@B2Ue~_y1V%Nr02oQl_4%q$Z1i>5NrpvIu}{pXErV0*tVzs!*fIsJ-* zmB*YS^l2_W`<8M~eXGPhvn4lV?wuRBD^Dy_q!7)~N8KWAIUUtkC)U^DxA)L3sc_?m z8&f4}l+!a3{Y|q-*t;$`U3mRodXC!iskTKP+@12D4=paGXgk#!v64$6amg_GgC~5e@S+)G;9A|{wp|3u7b4*eB2_#Z zL4NCx!Y`~Pw@5=n$S67-QAHE^d*s*%ga9_zGEEG{>%zg9(8gpvpDjt9mIk*y1-u^$ldVBn!-K z9jeI){(Qi>L^h)V)biGUtaB5d_hk8bt#D0vMV{BS%5Tp!y=<6XS)n$2FN0X?=M@=Z z*qBUem24WI)&tlO*82{3TJbH;Nt z0}8s0`bD*1CLgMqDx9iOjCn(8E4e!f+a%v#1cA14=&q2k_%7O`sNqnEk00~% zet5k2&0JM2|MS!hP~9aE3#A}C7BBnCylqHj*DZhe`I$BH1EGU_ z0mz68X5+db(1f5z|6~`hYOjW5w-i4r3EE%DxJdK^IJ`561-G}I-MUk}&<@eKjU-b5 zh*2?I5DP7|a(XAou2-;(?~Fw0+H-Gh9cL5(8iOFEeEePac2WrN!h)WGi4Mcq?&Woh z)jX}vTF1Ay5j_szR`UbNNdgt|C%iW-|BZ=0Eodo`uitED#d$Te%PD8l*kz{uZ-EMx zMhhF?E$pVC#Z!F>IGw?n$FrTvPf!Y$Y0Fr<)2hoQpRkE$^f1}MgMPn~zTLZb?-0~_ zZ_UDYbAwmVI{9H)-N1VwIwEFBO@C)c_-%pN0I>OY>=@6BoWY)(LSx-yJVBaBF zEhHKITB8(8^@MSaLrRbXSE>V?aGdrpc6IVvx^}RqrsbLe$r;~uYeWy#>_`bZ-uVqg z6<0%t3YDL9&mx_1ob-Ss_f#VL1xSWgFL!yu+gOIy)F!?~yJuoz(hU9QLsH}+AA3I^ ziIofJ&fL&?^DYd#{c6{;3?e7{#u*+z;X3G3%sNN`|8E$v0_`9^3Y{j@cVo}H?=%n! z(Dm()4Wtr)E79j#PjW1C)GLC!Pq%6@4Kv{{!$!x>z6=Yf>`u`M2>SEbi*WkV1vD{y zgVrIM*@DKNdvDe#DCy0$!dpdzbi=Hh5cVOlX1t9 zJj3<&{Y0J(zx!6fG8?9H66FjB#qB3pn6|?EC9gl6f0PAR$>uhEohL3=Tj;h8aa${< z9zs!A%M2hj2<1MZ&}UYFXd?9{T&_DpF=dj&vBXVuKt1T~tn|5n(7ipm&8*eXExiG` zjX0QHC&%{pI7K3cP9NYTV-NEkB7+~TtsxCVGT6CT9n10AjP8xjDf0B7AJ8ttUHVRK zI;k*6`__6tOgew4?_dT5;>yI!=q=}tX0>1*B?zd{|CII4iJlBA1j))p&Qo)5?)9iq zI{Mel2T-scy5)pITs+_R?M{@vtA?ohqba*j?6x+5tPd8tuK2gp$#RV8oj2S&R~EPD zQ)lC+-N-Dn75nZLPte|&?ZjlKu)vNz61qg%?rI7zG)8p?Bp<*qSzH}ztayTY#E6y7ASnKWh;XF``|i5oYvIVHV8|p9Pe!P+wR?Z~}}C<={qOztY_0bD*({ z0!J?>dEv6vK_2#wG;ZWG_BE~Ht$Ddw$jTipMj$R&`05SG2LVR@UtK}a(k4hss(73_ z+-MqWTg-yiAQmZKkjwb5Jk;+z4wrxI-upJVvi|@IZty2zq*(k6ePanKT1~iT8G(yY zG39r-gDLAerj8@kLN|>UWpRX&7^@LVF)TREWxm#}cH;WEm?!C>+gZ8Lby3jvYFEe( z1x7fWVR?V>kDL^9*5CRUM3w*R)%*)J{+2(0Qc zQrMVk-R!(18(;!AotM{BdS&%Y-l#nxC4AJDGT|whIYs)J8-6=5eaNmsUu#OW#b%vg zwob?dWs_^&=3ah?iI&vJCxph}+^%nb3Xy{Ge@Ck4Ia@F9LsX!5&lR(R&r+w4MW@QE zSwNl7xn)0WtEr@UeZSq8v*?mzuuNFEmiRsBb}$z#bO&6-_X)OLFXn_44X)xe5wpm1 zwf2u!PUkEsJn&xIW9eixFyVyk;dxcwwYr-pY3t}?`k468)oo})Rf9<#ftzAS71dsR z=8iQnsrlfJjO3}F^)$EH)b+nog=TAmyea~#3XfYz-C!YBWP5Ac*EWzS=$1;dWN{XZ znRZ9Pm}gNEVz%S=8`_4%=BQWtCXHN|rVc&~gOkrmR6=Ii*=Tdd(X>$Y7~}O}C6elv z6FX~&Be z)xnr6_#u+wBXhTe`f*EHi2_%vdx;9mm7eToY)E&QN0`qgp?Lv;gGA5`V+Sbr;}pod zI(!fpL_)id!v;LyA=Vf*XazLt-H?Ic{^!-JmC)_yb`g($o$&4`<0G}z0AsrgtgW)t zbu-->9a=){y)?)xUag65uBTg6K$aFLi7CHxd2}wcqP{G%N>Jcn^RB`tkL@m<64jp5 zIcD?aJz!aoJr&|c#>f*!FqI$FmOdSui1p$DuX=yE6qOVmp?!PDF&H|RmbdMYS|puQ za$C3gqwJ;(y5Ncnk)~T)-5M?`bYuVfi4)!u{nW)CawgjxG~Ip0&kkb>Nwv3r<;(JK zru(Ae%Z3a(nG!iwU~$I0SU_Y3fUMWH5nAZp$q>`PPd|%+xk1`9p~X0rb2fYpJ1rI%TunHGSIilT*=8&4hj%%gj01<&1O zCg0A}KKP&jr}s|li3yxN^M~_c6nQGzgZBeyuQ&gqAJ4v{+;?VC?sUloT^qThS)4-= zB8N-T)r%pzHnqEdLL&%MX$o4)De`N;pTYPV3eBtT^~g))fJP$1X8z z5_Do8gWmmb9x0BdlJu(dmN`(DIxcsF@Bi!N0Vfhfelk!XKcUr)j`WD`AvKVCya|kc zc3NTZmU07#g;AZTd$4el8%|*=x;^I!9iaZjt1L5JPbK;CBNsIx=CQ1xdf&Ho>8XcV zLfu!!Jvb_3HVA+^NL|+3FQkeVni`%H6vK;ex=mFcyF~z+jWhXm2FoO^NbiiVBVg0J zFz!1oL4j{354GP{mb=#54%`BzX0=H1pKQ$T@VLe-K;U4_?uj!R^8kT|g8X%KMgsqp zKb-&jybau^`k$pBEhzb)_2)|g{^{et3qPfD;9uk6jdSn!{cHWjpLPZRwa)e*s`=Lt zNW1sH)m{1j)&0LacE#ol0fEcFaL_a#H> zr#l(w7NN|Oe8C(ILSuHr4+{Y6$&BB&e(^sB$^=pS1~Pk7IJ&w0*0pXWaJ^PJD;K0n+TQ=smZOZ=CZn3%5U>pd}NVq%v1 zFD|k$GQfgRUB-6SRnu6LiK#My?a1jI12e&!1`Jb3}a$q|M_1qrvTUm z7zGukMwZ$}Zr;O?sJ)4~iO}@Hr{U|ZB(j!!2fx8DgV!T3-VfLWtyKT)5;gq|LX7(- zjd_0P6b5#Qm~3`ZmQgK(_F=nYGd&NSe_O(bq3_6#UM%F*OonApjC^*6r-*WP-M7uD zfhmgxbyM$h=d-a}y~C@uojod$A;*Y6lyTa}ZyW98?mLzgpzrkiJc5)>r=Vf4y322i zfW>bO+vE{~jO|(@o}~1wPv;dCkvfxDJRMu`OV4u#S%e2z57-8ezKq-K{=G#Q=r{H2 z5HMV=?;7__oX;p4~5;ytow|+fJ|i&Tx;R`t zG9-N%@|Mv8FKNB-rRp~b{-=NZ^yrw;cW-K8-2W3p9YexmK`p(!ZHqWK;t|X6Z7!{> zSHtyyzTS1qY|tTWTkzjz#)EqMngcDEg3mZdh-P=B1V&4>#JGEZ$MGw?Ia?Hm$W?## z>0)`)i-)#aS0xK0*v*9-5^bt}3Uw9%R-T8{$;f;bIWVz*oG_WW|Y}#`^U!UxTANsn^dd%l{&a#Ex5zD zp_&m=@5IUq=^@#unlZ-zFY8ebthQN9^DoF#^7X;{xEc6O54`_%5`L#?X>rstg%1mC z#Ja$||L#Pg5CAfSXJKmD!`s?F{Tx^aaTQa{i6teA+4I;Sp|j?+@1+$YM7z;%uzJ~p9`Hn-69TF;<5nLh4IIdq(XqW7k|Fu?MS|vh! zO*SFgq+efsP=QkYCQ}-0xp9={ISyN6CP>;uZl-ZJenrYwx9gt2~9&!8} zY^)n#aQtJSzm9^ol!fBBcy~eT>TyG8v_C{`=ZnX4FRERg?PjT(gN>o%U`vS;rrHMn zd`BROn{U~`IjX(XFa?2$O^P-U)G8p1NpL7HWbqoUUfHrLm|q^Sv`k6e_mnmxyea9d zhQudy$5xf>R=XpN?#}WA&G5`BwCk)RRn8Bu=Tvoty>`_{6g_Xzv?{w|xGtUO?QR4H zbtN^{Pp4^t_3gHfw!Z8QzD^}s+X6=@l_dS;Y z3uD|=c2QL1u}-qUxA-cD+kfA2c3>}Fo=NlgvP5WH;o)J>z-lE%KRhsK@xLB<+mv z$zk@!Lam%ld-~AkR~6RtUDwYBSL7SfzYbPL*k{`Rr1+f?oTi z5#>hkA$lRnA8RnJqH~`=73O#&bnl|VTfkzNbECT<^79U^`R_x%*fA(o=6T^7@t=E< zLy7L>?TLH-F+kpttvoR@+lZXSqNmL~T8hYz7jbfq)!>cQyqb=d-mAVa3T`^UZpH9P zyXdB7{sP{eP?-wd!%UO(y@LUXJboNCZiXnU`=KKWX&|%|KEtB7mUNcmtN%%*B;=!2Z+3+z z)GC!HQCBIhP}PWR`lm@>#o*wmLv2Tg3B0p5;wK4CRDi@VCwiZFom!gIW?(Y5UXNDLzxawMA#jk)}-?IHpChnbwBwb>YxaUOW2np#S<3bLW z98XWK2k``>N-A$R%msWB0&Ce6w>cVU*FwS8DR?>BsEuLA^!K74r@;?`Pe1J(rtL!< zIHSQPSZTnZ(2&G3p%DIfo&EIh8cyTLe}65A-ljI^&jh}EY$k3t=);e-?dcZ+KPH)i z(BT4pk12xc+-4UUrCmjitN(CJhCPEQo<;iMcdzVegD2wG)RnoA!caNAG0v9#h+}za z@Mckyx1$jvLsIj_umK2XCaH>1&BM0BW6cn$d9T1C8!aJ6dqy zlJ{vhF>V-qcc~mFD14$mS;=skBCF>|-)Pp%*u#uwraveq)^{HB(Gd-`FC{o`(S0^R zi|UkoG$5Ih)kZmY^3mMU?t}E{_RO7{m1QPBb~$9$9k_~hvi7$=pydY{{m8JIQF{8K zOQx1$t_c^va}9hTj!&^bmsv&wC3OBCb|t@!Im6cY@`OM=MTdYHo)#AyI}k46r&R~6 z-H$zUHxeUiP~k$Sb)uzybehU~86Wb46Pgc&h{aru%(Y_Xzx&2sJL$%UO+Cu&R$?Ji zbf?p^i1%J4?Ig+I+Xx9O`y6Vn|47NIua)^afc*SOZF=gjr>swlGav;@3wR<0@^_>o zfUgE?AkkOFFCf}CM1Tn3=*0Nqee+D|cWWgnvm9D28V##*%Q=%Tlc4=c%Y(xY)}snj zIxf?wg>s^s1MNQ(wgAZ$%&9X;`C|8F4S993NDo&Zj*~OQf^W=eMHhL55~5Y zl|FvQDP9AdW;9raYs?%W?J7)?aw@d852n46q+?@8vX+#Wv_C(T@WX9RiZ2~DvWz4v zj;_509oin~Q!j`^vKK61#$zN0wBPnWDtn`~n8L0~GU6djF zINz~jxFh_Jf{MKIyy^pyYqXP9fl|o;{-6WQ#DYI9P?dWY+g>yOzGCCV8uLbjPpWyP zOx?3Kp3O3gJ$zkZwN5j=L=SA2CbT5jj+JZ zdE3zzbHjL$BzFJY3igc2s-APs!KCU+n#@uu1!O1wb*5wjwPC_-tn;|) z7%wJsWm!_)>_l=qSEN}EMnh~h+~r4&O_*xyDhfGqDtRL8^2Oy}_g?3x4r2riWkT{} zW7cl;uLU)r$&Y5rD5df3!VbR4IWD0or5+a38-(4}DO_})g-xS(p1i5g9LFaf5tW0E z(+#gRXhXz}#tUH0?I`$0KT15e_+bS$9W3^d_L!wADAtF^ zfk7q`+8*;!QmX(d#+dHRbKpBk5$Q*N*NuI|0VCY*j|-3;WY+D)u)OYUG-NbG=O$n= zORoH+Dm)7xJKOU?ZV!7Erv A@&Et; diff --git a/images/breeze/output_build-docs.svg b/images/breeze/output_build-docs.svg index f6f773ffb0953..dabcb6685415b 100644 --- a/images/breeze/output_build-docs.svg +++ b/images/breeze/output_build-docs.svg @@ -1,4 +1,4 @@ - +