From ff6f6bb32af76c73a9df4c68fb021bcd6bff8f95 Mon Sep 17 00:00:00 2001 From: apichick Date: Tue, 14 May 2024 16:53:38 +0200 Subject: [PATCH] Added apigee-x-foundations blueprint (#2274) --- blueprints/README.md | 2 +- blueprints/apigee/README.md | 8 +- .../apigee/apigee-x-foundations/README.md | 481 +++ .../apigee/apigee-x-foundations/apigee.tf | 37 + .../apigee/apigee-x-foundations/diagram1.png | Bin 0 -> 37153 bytes .../apigee/apigee-x-foundations/diagram2.png | Bin 0 -> 52665 bytes .../apigee/apigee-x-foundations/diagram3.png | Bin 0 -> 33258 bytes .../apigee/apigee-x-foundations/diagram4.png | Bin 0 -> 33815 bytes .../apigee/apigee-x-foundations/diagram5.png | Bin 0 -> 30537 bytes blueprints/apigee/apigee-x-foundations/dns.tf | 56 + .../functions/instance-monitor/index.js | 138 + .../instance-monitor/package-lock.json | 3271 +++++++++++++++++ .../functions/instance-monitor/package.json | 20 + blueprints/apigee/apigee-x-foundations/kms.tf | 64 + .../apigee/apigee-x-foundations/main.tf | 108 + .../apigee/apigee-x-foundations/monitoring.tf | 52 + .../apigee/apigee-x-foundations/northbound.tf | 248 ++ .../apigee/apigee-x-foundations/outputs.tf | 46 + .../apigee/apigee-x-foundations/variables.tf | 360 ++ modules/net-lb-app-int-cross-region/README.md | 2 +- 20 files changed, 4890 insertions(+), 3 deletions(-) create mode 100644 blueprints/apigee/apigee-x-foundations/README.md create mode 100644 blueprints/apigee/apigee-x-foundations/apigee.tf create mode 100644 blueprints/apigee/apigee-x-foundations/diagram1.png create mode 100644 blueprints/apigee/apigee-x-foundations/diagram2.png create mode 100644 blueprints/apigee/apigee-x-foundations/diagram3.png create mode 100644 blueprints/apigee/apigee-x-foundations/diagram4.png create mode 100644 blueprints/apigee/apigee-x-foundations/diagram5.png create mode 100644 blueprints/apigee/apigee-x-foundations/dns.tf create mode 100644 blueprints/apigee/apigee-x-foundations/functions/instance-monitor/index.js create mode 100644 blueprints/apigee/apigee-x-foundations/functions/instance-monitor/package-lock.json create mode 100644 blueprints/apigee/apigee-x-foundations/functions/instance-monitor/package.json create mode 100644 blueprints/apigee/apigee-x-foundations/kms.tf create mode 100644 blueprints/apigee/apigee-x-foundations/main.tf create mode 100644 blueprints/apigee/apigee-x-foundations/monitoring.tf create mode 100644 blueprints/apigee/apigee-x-foundations/northbound.tf create mode 100644 blueprints/apigee/apigee-x-foundations/outputs.tf create mode 100644 blueprints/apigee/apigee-x-foundations/variables.tf diff --git a/blueprints/README.md b/blueprints/README.md index ea91caa78..3fbe68981 100644 --- a/blueprints/README.md +++ b/blueprints/README.md @@ -4,7 +4,7 @@ This section provides **[networking blueprints](./networking/)** that implement Currently available blueprints: -- **apigee** - [Apigee Hybrid on GKE](./apigee/hybrid-gke/), [Apigee X analytics in BigQuery](./apigee/bigquery-analytics), [Apigee network patterns](./apigee/network-patterns/) +- **apigee** - [Apigee X foundations](./apigee/apigee-x-foundations/). [Apigee Hybrid on GKE](./apigee/hybrid-gke/), [Apigee X analytics in BigQuery](./apigee/bigquery-analytics), [Apigee network patterns](./apigee/network-patterns/) - **cloud operations** - [Active Directory Federation Services](./cloud-operations/adfs), [Cloud Asset Inventory feeds for resource change tracking and remediation](./cloud-operations/asset-inventory-feed-remediation), [Fine-grained Cloud DNS IAM via Service Directory](./cloud-operations/dns-fine-grained-iam), [Cloud DNS & Shared VPC design](./cloud-operations/dns-shared-vpc), [Delegated Role Grants](./cloud-operations/iam-delegated-role-grants), [Network Quota Monitoring](./cloud-operations/network-quota-monitoring), [Managing on-prem service account keys by uploading public keys](./cloud-operations/onprem-sa-key-management), [Compute Image builder with Hashicorp Packer](./cloud-operations/packer-image-builder), [Packer example](./cloud-operations/packer-image-builder/packer), [Compute Engine quota monitoring](./cloud-operations/compute-quota-monitoring), [Scheduled Cloud Asset Inventory Export to Bigquery](./cloud-operations/scheduled-asset-inventory-export-bq), [Configuring workload identity federation with Terraform Cloud/Enterprise workflows](./cloud-operations/terraform-cloud-dynamic-credentials), [TCP healthcheck and restart for unmanaged GCE instances](./cloud-operations/unmanaged-instances-healthcheck), [Migrate for Compute Engine (v5) blueprints](./cloud-operations/vm-migration), [Configuring workload identity federation to access Google Cloud resources from apps running on Azure](./cloud-operations/workload-identity-federation) - **data solutions** - [GCE and GCS CMEK via centralized Cloud KMS](./data-solutions/cmek-via-centralized-kms), [Cloud Composer version 2 private instance, supporting Shared VPC and external CMEK key](./data-solutions/composer-2), [Cloud SQL instance with multi-region read replicas](./data-solutions/cloudsql-multiregion), [Data Platform](./data-solutions/data-platform-foundations), [Minimal Data Platform](./data-solutions/data-platform-minimal), [Spinning up a foundation data pipeline on Google Cloud using Cloud Storage, Dataflow and BigQuery](./data-solutions/gcs-to-bq-with-least-privileges), [#SQL Server Always On Groups blueprint](./data-solutions/sqlserver-alwayson), [Data Playground](./data-solutions/data-playground), [MLOps with Vertex AI](./data-solutions/vertex-mlops), [Shielded Folder](./data-solutions/shielded-folder), [BigQuery ML and Vertex AI Pipeline](./data-solutions/bq-ml) - **factories** - [Fabric resource factories](./factories) diff --git a/blueprints/apigee/README.md b/blueprints/apigee/README.md index 5f77147df..6d0a9f520 100644 --- a/blueprints/apigee/README.md +++ b/blueprints/apigee/README.md @@ -4,9 +4,15 @@ The blueprints in this folder contain a variety of deployment scenarios for Apig ## Blueprints +### Apigee X foundations + + This [blueprint](./apigee-x-foundations/) creates all the resources necessary to set up Apigee X on Google Cloud. + +
+ ### Apigee Hybrid on GKE - This [blueprint](./hybrid-gke/) shows how to do a non-prod deployment of Apigee Hybrid on GKE(../factories/net-vpc-firewall-yaml/). + This [blueprint](./hybrid-gke/) shows how to do a non-prod deployment of Apigee Hybrid on GKE.
diff --git a/blueprints/apigee/apigee-x-foundations/README.md b/blueprints/apigee/apigee-x-foundations/README.md new file mode 100644 index 000000000..3c336b8ed --- /dev/null +++ b/blueprints/apigee/apigee-x-foundations/README.md @@ -0,0 +1,481 @@ +# Apigee X Foundations + +This blueprint creates all the resources necessary to set up Apigee X on Google Cloud. + +Apigee can be exposed to clients using Regional Internal Application Load Balancer, Global External Application Load Balancer or both. When using the Regional Internal Application Load Balancer, used self-managed certificates (incuding self-signed certificates generated in this same module). When using the Global External Application Load Balancer Google-managed certificates or self-managed certificates (including self-signed certificates generated in this same module). When using Cross-region Internal Application Load Balancer a certificate manager needs to be used and it needs to be created in the same project as Apigee. + +Find below a few examples of different Apigee architectures that can be created using this module. + +## Examples + +* [Examples](#examples) + * [Apigee X in service project with shared VPC peered and exposed with Global External Application LB and Regional Internal Application LB](#apigee-x-in-service-project-with-shared-vpc-peered-and-exposed-with-global-external-application-lb-and-regional-internal-application-lb) + * [Apigee X in service project with local VPC peered and exposed using Global LB and Internal Cross-region Application LB](#apigee-x-in-service-project-with-local-vpc-peered-and-exposed-using-global-lb-and-internal-cross-region-application-lb) + * [Apigee X in service project with peering disabled and exposed using Global LB](#apigee-x-in-service-project-with-peering-disabled-and-exposed-using-global-lb) + * [Apigee X in standalone project with peering enabled and exposed with Regional Internal LB](#apigee-x-in-standalone-project-with-peering-enabled-and-exposed-with-regional-internal-lb) + * [Apigee X in standalone project with peering disabled and exposed using Global External Application LB](#apigee-x-in-standalone-project-with-peering-disabled-and-exposed-using-global-external-application-lb) +* [Variables](#files) +* [Variables](#variables) +* [Outputs](#outputs) + +### Apigee X in service project with shared VPC peered and exposed with Global External Application LB and Regional Internal Application LB + +![Diagram](./diagram1.png) + +```hcl +module "apigee-x-foundations" { + source = "./fabric/blueprints/apigee/apigee-x-foundations" + project_config = { + billing_account_id = var.billing_account_id + parent = var.folder_id + name = var.project_id + iam = { + "roles/apigee.admin" = ["group:apigee-admins@myorg.com"] + } + shared_vpc_service_config = { + host_project = "my-host-project" + } + } + apigee_config = { + addons_config = { + api_security = true + } + organization = { + analytics_region = "europe-west1" + } + envgroups = { + apis = [ + "apis.external.myorg.com", + "apis.internal.myorg.com" + ] + } + environments = { + apis = { + envgroups = ["apis"] + } + } + instances = { + europe-west1 = { + external = true + runtime_ip_cidr_range = "10.0.0.0/22" + troubleshooting_ip_cidr_range = "192.168.0.0/18" + environments = ["apis"] + } + } + endpoint_attachments = { + endpoint-backend-ew1 = { + region = "europe-west1" + service_attachment = "projects/a58971796302e0142p-tp/regions/europe-west4/serviceAttachments/my-service-attachment-ew1" + } + } + } + network_config = { + shared_vpc = { + name = "my-shared-vpc" + subnets = { + europe-west1 = "projects/my-host-project/regions/europe-west4/subnetworks/my-subnet-ew1" + } + subnets_psc = { + europe-west1 = "projects/my-host-project/regions/europe-west4/subnetworks/my-subnet-psc-ew1" + } + } + } + ext_lb_config = { + ssl_certificates = { + create_configs = { + default = { + certificate = "PEM-Encoded certificate string" + private_key = "PEM-Encoded private key string" + } + } + } + } + int_lb_config = { + ssl_certificates = { + create_configs = { + default = { + certificate = "PEM-Encoded certificate string" + private_key = "PEM-Encoded private key string" + } + } + } + } +} +# tftest modules=7 resources=42 +``` + +### Apigee X in service project with local VPC peered and exposed using Global LB and Internal Cross-region Application LB + +![Diagram](./diagram2.png) + +```hcl +module "apigee-x-foundations" { + source = "./fabric/blueprints/apigee/apigee-x-foundations" + project_config = { + billing_account_id = "1234-5678-0000" + parent = "folders/123456789" + name = "my-project" + iam = { + "roles/apigee.admin" = ["group:apigee-admins@myorg.com"] + } + shared_vpc_service_config = { + host_project = "my-host-project" + } + } + apigee_config = { + addons_config = { + api_security = true + } + organization = { + analytics_region = "europe-west1" + billing_type = "PAYG" + } + envgroups = { + apis = [ + "apis.external.myorg.com", + "apis.internal.myorg.com" + ] + } + environments = { + apis = { + envgroups = ["apis"] + type = "COMPREHENSIVE" + } + } + instances = { + europe-west1 = { + runtime_ip_cidr_range = "10.0.0.0/22" + troubleshooting_ip_cidr_range = "192.168.0.0/28" + environments = ["apis"] + } + europe-west4 = { + runtime_ip_cidr_range = "10.0.4.0/22" + troubleshooting_ip_cidr_range = "192.168.0.16/28" + environments = ["apis"] + } + } + endpoint_attachments = { + endpoint-backend-ew1 = { + region = "europe-west1" + service_attachment = "projects/a58971796302e0142p-tp/regions/europe-west1/serviceAttachments/my-service-attachment-ew1" + dns_names = [ + "backend.myorg.com" + ] + } + endpoint-backend-ew4 = { + region = "europe-west1" + service_attachment = "projects/a58971796302e0142p-tp/regions/europe-west4/serviceAttachments/my-service-attachment-ew4" + dns_names = [ + "backend.myorg.com" + ] + } + } + } + network_config = { + shared_vpc = { + name = "my-shared-vpc" + subnets = { + europe-west1 = "projects/my-host-project/regions/europe-west4/subnetworks/my-subnet-eu1" + europe-west4 = "projects/my-host-project/regions/europe-west4/subnetworks/my-subnet-eu4" + } + subnets_psc = { + europe-west1 = "projects/my-host-project/regions/europe-west4/subnetworks/my-subnet-psc-eu1" + europe-west4 = "projects/my-host-project/regions/europe-west4/subnetworks/my-subnet-psc-eu4" + } + } + apigee_vpc = { + auto_create = true + } + } + ext_lb_config = { + ssl_certificates = { + create_configs = { + default = { + certificate = "PEM-Encoded certificate string" + private_key = "PEM-Encoded private key string" + } + } + } + } + int_cross_region_lb_config = { + certificate_manager_certificates = [ + "projects/myprj/locations/global/certificates/certificate" + ] + } +} +# tftest modules=10 resources=62 +``` + +### Apigee X in service project with peering disabled and exposed using Global LB + +![Diagram](./diagram3.png) + +```hcl +module "apigee-x-foundations" { + source = "./fabric/blueprints/apigee/apigee-x-foundations" + project_config = { + billing_account_id = "1234-5678-0000" + parent = "folders/123456789" + name = "my-project" + iam = { + "roles/apigee.admin" = ["group:apigee-admins@myorg.com"] + } + shared_vpc_service_config = { + host_project = "my-host-project" + } + } + apigee_config = { + addons_config = { + api_security = true + } + organization = { + analytics_region = "europe-west1" + disable_vpc_peering = true + } + envgroups = { + apis = [ + "apis.external.myorg.com" + ] + } + environments = { + apis = { + envgroups = ["apis"] + } + } + instances = { + europe-west1 = { + runtime_ip_cidr_range = "10.0.0.0/22" + troubleshooting_ip_cidr_range = "192.168.0.0/18" + environments = ["apis"] + } + } + endpoint_attachments = { + endpoint-backend-ew1 = { + region = "europe-west1" + service_attachment = "projects/a58971796302e0142p-tp/regions/europe-west4/serviceAttachments/my-service-attachment-ew1" + } + } + disable_vpc_peering = true + } + network_config = { + shared_vpc = { + name = "my-shared-vpc" + subnets = { + europe-west1 = "projects/my-host-project/regions/europe-west4/subnetworks/my-subnet-ew1" + } + subnets_psc = { + europe-west1 = "projects/my-host-project/regions/europe-west4/subnetworks/my-subnet-psc-ew1" + } + } + } + ext_lb_config = { + ssl_certificates = { + create_configs = { + default = { + certificate = "PEM-Encoded certificate string" + private_key = "PEM-Encoded private key string" + } + } + } + } +} +# tftest modules=6 resources=36 +``` + +### Apigee X in standalone project with peering enabled and exposed with Regional Internal LB + +![Diagram](./diagram4.png) + +```hcl +module "apigee-x-foundations" { + source = "./fabric/blueprints/apigee/apigee-x-foundations" + project_config = { + billing_account_id = "1234-5678-0000" + parent = "folders/123456789" + name = "my-project" + iam = { + "roles/apigee.admin" = ["group:apigee-admins@myorg.com"] + } + } + apigee_config = { + addons_config = { + api_security = true + } + organization = { + analytics_region = "europe-west1" + } + envgroups = { + apis = [ + "apis.internal.myorg.com" + ] + } + environments = { + apis = { + envgroups = ["apis"] + } + } + instances = { + europe-west1 = { + runtime_ip_cidr_range = "172.16.0.0/22" + troubleshooting_ip_cidr_range = "192.168.0.0/18" + environments = ["apis"] + } + } + endpoint_attachments = { + endpoint-backend-ew1 = { + region = "europe-west1" + service_attachment = "projects/a58971796302e0142p-tp/regions/europe-west4/serviceAttachments/my-service-attachment-ew1" + dns_names = [ + "backend.myorg.com" + ] + } + } + } + network_config = { + apigee_vpc = { + subnets = { + europe-west1 = { + ip_cidr_range = "10.0.0.0/29" + } + } + subnets_proxy_only = { + europe-west1 = { + ip_cidr_range = "10.1.0.0/26" + } + } + subnets_psc = { + europe-west1 = { + ip_cidr_range = "10.0.1.0/29" + } + } + } + } + int_lb_config = { + ssl_certificates = { + create_configs = { + default = { + certificate = "PEM-Encoded certificate string" + private_key = "PEM-Encoded private key string" + } + } + } + } +} +# tftest modules=8 resources=48 +``` + +### Apigee X in standalone project with peering disabled and exposed using Global External Application LB + +![Diagram](./diagram5.png) + +```hcl +module "apigee-x-foundations" { + source = "./fabric/blueprints/apigee/apigee-x-foundations" + project_config = { + billing_account_id = "1234-5678-0000" + parent = "folders/123456789" + name = "my-project" + iam = { + "roles/apigee.admin" = ["group:apigee-admins@myorg.com"] + } + } + apigee_config = { + addons_config = { + api_security = true + } + organization = { + analytics_region = "europe-west1" + disable_vpc_peering = true + } + envgroups = { + apis = [ + "apis.external.myorg.com", + "apis.internal.myorg.com" + ] + } + environments = { + apis = { + envgroups = ["apis"] + } + } + instances = { + europe-west1 = { + environments = ["apis"] + } + } + endpoint_attachments = { + endpoint-backend-ew1 = { + region = "europe-west1" + service_attachment = "projects/a58971796302e0142p-tp/regions/europe-west4/serviceAttachments/my-service-attachment-ew1" + } + } + disable_vpc_peering = true + } + network_config = { + apigee_vpc = { + auto_create = true + subnets = { + europe-west1 = { + ip_cidr_range = "10.0.0.0/29" + } + } + subnets_psc = { + europe-west1 = { + ip_cidr_range = "10.0.1.0/29" + } + } + } + } + ext_lb_config = { + ssl_certificates = { + create_configs = { + default = { + certificate = "PEM-Encoded certificate string" + private_key = "PEM-Encoded private key string" + } + } + } + } + enable_monitoring = true +} +# tftest modules=8 resources=55 +``` + + + +## Files + +| name | description | modules | resources | +|---|---|---|---| +| [apigee.tf](./apigee.tf) | None | apigee | | +| [dns.tf](./dns.tf) | None | | | +| [kms.tf](./kms.tf) | None | kms | random_id | +| [main.tf](./main.tf) | Module-level locals and resources. | net-vpc · project | | +| [monitoring.tf](./monitoring.tf) | None | cloud-function-v2 | | +| [northbound.tf](./northbound.tf) | None | net-lb-app-ext · net-lb-app-int · net-lb-app-int-cross-region | google_compute_region_network_endpoint_group · google_compute_security_policy | +| [outputs.tf](./outputs.tf) | Module outputs. | | | +| [variables.tf](./variables.tf) | Module variables. | | | + +## Variables + +| name | description | type | required | default | producer | +|---|---|:---:|:---:|:---:|:---:| +| [apigee_config](variables.tf#L17) | Apigee configuration. | object({…}) | ✓ | | | +| [project_config](variables.tf#L271) | Project configuration. | object({…}) | ✓ | | | +| [enable_monitoring](variables.tf#L87) | Boolean flag indicating whether an custom metric to monitor instances should be created in Cloud monitoring. | bool | | false | | +| [ext_lb_config](variables.tf#L93) | External application load balancer configuration. | object({…}) | | null | | +| [int_cross_region_lb_config](variables.tf#L164) | Internal application load balancer configuration. | object({…}) | | null | | +| [int_lb_config](variables.tf#L192) | Internal application load balancer configuration. | object({…}) | | null | | +| [network_config](variables.tf#L228) | Network configuration. | object({…}) | | {} | | + +## Outputs + +| name | description | sensitive | consumers | +|---|---|:---:|---| +| [endpoint_attachment_hosts](outputs.tf#L17) | Endpoint attachment hosts. | | | +| [ext_lb_ip_address](outputs.tf#L22) | External IP address. | | | +| [instance_service_attachments](outputs.tf#L27) | Instance service attachments. | | | +| [int_cross_region_lb_ip_addresses](outputs.tf#L32) | Internal IP addresses. | | | +| [int_lb_ip_addresses](outputs.tf#L37) | Internal IP addresses. | | | +| [project_id](outputs.tf#L42) | Project. | | | + diff --git a/blueprints/apigee/apigee-x-foundations/apigee.tf b/blueprints/apigee/apigee-x-foundations/apigee.tf new file mode 100644 index 000000000..86c738b85 --- /dev/null +++ b/blueprints/apigee/apigee-x-foundations/apigee.tf @@ -0,0 +1,37 @@ +/** + * Copyright 2023 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. + */ + +module "apigee" { + source = "../../../modules/apigee" + project_id = module.project.project_id + organization = merge(var.apigee_config.organization, var.network_config.apigee_vpc != null && !var.apigee_config.organization.disable_vpc_peering ? { + authorized_network = module.apigee_vpc[0].id + } : var.network_config.shared_vpc != null && !var.apigee_config.organization.disable_vpc_peering ? { + authorized_network = module.shared_vpc[0].id + } : {}, + var.apigee_config.organization.database_encryption_key == null ? {} : { + database_encryption_key = module.database_kms[0].keys["database-key"].id + }, { + runtime_type = "CLOUD" + }) + envgroups = var.apigee_config.envgroups + environments = var.apigee_config.environments + instances = { for k, v in var.apigee_config.instances : k => merge(v, v.disk_encryption_key == null ? { + disk_encryption_key = module.disks_kms[k].key_ids["disk-key"] + } : {}) } + endpoint_attachments = var.apigee_config.endpoint_attachments + addons_config = var.apigee_config.addons_config +} diff --git a/blueprints/apigee/apigee-x-foundations/diagram1.png b/blueprints/apigee/apigee-x-foundations/diagram1.png new file mode 100644 index 0000000000000000000000000000000000000000..e8b33532323d4b7cf3cdf9b73be24648ad56284c GIT binary patch literal 37153 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 Xz_sq(O+FWpd7nI{bu{ycdBFbxPVQDZ literal 0 HcmV?d00001 diff --git a/blueprints/apigee/apigee-x-foundations/diagram2.png b/blueprints/apigee/apigee-x-foundations/diagram2.png new file mode 100644 index 0000000000000000000000000000000000000000..94f4b1af57c608eca925d6e0a7a15d084bb2949c GIT binary patch literal 52665 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

DlDDcV3JR_QlM3${*B;!_=0A?7rAc2{j3Zr_g$8 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 literal 0 HcmV?d00001 diff --git a/blueprints/apigee/apigee-x-foundations/dns.tf b/blueprints/apigee/apigee-x-foundations/dns.tf new file mode 100644 index 000000000..20b017085 --- /dev/null +++ b/blueprints/apigee/apigee-x-foundations/dns.tf @@ -0,0 +1,56 @@ +/** + * Copyright 2024 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. + */ + +locals { + dns_names = [for v1 in flatten([for k2, v2 in var.apigee_config.endpoint_attachments : + [for v3 in coalesce(v2.dns_names, []) : { + endpoint_attachment = k2 + dns_name = split(".", v3) + } + if v3 != null]]) : { + endpoint_attachment = v1.endpoint_attachment + domain = length(v1.dns_name) == 1 ? "." : "${join(".", slice(v1.dns_name, 1, length(v1.dns_name)))}." + name = length(v1.dns_name) == 1 ? "*." : v1.dns_name[0] + }] + peered_domains = distinct([for v in local.dns_names : v.domain]) + private_dns_zones = { for k1, v1 in { for v2 in local.peered_domains : + v2 => distinct([for v3 in local.dns_names : v3.name if v3.domain == v2]) } : k1 => + { for v4 in v1 : "A ${v4}" => { + geo_routing = [for v5 in local.dns_names : + { + location = var.apigee_config.endpoint_attachments[v5.endpoint_attachment].region + records = [module.apigee.endpoint_attachment_hosts[v5.endpoint_attachment]] + } + if v5.domain == k1 && v5.name == v4] } + } + } +} + +module "private_dns_zones" { + for_each = (var.network_config.apigee_vpc == null || var.apigee_config.organization.disable_vpc_peering + ? {} : + local.private_dns_zones) + source = "../../../modules/dns" + project_id = module.project.project_id + name = trimsuffix(replace(each.key, ".", "-"), "-") + zone_config = { + domain = each.key + private = { + client_networks = [module.apigee_vpc[0].self_link] + } + } + recordsets = each.value +} diff --git a/blueprints/apigee/apigee-x-foundations/functions/instance-monitor/index.js b/blueprints/apigee/apigee-x-foundations/functions/instance-monitor/index.js new file mode 100644 index 000000000..56dc61fed --- /dev/null +++ b/blueprints/apigee/apigee-x-foundations/functions/instance-monitor/index.js @@ -0,0 +1,138 @@ +/** + * Copyright 2024 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. + */ + +const functions = require("@google-cloud/functions-framework"); +const monitoring = require("@google-cloud/monitoring"); +const logging = require("@google-cloud/logging"); +const { LoggingBunyan } = require("@google-cloud/logging-bunyan"); +const bunyan = require("bunyan"); + +const loggingBunyan = new LoggingBunyan(); +const logger = bunyan.createLogger({ + name: "instance-monitor", + streams: [{ stream: process.stdout, level: "info" }, loggingBunyan.stream("info")], +}); + +const SEVERITY_THRESHOLD = logging.Severity.warning; + +const METRIC_DESCRIPTION = "Apigee instance health."; +const METRIC_DISPLAY_NAME = "Apigee instance health."; +const METRIC_TYPE = "custom.googleapis.com/apigee/instance_health"; +const METRIC_KIND = "GAUGE"; +const METRIC_VALUE_TYPE = "BOOL"; +const METRIC_UNIT = "1"; +const METRIC_LABELS = [ + { + key: "org", + valueType: "STRING", + description: "The name of the apigee organization.", + }, + { + key: "instance_id", + valueType: "STRING", + description: "The ID of the apigee instance.", + } +]; +const RESOURCE_TYPE = "global"; +const METRIC_DESCRIPTOR = { + description: METRIC_DESCRIPTION, + displayName: METRIC_DISPLAY_NAME, + type: METRIC_TYPE, + metricKind: METRIC_KIND, + valueType: METRIC_VALUE_TYPE, + unit: METRIC_UNIT, + labels: METRIC_LABELS, +}; + +const client = new monitoring.MetricServiceClient(); + +async function createMetricDescriptor(projectId, metricDescriptor) { + const request = { + name: client.projectPath(projectId), + metricDescriptor: metricDescriptor, + }; + return await client.createMetricDescriptor(request); +} + +async function getMetricDescriptor(projectId, metricType) { + const request = { + name: client.projectMetricDescriptorPath(projectId, metricType), + }; + return await client.getMetricDescriptor(request); +} + +async function writeTimeSeriesData(projectId, metricType, resourceType, value, metricLabels) { + const dataPoint = { + interval: { + endTime: { + seconds: Date.now() / 1000, + }, + }, + value: { + boolValue: value, + }, + }; + + const timeSeriesData = { + metric: { + type: metricType, + labels: metricLabels, + }, + resource: { + type: resourceType, + labels: { + project_id: projectId, + }, + }, + points: [dataPoint], + }; + + const request = { + name: client.projectPath(projectId), + timeSeries: [timeSeriesData], + }; + + return await client.createTimeSeries(request); +} + +async function processEvent(cloudEvent) { + const [, projectId, instanceId] = /^organizations\/(.+)\/instances\/(.+)$/g.exec(cloudEvent.resourcename); + const severity = logging.Severity[cloudEvent.data.severity.toLowerCase()]; + const value = severity >= SEVERITY_THRESHOLD; + if (!value) { + logger.error(`Instance ${instanceId} in ${organization} is down`); + } + try { + logger.debug("Checking if metric exists..."); + const result = await getMetricDescriptor(projectId, METRIC_TYPE); + logger.debug("Metric already exists", result); + } catch (error) { + logger.debug("Metric does not exist. Creating it..."); + const result = await createMetricDescriptor(projectId, METRIC_DESCRIPTOR); + logger.debug("Metric created", result); + } + logger.debug("Writing data point..."); + await writeTimeSeriesData(projectId, METRIC_TYPE, RESOURCE_TYPE, value, { + org: projectId, + instance_id: instanceId, + }); +} + +functions.cloudEvent("writeMetric", async cloudEvent => { + logger.debug("Notification received. Let's process it..."); + processEvent(cloudEvent); + logger.debug("Notification processed."); +}); diff --git a/blueprints/apigee/apigee-x-foundations/functions/instance-monitor/package-lock.json b/blueprints/apigee/apigee-x-foundations/functions/instance-monitor/package-lock.json new file mode 100644 index 000000000..7fff997d3 --- /dev/null +++ b/blueprints/apigee/apigee-x-foundations/functions/instance-monitor/package-lock.json @@ -0,0 +1,3271 @@ +{ + "name": "instance-checker", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "instance-checker", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@google-cloud/functions-framework": "^3.3.0", + "@google-cloud/logging": "^10.5.0", + "@google-cloud/logging-bunyan": "^5.0.0", + "@google-cloud/monitoring": "^3.0.5", + "bunyan": "^1.8.15" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@google-cloud/common": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-4.0.3.tgz", + "integrity": "sha512-fUoMo5b8iAKbrYpneIRV3z95AlxVJPrjpevxs4SKoclngWZvTXBSGpNisF5+x5m+oNGve7jfB1e6vNBZBUs7Fw==", + "dependencies": { + "@google-cloud/projectify": "^3.0.0", + "@google-cloud/promisify": "^3.0.0", + "arrify": "^2.0.1", + "duplexify": "^4.1.1", + "ent": "^2.2.0", + "extend": "^3.0.2", + "google-auth-library": "^8.0.2", + "retry-request": "^5.0.0", + "teeny-request": "^8.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@google-cloud/functions-framework": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@google-cloud/functions-framework/-/functions-framework-3.3.0.tgz", + "integrity": "sha512-+4O1dX5VNRK1W1NyAia7zy5jLf88ytuz39/1kVUUaNiOf76YbMZKV0YjZwfk7uEwRrC6l2wynK1G+q8Gb5DeVw==", + "dependencies": { + "@types/express": "4.17.17", + "body-parser": "^1.18.3", + "cloudevents": "^7.0.0", + "express": "^4.16.4", + "minimist": "^1.2.7", + "on-finished": "^2.3.0", + "read-pkg-up": "^7.0.1", + "semver": "^7.3.5" + }, + "bin": { + "functions-framework": "build/src/main.js", + "functions-framework-nodejs": "build/src/main.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@google-cloud/logging": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-10.5.0.tgz", + "integrity": "sha512-XmlNs6B8lDZvFwFB5M55g9ch873AA2rXSuFOczQ3FOAzuyd/qksf18suFJfcrLMu8lYSr3SQhTE45FlXz4p9pg==", + "dependencies": { + "@google-cloud/common": "^4.0.0", + "@google-cloud/paginator": "^4.0.0", + "@google-cloud/projectify": "^3.0.0", + "@google-cloud/promisify": "^3.0.0", + "arrify": "^2.0.1", + "dot-prop": "^6.0.0", + "eventid": "^2.0.0", + "extend": "^3.0.2", + "gcp-metadata": "^4.0.0", + "google-auth-library": "^8.0.2", + "google-gax": "^3.5.8", + "on-finished": "^2.3.0", + "pumpify": "^2.0.1", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@google-cloud/logging-bunyan": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/logging-bunyan/-/logging-bunyan-5.0.0.tgz", + "integrity": "sha512-Ila0PB6JZ/Qv18wx3x4/NoPLoSfTTDCvEIeaxCyKouv97kEWOP+HYvwimdJCYlvePyClZH+y3ktW17XlJAE4gA==", + "dependencies": { + "@google-cloud/logging": "^10.2.2", + "google-auth-library": "^9.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "bunyan": "*" + } + }, + "node_modules/@google-cloud/logging-bunyan/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@google-cloud/logging-bunyan/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@google-cloud/logging-bunyan/node_modules/gaxios": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.1.tgz", + "integrity": "sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/logging-bunyan/node_modules/gcp-metadata": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.0.0.tgz", + "integrity": "sha512-Ozxyi23/1Ar51wjUT2RDklK+3HxqDr8TLBNK8rBBFQ7T85iIGnXnVusauj06QyqCXRFZig8LZC+TUddWbndlpQ==", + "dependencies": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/logging-bunyan/node_modules/google-auth-library": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.1.0.tgz", + "integrity": "sha512-1M9HdOcQNPV5BwSXqwwT238MTKodJFBxZ/V2JP397ieOLv4FjQdfYb9SooR7Mb+oUT2IJ92mLJQf804dyx0MJA==", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.0.0", + "gcp-metadata": "^6.0.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/logging-bunyan/node_modules/gtoken": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.0.1.tgz", + "integrity": "sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==", + "dependencies": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/logging-bunyan/node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@google-cloud/logging-bunyan/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@google-cloud/logging/node_modules/gaxios": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.3.tgz", + "integrity": "sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA==", + "dependencies": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/logging/node_modules/gcp-metadata": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", + "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", + "dependencies": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/logging/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@google-cloud/monitoring": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@google-cloud/monitoring/-/monitoring-3.0.5.tgz", + "integrity": "sha512-txZPpmE+HGkx1wo5SO975Y7M1lhnIUMI79+7SDTHvVU7lNvQB6i6rNqOSkJZYHj5I/JFFqHIarUtSoIWU0ZCSw==", + "dependencies": { + "google-gax": "^3.5.8" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@google-cloud/paginator": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-4.0.1.tgz", + "integrity": "sha512-6G1ui6bWhNyHjmbYwavdN7mpVPRBtyDg/bfqBTAlwr413On2TnFNfDxc9UhTJctkgoCDgQXEKiRPLPR9USlkbQ==", + "dependencies": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@google-cloud/projectify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-3.0.0.tgz", + "integrity": "sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@google-cloud/promisify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.1.tgz", + "integrity": "sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.8.19", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.19.tgz", + "integrity": "sha512-yCkvhtstJvUL3DEQAF5Uq5KoqQL27MTdfxVYvGsGduoGxiJcRCvJ29t5OmLfLhRuRpjAQ1OlhJD/IPOfX+8jNw==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.8.tgz", + "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jsdoc/salty": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.5.tgz", + "integrity": "sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==", + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v12.0.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", + "dependencies": { + "@types/minimatch": "^5.1.2", + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "node_modules/@types/linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", + "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==" + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + }, + "node_modules/@types/node": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.4.tgz", + "integrity": "sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==", + "dependencies": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/bunyan": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "engines": [ + "node >=0.10.0" + ], + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cloudevents": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-7.0.2.tgz", + "integrity": "sha512-WiOqWsNkMZmMMZ6xa3kzx/MA+8+V+c5eGkStZIcik+Px2xCobmzcacw1EOGyfhODaQKkIv8TxXOOLzV69oXFqA==", + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "json-bigint": "^1.0.0", + "process": "^0.11.10", + "util": "^0.12.4", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=16 <=20" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "nan": "^2.14.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==" + }, + "node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/eventid/-/eventid-2.0.1.tgz", + "integrity": "sha512-sPNTqiMokAvV048P2c9+foqVJzk49o6d4e0D/sq5jog3pw+4kBgyR0gaM1FM7Mx6Kzd9dztesh9oYz1LWWOpzw==", + "dependencies": { + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/google-auth-library": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz", + "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==", + "dependencies": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.3.0", + "gtoken": "^6.1.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/google-gax": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-3.6.1.tgz", + "integrity": "sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w==", + "dependencies": { + "@grpc/grpc-js": "~1.8.0", + "@grpc/proto-loader": "^0.7.0", + "@types/long": "^4.0.0", + "@types/rimraf": "^3.0.2", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "fast-text-encoding": "^1.0.3", + "google-auth-library": "^8.0.2", + "is-stream-ended": "^0.1.4", + "node-fetch": "^2.6.1", + "object-hash": "^3.0.0", + "proto3-json-serializer": "^1.0.0", + "protobufjs": "7.2.4", + "protobufjs-cli": "1.1.1", + "retry-request": "^5.0.0" + }, + "bin": { + "compileProtos": "build/tools/compileProtos.js", + "minifyProtoJson": "build/tools/minify.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/google-p12-pem": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", + "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", + "dependencies": { + "node-forge": "^1.3.1" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/gtoken": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", + "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", + "dependencies": { + "gaxios": "^5.0.1", + "google-p12-pem": "^4.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream-ended": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", + "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==" + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "dependencies": { + "xmlcreate": "^2.0.4" + } + }, + "node_modules/jsdoc": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz", + "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", + "@types/markdown-it": "^12.2.3", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^12.3.2", + "markdown-it-anchor": "^8.4.1", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "underscore": "~1.13.2" + }, + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdoc/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mv/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/mv/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mv/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mv/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "optional": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mv/node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/nan": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", + "optional": true + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "optional": true, + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/proto3-json-serializer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-1.1.1.tgz", + "integrity": "sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==", + "dependencies": { + "protobufjs": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs-cli": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.1.tgz", + "integrity": "sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==", + "dependencies": { + "chalk": "^4.0.0", + "escodegen": "^1.13.0", + "espree": "^9.0.0", + "estraverse": "^5.1.0", + "glob": "^8.0.0", + "jsdoc": "^4.0.0", + "minimist": "^1.2.0", + "semver": "^7.1.2", + "tmp": "^0.2.1", + "uglify-js": "^3.7.7" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "protobufjs": "^7.0.0" + } + }, + "node_modules/protobufjs-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/protobufjs-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/protobufjs-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/protobufjs-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/protobufjs-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/protobufjs-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "dependencies": { + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/retry-request": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.2.tgz", + "integrity": "sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==", + "dependencies": { + "debug": "^4.1.1", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/retry-request/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/retry-request/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/teeny-request": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.3.tgz", + "integrity": "sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==", + "dependencies": { + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.1", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/teeny-request/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/blueprints/apigee/apigee-x-foundations/functions/instance-monitor/package.json b/blueprints/apigee/apigee-x-foundations/functions/instance-monitor/package.json new file mode 100644 index 000000000..c1004d3cc --- /dev/null +++ b/blueprints/apigee/apigee-x-foundations/functions/instance-monitor/package.json @@ -0,0 +1,20 @@ +{ + "name": "instance-checker", + "version": "1.0.0", + "description": "", + "main": "index.js", + "engines": { + "node": ">=18.0.0" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@google-cloud/functions-framework": "^3.3.0", + "@google-cloud/logging-bunyan": "^5.0.0", + "bunyan": "^1.8.15", + "@google-cloud/monitoring": "^3.0.5" + } +} diff --git a/blueprints/apigee/apigee-x-foundations/kms.tf b/blueprints/apigee/apigee-x-foundations/kms.tf new file mode 100644 index 000000000..120a118ca --- /dev/null +++ b/blueprints/apigee/apigee-x-foundations/kms.tf @@ -0,0 +1,64 @@ +/** + * Copyright 2024 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. + */ + +resource "random_id" "database_kms" { + byte_length = 4 +} + +resource "random_id" "disks_kms" { + for_each = var.apigee_config.instances + byte_length = 4 +} + +module "database_kms" { + count = try(var.apigee_config.organization.database_encryption_key, null) == null ? 1 : 0 + source = "../../../modules/kms" + project_id = module.project.project_id + keyring = { + location = "global" + name = "apigee-${random_id.database_kms.hex}" + } + keys = { + database-key = { + purpose = "ENCRYPT_DECRYPT" + rotation_period = "2592000s" + labels = null + iam = { + "roles/cloudkms.cryptoKeyEncrypterDecrypter" = ["serviceAccount:${module.project.service_accounts.robots.apigee}"] + } + } + } +} + +module "disks_kms" { + for_each = var.apigee_config.instances + source = "../../../modules/kms" + project_id = module.project.project_id + keyring = { + location = each.key + name = "apigee-${each.key}-${random_id.disks_kms[each.key].hex}" + } + keys = { + disk-key = { + purpose = "ENCRYPT_DECRYPT" + rotation_period = "2592000s" + labels = null + iam = { + "roles/cloudkms.cryptoKeyEncrypterDecrypter" = ["serviceAccount:${module.project.service_accounts.robots.apigee}"] + } + } + } +} diff --git a/blueprints/apigee/apigee-x-foundations/main.tf b/blueprints/apigee/apigee-x-foundations/main.tf new file mode 100644 index 000000000..d25c1c11b --- /dev/null +++ b/blueprints/apigee/apigee-x-foundations/main.tf @@ -0,0 +1,108 @@ +/** + * Copyright 2024 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. + */ + +module "project" { + source = "../../../modules/project" + billing_account = var.project_config.billing_account_id + compute_metadata = var.project_config.compute_metadata + custom_roles = var.project_config.custom_roles + default_service_account = var.project_config.default_service_account + iam = var.project_config.iam + iam_bindings = var.project_config.iam_bindings + iam_bindings_additive = var.project_config.iam_bindings_additive + labels = var.project_config.labels + lien_reason = var.project_config.lien_reason + logging_data_access = var.project_config.logging_data_access + logging_exclusions = var.project_config.log_exclusions + logging_sinks = var.project_config.logging_sinks + metric_scopes = var.project_config.metric_scopes + name = var.project_config.name + org_policies = var.project_config.org_policies + parent = var.project_config.parent + prefix = var.project_config.prefix + services = distinct(concat(var.project_config.services, [ + "apigee.googleapis.com", + "cloudkms.googleapis.com", + "compute.googleapis.com", + "eventarc.googleapis.com", + "dns.googleapis.com", + "iam.googleapis.com", + "servicenetworking.googleapis.com", + ], var.enable_monitoring ? [ + "cloudbuild.googleapis.com", + "cloudfunctions.googleapis.com", + "logging.googleapis.com", + "monitoring.googleapis.com", + "pubsub.googleapis.com", + "run.googleapis.com" + ] : [])) + + shared_vpc_service_config = var.project_config.shared_vpc_service_config + skip_delete = var.project_config.skip_delete + tag_bindings = var.project_config.tag_bindings +} + +module "shared_vpc" { + count = var.network_config.shared_vpc == null ? 0 : 1 + source = "../../../modules/net-vpc" + project_id = var.project_config.shared_vpc_service_config.host_project + name = var.network_config.shared_vpc.name + vpc_create = false +} + +module "apigee_vpc" { + count = var.network_config.apigee_vpc == null ? 0 : 1 + source = "../../../modules/net-vpc" + project_id = module.project.project_id + name = coalesce(var.network_config.apigee_vpc.name, "apigee-vpc") + vpc_create = var.network_config.apigee_vpc.auto_create + psa_configs = [{ + ranges = merge(flatten([for k, v in var.apigee_config.instances : merge( + v.runtime_ip_cidr_range == null ? {} : { "apigee-22-${k}" = v.runtime_ip_cidr_range }, + v.troubleshooting_ip_cidr_range == null ? {} : { "apigee-28-${k}" = v.troubleshooting_ip_cidr_range } + )])...) + export_routes = true + import_routes = false + peered_domains = local.peered_domains + }] + subnets = [for k, v in var.network_config.apigee_vpc.subnets : + { + name = coalesce(v.name, "subnet-${k}") + region = k + ip_cidr_range = v.ip_cidr_range + description = "Subnet in ${k} region" + } + if v.ip_cidr_range != null && (var.int_cross_region_lb_config != null || nonsensitive(var.int_lb_config != null))] + subnets_proxy_only = [for k, v in var.network_config.apigee_vpc.subnets_proxy_only : + { + name = coalesce(v.name, "subnet-proxy-only-${k}") + region = k + ip_cidr_range = v.ip_cidr_range + description = "Proxy-only subnet in ${k} region" + global = var.int_cross_region_lb_config != null + } + if v.ip_cidr_range != null && (var.int_cross_region_lb_config != null || nonsensitive(var.int_lb_config != null))] + subnets_psc = [for k, v in var.network_config.apigee_vpc.subnets_psc : + { + name = coalesce(v.name, "subnet-psc-${k}") + region = k + ip_cidr_range = v.ip_cidr_range + description = "PSC Subnet in ${k} region" + global = var.int_cross_region_lb_config != null + } + if v.ip_cidr_range != null] +} + diff --git a/blueprints/apigee/apigee-x-foundations/monitoring.tf b/blueprints/apigee/apigee-x-foundations/monitoring.tf new file mode 100644 index 000000000..70d3a2195 --- /dev/null +++ b/blueprints/apigee/apigee-x-foundations/monitoring.tf @@ -0,0 +1,52 @@ +/** + * Copyright 2024 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. + */ + +module "instance_monitor_function" { + count = var.enable_monitoring && length(var.apigee_config.instances) > 0 ? 1 : 0 + source = "../../../modules/cloud-function-v2" + project_id = module.project.project_id + name = "instance-monitor" + bucket_name = module.project.project_id + bucket_config = { + } + bundle_config = { + source_dir = "${path.module}/functions/instance-monitor" + output_path = "bundle.zip" + } + function_config = { + entry_point = "writeMetric" + runtime = "nodejs20" + timeout = 180 + } + trigger_config = { + event_type = "google.cloud.audit.log.v1.written" + region = "global" + event_filters = [ + { + attribute = "serviceName" + value = "apigee.googleapis.com" + }, + { + attribute = "methodName" + value = "google.cloud.apigee.v1.RuntimeService.ReportInstanceStatus" + }, + ] + service_account_create = true + retry_policy = "RETRY_POLICY_DO_NOT_RETRY" + } + region = var.apigee_config.organization.analytics_region + service_account_create = true +} diff --git a/blueprints/apigee/apigee-x-foundations/northbound.tf b/blueprints/apigee/apigee-x-foundations/northbound.tf new file mode 100644 index 000000000..caae13bf0 --- /dev/null +++ b/blueprints/apigee/apigee-x-foundations/northbound.tf @@ -0,0 +1,248 @@ +/** + * Copyright 2024 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. + */ + + +locals { + preconfigured_waf_rules = { for k, v in try(var.ext_lb_config.security_policy.preconfigured_waf_rules, {}) : k => + merge(v.sensitivity == null ? {} : { + sensitivity = v.sensitivity + }, + length(v.opt_in_rule_ids) > 0 ? { + opt_in_rule_ids = v.opt_in_rule_ids + } : {}, + length(v.opt_out_rule_ids) > 0 ? { + opt_out_rule_ids = v.opt_out_rule_ids + } : {}) + } + network = try(module.shared_vpc[0].id, module.apigee_vpc[0].id) + neg_subnets = (var.network_config.shared_vpc == null ? + (try(var.network_config.apigee_vpc.auto_create, false) ? + { for k, v in module.apigee_vpc[0].subnets_psc : v.region => v.id } : + { for k, v in var.network_config.apigee_vpc.subnets_psc : v => v.id }) : + var.network_config.shared_vpc.subnets_psc + ) + ilb_subnets = (var.network_config.shared_vpc == null ? + (try(var.network_config.apigee_vpc.auto_create, false) ? + { for k, v in module.apigee_vpc[0].subnets : v.region => v.id } : + { for k, v in var.network_config.apigee_vpc.subnets : v => v.id }) : + var.network_config.shared_vpc.subnets + ) + ext_instances = var.ext_lb_config == null ? {} : { for k, v in local.neg_subnets : k => module.apigee.instances[k] } + int_instances = var.int_lb_config == null ? {} : { for k, v in local.ilb_subnets : k => module.apigee.instances[k] } + int_cross_region_instances = var.int_cross_region_lb_config == null ? {} : { for k, v in local.ilb_subnets : k => module.apigee.instances[k] } +} + +resource "google_compute_region_network_endpoint_group" "psc_negs" { + for_each = local.neg_subnets + project = module.project.project_id + region = each.key + name = "apigee-${each.key}" + network_endpoint_type = "PRIVATE_SERVICE_CONNECT" + psc_target_service = module.apigee.instances[each.key].service_attachment + network = local.network + subnetwork = each.value +} + +module "ext_lb" { + count = length(local.ext_instances) > 0 ? 1 : 0 + source = "../../../modules/net-lb-app-ext" + name = "ext-lb" + project_id = module.project.project_id + protocol = "HTTPS" + use_classic_version = false + backend_service_configs = { + default = { + backends = [for k, v in local.ext_instances : { backend = google_compute_region_network_endpoint_group.psc_negs[k].id }] + protocol = "HTTPS" + health_checks = [] + outlier_detection = var.ext_lb_config.outlier_detection + security_policy = try(google_compute_security_policy.policy[0].name, null) + log_sample_rate = var.ext_lb_config.log_sample_rate + } + } + health_check_configs = { + default = { + https = { port_specification = "USE_SERVING_PORT" } + } + } + ssl_certificates = var.ext_lb_config.ssl_certificates +} + +module "int_lb" { + for_each = local.int_instances + source = "../../../modules/net-lb-app-int" + name = "${each.key}-int-lb" + project_id = module.project.project_id + region = each.key + protocol = "HTTPS" + backend_service_configs = { + default = { + backends = [{ + group = google_compute_region_network_endpoint_group.psc_negs[each.key].id + }] + outlier_detection = var.int_lb_config.outlier_detection + health_checks = [] + log_sample_rate = var.int_lb_config.log_sample_rate + } + } + ssl_certificates = var.int_lb_config.ssl_certificates + vpc_config = { + network = local.network + subnetwork = local.ilb_subnets[each.key] + } +} + +module "int_cross_region_lb" { + count = length(local.int_cross_region_instances) > 0 ? 1 : 0 + source = "../../../modules/net-lb-app-int-cross-region" + name = "int-cross-region-lb" + project_id = module.project.project_id + protocol = "HTTPS" + backend_service_configs = { + default = { + backends = [for k, v in google_compute_region_network_endpoint_group.psc_negs : { + group = v.id + }] + outlier_detection = var.int_cross_region_lb_config.outlier_detection + health_checks = [] + log_sample_rate = var.int_cross_region_lb_config.log_sample_rate + } + } + https_proxy_config = { + certificate_manager_certificates = var.int_cross_region_lb_config.certificate_manager_certificates + } + vpc_config = { + network = local.network + subnetworks = local.ilb_subnets + } +} + +resource "google_compute_security_policy" "policy" { + provider = google-beta + count = try(var.ext_lb_config.security_policy, null) == null ? 0 : 1 + name = "cloud-armor-security-policy" + description = "Cloud Armor Security Policy" + project = module.project.project_id + dynamic "advanced_options_config" { + for_each = try(var.ext_lb_config, null) == null ? [] : [""] + content { + json_parsing = try(var.ext_lb_config.security_policy.adaptive_protection_config.json_parsing.enable, false) ? "DISABLED" : "STANDARD" + dynamic "json_custom_config" { + for_each = try(var.ext_lb_config.security_policy.adaptive_protection_config.json_parsing.content_types, null) == null ? [] : [""] + content { + content_types = var.ext_lb_config.security_policy.adaptive_protection_config.json_parsing.content_types + } + } + log_level = var.ext_lb_config.security_policy.advanced_options_config.log_level + } + } + dynamic "adaptive_protection_config" { + for_each = try(var.ext_lb_config.security_policy.adaptive_protection_config, null) == null ? [] : [""] + content { + dynamic "layer_7_ddos_defense_config" { + for_each = try(var.ext_lb_config.security_policy.adaptive_protection_config.layer_7_ddos_defense_config, null) == null ? [] : [""] + content { + enable = var.ext_lb_config.security_policy.adaptive_protection_config.layer_7_ddos_defense_config.enable + rule_visibility = var.ext_lb_config.security_policy.adaptive_protection_config.layer_7_ddos_defense_config.rule_visibility + } + } + dynamic "auto_deploy_config" { + for_each = try(var.int_lb_config.security_policy.adaptive_protection_config.auto_deploy_config, null) == null ? [] : [""] + content { + load_threshold = var.ext_lb_config.security_policy.adaptive_protection_config.auto_deploy_config.load_threshold + confidence_threshold = var.ext_lb_config.security_policy.adaptive_protection_config.auto_deploy_config.confidence_threshold + impacted_baseline_threshold = var.ext_lb_config.security_policy.adaptive_protection_config.auto_deploy_config.impacted_baseline_threshold + expiration_sec = var.ext_lb_config.security_policy.adaptive_protection_config.auto_deploy_config.expiration_sec + } + } + } + } + type = "CLOUD_ARMOR" + dynamic "rule" { + for_each = try(var.ext_lb_config.security_policy.rate_limit_threshold, null) == null ? [] : [""] + content { + action = "throttle" + priority = 3000 + rate_limit_options { + enforce_on_key = "ALL" + conform_action = "allow" + exceed_action = "deny(429)" + rate_limit_threshold { + count = var.ext_lb_config.security_policy.rate_limit_threshold.count + interval_sec = var.ext_lb_config.security_policy.rate_limit_threshold.interval_sec + } + } + match { + versioned_expr = "SRC_IPS_V1" + config { + src_ip_ranges = ["*"] + } + } + description = "Rate limit all user IPs" + } + } + dynamic "rule" { + for_each = try(length(var.ext_lb_config.security_policy.forbidden_src_ip_ranges), 0) > 0 ? [""] : [] + content { + action = "deny(403)" + priority = 5000 + match { + versioned_expr = "SRC_IPS_V1" + config { + src_ip_ranges = var.ext_lb_config.security_policy.forbidden_src_ip_ranges + } + } + description = "Deny access to IPs in specific ranges" + } + } + dynamic "rule" { + for_each = try(length(var.ext_lb_config.security_policy.forbidden_regions), 0) > 0 ? [""] : [] + content { + action = "deny(403)" + priority = 7000 + match { + expr { + expression = "origin.region_code.matches(\"^${join("|", var.ext_lb_config.security_policy.forbidden_regions)}$\")" + } + } + description = "Block users from forbidden regions" + } + } + dynamic "rule" { + for_each = local.preconfigured_waf_rules + content { + action = "deny(403)" + priority = 10000 + index(keys(var.ext_lb_config.security_policy.preconfigured_waf_rules), rule.key) * 1000 + match { + expr { + expression = "evaluatePreconfiguredWaf(\"${rule.key}\"${length(rule.value) > 0 ? join("", [",", jsonencode(rule.value)]) : ""})" + } + } + description = "Preconfigured WAF rule (${rule.key})" + } + } + rule { + action = "allow" + priority = 2147483647 + match { + versioned_expr = "SRC_IPS_V1" + config { + src_ip_ranges = ["*"] + } + } + description = "default rule" + } +} diff --git a/blueprints/apigee/apigee-x-foundations/outputs.tf b/blueprints/apigee/apigee-x-foundations/outputs.tf new file mode 100644 index 000000000..3ce7b959c --- /dev/null +++ b/blueprints/apigee/apigee-x-foundations/outputs.tf @@ -0,0 +1,46 @@ +/** + * Copyright 2024 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. + */ + +output "endpoint_attachment_hosts" { + description = "Endpoint attachment hosts." + value = module.apigee.endpoint_attachment_hosts +} + +output "ext_lb_ip_address" { + description = "External IP address." + value = var.ext_lb_config != null && length(local.ext_instances) > 0 ? module.ext_lb[0].address : null +} + +output "instance_service_attachments" { + description = "Instance service attachments." + value = { for k, v in module.apigee.instances : k => v.service_attachment } +} + +output "int_cross_region_lb_ip_addresses" { + description = "Internal IP addresses." + value = var.int_cross_region_lb_config != null && length(local.int_cross_region_instances) > 0 ? module.int_cross_region_lb[0].addresses : null +} + +output "int_lb_ip_addresses" { + description = "Internal IP addresses." + value = var.int_lb_config != null && length(local.int_instances) > 0 ? { for k, v in module.int_lb : k => v.address } : null +} + +output "project_id" { + description = "Project." + value = module.project.project_id +} + diff --git a/blueprints/apigee/apigee-x-foundations/variables.tf b/blueprints/apigee/apigee-x-foundations/variables.tf new file mode 100644 index 000000000..a874de822 --- /dev/null +++ b/blueprints/apigee/apigee-x-foundations/variables.tf @@ -0,0 +1,360 @@ +/** + * Copyright 2023 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. + */ + +variable "apigee_config" { + description = "Apigee configuration." + type = object({ + addons_config = optional(object({ + advanced_api_ops = optional(bool, false) + api_security = optional(bool, false) + connectors_platform = optional(bool, false) + integration = optional(bool, false) + monetization = optional(bool, false) + })) + organization = object({ + display_name = optional(string) + description = optional(string, "Terraform-managed") + billing_type = optional(string) + database_encryption_key = optional(string) + analytics_region = optional(string, "europe-west1") + retention = optional(string) + disable_vpc_peering = optional(bool, false) + }) + envgroups = optional(map(list(string)), {}) + environments = optional(map(object({ + description = optional(string) + display_name = optional(string) + envgroups = optional(list(string), []) + iam = optional(map(list(string)), {}) + iam_bindings = optional(map(object({ + role = string + members = list(string) + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + iam_bindings_additive = optional(map(object({ + role = string + member = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + node_config = optional(object({ + min_node_count = optional(number) + max_node_count = optional(number) + }), {}) + type = optional(string) + })), {}) + instances = optional(map(object({ + disk_encryption_key = optional(string) + environments = optional(list(string), []) + external = optional(bool, true) + runtime_ip_cidr_range = optional(string) + troubleshooting_ip_cidr_range = optional(string) + })), {}) + endpoint_attachments = optional(map(object({ + region = string + service_attachment = string + dns_names = optional(list(string), []) + })), {}) + }) + validation { + condition = (!var.apigee_config.organization.disable_vpc_peering || + alltrue([for k, v in var.apigee_config.endpoint_attachments : length(v.dns_names) == 0])) + error_message = "If disable_vpc_peering is true for the organization, DNS names cannot be used for endpoint attachments." + } + nullable = false +} + +variable "enable_monitoring" { + description = "Boolean flag indicating whether an custom metric to monitor instances should be created in Cloud monitoring." + type = bool + default = false +} + +variable "ext_lb_config" { + description = "External application load balancer configuration." + type = object({ + log_sample_rate = optional(number) + outlier_detection = optional(object({ + consecutive_errors = optional(number) + consecutive_gateway_failure = optional(number) + enforcing_consecutive_errors = optional(number) + enforcing_consecutive_gateway_failure = optional(number) + enforcing_success_rate = optional(number) + max_ejection_percent = optional(number) + success_rate_minimum_hosts = optional(number) + success_rate_request_volume = optional(number) + success_rate_stdev_factor = optional(number) + base_ejection_time = optional(object({ + seconds = number + nanos = optional(number) + })) + interval = optional(object({ + seconds = number + nanos = optional(number) + })) + })) + security_policy = optional(object({ + advanced_options_config = optional(object({ + json_parsing = optional(object({ + enable = optional(bool, false) + content_types = optional(list(string)) + })) + log_level = optional(string) + })) + adaptive_protection_config = optional(object({ + layer_7_ddos_defense_config = optional(object({ + enable = optional(bool, false) + rule_visibility = optional(string) + })) + auto_deploy_config = optional(object({ + load_threshold = optional(number) + confidence_threshold = optional(number) + impacted_baseline_threshold = optional(number) + expiration_sec = optional(number) + })) + })) + rate_limit_threshold = optional(object({ + count = number + interval_sec = number + })) + forbidden_src_ip_ranges = optional(list(string), []) + forbidden_regions = optional(list(string), []) + preconfigured_waf_rules = optional(map(object({ + sensitivity = optional(number) + opt_in_rule_ids = optional(list(string), []) + opt_out_rule_ids = optional(list(string), []) + }))) + })) + ssl_certificates = object({ + certificate_ids = optional(list(string), []) + create_configs = optional(map(object({ + certificate = string + private_key = string + })), {}) + managed_configs = optional(map(object({ + domains = list(string) + description = optional(string) + })), {}) + self_signed_configs = optional(list(string), null) + }) + }) + default = null +} + +variable "int_cross_region_lb_config" { + description = "Internal application load balancer configuration." + type = object({ + log_sample_rate = optional(number) + outlier_detection = optional(object({ + consecutive_errors = optional(number) + consecutive_gateway_failure = optional(number) + enforcing_consecutive_errors = optional(number) + enforcing_consecutive_gateway_failure = optional(number) + enforcing_success_rate = optional(number) + max_ejection_percent = optional(number) + success_rate_minimum_hosts = optional(number) + success_rate_request_volume = optional(number) + success_rate_stdev_factor = optional(number) + base_ejection_time = optional(object({ + seconds = number + nanos = optional(number) + })) + interval = optional(object({ + seconds = number + nanos = optional(number) + })) + })) + certificate_manager_certificates = optional(list(string)) + }) + default = null +} + +variable "int_lb_config" { + description = "Internal application load balancer configuration." + type = object({ + log_sample_rate = optional(number) + outlier_detection = optional(object({ + consecutive_errors = optional(number) + consecutive_gateway_failure = optional(number) + enforcing_consecutive_errors = optional(number) + enforcing_consecutive_gateway_failure = optional(number) + enforcing_success_rate = optional(number) + max_ejection_percent = optional(number) + success_rate_minimum_hosts = optional(number) + success_rate_request_volume = optional(number) + success_rate_stdev_factor = optional(number) + base_ejection_time = optional(object({ + seconds = number + nanos = optional(number) + })) + interval = optional(object({ + seconds = number + nanos = optional(number) + })) + })) + ssl_certificates = object({ + certificate_ids = optional(list(string), []) + create_configs = optional(map(object({ + certificate = string + private_key = string + })), {}) + self_signed_configs = optional(list(string), []) + }) + }) + default = null +} + + +variable "network_config" { + description = "Network configuration." + type = object({ + shared_vpc = optional(object({ + name = string + subnets = map(string) + subnets_psc = map(string) + })) + apigee_vpc = optional(object({ + name = optional(string) + auto_create = optional(bool, true) + subnets = optional(map(object({ + id = optional(string) + name = optional(string) + ip_cidr_range = optional(string) + })), {}) + subnets_proxy_only = optional(map(object({ + name = optional(string) + ip_cidr_range = string + })), {}) + subnets_psc = optional(map(object({ + id = optional(string) + name = optional(string) + ip_cidr_range = optional(string) + })), {}) + })) + }) + nullable = false + default = {} + validation { + condition = var.network_config.shared_vpc != null || var.network_config.apigee_vpc != null + error_message = "Shared VPC and/or local VPC details need to be provided." + } + validation { + condition = alltrue([for k, v in try(var.network_config.apigee_vpc.subnets, {}) : (v.id != null || v.ip_cidr_range != null) && !(v.id != null && v.ip_cidr_range != null)]) + error_message = "An IP CIDR range and id cannot be specified at the same time for a subnet." + } + validation { + condition = alltrue([for k, v in try(var.network_config.apigee_vpc.subnets_psc, {}) : (v.id != null || v.ip_cidr_range != null) && !(v.id != null && v.ip_cidr_range != null)]) + error_message = "An IP CIDR range and id cannot be specified at the same time for a PSC subnet." + } +} + +variable "project_config" { + description = "Project configuration." + type = object({ + billing_account_id = optional(string) + compute_metadata = optional(map(string), {}) + contacts = optional(map(list(string)), {}) + custom_roles = optional(map(list(string)), {}) + default_service_account = optional(string, "keep") + descriptive_name = optional(string) + iam = optional(map(list(string)), {}) + group_iam = optional(map(list(string)), {}) + iam_bindings = optional(map(object({ + role = string + members = list(string) + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + iam_bindings_additive = optional(map(object({ + role = string + member = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + labels = optional(map(string), {}) + lien_reason = optional(string) + logging_data_access = optional(map(map(list(string))), {}) + log_exclusions = optional(map(string), {}) + logging_sinks = optional(map(object({ + bq_partitioned_table = optional(bool) + description = optional(string) + destination = string + disabled = optional(bool, false) + exclusions = optional(map(string), {}) + filter = string + iam = optional(bool, true) + type = string + unique_writer = optional(bool, true) + })), {}) + metric_scopes = optional(list(string), []) + name = string + org_policies = optional(map(object({ + inherit_from_parent = optional(bool) # for list policies only. + reset = optional(bool) + rules = optional(list(object({ + allow = optional(object({ + all = optional(bool) + values = optional(list(string)) + })) + deny = optional(object({ + all = optional(bool) + values = optional(list(string)) + })) + enforce = optional(bool) # for boolean policies only. + condition = optional(object({ + description = optional(string) + expression = optional(string) + location = optional(string) + title = optional(string) + }), {}) + })), []) + })), {}) + parent = optional(string) + prefix = optional(string) + project_create = optional(bool, true) + vpc_sc = optional(object({ + perimeter_name = string + perimeter_bridges = optional(list(string), []) + is_dry_run = optional(bool, false) + })) + services = optional(list(string), []) + shared_vpc_host_config = optional(object({ + enabled = bool + service_projects = optional(list(string), []) + })) + shared_vpc_service_config = optional(object({ + host_project = string + service_identity_iam = optional(map(list(string)), {}) + service_iam_grants = optional(list(string), []) + })) + skip_delete = optional(bool, false) + tag_bindings = optional(map(string)) + }) +} + diff --git a/modules/net-lb-app-int-cross-region/README.md b/modules/net-lb-app-int-cross-region/README.md index 4bbaf4cc8..4e6155c4f 100644 --- a/modules/net-lb-app-int-cross-region/README.md +++ b/modules/net-lb-app-int-cross-region/README.md @@ -1,4 +1,4 @@ -# Internal Application Load Balancer Module +# Cross-region Internal Application Load Balancer Module This module allows managing Cross-regional Internal HTTP/HTTPS Load Balancers (L7 ILBs). It's designed to expose the full configuration of the underlying resources, and to facilitate common usage patterns by providing sensible defaults, and optionally managing prerequisite resources like health checks, instance groups, etc.

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 V92K}5pdT65R{U5JU_~-xt literal 0 HcmV?d00001 diff --git a/blueprints/apigee/apigee-x-foundations/diagram4.png b/blueprints/apigee/apigee-x-foundations/diagram4.png new file mode 100644 index 0000000000000000000000000000000000000000..613b762441005eac0aaad8ae69675c3a0d0a9252 GIT binary patch literal 33815 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 E2dS&=LjV8( literal 0 HcmV?d00001 diff --git a/blueprints/apigee/apigee-x-foundations/diagram5.png b/blueprints/apigee/apigee-x-foundations/diagram5.png new file mode 100644 index 0000000000000000000000000000000000000000..402a759bbe867906f0f0991108f351e8f71d4f88 GIT binary patch literal 30537 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