From c391703470f6a4054968753347d07ce3fbfa7a80 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 23 Jan 2023 16:07:42 +0000 Subject: [PATCH 01/16] chore(deps): update dependency google-cloud-pubsub to v2.14.0 (#432) Co-authored-by: Anthonios Partheniou --- samples/api-client/accesstoken_example/requirements-test.txt | 2 +- samples/api-client/accesstoken_example/requirements.txt | 2 +- samples/api-client/manager/requirements.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/api-client/accesstoken_example/requirements-test.txt b/samples/api-client/accesstoken_example/requirements-test.txt index 3daba3f0..a32bd2b6 100644 --- a/samples/api-client/accesstoken_example/requirements-test.txt +++ b/samples/api-client/accesstoken_example/requirements-test.txt @@ -1,3 +1,3 @@ pytest==7.2.1 -google-cloud-pubsub==2.13.12 +google-cloud-pubsub==2.14.0 google-cloud-storage==2.7.0 diff --git a/samples/api-client/accesstoken_example/requirements.txt b/samples/api-client/accesstoken_example/requirements.txt index 891cfa55..47b5ea46 100644 --- a/samples/api-client/accesstoken_example/requirements.txt +++ b/samples/api-client/accesstoken_example/requirements.txt @@ -4,7 +4,7 @@ google-api-python-client==2.73.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 google-cloud-iot==2.8.0 -google-cloud-pubsub==2.13.12 +google-cloud-pubsub==2.14.0 google-cloud-storage==2.7.0 paho-mqtt==1.6.1 pyjwt==2.6.0 diff --git a/samples/api-client/manager/requirements.txt b/samples/api-client/manager/requirements.txt index d392e09a..0ad67505 100644 --- a/samples/api-client/manager/requirements.txt +++ b/samples/api-client/manager/requirements.txt @@ -4,6 +4,6 @@ google-api-python-client==2.73.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 google-cloud-iot==2.8.0 -google-cloud-pubsub==2.13.12 +google-cloud-pubsub==2.14.0 paho-mqtt==1.6.1 pyjwt==2.6.0 From 053cfce3edb15f01d0060051835caf73761c3c30 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 23 Jan 2023 16:31:32 +0000 Subject: [PATCH 02/16] chore(deps): update dependency google-cloud-iot to v2.8.1 (#435) --- samples/api-client/accesstoken_example/requirements.txt | 2 +- samples/api-client/manager/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/api-client/accesstoken_example/requirements.txt b/samples/api-client/accesstoken_example/requirements.txt index 47b5ea46..b8da17b5 100644 --- a/samples/api-client/accesstoken_example/requirements.txt +++ b/samples/api-client/accesstoken_example/requirements.txt @@ -3,7 +3,7 @@ flaky==3.7.0 google-api-python-client==2.73.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 -google-cloud-iot==2.8.0 +google-cloud-iot==2.8.1 google-cloud-pubsub==2.14.0 google-cloud-storage==2.7.0 paho-mqtt==1.6.1 diff --git a/samples/api-client/manager/requirements.txt b/samples/api-client/manager/requirements.txt index 0ad67505..cd6eebaa 100644 --- a/samples/api-client/manager/requirements.txt +++ b/samples/api-client/manager/requirements.txt @@ -3,7 +3,7 @@ flaky==3.7.0 google-api-python-client==2.73.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 -google-cloud-iot==2.8.0 +google-cloud-iot==2.8.1 google-cloud-pubsub==2.14.0 paho-mqtt==1.6.1 pyjwt==2.6.0 From 8468ec0fb0e17ad537ce1c51be828f3f38eed0b9 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 25 Jan 2023 11:33:34 -0500 Subject: [PATCH 03/16] chore: Update gapic-generator-python to v1.8.2 (#437) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: Update gapic-generator-python to v1.8.2 PiperOrigin-RevId: 504289125 Source-Link: https://github.com/googleapis/googleapis/commit/38a48a44a44279e9cf9f2f864b588958a2d87491 Source-Link: https://github.com/googleapis/googleapis-gen/commit/b2dc22663dbe47a972c8d8c2f8a4df013dafdcbc Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiYjJkYzIyNjYzZGJlNDdhOTcyYzhkOGMyZjhhNGRmMDEzZGFmZGNiYyJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot --- .coveragerc | 1 + google/cloud/iot_v1/__init__.py | 2 +- .../generated_samples/snippet_metadata_google.cloud.iot.v1.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.coveragerc b/.coveragerc index 245b9ab8..75633d09 100644 --- a/.coveragerc +++ b/.coveragerc @@ -5,6 +5,7 @@ branch = True show_missing = True omit = google/cloud/iot/__init__.py + google/cloud/iot/gapic_version.py exclude_lines = # Re-enable the standard pragma pragma: NO COVER diff --git a/google/cloud/iot_v1/__init__.py b/google/cloud/iot_v1/__init__.py index a00b9b27..f7d977d2 100644 --- a/google/cloud/iot_v1/__init__.py +++ b/google/cloud/iot_v1/__init__.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -from google.cloud.iot import gapic_version as package_version +from google.cloud.iot_v1 import gapic_version as package_version __version__ = package_version.__version__ diff --git a/samples/generated_samples/snippet_metadata_google.cloud.iot.v1.json b/samples/generated_samples/snippet_metadata_google.cloud.iot.v1.json index a07c90e6..017afae4 100644 --- a/samples/generated_samples/snippet_metadata_google.cloud.iot.v1.json +++ b/samples/generated_samples/snippet_metadata_google.cloud.iot.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-iot", - "version": "2.8.1" + "version": "0.1.0" }, "snippets": [ { From b31192cb5d6a1f8e459df2fc0b8a2655249e6ba2 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 25 Jan 2023 21:53:12 +0000 Subject: [PATCH 04/16] chore(deps): update dependency google-api-python-client to v2.74.0 (#436) Co-authored-by: Anthonios Partheniou --- samples/api-client/accesstoken_example/requirements.txt | 2 +- samples/api-client/manager/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/api-client/accesstoken_example/requirements.txt b/samples/api-client/accesstoken_example/requirements.txt index b8da17b5..31a557ad 100644 --- a/samples/api-client/accesstoken_example/requirements.txt +++ b/samples/api-client/accesstoken_example/requirements.txt @@ -1,6 +1,6 @@ cryptography==39.0.0 flaky==3.7.0 -google-api-python-client==2.73.0 +google-api-python-client==2.74.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 google-cloud-iot==2.8.1 diff --git a/samples/api-client/manager/requirements.txt b/samples/api-client/manager/requirements.txt index cd6eebaa..885bd9cc 100644 --- a/samples/api-client/manager/requirements.txt +++ b/samples/api-client/manager/requirements.txt @@ -1,6 +1,6 @@ cryptography==39.0.0 flaky==3.7.0 -google-api-python-client==2.73.0 +google-api-python-client==2.74.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 google-cloud-iot==2.8.1 From cc090ba7ef1df887518ae70065eb50d36698fc6b Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Mon, 30 Jan 2023 16:44:26 +0000 Subject: [PATCH 05/16] chore: fix prerelease_deps nox session [autoapprove] (#438) Source-Link: https://togithub.com/googleapis/synthtool/commit/26c7505b2f76981ec1707b851e1595c8c06e90fc Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:f946c75373c2b0040e8e318c5e85d0cf46bc6e61d0a01f3ef94d8de974ac6790 --- .github/.OwlBot.lock.yaml | 2 +- noxfile.py | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 889f77df..f0f3b24b 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:c43f1d918bcf817d337aa29ff833439494a158a0831508fda4ec75dc4c0d0320 + digest: sha256:f946c75373c2b0040e8e318c5e85d0cf46bc6e61d0a01f3ef94d8de974ac6790 diff --git a/noxfile.py b/noxfile.py index e716318b..95e58c52 100644 --- a/noxfile.py +++ b/noxfile.py @@ -189,9 +189,9 @@ def unit(session): def install_systemtest_dependencies(session, *constraints): # Use pre-release gRPC for system tests. - # Exclude version 1.49.0rc1 which has a known issue. - # See https://github.com/grpc/grpc/pull/30642 - session.install("--pre", "grpcio!=1.49.0rc1") + # Exclude version 1.52.0rc1 which has a known issue. + # See https://github.com/grpc/grpc/issues/32163 + session.install("--pre", "grpcio!=1.52.0rc1") session.install(*SYSTEM_TEST_STANDARD_DEPENDENCIES, *constraints) @@ -346,9 +346,7 @@ def prerelease_deps(session): unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES session.install(*unit_deps_all) system_deps_all = ( - SYSTEM_TEST_STANDARD_DEPENDENCIES - + SYSTEM_TEST_EXTERNAL_DEPENDENCIES - + SYSTEM_TEST_EXTRAS + SYSTEM_TEST_STANDARD_DEPENDENCIES + SYSTEM_TEST_EXTERNAL_DEPENDENCIES ) session.install(*system_deps_all) @@ -378,8 +376,8 @@ def prerelease_deps(session): # dependency of grpc "six", "googleapis-common-protos", - # Exclude version 1.49.0rc1 which has a known issue. See https://github.com/grpc/grpc/pull/30642 - "grpcio!=1.49.0rc1", + # Exclude version 1.52.0rc1 which has a known issue. See https://github.com/grpc/grpc/issues/32163 + "grpcio!=1.52.0rc1", "grpcio-status", "google-api-core", "proto-plus", From 00b2f96c03f26850114ecff2fc3bc9312ee9ef3a Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 31 Jan 2023 17:43:38 +0000 Subject: [PATCH 06/16] chore(deps): update dependency google-api-python-client to v2.75.0 (#439) --- samples/api-client/accesstoken_example/requirements.txt | 2 +- samples/api-client/manager/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/api-client/accesstoken_example/requirements.txt b/samples/api-client/accesstoken_example/requirements.txt index 31a557ad..57e6421b 100644 --- a/samples/api-client/accesstoken_example/requirements.txt +++ b/samples/api-client/accesstoken_example/requirements.txt @@ -1,6 +1,6 @@ cryptography==39.0.0 flaky==3.7.0 -google-api-python-client==2.74.0 +google-api-python-client==2.75.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 google-cloud-iot==2.8.1 diff --git a/samples/api-client/manager/requirements.txt b/samples/api-client/manager/requirements.txt index 885bd9cc..71bea39d 100644 --- a/samples/api-client/manager/requirements.txt +++ b/samples/api-client/manager/requirements.txt @@ -1,6 +1,6 @@ cryptography==39.0.0 flaky==3.7.0 -google-api-python-client==2.74.0 +google-api-python-client==2.75.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 google-cloud-iot==2.8.1 From 7e59248496bb0f69a6f6872f4a0e6be134d7630e Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 3 Feb 2023 11:17:16 +0000 Subject: [PATCH 07/16] chore(deps): update dependency google-api-python-client to v2.76.0 (#440) --- samples/api-client/accesstoken_example/requirements.txt | 2 +- samples/api-client/manager/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/api-client/accesstoken_example/requirements.txt b/samples/api-client/accesstoken_example/requirements.txt index 57e6421b..93bbd9c5 100644 --- a/samples/api-client/accesstoken_example/requirements.txt +++ b/samples/api-client/accesstoken_example/requirements.txt @@ -1,6 +1,6 @@ cryptography==39.0.0 flaky==3.7.0 -google-api-python-client==2.75.0 +google-api-python-client==2.76.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 google-cloud-iot==2.8.1 diff --git a/samples/api-client/manager/requirements.txt b/samples/api-client/manager/requirements.txt index 71bea39d..4622e127 100644 --- a/samples/api-client/manager/requirements.txt +++ b/samples/api-client/manager/requirements.txt @@ -1,6 +1,6 @@ cryptography==39.0.0 flaky==3.7.0 -google-api-python-client==2.75.0 +google-api-python-client==2.76.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 google-cloud-iot==2.8.1 From 2ee5c4819dfd5f5575cec2177be62b13d843f6f3 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 11:51:30 -0500 Subject: [PATCH 08/16] chore: Update gapic-generator-python to v1.8.4 (#442) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: Update gapic-generator-python to v1.8.4 PiperOrigin-RevId: 507808936 Source-Link: https://github.com/googleapis/googleapis/commit/64cf8492b21778ce62c66ecee81b468a293bfd4c Source-Link: https://github.com/googleapis/googleapis-gen/commit/53c48cac153d3b37f3d2c2dec4830cfd91ec4153 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiNTNjNDhjYWMxNTNkM2IzN2YzZDJjMmRlYzQ4MzBjZmQ5MWVjNDE1MyJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * remove cleanup code causing samples to fail * restore --------- Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- samples/api-client/manager/manager_test.py | 2 +- setup.py | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/samples/api-client/manager/manager_test.py b/samples/api-client/manager/manager_test.py index 7fa434a7..5e62781a 100644 --- a/samples/api-client/manager/manager_test.py +++ b/samples/api-client/manager/manager_test.py @@ -106,7 +106,7 @@ def clean_up_registries(): "gatewayId": gateway_id, } client.projects().locations().registries().unbindDeviceFromGateway( - parent=registry.get("name"), body=bind_request + parent=registry.name, body=bind_request ).execute() gateway_name = "{}/devices/{}".format(registry.name, gateway_id) client.projects().locations().registries().devices().delete( diff --git a/setup.py b/setup.py index d419b81b..80480257 100644 --- a/setup.py +++ b/setup.py @@ -56,9 +56,7 @@ if package.startswith("google") ] -namespaces = ["google"] -if "google.cloud" in packages: - namespaces.append("google.cloud") +namespaces = ["google", "google.cloud"] setuptools.setup( name=name, From 3ce7a17c540ff457e5ce4652a526a5f5e863f60d Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 8 Feb 2023 17:01:18 +0000 Subject: [PATCH 09/16] chore(deps): update dependency cryptography to v39.0.1 [security] (#446) Co-authored-by: Anthonios Partheniou --- samples/api-client/accesstoken_example/requirements.txt | 2 +- samples/api-client/manager/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/api-client/accesstoken_example/requirements.txt b/samples/api-client/accesstoken_example/requirements.txt index 93bbd9c5..68311f88 100644 --- a/samples/api-client/accesstoken_example/requirements.txt +++ b/samples/api-client/accesstoken_example/requirements.txt @@ -1,4 +1,4 @@ -cryptography==39.0.0 +cryptography==39.0.1 flaky==3.7.0 google-api-python-client==2.76.0 google-auth-httplib2==0.1.0 diff --git a/samples/api-client/manager/requirements.txt b/samples/api-client/manager/requirements.txt index 4622e127..706301d8 100644 --- a/samples/api-client/manager/requirements.txt +++ b/samples/api-client/manager/requirements.txt @@ -1,4 +1,4 @@ -cryptography==39.0.0 +cryptography==39.0.1 flaky==3.7.0 google-api-python-client==2.76.0 google-auth-httplib2==0.1.0 From eee935cc89ba09971c2ea1c8e2868362ae53202c Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 12:10:54 -0500 Subject: [PATCH 10/16] build(deps): bump cryptography from 38.0.3 to 39.0.1 in /synthtool/gcp/templates/python_library/.kokoro (#447) Source-Link: https://github.com/googleapis/synthtool/commit/bb171351c3946d3c3c32e60f5f18cee8c464ec51 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:f62c53736eccb0c4934a3ea9316e0d57696bb49c1a7c86c726e9bb8a2f87dadf Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/.OwlBot.lock.yaml | 2 +- .kokoro/requirements.txt | 49 ++++++++++++++++++--------------------- 2 files changed, 23 insertions(+), 28 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index f0f3b24b..894fb6bc 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:f946c75373c2b0040e8e318c5e85d0cf46bc6e61d0a01f3ef94d8de974ac6790 + digest: sha256:f62c53736eccb0c4934a3ea9316e0d57696bb49c1a7c86c726e9bb8a2f87dadf diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 05dc4672..096e4800 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -113,33 +113,28 @@ commonmark==0.9.1 \ --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 # via rich -cryptography==38.0.3 \ - --hash=sha256:068147f32fa662c81aebab95c74679b401b12b57494872886eb5c1139250ec5d \ - --hash=sha256:06fc3cc7b6f6cca87bd56ec80a580c88f1da5306f505876a71c8cfa7050257dd \ - --hash=sha256:25c1d1f19729fb09d42e06b4bf9895212292cb27bb50229f5aa64d039ab29146 \ - --hash=sha256:402852a0aea73833d982cabb6d0c3bb582c15483d29fb7085ef2c42bfa7e38d7 \ - --hash=sha256:4e269dcd9b102c5a3d72be3c45d8ce20377b8076a43cbed6f660a1afe365e436 \ - --hash=sha256:5419a127426084933076132d317911e3c6eb77568a1ce23c3ac1e12d111e61e0 \ - --hash=sha256:554bec92ee7d1e9d10ded2f7e92a5d70c1f74ba9524947c0ba0c850c7b011828 \ - --hash=sha256:5e89468fbd2fcd733b5899333bc54d0d06c80e04cd23d8c6f3e0542358c6060b \ - --hash=sha256:65535bc550b70bd6271984d9863a37741352b4aad6fb1b3344a54e6950249b55 \ - --hash=sha256:6ab9516b85bebe7aa83f309bacc5f44a61eeb90d0b4ec125d2d003ce41932d36 \ - --hash=sha256:6addc3b6d593cd980989261dc1cce38263c76954d758c3c94de51f1e010c9a50 \ - --hash=sha256:728f2694fa743a996d7784a6194da430f197d5c58e2f4e278612b359f455e4a2 \ - --hash=sha256:785e4056b5a8b28f05a533fab69febf5004458e20dad7e2e13a3120d8ecec75a \ - --hash=sha256:78cf5eefac2b52c10398a42765bfa981ce2372cbc0457e6bf9658f41ec3c41d8 \ - --hash=sha256:7f836217000342d448e1c9a342e9163149e45d5b5eca76a30e84503a5a96cab0 \ - --hash=sha256:8d41a46251bf0634e21fac50ffd643216ccecfaf3701a063257fe0b2be1b6548 \ - --hash=sha256:984fe150f350a3c91e84de405fe49e688aa6092b3525f407a18b9646f6612320 \ - --hash=sha256:9b24bcff7853ed18a63cfb0c2b008936a9554af24af2fb146e16d8e1aed75748 \ - --hash=sha256:b1b35d9d3a65542ed2e9d90115dfd16bbc027b3f07ee3304fc83580f26e43249 \ - --hash=sha256:b1b52c9e5f8aa2b802d48bd693190341fae201ea51c7a167d69fc48b60e8a959 \ - --hash=sha256:bbf203f1a814007ce24bd4d51362991d5cb90ba0c177a9c08825f2cc304d871f \ - --hash=sha256:be243c7e2bfcf6cc4cb350c0d5cdf15ca6383bbcb2a8ef51d3c9411a9d4386f0 \ - --hash=sha256:bfbe6ee19615b07a98b1d2287d6a6073f734735b49ee45b11324d85efc4d5cbd \ - --hash=sha256:c46837ea467ed1efea562bbeb543994c2d1f6e800785bd5a2c98bc096f5cb220 \ - --hash=sha256:dfb4f4dd568de1b6af9f4cda334adf7d72cf5bc052516e1b2608b683375dd95c \ - --hash=sha256:ed7b00096790213e09eb11c97cc6e2b757f15f3d2f85833cd2d3ec3fe37c1722 +cryptography==39.0.1 \ + --hash=sha256:0f8da300b5c8af9f98111ffd512910bc792b4c77392a9523624680f7956a99d4 \ + --hash=sha256:35f7c7d015d474f4011e859e93e789c87d21f6f4880ebdc29896a60403328f1f \ + --hash=sha256:5aa67414fcdfa22cf052e640cb5ddc461924a045cacf325cd164e65312d99502 \ + --hash=sha256:5d2d8b87a490bfcd407ed9d49093793d0f75198a35e6eb1a923ce1ee86c62b41 \ + --hash=sha256:6687ef6d0a6497e2b58e7c5b852b53f62142cfa7cd1555795758934da363a965 \ + --hash=sha256:6f8ba7f0328b79f08bdacc3e4e66fb4d7aab0c3584e0bd41328dce5262e26b2e \ + --hash=sha256:706843b48f9a3f9b9911979761c91541e3d90db1ca905fd63fee540a217698bc \ + --hash=sha256:807ce09d4434881ca3a7594733669bd834f5b2c6d5c7e36f8c00f691887042ad \ + --hash=sha256:83e17b26de248c33f3acffb922748151d71827d6021d98c70e6c1a25ddd78505 \ + --hash=sha256:96f1157a7c08b5b189b16b47bc9db2332269d6680a196341bf30046330d15388 \ + --hash=sha256:aec5a6c9864be7df2240c382740fcf3b96928c46604eaa7f3091f58b878c0bb6 \ + --hash=sha256:b0afd054cd42f3d213bf82c629efb1ee5f22eba35bf0eec88ea9ea7304f511a2 \ + --hash=sha256:ced4e447ae29ca194449a3f1ce132ded8fcab06971ef5f618605aacaa612beac \ + --hash=sha256:d1f6198ee6d9148405e49887803907fe8962a23e6c6f83ea7d98f1c0de375695 \ + --hash=sha256:e124352fd3db36a9d4a21c1aa27fd5d051e621845cb87fb851c08f4f75ce8be6 \ + --hash=sha256:e422abdec8b5fa8462aa016786680720d78bdce7a30c652b7fadf83a4ba35336 \ + --hash=sha256:ef8b72fa70b348724ff1218267e7f7375b8de4e8194d1636ee60510aae104cd0 \ + --hash=sha256:f0c64d1bd842ca2633e74a1a28033d139368ad959872533b1bab8c80e8240a0c \ + --hash=sha256:f24077a3b5298a5a06a8e0536e3ea9ec60e4c7ac486755e5fb6e6ea9b3500106 \ + --hash=sha256:fdd188c8a6ef8769f148f88f859884507b954cc64db6b52f66ef199bb9ad660a \ + --hash=sha256:fe913f20024eb2cb2f323e42a64bdf2911bb9738a15dba7d3cce48151034e3a8 # via # gcp-releasetool # secretstorage From 13eddc80a3d73ba2ddfc745d921bc41a2099def5 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 8 Feb 2023 18:23:32 +0000 Subject: [PATCH 11/16] chore(deps): update all dependencies (#441) Co-authored-by: Anthonios Partheniou --- samples/api-client/accesstoken_example/requirements.txt | 2 +- samples/api-client/manager/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/api-client/accesstoken_example/requirements.txt b/samples/api-client/accesstoken_example/requirements.txt index 68311f88..8182c00c 100644 --- a/samples/api-client/accesstoken_example/requirements.txt +++ b/samples/api-client/accesstoken_example/requirements.txt @@ -1,6 +1,6 @@ cryptography==39.0.1 flaky==3.7.0 -google-api-python-client==2.76.0 +google-api-python-client==2.77.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 google-cloud-iot==2.8.1 diff --git a/samples/api-client/manager/requirements.txt b/samples/api-client/manager/requirements.txt index 706301d8..96f144cc 100644 --- a/samples/api-client/manager/requirements.txt +++ b/samples/api-client/manager/requirements.txt @@ -1,6 +1,6 @@ cryptography==39.0.1 flaky==3.7.0 -google-api-python-client==2.76.0 +google-api-python-client==2.77.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 google-cloud-iot==2.8.1 From 8608fa6b0f889331d5bb34867df13c4e6c41a878 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 8 Feb 2023 20:18:38 +0000 Subject: [PATCH 12/16] chore(deps): update dependency google-cloud-pubsub to v2.14.1 (#448) --- samples/api-client/accesstoken_example/requirements-test.txt | 2 +- samples/api-client/accesstoken_example/requirements.txt | 2 +- samples/api-client/manager/requirements.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/api-client/accesstoken_example/requirements-test.txt b/samples/api-client/accesstoken_example/requirements-test.txt index a32bd2b6..1cbe85f2 100644 --- a/samples/api-client/accesstoken_example/requirements-test.txt +++ b/samples/api-client/accesstoken_example/requirements-test.txt @@ -1,3 +1,3 @@ pytest==7.2.1 -google-cloud-pubsub==2.14.0 +google-cloud-pubsub==2.14.1 google-cloud-storage==2.7.0 diff --git a/samples/api-client/accesstoken_example/requirements.txt b/samples/api-client/accesstoken_example/requirements.txt index 8182c00c..99ec1c9e 100644 --- a/samples/api-client/accesstoken_example/requirements.txt +++ b/samples/api-client/accesstoken_example/requirements.txt @@ -4,7 +4,7 @@ google-api-python-client==2.77.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 google-cloud-iot==2.8.1 -google-cloud-pubsub==2.14.0 +google-cloud-pubsub==2.14.1 google-cloud-storage==2.7.0 paho-mqtt==1.6.1 pyjwt==2.6.0 diff --git a/samples/api-client/manager/requirements.txt b/samples/api-client/manager/requirements.txt index 96f144cc..bbdda8c8 100644 --- a/samples/api-client/manager/requirements.txt +++ b/samples/api-client/manager/requirements.txt @@ -4,6 +4,6 @@ google-api-python-client==2.77.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 google-cloud-iot==2.8.1 -google-cloud-pubsub==2.14.0 +google-cloud-pubsub==2.14.1 paho-mqtt==1.6.1 pyjwt==2.6.0 From d7aaaa3862e299c00ef3274f68c4384642845f66 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 15 Feb 2023 22:42:45 +0000 Subject: [PATCH 13/16] chore(deps): update dependency google-api-python-client to v2.78.0 (#450) --- samples/api-client/accesstoken_example/requirements.txt | 2 +- samples/api-client/manager/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/api-client/accesstoken_example/requirements.txt b/samples/api-client/accesstoken_example/requirements.txt index 99ec1c9e..a941ab9c 100644 --- a/samples/api-client/accesstoken_example/requirements.txt +++ b/samples/api-client/accesstoken_example/requirements.txt @@ -1,6 +1,6 @@ cryptography==39.0.1 flaky==3.7.0 -google-api-python-client==2.77.0 +google-api-python-client==2.78.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 google-cloud-iot==2.8.1 diff --git a/samples/api-client/manager/requirements.txt b/samples/api-client/manager/requirements.txt index bbdda8c8..c83a0195 100644 --- a/samples/api-client/manager/requirements.txt +++ b/samples/api-client/manager/requirements.txt @@ -1,6 +1,6 @@ cryptography==39.0.1 flaky==3.7.0 -google-api-python-client==2.77.0 +google-api-python-client==2.78.0 google-auth-httplib2==0.1.0 google-auth==2.16.0 google-cloud-iot==2.8.1 From e1535a007cec10efa02e9b204d07998e89643b73 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Mon, 27 Feb 2023 16:28:18 +0000 Subject: [PATCH 14/16] chore(python): upgrade gcp-releasetool in .kokoro [autoapprove] (#452) Source-Link: https://togithub.com/googleapis/synthtool/commit/5f2a6089f73abf06238fe4310f6a14d6f6d1eed3 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:8555f0e37e6261408f792bfd6635102d2da5ad73f8f09bcb24f25e6afb5fac97 --- .github/.OwlBot.lock.yaml | 2 +- .kokoro/requirements.in | 2 +- .kokoro/requirements.txt | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 894fb6bc..5fc5daa3 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:f62c53736eccb0c4934a3ea9316e0d57696bb49c1a7c86c726e9bb8a2f87dadf + digest: sha256:8555f0e37e6261408f792bfd6635102d2da5ad73f8f09bcb24f25e6afb5fac97 diff --git a/.kokoro/requirements.in b/.kokoro/requirements.in index cbd7e77f..882178ce 100644 --- a/.kokoro/requirements.in +++ b/.kokoro/requirements.in @@ -1,5 +1,5 @@ gcp-docuploader -gcp-releasetool +gcp-releasetool>=1.10.5 # required for compatibility with cryptography>=39.x importlib-metadata typing-extensions twine diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 096e4800..fa99c129 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -154,9 +154,9 @@ gcp-docuploader==0.6.4 \ --hash=sha256:01486419e24633af78fd0167db74a2763974765ee8078ca6eb6964d0ebd388af \ --hash=sha256:70861190c123d907b3b067da896265ead2eeb9263969d6955c9e0bb091b5ccbf # via -r requirements.in -gcp-releasetool==1.10.0 \ - --hash=sha256:72a38ca91b59c24f7e699e9227c90cbe4dd71b789383cb0164b088abae294c83 \ - --hash=sha256:8c7c99320208383d4bb2b808c6880eb7a81424afe7cdba3c8d84b25f4f0e097d +gcp-releasetool==1.10.5 \ + --hash=sha256:174b7b102d704b254f2a26a3eda2c684fd3543320ec239baf771542a2e58e109 \ + --hash=sha256:e29d29927fe2ca493105a82958c6873bb2b90d503acac56be2c229e74de0eec9 # via -r requirements.in google-api-core==2.10.2 \ --hash=sha256:10c06f7739fe57781f87523375e8e1a3a4674bf6392cd6131a3222182b971320 \ From 15758aea9839cc5e7509c17ba3f9cb4f98271b20 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Mon, 27 Feb 2023 16:26:35 -0800 Subject: [PATCH 15/16] chore: Update gapic-generator-python to v1.8.5 (#449) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: enable "rest" transport in Python for services supporting numeric enums PiperOrigin-RevId: 508143576 Source-Link: https://github.com/googleapis/googleapis/commit/7a702a989db3b413f39ff8994ca53fb38b6928c2 Source-Link: https://github.com/googleapis/googleapis-gen/commit/6ad1279c0e7aa787ac6b66c9fd4a210692edffcd Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiNmFkMTI3OWMwZTdhYTc4N2FjNmI2NmM5ZmQ0YTIxMDY5MmVkZmZjZCJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * update replacement in owlbot.py * chore: Update gapic-generator-python to v1.8.5 PiperOrigin-RevId: 511892190 Source-Link: https://github.com/googleapis/googleapis/commit/a45d9c09c1287ffdf938f4e8083e791046c0b23b Source-Link: https://github.com/googleapis/googleapis-gen/commit/1907294b1d8365ea24f8c5f2e059a64124c4ed3b Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiMTkwNzI5NGIxZDgzNjVlYTI0ZjhjNWYyZTA1OWE2NDEyNGM0ZWQzYiJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou Co-authored-by: Victor Chudnovsky --- google/cloud/iot_v1/gapic_metadata.json | 100 + .../iot_v1/services/device_manager/client.py | 2 + .../device_manager/transports/__init__.py | 4 + .../device_manager/transports/rest.py | 2864 ++++++++ google/cloud/iot_v1/types/device_manager.py | 2 + google/cloud/iot_v1/types/resources.py | 2 + iot-v1-py.tar.gz | Bin 0 -> 65536 bytes owlbot.py | 2 +- .../unit/gapic/iot_v1/test_device_manager.py | 6067 ++++++++++++++++- 9 files changed, 8951 insertions(+), 92 deletions(-) create mode 100644 google/cloud/iot_v1/services/device_manager/transports/rest.py create mode 100644 iot-v1-py.tar.gz diff --git a/google/cloud/iot_v1/gapic_metadata.json b/google/cloud/iot_v1/gapic_metadata.json index 31779910..b06b7059 100644 --- a/google/cloud/iot_v1/gapic_metadata.json +++ b/google/cloud/iot_v1/gapic_metadata.json @@ -206,6 +206,106 @@ ] } } + }, + "rest": { + "libraryClient": "DeviceManagerClient", + "rpcs": { + "BindDeviceToGateway": { + "methods": [ + "bind_device_to_gateway" + ] + }, + "CreateDevice": { + "methods": [ + "create_device" + ] + }, + "CreateDeviceRegistry": { + "methods": [ + "create_device_registry" + ] + }, + "DeleteDevice": { + "methods": [ + "delete_device" + ] + }, + "DeleteDeviceRegistry": { + "methods": [ + "delete_device_registry" + ] + }, + "GetDevice": { + "methods": [ + "get_device" + ] + }, + "GetDeviceRegistry": { + "methods": [ + "get_device_registry" + ] + }, + "GetIamPolicy": { + "methods": [ + "get_iam_policy" + ] + }, + "ListDeviceConfigVersions": { + "methods": [ + "list_device_config_versions" + ] + }, + "ListDeviceRegistries": { + "methods": [ + "list_device_registries" + ] + }, + "ListDeviceStates": { + "methods": [ + "list_device_states" + ] + }, + "ListDevices": { + "methods": [ + "list_devices" + ] + }, + "ModifyCloudToDeviceConfig": { + "methods": [ + "modify_cloud_to_device_config" + ] + }, + "SendCommandToDevice": { + "methods": [ + "send_command_to_device" + ] + }, + "SetIamPolicy": { + "methods": [ + "set_iam_policy" + ] + }, + "TestIamPermissions": { + "methods": [ + "test_iam_permissions" + ] + }, + "UnbindDeviceFromGateway": { + "methods": [ + "unbind_device_from_gateway" + ] + }, + "UpdateDevice": { + "methods": [ + "update_device" + ] + }, + "UpdateDeviceRegistry": { + "methods": [ + "update_device_registry" + ] + } + } } } } diff --git a/google/cloud/iot_v1/services/device_manager/client.py b/google/cloud/iot_v1/services/device_manager/client.py index a6705f60..5c9769ff 100644 --- a/google/cloud/iot_v1/services/device_manager/client.py +++ b/google/cloud/iot_v1/services/device_manager/client.py @@ -58,6 +58,7 @@ from .transports.base import DEFAULT_CLIENT_INFO, DeviceManagerTransport from .transports.grpc import DeviceManagerGrpcTransport from .transports.grpc_asyncio import DeviceManagerGrpcAsyncIOTransport +from .transports.rest import DeviceManagerRestTransport class DeviceManagerClientMeta(type): @@ -71,6 +72,7 @@ class DeviceManagerClientMeta(type): _transport_registry = OrderedDict() # type: Dict[str, Type[DeviceManagerTransport]] _transport_registry["grpc"] = DeviceManagerGrpcTransport _transport_registry["grpc_asyncio"] = DeviceManagerGrpcAsyncIOTransport + _transport_registry["rest"] = DeviceManagerRestTransport def get_transport_class( cls, diff --git a/google/cloud/iot_v1/services/device_manager/transports/__init__.py b/google/cloud/iot_v1/services/device_manager/transports/__init__.py index 897cc068..ff78b8c0 100644 --- a/google/cloud/iot_v1/services/device_manager/transports/__init__.py +++ b/google/cloud/iot_v1/services/device_manager/transports/__init__.py @@ -19,14 +19,18 @@ from .base import DeviceManagerTransport from .grpc import DeviceManagerGrpcTransport from .grpc_asyncio import DeviceManagerGrpcAsyncIOTransport +from .rest import DeviceManagerRestInterceptor, DeviceManagerRestTransport # Compile a registry of transports. _transport_registry = OrderedDict() # type: Dict[str, Type[DeviceManagerTransport]] _transport_registry["grpc"] = DeviceManagerGrpcTransport _transport_registry["grpc_asyncio"] = DeviceManagerGrpcAsyncIOTransport +_transport_registry["rest"] = DeviceManagerRestTransport __all__ = ( "DeviceManagerTransport", "DeviceManagerGrpcTransport", "DeviceManagerGrpcAsyncIOTransport", + "DeviceManagerRestTransport", + "DeviceManagerRestInterceptor", ) diff --git a/google/cloud/iot_v1/services/device_manager/transports/rest.py b/google/cloud/iot_v1/services/device_manager/transports/rest.py new file mode 100644 index 00000000..fb28d2db --- /dev/null +++ b/google/cloud/iot_v1/services/device_manager/transports/rest.py @@ -0,0 +1,2864 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 Google LLC +# +# Licensed 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. +# + +import dataclasses +import json # type: ignore +import re +from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union +import warnings + +from google.api_core import gapic_v1, path_template, rest_helpers, rest_streaming +from google.api_core import exceptions as core_exceptions +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore +from google.auth.transport.requests import AuthorizedSession # type: ignore +from google.protobuf import json_format +import grpc # type: ignore +from requests import __version__ as requests_version + +try: + OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.Retry, object] # type: ignore + + +from google.iam.v1 import iam_policy_pb2 # type: ignore +from google.iam.v1 import policy_pb2 # type: ignore +from google.protobuf import empty_pb2 # type: ignore + +from google.cloud.iot_v1.types import device_manager, resources + +from .base import DEFAULT_CLIENT_INFO as BASE_DEFAULT_CLIENT_INFO +from .base import DeviceManagerTransport + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=BASE_DEFAULT_CLIENT_INFO.gapic_version, + grpc_version=None, + rest_version=requests_version, +) + + +class DeviceManagerRestInterceptor: + """Interceptor for DeviceManager. + + Interceptors are used to manipulate requests, request metadata, and responses + in arbitrary ways. + Example use cases include: + * Logging + * Verifying requests according to service or custom semantics + * Stripping extraneous information from responses + + These use cases and more can be enabled by injecting an + instance of a custom subclass when constructing the DeviceManagerRestTransport. + + .. code-block:: python + class MyCustomDeviceManagerInterceptor(DeviceManagerRestInterceptor): + def pre_bind_device_to_gateway(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_bind_device_to_gateway(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_create_device(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_create_device(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_create_device_registry(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_create_device_registry(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_delete_device(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def pre_delete_device_registry(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def pre_get_device(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_get_device(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_get_device_registry(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_get_device_registry(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_get_iam_policy(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_get_iam_policy(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_list_device_config_versions(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_list_device_config_versions(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_list_device_registries(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_list_device_registries(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_list_devices(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_list_devices(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_list_device_states(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_list_device_states(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_modify_cloud_to_device_config(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_modify_cloud_to_device_config(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_send_command_to_device(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_send_command_to_device(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_set_iam_policy(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_set_iam_policy(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_test_iam_permissions(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_test_iam_permissions(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_unbind_device_from_gateway(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_unbind_device_from_gateway(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_update_device(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_update_device(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_update_device_registry(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_update_device_registry(self, response): + logging.log(f"Received response: {response}") + return response + + transport = DeviceManagerRestTransport(interceptor=MyCustomDeviceManagerInterceptor()) + client = DeviceManagerClient(transport=transport) + + + """ + + def pre_bind_device_to_gateway( + self, + request: device_manager.BindDeviceToGatewayRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[device_manager.BindDeviceToGatewayRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for bind_device_to_gateway + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_bind_device_to_gateway( + self, response: device_manager.BindDeviceToGatewayResponse + ) -> device_manager.BindDeviceToGatewayResponse: + """Post-rpc interceptor for bind_device_to_gateway + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_create_device( + self, + request: device_manager.CreateDeviceRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[device_manager.CreateDeviceRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for create_device + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_create_device(self, response: resources.Device) -> resources.Device: + """Post-rpc interceptor for create_device + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_create_device_registry( + self, + request: device_manager.CreateDeviceRegistryRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[device_manager.CreateDeviceRegistryRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for create_device_registry + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_create_device_registry( + self, response: resources.DeviceRegistry + ) -> resources.DeviceRegistry: + """Post-rpc interceptor for create_device_registry + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_delete_device( + self, + request: device_manager.DeleteDeviceRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[device_manager.DeleteDeviceRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for delete_device + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def pre_delete_device_registry( + self, + request: device_manager.DeleteDeviceRegistryRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[device_manager.DeleteDeviceRegistryRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for delete_device_registry + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def pre_get_device( + self, + request: device_manager.GetDeviceRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[device_manager.GetDeviceRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for get_device + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_get_device(self, response: resources.Device) -> resources.Device: + """Post-rpc interceptor for get_device + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_get_device_registry( + self, + request: device_manager.GetDeviceRegistryRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[device_manager.GetDeviceRegistryRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for get_device_registry + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_get_device_registry( + self, response: resources.DeviceRegistry + ) -> resources.DeviceRegistry: + """Post-rpc interceptor for get_device_registry + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_get_iam_policy( + self, + request: iam_policy_pb2.GetIamPolicyRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[iam_policy_pb2.GetIamPolicyRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for get_iam_policy + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_list_device_config_versions( + self, + request: device_manager.ListDeviceConfigVersionsRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[ + device_manager.ListDeviceConfigVersionsRequest, Sequence[Tuple[str, str]] + ]: + """Pre-rpc interceptor for list_device_config_versions + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_list_device_config_versions( + self, response: device_manager.ListDeviceConfigVersionsResponse + ) -> device_manager.ListDeviceConfigVersionsResponse: + """Post-rpc interceptor for list_device_config_versions + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_list_device_registries( + self, + request: device_manager.ListDeviceRegistriesRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[device_manager.ListDeviceRegistriesRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for list_device_registries + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_list_device_registries( + self, response: device_manager.ListDeviceRegistriesResponse + ) -> device_manager.ListDeviceRegistriesResponse: + """Post-rpc interceptor for list_device_registries + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_list_devices( + self, + request: device_manager.ListDevicesRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[device_manager.ListDevicesRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for list_devices + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_list_devices( + self, response: device_manager.ListDevicesResponse + ) -> device_manager.ListDevicesResponse: + """Post-rpc interceptor for list_devices + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_list_device_states( + self, + request: device_manager.ListDeviceStatesRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[device_manager.ListDeviceStatesRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for list_device_states + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_list_device_states( + self, response: device_manager.ListDeviceStatesResponse + ) -> device_manager.ListDeviceStatesResponse: + """Post-rpc interceptor for list_device_states + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_modify_cloud_to_device_config( + self, + request: device_manager.ModifyCloudToDeviceConfigRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[ + device_manager.ModifyCloudToDeviceConfigRequest, Sequence[Tuple[str, str]] + ]: + """Pre-rpc interceptor for modify_cloud_to_device_config + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_modify_cloud_to_device_config( + self, response: resources.DeviceConfig + ) -> resources.DeviceConfig: + """Post-rpc interceptor for modify_cloud_to_device_config + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_send_command_to_device( + self, + request: device_manager.SendCommandToDeviceRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[device_manager.SendCommandToDeviceRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for send_command_to_device + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_send_command_to_device( + self, response: device_manager.SendCommandToDeviceResponse + ) -> device_manager.SendCommandToDeviceResponse: + """Post-rpc interceptor for send_command_to_device + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_set_iam_policy( + self, + request: iam_policy_pb2.SetIamPolicyRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[iam_policy_pb2.SetIamPolicyRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for set_iam_policy + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_test_iam_permissions( + self, + request: iam_policy_pb2.TestIamPermissionsRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[iam_policy_pb2.TestIamPermissionsRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for test_iam_permissions + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_test_iam_permissions( + self, response: iam_policy_pb2.TestIamPermissionsResponse + ) -> iam_policy_pb2.TestIamPermissionsResponse: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_unbind_device_from_gateway( + self, + request: device_manager.UnbindDeviceFromGatewayRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[ + device_manager.UnbindDeviceFromGatewayRequest, Sequence[Tuple[str, str]] + ]: + """Pre-rpc interceptor for unbind_device_from_gateway + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_unbind_device_from_gateway( + self, response: device_manager.UnbindDeviceFromGatewayResponse + ) -> device_manager.UnbindDeviceFromGatewayResponse: + """Post-rpc interceptor for unbind_device_from_gateway + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_update_device( + self, + request: device_manager.UpdateDeviceRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[device_manager.UpdateDeviceRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for update_device + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_update_device(self, response: resources.Device) -> resources.Device: + """Post-rpc interceptor for update_device + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + def pre_update_device_registry( + self, + request: device_manager.UpdateDeviceRegistryRequest, + metadata: Sequence[Tuple[str, str]], + ) -> Tuple[device_manager.UpdateDeviceRegistryRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for update_device_registry + + Override in a subclass to manipulate the request or metadata + before they are sent to the DeviceManager server. + """ + return request, metadata + + def post_update_device_registry( + self, response: resources.DeviceRegistry + ) -> resources.DeviceRegistry: + """Post-rpc interceptor for update_device_registry + + Override in a subclass to manipulate the response + after it is returned by the DeviceManager server but before + it is returned to user code. + """ + return response + + +@dataclasses.dataclass +class DeviceManagerRestStub: + _session: AuthorizedSession + _host: str + _interceptor: DeviceManagerRestInterceptor + + +class DeviceManagerRestTransport(DeviceManagerTransport): + """REST backend transport for DeviceManager. + + Internet of Things (IoT) service. Securely connect and manage + IoT devices. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends JSON representations of protocol buffers over HTTP/1.1 + + """ + + def __init__( + self, + *, + host: str = "cloudiot.googleapis.com", + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + url_scheme: str = "https", + interceptor: Optional[DeviceManagerRestInterceptor] = None, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to. + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if ``channel`` is provided. + scopes (Optional(Sequence[str])): A list of scopes. This argument is + ignored if ``channel`` is provided. + client_cert_source_for_mtls (Callable[[], Tuple[bytes, bytes]]): Client + certificate to configure mutual TLS HTTP channel. It is ignored + if ``channel`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you are developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + url_scheme: the protocol scheme for the API endpoint. Normally + "https", but for testing or local servers, + "http" can be specified. + """ + # Run the base constructor + # TODO(yon-mg): resolve other ctor params i.e. scopes, quota, etc. + # TODO: When custom host (api_endpoint) is set, `scopes` must *also* be set on the + # credentials object + maybe_url_match = re.match("^(?Phttp(?:s)?://)?(?P.*)$", host) + if maybe_url_match is None: + raise ValueError( + f"Unexpected hostname structure: {host}" + ) # pragma: NO COVER + + url_match_items = maybe_url_match.groupdict() + + host = f"{url_scheme}://{host}" if not url_match_items["scheme"] else host + + super().__init__( + host=host, + credentials=credentials, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience, + ) + self._session = AuthorizedSession( + self._credentials, default_host=self.DEFAULT_HOST + ) + if client_cert_source_for_mtls: + self._session.configure_mtls_channel(client_cert_source_for_mtls) + self._interceptor = interceptor or DeviceManagerRestInterceptor() + self._prep_wrapped_messages(client_info) + + class _BindDeviceToGateway(DeviceManagerRestStub): + def __hash__(self): + return hash("BindDeviceToGateway") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.BindDeviceToGatewayRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> device_manager.BindDeviceToGatewayResponse: + r"""Call the bind device to gateway method over HTTP. + + Args: + request (~.device_manager.BindDeviceToGatewayRequest): + The request object. Request for ``BindDeviceToGateway``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.device_manager.BindDeviceToGatewayResponse: + Response for ``BindDeviceToGateway``. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/v1/{parent=projects/*/locations/*/registries/*}:bindDeviceToGateway", + "body": "*", + }, + { + "method": "post", + "uri": "/v1/{parent=projects/*/locations/*/registries/*/groups/*}:bindDeviceToGateway", + "body": "*", + }, + ] + request, metadata = self._interceptor.pre_bind_device_to_gateway( + request, metadata + ) + pb_request = device_manager.BindDeviceToGatewayRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = device_manager.BindDeviceToGatewayResponse() + pb_resp = device_manager.BindDeviceToGatewayResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_bind_device_to_gateway(resp) + return resp + + class _CreateDevice(DeviceManagerRestStub): + def __hash__(self): + return hash("CreateDevice") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.CreateDeviceRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> resources.Device: + r"""Call the create device method over HTTP. + + Args: + request (~.device_manager.CreateDeviceRequest): + The request object. Request for ``CreateDevice``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.resources.Device: + The device resource. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/v1/{parent=projects/*/locations/*/registries/*}/devices", + "body": "device", + }, + ] + request, metadata = self._interceptor.pre_create_device(request, metadata) + pb_request = device_manager.CreateDeviceRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = resources.Device() + pb_resp = resources.Device.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_create_device(resp) + return resp + + class _CreateDeviceRegistry(DeviceManagerRestStub): + def __hash__(self): + return hash("CreateDeviceRegistry") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.CreateDeviceRegistryRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> resources.DeviceRegistry: + r"""Call the create device registry method over HTTP. + + Args: + request (~.device_manager.CreateDeviceRegistryRequest): + The request object. Request for ``CreateDeviceRegistry``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.resources.DeviceRegistry: + A container for a group of devices. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/v1/{parent=projects/*/locations/*}/registries", + "body": "device_registry", + }, + ] + request, metadata = self._interceptor.pre_create_device_registry( + request, metadata + ) + pb_request = device_manager.CreateDeviceRegistryRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = resources.DeviceRegistry() + pb_resp = resources.DeviceRegistry.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_create_device_registry(resp) + return resp + + class _DeleteDevice(DeviceManagerRestStub): + def __hash__(self): + return hash("DeleteDevice") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.DeleteDeviceRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ): + r"""Call the delete device method over HTTP. + + Args: + request (~.device_manager.DeleteDeviceRequest): + The request object. Request for ``DeleteDevice``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "delete", + "uri": "/v1/{name=projects/*/locations/*/registries/*/devices/*}", + }, + ] + request, metadata = self._interceptor.pre_delete_device(request, metadata) + pb_request = device_manager.DeleteDeviceRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + class _DeleteDeviceRegistry(DeviceManagerRestStub): + def __hash__(self): + return hash("DeleteDeviceRegistry") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.DeleteDeviceRegistryRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ): + r"""Call the delete device registry method over HTTP. + + Args: + request (~.device_manager.DeleteDeviceRegistryRequest): + The request object. Request for ``DeleteDeviceRegistry``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "delete", + "uri": "/v1/{name=projects/*/locations/*/registries/*}", + }, + ] + request, metadata = self._interceptor.pre_delete_device_registry( + request, metadata + ) + pb_request = device_manager.DeleteDeviceRegistryRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + class _GetDevice(DeviceManagerRestStub): + def __hash__(self): + return hash("GetDevice") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.GetDeviceRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> resources.Device: + r"""Call the get device method over HTTP. + + Args: + request (~.device_manager.GetDeviceRequest): + The request object. Request for ``GetDevice``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.resources.Device: + The device resource. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "get", + "uri": "/v1/{name=projects/*/locations/*/registries/*/devices/*}", + }, + { + "method": "get", + "uri": "/v1/{name=projects/*/locations/*/registries/*/groups/*/devices/*}", + }, + ] + request, metadata = self._interceptor.pre_get_device(request, metadata) + pb_request = device_manager.GetDeviceRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = resources.Device() + pb_resp = resources.Device.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_get_device(resp) + return resp + + class _GetDeviceRegistry(DeviceManagerRestStub): + def __hash__(self): + return hash("GetDeviceRegistry") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.GetDeviceRegistryRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> resources.DeviceRegistry: + r"""Call the get device registry method over HTTP. + + Args: + request (~.device_manager.GetDeviceRegistryRequest): + The request object. Request for ``GetDeviceRegistry``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.resources.DeviceRegistry: + A container for a group of devices. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "get", + "uri": "/v1/{name=projects/*/locations/*/registries/*}", + }, + ] + request, metadata = self._interceptor.pre_get_device_registry( + request, metadata + ) + pb_request = device_manager.GetDeviceRegistryRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = resources.DeviceRegistry() + pb_resp = resources.DeviceRegistry.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_get_device_registry(resp) + return resp + + class _GetIamPolicy(DeviceManagerRestStub): + def __hash__(self): + return hash("GetIamPolicy") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: iam_policy_pb2.GetIamPolicyRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> policy_pb2.Policy: + r"""Call the get iam policy method over HTTP. + + Args: + request (~.iam_policy_pb2.GetIamPolicyRequest): + The request object. Request message for ``GetIamPolicy`` method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.policy_pb2.Policy: + An Identity and Access Management (IAM) policy, which + specifies access controls for Google Cloud resources. + + A ``Policy`` is a collection of ``bindings``. A + ``binding`` binds one or more ``members``, or + principals, to a single ``role``. Principals can be user + accounts, service accounts, Google groups, and domains + (such as G Suite). A ``role`` is a named list of + permissions; each ``role`` can be an IAM predefined role + or a user-created custom role. + + For some types of Google Cloud resources, a ``binding`` + can also specify a ``condition``, which is a logical + expression that allows access to a resource only if the + expression evaluates to ``true``. A condition can add + constraints based on attributes of the request, the + resource, or both. To learn which resources support + conditions in their IAM policies, see the `IAM + documentation `__. + + **JSON example:** + + :: + + { + "bindings": [ + { + "role": "roles/resourcemanager.organizationAdmin", + "members": [ + "user:mike@example.com", + "group:admins@example.com", + "domain:google.com", + "serviceAccount:my-project-id@appspot.gserviceaccount.com" + ] + }, + { + "role": "roles/resourcemanager.organizationViewer", + "members": [ + "user:eve@example.com" + ], + "condition": { + "title": "expirable access", + "description": "Does not grant access after Sep 2020", + "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", + } + } + ], + "etag": "BwWWja0YfJA=", + "version": 3 + } + + **YAML example:** + + :: + + bindings: + - members: + - user:mike@example.com + - group:admins@example.com + - domain:google.com + - serviceAccount:my-project-id@appspot.gserviceaccount.com + role: roles/resourcemanager.organizationAdmin + - members: + - user:eve@example.com + role: roles/resourcemanager.organizationViewer + condition: + title: expirable access + description: Does not grant access after Sep 2020 + expression: request.time < timestamp('2020-10-01T00:00:00.000Z') + etag: BwWWja0YfJA= + version: 3 + + For a description of IAM and its features, see the `IAM + documentation `__. + + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/v1/{resource=projects/*/locations/*/registries/*}:getIamPolicy", + "body": "*", + }, + { + "method": "post", + "uri": "/v1/{resource=projects/*/locations/*/registries/*/groups/*}:getIamPolicy", + "body": "*", + }, + ] + request, metadata = self._interceptor.pre_get_iam_policy(request, metadata) + pb_request = request + transcoded_request = path_template.transcode(http_options, pb_request) + + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = policy_pb2.Policy() + pb_resp = resp + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_get_iam_policy(resp) + return resp + + class _ListDeviceConfigVersions(DeviceManagerRestStub): + def __hash__(self): + return hash("ListDeviceConfigVersions") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.ListDeviceConfigVersionsRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> device_manager.ListDeviceConfigVersionsResponse: + r"""Call the list device config + versions method over HTTP. + + Args: + request (~.device_manager.ListDeviceConfigVersionsRequest): + The request object. Request for ``ListDeviceConfigVersions``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.device_manager.ListDeviceConfigVersionsResponse: + Response for ``ListDeviceConfigVersions``. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "get", + "uri": "/v1/{name=projects/*/locations/*/registries/*/devices/*}/configVersions", + }, + { + "method": "get", + "uri": "/v1/{name=projects/*/locations/*/registries/*/groups/*/devices/*}/configVersions", + }, + ] + request, metadata = self._interceptor.pre_list_device_config_versions( + request, metadata + ) + pb_request = device_manager.ListDeviceConfigVersionsRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = device_manager.ListDeviceConfigVersionsResponse() + pb_resp = device_manager.ListDeviceConfigVersionsResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_list_device_config_versions(resp) + return resp + + class _ListDeviceRegistries(DeviceManagerRestStub): + def __hash__(self): + return hash("ListDeviceRegistries") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.ListDeviceRegistriesRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> device_manager.ListDeviceRegistriesResponse: + r"""Call the list device registries method over HTTP. + + Args: + request (~.device_manager.ListDeviceRegistriesRequest): + The request object. Request for ``ListDeviceRegistries``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.device_manager.ListDeviceRegistriesResponse: + Response for ``ListDeviceRegistries``. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "get", + "uri": "/v1/{parent=projects/*/locations/*}/registries", + }, + ] + request, metadata = self._interceptor.pre_list_device_registries( + request, metadata + ) + pb_request = device_manager.ListDeviceRegistriesRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = device_manager.ListDeviceRegistriesResponse() + pb_resp = device_manager.ListDeviceRegistriesResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_list_device_registries(resp) + return resp + + class _ListDevices(DeviceManagerRestStub): + def __hash__(self): + return hash("ListDevices") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.ListDevicesRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> device_manager.ListDevicesResponse: + r"""Call the list devices method over HTTP. + + Args: + request (~.device_manager.ListDevicesRequest): + The request object. Request for ``ListDevices``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.device_manager.ListDevicesResponse: + Response for ``ListDevices``. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "get", + "uri": "/v1/{parent=projects/*/locations/*/registries/*}/devices", + }, + { + "method": "get", + "uri": "/v1/{parent=projects/*/locations/*/registries/*/groups/*}/devices", + }, + ] + request, metadata = self._interceptor.pre_list_devices(request, metadata) + pb_request = device_manager.ListDevicesRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = device_manager.ListDevicesResponse() + pb_resp = device_manager.ListDevicesResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_list_devices(resp) + return resp + + class _ListDeviceStates(DeviceManagerRestStub): + def __hash__(self): + return hash("ListDeviceStates") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.ListDeviceStatesRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> device_manager.ListDeviceStatesResponse: + r"""Call the list device states method over HTTP. + + Args: + request (~.device_manager.ListDeviceStatesRequest): + The request object. Request for ``ListDeviceStates``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.device_manager.ListDeviceStatesResponse: + Response for ``ListDeviceStates``. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "get", + "uri": "/v1/{name=projects/*/locations/*/registries/*/devices/*}/states", + }, + { + "method": "get", + "uri": "/v1/{name=projects/*/locations/*/registries/*/groups/*/devices/*}/states", + }, + ] + request, metadata = self._interceptor.pre_list_device_states( + request, metadata + ) + pb_request = device_manager.ListDeviceStatesRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = device_manager.ListDeviceStatesResponse() + pb_resp = device_manager.ListDeviceStatesResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_list_device_states(resp) + return resp + + class _ModifyCloudToDeviceConfig(DeviceManagerRestStub): + def __hash__(self): + return hash("ModifyCloudToDeviceConfig") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.ModifyCloudToDeviceConfigRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> resources.DeviceConfig: + r"""Call the modify cloud to device + config method over HTTP. + + Args: + request (~.device_manager.ModifyCloudToDeviceConfigRequest): + The request object. Request for ``ModifyCloudToDeviceConfig``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.resources.DeviceConfig: + The device configuration. Eventually + delivered to devices. + + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/v1/{name=projects/*/locations/*/registries/*/devices/*}:modifyCloudToDeviceConfig", + "body": "*", + }, + { + "method": "post", + "uri": "/v1/{name=projects/*/locations/*/registries/*/groups/*/devices/*}:modifyCloudToDeviceConfig", + "body": "*", + }, + ] + request, metadata = self._interceptor.pre_modify_cloud_to_device_config( + request, metadata + ) + pb_request = device_manager.ModifyCloudToDeviceConfigRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = resources.DeviceConfig() + pb_resp = resources.DeviceConfig.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_modify_cloud_to_device_config(resp) + return resp + + class _SendCommandToDevice(DeviceManagerRestStub): + def __hash__(self): + return hash("SendCommandToDevice") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.SendCommandToDeviceRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> device_manager.SendCommandToDeviceResponse: + r"""Call the send command to device method over HTTP. + + Args: + request (~.device_manager.SendCommandToDeviceRequest): + The request object. Request for ``SendCommandToDevice``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.device_manager.SendCommandToDeviceResponse: + Response for ``SendCommandToDevice``. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/v1/{name=projects/*/locations/*/registries/*/devices/*}:sendCommandToDevice", + "body": "*", + }, + { + "method": "post", + "uri": "/v1/{name=projects/*/locations/*/registries/*/groups/*/devices/*}:sendCommandToDevice", + "body": "*", + }, + ] + request, metadata = self._interceptor.pre_send_command_to_device( + request, metadata + ) + pb_request = device_manager.SendCommandToDeviceRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = device_manager.SendCommandToDeviceResponse() + pb_resp = device_manager.SendCommandToDeviceResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_send_command_to_device(resp) + return resp + + class _SetIamPolicy(DeviceManagerRestStub): + def __hash__(self): + return hash("SetIamPolicy") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: iam_policy_pb2.SetIamPolicyRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> policy_pb2.Policy: + r"""Call the set iam policy method over HTTP. + + Args: + request (~.iam_policy_pb2.SetIamPolicyRequest): + The request object. Request message for ``SetIamPolicy`` method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.policy_pb2.Policy: + An Identity and Access Management (IAM) policy, which + specifies access controls for Google Cloud resources. + + A ``Policy`` is a collection of ``bindings``. A + ``binding`` binds one or more ``members``, or + principals, to a single ``role``. Principals can be user + accounts, service accounts, Google groups, and domains + (such as G Suite). A ``role`` is a named list of + permissions; each ``role`` can be an IAM predefined role + or a user-created custom role. + + For some types of Google Cloud resources, a ``binding`` + can also specify a ``condition``, which is a logical + expression that allows access to a resource only if the + expression evaluates to ``true``. A condition can add + constraints based on attributes of the request, the + resource, or both. To learn which resources support + conditions in their IAM policies, see the `IAM + documentation `__. + + **JSON example:** + + :: + + { + "bindings": [ + { + "role": "roles/resourcemanager.organizationAdmin", + "members": [ + "user:mike@example.com", + "group:admins@example.com", + "domain:google.com", + "serviceAccount:my-project-id@appspot.gserviceaccount.com" + ] + }, + { + "role": "roles/resourcemanager.organizationViewer", + "members": [ + "user:eve@example.com" + ], + "condition": { + "title": "expirable access", + "description": "Does not grant access after Sep 2020", + "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", + } + } + ], + "etag": "BwWWja0YfJA=", + "version": 3 + } + + **YAML example:** + + :: + + bindings: + - members: + - user:mike@example.com + - group:admins@example.com + - domain:google.com + - serviceAccount:my-project-id@appspot.gserviceaccount.com + role: roles/resourcemanager.organizationAdmin + - members: + - user:eve@example.com + role: roles/resourcemanager.organizationViewer + condition: + title: expirable access + description: Does not grant access after Sep 2020 + expression: request.time < timestamp('2020-10-01T00:00:00.000Z') + etag: BwWWja0YfJA= + version: 3 + + For a description of IAM and its features, see the `IAM + documentation `__. + + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/v1/{resource=projects/*/locations/*/registries/*}:setIamPolicy", + "body": "*", + }, + { + "method": "post", + "uri": "/v1/{resource=projects/*/locations/*/registries/*/groups/*}:setIamPolicy", + "body": "*", + }, + ] + request, metadata = self._interceptor.pre_set_iam_policy(request, metadata) + pb_request = request + transcoded_request = path_template.transcode(http_options, pb_request) + + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = policy_pb2.Policy() + pb_resp = resp + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_set_iam_policy(resp) + return resp + + class _TestIamPermissions(DeviceManagerRestStub): + def __hash__(self): + return hash("TestIamPermissions") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: iam_policy_pb2.TestIamPermissionsRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> iam_policy_pb2.TestIamPermissionsResponse: + r"""Call the test iam permissions method over HTTP. + + Args: + request (~.iam_policy_pb2.TestIamPermissionsRequest): + The request object. Request message for ``TestIamPermissions`` method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.iam_policy_pb2.TestIamPermissionsResponse: + Response message for ``TestIamPermissions`` method. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/v1/{resource=projects/*/locations/*/registries/*}:testIamPermissions", + "body": "*", + }, + { + "method": "post", + "uri": "/v1/{resource=projects/*/locations/*/registries/*/groups/*}:testIamPermissions", + "body": "*", + }, + ] + request, metadata = self._interceptor.pre_test_iam_permissions( + request, metadata + ) + pb_request = request + transcoded_request = path_template.transcode(http_options, pb_request) + + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = iam_policy_pb2.TestIamPermissionsResponse() + pb_resp = resp + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_test_iam_permissions(resp) + return resp + + class _UnbindDeviceFromGateway(DeviceManagerRestStub): + def __hash__(self): + return hash("UnbindDeviceFromGateway") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.UnbindDeviceFromGatewayRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> device_manager.UnbindDeviceFromGatewayResponse: + r"""Call the unbind device from + gateway method over HTTP. + + Args: + request (~.device_manager.UnbindDeviceFromGatewayRequest): + The request object. Request for ``UnbindDeviceFromGateway``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.device_manager.UnbindDeviceFromGatewayResponse: + Response for ``UnbindDeviceFromGateway``. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/v1/{parent=projects/*/locations/*/registries/*}:unbindDeviceFromGateway", + "body": "*", + }, + { + "method": "post", + "uri": "/v1/{parent=projects/*/locations/*/registries/*/groups/*}:unbindDeviceFromGateway", + "body": "*", + }, + ] + request, metadata = self._interceptor.pre_unbind_device_from_gateway( + request, metadata + ) + pb_request = device_manager.UnbindDeviceFromGatewayRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = device_manager.UnbindDeviceFromGatewayResponse() + pb_resp = device_manager.UnbindDeviceFromGatewayResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_unbind_device_from_gateway(resp) + return resp + + class _UpdateDevice(DeviceManagerRestStub): + def __hash__(self): + return hash("UpdateDevice") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = { + "updateMask": {}, + } + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.UpdateDeviceRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> resources.Device: + r"""Call the update device method over HTTP. + + Args: + request (~.device_manager.UpdateDeviceRequest): + The request object. Request for ``UpdateDevice``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.resources.Device: + The device resource. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "patch", + "uri": "/v1/{device.name=projects/*/locations/*/registries/*/devices/*}", + "body": "device", + }, + { + "method": "patch", + "uri": "/v1/{device.name=projects/*/locations/*/registries/*/groups/*/devices/*}", + "body": "device", + }, + ] + request, metadata = self._interceptor.pre_update_device(request, metadata) + pb_request = device_manager.UpdateDeviceRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = resources.Device() + pb_resp = resources.Device.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_update_device(resp) + return resp + + class _UpdateDeviceRegistry(DeviceManagerRestStub): + def __hash__(self): + return hash("UpdateDeviceRegistry") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = { + "updateMask": {}, + } + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + def __call__( + self, + request: device_manager.UpdateDeviceRegistryRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, str]] = (), + ) -> resources.DeviceRegistry: + r"""Call the update device registry method over HTTP. + + Args: + request (~.device_manager.UpdateDeviceRegistryRequest): + The request object. Request for ``UpdateDeviceRegistry``. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.resources.DeviceRegistry: + A container for a group of devices. + """ + + http_options: List[Dict[str, str]] = [ + { + "method": "patch", + "uri": "/v1/{device_registry.name=projects/*/locations/*/registries/*}", + "body": "device_registry", + }, + ] + request, metadata = self._interceptor.pre_update_device_registry( + request, metadata + ) + pb_request = device_manager.UpdateDeviceRegistryRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + uri = transcoded_request["uri"] + method = transcoded_request["method"] + + # Jsonify the query params + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + including_default_value_fields=False, + use_integers_for_enums=True, + ) + ) + query_params.update(self._get_unset_required_fields(query_params)) + + query_params["$alt"] = "json;enum-encoding=int" + + # Send the request + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(self._session, method)( + "{host}{uri}".format(host=self._host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = resources.DeviceRegistry() + pb_resp = resources.DeviceRegistry.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_update_device_registry(resp) + return resp + + @property + def bind_device_to_gateway( + self, + ) -> Callable[ + [device_manager.BindDeviceToGatewayRequest], + device_manager.BindDeviceToGatewayResponse, + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._BindDeviceToGateway(self._session, self._host, self._interceptor) # type: ignore + + @property + def create_device( + self, + ) -> Callable[[device_manager.CreateDeviceRequest], resources.Device]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._CreateDevice(self._session, self._host, self._interceptor) # type: ignore + + @property + def create_device_registry( + self, + ) -> Callable[ + [device_manager.CreateDeviceRegistryRequest], resources.DeviceRegistry + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._CreateDeviceRegistry(self._session, self._host, self._interceptor) # type: ignore + + @property + def delete_device( + self, + ) -> Callable[[device_manager.DeleteDeviceRequest], empty_pb2.Empty]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._DeleteDevice(self._session, self._host, self._interceptor) # type: ignore + + @property + def delete_device_registry( + self, + ) -> Callable[[device_manager.DeleteDeviceRegistryRequest], empty_pb2.Empty]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._DeleteDeviceRegistry(self._session, self._host, self._interceptor) # type: ignore + + @property + def get_device( + self, + ) -> Callable[[device_manager.GetDeviceRequest], resources.Device]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._GetDevice(self._session, self._host, self._interceptor) # type: ignore + + @property + def get_device_registry( + self, + ) -> Callable[[device_manager.GetDeviceRegistryRequest], resources.DeviceRegistry]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._GetDeviceRegistry(self._session, self._host, self._interceptor) # type: ignore + + @property + def get_iam_policy( + self, + ) -> Callable[[iam_policy_pb2.GetIamPolicyRequest], policy_pb2.Policy]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._GetIamPolicy(self._session, self._host, self._interceptor) # type: ignore + + @property + def list_device_config_versions( + self, + ) -> Callable[ + [device_manager.ListDeviceConfigVersionsRequest], + device_manager.ListDeviceConfigVersionsResponse, + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._ListDeviceConfigVersions(self._session, self._host, self._interceptor) # type: ignore + + @property + def list_device_registries( + self, + ) -> Callable[ + [device_manager.ListDeviceRegistriesRequest], + device_manager.ListDeviceRegistriesResponse, + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._ListDeviceRegistries(self._session, self._host, self._interceptor) # type: ignore + + @property + def list_devices( + self, + ) -> Callable[ + [device_manager.ListDevicesRequest], device_manager.ListDevicesResponse + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._ListDevices(self._session, self._host, self._interceptor) # type: ignore + + @property + def list_device_states( + self, + ) -> Callable[ + [device_manager.ListDeviceStatesRequest], + device_manager.ListDeviceStatesResponse, + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._ListDeviceStates(self._session, self._host, self._interceptor) # type: ignore + + @property + def modify_cloud_to_device_config( + self, + ) -> Callable[ + [device_manager.ModifyCloudToDeviceConfigRequest], resources.DeviceConfig + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._ModifyCloudToDeviceConfig(self._session, self._host, self._interceptor) # type: ignore + + @property + def send_command_to_device( + self, + ) -> Callable[ + [device_manager.SendCommandToDeviceRequest], + device_manager.SendCommandToDeviceResponse, + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._SendCommandToDevice(self._session, self._host, self._interceptor) # type: ignore + + @property + def set_iam_policy( + self, + ) -> Callable[[iam_policy_pb2.SetIamPolicyRequest], policy_pb2.Policy]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._SetIamPolicy(self._session, self._host, self._interceptor) # type: ignore + + @property + def test_iam_permissions( + self, + ) -> Callable[ + [iam_policy_pb2.TestIamPermissionsRequest], + iam_policy_pb2.TestIamPermissionsResponse, + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._TestIamPermissions(self._session, self._host, self._interceptor) # type: ignore + + @property + def unbind_device_from_gateway( + self, + ) -> Callable[ + [device_manager.UnbindDeviceFromGatewayRequest], + device_manager.UnbindDeviceFromGatewayResponse, + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._UnbindDeviceFromGateway(self._session, self._host, self._interceptor) # type: ignore + + @property + def update_device( + self, + ) -> Callable[[device_manager.UpdateDeviceRequest], resources.Device]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._UpdateDevice(self._session, self._host, self._interceptor) # type: ignore + + @property + def update_device_registry( + self, + ) -> Callable[ + [device_manager.UpdateDeviceRegistryRequest], resources.DeviceRegistry + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._UpdateDeviceRegistry(self._session, self._host, self._interceptor) # type: ignore + + @property + def kind(self) -> str: + return "rest" + + def close(self): + self._session.close() + + +__all__ = ("DeviceManagerRestTransport",) diff --git a/google/cloud/iot_v1/types/device_manager.py b/google/cloud/iot_v1/types/device_manager.py index d5876ad2..728e2d3a 100644 --- a/google/cloud/iot_v1/types/device_manager.py +++ b/google/cloud/iot_v1/types/device_manager.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from __future__ import annotations + from typing import MutableMapping, MutableSequence from google.protobuf import field_mask_pb2 # type: ignore diff --git a/google/cloud/iot_v1/types/resources.py b/google/cloud/iot_v1/types/resources.py index 72bc3a81..4f5d9472 100644 --- a/google/cloud/iot_v1/types/resources.py +++ b/google/cloud/iot_v1/types/resources.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from __future__ import annotations + from typing import MutableMapping, MutableSequence from google.protobuf import timestamp_pb2 # type: ignore diff --git a/iot-v1-py.tar.gz b/iot-v1-py.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..abf61e62cfd2d43c21141a186284ddd1c1fafecf GIT binary patch literal 65536 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

l@(fx9WImkB_$!z{;$n9);ElASyQObcyW~; zT~F=GpkBpWN!;qXgKXAM6z}n!7AxV`cbM^H^1#@YrhTZTe5#8_H8Z|NP1J|}C_vaF zF1dhT(>$vN1X-XYkuqwCQ{**FAGKlK>AerGFx%CSC7ys#cXG&nx=It|W zSyh;h4rm`jZh`{@UIya+t*LorP_+E-hRed;g|d|#xvo7M-7iQrx8`?vVf$h=`aCp3 zPNvzqcNVTiVK?&V8O!TkH?&+?EVNT)NalKwKXt{Qe=u50H@|gxauw0xBb2O>L+8^A z2nI?62>C2g=US{`2}8u#L5l2=*sQQ#yZ7hb$k=sMF1EZffx!i+-{_FeluySE4M_hl z&$#ln_eDIC{-Se~SJIj#3Umwz)|IHl#*5X~L31nqhE2YVYQyWxn29-1OPGnt4Z2oB zb%8cvLORCwFBDK|y?D7Zf8R4ze%vq$L;@Q(U;~i~`g12sMFaXs^;K0TW6I{63wPcr zJ`^KI9;fEymRt#2RDM)ax1FP`+>f4kKsZ(63}ulkbGQlJ+oJci3eJ5?P~5a^ocgsm zLqah)bjme<*>~Z%ehL_Dir4P`$3-r1C|b-aWty-fl(KP+kx~)lTyE>83mzrKs*#Lk zI>>xB0QoaiHz*+3l@vC6vSJrS0lE;N3@>zoaYj>O{BNuxRG08Q>WlSgs`Cyoq(|6N zl`f}>U71kH>PSJ-oZ`HaWhGkTcnL-7%i>*V1XB}AbG|}TU}~%drq!kSX+ydc7*PxZ zzolcB?yn-Usn9c$m6~ViXJ%qhol)F+PcqJ}m^<3#5du%mnZfu7DMkX-^LQ!J<{R(l zGi3QIhxv%%Z)ta@*D_QjoTZtb$ILoo(TO6vBWd0-9BUxz3Ch3m;BUmCvicu)B=a-# z+(`xu%tMmtHj4`jTxFLjzrp?{$7?gAIw#BM1~SDU)~gVIl3!rR@Po@FJNQVR2Su~- zSevh^7Q!bNU642{clj>g!`NJUu0^^=l+e2j(3pbIYyV$s9_4kkhZ7mK@ooPZku%PfWiveTzse- z15-gOo@aYfD<-N?gH6ig<3dgHiy(b+;ZBRZXeDn=$w_j_FnOR^nFxYuXfyMl z=_->=qNtqydfIHB)i!nbYl~U4{FZY2asd7(mD4q8EnH*;(bv+Z7z3HlIeKW1C^$C6f}(qL z7X9}~q8ApGA;K}mvOG2J=j*(cycVmH<#-@Tc>|NatM@4VWwDNJq4v-Hqzq-+timfA zU}?D>lzS06PhBr0IYv!ph(tAYYe(?UDjSm$QrU#)#9JpGe+5F=6^7aZfvfsHhs%8E zz>EH`sE>sMStk3nxe5pHDjQC;uo`Rho{?6tu<+o?c=%d)gJpaf3~+-2j))##(R4US zXmW{}yisJ~PwORr$aj_rZlk;JTu;zYIDZF?ow6H;?=AkZi&#oq;nR1eImM=z-a*US zbXWDe#Jp@0j%Y27xpnycQYy!AK&|`irb$GhpJ(2U$6&##>PsU2)}JdbrmChfnaNxW zMs}|;no;5cQttUp)9Wr^LHF;RE>wunXm=Tlq}`^1&^sw8T&V2h=73;!4z!1AscR@h`A+v=Ml$Q& zX+{gI7v$dU#H&Kl!r1Pcp-S(&lkKR8{ia9kN-RHWU*1;qGt))64}C$=jDKGnp$O#p z(g30bQPta(2K)vUB$E2#4bryLot42>%$yTxuK;cy&P{?w`dc^L`FBq0M$b%6m>}N- zo?i`y{c6yA_q&4qH4l?JSYaqV*G#&Es`Oa_5q5w133VEEJZM@+o*#S^7B-YoRh~aY z5=()N31nGWvr*LOvG8Pf(_5xI_q)%9LXCuBppJUXAYG3Juzy@B^UFgOzSN3uTyWiK zg;9^kO*(Ede@GT@I3==_UhUA?w!1LdP8S2HOqZ9uC+{h>h>NZIQdXj5=&`7Wp_G*( zX9l7rq_q^3s)iW1&ENA)63W^uoEqqx3QYmYMJc9P4U|9}`64WfssNRw90$*%FR2-B zTT`4x)bZBoiCk9y%G}y>VR+gQPCTWPCJ3E)pw!LsC+U*i&tc~9Rb?7vKAmx0NQd}S zbgUsMm$aH>xw(r4&C#>0Z1>F-$LiOK4RW|1!7x0S(fNr@^2U0@vJCXGWz8!}xmlOQ z&bT?<@xAWUoUU|!?iz!xa9*D|;pL%wnVEZm;FqB)dI{~{3*IOOFSNRUIa-H-tcSlG zf>Lh%nRcJ`F|p$Cx5Pd#1F+hDLKW#kG*BNAJGD14tXRUYNS-*^UO&!fEl2QFT&Jpx zrqUiJ=ucvF(VOSBXVbZ79=kE<{G7x7nTLErO88feI~r(@y~8pytEfKC)S1fbPGP$X zyS?+W)w$fYfnJ;!drYdorN-?9wBP3(@z5E!=~bK5xHD)14yS`J5Bq7x*ht{e4G{!Zn@vEQ7mvOGZJ z)M6yIoQ4FH>SRw?J=(7nE9_`J9O<2!(1BCbJrc}ry1b3*_OBi>@4v5|sd+v%!~|p= zduvQqJ%?t4820tZ{Et95b^b>nlwMOINWTfhq|Ho(UGsbN3c#PhBd{oe>Hh!-o#Z|n z+z}7t%H_8C20xn=24s+25$$&Qa^>mYu;p>Fz(w^bQ+)|hLD*}vR3LUdC+*wSKMQ z=kcP9q-hztwai(0fV^5K(;n~kD?M`-FLN)YZPI$HQ?}ko>qJCxdJaXGK7vd;?Nq$} zaRd3deaa0{R-a)M6AusS<%djnfqOMWa(m!qn&3F;A5))8-+_+_FR)L#U`H*eWl<>C zrXS!P+A!c=UDV)g$U9qX%mi*)@bvv{N&|)1`f8l6P|V2SFn>tR)xiYSWKgO4TQgOc zm_n9dvMIPq{xHIGI=8wGB%+!d`cmO0h)jz+%Wqasp@Pm8V;sgoq`;S{Yr#w6N@akw zPIvsX=+d|r=<+&sPfcrtm7(vTJ{@BD*Ti`?pH^hWq;8rfjx1xGX+@hB;bV?^_AcAV z?v<9%mR^@>(;N-m<;x6)rp?1sc2>>{Ni6{%%1vB;QpF}*I&Mx=!jTi{e3c12GL90~ zxGJnyCDcF8jBEo&m!++f{BZ8@XNWP$10zZdl?Op6Qw2GS;g!_y?1|!cm*z~)k>f2f zPeO5ExBGH+#avOcraQgKK~6=+>=t-r+NV{UUSdyGS`$6PgGB2gl5S{MoVUA^Uf8?3 zz8HuWc&?*^>Uj&L>OEk} zVknr>hrA5&-O1MD33(ryL05*c1DVKz6igQ@sfiT7-Z=(jE@EZobAd;bl?@LlpHQjlRVkQ2?(BuYi#s0Fs@suU^a%kPX|iP1cfXLg)x5@kp_@ zNF&SB6sMGwJ)&Eiq?9f_Nisv#RTd+Vc2p#lIH|+;Xyc{3TAL?4bMLkM<8vr215(F_ zlILOR1KI0wq%L=PMK5T$%?Gc?j)<~~LKaeG1t%x=U`67{m&wa=!U_}IE=QG!oKs%* zNP2=3LVr@jLAOjXacRA2C4bM6@wb$gB?VjgI z^H!MX;MCk84;n5De%kl3p+l8YRU0EC!@{UECSA>K-xQhkn|*U|*Y#M4J&rZSmk`S? zQJ5Qmp)RC}?Zg90Bc=N;Gd-HE^txoioo~7_$eJ+gJ1K$gDY)slwmsV6p`3=J zfa?%H>xYul#8~$FpJXX0$kn64?dqEi<%vIhuE*{rv!XtjLSN7A(jq}Y*#9}pAn6hz z`M+lwci~-UI2Up^eTL>v+Ghaon{JP%n6FUr_veXwa(TUvmhX$xxp!~xx%}>z*YclZ zh? ze|_T%oY0`M2YFoYAg0DCil7Onv*rx9NxET@OgR6neiQ-%auFEmdxtOxwhBF_ZfT+x z%HiOD(NoR<(d7S|D!l|-s@^2B#=7d|m_v!`(Eu+gH75;(x#vRK~C{t1y6lyWL z*jJD(|4m7U2|?bF@r|Jo%5=isY*$7sfTOVfJ3^zBKq?lVx=;c^Qk*k0qSBJ(sp2XFgHT30DtAvlDQIG;Y3&)-lnIFUpoEQuMm@S3LB70(JTug6Kin59N@5W7mzvj>_6x@Ej8v2#SNTsM1JS3v==|;nXvWi6Lp!$bPWO~Z4Wy5@@mqw91JGSy2km$fA>i$A7p z4)mK_&uyD#rGubYd(s?$VGbk*3LF+3Q$N+^q4b%kuuZwR8yXZ*zzb0TAcH-akA z$~@AoV61YRxyb~Z{8o6&kYkAClPk*=G;J(OQD+>c6<=lED9R&oktJ8YwCrZ&_a=>w zpT8r>iS$PevVSKnq#vi65Wl=k!krG$NbfQ8FMZi$t_nRswZ~Rc66_#XVXbH!GcFYxdWsvm*( za%^_>9skh*sfXg_ELN7S`$mGKHe@0XdK8LO4=EEvYm$5YR>|eBsFJk}PC2Es6G|UM zjhR}H#8K=b2ssKjyG1Ah+%@?otp8;RNj*Iq~I#9<|$*6>Ha@^BODnZ9i<5VAmMU$iyeqaol2|rgBP%vGoL^B`a4pE z&To?$b>xV&J0L93`*e!*&3*0Z+P2=#+-7c%{_c%*S#NI!(RGblD&D^ws~w~^d#UU{ zR9I%jQ_yf`MOxA}Oc!pHr#-S11s_})Ymh&@s-^RRjJmeJXR*L(Z42=*6U zsR}Z{vKzi#DZ6pJSajPOgh2}1o*lng_?9yoOD?!o;d#Zj7_`;Ud*S6y(CL1j%zg1q zG{O0;P>@q!5qndw0yW@d3tU^Ya&Z!5fr(0v1tkb4oJy{3}m zr}qK4KR$;G1vdRV8Dd0gx5Tk+Qy7=b1TNvdwqwj!46*e~-qPQ_4|KW=Cw(>!VNMiq zH^$S3P6770GMm-N8U@!|Lw0ZPw_|tLCZqG|5A)2|SWt%RilLSLh+WFRv%KM*yte_a zC|2ssLWgwq>y0MlQUDjmF0{>Yae&4rSNW0%GFN~HE>n(3>B$YJpA z2It+dTR+9C^O5w2_1UR?_3-?yoX5DW9K1g6^W1LlM?UxnI`E{~14yxeGS~n-xP9VL zy_n2lImJWvpi!J*zlCH*EDGbv(r`UFmT_(Jfwk7vEWl36=h`1(NGNFtQ9T+llj&xx zoJc0y$mb|N2h*E=9w8ed2G@_P!|-SF>sbS1>~*&XGpX&ipOn)Sh{8I|d8pgWF!<9l zsnX5+h6IaXQWo>M!=9Y5VtGAFiV8V|v`Q;Ay!a_$d^r<|aGUK_JRmm6@p_N|A&?8K zoDQD7yo+ZGd|L@hBokITUDXvviGFCDdT{!zItCR@(S5qUL>*vTRc|=$JTMnt5JQl` zJULV)oZf{kri*T6W^P(DRKSm!m+BX`pcam<5q%k7R;* z^Ba2=EsHyk$Pj^$5zY83PNqY;IR=>MYPAWsXJy0I>{s$M`1OOA1<#{bZ4D!XlLV@e zmTj$=okcmb(~x{4q<1M=xczJ?2O~>)=&WliUJI+J*$f`YhdNe8-qAs98dY;;5`#(* z)yQH>sm%VALu|l|83IXo1>^ZM1x^^RJx>N0pG*INy{|paV@B+7gf{CQqS4e%v(eZ- z<6)P-r65m`A<%t-}l#J_C7vb#q;Tdh6b(p7{Q#}57-5e2gn~1=zCo< zka?x)>rl?m(dCIfCYz6GTT^So%Nz@Pk&vi*4C&DuDZfdSu;3r-H9BtV&{x<42YSTR zqa}jiGcfD5B&>-O0ug5+We6N6pKMiIbAqb*yV(h`B*@kPa!cF|g!L$0aJl63KD%+*=YIDoKyyl-m7s?`NNWCV% zpojrCSze%t2}&gHbhfvZVsga4>K^kTjp|a2gwCApuL&y%y3tKXazl)Tg=EC`8JSO3z(ov&Ae5H7h0}_Z zO}wpNVG*|EP9IG|x8s$UjKe-ec9e&@4#J)7ie# zd@wH&j+i#cGoV+3{){6w8x&6OD>OrVhyT(DlLd(%Oa%bOTVl)L2z36GSfMs&ZMQi}xf_Jr`tH_5)CiEX!Tp zBIz77vFADYW5m4t@-do{o|h#8h0E?@M2%54ai%x53Oo_oAWAnMt}qQT)D&o08XBWj zg@fkYab;*#c8-85#oQr7;6gA>X?>}9GFksM7 zN;qtZVo2j~)#Mv5iuzcenI0+-MV5sgbaJLnj-EXUG#X0b9}hr>1HR7T%=TUTADrz2 znvp;kH9taCY0w;ljN5+VyUuB1dIk^!Vf1yNQC2x>pF*39*w=A*oRUnRB@5``dD#fn z*zFKl!f1&=Az_xr7!#lTyk15@OjYcN|39Ou&Y;^38)K7D^?)Ga4GR^5B11}O%3s3_ zB{f+n7DhiZN4kMO$bqK?hl4AI358peS{bkNwW*|$U5m$XpJllIlge71XZe|2QtEFT za!AvuZ6t3=H#?S*+IH}P&yE>BHA)P~6(h4uD`j5FS|M}E%wN%(J&P{l3R)B5n0;`> z6|sQdiPE}E^me$r3WVc=R7Zk{l{;R!tzrM!GaJLaIN=z4TOwj8pi3@Tfr4=|S(RCd zJuX}^q)Pj-VL!*TX$r_fCkEU$x|RmUIsUIMGg&)h)I%71ocJeucoFQ2rAXTiI}KZB zL5YA^5(*!_M~M(HR@knLw*G%anSYMM#yM}^B*m>AQ6kUS(F%`Zf`E-#Y9#c5)~6oM z1D7o!y9#URy%uP5{94ZA-3`d~JY{S`dCD?IrtZ6dbg-Al5wu%OyeAU9HssKmV{7!`am5~9 zEHY5vpv&8~<#mbV;YUs%^TwgA+Y4sb-Z;-jZs-p@$^H!Cd2WvTG}J7eYyUj#HV_Ah zoF?L5WMy2Sf-h$)sdapf%VD^}f;9Xnu=z(f3hrOKH2-BN4$Ul^y9Kp&hffyd@m>>5 z=DE3B5d`|sSvYUR>MTRXWjP5N<@)Y@C&{YS`=kB~nzYe79VwVY(Z@>t{PT!}1JZl<%~bNXVtf7j3b`VBcrf@8yuWlW%0=+PmK>%U{+4fp3hL#kKWp+GqV zhb+TZzejui7Q$&5C~15=7wSx&mc*i>XNt%RW^AhfvTGVpxQ|!xo3EL7Wf^-RT}1gN z8TyXdkcHCXUlx${BJzyR@pT1i!rJ=!0XojUFSNDBHw*$8IBq#Pg_Uo(G(wR-I>WDhk$21NX6)n+6GRw(W>xQv7Z~(tYR>4GjXhX>f zIjKPAx}S|F$IJI}^_AQ+tJf<3>sdjBD4+PM`8XsI$%ck7QT6U6Cv%xOQx7aRA52;}3~f>tdKdboF<(Z7h;2 zu^%@myvE_ebdM4l5L~J0FZJN`V(D+zPKFM zeKuB{2byL!{n>9!+KUJyBHt0aiuY?i5SuI?@d7TLH}z&p_Xv&r#7At}17;@209F?) z(_8%JHmD96_v9v^no(tw!8@(?$S99D9=;+pnHj-hqjKtw@Cw+zfLtfmKW9g4vP=V4 zadz$~|9X?m1H5@^xcfUnYq$vy5&Ac818l!#G~L3(_!(D)lykLQD{ns;CgGj_*(8#O z>G`Pl{T^UlxY9H4<8|tLFJ7y72cdP#yPkV4+x(neYL!z)O|V95Lk4}IPo{z6g+XUk zDov{c)`*W@y^Y(YMidpP)GL=6`ecb?#=!Yg{Gbl{#gwdW^zV(4>Xp#}Qc@32s@=>N z%Zy;uhN*(J@do@{6y#OvBzpN_3pyHMK|4K2_ex#TPsOJottwSWin>B@VB;gCC zrb<0u32-EJq0%KGJ{e=wMj+n3cO0>e?!?Vd#rz{K6G3Cj4Cmrt>k2z!+EKL$oA^f# zh%F^=l4~#xV;$<^5rJZz&N$d7M3e}WQpk2ea%uR9@{}%{&ZDAsbTEs>7}V4BF*}EH z9{G4kBE)1kM#|EG2`4ZbQX5HKiXnIMbWrI^bFmspy$@b8k`IfvgnquEqFAmXdi)yu z6SMR0M~+il34fnH@cbY=L4_m0UE(bP$H%rW*r6JCp@rWk+lnNQ1=7vO86!W4`dX1} z6l|7Yy4tY?FTCs{$3MP2O!q$hdE-3rw+Ok3(ojT61yfGVNKG5<)b2e5U-Hd)cDbIZ zIi5IATv^U@56!MmrX24OTl3XRYtKnLYYn9+aU7}8MN6?nb6lG>OSWrrZ85feVRCJF zVafjc(gI)Jl^mP9nAlXdq2aC&mBo%?1Sd-QfrI= zwpB<1+>2(v0X|uVH&j+VD&Gz1mh9J=rxKHcF|2hwGw;_H_H&!|W*C04oKw{r%c=rj zgMSLj&c4~jqgr>fMQJ_|)wSt0l0LJ zW~!a&b?D7#M>_Rx8tX8#=^^s92I*&$l&DIAfW^V^9f`5RYlgd~t>=%Tp!Am&c2Q?N z>milz%X+pr^IrV#NBIt6G5>18jZ>70v^=ZwWnc3-2*%<6_* zQ&EwKO-i@79nomiN>Bu9=Cj02&IhN9Ys>)7I zJHklmd{Gj!-lH%xu^aQ&B094^7fjbMm2vsiJ_vGwh>jjYULdhp(psNDr3gSVmu{3+ zU=cqLrB_sVE@PYJ8d6K<=}6C-c%N1@*@roiMBlAlfjj-$&1%HQK2NNqWxeC-G?=#>^I} zQ$ICk-To6?uEh(!!3Sgnh=;&bVu>7r<&>bZM`-|doug? zSEwlJh#iRnt2IN|n&GwNHgP6HM|eZa^lDtc9dxlnZ58HpGDB+jC%JxggC#GFid7_P-=>bGieTN>)AnOT)n(|QtWKzj&&n3`! zI|8jcv~yGofx#WmJFtHb{cOArqs@PQ-l-j&n?U~Q^gn3uN6PvK&GpQH`^YN;CAaOg zigPI=N+eFV$~GODlv z0=+z31^)hNJ&1j7{m-C;U#`u^tu0KigG`*ueFi}gY3%mD;-KpvaZs)uxqsvGo|Tp+ zr~0OTx?7@Y?^GE4=6eH?r9GLnbd~JwUe#c_K*ou*);kqPlGrkwil+UUm7UNjj=2!k z?OK44C*YW4nG(J?s1VVLsKQu4BRIwR(a?h27ph zb36k#G$!{?N(ra)ujZ@1H=`@1ZZr5?e{h{TBF*OegkB7}?xevI1OmO~>KfSVt*)CI zeXBLU$~!CBI}l@?{Pj&eQ6Gi8@?V8rYH{V>yJVA!3^q3azU6<$J-qM_PXT1;f1QtS zQwTMWQmb;#Q_jjnUwvb>mG4 zYo$j!O=_ge*wSUvn390lI*l~g&x1S*=&)4Hv{t5cJM}XB40!2Yex~`yc9!9N5S`!0 zUBz1@SZ|;IV7AgqQ2(NHJ{J8i)_!Q|7hTDwyM1&BV;J?{dZ#nTwy1xQ=$s{!SYH_}=Lc18p+_>dn}Q0#Hyag(cH(Heyv z6D_G>J(H>n{2zy9B7wklg|m0wBq;2_9(efr?;-5UuOil=f?#0*VwTS{fP5pkIegt? zhFL&OfsTJHmg*L;e+gel!9w?UU@i(I$E#-H1>S>X4_gMY4bYcge>-#C6Wik+hYv9h z5VaJLvJ?obiNG=>B@!$aZqmmcgV0>iK%B?P8W?C!^gq!Jr~w)f0`St0T7|O^$!s!0 z3w}BM$>=X2;D!^!w}f{wvCy;5XwYCJ{@t$t+$X40fTHd{4!3Oei= za3ri@Ajhs?6^tubWK(KvCdUf#DUFJ?;e|qhs7Xtm2i5)aqa191*pY#Vix*3U03e%w zQrEjdc;M`e^Isrw4vf*=FCMIJoS7cI$>X#|o6$hY)Op|t7KsM1OvA$xZi8!Jshu$k z4MfUC+8*irrYr&3GtUuGnN>H~y=;OCC4bVF`HgGSUcE!faAMp7zc2K>hbHXq7IhiN z0k?y;%!0grAL&ca*TZY$1N&p6YBwKwmvI|tK1TQbuQ}(xr-26riB9daoc+#bk|bdu z&HjT%ZV+dLO(m@hP7xY1D{kV2teEFeg6)9CSx9xj9nvEf|+`zTP z?&_FB4^Frz3oKypKucU(}dTY`}*OES9!JHMyTXxjmoFJw2dr`sVib z*WWg_L%4n%{7z~Qun0s>^*4uoTOUvV`Zjv}b-oT8qJ{SrDQ}jRXrRpI;|ad^Z!WV@ z;6xc>LCwWaU|$k3Ui0I6p>uQL7;Mfzmn7}^fYR1=G7Va2!9gjyDw%-x5I7v9?kcAZ zOOcBg_`T(4u_iADW3FyzIUOuk@HpP`97|*qStD{{QS2ckLC15XGdC5j^f@H%HR}_f z1EFRn*Fozg0+SU2xFBFW6AjN%S~}NMP@c#r9>@JH09SVW?Hlkxt=Hd`w4SNFmR9?< zKZN;N6AoBP#eFbk&j3q80{x(@YjH<(?=rHvHw!zT`%Mo)1IW&Oh1&xVvQGsMA}!^$ z>=s)$)zrItUOznU1rdMy2=kr>mA!crzmvux2E~K6>#@Ryv&0th?9@0ma8`-2>>qLE zaHiw1r|J^&v9vTY4s-!;w|PA9%g3i%n+MmV?!q%aUtRc;ZgDO_b>dOtI5Cqj5c?A3LlS_v-&|A5e z&e4miFpk?DkEi9K%q62zpPm(OD9>W77PJs-v4i?vD>_)JXyBzA;{bnr0V{zei4E8x z*Zq3VtA5Mh>p7`W*PFu{(LCFM!}=i2+D9aNq8^j4Vnkd>>G?kG0rUKK-(R=IZN4=o z4(~JGC)T>XPP{LSsMXi_0OgdYS*vzkZ)H7Q77QtP7A_UHl2i=}OdCKE{W!^dB|mNoQOZC0Ip^9fqJX7GS8rB!KUxsIHgFPYIA zD|E%9-YwcHnT{N-k+MKjP2qa?%?K#4HsB+ z^`08bG-c#OZ6u7LD-j!7AdeUE%l>g9gZ#bkK)gCC9lF!d2Y}B%G*-Ft{9&I56qQAu zYz+y`cx~@Y#Qr2PEXa;Q;f|8SDQGz|UITNZB$RlYn`~Nk*09WZI^oC;-Cp0O7C(3RDj)RW<+3sOm?DpfM z3U9R)b6XxmL|?f6<=F3xj-Wx|U+VP+_>Rt^qW+j7_)GU-D4u0HaW%aUICbTf#swVQ zEXVC2WE7S3|Cppa-Dg6~jSu6@TX~hf%u~ku4BGKeg8om*D_SdsO3lHQsW3`rhbcfk zoZLQ6|B26shtKQ#>TqIh;@ur^%o~uq6;PMS`~O<@!q|Ws{lubegUhqJ)tS+WnY`hd zw{Z9`8RgQ#ZTEf7(T?pEOs!<^sjmWONj)JjUPx7%--h6Mo}gbtAszo_3o9fH>;J-(l4hz^A73?VkLZeGV+2q3zE6n)8qJ$YFElWk0GZ(v;>@i(@)^WSIxS8B}G)a5lmK zIK9JxBi%jgo^9{Qzfs=XrHgn=X(4jPYz2;AwaK5#D0^f8k|PHUA||3-=+5UM0jDQV z$15%{UFNgb`EGF+UvDy;WRWDY*ljWsJR(a?sFA4zqJYzk3%zl=F@Q2P1SY8haQZ8L zy{b%&3SZ0^LkeFJba|rFHvO`dw$z!tfwZl*@L1USAJfD_TDu#!AuZyneRi?UR^fJ< zHDjor(pKFR_c$TRtqzo!)xT7($sH6%6)0NEb=l5M#Fbi2;LmU|Uqjv~ zZ2XZm4KnTr6q+m54-p3JeQ$82TJuKAypictMo&zAFJbw1jL@w3&cjg5%>rQsC(cfr zmEq0W;{`ALk>-qJ#&G`H!e_>OWqlHI1jg``%L@$Uk&{cdtF=dPw`#fB}T?9{kP+3x#Y=KA492Hg>vX5nR@N8|Gc zxp{paE%amV(fiM^KnbV0NJ;t^E+mM1Mc+6Jm_D`9a4ljL+;@VIuCV7<(-G% z1(TEF_g{?-oJa@q|C94`o55U{w+l5-Zgbvw;QXhUWO|{N zq2(4cmYc1J#;(NY6!t$5|0tmOuca7PvK^q*+_AEDePLU~_VWImTN&;d*qsag9?t$@ zI5Gy{dHu*gc)Ke4KWfR$Hv+%qhd%Q84Ntu>u;@I<+3%?uf2A&WK6pa?ukVkC*L%#) z5C7Z2$?sGiwJ+`0KDgI8ge^Pr)!Z?^8R#V2Tb7m{lWtzU31nQwQp4v!Gcr{mj>1fSS3e{UXlf683aUplX2h|REs zYd>g@6JFC>*)3`(3S8|{f1^5zq4&6;+fx5jySK#rr>VZ3?xjn|y;J-6KF|FVU8Io# zjZ?Ca+7B`#G;xh%Y=Ig9LzDyLqf-ZaG zV7bBE3^%P9y!f$ZWOpN@i>-+aQsV+B#yy~ZDT+&EdETidXD{OoH_!uE54E`bOmejb z2)A|;bu>}3fvD^V83~s^q=2AZZ?AImaPzSq`D;0TJc8VAE>6GGmZz5FcXwc16g$3C zl{}>?rC-Xov1is8YuOr4@_d2O+Kzwb6~`Puu5MP?U!Hs~FUS6%CIeY}EC6-$a2_J% zSs>{##h3;mnO9-IoN#&LRvNnHe#Smjcg-ey92!F?x*c+oHnt0tKmJ#q{D*BVuMmPJ zF&KzJ1mUAAY1Ch)8Y!5ogI!esjII=lY{}EQsF6TEn)X(N@~3&H8Z6b6P)i|`$yU(x z49S!V6=h7ufKiQSf8KQWlP>EJs+M~x7?=G5jqNYqyiLo z#OKHjsCM}01R_{|Q{O5_=WKJ2hq0tpwx|6qL`jI5!o2nBK_B3&*!?LU5nSgH%-(}! z_}AElvdJ3917r%0QfvkR+j+eF=~DN*~LDRLTU(YOi(s(L8Ti-ug7$H z1f%=0bBAFs>)^_ho0*d72fBxj7CLM!WrA@3oLp=icF_Fn&x;{EM{a#T?`t4F5Sx^u zkFP7PP{oAVD@m~~ho2EMGvrS1T^R_%pJyC{Dd$YtdS-35RG~QTN>BUKOi`4fMX&&Vp%hDXPb(omf?_53v1Nl zBeKA9O&o>z&334hyk7L^#h5SfwZ1H(%%6EH8b3&PF3pZ+EKb=!suV;d|-0wC}+CE;_H|Vbv zvfBIj`nWv)*L^)DQe=R4FQ#siw!PQd*tc=C+yn1mR)khSD*Gt65vU3R{l>iaZA>XD z2J6(HLCV?JR|LL3{60R#aA0?uCg*Z7}7c8J|E`7UpiVn>EbC8chCf4UXq3~ z@9&M}DsEjc%Vls9swij5wpZ7n`!ql`xcvEVN6X9YRmOpRu)~Bw;^xs9>?r86WIq!j z_rF@>(|wWJdzUA|Jkqw17&&?7X%z{_Sk_26n60GuuCaQAFs0ox6#80Rfk3%2++@0r znXYK56{;gS>-?gMZRmcar+#;2lC0fc7-Gu7H&pGDsik*$-7&wn)>gltr%@HpDi@tt zc2eXMQ*9U#DeL6<91S6jrgEZloJvzZInSF;L^WHgt6}?u=th5me!uu(lW5lqw*0VQ+bLfO?ji-S#rot5u87o^7rM7CTog7 z9AO?OY>_WO>RX)(6-?AppPddzAy%Wr9dFqYa6rF>fC!ol(xbL2Xa6ZbXHp;93A!U~ zNGESjplwalQ{sL9%Jds9)wdCYNfCrKEPP=((c#ZC@9zf3cB=>FUOg0rEVg!gCA}+K z!p`Ms0p!JRFx%pJ66$zJij}d1xdRI`{YCZE!U;PsSj8uMrJvUhg`5NYlKY!}w0Y7C z(d{zWNSq1`Mhomud|IV1=UT7R-Cdb8RlygeJ|QWST{TfYLCx8^YlwV&d`4s|9z=1K zN)`fo!8%w?yL2+>ycV1HGFr|-cui4$oy&Zye&tu_3`&C_K{z6K`1%^2>|W20{|ztZ zRQwv~xhDDB25!XIgUI<)JW^ZABcg*{j%TnrkpBDzl&4cIu!Xz0Ryd&oCW!?L9I8G5 zKWYi;(d93}jv)Btwqw85{V)KH!X-Lxjo)KtGIC+G!W0Az8P4M^*^dFQX|eFFH$6^z zkRoGH+s{xX)R55wm%%B}h|yuB11t;g)fmlf{VmDe$J6>; z8q9L9D%r`7WFGqfC9!{&12-msFO>LU<7uXQR9ZT@4U zXOfsu{H_Kfw*W@Ck8OqA8r$-@TqFzM=z#JgAS1$uBhD)?d;{S?eSJ(4u3K>p;m*f)zQ@$#Xj4&rsORm8J9r{VH#`C{aEQ-5R~Qy5=o-NYC~aiwm}s$R-9i zT4SIL`bH=+GZytEyxoLv9TatXL(M z0Jz;gI|8V%g?!`)%4PT2yIlJiwDTgpx#4uk&^h;0?%OYtrKugvk^>pU(Fk=CyTQ1H zanPbA)Y>u>a$jpVX0@j=-K8avNIS9C1-%a;haCOMzF^a1gSuhd@j%IH4{q3Kabw-c zYN4+Qj@PrjF2DrJ)p|;P=}Sf?gQ@eX-7=aR{puIXPUXyzDEpISD5}*S3?jztnsf^T zqdW(f^uS6ui@DNpBfP+B@%)d^WfgO+2D9Gc- z_t@4n$nM-VxH=l(v1{dTuM_P>1K@_(88zCT24VQ0Jv1BdKqc+US=C`9?qKm$JhKMn8o zh}8+y%Hee7xqpR%p)|7cW1Mb*`i#@C;@Tg-W;722)Ici&UU_`?J|5LwfI|EAxGc}2 zgP^SYjMn)Li2K1Deb+qM^)FfqtgkzcK~OD0@AbXi@Xbb-o&Gq`&C&-l0hNmnSA z{Gv2_mEvg?EBavXb`jrVN?lUol0ATkBu?iuNK@&z$9w&P@f1pu4D$8#dP0UfFd1vC zbbVf9r)fsux;TP-6af~kYX{xHf9>bX?dJBrr2)UFgp;}R!aHF{<|{Yu>KnHIIFV(L zU+jN5Y8xvr53i43qVQZy%Yd^)-K+s}V&e?x z6WUbP37|7MKNskX7?!Q$glx&jSAc051dW71XnCh_?)|W23s1i8XkcG5<5i&Vo_^iJ z%)Cy$UU1le{k#_F)Jy%|+IP?2D$@)Ku|(`WKTH3;dY**0rFmxZVfRv+qBD)z%|B(Y z{x=--b9p&udcNN&W@VuDF+uyu`UuqfPpmjh4tFqn zMEZ6(`dEqj_KM_#!x;>VWm7FrmD3cC!3(69spzF5yc=i=1hYB}PaElIHY1r0TU97{V5&DhBfuN@Dv@PgN^ zQl+Dn6S7OvG5dj4!F5XdkB31gfD3VI3QPEGwvyx!&V;Rx@}>pr10}@A6<#`461gs1 zrq^8pqw_qT5gb#G-2Fd5mQIF`_#ApwQb_6W>^uiZ8N=@L>+8u=aY`fi=mZLgBE}3E zJ}PM@iSelz1Ex&C z=1tKl-qUGIl4gs9;)xC|E;gCIGLY}StPW*&yjwg-kG^T#!T$1xwnAqg9Y?3k5Niu_ zdt&xQdBNc)tNUV~PERg);$@7@02sK^=DA<;C#e~#AdaK}a;%}62WCr*S)t%k{mr##r|kH>3DSn9uA91?q;{^lkN=gj}z#qOUn`3z1DeQC}cRxUBZb3p>G(C>V z1t{&Q@5VAV@1e{qAjFi4t6FlB8U)4F71BQYmC8x%NYi z^-~c0TBaz2xrN}3twrpsx`ri26xx6?;L+XgXIJ^5;V`Boxhr35 z3pnzFQr$xk{D5A~sP)6k5oLLRC)MuY%{eqRLoj$J8QXnfnJ^^z(_W7xWkkf;`7r_G|; z?JECqD$XN@No}O1ZBSx>iuEYNM5<(3cv(R@!L)Pv1bPW|*pgcQ;faor_%(G0!qQD$ zf9JJmM%R<)XjQ%Un4+`6TzivWRqcPjX@XI9s7kv3!WQWUz8dzR)ZWqvo@DGb44XeX z5SVjR9~Zik3_%8)PZUd~04#_8<-aed$w)8*p4$Afd$Grah0tvokH_Ai1rbhEAB)yz znkTvt*g}i3QM}eT#PTDJh>J<&fYKd1pg-dP7s7IpdLz-FJI3IIv-KezyAH-i z)b&1qI5G9KM2z*TzRO!*xP-haF3ltAYZ4#ED3cRVa#2Wz$;h&T*Q#1&$L3NR@io5D zJoTdrDtNDIdR75Vch8(kSeAE^lYgm|zDi@#5R7C8QkEbgFYV-lcqy;v0{j$^%^f_E z(#6W!u4TfS9l}#ZuL5@20!negK9Ne+>e#p7B~$;IrdC!E-Vq0(T*a8tgn5m<&oWP4 zHmG&L@_}{xJ=%FM*52|^T1~Pg|3acX425I6q?>TyH__Ol>Jygljd0*0N6UE*m`%DO z(_)%_A|wVq&oTTp!Ol{4rKZ2)cN^(?kaJKEU6|!OZiYhroy#pkK^xGGV3YkOmDN3A z!!>{!1kZM3n74iyz6&>>=g1eX9BY@UEfPXX{GPN$KjmNo7Fv*U<ka476_$xCY z^#G8_t$Q(B=yWKCKOVY*SOEL)W)XV#Ig($OX0+fYl}9m_MK-anG`-||T%bCKAjDSU zBBw`cvDJ`>-mKvPHzB9x^%Jfl@;Y3ilI$C?ye#X$Ux=MG{{eSzMM~seQpEK*5fb}> zjejrSIx1bp?q1lpuvrncekSn+TPemotq87AazPih*o4+wb%av7#FWcRB36j&K4GNI zGk8*Vb$q0Ln{frYZ#$n|s~L|fCSFNz`ks?JAI&*5B*hAYG*>9r+M(MF$}Ug67h$T6 zp_upi_r#~LML!=ggEz5$atm$DFZOu7AduDxG4dzh4tO1xosW_RFk1QXOZ0->(rr?qkI2O zB2Z!dL?4u(Ny2I?>}3hAw;5HxpL^PD2_~ZDrMF+Mdf2=T>t3> zg}7hV{n7^`{BcL)Y=ezbZj2gl6E#iX*zq0_^Og8E7PpKDg_BQjC0*T0Hx8cI$W$a$ zzrg?%KHX1yO76e>VxFUw`68Nz7m+ka!_qQ3T_u{4OSMG1wegdj?eIm1;odQOW%&P8 zb&kQgKEa!gZQHheV%xTzoY*-r-`LKHZQHhO+b7=q{##qS`*ogqzI1g}_e|e&-N~ga zzYjC5yb04PQYJm+4DFpad~oG;PBYZ(2GA1{gt|k2r!MHG7F3y+mwvcrEvSfV+_6F{ zH<(8XkmFe8gnf94U%xG0a0IyGY4Ua2zp(9TumEuQL*ZEUZ01{SZ#iG!xDI>XGIISFo8hhaIv}eVg z)kqr4QOrRUAR+Nkokb)G>`Z^+H$Lnr#Fv#6ElM3poS?J=5}CZ~fs>HiJ)Q(d>c=de zd)Mnztr;mxue@HI^p|Fqsh`x6{RuT{R6b#_ZKwCK0Emg+Ttx>)GdG`d24N>RNj87s z@s21tS}c+{_Tc7@guqt4Zt3&mQRQD&pn0MEALA=YD+O183aM<@gkY3=@q)rR4Ws0A zcX(aizBsgO_wC4!xyuNOkK%R2Wd;CWE9&__IYL!lGoG3ICDDcHdR&!fKv7akc1q zJXK@Z3%)RoooDrr&kC5sn16?HdUi9HiA$o3g$W#9vPu2{HufhsG2&$7z64G=9fU9 z?SAyWe^nu8vfwdJCpprxLIgJVyMy2Y|31*D&=RM#Svj$sA?}lAH}MB{En_HI5oTsS zfjgyjy<=H9L53~Sm(HQakYPSGRcez$_ku)otgx!4kmH^}esCWsQsnOP<=)rLV=zwY z&|%uY?P{dm615X!2VE4M(OhCY7$cle!J?jgDo-qB$m{F_O#CgHdxQnY_FcBdE~Wt@OS4#;>MRV5dL?;}txJ}z8yEWsECKVW=~ zi(Y!W03J+9@Nn19p$AXzfI;=OQ#XV8--ZWj>hlVK$A{>!*VRh6ayG=IXpu4d^+yNs zd8R+-!nM>bU-J_c0}}AaA_ho}!uOJqG1~fs2rMfSJwM+*I^hLmQa$!yt7=?Yuyi_9 z4JaR^U92-1wHRnOWWYHD+rD5-1}|J%8g=<@iJdNw_`35q^ziLR@*I4q-}(I7mKVu4yk;MWl~r zi$H?9jn)k9_?&I+wo*msSm2yco`tW7fDdzF-PG1Y^_F$rD8&{lnDN}@>1B&dreVD( z0x9vJ#V7Og`!3E(J2v!7U@?fEQ}?+rx#l)Ed&-AAJQy@8v4|ezp)rlZf8Nn`yPbg4 zy>c&3*4omY{e}(4kHEw8fhS2Q+ab;1G&_;Wbz8KC9yHat4!=7~q{AQyC^#x71~=g^ zF@jAUuof*Ee)Ry*z&OULS6fnfv{A>$b-u)}|3fz*0RpN)J63(s7?!g@Thfh?My{7| z4=)p62?tjWPqk5{hUjl$wEHqJO+mGY4oEJ>D?UVAc_=cwVh>D3Y4;B#&+=F}O^Grz zjJ}4KYYhP|nOA+K=yQ;}Uw?sHW2gta{QIhPjC!=Ly^LjU?iez?XIC!vahzrk9#b6L zdH%wbta$Kh2rE|r<3~ZTMtt2hSl-HkzVvN+%MI;-OP^ujEQkg{ z%i7Q!orsd!p@(5q@T(1_x{jnps~({~Ocpi!sLQN9jLwWO_hL`j?K+j6Xfe`^Z?9)E0fB=KK6>GD);I~=Mc3|#no->yFzof;gGs3!!a(t zr?XWv1f5V4oRE}2zRjRZl~hn~UV&FMwX28Prj9;CT2PYBa;cY0CDKej*a4|@)vnVE z$j@Em-`#jL$D;fc|BLW;g+HQSF^3WzosSWF zcEg+@PFii7oXOOUjeMj_aXY1w*n{60ShE4lwGGW3yK71XuGx#1H&;u(>J2@q%02T7 zqpCe%8sd9``P(F(ED^7;spQbok-bJS%tkxC6@lF|Xe8AYb4|Zu%rdyn^x`nUZsgm#+fh{0;_`)>q{qvniVt1n%6^xVbqB1^mwl7je zU5yj8(L#L_K?)&${VUmT&(z;*ZxocUzo__*bfezG&&T_9bxXJou=OKX4L6$tEs>gg zcyPbjd2#~IZ$(Wa9c8oQC<>H;fFI3j6zNzVFv7b8WUB>7 z*c1vBA|-}dIgxM`x_U7+n7LFg3SCx~D>r$lkrvs#pFhN`{Y|G8i{gmXs8kFDAoECV zwJ(NNXbYUo_e&GFR*bd8J@|2+z0QPz%?O#h6)>i-JN)(z_ABGDw{cYN`vdUS7}>pS zj{z4{sME|6NMY0-q|I;9z^D_^n{hjpy=A<%CZ2OR0%gqd|2Y0-Zxbjd#x(hVyM z+8&iq6_kKvCQ%JdUp*F0B~-ygD+0xJq}_d)Bw`53%jVuz^uKBM)IhBy$w!0uX77kB zaP~=y*ccnmRA-Kc_rCgVA=DMcrMJnJ(3r{O7a?4w##Nb8!bp`taj@kQQbL1vtyDf* znR3bp>p)PYs+MO*Vi`t5w6Jp5?=niIXN&~dT^F;OLaaztX%tShkWbnmrmQ_J?x;z! zcx$5eOUfv>MCDhD?wqWSM9|SAkMxQ>G5yd>c*hNOB4l{%p(|lOsqo{8iS54jXJoOl zJg^)kaOu+!P%J{I%QWk^qFRrsF7-iy$qbp_|#gVlSN zqH)q{;?fRGcS?OU$%PjAvN~Bgs%_TA^wpy>WX0DD+@7VHtt1%Z6m2dD(lv7t#JsPP zQUumOhHI8q9NKGwq@t_~a5gBObv6PE!lWQEHoQ1YjQ3SCRl&mjJCsA;g=})nWbwLs zW8Iapw0+?3wV#%J+Lg1pLPNI)F6F8ZQng=zhMZ!? zl0o2Fw9lNR8vpwbG3726Q>D5xDD$G)-hU}e9U*53Z`Wvurkp<-KMSPHSPqpFi34mR za?iedQKhLh9Q69iI}B6#oWgn#hM=OM@FRzD`6kr_R~(>4zdGBeF~Qq0fdDlLTuLYb z0fly@XyojvyGKuR1WIsSoSD->Y@(2WfgHJ$V+K}X1n@LDp9D)Ta&@5F^g?s2o+UP+ z1+|`6iq@>!avX)##?dmI7k_!{hWd8_6NBM!^cH8QhJxg-QWFT{SHXhU-d;phbtGKy z6m+&IbTl$@x*t2QX3OZ^3}uDXvG2``R}%pc$7EK421`YU5r}?%F97%!0Lv=RxI6uh|#fKZ# zdXr+m7DXd8|7+s8rf%g>2k_}qld(vH&#cn*PE8_ z7?M{9l{URkOuH=O;I|jH@yh)4iY=M}{w%Q-hptl|EGh#^r3@}iXmp3b3eHn)848Ne zG(B<6cRimrdRjeOi3j=#}!ak+P6gGeN%a- z)K7*B!@!J*8&JN)h$@cBs5p5($VpKg_eIZs%{CCFF+F)dIMYVn-J)!(@D7Zf%f|~Y z7Wg`rsD^{Kti*|SU~3Fd`abzh_AG$$4(pzJhro94@At(w@l`St`PuV*xHjW0z&(@7 zjP>cc``pw074_yNs}S&Q;s0Hx{%!NU_K=&a^F2e81AhTjkC11^_2)XH_Dbb^?)4k4 z)qhJ`(Dn8EajhY@>ce2jME5%*`Oo?N_v^#SOyz$IM?J~k>R$qzBctCnn-M!T3b3UN z-?_j1-v-CO)%dtC3^Fkk^}c#M?j9}vkJawaABZnwd*6Hzj(6^=soy^y&u@$W?H;=5 zX~j|0`Vv^%`0=qn`lcbE{jU0Gx&PkdANnBd!IXmZBytc_iW~WU$-NQq|GI1&{?6sw zYB}kl^`v`mx%9`r%njp#BxZ{#Zt3um+X7B8A8_BF2l)f*e=5Pp%QTUE^^y9}_%H%r zc`qkqi6#oLg~pDD$|nH-tT{8_{nupag!SW5>~IHr63?36u0i_J>-j=Z`}}eci|fNj zx%lkC178d|?Dh}gHQU%&V?io+$o-%MVRt?Ajno0JO=NES33T}{AzYm`Sdpp|cY7l`0Zqx27t zgH%4$#S!ddSpJ}VP(nPp+ZkD?zc*88&A_(y%W);_0DtuSLamLZc-$Me@h=7dO%btVgT6qXw!va8qPG#A2I8pQ_-HV)-{~%6*I~tG4w;CM-!Ui1 z`k9{h09YnD&a-ae<>s;GY$>K^?S;|QQVQ#;B?zKa6HC@s@n_l?a`9UO zXNknhwZ|pA6(Kc#G8=Daf^^z%`f#z=ZZm`V>tBCE${}|HYnkAyn#I-HC4R;u`z3ft zE^9wmqJ2r1Xgh35>+jd44|WEP0X<%cK*6i@7;Az#Bg%FS+S1(kuWn_l6^9idg|(D_ zQ60{P`(pqnpnsjzqq)nskyvxa7FUIsf=x~A zZEX#kEvA>=w%N{^Sx$}MqhMRUo5-ti8o*32GgrgSRM%_=a({>lUzojK!Da5Eo}~X# zk0?#bWR^Iu)w62}5kK3=qt+nO@coD`6jc#pIwWsP% zDgqRFYHUnGWR_4@A*Ix+6O# z3jaz-y;Nv9s+b-pCp!~^dffX~H^j?_5Mg`cF%37)+!i$Tky`KNt{i4HQuPgW+i~<0 za-_E$lqEyA^L#+PFBD{9#fP43Akk!Z1r2pSV^`MEK9Et_8%;bn2a?Ep!2}jcwL|Y3 zv*i}MIa)SCDH1aJH<+&`5ht$>iiyfeZST!^jUdY>Z|;B#f={hb>P})AgHl*XC9+XY z2uo*;mg&@5F7QCs?Irr?WUpyM=uK9->ii>w zmeGSZ_#xe;XZem)@vwlz-!Jyv>-(L?3a!V!6BuMSvvgho_E+*eg#Jk(ptMJdX%kZU z;?Vx`c)mPKnMY9>r&SSAdh&#|LaneJXKQ~FJBu)u@hzjWOuoB69NK8pVZ>JWx|V4? zjH$QLA4r=Sba?Zdyb#@ZIPBWyY?5d&{6mjBmOXK!oeie7_hX3t==I$mq0J*c+2LN@ z6`tL=VkEiwu6A>l&GsmHgEg^3)C zen^;a;>?5#uy?Z5JqdZP(&C+2=vKUye@emP*z*gH$tYw#s5lPN7)y_e;pD2RDf> z1brMw!!zVh-LNipisgHRsC0X;;ncXcR+8U?-ngOX0BlqhTtg9MMTCLXuvWuUR(F)e zOZ~e_25Tlt$&xA1M-)P47?l$}=$U=!cg|}N0-Wn&TibJ}0jKj*JKCN@grj6AqV*;G zp={e@NOk*={^+@fjZMSFy?=|!%_K`aOIem}LZyL}4I7)#(a<09DnBuSG>>7-LIrAu zAnLYPxT^18up})b&LA%zLL7pR*DmBavFzg}JMVLui3jc$T|WY)?TYLMc*QFGxH#Bz zWQ>K`VZ{^|<{x%teOkiz)B8)!4&DobK-MFFHo?nwP8T@3BZS*D4!j|>t@e(j6uK`C^m-DxL%;sn%VeR$zayAF?Ob*NL$p44; zMrwU7B8}rGHu-_S)6M5{iYvUFS3xyf257>5EHGq&#Vz2?WItr7?&Y1$ma#&bP|iCj zvdO@(E8L}fuPJ}U>~U3TM@sfBbPwC(-!oQu);X|4oxt{tD66;|MTVf1b- zf8T7fT3>gPC2V>ILm<_odAjEiiMapwFBsY9yFl^K@$}=P$c^RKtM!5oDHhS(eVW>=#leBUS)JvdKkt1i z4SYE(<0}VK7rEyxPmhBwDC;}8uS3t@!a&f%C;v$CO&tDMPtfvvgp?zStIPzP z$aK4;h)&J=2HJ2&HwCi&vTMRm->7TtdNi-O@4si9Fu6Tr-erYMM4REunpy4PYbdf8 zKh|I zSlJfn0YXwh7eaa&!-U!&LxF?n7bn+A#nc4Re}3P=eD3Dv^xj$IVu}iBicS`^5XJk8(oD&TC;6= z1@xH`HDh06?;W?qNFCZTFztjif`oTKmKa?g+{8hmi!uOA*}Q@c`cwMG42kS|@AVTF z8_Js2f@*6KsxZ&vY@^vky@QIR$Kz8O*_y9ZE8B|`fY=qp5^0ZtOjmy?J6G+#g+000 zkEvWko`^Fls{6_yg6d^B2lMyJTGW7e8_grV*yxH&S4eX?+hopmVmVftFPZ2<&~%(= z!4S!Vcz8CE(Qk~!#&a7x@vS>4M9(9t(#dYl}Yn(C;ft7MwWXs^t-byR^n5EqlXD?4T<8RrYVH! z3`%3Jb~!+{tb_gujCSk{_5z@sK+MQ{NSPg6H?4^;4bKc|Gf&-Vtr{8F2bV&=6IFuN z^{_o8qZ!)G$a(ah;*yxl$~rL>-D7Sv6>3rM)}~vvj!=MxR_LAia6gD+mmZy$tqfOP zFwcB7*J>g>eg1M(y53u%UHpWc^!1)nxoMBjrSrBmQ$>hk&l+leQ@jmdqywx^)++<0 z+pf5C;C@rp+XS)#v)NWXDlsW??8KQadyoc^4uwCpKl?d+!>ufsg?oPGtfEauLUqRq z%!mbXEx6S|wS1S|i%k{jwf|&gY)iOnbHH!Z@e$RENQ+y}dwLR-hy~WGvNmH5BJoL_ zom8!jf;uSb&|M9k@#woPop(NV0|Z;PJRIuU0EupglPbv?K9$v|`$o?bkt&H=Q$Ccm zI^VA_o-WBVNj7~EG9tOd1i$jzO>Y& zh};HI8VJE(a@@;e6L9^|g&7F3feU;CGPaHDbx?7N<90gz<>qy)T=PFKIrSrA493g# zI)}v&8`_=Kq#KZ8!Ufa)9_Bjw@0nWu+Cwx$$cU=xaEUoHscaXK_eiZ{K_=0cPTUXL zMaYI1O$LoqC!iE!Jr_A@IGs6uOl5A1ucUS0H{v&!YRZ{STF3L5m7$af$PUNa zy;E(Jm^jQH=P9~uGHC_+UUGE%Qnyl|fV#$ETrq&{K|8{mT(Jdn&YDA5S zhX%Uh0l2yO2vL&~@J`fmZNKLa5I_u~T@BmmG~)DJ$lN`L_gnIO`P!=Ut4gafkyNuv zs6G6UBi*t99)}}+F+L4jiMSUQiw$j&)Vf27LV@JO8xvL=3Cq0(`nE)#UTs70fuRPx z`fb)i2D5a52rUofm&*y<_|5?v>-@tpN;)Bde#J4zFd4Uak1ki9t>Gkyoi<;PJ{dsM z+el~2JLE!};{5^|$&CxDLq2L7G)FPQ!X17LsA82Aoi?+g2qs_#?f0hjm5H_A2HpWq z2`Q>)(DTP?PbJXr#ofa|v`~p@gfe|~^qBC3r7zf3{y~3`!G&Ur4U!KBI70_=-w$ij z!A2$LnSn3hHD+f5fsL1IaVXH2-(NIY_`XIP>XL5FA-3Lvm5s{q$mPjfwl=Pz{JI;A(43~35;RvaC41+24% zjgkRsw75}DH;>q81(n9lHBPQTwR*xYM&R?+zc3{kiZDRWL6(=OEpeFzLkirw5ubKD zN2cTHc@ljq({ckDm|dMhp#3#$VvXtL*;mK0V^8}fJ^wx4HANyZ0Oc$RfUFPu{qB|c zsr=P%YSq$xlUHCH*5e-5DVhM(lWI+>>CE~%MUZGL>8LFLM;HKk6Z7&r_*$no#7hJ>#LvKgA z=0_skblqev<7iHN%>?$i)X@c93|jbxtuBiwwoda5VKv#dq0@&)IZqFo94T?JGnLh4 z%wSJD!ZYS_j}1-ApxKXnsT|5Oem=xXD(M(ZWt22{i_M?{NY~HT8plGw6uygH1P_f% zkzV(JlIFC}1=bsAJ!2=w%s>4^Z zo)Y@)z|@{Qf*>chFH2qztFfx0=92lWcR4J!xRQo)Gf9^U?W_q?EnLJnWWx>#1@y@<1`&Q@TTx6Hdof#r z=*Tve-6bsb5bv2wu~{9S%n&pdhrpwesAFR7qXL0@e51f@Q5yAW8Ob(@oetN^R1F;0 zT=kUEGF01$J#rWv%dGxl^YpJRMJ}PX>AA&0q_j$dVQaLaDo-0`r%#>bUvs9mcU);v z6k77yV?8H{Hv zOi{;Wp*T(p_Jjzd8oGVNYtLt613$IJ1t#+jaX~d zvW3LI$pL#@DQl)78K%FJAhGS{1ru%cK;&7P+XLG|YVP(24A`6oYV;^xZcQAV?g}4Z zzI|Z*n+*4A2Ch%&-%#DZ$GLbs9>HOJ=*s_$>>-OhocHa9t{;!=~>@|`f~ySH^JdMwL0oT|ah z;3z`k<~-dZs87-Qx9~(OpR(g)Br8O;?paVy)S$uZDQ#Qyy+ zQkLaNat{qui$vd1k9Wm&vG2HqD(-x;*aU_LMs&QTlwV>?!q-*jb=$TDah!akqbU^S zUy*S3!f-Of6zYzR{4W={X`DrtGV6+fdQ(lY#+7WrB1d#W%S%xcPur_<1=0iJYs?pW zkb~+F>{S#0fTQxkb~=KdS?&*9j~W(;9a!g?JtNGsHp9HAUtvApBk;$`JvyG6ks0Ye zb7WyJzs}|IR2X5py-Zg1&M`v)6#PZ8?+-77I9@mttPw{Bvcv4@p~K8Ry}6T^Nlizl zD{%lBI$XBnkVa;3_*iPqEY>53L$wh!w96J2FI@=o6(p57RxVr>!;lX>GiI$H6)Ila zELOGfG<}w}3cFK?NYbR5&M4r5>b7zMSRW*JvkHiN%IA6y|$0Y=WSQggM4I52$WAu8MbE1IR2TI zs9M)_ex^QZl!4;C{H-a<<1A4sgSRn*0Qdgg6r>GZUQ_+ap1BmLIjiksYB5X(5nUd7 z`*(MGi^CUpibAA@ynEH{EAQ%-)_woQd*_*V!7!90#@m)xX_k~-@zJ(uZe_pTsN%}@ zOzKZ_vM&EVDs*uDZ@H}CUz1ch@mM-2aj^zuvd{DxXp|3pL_anT?}0bae)i9D1*{Sv_d$X72tJ>N`aD{joOM7Pzi24&h{Wv zSc2ifj5_SW>S%_!J*A{1=}EzYF=nHXy~PwNFV=?yhOOV=Oe0@SEN56wBiXW@cSJGa zvKt1Q*2Ys8Et#eT5j_Plj#B1YT5A?&xyim_nho_1zUECt7{`q{(fwga5m_B-a#Z%t z59OND%x?YUXkFD(6k0>xb42Wgg_qnf`R|Ky1+)4=-QS#rN#G9Zs zp{k~~D)o4c>EIg^>+n65zc|0y?!(m#rlwcN&FBo1Wo=p`?69J`0_>im&<#5E703(! zA-w2akf_6JA+npwFXwuTZIaR4JA_vJx(vBx5$z$sNAvwr+)@y*Bpmu8f1L;ZK!Tqd~(`eTpV&i&46He2r8;p37LL-!^ z<<)HTa+Bf0xdE3=yb9I@bRt$mYmW5{;nDX+RbZ^zUd?$DlOZDEbLu{jNl%zk*};DA z^b(XJf~X2c-`{#^=N$0E1}&wYx6TjGTG20rTf>WSJ`&@=IO)quCa>6H5~_wPF0(MC z=$ll^+7`Dt1z|8GdcLgaM#>7-xBZYCIB+;VNVn>)Js-tgc&0B9lP=T}nFR2|;5wQl zL*d#rcr;FB)8MJEXoBjQ5a{RPnkJ&ay&`icJLBrBNS+3Aa<<%mWO>c%3bDWRXIXD^ zdnWVTqpyX*7u9w6k^{3{RR62w)L^pzgv91pK%y-@V`iOqqqos#zwE7x=}pxhk3VtX z#|=!7un%!+YrHeqihAB9mBg8(Nv&*SWAQQl)N(>?z1x)S6*qyJOd%fE#(ojLL(8QI za>AB3Uz`v5z|iC%f#)Koe!e0AP;2QCJhb_- zFiNV9ZxLUYJaHOElfH~(XM`06-&*??0%$8GKi;o)MXm^~48vieyqJOSW{QaX_y^k* z2H!^|@)&5;KmgC5lWky@K}&E@&AsypKNd$-H9Z=gHRTY*N=K+ERXD823O~WvmHvZd$odP8njzSZU)unUy2-a*=HypHDy^ z7Ka$s92?0w65HK$$Zvr{ZJZMVX-jrHY#$v7A&JxX5~)!IoBxBe4pj*0EL=+WZ|fWh z>&-Bs)@M?DUROlH>2A65iAc^~0c(47^@?M)Xs?gK*+K09Lff@g1|mCk&O?=@igAIAW!u_iAq>3)}%Ru9#cruX2o0dZ`T8hKmq{ z#GQY{3Ps4rIphNv$m!g|-bp^+pEvhjJ5_uWq?!~MY|}Tsv0kW_8&QEZ+gQ(lw-6)P z2!%6eYt*%x{Dx}B1;+1oN`_vxB!f@j9_F35#gyo+D>jA#TY=FiGsIq8KOla_AZEKs zHA4T)7X@r`Y2rB?gq{V`I*T3k=W33bfqQV5yS6v{iL-Z_zYzwDi^Yc>Zl6np)+$DYSLOGwD!(XKok(o$1dA4TY&frCTxNcNx5-vcQRv!gE97U0E zc6{8(AjeZypkVh>HNmzH8ih;e*2^NXNSdt0?M{HwcwmT^kZjJ7M8;kY+q8gQJ8lp? zkcFAJfkO`27-lc55~67qj(D}7I?HlGAU>;k9fh|G;oDz1S{(*B_Wt2^JK_rip2EI* zFFaFIC8PC9_(IY?o~3eY-?^V)`OnZ8uZmjU6TWC%dw2C8oABm`b&;I^{+)y}JfZsy zCL^}J)U-30Kf^6nH6-D-Ey=e`)fJKm+OzZCyps;W znnbv{v>FjeP^R?Pf)-GSaWbT1XCX5qT3IOG7y$>coOsZlbvB=DX8e;ilXFC0TMlQ!fOSA3ngA4aDu~A^egqsC!oBqE6 zAKvf3MZ3IwFChkyQw`r27xcqAzcpB#p!2lW-mtkV5(Ci@jgmVAzCUE~FG6BRo_@JJ z{%>e1=D_aXL-H}@4ior-eA@b$rPN8&8cu_$U747NKWdyD@hP~O*vkg|4^w((-dpv1 zEA%!dhDFaG<&35&YZ+#;!#+4Qd)?-9f>&2^6*S?5xXR7mQg5Pn+0(^k=;{Tf5(T9Z z$S3-6^aG<04w1(qwHgw%sJ|Z``j$&blQ|cZIi)g(pRR9~=Gz~{GxsGH5y#3RQj=CI+*1jEIm@VZ_QsQ3Yde?VN?3{fFy_q_7VgV2 zBOj$-=W&VFsuXh%6cnCXkeSsYYF;hYU9G6tS7|-5S8#j#Y?CJO z##SCY!vXPim!@jm>kVo0zx$sdZgU`K+{W)xAhFpORADWFUw48HGx#7BpDPQDN+RSU zV#?aH?Ixwk11rmQlK9&z`bu7QNfob=Te@}Zs^XDpUlc9bg!C6jTx|`*1)p?HJ7njS zRq{rxz+`KE{zynp+3Ai9@K769Y%2!PQh97MAtV>B%!+8+JM8QM$F>WnpHSKo+r|y! zfLp0rz^&olUJJ7*zZaH+3{kf%L&2FTa@_ZiFNlNdn!;>Z2Vl5UcoP<{>IK&%BNQm6 z8NHrDZ%;wUB^8xE@oZ&@sA%>=jRF9g-XZ>7GZZJL!W=05KTRDN|7ljCXzu`z4fDm6 zj1%^75Tb+SpLFK1L3?dB(48%G-3POl9(ZHPD>d8>#n6v&8sG^yHOZH#S7a^?wnFJ%sV4Qp6FRzPd6CuhqGc>i;iZyQ2-Y>42pk?rJP> zTs^AYmP0y!PYLFM73+aR&&x%)ZA(?WX`ae8r!;uKZ#5i@Hb?^>Pzxudhgaixa=#vV z?)2A7e>)9#&Cs;?RS8}@H4JY~G3Odg0kus-NjPF=ilC>>vIb7GRB1CBPEsIo7M_D!ilyqb%MzEdKA=n7A(?_53D`*wm_Hf zJ?HPdzBz{j^R&e;Y)$3RfPh>t3M1BH=Lt1OC1P~>7iN%8i^}p3($zo2zdNKyyOwUn z=;Z<9b7JRPEa+)qx1EiL$4T;4Xn3O%7M_#1TzrEarrbCuqe}(HZC+c#6p&`~(cp7f zPRqBR=0sv!?^X<`rY0F+p|SQx=+7Rp^f--Ym$RsvSU$wXrgrY}@JL*J5vJ=GpM<(h zAzwE8{T4!EuAd4>YpX|Qgq5l-e20%sOV8~~ zYdI??HD_^C!EQP)e-6hUFtiOn5}Qo(FtHzuj!!?9nABYhPmgB3 z$7|QgWxWSyi+Uw7|B2_%VmUIaCta`jq^5n`5d3*eTATB-QClbmbAfYc7#{Ni5on?D zV6>;f6e05f+%gi*y+WW+eO;%8LF9`Es1Seuq38XF|7Tq&7FISFp()&CyP_GYv0?S~ z(yLXFiQ#`?2>34y(kJ!ChAbLa0mHp)*-Z>OoDM&GKlk_KjCWw`pm0G+YjsjIQ-{tl zBLldDa(`oOyBvl&`QkZ~!F`4alHuF(O@0bQu~xlrjgO$XRF+JPNZ<(Q&r5!xXt0li zj~!kGu|N8xn!!v6gwS?X9xrfPaXab{qo-V9Eby$ariYG9(~U>pKi`%gSUR<6V}nmg z_OTBxnj%b!FKb%)ao(}hBE1gnalprasGn+JyhZ(9*rdwBqsStRGP$%QbsGOU17{5~ zRyNU@f))LB!|5Nfy_8>C%{ERkBK4qqDP_zk0f`+8zqf*_sM8gXdSZ4?2*bNu;2N-G zfHs)YYZD~M{&~60z*KdcPI>$zSx02KKly<;pza4ozY7VOMig-R(BM-hrMMt6r;UC< zKo=CJrpbKQmRaYVdDYcaI!%<`Z~5E_g+ycGSDzV6&PX=_Gi!7Yxwk1g66Tqo+nMH=Oi;4=Eo^?|7&{Dyr3{X9YRI;@59}-oJ zvr+uRz^Ha>d^>yzA!o3Z!Geik52oJQL82`$&Y>ypmL#q-R=;x$s-RmbWv?!WaTufH zT1LWn*lm*`hV_gCriE`*IYvE`3)dQ3y@X+iFl|w0qs@UOY*RoiYxb@q|12uW9-_?B z(}fUOwb`orXR^>hyNJ9PxEkf3pzvvWR|F{9jK~dkT!4k6W!drGKVp#=F_`@8u4-t{ zVOV@AUX>@)bmJ4o_?JiEF)yPDGr+z0jDw|i7{=&}j`4nYe5Xx1IXQlkqr4;wxU2iG zSAJ`*!ROtdsZ%-+`1_;bDaI%W69On{&_lgC29E2KFG9f#jcz4vKzv%o;OC*r3(nh( z%*}IhF5PiuvQv_UJ__#3!fk8rP@C9SimvOX!q+r)LA4o@6Z~(1HIs(l0_v9>WY;BG zwhS@vR?*>pqw}6heyO-Gi4#;02YxK=>#eyk|AjO}&XoN%)fHvDNZJ0XxO$z@P3#Qyor`;U_J$1vpD+sj_BYIj%CXv<#r|#WK!K8 zx~^0G7Rzjv2bkDf(6##g+G?u%4!5$gI+>%R z7JvbbLugHhU=7AdQU*ySMRbtdU4i>i*qkbY2@5#OQ(2VYaguu=;vbaPdPM{kbAAc;0O3r335uPG>Z`V;`! zQ04)Kfd=2JjM!nUaHR1%0~WTEd-KV-3XDA5iv%SAXR)1xk;G3f2MjOC>Z5d9@ThYr zZ`AOQlp|&~s0{&WcV^}#f?yc<>*-@nC5v>_k&q+9GRA-v@^4a5O&E^6L@ z_JR>9U?Zs}5BF>aa3*Q^1dI!BbmohE;WFr}#RUVlea~_DmJn;z|xbKdk^wo_gdC4Bn5uNe=R5k1p7b zr}tUm`FTGyF-l*`#gzh+zRl{s-an+*j*aROf1@$GrS_IcaXPT4HUqlu*)cMflIZbk_u4w8be#tkEmcy|P9VVH1ylrqYvl~p; z3TbP?yUHIjpGXr_%Km&deB17R=}kAt+&OubMJ@E7J`ask)<3BMSvdd?+T!>j(XXk@ zw>*#E=($+G{6SlUsn>0RY^_0_fm}0yiN!vq?pf+WY}C{VTUa?vOWcq0%R(F$tms3I z;11o*6M_HOkC`l=Fc@MI8{usN^*rAq*$sSfgpA5sv>}4HdMMiq?#y<8Jvd=S|4L_t zj@|<{vW9XR&^67h>l%kLI}HCF>;!(?f7h1AqN Date: Tue, 28 Feb 2023 09:44:19 -0800 Subject: [PATCH 16/16] chore(main): release 2.9.0 (#453) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- .release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ google/cloud/iot/gapic_version.py | 2 +- google/cloud/iot_v1/gapic_version.py | 2 +- .../snippet_metadata_google.cloud.iot.v1.json | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 10d53e3a..a3906fc0 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "2.8.1" + ".": "2.9.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 31ebb993..cf39bad2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ [1]: https://pypi.org/project/google-cloud-iot/#history +## [2.9.0](https://github.com/googleapis/python-iot/compare/v2.8.1...v2.9.0) (2023-02-28) + + +### Features + +* Enable "rest" transport in Python for services supporting numeric enums ([15758ae](https://github.com/googleapis/python-iot/commit/15758aea9839cc5e7509c17ba3f9cb4f98271b20)) + ## [2.8.1](https://github.com/googleapis/python-iot/compare/v2.8.0...v2.8.1) (2023-01-20) diff --git a/google/cloud/iot/gapic_version.py b/google/cloud/iot/gapic_version.py index 15e84ffd..60aeb18d 100644 --- a/google/cloud/iot/gapic_version.py +++ b/google/cloud/iot/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.8.1" # {x-release-please-version} +__version__ = "2.9.0" # {x-release-please-version} diff --git a/google/cloud/iot_v1/gapic_version.py b/google/cloud/iot_v1/gapic_version.py index 15e84ffd..60aeb18d 100644 --- a/google/cloud/iot_v1/gapic_version.py +++ b/google/cloud/iot_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.8.1" # {x-release-please-version} +__version__ = "2.9.0" # {x-release-please-version} diff --git a/samples/generated_samples/snippet_metadata_google.cloud.iot.v1.json b/samples/generated_samples/snippet_metadata_google.cloud.iot.v1.json index 017afae4..941846d6 100644 --- a/samples/generated_samples/snippet_metadata_google.cloud.iot.v1.json +++ b/samples/generated_samples/snippet_metadata_google.cloud.iot.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-iot", - "version": "0.1.0" + "version": "2.9.0" }, "snippets": [ {