[
  {
    "path": ".github/snippet-bot.yml",
    "content": "\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n*.env\n*.pem\n*.tar.gz\ncluster-2\nistio_master.yaml\nistio-1*\nistio-2*\nistio-master.yaml\nistio-remote.yaml\nistio.yaml\nkubeconfig\nkubectx\nkubemci*\nregion-tag-adder"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\n## Development Principles (for Googlers)\n\nThere are a few principles for developing or refactoring the service\nimplementations. Read the [Development Principles\nGuide](./docs/development-principles.md).\n\n## Contributor License Agreement\n\nContributions to this project must be accompanied by a Contributor License\nAgreement. You (or your employer) retain the copyright to your contribution;\nthis simply gives us permission to use and redistribute your contributions as\npart of the project. Head over to <https://cla.developers.google.com/> to see\nyour current agreements on file or to sign a new one.\n\nYou generally only need to submit a CLA once, so if you've already submitted one\n(even if it was for a different project), you probably don't need to do it\nagain.\n\n## Code reviews\n\nAll submissions, including submissions by project members, require review. We\nuse GitHub pull requests for this purpose. Consult\n[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more\ninformation on using pull requests.\n\n## Community Guidelines\n\nThis project follows [Google's Open Source Community\nGuidelines](https://opensource.google.com/conduct/).\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "# ⛵️ istio-samples\n\nThis repository contains Google Cloud Platform demos and sample code for [Istio](https://istio.io/).\n\n**⚠️ Note**: These samples are last updated to the [Istio 1.5 release](https://github.com/istio/istio/releases/), and are no longer under active development. See the [Istio documentation](https://istio.io/) for the most up-to-date examples. For Anthos Service Mesh (ASM) samples, see https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples\n\n## Contents\n\n### [Canary Deployments with Istio on GKE](/istio-canary-gke)\n\nUses the [Hipstershop](https://github.com/GoogleCloudPlatform/microservices-demo) sample app to demonstrate traffic splitting with Istio on GKE, and how to view Istio-generated metrics in Stackdriver.\n\n### [Introduction to Istio Security](/security-intro)\n\nProvides an introduction to Istio service-to-service encryption (mutual TLS), end-user authentication (JSON Web Tokens), and service authorization (role-based access control).\n\n### [Istio and Stackdriver](/istio-stackdriver)\n\nA deep-dive on how to use Stackdriver to monitor Istio services' health, analyze traces, and view logs.\n\n### [Using a GCP Internal Load Balancer with Istio](/internal-load-balancer)\n\nDemonstrates how to connect GCE (VM-based) workloads to Istio services running in GKE, through a private internal load balancer on GCP.\n\n### [Geo-Aware Istio Multicluster Ingress](/multicluster-ingress)\n\nShows how to attach a global Anycast IP address to multiple Istio IngressGateways running in clusters across regions.\n\n### [Integrating a Google Compute Engine VM with Istio](/mesh-expansion-gce)\n\nDemonstrates how to do Istio Mesh Expansion: the process of incorporating a GCE-based workload into an Istio mesh running in GKE.\n\n### [Multicluster Istio- Single Control Plane](/multicluster-gke/single-control-plane)\n\nIntroduces Multicluster Istio by uniting GKE workloads in two different clusters into a single Istio mesh.\n\n### [Multicluster Istio- Dual Control Plane](/multicluster-gke/dual-control-plane)\n\nShows how to connect two separate GKE clusters, each with their own Istio control planes, into a single Gateway-connected mesh.\n\n### [Virtual Machine Migration with Multicluster Istio](/multicluster-gke/vm-migration/)\n\nDemonstrates how to integrate an Istio-enabled VM into a multicluster mesh, then migrate traffic from the VM to GKE.\n"
  },
  {
    "path": "common/default.yaml",
    "content": "# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\napiVersion: install.istio.io/v1alpha1\nkind: IstioOperator\nspec:\n  addonComponents:\n    grafana:\n      enabled: true\n      k8s:\n        replicaCount: 1\n    istiocoredns:\n      enabled: false\n    kiali:\n      enabled: true\n      k8s:\n        replicaCount: 1\n    prometheus:\n      enabled: true\n      k8s:\n        replicaCount: 1\n    tracing:\n      enabled: true\n  components:\n    base:\n      enabled: true\n    citadel:\n      enabled: false\n      k8s:\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    cni:\n      enabled: false\n    egressGateways:\n    - enabled: false\n      k8s:\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-ingressgateway\n        resources:\n          limits:\n            cpu: 2000m\n            memory: 1024Mi\n          requests:\n            cpu: 100m\n            memory: 128Mi\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n      name: istio-egressgateway\n    galley:\n      enabled: false\n      k8s:\n        replicaCount: 1\n        resources:\n          requests:\n            cpu: 100m\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    ingressGateways:\n    - enabled: true\n      k8s:\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-ingressgateway\n        resources:\n          limits:\n            cpu: 2000m\n            memory: 1024Mi\n          requests:\n            cpu: 100m\n            memory: 128Mi\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n      name: istio-ingressgateway\n    nodeAgent:\n      enabled: false\n    pilot:\n      enabled: true\n      k8s:\n        env:\n        - name: POD_NAME\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.name\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        readinessProbe:\n          httpGet:\n            path: /ready\n            port: 8080\n          initialDelaySeconds: 5\n          periodSeconds: 5\n          timeoutSeconds: 5\n        resources:\n          requests:\n            cpu: 500m\n            memory: 2048Mi\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    policy:\n      enabled: false\n      k8s:\n        env:\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-policy\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    sidecarInjector:\n      enabled: false\n      k8s:\n        replicaCount: 1\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    telemetry:\n      enabled: false\n      k8s:\n        env:\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        - name: GOMAXPROCS\n          value: \"6\"\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-telemetry\n        replicaCount: 1\n        resources:\n          limits:\n            cpu: 4800m\n            memory: 4G\n          requests:\n            cpu: 1000m\n            memory: 1G\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n  hub: docker.io/istio\n  tag: 1.5.1\n  values:\n    clusterResources: true\n    galley:\n      enableAnalysis: false\n      image: galley\n    gateways:\n      istio-egressgateway:\n        autoscaleEnabled: true\n        env:\n          ISTIO_META_ROUTER_MODE: sni-dnat\n        ports:\n        - name: http2\n          port: 80\n        - name: https\n          port: 443\n        - name: tls\n          port: 15443\n          targetPort: 15443\n        secretVolumes:\n        - mountPath: /etc/istio/egressgateway-certs\n          name: egressgateway-certs\n          secretName: istio-egressgateway-certs\n        - mountPath: /etc/istio/egressgateway-ca-certs\n          name: egressgateway-ca-certs\n          secretName: istio-egressgateway-ca-certs\n        type: ClusterIP\n      istio-ingressgateway:\n        applicationPorts: \"\"\n        autoscaleEnabled: true\n        debug: info\n        domain: \"\"\n        env:\n          ISTIO_META_ROUTER_MODE: sni-dnat\n        meshExpansionPorts:\n        - name: tcp-pilot-grpc-tls\n          port: 15011\n          targetPort: 15011\n        - name: tcp-citadel-grpc-tls\n          port: 8060\n          targetPort: 8060\n        - name: tcp-dns-tls\n          port: 853\n          targetPort: 853\n        ports:\n        - name: status-port\n          port: 15020\n          targetPort: 15020\n        - name: http2\n          port: 80\n          targetPort: 80\n        - name: https\n          port: 443\n        - name: kiali\n          port: 15029\n          targetPort: 15029\n        - name: prometheus\n          port: 15030\n          targetPort: 15030\n        - name: grafana\n          port: 15031\n          targetPort: 15031\n        - name: tracing\n          port: 15032\n          targetPort: 15032\n        - name: tls\n          port: 15443\n          targetPort: 15443\n        sds:\n          enabled: false\n          image: node-agent-k8s\n          resources:\n            limits:\n              cpu: 2000m\n              memory: 1024Mi\n            requests:\n              cpu: 100m\n              memory: 128Mi\n        secretVolumes:\n        - mountPath: /etc/istio/ingressgateway-certs\n          name: ingressgateway-certs\n          secretName: istio-ingressgateway-certs\n        - mountPath: /etc/istio/ingressgateway-ca-certs\n          name: ingressgateway-ca-certs\n          secretName: istio-ingressgateway-ca-certs\n        type: LoadBalancer\n        zvpn:\n          enabled: false\n          suffix: global\n    global:\n      arch:\n        amd64: 2\n        ppc64le: 2\n        s390x: 2\n      certificates: []\n      configValidation: true\n      controlPlaneSecurityEnabled: true\n      defaultNodeSelector: {}\n      defaultPodDisruptionBudget:\n        enabled: true\n      defaultResources:\n        requests:\n          cpu: 10m\n      disablePolicyChecks: true\n      enableHelmTest: false\n      enableTracing: true\n      imagePullPolicy: IfNotPresent\n      imagePullSecrets: []\n      istioNamespace: istio-system\n      istiod:\n        enabled: true\n      jwtPolicy: third-party-jwt\n      k8sIngress:\n        enableHttps: false\n        enabled: false\n        gatewayName: ingressgateway\n      localityLbSetting:\n        enabled: true\n      logAsJson: false\n      logging:\n        level: default:info\n      meshExpansion:\n        enabled: false\n        useILB: false\n      meshNetworks: {}\n      mountMtlsCerts: false\n      mtls:\n        auto: true\n        enabled: false\n      multiCluster:\n        clusterName: \"\"\n        enabled: false\n      network: \"\"\n      omitSidecarInjectorConfigMap: false\n      oneNamespace: false\n      operatorManageWebhooks: false\n      outboundTrafficPolicy:\n        mode: ALLOW_ANY\n      pilotCertProvider: istiod\n      policyCheckFailOpen: false\n      priorityClassName: \"\"\n      proxy:\n        accessLogEncoding: TEXT\n        accessLogFile: \"/dev/stdout\"\n        accessLogFormat: \"\"\n        autoInject: enabled\n        clusterDomain: cluster.local\n        componentLogLevel: misc:error\n        concurrency: 2\n        dnsRefreshRate: 300s\n        enableCoreDump: false\n        envoyAccessLogService:\n          enabled: false\n        envoyMetricsService:\n          enabled: false\n          tcpKeepalive:\n            interval: 10s\n            probes: 3\n            time: 10s\n          tlsSettings:\n            mode: DISABLE\n            subjectAltNames: []\n        envoyStatsd:\n          enabled: false\n        excludeIPRanges: \"\"\n        excludeInboundPorts: \"\"\n        excludeOutboundPorts: \"\"\n        image: proxyv2\n        includeIPRanges: '*'\n        includeInboundPorts: '*'\n        kubevirtInterfaces: \"\"\n        logLevel: warning\n        privileged: false\n        protocolDetectionTimeout: 100ms\n        readinessFailureThreshold: 30\n        readinessInitialDelaySeconds: 1\n        readinessPeriodSeconds: 2\n        resources:\n          limits:\n            cpu: 2000m\n            memory: 1024Mi\n          requests:\n            cpu: 100m\n            memory: 128Mi\n        statusPort: 15020\n        tracer: zipkin\n      proxy_init:\n        image: proxyv2\n        resources:\n          limits:\n            cpu: 100m\n            memory: 50Mi\n          requests:\n            cpu: 10m\n            memory: 10Mi\n      sds:\n        enabled: false\n        token:\n          aud: istio-ca\n        udsPath: \"\"\n      sts:\n        servicePort: 0\n      tracer:\n        datadog:\n          address: $(HOST_IP):8126\n        lightstep:\n          accessToken: \"\"\n          address: \"\"\n          cacertPath: \"\"\n          secure: true\n        stackdriver:\n          debug: false\n          maxNumberOfAnnotations: 200\n          maxNumberOfAttributes: 200\n          maxNumberOfMessageEvents: 200\n        zipkin:\n          address: \"\"\n      trustDomain: cluster.local\n      useMCP: false\n    grafana:\n      accessMode: ReadWriteMany\n      contextPath: /grafana\n      dashboardProviders:\n        dashboardproviders.yaml:\n          apiVersion: 1\n          providers:\n          - disableDeletion: false\n            folder: istio\n            name: istio\n            options:\n              path: /var/lib/grafana/dashboards/istio\n            orgId: 1\n            type: file\n      datasources:\n        datasources.yaml:\n          apiVersion: 1\n      env: {}\n      envSecrets: {}\n      image:\n        repository: grafana/grafana\n        tag: 6.5.2\n      ingress:\n        enabled: false\n        hosts:\n        - grafana.local\n      nodeSelector: {}\n      persist: false\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      security:\n        enabled: false\n        passphraseKey: passphrase\n        secretName: grafana\n        usernameKey: username\n      service:\n        annotations: {}\n        externalPort: 3000\n        name: http\n        type: ClusterIP\n      storageClassName: \"\"\n      tolerations: []\n    istiocoredns:\n      coreDNSImage: coredns/coredns\n      coreDNSPluginImage: istio/coredns-plugin:0.2-istio-1.1\n      coreDNSTag: 1.6.2\n    kiali:\n      contextPath: /kiali\n      createDemoSecret: true\n      dashboard:\n        grafanaInClusterURL: http://grafana:3000\n        jaegerInClusterURL: http://tracing/jaeger\n        passphraseKey: passphrase\n        secretName: kiali\n        usernameKey: username\n        viewOnlyMode: false\n      hub: quay.io/kiali\n      ingress:\n        enabled: false\n        hosts:\n        - kiali.local\n      nodeSelector: {}\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      security:\n        cert_file: /kiali-cert/cert-chain.pem\n        enabled: false\n        private_key_file: /kiali-cert/key.pem\n      tag: v1.14\n    mixer:\n      adapters:\n        kubernetesenv:\n          enabled: true\n        prometheus:\n          enabled: true\n          metricsExpiryDuration: 10m\n        stackdriver:\n          auth:\n            apiKey: \"\"\n            appCredentials: false\n            serviceAccountPath: \"\"\n          enabled: false\n          tracer:\n            enabled: false\n            sampleProbability: 1\n        stdio:\n          enabled: false\n          outputAsJson: false\n        useAdapterCRDs: false\n      policy:\n        adapters:\n          kubernetesenv:\n            enabled: true\n          useAdapterCRDs: false\n        autoscaleEnabled: true\n        image: mixer\n        sessionAffinityEnabled: false\n      telemetry:\n        autoscaleEnabled: true\n        env:\n          GOMAXPROCS: \"6\"\n        image: mixer\n        loadshedding:\n          latencyThreshold: 100ms\n          mode: enforce\n        nodeSelector: {}\n        podAntiAffinityLabelSelector: []\n        podAntiAffinityTermLabelSelector: []\n        replicaCount: 1\n        reportBatchMaxEntries: 100\n        reportBatchMaxTime: 1s\n        sessionAffinityEnabled: false\n        tolerations: []\n    nodeagent:\n      image: node-agent-k8s\n    pilot:\n      appNamespaces: []\n      autoscaleEnabled: true\n      autoscaleMax: 5\n      autoscaleMin: 1\n      configMap: true\n      configNamespace: istio-config\n      cpu:\n        targetAverageUtilization: 80\n      enableProtocolSniffingForInbound: false\n      enableProtocolSniffingForOutbound: true\n      env: {}\n      image: pilot\n      ingress:\n        ingressClass: istio\n        ingressControllerMode: STRICT\n        ingressService: istio-ingressgateway\n      keepaliveMaxServerConnectionAge: 30m\n      meshNetworks:\n        networks: {}\n      nodeSelector: {}\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      policy:\n        enabled: false\n      replicaCount: 1\n      tolerations: []\n      traceSampling: 1\n    prometheus:\n      contextPath: /prometheus\n      hub: docker.io/prom\n      ingress:\n        enabled: false\n        hosts:\n        - prometheus.local\n      nodeSelector: {}\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      provisionPrometheusCert: true\n      retention: 6h\n      scrapeInterval: 15s\n      security:\n        enabled: true\n      tag: v2.15.1\n      tolerations: []\n    security:\n      dnsCerts:\n        istio-pilot-service-account.istio-control: istio-pilot.istio-control\n      enableNamespacesByDefault: true\n      image: citadel\n      selfSigned: true\n    sidecarInjectorWebhook:\n      enableNamespacesByDefault: false\n      image: sidecar_injector\n      injectLabel: istio-injection\n      objectSelector:\n        autoInject: true\n        enabled: false\n      rewriteAppHTTPProbe: false\n      selfSigned: false\n    telemetry:\n      enabled: true\n      v1:\n        enabled: false\n      v2:\n        enabled: true\n        prometheus:\n          enabled: true\n        stackdriver:\n          configOverride: {}\n          enabled: true\n          logging: true\n          monitoring: true\n          topology: true\n    tracing:\n      ingress:\n        enabled: false\n      jaeger:\n        accessMode: ReadWriteMany\n        hub: docker.io/jaegertracing\n        memory:\n          max_traces: 50000\n        persist: false\n        spanStorageType: badger\n        storageClassName: \"\"\n        tag: \"1.16\"\n      nodeSelector: {}\n      opencensus:\n        exporters:\n          stackdriver:\n            enable_tracing: true\n        hub: docker.io/omnition\n        resources:\n          limits:\n            cpu: \"1\"\n            memory: 2Gi\n          requests:\n            cpu: 200m\n            memory: 400Mi\n        tag: 0.1.9\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      provider: jaeger\n      service:\n        annotations: {}\n        externalPort: 9411\n        name: http-query\n        type: ClusterIP\n      zipkin:\n        hub: docker.io/openzipkin\n        javaOptsHeap: 700\n        maxSpans: 500000\n        node:\n          cpus: 2\n        probeStartupDelay: 200\n        queryPort: 9411\n        resources:\n          limits:\n            cpu: 300m\n            memory: 900Mi\n          requests:\n            cpu: 150m\n            memory: 900Mi\n        tag: 2.14.2\n    version: \"\"\n\n"
  },
  {
    "path": "common/install_istio.sh",
    "content": "# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#!/bin/bash\n\n# installs standard single-cluster Istio on GKE + the Istio Stackdriver adapter\n\n# Download Istio\nWORKDIR=\"`pwd`\"\nISTIO_VERSION=\"${ISTIO_VERSION:-1.5.2}\"\necho \"Downloading Istio ${ISTIO_VERSION}...\"\ncurl -L https://git.io/getLatestIstio | ISTIO_VERSION=$ISTIO_VERSION sh -\n\n# Prepare for install\nkubectl create namespace istio-system\n\ncd ./istio-${ISTIO_VERSION}/\nkubectl create secret generic cacerts -n istio-system \\\n    --from-file=samples/certs/ca-cert.pem \\\n    --from-file=samples/certs/ca-key.pem \\\n    --from-file=samples/certs/root-cert.pem \\\n    --from-file=samples/certs/cert-chain.pem\ncd ../\n\nkubectl label namespace default istio-injection=enabled\nkubectl create clusterrolebinding cluster-admin-binding \\\n    --clusterrole=cluster-admin \\\n    --user=$(gcloud config get-value core/account)\n\n\n# install using operator config - https://istio.io/docs/setup/install/istioctl/#customizing-the-configuration\nINSTALL_PROFILE=${INSTALL_YAML:-default.yaml}\n./istio-${ISTIO_VERSION}/bin/istioctl manifest apply -f ${INSTALL_PROFILE}"
  },
  {
    "path": "internal-load-balancer/README.md",
    "content": "# Demo: Using a GCP Internal Load Balancer with Istio\n\nThis demo shows how to use an Internal Load Balancer (ILB) to connect Istio workloads running in Google Kubernetes Engine (GKE) with VM-based workloads in Google Compute Engine (GCE).\n\n**Note**: [ILB for GKE](https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balancing) is currently in beta.\n\n## How It Works\n\nAn [Internal Load Balancer (ILB)](https://cloud.google.com/load-balancing/docs/internal/) is a Google Cloud Platform (GCP) resource that exposes workloads (in GCE or GKE) to other workloads within the same region, and the same [Virtual Private Cloud](https://cloud.google.com/vpc/) (VPC) network. Using an ILB replaces the need to use a GKE external load balancer with a set of firewall rules.\n\nYou can [annotate Kubernetes Services](https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balancing#overview) directly to provision a GCP ILB, instead of an external network load balancer. However, Istio has its own [ILB Gateway](https://istio.io/docs/reference/config/installation-options/#gateways-options) for exposing Services inside the mesh.\n\nThe value of using the Istio ILB Gateway is that it's highly configurable -- you can, for instance, [define granular traffic rules](https://istio.io/docs/tasks/traffic-management/ingress/) to be applied for a specific service exposed via that ILB Gateway. Using an ILB Gateway replaces the need to use an external `Service type=LoadBalancer` with a set of firewall rules.\n\nIf Istio's ILB Gateway is enabled on install, it is annotated to provision its own ILB inside your GCP project. Note that a GCP Internal Load Balancer [is not a proxy](https://cloud.google.com/load-balancing/docs/internal/#how_ilb_works), but rather a resource that configures GCE instances directly to talk to \"backends\" within the same VPC network. In this case, the \"backend\" of the Istio ILB load balancer will be a GKE Instance Group — or, the set of VMs that comprise the GKE cluster.\n\nIn this demo, we will build the following architecture:\n\n![arch-diagram](screenshots/architecture.png)\n\n## Prerequisites\n\n- A GCP project with billing enabled\n- [Helm](https://helm.sh/docs/using_helm/#installing-helm) (CLI) installed on your local machine\n\n## Create a GKE Cluster\n\n1. **Export project ID:**\n\n```\nPROJECT_ID=<your-project-id>\n```\n\n2. **Create the cluster:**\n\n```\ngcloud container clusters create istio-ilb --project $PROJECT_ID --zone us-central1-c \\\n--machine-type \"n1-standard-2\" --disk-size \"100\" \\\n--num-nodes \"4\" --network \"default\" --async\n```\n\n3. Wait for the cluster to be `RUNNING`, by executing:\n\n```\ngcloud container clusters list --project $PROJECT_ID\n```\n\n4. Get credentials:\n\n```\ngcloud container clusters get-credentials istio-ilb --zone us-central1-c --project $PROJECT_ID\n```\n\n## Install Istio with ILB Gateway Enabled\n\n1. Open the install profile in `manifests/install.yaml`. This is a default install profile with the ILB ingress gateway enabled in addition to the default, publicly-accessible `istio-ingressgateway`. Notice line 104:\n\n```\n      k8s:\n        serviceAnnotations:\n          cloud.google.com/load-balancer-type: \"Internal\"\n```\n\nHere, instead of provisioning this second Istio gateway with a public load balancer, we are telling GKE to instead provision an internal [GCP internal load balancer](https://cloud.google.com/load-balancing/docs/internal). This means that this gateway will only be accessible from inside the GCP virtual private cloud (VPC) - for instance, from a Google Compute Engine instance in the same GCP project.\n\n2. Install Istio on the cluster. Clone this repository and navigate to the root `istio-samples` directory. Then, apply the install profile:\n\n```\ncd common/\nINSTALL_YAML=\"../internal-load-balancer/manifests/install.yaml\" ./install_istio.sh\n```\n\n3. Run `kubectl get pods -n istio-system`. You should see two gateway pods running: `istio-ilbgateway` and `istio-ingressgateway`.\n\n```\nNAME                                    READY   STATUS    RESTARTS\n AGE\ngrafana-556b649566-s2bj2                1/1     Running   0\n 39s\nistio-ilbgateway-7fb4b47dcc-x7zbc       1/1     Running   0\n 43s\nistio-ingressgateway-598796f4d9-gszfx   1/1     Running   0\n 43s\nistio-tracing-7cf5f46848-g47zt          1/1     Running   0\n 39s\nistiod-55fb557b7-ltfxj                  1/1     Running   0\n 58s\nkiali-6d54b8ccbc-v26ds                  1/1     Running   0\n 39s\nprometheus-5bd4c4679b-dbvsn             2/2     Running   0\n 38s\n```\n\n4. Get the Kubernetes services corresponding to the two Istio Gateways. You should see two gateway services, both with an `EXTERNAL_IP` field. The `istio-ilbgateway` external IP is only \"external\" to its own VPC. **Note** - it may take several minutes to for the external IP to appear - in the meantime, you will see `<pending>` while the load balancers are provisioned.\n\n```\n$ kubectl get service -n istio-system | grep gateway\n\nistio-ilbgateway            LoadBalancer   10.0.5.3      10.128.0.9      15011:30940/TCP,15010:32052/TCP,8060:32219/TCP,5353:30527/TCP,80:30694/TCP                                                   19m\nistio-ingressgateway        LoadBalancer   10.0.2.236    34.70.166.247   15020:30267/TCP,80:32184/TCP,443:30578/TCP,15029:32296/TCP,15030:31735/TCP,15031:32750/TCP,15032:32506/TCP,15443:30743/TCP   19m\n```\n\n\n## Deploy the HelloServer application\n\nHelloServer is a Python HTTP server that serves the `GET / ` endpoint, and prints `HelloWorld`. We'll also deploy a load generator (also Python) that will repeatedly send 10 Requests per Second (RPS) to `helloserver`.\n\n```\ncd ../internal-load-balancer/\nkubectl apply -f ../sample-apps/helloserver/server/server.yaml\nkubectl apply -f ../sample-apps/helloserver/loadgen/loadgen.yaml\n```\n\n## Explore the Kiali Dashboard\n\n[Kiali](https://www.kiali.io/) is a web-based Istio dashboard for observing your Istio mesh topology. We installed Kiali already, with the rest of the Istio control plane.\n\n1. Open the Kiali dashboard in a browser.\n\n```\nalias istioctl=\"../common/istio-1.5.2/bin/istioctl\"\nistioctl dashboard kiali &\n```\n\n\n2. Log in with the demo credentials: `admin/admin`.\n\n3. navigate in the left sidebar to `Graph`, and view the Service Graph for the `default` Kubernetes namespace. This is the namespace into which we've deployed the `helloserver` application.\n\n![service-graph](screenshots/default-svc-graph.png)\n\n## Access HelloServer via ILB\n\nNow that we can confirm that in-cluster workloads (like `loadgenerator`) can access `helloserver`, let's access `helloserver` from outside the GKE cluster, via the ILB gateway.\n\nTo do this, we'll create a GCE Instance in the same project / VPC. **Note**: we will create this VM in the same region as the GKE cluster. This is a prerequisite for GCP resource communication via ILB. Also notice that `--network=default` means we're creating the GCE VM in the same VPC network as the GKE cluster, which is also using the `default` network.\n\n1. **Create a GCE instance.**\n\n```\ngcloud compute --project=$PROJECT_ID instances create gce-ilb --zone=us-central1-c --machine-type=n1-standard-2 --network=default\n```\n\n\n2. **Create a VirtualService and Gateway.**\n\nIf we want to send traffic from GCE to GKE, via the Istio ILB Gateway, we will have to expose HelloServer within GCP. This will be the same process as if we were exposing HelloServer to the public internet ([with the IngressGateway](https://istio.io/docs/tasks/traffic-management/ingress/#configuring-ingress-using-an-istio-gateway)). For this, we'll use an Istio `Gateway` resource, along with a `VirtualService`.\n\n```\nkubectl apply -f manifests/server-ilb.yaml\n```\n\nBecause the Istio ILBGateway service is `type=LoadBalancer`, it gets an `EXTERNAL_IP`, but only \"external\" within our regional VPC network:\n\n3. **Get the EXTERNAL_IP for istio-ilbgateway:**\n```\nkubectl get svc -n istio-system istio-ilbgateway\n```\n\nYou should see something like:\n\n```\nNAME               TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                      AGE\nistio-ilbgateway   LoadBalancer   10.67.240.220   10.150.0.7    15011:32390/TCP,15010:32626/TCP,8060:32429/TCP,5353:32066/TCP,80:32624/TCP   39m\n```\n\nCopy the `EXTERNAL_IP` to the clipboard.\n\n4. **ssh into the GCE instance:**\n\n```\ngcloud compute ssh --project $PROJECT_ID  --zone \"us-central1-c\" gce-ilb\n```\n\n5. **Reach helloserver via the ILB gateway IP, at port 80:**\n\n```\nexport EXTERNAL_IP=\"<your-external-ip\"\n\ncurl http://${EXTERNAL_IP}:80\n```\n\nYou should see:\n\n```\nHello World! /\n```\n\nThis request just went from your GCE instance, to the Istio ILB Gateway, then to the `hellosvc` Service inside the Istio mesh.\n\nNotice that if you try to execute the same `curl` request on your local machine, you will time out -- this because the ILB Gateway is only exposed from within your GCP project's private VPC network.\n\nFinally, re-open the Kiali service graph in the browser -- now notice how the ilb-gateway is also now serving traffic for `hellosvc`.\n\n![service-graph](screenshots/ilb-graph.png)\n\n\n🌟 **Well done** - you just exposed a GKE service via Istio's ILB Gateway!\n\n\n## Cleanup\n\n1. **Delete the GCE VM**:\n\n```\ngcloud compute --project=$PROJECT_ID instances delete gce-ilb --zone=us-central1-c --async\n```\n\n2. **Delete the GKE Cluster**:\n\n```\ngcloud container clusters delete istio-ilb --project $PROJECT_ID --zone us-central1-c --async\n```\n"
  },
  {
    "path": "internal-load-balancer/manifests/install.yaml",
    "content": "# ILB config source - https://github.com/istio/istio/issues/20033\napiVersion: install.istio.io/v1alpha1\nkind: IstioOperator\nspec:\n  addonComponents:\n    grafana:\n      enabled: true\n      k8s:\n        replicaCount: 1\n    istiocoredns:\n      enabled: false\n    kiali:\n      enabled: true\n      k8s:\n        replicaCount: 1\n    prometheus:\n      enabled: true\n      k8s:\n        replicaCount: 1\n    tracing:\n      enabled: true\n  components:\n    base:\n      enabled: true\n    citadel:\n      enabled: false\n      k8s:\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    cni:\n      enabled: false\n    egressGateways:\n    - enabled: false\n      k8s:\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-ingressgateway\n        resources:\n          limits:\n            cpu: 2000m\n            memory: 1024Mi\n          requests:\n            cpu: 100m\n            memory: 128Mi\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n      name: istio-egressgateway\n    galley:\n      enabled: false\n      k8s:\n        replicaCount: 1\n        resources:\n          requests:\n            cpu: 100m\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    ingressGateways:\n    - name: istio-ingressgateway\n      enabled: true\n      k8s:\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-ingressgateway\n        resources:\n          limits:\n            cpu: 2000m\n            memory: 1024Mi\n          requests:\n            cpu: 100m\n            memory: 128Mi\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    - name: istio-ilbgateway\n      enabled: true\n      k8s:\n        serviceAnnotations:\n          cloud.google.com/load-balancer-type: \"Internal\"\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-ilbgateway\n        resources:\n          limits:\n            cpu: 2000m\n            memory: 1024Mi\n          requests:\n            cpu: 100m\n            memory: 128Mi\n        service:\n          ports:\n          - name: grpc-pilot-mtls\n            port: 15011\n          - name: grpc-pilot\n            port: 15010\n          - name: tcp-citadel-grpc-tls\n            port: 8060\n            targetPort: 8060\n          - name: tcp-dns\n            port: 5353\n          - name: http\n            port: 80\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n        overlays:\n          - kind: HorizontalPodAutoscaler\n            name: istio-ilbgateway\n            patches:\n              - path: metadata.labels.app\n                value: istio-ilbgateway\n              - path: metadata.labels.istio\n                value: ilbgateway\n              - path: spec.scaleTargetRef.name\n                value: istio-ilbgateway\n          - kind: Deployment\n            name: istio-ilbgateway\n            patches:\n              - path: metadata.labels.app\n                value: istio-ilbgateway\n              - path: metadata.labels.istio\n                value: ilbgateway\n              - path: spec.selector.matchLabels.app\n                value: istio-ilbgateway\n              - path: spec.selector.matchLabels.istio\n                value: ilbgateway\n              - path: spec.template.metadata.labels.app\n                value: istio-ilbgateway\n              - path: spec.template.metadata.labels.istio\n                value: ilbgateway\n          - kind: Service\n            name: istio-ilbgateway\n            patches:\n              - path: metadata.labels.app\n                value: istio-ilbgateway\n              - path: metadata.labels.istio\n                value: ilbgateway\n              - path: spec.selector.app\n                value: istio-ilbgateway\n              - path: spec.selector.istio\n                value: ilbgateway\n    nodeAgent:\n      enabled: false\n    pilot:\n      enabled: true\n      k8s:\n        env:\n        - name: POD_NAME\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.name\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        readinessProbe:\n          httpGet:\n            path: /ready\n            port: 8080\n          initialDelaySeconds: 5\n          periodSeconds: 5\n          timeoutSeconds: 5\n        resources:\n          requests:\n            cpu: 500m\n            memory: 2048Mi\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    policy:\n      enabled: false\n      k8s:\n        env:\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-policy\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    sidecarInjector:\n      enabled: false\n      k8s:\n        replicaCount: 1\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    telemetry:\n      enabled: false\n      k8s:\n        env:\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        - name: GOMAXPROCS\n          value: \"6\"\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-telemetry\n        replicaCount: 1\n        resources:\n          limits:\n            cpu: 4800m\n            memory: 4G\n          requests:\n            cpu: 1000m\n            memory: 1G\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n  hub: docker.io/istio\n  tag: 1.5.1\n  values:\n    clusterResources: true\n    galley:\n      enableAnalysis: false\n      image: galley\n    gateways:\n      istio-egressgateway:\n        autoscaleEnabled: true\n        env:\n          ISTIO_META_ROUTER_MODE: sni-dnat\n        ports:\n        - name: http2\n          port: 80\n        - name: https\n          port: 443\n        - name: tls\n          port: 15443\n          targetPort: 15443\n        secretVolumes:\n        - mountPath: /etc/istio/egressgateway-certs\n          name: egressgateway-certs\n          secretName: istio-egressgateway-certs\n        - mountPath: /etc/istio/egressgateway-ca-certs\n          name: egressgateway-ca-certs\n          secretName: istio-egressgateway-ca-certs\n        type: ClusterIP\n      istio-ingressgateway:\n        applicationPorts: \"\"\n        autoscaleEnabled: true\n        debug: info\n        domain: \"\"\n        env:\n          ISTIO_META_ROUTER_MODE: sni-dnat\n        meshExpansionPorts:\n        - name: tcp-pilot-grpc-tls\n          port: 15011\n          targetPort: 15011\n        - name: tcp-citadel-grpc-tls\n          port: 8060\n          targetPort: 8060\n        - name: tcp-dns-tls\n          port: 853\n          targetPort: 853\n        ports:\n        - name: status-port\n          port: 15020\n          targetPort: 15020\n        - name: http2\n          port: 80\n          targetPort: 80\n        - name: https\n          port: 443\n        - name: kiali\n          port: 15029\n          targetPort: 15029\n        - name: prometheus\n          port: 15030\n          targetPort: 15030\n        - name: grafana\n          port: 15031\n          targetPort: 15031\n        - name: tracing\n          port: 15032\n          targetPort: 15032\n        - name: tls\n          port: 15443\n          targetPort: 15443\n        sds:\n          enabled: false\n          image: node-agent-k8s\n          resources:\n            limits:\n              cpu: 2000m\n              memory: 1024Mi\n            requests:\n              cpu: 100m\n              memory: 128Mi\n        secretVolumes:\n        - mountPath: /etc/istio/ingressgateway-certs\n          name: ingressgateway-certs\n          secretName: istio-ingressgateway-certs\n        - mountPath: /etc/istio/ingressgateway-ca-certs\n          name: ingressgateway-ca-certs\n          secretName: istio-ingressgateway-ca-certs\n        type: LoadBalancer\n        zvpn:\n          enabled: false\n          suffix: global\n    global:\n      arch:\n        amd64: 2\n        ppc64le: 2\n        s390x: 2\n      certificates: []\n      configValidation: true\n      controlPlaneSecurityEnabled: true\n      defaultNodeSelector: {}\n      defaultPodDisruptionBudget:\n        enabled: true\n      defaultResources:\n        requests:\n          cpu: 10m\n      disablePolicyChecks: true\n      enableHelmTest: false\n      enableTracing: true\n      imagePullPolicy: IfNotPresent\n      imagePullSecrets: []\n      istioNamespace: istio-system\n      istiod:\n        enabled: true\n      jwtPolicy: third-party-jwt\n      k8sIngress:\n        enableHttps: false\n        enabled: false\n        gatewayName: ingressgateway\n      localityLbSetting:\n        enabled: true\n      logAsJson: false\n      logging:\n        level: default:info\n      meshExpansion:\n        enabled: false\n        useILB: false\n      meshNetworks: {}\n      mountMtlsCerts: false\n      mtls:\n        auto: true\n        enabled: false\n      multiCluster:\n        clusterName: \"\"\n        enabled: false\n      network: \"\"\n      omitSidecarInjectorConfigMap: false\n      oneNamespace: false\n      operatorManageWebhooks: false\n      outboundTrafficPolicy:\n        mode: ALLOW_ANY\n      pilotCertProvider: istiod\n      policyCheckFailOpen: false\n      priorityClassName: \"\"\n      proxy:\n        accessLogEncoding: TEXT\n        accessLogFile: \"/dev/stdout\"\n        accessLogFormat: \"\"\n        autoInject: enabled\n        clusterDomain: cluster.local\n        componentLogLevel: misc:error\n        concurrency: 2\n        dnsRefreshRate: 300s\n        enableCoreDump: false\n        envoyAccessLogService:\n          enabled: false\n        envoyMetricsService:\n          enabled: false\n          tcpKeepalive:\n            interval: 10s\n            probes: 3\n            time: 10s\n          tlsSettings:\n            mode: DISABLE\n            subjectAltNames: []\n        envoyStatsd:\n          enabled: false\n        excludeIPRanges: \"\"\n        excludeInboundPorts: \"\"\n        excludeOutboundPorts: \"\"\n        image: proxyv2\n        includeIPRanges: '*'\n        includeInboundPorts: '*'\n        kubevirtInterfaces: \"\"\n        logLevel: warning\n        privileged: false\n        protocolDetectionTimeout: 100ms\n        readinessFailureThreshold: 30\n        readinessInitialDelaySeconds: 1\n        readinessPeriodSeconds: 2\n        resources:\n          limits:\n            cpu: 2000m\n            memory: 1024Mi\n          requests:\n            cpu: 100m\n            memory: 128Mi\n        statusPort: 15020\n        tracer: zipkin\n      proxy_init:\n        image: proxyv2\n        resources:\n          limits:\n            cpu: 100m\n            memory: 50Mi\n          requests:\n            cpu: 10m\n            memory: 10Mi\n      sds:\n        enabled: false\n        token:\n          aud: istio-ca\n        udsPath: \"\"\n      sts:\n        servicePort: 0\n      tracer:\n        datadog:\n          address: $(HOST_IP):8126\n        lightstep:\n          accessToken: \"\"\n          address: \"\"\n          cacertPath: \"\"\n          secure: true\n        stackdriver:\n          debug: false\n          maxNumberOfAnnotations: 200\n          maxNumberOfAttributes: 200\n          maxNumberOfMessageEvents: 200\n        zipkin:\n          address: \"\"\n      trustDomain: cluster.local\n      useMCP: false\n    grafana:\n      accessMode: ReadWriteMany\n      contextPath: /grafana\n      dashboardProviders:\n        dashboardproviders.yaml:\n          apiVersion: 1\n          providers:\n          - disableDeletion: false\n            folder: istio\n            name: istio\n            options:\n              path: /var/lib/grafana/dashboards/istio\n            orgId: 1\n            type: file\n      datasources:\n        datasources.yaml:\n          apiVersion: 1\n      env: {}\n      envSecrets: {}\n      image:\n        repository: grafana/grafana\n        tag: 6.5.2\n      ingress:\n        enabled: false\n        hosts:\n        - grafana.local\n      nodeSelector: {}\n      persist: false\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      security:\n        enabled: false\n        passphraseKey: passphrase\n        secretName: grafana\n        usernameKey: username\n      service:\n        annotations: {}\n        externalPort: 3000\n        name: http\n        type: ClusterIP\n      storageClassName: \"\"\n      tolerations: []\n    istiocoredns:\n      coreDNSImage: coredns/coredns\n      coreDNSPluginImage: istio/coredns-plugin:0.2-istio-1.1\n      coreDNSTag: 1.6.2\n    kiali:\n      contextPath: /kiali\n      createDemoSecret: true\n      dashboard:\n        grafanaInClusterURL: http://grafana:3000\n        jaegerInClusterURL: http://tracing/jaeger\n        passphraseKey: passphrase\n        secretName: kiali\n        usernameKey: username\n        viewOnlyMode: false\n      hub: quay.io/kiali\n      ingress:\n        enabled: false\n        hosts:\n        - kiali.local\n      nodeSelector: {}\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      security:\n        cert_file: /kiali-cert/cert-chain.pem\n        enabled: false\n        private_key_file: /kiali-cert/key.pem\n      tag: v1.14\n    mixer:\n      adapters:\n        kubernetesenv:\n          enabled: true\n        prometheus:\n          enabled: true\n          metricsExpiryDuration: 10m\n        stackdriver:\n          auth:\n            apiKey: \"\"\n            appCredentials: false\n            serviceAccountPath: \"\"\n          enabled: false\n          tracer:\n            enabled: false\n            sampleProbability: 1\n        stdio:\n          enabled: false\n          outputAsJson: false\n        useAdapterCRDs: false\n      policy:\n        adapters:\n          kubernetesenv:\n            enabled: true\n          useAdapterCRDs: false\n        autoscaleEnabled: true\n        image: mixer\n        sessionAffinityEnabled: false\n      telemetry:\n        autoscaleEnabled: true\n        env:\n          GOMAXPROCS: \"6\"\n        image: mixer\n        loadshedding:\n          latencyThreshold: 100ms\n          mode: enforce\n        nodeSelector: {}\n        podAntiAffinityLabelSelector: []\n        podAntiAffinityTermLabelSelector: []\n        replicaCount: 1\n        reportBatchMaxEntries: 100\n        reportBatchMaxTime: 1s\n        sessionAffinityEnabled: false\n        tolerations: []\n    nodeagent:\n      image: node-agent-k8s\n    pilot:\n      appNamespaces: []\n      autoscaleEnabled: true\n      autoscaleMax: 5\n      autoscaleMin: 1\n      configMap: true\n      configNamespace: istio-config\n      cpu:\n        targetAverageUtilization: 80\n      enableProtocolSniffingForInbound: false\n      enableProtocolSniffingForOutbound: true\n      env: {}\n      image: pilot\n      ingress:\n        ingressClass: istio\n        ingressControllerMode: STRICT\n        ingressService: istio-ingressgateway\n      keepaliveMaxServerConnectionAge: 30m\n      meshNetworks:\n        networks: {}\n      nodeSelector: {}\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      policy:\n        enabled: false\n      replicaCount: 1\n      tolerations: []\n      traceSampling: 1\n    prometheus:\n      contextPath: /prometheus\n      hub: docker.io/prom\n      ingress:\n        enabled: false\n        hosts:\n        - prometheus.local\n      nodeSelector: {}\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      provisionPrometheusCert: true\n      retention: 6h\n      scrapeInterval: 15s\n      security:\n        enabled: true\n      tag: v2.15.1\n      tolerations: []\n    security:\n      dnsCerts:\n        istio-pilot-service-account.istio-control: istio-pilot.istio-control\n      enableNamespacesByDefault: true\n      image: citadel\n      selfSigned: true\n    sidecarInjectorWebhook:\n      enableNamespacesByDefault: false\n      image: sidecar_injector\n      injectLabel: istio-injection\n      objectSelector:\n        autoInject: true\n        enabled: false\n      rewriteAppHTTPProbe: false\n      selfSigned: false\n    telemetry:\n      enabled: true\n      v1:\n        enabled: false\n      v2:\n        enabled: true\n        prometheus:\n          enabled: true\n        stackdriver:\n          configOverride: {}\n          enabled: true\n          logging: true\n          monitoring: true\n          topology: true\n    tracing:\n      ingress:\n        enabled: false\n      jaeger:\n        accessMode: ReadWriteMany\n        hub: docker.io/jaegertracing\n        memory:\n          max_traces: 50000\n        persist: false\n        spanStorageType: badger\n        storageClassName: \"\"\n        tag: \"1.16\"\n      nodeSelector: {}\n      opencensus:\n        exporters:\n          stackdriver:\n            enable_tracing: true\n        hub: docker.io/omnition\n        resources:\n          limits:\n            cpu: \"1\"\n            memory: 2Gi\n          requests:\n            cpu: 200m\n            memory: 400Mi\n        tag: 0.1.9\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      provider: jaeger\n      service:\n        annotations: {}\n        externalPort: 9411\n        name: http-query\n        type: ClusterIP\n      zipkin:\n        hub: docker.io/openzipkin\n        javaOptsHeap: 700\n        maxSpans: 500000\n        node:\n          cpus: 2\n        probeStartupDelay: 200\n        queryPort: 9411\n        resources:\n          limits:\n            cpu: 300m\n            memory: 900Mi\n          requests:\n            cpu: 150m\n            memory: 900Mi\n        tag: 2.14.2\n    version: \"\"\n\n"
  },
  {
    "path": "internal-load-balancer/manifests/server-ilb.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_internal_load_balancer_manifests_gateway_hello_ilb_gateway]\napiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n  name: hello-ilb-gateway\nspec:\n  selector:\n    istio: ilbgateway\n  servers:\n  - hosts:\n    - '*'\n    port:\n      name: http\n      number: 80\n      protocol: HTTP\n# [END istio_internal_load_balancer_manifests_gateway_hello_ilb_gateway]\n---\n# [START istio_internal_load_balancer_manifests_virtualservice_hellosvc_vs]\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: hellosvc-vs\nspec:\n  gateways:\n  - hello-ilb-gateway\n  hosts:\n  - '*'\n  http:\n  - route:\n    - destination:\n        host: hellosvc\n        port:\n          number: 80\n# [END istio_internal_load_balancer_manifests_virtualservice_hellosvc_vs]\n---\n"
  },
  {
    "path": "istio-canary-gke/README.md",
    "content": "# ProductCatalog Canary Deployment (GKE / Istio)\n\nThis demo accompanies [a GCP Blog Post](https://cloud.google.com/blog/products/networking/advanced-application-deployments-and-traffic-management-with-istio-on-gke) on managing application deployments with Istio and\nStackdriver.\n\n## Introduction\n\nIn this example, we will learn how to use [Istio’s](https://istio.io/) [Traffic Splitting](https://istio.io/docs/concepts/traffic-management/#splitting-traffic-between-versions) feature to perform a Canary deployment on [Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine/).\n\nIn this sample, `productcatalogservice-v2` introduces a 3-second\n[latency](https://github.com/GoogleCloudPlatform/microservices-demo/tree/master/src/productcatalogservice#latency-injection) into all server requests. We’ll show how to use Stackdriver and Istio together to\nview the latency difference between the existing `productcatalog` deployment and the\nslower v2 deployment.\n\n  - [Setup](#setup)\n  - [Deploy the Sample App](#deploy-the-sample-app)\n  - [Deploy ProductCatalog v2](#deploy-productcatalog-v2)\n  - [Observe Latency with Stackdriver](#observe-latency-with-stackdriver)\n  - [Rollback](#rollback)\n  - [Cleanup](#cleanup)\n  - [Learn More](#learn-more)\n\n## Setup\n\n[Google Cloud Shell](https://cloud.google.com/shell/docs/) is a browser-based terminal that Google provides to interact with your GCP resources. It is backed by a free Compute Engine instance that comes with many useful tools already installed, including everything required to run this demo.\n\nClick the button below to open the demo instructions in your Cloud Shell:\n\n[![Open in Cloud Shell](http://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https%3A%2F%2Fgithub.com%2FGoogleCloudPlatform%2Fistio-samples&page=editor&tutorial=istio-canary-gke/README.md)\n\n\n## Create a GKE Cluster\n\n1. From Cloud Shell, enable the Kubernetes Engine API.\n\n```\ngcloud services enable container.googleapis.com\n```\n\n2. Create a GKE cluster:\n\n```\ngcloud beta container clusters create istio-canary \\\n    --zone=us-central1-f \\\n    --machine-type=n1-standard-2 \\\n    --num-nodes=4\n```\n\n3. Change into the Istio install directory from the root of this repository.\n```\ncd common/\n```\n\n4. Install Istio on the cluster:\n\n```\n./install_istio.sh\n```\n\n5. Once the cluster is ready, ensure that Istio is running:\n\n```\n$ kubectl get pods -n istio-system\n\nNAME                                   READY   STATUS    RESTARTS   AGE\ngrafana-556b649566-fw67z               1/1     Running   0          5m24s\nistio-ingressgateway-fc6c9d9df-nmndg   1/1     Running   0          5m30s\nistio-tracing-7cf5f46848-qksxq         1/1     Running   0          5m24s\nistiod-7b5d6db6b6-b457p                1/1     Running   0          5m48s\nkiali-b4b5b4fb8-hwm42                  1/1     Running   0          5m23s\nprometheus-558b665bb7-5v647            2/2     Running   0          5m23s\n```\n\n## Deploy the Sample App\n\n1. Deploy the [microservices-demo](https://github.com/GoogleCloudPlatform/microservices-demo) application, and add a `version=v1` label to the `productcatalog` deployment\n\n```\nkubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/master/release/kubernetes-manifests.yaml\nkubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/master/release/istio-manifests.yaml\nkubectl delete serviceentry allow-egress-google-metadata\nkubectl delete serviceentry allow-egress-googleapis\nkubectl patch deployments/productcatalogservice -p '{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"version\":\"v1\"}}}}}'\n```\n\n2. Using `kubectl get pods`, verify that all pods are `Running` and `Ready`.\n\nAt this point, ProductCatalog v1 is deployed to the cluster, along with the rest of the\ndemo microservices. You can reach the Hipstershop frontend at the `EXTERNAL_IP` address\noutput for this command:\n\n```\nkubectl get svc -n istio-system istio-ingressgateway\n```\n\n## Deploy ProductCatalog v2\n\n1. `cd` into the example directory.\n\n```\ncd istio-canary-gke/\n```\n\n2. Create an Istio [DestinationRule](https://istio.io/docs/reference/config/istio.networking.v1alpha3/#DestinationRule) for `productcatalogservice`.\n\n```\nkubectl apply -f canary/destinationrule.yaml\n```\n\n3. Deploy `productcatalog` v2.\n```\nkubectl apply -f canary/productcatalog-v2.yaml\n```\n\n4. Using `kubectl get pods`, verify that the `v2` pod is Running.\n```\nproductcatalogservice-v2-79459dfdff-6qdh4   2/2       Running   0          1m\n```\n\n5. Create an Istio [VirtualService](https://istio.io/docs/reference/config/istio.networking.v1alpha3/#VirtualService) to split incoming `productcatalog` traffic between v1 (75%) and v2 (25%).\n```\nkubectl apply -f canary/vs-split-traffic.yaml\n```\n\n6. In a web browser, navigate again to the hipstershop frontend.\n7. Refresh the homepage a few times. You should notice that periodically, the frontend is\n   slower to load. Let's explore ProductCatalog's latency with Stackdriver.\n\n\n## View traffic splitting in Kiali\n\n1. Open the Kiali dashboard.\n\n```\nistioctl dashboard kiali &\n```\n\n2. Navigate to Service Graph > namespace: `default`\n\n3. Select \"Versioned App Graph.\"\n4. In the service graph, zoom in on `productcatalogservice`. You should see that approximately 25% of productcatalog requests are going to `v2`.\n\n![kiali](screenshots/kiali.png)\n\n## Observe Latency with Stackdriver\n\n1. Navigate to [Stackdriver Monitoring](https://app.google.stackdriver.com).\n2. Create a Stackdriver Workspace for your GCP project\n   ([instructions](https://cloud.google.com/monitoring/workspaces/guide#single-project-ws)).\n3. From your new Stackdriver Workspace, navigate to **Resources > Metrics Explorer.** in the\n   left sidebar.\n\n![stackdriver sidebar](screenshots/stackdriver-sidebar.png)\n\n\n4. From Metrics Explorer, enter the following parameters on the left side of the window:\n\t- **Resource type**: Kubernetes Container\n\t- **Metric**: Server Response Latencies (`istio.io/service/server/response_latencies`)\n\t- **Group by**: `destination_workload_name`\n\t- **Aggregator**: 50th percentile\n\n5. In the menubar of the chart on the right, choose the **Line** type.\n6. Once the latency chart renders, you should see `productcatalog-v2` as an outlier, with\n    mean latencies hovering at 3 seconds. This is the value of `EXTRA_LATENCY` we injected into v2.\n\n![metrics explorer](screenshots/metrics-explorer.png)\n\nYou’ll also notice that other services (such as `frontend`) have an irregular latency spike. This is because the [frontend relies on](https://github.com/GoogleCloudPlatform/microservices-demo#service-architecture) ProductCatalog, for which 25% of requests are routing through the slower `v2` deployment.\n\n![v2 latency](screenshots/v2-latency.png)\n\n## Rollback\n\n1. Return 100% of `productcatalog` traffic to `v1`:\n```\nkubectl apply -f canary/rollback.yaml\n```\n2. Finally, remove `v2`:\n```\nkubectl delete -f canary/productcatalog-v2.yaml\n```\n\n## Cleanup\n\nTo avoid incurring additional billing costs, delete the GKE cluster.\n\n```\ngcloud container clusters delete istio-canary --zone us-central1-f\n```\n\n## Learn More\n\n- [Incremental Istio Part 1, Traffic\n  Management](https://istio.io/blog/2018/incremental-traffic-management/) (Istio blog)\n- [Canary Deployments using Istio](https://istio.io/blog/2017/0.1-canary/)  (Istio blog)\n- [Drilling down into Stackdriver Service\n  Monitoring](https://cloud.google.com/blog/products/gcp/drilling-down-into-stackdriver-service-monitoring)\n  (GCP blog)\n"
  },
  {
    "path": "istio-canary-gke/canary/destinationrule.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_istio_canary_gke_canary_destinationrule_productcatalogservice]\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: productcatalogservice\nspec:\n  host: productcatalogservice\n  subsets:\n  - labels:\n      version: v1\n    name: v1\n  - labels:\n      version: v2\n    name: v2\n# [END istio_istio_canary_gke_canary_destinationrule_productcatalogservice]\n---\n"
  },
  {
    "path": "istio-canary-gke/canary/productcatalog-v2.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_istio_canary_gke_canary_deployment_productcatalogservice_v2]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: productcatalogservice-v2\nspec:\n  selector:\n    matchLabels:\n      app: productcatalogservice\n  template:\n    metadata:\n      labels:\n        app: productcatalogservice\n        version: v2\n    spec:\n      containers:\n      - env:\n        - name: PORT\n          value: '3550'\n        - name: EXTRA_LATENCY\n          value: 3s\n        image: gcr.io/google-samples/microservices-demo/productcatalogservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:3550\n        name: server\n        ports:\n        - containerPort: 3550\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:3550\n        resources:\n          limits:\n            cpu: 200m\n            memory: 128Mi\n          requests:\n            cpu: 100m\n            memory: 64Mi\n      terminationGracePeriodSeconds: 5\n# [END istio_istio_canary_gke_canary_deployment_productcatalogservice_v2]\n---\n"
  },
  {
    "path": "istio-canary-gke/canary/rollback.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_istio_canary_gke_canary_virtualservice_productcatalogservice]\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: productcatalogservice\nspec:\n  hosts:\n  - productcatalogservice\n  http:\n  - route:\n    - destination:\n        host: productcatalogservice\n        subset: v1\n# [END istio_istio_canary_gke_canary_virtualservice_productcatalogservice]\n---\n"
  },
  {
    "path": "istio-canary-gke/canary/vs-split-traffic.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_istio_canary_gke_canary_virtualservice_productcatalogservice2]\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: productcatalogservice\nspec:\n  hosts:\n  - productcatalogservice\n  http:\n  - route:\n    - destination:\n        host: productcatalogservice\n        subset: v1\n      weight: 75\n    - destination:\n        host: productcatalogservice\n        subset: v2\n      weight: 25\n# [END istio_istio_canary_gke_canary_virtualservice_productcatalogservice2]\n---\n"
  },
  {
    "path": "istio-stackdriver/README.md",
    "content": "# Istio and Stackdriver\n\nThis example demonstrates the ways you can use [Stackdriver](https://cloud.google.com/stackdriver/) to gain insights into and debug microservices deployments running on GKE with [Istio's telemetry support](https://istio.io/docs/concepts/policies-and-telemetry/).\n\nWe'll deploy the Hipstershop sample application along with an updated service that introduces a 3-second latency into all requests. Then we'll create Stackdriver Monitoring dashboards to dig into key metrics like cluster and service health. Next, we'll use Stackdriver Trace to identify high latency requests. Finally, we'll dig into service output using Stackdriver Logging.\n\n### Contents\n- [Istio and Stackdriver](#istio-and-stackdriver)\n    - [Contents](#contents)\n  - [Setup](#setup)\n    - [Create a GKE cluster](#create-a-gke-cluster)\n    - [Deploy the sample application](#deploy-the-sample-application)\n    - [Deploy a high latency service](#deploy-a-high-latency-service)\n  - [Monitoring](#monitoring)\n    - [Create a monitoring dashboard](#create-a-monitoring-dashboard)\n    - [Examine service and cluster health](#examine-service-and-cluster-health)\n  - [Tracing](#tracing)\n    - [Review trace output](#review-trace-output)\n    - [Identify high latency requests](#identify-high-latency-requests)\n  - [Logging](#logging)\n    - [Examine service logs](#examine-service-logs)\n  - [Cleanup](#cleanup)\n  - [Learn more](#learn-more)\n\n## Setup\n1. Clone the repo and change into the demo directory.\n\n```\ngit clone https://github.com/GoogleCloudPlatform/istio-samples\ncd istio-samples/common\n```\n\n### Create a GKE cluster\n\n1. From Cloud Shell, **enable the Kubernetes Engine API**.\n\n```\ngcloud services enable container.googleapis.com\n```\n\n2. **Create a GKE cluster** using [Istio on GKE](https://cloud.google.com/istio/docs/istio-on-gke/overview). This add-on will provision your GKE cluster with Istio.\n\n```\ngcloud beta container clusters create istio-stackdriver-demo \\\n    --zone=us-central1-f \\\n    --machine-type=n1-standard-2 \\\n    --num-nodes=4\n```\n\n3. **Install Istio** on the cluster.\n\n```\n./install_istio.sh\n```\n\n4. Wait for all Istio pods to be `Running` or `Completed`.\n```\nkubectl get pods -n istio-system\n```\n\n*Note*: This Istio installation uses the default `PERMISSIVE` [mesh-wide security\noption](https://istio.io/docs/reference/config/installation-options/#global-options).\nThis means that all services in the cluster will send unencrypted traffic by default.\n\n### Deploy the sample application\n\n1. Apply the sample app manifests to the cluster:\n\n```\nkubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/master/release/kubernetes-manifests.yaml\nkubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/master/release/istio-manifests.yaml\nkubectl patch deployments/productcatalogservice -p '{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"version\":\"v1\"}}}}}'\n```\n\n2. Run `kubectl get pods -n default` to ensure that all pods are `Running` and `Ready`.\n\n```\nNAME                                     READY     STATUS    RESTARTS   AGE\nadservice-76b5c7bd6b-zsqb8               2/2       Running   0          1m\ncheckoutservice-86f5c7679c-8ghs8         2/2       Running   0          1m\ncurrencyservice-5749fd7c6d-lv6hj         2/2       Running   0          1m\nemailservice-6674bf75c5-qtnd8            2/2       Running   0          1m\nfrontend-56fdfb866c-tvdm6                2/2       Running   0          1m\nloadgenerator-b64fcb8bc-m6nd2            2/2       Running   0          1m\npaymentservice-67c6696c54-tgnc5          2/2       Running   0          1m\nproductcatalogservice-76c6454c57-9zj2v   2/2       Running   0          1m\nrecommendationservice-78c7676bfb-xqtp6   2/2       Running   0          1m\nshippingservice-7bc4bc75bb-kzfrb         2/2       Running   0          1m\n```\n\n*Note*: Each pod has 2 containers, because each pod now has the injected Istio sidecar proxy.\n\n### Deploy a high latency service\n\n1. Create an Istio [DestinationRule](https://istio.io/docs/reference/config/istio.networking.v1alpha3/#DestinationRule) for `productcatalogservice`.\n\n```\ncd ../istio-canary-gke/\nkubectl apply -f canary/destinationrule.yaml\n```\n\n2. Deploy `productcatalogservice` v2 which introduces a 3-second latency into all server requests.\n```\nkubectl apply -f canary/productcatalog-v2.yaml\n```\n\n3. Using `kubectl get pods`, verify that the `v2` pod is Running.\n```\nproductcatalogservice-v2-79459dfdff-6qdh4   2/2       Running   0          1m\n```\n\n4. Create an Istio VirtualService to split incoming `productcatalogservice` traffic between v1 (75%) and v2 (25%).\n```\nkubectl apply -f canary/vs-split-traffic.yaml\n```\n\n## Monitoring\n\nNow that we've deployed Hipstershop, along with an updated service that introduces higher latency to server requests, let's dig into how we can surface that latency via monitoring. Hipstershop includes a built-in load generator that issues requests across a number of services so after a few minutes you should start to see traffic hitting the deplyoment. The following steps will show you how to create a basic dashboard that let's you monitor some metrics for service and cluster health.\n\n### Create a monitoring dashboard\n\n1. Head over to [Stackdriver Monitoring](https://app.google.stackdriver.com/) and [create a Stackdriver Workspace](https://cloud.google.com/monitoring/workspaces/guide#single-project-ws).\n\n2. Navigate to **Dashboards > Create Dashboard** in the left sidebar.\n\n3. In the new Dashboard, click **Add Chart** and the following metric:\n\n* **Metric**: Server Response Latencies (`istio.io/service/server/response_latencies`)\n* **Group By**: `destination_workload_name`\n* **Aligner**: 50th percentile\n* **Reducer**: mean\n* **Alignment Period**: 1 minute\n* **Type**: Line\n\n4. Click **Save Chart** in the upper right corner and repeat the process by adding new charts for each of the following metrics:\n\n**Client Roundtrip Latencies**\n* **Metric**: Client Roundtrip Latencies (`istio.io/service/client/roundtrip_latencies`)\n* **Group By**: `destination_workload_name`\n* **Aligner**: 50th percentile\n* **Reducer**: mean\n* **Alignment Period**: 1 minute\n* **Type**: Line\n\n**CPU Utilization**\n* **Metric**: CPU Utilization (`compute.googleapis.com/instance/cpu/utilization`)\n* **Resource Type**: GCE VM Instance\n* **Filter**: `goog-gke-node` = \"\"\n* **Aligner**: mean\n* **Reducer**: none\n* **Alignment Period**: 1 minute\n* **Type**: Line\n\n**Memory Usage**\n* **Metric**: Memory Usage (`kubernetes.io/node/memory/used_bytes`)\n* **Group By**: `node_name`\n* **Aligner**: mean\n* **Reducer**: mean\n* **Alignment Period**: 1 minute\n* **Type**: Line\n\n5. After the metrics have been added, you will have a Dashboard that looks similar to the following:\n\n![stackdriver-dashboard](screenshots/stackdriver-dashboard.png)\n\n### Examine service and cluster health\n\n1. Now that you have a functioning Dashboard and some load has been generated, take a look at **Server Response Latencies** and **Client Roundtrip Latencies** charts. You will see there are some clear outliers, specifically the `productcatalog` service. You will also see other related services (such as `frontend`) also have latency spikes. This is because the [frontend relies on](https://github.com/GoogleCloudPlatform/microservices-demo#service-architecture) ProductCatalog, for which 25% of requests are routing through the slower `v2` deployment.\n\n![v2 latency](screenshots/v2-latency.png)\n\nAlso take a look at the **CPU Utilization** and **Memory Usage** charts and you'll notice that there are no significant outliers there. As expected, the issue isn't with the GKE cluster itself, it's due to the fact that we specifically deployed a service that introduced a 3-second per request latency.\n\n## Tracing\n\nNow that the high latency service (`productcatalogservice`) has been identified, we can use [Stackdriver Trace](https://cloud.google.com/trace/) to dig in and examine the latency impact it's having across the entire deployment.\n\n### Review trace output\n\n1. Open [Stackdriver Trace](https://console.cloud.google.com/traces) and you will see the tracing overview.\n\nThe left side of the **Overview** contains\n* **Recent traces** captured\n* **Most frequent URIs** requested\n* **Most frequent RPCs** called\n\nAnd on the right you'll see automated analysis reports. These reports are generated by the system and correspond to some of the recent and/or high frequency requests/calls.\n\n![trace overview](screenshots/trace-overview.png)\n\n2. From the left navigation, head over to the **Trace List** and you'll see a chart of all requests plotted against latency along with a table of the most recent 1000 traces.\n\n![trace list](screenshots/trace-list.png)\n\n### Identify high latency requests\n\n1. From the **Trace List** chat, select a high latency outlier and you'll see a **Timeline** and **Summary** appear below.\n\n![trace selected](screenshots/trace-selected.png)\n\n2. The timeline shows an initial request and the subsequent requests it generated. In the example below, you can see that requesting the URL `/product/L9ECAV7KIM` took about 12.1s, primarily due to the subsequent requests to the `productcatalogservice` (which has an extra 3s of latency added to each request).\n\n![trace timeline](screenshots/trace-timeline.png)\n\n3. The **Summary** table to the right aggregates all of the outbound RPC requests and their total duration, along with additional metadata about the initial request itself.\n\n![trace summary](screenshots/trace-summary.png)\n\n## Logging\n\nAt this point, we've been able to\n- Identify a high latency service `productcatalogservice` using Stackdriver Monitoring\n- Examine the impact that service is having by digging through request traces using Stackdriver Trace\n\nThe final step is to look at the logs generated by our services to see if there's any additional debug information we can capture. Using [Stackdriver Logging](https://cloud.google.com/logging/) we can examine individual service logs from our deployment.\n\n### Examine service logs\n\n1. Open [Stackdriver Logging](https://console.cloud.google.com/logs/viewer) and you'll see the logs viewer.\n\n![logs viewer](screenshots/logs-viewer.png)\n\n2. Using the **Filter** field and controls, you can select which logs you want to view. In the example below we used the following filter:\n- **Resource**: Kubernetes Container\n- **Cluster Name**: istio-stackdriver-demo\n- **Namespace**: default\n- **Container Name**: server\n\n![logs filter](screenshots/logs-filter.png)\n\n*Note*: In our example, we manually injected the latency into `productcatalogservice-v2` so these example logs won't be of much help.\n\n## Cleanup\n\nOnce you're all done, delete the GKE cluster:\n```\ngcloud container clusters delete istio-stackdriver-demo\n```\n\n## Learn more\n\n- [Istio Policies and Telemetry](https://istio.io/docs/concepts/policies-and-telemetry/)\n- [Istio In-Depth Telemetry](https://istio.io/docs/examples/telemetry/)\n- [Drilling down into Stackdriver Service Monitoring](https://cloud.google.com/blog/products/gcp/drilling-down-into-stackdriver-service-monitoring) (GCP blog)"
  },
  {
    "path": "mesh-expansion-gce/README.md",
    "content": "# Demo: Integrating a Google Compute Engine VM with Istio\n\nThis demo shows how to connect a Google Compute Engine virtual machine to an Istio service\nmesh running in Google Kubernetes Engine.\n\nThis example is relevant if you're running an application outside\nof Kubernetes, but still want to enjoy the full benefits of Istio for that service.\n\nWe will use the [Hipstershop](https://github.com/GoogleCloudPlatform/microservices-demo) sample app for this demo, with the following topology:\n\n![screenshot](screenshots/topology.png)\n\nHere, the `productcatalog` service will be our \"monolith\" running in a VM outside of\nKubernetes. For demonstration purposes, we'll run productcatalog in a raw Docker container\ninside the VM, then integrate it with the rest of the in-mesh services running in GKE.\n\n## Prerequisites\n\n- A GCP project with billing enabled\n- gcloud\n- kubectl\n\n\n## GCP Setup\n\nFor this demo, the GCE VM and the GKE cluster will live in the same GCP project. Set an\nenvironment variable for your project ID.\n\n\n```\nexport PROJECT_ID=<your-project-id>\n```\n\n## Create a GKE Cluster\n\nCreate a 4-node GKE cluster named `mesh-exp-gke`:\n\n```\n./scripts/1-create-cluster.sh\n```\n\nWait for the GKE cluster to be `RUNNING` -\n\n```\ngcloud container clusters list\n```\n\nConnect to the cluster:\n\n```\ngcloud container clusters get-credentials mesh-exp-gke --zone us-central1-b --project $PROJECT_ID\n```\n\n\n## Create a GCE Instance\n\nThis script will create a Ubuntu GCE instance in your GCP Project. The VM is named `istio-gce`.\n\n```\n./scripts/2-create-vm.sh\n```\n\n## Install Istio on the cluster\n\n```\n./scripts/3-install-istio.sh\n```\n\n\n## Deploy the rest of the sample application to GKE\n\nThis step deploys all the services expect `productcatalog` to the GKE cluster, in the Istio-injected `default` namespace.\n\n```\n./scripts/4-deploy-hipstershop.sh\n```\n\n## Prepare the cluster for the VM.\n\n```\n./scripts/5-prep-cluster.sh\n```\n\nThis step generates a cluster.env file containing the Istio service CIDR (pod IP ranges for your cluster) and the inbound ports - since productcatalog will listen on grpc port `3550` on the VM, we specify port `3550` for the VM proxy to intercept.\n\nThis step also creates client certificate files that we'll send to the VM. In the end, your `cluster.env` file should look like this:\n\n```\nISTIO_SERVICE_CIDR=10.87.0.0/20\n\nISTIO_INBOUND_PORTS=3550,8080\n```\n\n## Set up the VM for Istio.\n\n```\n./scripts/6-prep-vm.sh\n```\n\nThis script does the following:\n- Sends the certs and `cluster.env` file we just created to the VM, via `scp`\n- Logs into the VM via `ssh`\n- From the VM, installs the Istio sidecar proxy and updates `/etc/hosts` so that the VM can reach istiod running on the GKE cluster\n- Installs Docker\n- Runs the `productcatalogservice` on the VM, as a plain Docker container\n\n## Add productcatalog to the mesh\n\n```\n./scripts/7-add-to-mesh.sh\n```\n\nThis step uses the `istioctl add-to-mesh` command to generate a ServiceEntry and headless Service corresponding to the VM `productcatalogservice`. This allows the frontend running as a GKE pod to resolve the `productcatalogservice` DNS to the GCE VM, via Istio.\n\n## Start the Istio proxy on the VM\n\n```\n./scripts/8-start-vm-istio.sh\n```\n\n## View the service topology\n\n```\nalias istioctl=\"../common/istio-1.5.2/bin/istioctl\"\nistioctl dashboard kiali &\n```\n\nOpen Service Graph > click the \"default\" namespace. You should see traffic moving to the `meshexpansion-productcatalogservice` ServiceEntry, corresponding to the VM.\n\n![screenshots/kiali.png](screenshots/kiali.png)\n\n## Open the frontend in a browser\n\nGet the external IP address of the Istio ingressgateway. Navigate to that IP address in a web browser.\n\n```\nkubectl get svc -n istio-system istio-ingressgateway | awk '{print $4}'\n```\n\nYou should see the sample app frontend with a list of products, fetched from `productcatalog` running on the VM.\n\n![screenshots/onlineboutique.png](screenshots/onlineboutique.png)\n\n## Clean up\n\nTo delete the resources used in this sample:\n\n```\ngcloud compute firewall-rules delete k8s-to-istio-gce\ngcloud compute instances --project $PROJECT_ID delete --zone \"us-central1-b\" \"istio-gce\"\ngcloud container clusters delete mesh-exp-gke --zone us-central1-b --async\n```\n\n## Learn more\n\nLearn about each step of the VM install in the [Istio documentation](https://istio.io/docs/examples/virtual-machines/single-network/#preparing-the-kubernetes-cluster-for-vms).\n\nLearn [how to set up a proxy-injected VM in another network](https://istio.io/docs/examples/virtual-machines/multi-network/)."
  },
  {
    "path": "mesh-expansion-gce/scripts/1-create-cluster.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nlog() { echo \"$1\" >&2; }\n\n# set vars\nPROJECT_ID=\"${PROJECT_ID:?PROJECT_ID env variable must be specified}\"\nZONE=\"us-central1-b\"\nCLUSTER_NAME=\"mesh-exp-gke\"\nCTX=\"gke_${PROJECT_ID}_${ZONE}_${CLUSTER_NAME}\"\n\n# Create GKE Cluster\ngcloud config set project $PROJECT_ID\n\n gcloud container clusters create $CLUSTER_NAME --zone $ZONE --username \"admin\" \\\n   --machine-type \"n1-standard-2\" \\\n   --num-nodes \"4\" --network \"default\" --enable-stackdriver-kubernetes --enable-ip-alias --async\n"
  },
  {
    "path": "mesh-expansion-gce/scripts/2-create-vm.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nlog() { echo \"$1\" >&2; }\n\n# set vars\nPROJECT_ID=\"${PROJECT_ID:?PROJECT_ID env variable must be specified}\"\ngcloud config set project $PROJECT_ID\nZONE=\"us-central1-b\"\nCLUSTER_NAME=\"mesh-exp-gke\"\nCTX=\"gke_${PROJECT_ID}_${ZONE}_${CLUSTER_NAME}\"\n\nGCE_INSTANCE_NAME=\"istio-gce\"\n\n# allow traffic from K8s cluster to VM service\nexport K8S_POD_CIDR=$(gcloud container clusters describe ${CLUSTER_NAME?} --zone ${ZONE?} --format=json | jq -r '.clusterIpv4Cidr')\n\ngcloud compute firewall-rules create k8s-to-istio-gce \\\n--description=\"Allow k8s pods CIDR to istio-gce instance\" \\\n--source-ranges=$K8S_POD_CIDR \\\n--target-tags=${GCE_INSTANCE_NAME} \\\n--action=ALLOW \\\n--rules=tcp:3550\n\n# Create GCE VM\ngcloud config set project $PROJECT_ID\n\ngcloud compute --project=$PROJECT_ID instances create $GCE_INSTANCE_NAME --zone=$ZONE \\\n--machine-type=n1-standard-2 --subnet=default --network-tier=PREMIUM --maintenance-policy=MIGRATE \\\n--image=ubuntu-1604-xenial-v20190628 --image-project=ubuntu-os-cloud --boot-disk-size=10GB \\\n--boot-disk-type=pd-standard --boot-disk-device-name=$GCE_INSTANCE_NAME --tags=${GCE_INSTANCE_NAME}\n\n"
  },
  {
    "path": "mesh-expansion-gce/scripts/3-install-istio.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nlog() { echo \"$1\" >&2; }\n\nPROJECT_ID=\"${PROJECT_ID:?PROJECT_ID env variable must be specified}\"\nZONE=\"us-central1-b\"\nCLUSTER_NAME=\"mesh-exp-gke\"\nCTX=\"gke_${PROJECT_ID}_${ZONE}_${CLUSTER_NAME}\"\n\n# configure cluster context\ngcloud config set project $PROJECT_ID\ngcloud container clusters get-credentials $CLUSTER_NAME --zone $ZONE\nkubectl config use-context $CTX\n\n\ncd ../common/\nINSTALL_YAML=\"../mesh-expansion-gce/scripts/install.yaml\" ./install_istio.sh\ncd ../mesh-expansion-gce"
  },
  {
    "path": "mesh-expansion-gce/scripts/4-deploy-hipstershop.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nlog() { echo \"$1\" >&2; }\n\nPROJECT_ID=\"${PROJECT_ID:?PROJECT_ID env variable must be specified}\"\nZONE=\"us-central1-b\"\nCLUSTER_NAME=\"mesh-exp-gke\"\nCTX=\"gke_${PROJECT_ID}_${ZONE}_${CLUSTER_NAME}\"\n\n# configure cluster context\ngcloud config set project $PROJECT_ID\ngcloud container clusters get-credentials $CLUSTER_NAME --zone $ZONE\nkubectl config use-context $CTX\n\n# deploy sample app to GKE\nkubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/master/release/kubernetes-manifests.yaml\nkubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/master/release/istio-manifests.yaml\n\n# remove the cluster-based productcatalog - we'll deploy this on the VM\nkubectl delete svc productcatalogservice; kubectl delete deployment productcatalogservice\nkubectl delete serviceentry allow-egress-google-metadata\nkubectl delete serviceentry allow-egress-googleapis"
  },
  {
    "path": "mesh-expansion-gce/scripts/5-prep-cluster.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nlog() { echo \"$1\" >&2; }\n\n# set vars\nPROJECT_ID=\"${PROJECT_ID:?PROJECT_ID env variable must be specified}\"\nZONE=\"us-central1-b\"\nCLUSTER_NAME=\"mesh-exp-gke\"\nCTX=\"gke_${PROJECT_ID}_${ZONE}_${CLUSTER_NAME}\"\nGCE_INSTANCE_NAME=\"istio-gce\"\nSERVICE_NAMESPACE=\"default\"\n\n# Generate cluster.env\nexport ISTIOD_IP=$(kubectl get -n istio-system service istiod -o jsonpath='{.spec.clusterIP}')\nlog \"⛵️ istiod IP is $ISTIOD_IP\"\n\nISTIO_SERVICE_CIDR=$(gcloud container clusters describe $CLUSTER_NAME --zone $ZONE --project $PROJECT_ID --format \"value(servicesIpv4Cidr)\")\necho -e \"ISTIO_SERVICE_CIDR=$ISTIO_SERVICE_CIDR\\n\" > cluster.env\necho \"ISTIO_INBOUND_PORTS=3550,8080\" >> cluster.env\n\n# client certs\nlog \"Getting client certs...\"\ngo run istio.io/istio/security/tools/generate_cert -client -host spiffee://cluster.local/vm/vmname \\\n --out-priv key.pem --out-cert cert-chain.pem  -mode self-signed\n\n# root cert\nlog \"Getting root cert...\"\nkubectl -n istio-system get cm istio-ca-root-cert -o jsonpath='{.data.root-cert\\.pem}' > root-cert.pem\n"
  },
  {
    "path": "mesh-expansion-gce/scripts/6-prep-vm.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nlog() { echo \"$1\" >&2; }\n\n# set vars\nPROJECT_ID=\"${PROJECT_ID:?PROJECT_ID env variable must be specified}\"\nZONE=\"us-central1-b\"\nCLUSTER_NAME=\"mesh-exp-gke\"\nCTX=\"gke_${PROJECT_ID}_${ZONE}_${CLUSTER_NAME}\"\nGCE_NAME=\"istio-gce\"\nSERVICE_NAMESPACE=\"default\"\n\n# send certs and cluster.env to VM\ngcloud compute scp --project=${PROJECT_ID} --zone=${ZONE} \\\n {key.pem,cert-chain.pem,cluster.env,root-cert.pem,scripts/vm-install-istio.sh,scripts/vm-run-products.sh} ${GCE_NAME}:\n\n# from the VM, install the Istio sidecar proxy and update /etc/hosts to reach istiod\nexport ISTIOD_IP=$(kubectl get -n istio-system service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\nlog \"⛵️ GWIP is is $ISTIOD_IP\"\n\ngcloud compute --project $PROJECT_ID ssh --zone ${ZONE} ${GCE_NAME} --command=\"ISTIOD_IP=${ISTIOD_IP} ./vm-install-istio.sh\"\n\n# from the VM, install Docker and run productcatalog as a docker container\ngcloud compute --project $PROJECT_ID ssh --zone ${ZONE} ${GCE_NAME} --command=\"./vm-run-products.sh\"\n"
  },
  {
    "path": "mesh-expansion-gce/scripts/7-add-to-mesh.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nlog() { echo \"$1\" >&2; }\nZONE=\"us-central1-b\"\nGCE_NAME=\"istio-gce\"\n\nexport GCE_IP=$(gcloud --format=\"value(networkInterfaces[0].networkIP)\" compute instances describe ${GCE_NAME} --zone ${ZONE})\nlog \"GCE IP is ${GCE_IP}\"\n../common/istio-1.5.2/bin/istioctl experimental add-to-mesh external-service productcatalogservice ${GCE_IP} grpc:3550 -n default\nlog \"✅ added productcatalog to the mesh.\""
  },
  {
    "path": "mesh-expansion-gce/scripts/8-start-vm-istio.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nlog() { echo \"$1\" >&2; }\n\nPROJECT_ID=\"${PROJECT_ID:?PROJECT_ID env variable must be specified}\"\nZONE=\"us-central1-b\"\nGCE_NAME=\"istio-gce\"\n\n# re-kick Istio on the VM\nlog \"Restarting istio on the VM...\"\ngcloud compute --project $PROJECT_ID ssh --zone ${ZONE} ${GCE_NAME} --command=\"sudo systemctl stop istio; sudo systemctl start istio;\"\nlog \"Done.\""
  },
  {
    "path": "mesh-expansion-gce/scripts/install.yaml",
    "content": "apiVersion: install.istio.io/v1alpha1\nkind: IstioOperator\nspec:\n  addonComponents:\n    grafana:\n      enabled: true\n      k8s:\n        replicaCount: 1\n    istiocoredns:\n      enabled: false\n    kiali:\n      enabled: true\n      k8s:\n        replicaCount: 1\n    prometheus:\n      enabled: true\n      k8s:\n        replicaCount: 1\n    tracing:\n      enabled: true\n  components:\n    base:\n      enabled: true\n    citadel:\n      enabled: false\n      k8s:\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    cni:\n      enabled: false\n    egressGateways:\n    - enabled: false\n      k8s:\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-ingressgateway\n        resources:\n          limits:\n            cpu: 2000m\n            memory: 1024Mi\n          requests:\n            cpu: 100m\n            memory: 128Mi\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n      name: istio-egressgateway\n    galley:\n      enabled: false\n      k8s:\n        replicaCount: 1\n        resources:\n          requests:\n            cpu: 100m\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    ingressGateways:\n    - enabled: true\n      k8s:\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-ingressgateway\n        resources:\n          limits:\n            cpu: 2000m\n            memory: 1024Mi\n          requests:\n            cpu: 100m\n            memory: 128Mi\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n      name: istio-ingressgateway\n    nodeAgent:\n      enabled: false\n    pilot:\n      enabled: true\n      k8s:\n        env:\n        - name: POD_NAME\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.name\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        readinessProbe:\n          httpGet:\n            path: /ready\n            port: 8080\n          initialDelaySeconds: 5\n          periodSeconds: 5\n          timeoutSeconds: 5\n        resources:\n          requests:\n            cpu: 500m\n            memory: 2048Mi\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    policy:\n      enabled: false\n      k8s:\n        env:\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-policy\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    sidecarInjector:\n      enabled: false\n      k8s:\n        replicaCount: 1\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    telemetry:\n      enabled: false\n      k8s:\n        env:\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        - name: GOMAXPROCS\n          value: \"6\"\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-telemetry\n        replicaCount: 1\n        resources:\n          limits:\n            cpu: 4800m\n            memory: 4G\n          requests:\n            cpu: 1000m\n            memory: 1G\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n  hub: docker.io/istio\n  tag: 1.5.1\n  values:\n    clusterResources: true\n    galley:\n      enableAnalysis: false\n      image: galley\n    gateways:\n      istio-egressgateway:\n        autoscaleEnabled: true\n        env:\n          ISTIO_META_ROUTER_MODE: sni-dnat\n        ports:\n        - name: http2\n          port: 80\n        - name: https\n          port: 443\n        - name: tls\n          port: 15443\n          targetPort: 15443\n        secretVolumes:\n        - mountPath: /etc/istio/egressgateway-certs\n          name: egressgateway-certs\n          secretName: istio-egressgateway-certs\n        - mountPath: /etc/istio/egressgateway-ca-certs\n          name: egressgateway-ca-certs\n          secretName: istio-egressgateway-ca-certs\n        type: ClusterIP\n      istio-ingressgateway:\n        applicationPorts: \"\"\n        autoscaleEnabled: true\n        debug: info\n        domain: \"\"\n        env:\n          ISTIO_META_ROUTER_MODE: sni-dnat\n        meshExpansionPorts:\n        - name: tcp-pilot-grpc-tls\n          port: 15011\n          targetPort: 15011\n        - name: tcp-citadel-grpc-tls\n          port: 8060\n          targetPort: 8060\n        - name: tcp-dns-tls\n          port: 853\n          targetPort: 853\n        ports:\n        - name: status-port\n          port: 15020\n          targetPort: 15020\n        - name: http2\n          port: 80\n          targetPort: 80\n        - name: https\n          port: 443\n        - name: kiali\n          port: 15029\n          targetPort: 15029\n        - name: prometheus\n          port: 15030\n          targetPort: 15030\n        - name: grafana\n          port: 15031\n          targetPort: 15031\n        - name: tracing\n          port: 15032\n          targetPort: 15032\n        - name: tls\n          port: 15443\n          targetPort: 15443\n        sds:\n          enabled: false\n          image: node-agent-k8s\n          resources:\n            limits:\n              cpu: 2000m\n              memory: 1024Mi\n            requests:\n              cpu: 100m\n              memory: 128Mi\n        secretVolumes:\n        - mountPath: /etc/istio/ingressgateway-certs\n          name: ingressgateway-certs\n          secretName: istio-ingressgateway-certs\n        - mountPath: /etc/istio/ingressgateway-ca-certs\n          name: ingressgateway-ca-certs\n          secretName: istio-ingressgateway-ca-certs\n        type: LoadBalancer\n        zvpn:\n          enabled: false\n          suffix: global\n    global:\n      arch:\n        amd64: 2\n        ppc64le: 2\n        s390x: 2\n      certificates: []\n      configValidation: true\n      controlPlaneSecurityEnabled: true\n      defaultNodeSelector: {}\n      defaultPodDisruptionBudget:\n        enabled: true\n      defaultResources:\n        requests:\n          cpu: 10m\n      disablePolicyChecks: true\n      enableHelmTest: false\n      enableTracing: true\n      imagePullPolicy: IfNotPresent\n      imagePullSecrets: []\n      istioNamespace: istio-system\n      istiod:\n        enabled: true\n      jwtPolicy: third-party-jwt\n      k8sIngress:\n        enableHttps: false\n        enabled: false\n        gatewayName: ingressgateway\n      localityLbSetting:\n        enabled: true\n      logAsJson: false\n      logging:\n        level: default:info\n      meshExpansion:\n        enabled: true\n        useILB: false\n      meshNetworks: {}\n      mountMtlsCerts: false\n      mtls:\n        auto: true\n        enabled: false\n      multiCluster:\n        clusterName: \"\"\n        enabled: false\n      network: \"\"\n      omitSidecarInjectorConfigMap: false\n      oneNamespace: false\n      operatorManageWebhooks: false\n      outboundTrafficPolicy:\n        mode: ALLOW_ANY\n      pilotCertProvider: istiod\n      policyCheckFailOpen: false\n      priorityClassName: \"\"\n      proxy:\n        accessLogEncoding: TEXT\n        accessLogFile: \"/dev/stdout\"\n        accessLogFormat: \"\"\n        autoInject: enabled\n        clusterDomain: cluster.local\n        componentLogLevel: misc:error\n        concurrency: 2\n        dnsRefreshRate: 300s\n        enableCoreDump: false\n        envoyAccessLogService:\n          enabled: false\n        envoyMetricsService:\n          enabled: false\n          tcpKeepalive:\n            interval: 10s\n            probes: 3\n            time: 10s\n          tlsSettings:\n            mode: DISABLE\n            subjectAltNames: []\n        envoyStatsd:\n          enabled: false\n        excludeIPRanges: \"\"\n        excludeInboundPorts: \"\"\n        excludeOutboundPorts: \"\"\n        image: proxyv2\n        includeIPRanges: '*'\n        includeInboundPorts: '*'\n        kubevirtInterfaces: \"\"\n        logLevel: warning\n        privileged: false\n        protocolDetectionTimeout: 100ms\n        readinessFailureThreshold: 30\n        readinessInitialDelaySeconds: 1\n        readinessPeriodSeconds: 2\n        resources:\n          limits:\n            cpu: 2000m\n            memory: 1024Mi\n          requests:\n            cpu: 100m\n            memory: 128Mi\n        statusPort: 15020\n        tracer: zipkin\n      proxy_init:\n        image: proxyv2\n        resources:\n          limits:\n            cpu: 100m\n            memory: 50Mi\n          requests:\n            cpu: 10m\n            memory: 10Mi\n      sds:\n        enabled: false\n        token:\n          aud: istio-ca\n        udsPath: \"\"\n      sts:\n        servicePort: 0\n      tracer:\n        datadog:\n          address: $(HOST_IP):8126\n        lightstep:\n          accessToken: \"\"\n          address: \"\"\n          cacertPath: \"\"\n          secure: true\n        stackdriver:\n          debug: false\n          maxNumberOfAnnotations: 200\n          maxNumberOfAttributes: 200\n          maxNumberOfMessageEvents: 200\n        zipkin:\n          address: \"\"\n      trustDomain: cluster.local\n      useMCP: false\n    grafana:\n      accessMode: ReadWriteMany\n      contextPath: /grafana\n      dashboardProviders:\n        dashboardproviders.yaml:\n          apiVersion: 1\n          providers:\n          - disableDeletion: false\n            folder: istio\n            name: istio\n            options:\n              path: /var/lib/grafana/dashboards/istio\n            orgId: 1\n            type: file\n      datasources:\n        datasources.yaml:\n          apiVersion: 1\n      env: {}\n      envSecrets: {}\n      image:\n        repository: grafana/grafana\n        tag: 6.5.2\n      ingress:\n        enabled: false\n        hosts:\n        - grafana.local\n      nodeSelector: {}\n      persist: false\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      security:\n        enabled: false\n        passphraseKey: passphrase\n        secretName: grafana\n        usernameKey: username\n      service:\n        annotations: {}\n        externalPort: 3000\n        name: http\n        type: ClusterIP\n      storageClassName: \"\"\n      tolerations: []\n    istiocoredns:\n      coreDNSImage: coredns/coredns\n      coreDNSPluginImage: istio/coredns-plugin:0.2-istio-1.1\n      coreDNSTag: 1.6.2\n    kiali:\n      contextPath: /kiali\n      createDemoSecret: true\n      dashboard:\n        grafanaInClusterURL: http://grafana:3000\n        jaegerInClusterURL: http://tracing/jaeger\n        passphraseKey: passphrase\n        secretName: kiali\n        usernameKey: username\n        viewOnlyMode: false\n      hub: quay.io/kiali\n      ingress:\n        enabled: false\n        hosts:\n        - kiali.local\n      nodeSelector: {}\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      security:\n        cert_file: /kiali-cert/cert-chain.pem\n        enabled: false\n        private_key_file: /kiali-cert/key.pem\n      tag: v1.14\n    mixer:\n      adapters:\n        kubernetesenv:\n          enabled: true\n        prometheus:\n          enabled: true\n          metricsExpiryDuration: 10m\n        stackdriver:\n          auth:\n            apiKey: \"\"\n            appCredentials: false\n            serviceAccountPath: \"\"\n          enabled: false\n          tracer:\n            enabled: false\n            sampleProbability: 1\n        stdio:\n          enabled: false\n          outputAsJson: false\n        useAdapterCRDs: false\n      policy:\n        adapters:\n          kubernetesenv:\n            enabled: true\n          useAdapterCRDs: false\n        autoscaleEnabled: true\n        image: mixer\n        sessionAffinityEnabled: false\n      telemetry:\n        autoscaleEnabled: true\n        env:\n          GOMAXPROCS: \"6\"\n        image: mixer\n        loadshedding:\n          latencyThreshold: 100ms\n          mode: enforce\n        nodeSelector: {}\n        podAntiAffinityLabelSelector: []\n        podAntiAffinityTermLabelSelector: []\n        replicaCount: 1\n        reportBatchMaxEntries: 100\n        reportBatchMaxTime: 1s\n        sessionAffinityEnabled: false\n        tolerations: []\n    nodeagent:\n      image: node-agent-k8s\n    pilot:\n      appNamespaces: []\n      autoscaleEnabled: true\n      autoscaleMax: 5\n      autoscaleMin: 1\n      configMap: true\n      configNamespace: istio-config\n      cpu:\n        targetAverageUtilization: 80\n      enableProtocolSniffingForInbound: false\n      enableProtocolSniffingForOutbound: true\n      env: {}\n      image: pilot\n      ingress:\n        ingressClass: istio\n        ingressControllerMode: STRICT\n        ingressService: istio-ingressgateway\n      keepaliveMaxServerConnectionAge: 30m\n      meshNetworks:\n        networks: {}\n      nodeSelector: {}\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      policy:\n        enabled: false\n      replicaCount: 1\n      tolerations: []\n      traceSampling: 1\n    prometheus:\n      contextPath: /prometheus\n      hub: docker.io/prom\n      ingress:\n        enabled: false\n        hosts:\n        - prometheus.local\n      nodeSelector: {}\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      provisionPrometheusCert: true\n      retention: 6h\n      scrapeInterval: 15s\n      security:\n        enabled: true\n      tag: v2.15.1\n      tolerations: []\n    security:\n      dnsCerts:\n        istio-pilot-service-account.istio-control: istio-pilot.istio-control\n      enableNamespacesByDefault: true\n      image: citadel\n      selfSigned: true\n    sidecarInjectorWebhook:\n      enableNamespacesByDefault: false\n      image: sidecar_injector\n      injectLabel: istio-injection\n      objectSelector:\n        autoInject: true\n        enabled: false\n      rewriteAppHTTPProbe: false\n      selfSigned: false\n    telemetry:\n      enabled: true\n      v1:\n        enabled: false\n      v2:\n        enabled: true\n        prometheus:\n          enabled: true\n        stackdriver:\n          configOverride: {}\n          enabled: true\n          logging: true\n          monitoring: true\n          topology: true\n    tracing:\n      ingress:\n        enabled: false\n      jaeger:\n        accessMode: ReadWriteMany\n        hub: docker.io/jaegertracing\n        memory:\n          max_traces: 50000\n        persist: false\n        spanStorageType: badger\n        storageClassName: \"\"\n        tag: \"1.16\"\n      nodeSelector: {}\n      opencensus:\n        exporters:\n          stackdriver:\n            enable_tracing: true\n        hub: docker.io/omnition\n        resources:\n          limits:\n            cpu: \"1\"\n            memory: 2Gi\n          requests:\n            cpu: 200m\n            memory: 400Mi\n        tag: 0.1.9\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      provider: jaeger\n      service:\n        annotations: {}\n        externalPort: 9411\n        name: http-query\n        type: ClusterIP\n      zipkin:\n        hub: docker.io/openzipkin\n        javaOptsHeap: 700\n        maxSpans: 500000\n        node:\n          cpus: 2\n        probeStartupDelay: 200\n        queryPort: 9411\n        resources:\n          limits:\n            cpu: 300m\n            memory: 900Mi\n          requests:\n            cpu: 150m\n            memory: 900Mi\n        tag: 2.14.2\n    version: \"\"\n\n"
  },
  {
    "path": "mesh-expansion-gce/scripts/vm-install-istio.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\n# install the sidecar proxy\ncurl -L https://storage.googleapis.com/istio-release/releases/1.5.1/deb/istio-sidecar.deb > istio-sidecar.deb\nsudo dpkg -i istio-sidecar.deb\n\n# update /etc/hosts\necho \"${ISTIOD_IP} istiod.istio-system.svc\" | sudo tee -a /etc/hosts\n\n# install certs\nsudo mkdir -p /etc/certs\nsudo cp {root-cert.pem,cert-chain.pem,key.pem} /etc/certs\nsudo mkdir -p /var/run/secrets/istio/\nsudo cp root-cert.pem /var/run/secrets/istio/\n\n# install cluster.env\nsudo cp cluster.env /var/lib/istio/envoy\n\n# transfer file ownership to istio proxy\nsudo chown -R istio-proxy /etc/certs /var/lib/istio/envoy /var/run/secrets/istio/\n\n# start Istio\nsudo systemctl start istio"
  },
  {
    "path": "mesh-expansion-gce/scripts/vm-run-products.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# install docker\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -\nsudo add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\";\nsudo apt-get update;\nsudo apt-get install -y docker-ce;\n\n# run productcatalog\nsudo docker run -d -p 3550:3550 gcr.io/google-samples/microservices-demo/productcatalogservice:v0.3.4\n\n"
  },
  {
    "path": "multicluster-gke/dual-control-plane/README.md",
    "content": "# Demo: Multicluster Istio - Gateway-Connected Clusters\n\nThis example shows how to orchestrate an application with [Istio](https://istio.io/) across two different\nGoogle Kubernetes Engine clusters. To do this, we will unite two different Istio service meshes into\none logical, hybrid mesh.\n\n![dual-screenshot](screenshots/topology.png)\n\nThis example is relevant if you run microservices on two different cloud platforms, or are\nusing a combination of on-prem and cloud Kubernetes. For demonstration purposes here, we'll use two GKE clusters in two different projects, and thus two\ndifferent [virtual networks](https://cloud.google.com/kubernetes-engine/docs/concepts/network-overview#inside-cluster).\n\n## How it works\n\nThis demo uses Istio 1.4's [Gateway-Connected Clusters](https://preliminary.istio.io/docs/concepts/multicluster-deployments/#multiple-control-plane-topology) feature. This is a specific mode of\nmulticluster Istio where two separate Kubernetes clusters run their own Istio control\nplane, and orchestrate their own mesh. But each Istio control plane also runs a CoreDNS\nserver, which allows services in both clusters to refer to services in the other cluster,\nas if they were part of their own mesh. A service in cluster 1 can call a\ncluster 2 service with a DNS name of the format `svc-name.cluster-2-namespace.global`.\nThe Kubernetes DNS server and Istio's CoreDNS know how to work together to resolve that\n`global` DNS suffix.\n\n\n## Prerequisites\n\n- Two GCP projects with billing and the Kubernetes API enabled\n- `gcloud` CLI\n- `kubectl`\n- `helm` CLI\n\n\n## Set Project Variables\n\n```\nexport PROJECT_1=<your-project1>\n\nexport PROJECT_2=<your-second-project>\n```\n\n## Create Two GKE Clusters\n\n```\n./scripts/1-create-gke-clusters.sh\n```\n\nThen, run:\n\n```\nwatch -n 1 gcloud container clusters list\n```\n\nAnd wait for both clusters to be `RUNNING`.\n\n## Install Istio on Both Clusters\n\n```\n./scripts/2-install-istio.sh\n```\n\nWait for all Istio pods to be `RUNNING` -\n\n```\nNAME                                    READY   STATUS    RESTARTS\n AGE\ngrafana-556b649566-4fwb9                1/1     Running   0\n 2m28s\nistio-egressgateway-79ffd95b56-zf2vg    1/1     Running   0\n 8m18s\nistio-ingressgateway-6df84b84d4-dp9rw   1/1     Running   0\n 8m17s\nistio-tracing-7cf5f46848-pzmf7          1/1     Running   0\n 2m28s\nistiocoredns-5f7546c6f4-gjl2x           2/2     Running   0\n 8m17s\nistiod-8465c8f9d9-pxb6v                 1/1     Running   0\n 8m38s\nkiali-6d54b8ccbc-9qhc9                  1/1     Running   0\n 2m28s\nprometheus-75f89f4df8-gd5mn             2/2     Running   0\n 8m16s\n```\n\n## Configure KubeDNS to talk to Istio's CoreDNS\n\nYou'll notice `istiocoredns` in the list of pods. This DNS server which will handle DNS resolution across\ncluster boundaries.\n\nThe next step configures the Kubernetes server (kubedns) to with a\nDNS\n[stub domain](https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/#configure-stub-domain-and-upstream-dns-servers)\nto talk to this auxiliary Istio CoreDNS server.\nA StubDomain is a forwarding rule for DNS addresses with a certain prefix.\n\nRun the script to configure the stub domain on both GKE clusters:\n\n```\n./scripts/3-configure-dns.sh\n```\n\n\n## Deploy the Sample App\n\nWe will now deploy [Online Boutique, a sample application](https://github.com/GoogleCloudPlatform/microservices-demo), across our two GKE clusters.\n\nFor demonstration purposes, we've split the microservices into two halves. One group\nwill run on Cluster 1 (namespace `hipster1`):\n\n- emailservice\n- checkoutservice\n- paymentservice\n- currencyservice\n- shippingservice\n- adservice\n\nAnd another group will run on Cluster 2 (namespace\n`hipster2`):\n\n- frontend\n- productcatalogservice\n- recommendationservice\n- cartservice (configured to use a local store, not Redis)\n\n\nVisually, we will deploy this topology:\n\n![dual-screenshot](screenshots/topology.png)\n\nThe following script creates the following resources on both GKE clusters:\n- Kubernetes Deployments for the services assigned to this cluster\n- Kubernetes Services for the services that *are* running local to this cluster\n- ServiceEntries (type `MESH_INTERNAL`) for all the services *not* running on this cluster. **Note**: for each\n  of these external ServiceEntries, the script injects the Istio `IngressGateway` IP for the\n  opposite cluster. This is how CoreDNS will be able to resolve `global` to an actual\n  external Istio IP.\n- ServiceEntries (type `MESH_EXTERNAL`) to access external Google APIs (necessary for\n  Online Boutique to run)\n- Istio VirtualServices / Gateway (for cluster 2 / the frontend only)\n\nRun the script to deploy these resources across both clusters:\n\n```\n./scripts/4-deploy-online-boutique.sh\n```\n\n\n## Verify successful deployment\n\n1. Get pods in cluster 1 (namespace `hipster1`) to make sure all are `RUNNING` -\n\n```\nNAME                               READY   STATUS    RESTARTS   AGE\nadservice-84449b8756-4nhpm         2/2     Running   0          3m29s\ncheckoutservice-8dfb487c6-rwh9n    2/2     Running   0          3m30s\ncurrencyservice-b9fcb4c98-98q7x    2/2     Running   0          3m29s\nemailservice-57f9ddf9b9-hmpv7      2/2     Running   0          3m30s\npaymentservice-84d7bf956-8f9br     2/2     Running   0          3m29s\nshippingservice-78dc8784d4-7h4zx   2/2     Running   0          3m29s\n```\n\n2. Get pods in cluster 2 (namespace `hipster2`) to make sure all are `RUNNING` -\n\n```\nNAME                                     READY   STATUS    RESTARTS\n  AGE\ncartservice-5b88d44bd-t6s6c              2/2     Running   0\n2m31s\nfrontend-7958cf4f9-r2b9m                 2/2     Running   0\n  2m32s\nproductcatalogservice-c796f4c6d-qgfp8    2/2     Running   0\n  2m32s\nrecommendationservice-6788b77796-z4xq8   2/2     Running   0\n  2m31s\n```\n\n3. Get the Ingress Gateway `EXTERNAL_IP` in `cluster2`, where the web `frontend` is deployed:\n\n```\nkubectl config use-context gke_${PROJECT_2}_us-central1-b_dual-cluster2\nkubectl get svc -n istio-system istio-ingressgateway\n```\n\nNavigate to that address in a browser.\n\n![](screenshots/frontend.png)\n\n4. View the service graph.\n\nFrom `cluster2`, open the Kiali service graph dashboard.\n\n```\n../../common/istio-1.5.2/bin/istioctl dashboard kiali &\n```\n\nLog in as `admin/admin`. Navigate to Graph > Service Graph > namespace: `default`. You should see traffic moving from the `frontend` on cluster2, to services running in both cluster2 (eg. `productcatalogservice`) and in cluster1 (eg. `adservice`). Note that in-cluster traffic within cluster1 is not visible in cluster2's Kiali dashboard.\n\n![](screenshots/kiali-cluster2.png)\n\nCongrats! you just deployed Multicluster Istio across\ntwo separate networks, then ran an application that spanned two Kubernetes\nenvironments! All part of a single, two-headed Service Mesh. 🎉\n\n\n## Clean up\n\nDelete the 2 GKE clusters:\n\n```\n./scripts/cleanup-delete-clusters.sh\n```\n\n## Further reading\n\n- To learn about Multicluster Istio and its different modes, [see the Istio docs](https://istio.io/docs/concepts/multicluster-deployments/)\n- To learn how to configure and install the different modes, see the [Setup](https://istio.io/docs/setup/install/multicluster/) section in the Istio docs.\n"
  },
  {
    "path": "multicluster-gke/dual-control-plane/cluster1/deployments.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n# [START istio_dual_control_plane_cluster1_deployment_emailservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: emailservice\nspec:\n  selector:\n    matchLabels:\n      app: emailservice\n  template:\n    metadata:\n      labels:\n        app: emailservice\n    spec:\n      containers:\n      - image: gcr.io/google-samples/microservices-demo/emailservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:8080\n          periodSeconds: 5\n        name: server\n        ports:\n        - containerPort: 8080\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:8080\n          periodSeconds: 5\n        resources:\n          limits:\n            cpu: 200m\n            memory: 128Mi\n          requests:\n            cpu: 100m\n            memory: 64Mi\n      terminationGracePeriodSeconds: 5\n# [END istio_dual_control_plane_cluster1_deployment_emailservice]\n---\n# [START istio_dual_control_plane_cluster1_deployment_checkoutservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: checkoutservice\nspec:\n  selector:\n    matchLabels:\n      app: checkoutservice\n  template:\n    metadata:\n      labels:\n        app: checkoutservice\n    spec:\n      containers:\n      - env:\n        - name: PRODUCT_CATALOG_SERVICE_ADDR\n          value: productcatalogservice.default.global:3550\n        - name: SHIPPING_SERVICE_ADDR\n          value: shippingservice.default.svc.cluster.local:50051\n        - name: PAYMENT_SERVICE_ADDR\n          value: paymentservice.default.svc.cluster.local:50051\n        - name: EMAIL_SERVICE_ADDR\n          value: emailservice.default.svc.cluster.local:5000\n        - name: CURRENCY_SERVICE_ADDR\n          value: currencyservice.default.svc.cluster.local:7000\n        - name: CART_SERVICE_ADDR\n          value: cartservice.default.global:7070\n        image: gcr.io/google-samples/microservices-demo/checkoutservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:5050\n        name: server\n        ports:\n        - containerPort: 5050\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:5050\n        resources:\n          limits:\n            cpu: 200m\n            memory: 128Mi\n          requests:\n            cpu: 100m\n            memory: 64Mi\n# [END istio_dual_control_plane_cluster1_deployment_checkoutservice]\n---\n# [START istio_dual_control_plane_cluster1_deployment_paymentservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: paymentservice\nspec:\n  selector:\n    matchLabels:\n      app: paymentservice\n  template:\n    metadata:\n      labels:\n        app: paymentservice\n    spec:\n      containers:\n      - env:\n        - name: PORT\n          value: '50051'\n        image: gcr.io/google-samples/microservices-demo/paymentservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:50051\n        name: server\n        ports:\n        - containerPort: 50051\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:50051\n        resources:\n          limits:\n            cpu: 200m\n            memory: 128Mi\n          requests:\n            cpu: 100m\n            memory: 64Mi\n      terminationGracePeriodSeconds: 5\n# [END istio_dual_control_plane_cluster1_deployment_paymentservice]\n---\n# [START istio_dual_control_plane_cluster1_deployment_currencyservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: currencyservice\nspec:\n  selector:\n    matchLabels:\n      app: currencyservice\n  template:\n    metadata:\n      labels:\n        app: currencyservice\n    spec:\n      containers:\n      - env:\n        - name: PORT\n          value: '7000'\n        image: gcr.io/google-samples/microservices-demo/currencyservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:7000\n        name: server\n        ports:\n        - containerPort: 7000\n          name: grpc\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:7000\n        resources:\n          limits:\n            cpu: 200m\n            memory: 128Mi\n          requests:\n            cpu: 100m\n            memory: 64Mi\n      terminationGracePeriodSeconds: 5\n# [END istio_dual_control_plane_cluster1_deployment_currencyservice]\n---\n# [START istio_dual_control_plane_cluster1_deployment_shippingservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: shippingservice\nspec:\n  selector:\n    matchLabels:\n      app: shippingservice\n  template:\n    metadata:\n      labels:\n        app: shippingservice\n    spec:\n      containers:\n      - image: gcr.io/google-samples/microservices-demo/shippingservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:50051\n        name: server\n        ports:\n        - containerPort: 50051\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:50051\n          periodSeconds: 5\n        resources:\n          limits:\n            cpu: 200m\n            memory: 128Mi\n          requests:\n            cpu: 100m\n            memory: 64Mi\n# [END istio_dual_control_plane_cluster1_deployment_shippingservice]\n---\n# [START istio_dual_control_plane_cluster1_deployment_adservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: adservice\nspec:\n  selector:\n    matchLabels:\n      app: adservice\n  template:\n    metadata:\n      labels:\n        app: adservice\n    spec:\n      containers:\n      - env:\n        - name: PORT\n          value: '9555'\n        image: gcr.io/google-samples/microservices-demo/adservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:9555\n          initialDelaySeconds: 20\n          periodSeconds: 15\n        name: server\n        ports:\n        - containerPort: 9555\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:9555\n          initialDelaySeconds: 20\n          periodSeconds: 15\n        resources:\n          limits:\n            cpu: 300m\n            memory: 300Mi\n          requests:\n            cpu: 200m\n            memory: 180Mi\n      terminationGracePeriodSeconds: 5\n# [END istio_dual_control_plane_cluster1_deployment_adservice]\n---\n"
  },
  {
    "path": "multicluster-gke/dual-control-plane/cluster1/istio-defaults.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_dual_control_plane_cluster1_serviceentry_currency_provider_external]\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: currency-provider-external\nspec:\n  hosts:\n  - www.ecb.europa.eu\n  ports:\n  - name: http\n    number: 80\n    protocol: HTTP\n  - name: https\n    number: 443\n    protocol: HTTPS\n# [END istio_dual_control_plane_cluster1_serviceentry_currency_provider_external]"
  },
  {
    "path": "multicluster-gke/dual-control-plane/cluster1/service-entries.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_dual_control_plane_cluster1_serviceentry_frontendservice_entry]\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: frontendservice-entry\nspec:\n  addresses:\n  - 240.0.0.5\n  endpoints:\n  - address: 35.193.92.27\n    ports:\n      http1: 15443\n  hosts:\n  - frontend.default.global\n  location: MESH_INTERNAL\n  ports:\n  - name: http1\n    number: 80\n    protocol: http\n  resolution: DNS\n# [END istio_dual_control_plane_cluster1_serviceentry_frontendservice_entry]\n---\n# [START istio_dual_control_plane_cluster1_serviceentry_productcatalogservice_entry]\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: productcatalogservice-entry\nspec:\n  addresses:\n  - 240.0.0.6\n  endpoints:\n  - address: 35.193.92.27\n    ports:\n      grpc: 15443\n  hosts:\n  - productcatalogservice.default.global\n  location: MESH_INTERNAL\n  ports:\n  - name: grpc\n    number: 3550\n    protocol: GRPC\n  resolution: DNS\n# [END istio_dual_control_plane_cluster1_serviceentry_productcatalogservice_entry]\n---\n# [START istio_dual_control_plane_cluster1_serviceentry_cartservice_entry]\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: cartservice-entry\nspec:\n  addresses:\n  - 240.0.0.7\n  endpoints:\n  - address: 35.193.92.27\n    ports:\n      grpc: 15443\n  hosts:\n  - cartservice.default.global\n  location: MESH_INTERNAL\n  ports:\n  - name: grpc\n    number: 7070\n    protocol: GRPC\n  resolution: DNS\n# [END istio_dual_control_plane_cluster1_serviceentry_cartservice_entry]\n---\n"
  },
  {
    "path": "multicluster-gke/dual-control-plane/cluster1/services-local.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_dual_control_plane_cluster1_service_emailservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: emailservice\nspec:\n  ports:\n  - name: grpc\n    port: 5000\n    targetPort: 8080\n  selector:\n    app: emailservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster1_service_emailservice]\n---\n# [START istio_dual_control_plane_cluster1_service_checkoutservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: checkoutservice\nspec:\n  ports:\n  - name: grpc\n    port: 5050\n    targetPort: 5050\n  selector:\n    app: checkoutservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster1_service_checkoutservice]\n---\n# [START istio_dual_control_plane_cluster1_service_paymentservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: paymentservice\nspec:\n  ports:\n  - name: grpc\n    port: 50051\n    targetPort: 50051\n  selector:\n    app: paymentservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster1_service_paymentservice]\n---\n# [START istio_dual_control_plane_cluster1_service_currencyservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: currencyservice\nspec:\n  ports:\n  - name: grpc\n    port: 7000\n    targetPort: 7000\n  selector:\n    app: currencyservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster1_service_currencyservice]\n---\n# [START istio_dual_control_plane_cluster1_service_shippingservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: shippingservice\nspec:\n  ports:\n  - name: grpc\n    port: 50051\n    targetPort: 50051\n  selector:\n    app: shippingservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster1_service_shippingservice]\n---\n# [START istio_dual_control_plane_cluster1_service_adservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: adservice\nspec:\n  ports:\n  - name: grpc\n    port: 9555\n    targetPort: 9555\n  selector:\n    app: adservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster1_service_adservice]\n---\n"
  },
  {
    "path": "multicluster-gke/dual-control-plane/cluster2/deployments.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: loadgenerator\nspec:\n  selector:\n    matchLabels:\n      app: loadgenerator\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: loadgenerator\n      annotations:\n        sidecar.istio.io/rewriteAppHTTPProbers: \"true\"\n    spec:\n      terminationGracePeriodSeconds: 5\n      restartPolicy: Always\n      containers:\n      - name: main\n        image: gcr.io/google-samples/microservices-demo/loadgenerator:v0.3.4\n        env:\n        - name: FRONTEND_ADDR\n          value: \"frontend:80\"\n        - name: USERS\n          value: \"10\"\n        resources:\n          requests:\n            cpu: 300m\n            memory: 256Mi\n          limits:\n            cpu: 500m\n            memory: 512Mi\n---\n# [START istio_dual_control_plane_cluster2_deployment_frontend]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: frontend\nspec:\n  selector:\n    matchLabels:\n      app: frontend\n  template:\n    metadata:\n      labels:\n        app: frontend\n    spec:\n      containers:\n      - env:\n        - name: PRODUCT_CATALOG_SERVICE_ADDR\n          value: productcatalogservice.default.svc.cluster.local:3550\n        - name: CURRENCY_SERVICE_ADDR\n          value: currencyservice.default.global:7000\n        - name: CART_SERVICE_ADDR\n          value: cartservice.default.svc.cluster.local:7070\n        - name: RECOMMENDATION_SERVICE_ADDR\n          value: recommendationservice.default.svc.cluster.local:8080\n        - name: SHIPPING_SERVICE_ADDR\n          value: shippingservice.default.global:50051\n        - name: CHECKOUT_SERVICE_ADDR\n          value: checkoutservice.default.global:5050\n        - name: AD_SERVICE_ADDR\n          value: adservice.default.global:9555\n        image: gcr.io/google-samples/microservices-demo/frontend:v0.3.4\n        livenessProbe:\n          httpGet:\n            httpHeaders:\n            - name: Cookie\n              value: shop_session-id=x-liveness-probe\n            path: /_healthz\n            port: 8080\n          initialDelaySeconds: 10\n        name: server\n        ports:\n        - containerPort: 8080\n        readinessProbe:\n          httpGet:\n            httpHeaders:\n            - name: Cookie\n              value: shop_session-id=x-readiness-probe\n            path: /_healthz\n            port: 8080\n          initialDelaySeconds: 10\n        resources:\n          limits:\n            cpu: 200m\n            memory: 128Mi\n          requests:\n            cpu: 100m\n            memory: 64Mi\n# [END istio_dual_control_plane_cluster2_deployment_frontend]\n---\n# [START istio_dual_control_plane_cluster2_deployment_productcatalogservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: productcatalogservice\nspec:\n  selector:\n    matchLabels:\n      app: productcatalogservice\n  template:\n    metadata:\n      labels:\n        app: productcatalogservice\n    spec:\n      containers:\n      - image: gcr.io/google-samples/microservices-demo/productcatalogservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:3550\n        name: server\n        ports:\n        - containerPort: 3550\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:3550\n        resources:\n          limits:\n            cpu: 200m\n            memory: 128Mi\n          requests:\n            cpu: 100m\n            memory: 64Mi\n      terminationGracePeriodSeconds: 5\n# [END istio_dual_control_plane_cluster2_deployment_productcatalogservice]\n---\n# [START istio_dual_control_plane_cluster2_deployment_cartservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: cartservice\nspec:\n  selector:\n    matchLabels:\n      app: cartservice\n  template:\n    metadata:\n      labels:\n        app: cartservice\n    spec:\n      containers:\n      - env:\n        - name: REDIS_ADDR\n          value: ''\n        - name: PORT\n          value: '7070'\n        - name: LISTEN_ADDR\n          value: 0.0.0.0\n        image: gcr.io/google-samples/microservices-demo/cartservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:7070\n          initialDelaySeconds: 15\n          periodSeconds: 10\n        name: server\n        ports:\n        - containerPort: 7070\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:7070\n          initialDelaySeconds: 15\n        resources:\n          limits:\n            cpu: 300m\n            memory: 128Mi\n          requests:\n            cpu: 200m\n            memory: 64Mi\n      terminationGracePeriodSeconds: 5\n# [END istio_dual_control_plane_cluster2_deployment_cartservice]\n---\n# [START istio_dual_control_plane_cluster2_deployment_recommendationservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: recommendationservice\nspec:\n  selector:\n    matchLabels:\n      app: recommendationservice\n  template:\n    metadata:\n      labels:\n        app: recommendationservice\n    spec:\n      containers:\n      - env:\n        - name: PRODUCT_CATALOG_SERVICE_ADDR\n          value: productcatalogservice.default.svc.cluster.local:3550\n        image: gcr.io/google-samples/microservices-demo/recommendationservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:8080\n          periodSeconds: 5\n        name: server\n        ports:\n        - containerPort: 8080\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:8080\n          periodSeconds: 5\n        resources:\n          limits:\n            cpu: 200m\n            memory: 450Mi\n          requests:\n            cpu: 100m\n            memory: 220Mi\n      terminationGracePeriodSeconds: 5\n# [END istio_dual_control_plane_cluster2_deployment_recommendationservice]\n---\n"
  },
  {
    "path": "multicluster-gke/dual-control-plane/cluster2/istio-defaults.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_dual_control_plane_cluster2_gateway_frontend_gateway]\napiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n  name: frontend-gateway\nspec:\n  selector:\n    istio: ingressgateway\n  servers:\n  - hosts:\n    - '*'\n    port:\n      name: http\n      number: 80\n      protocol: HTTP\n# [END istio_dual_control_plane_cluster2_gateway_frontend_gateway]\n---\n# [START istio_dual_control_plane_cluster2_virtualservice_frontend_ingress]\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: frontend-ingress\nspec:\n  gateways:\n  - frontend-gateway\n  hosts:\n  - '*'\n  http:\n  - route:\n    - destination:\n        host: frontend\n        port:\n          number: 80\n# [END istio_dual_control_plane_cluster2_virtualservice_frontend_ingress]\n---\n# [START istio_dual_control_plane_cluster2_virtualservice_frontend]\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: frontend\nspec:\n  hosts:\n  - frontend.default.svc.cluster.local\n  http:\n  - route:\n    - destination:\n        host: frontend\n        port:\n          number: 80\n# [END istio_dual_control_plane_cluster2_virtualservice_frontend]"
  },
  {
    "path": "multicluster-gke/dual-control-plane/cluster2/service-entries.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_dual_control_plane_cluster2_serviceentry_adservice_entry]\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: adservice-entry\nspec:\n  addresses:\n  - 240.0.0.2\n  endpoints:\n  - address: 34.70.9.157\n    ports:\n      grpc: 15443\n  hosts:\n  - adservice.default.global\n  location: MESH_INTERNAL\n  ports:\n  - name: grpc\n    number: 9555\n    protocol: GRPC\n  resolution: DNS\n# [END istio_dual_control_plane_cluster2_serviceentry_adservice_entry]\n---\n# [START istio_dual_control_plane_cluster2_serviceentry_checkoutservice_entry]\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: checkoutservice-entry\nspec:\n  addresses:\n  - 240.0.0.3\n  endpoints:\n  - address: 34.70.9.157\n    ports:\n      grpc: 15443\n  hosts:\n  - checkoutservice.default.global\n  location: MESH_INTERNAL\n  ports:\n  - name: grpc\n    number: 5050\n    protocol: GRPC\n  resolution: DNS\n# [END istio_dual_control_plane_cluster2_serviceentry_checkoutservice_entry]\n---\n# [START istio_dual_control_plane_cluster2_serviceentry_currencyservice_entry]\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: currencyservice-entry\nspec:\n  addresses:\n  - 240.0.0.4\n  endpoints:\n  - address: 34.70.9.157\n    ports:\n      grpc: 15443\n  hosts:\n  - currencyservice.default.global\n  location: MESH_INTERNAL\n  ports:\n  - name: grpc\n    number: 7000\n    protocol: GRPC\n  resolution: DNS\n# [END istio_dual_control_plane_cluster2_serviceentry_currencyservice_entry]\n---\n# [START istio_dual_control_plane_cluster2_serviceentry_shippingservice_entry]\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: shippingservice-entry\nspec:\n  addresses:\n  - 240.0.0.8\n  endpoints:\n  - address: 34.70.9.157\n    ports:\n      grpc: 15443\n  hosts:\n  - shippingservice.default.global\n  location: MESH_INTERNAL\n  ports:\n  - name: grpc\n    number: 50051\n    protocol: GRPC\n  resolution: DNS\n# [END istio_dual_control_plane_cluster2_serviceentry_shippingservice_entry]\n---\n"
  },
  {
    "path": "multicluster-gke/dual-control-plane/cluster2/services-local.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_dual_control_plane_cluster2_service_recommendationservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: recommendationservice\nspec:\n  ports:\n  - name: grpc\n    port: 8080\n    targetPort: 8080\n  selector:\n    app: recommendationservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster2_service_recommendationservice]\n---\n# [START istio_dual_control_plane_cluster2_service_frontend]\napiVersion: v1\nkind: Service\nmetadata:\n  name: frontend\nspec:\n  ports:\n  - name: http\n    port: 80\n    targetPort: 8080\n  selector:\n    app: frontend\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster2_service_frontend]\n---\n# [START istio_dual_control_plane_cluster2_service_productcatalogservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: productcatalogservice\nspec:\n  ports:\n  - name: grpc\n    port: 3550\n    targetPort: 3550\n  selector:\n    app: productcatalogservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster2_service_productcatalogservice]\n---\n# [START istio_dual_control_plane_cluster2_service_cartservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: cartservice\nspec:\n  ports:\n  - name: grpc\n    port: 7070\n    targetPort: 7070\n  selector:\n    app: cartservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster2_service_cartservice]\n---\n"
  },
  {
    "path": "multicluster-gke/dual-control-plane/scripts/1-create-gke-clusters.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\n# Project 1 - Create GKE Cluster 1\ngcloud config set project $PROJECT_1\n\ngcloud container clusters create $CLUSTER_1 --zone $ZONE --username \"admin\" \\\n--machine-type \"n1-standard-2\" \\\n--scopes \"https://www.googleapis.com/auth/compute\",\"https://www.googleapis.com/auth/devstorage.read_only\",\\\n\"https://www.googleapis.com/auth/logging.write\",\"https://www.googleapis.com/auth/monitoring\",\\\n\"https://www.googleapis.com/auth/servicecontrol\",\"https://www.googleapis.com/auth/service.management.readonly\",\\\n\"https://www.googleapis.com/auth/trace.append\" \\\n--num-nodes \"4\" --network \"default\" --enable-stackdriver-kubernetes  --async\n\n\n# Project 2 - Create GKE Cluster 2\ngcloud config set project $PROJECT_2\n\ngcloud container clusters create $CLUSTER_2 --zone $ZONE --username \"admin\" \\\n--machine-type \"n1-standard-2\" \\\n--num-nodes \"4\" --network \"default\" --enable-stackdriver-kubernetes --async\n"
  },
  {
    "path": "multicluster-gke/dual-control-plane/scripts/2-install-istio.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\nDUAL_PROFILE=\"../multicluster-gke/dual-control-plane/scripts/install.yaml\"\ncd ../../common\n\n# Cluster 1\nlog \"Installing Istio on Cluster 1...\"\ngcloud config set project $PROJECT_1\ngcloud container clusters get-credentials $CLUSTER_1 --zone $ZONE\nkubectl config use-context $CTX_1\nINSTALL_YAML=${DUAL_PROFILE} ./install_istio.sh\n\n\n# Cluster 2\nlog \"Installing Istio on Cluster 2...\"\ngcloud config set project $PROJECT_2\ngcloud container clusters get-credentials $CLUSTER_2 --zone $ZONE\nkubectl config use-context $CTX_2\nINSTALL_YAML=${DUAL_PROFILE} ./install_istio.sh\n\n"
  },
  {
    "path": "multicluster-gke/dual-control-plane/scripts/3-configure-dns.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\nconfigure_kubedns () {\n     kubectl apply -f - <<EOF\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: kube-dns\n  namespace: kube-system\ndata:\n  stubDomains: |\n    {\"global\": [\"$(kubectl get svc -n istio-system istiocoredns -o jsonpath={.spec.clusterIP})\"]}\nEOF\n}\n\n# Cluster 1\nlog \"Configuring DNS on Cluster 1...\"\ngcloud config set project $PROJECT_1\nkubectl config use-context $CTX_1\nconfigure_kubedns\nlog \"...done with cluster 1.\"\n\n\n# Cluster 2\nlog \"Configuring DNS on Cluster 2...\"\ngcloud config set project $PROJECT_2\nkubectl config use-context $CTX_2\nconfigure_kubedns\nlog \"...done with cluster 2.\"\n"
  },
  {
    "path": "multicluster-gke/dual-control-plane/scripts/4-deploy-online-boutique.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\n# Get the Istio IngressGateway IP for both clusters\nkubectl config use-context $CTX_1\nGWIP1=$(kubectl get -n istio-system service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\n\nkubectl config use-context $CTX_2\nGWIP2=$(kubectl get -n istio-system service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\n\n\n# Populate YAML / Deploy to Cluster 1\nlog \"Deploying OnlineBoutique on Cluster 1...\"\ngcloud config set project $PROJECT_1\ngcloud container clusters get-credentials $CLUSTER_1 --zone $ZONE\nkubectl config use-context $CTX_1\npattern='.*- address:.*'\nreplace=\"  - address: \"$GWIP2\"\"\ngsed -r -i \"s|$pattern|$replace|g\" cluster1/service-entries.yaml\nkubectl apply -f ./cluster1\nlog \"...done with cluster 1.\"\n\n\n# Populate YAML /  Deploy to Cluster 2\nlog \"Deploying OnlineBoutique on Cluster 2...\"\ngcloud config set project $PROJECT_2\ngcloud container clusters get-credentials $CLUSTER_2 --zone $ZONE\nkubectl config use-context $CTX_2\npattern='.*- address:.*'\nreplace=\"  - address: \"$GWIP1\"\"\ngsed -r -i \"s|$pattern|$replace|g\" cluster2/service-entries.yaml\nkubectl apply -f ./cluster2\nlog \"...done with cluster 2.\"\n\n\n"
  },
  {
    "path": "multicluster-gke/dual-control-plane/scripts/cleanup-delete-clusters.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\nlog \"Deleting cluster 1...\"\ngcloud container clusters delete $CLUSTER_1 --project $PROJECT_1 --zone $ZONE --async\n\n# Project 2 - Create GKE Cluster 2\nlog \"Deleting cluster 2...\"\ngcloud config set project $PROJECT_2\ngcloud container clusters delete $CLUSTER_2 --project $PROJECT_2 --zone $ZONE --async\n"
  },
  {
    "path": "multicluster-gke/dual-control-plane/scripts/env.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nlog() { echo \"$1\" >&2; }\n\nZONE=\"us-central1-b\"\n\nISTIO_VERSION=${ISTIO_VERSION:=1.4.2}\n\nPROJECT_1=\"${PROJECT_1:?PROJECT_1 env variable must be specified}\"\nCLUSTER_1=\"dual-cluster1\"\nCTX_1=\"gke_${PROJECT_1}_${ZONE}_${CLUSTER_1}\"\n\nPROJECT_2=\"${PROJECT_2:?PROJECT_2 env variable must be specified}\"\nCLUSTER_2=\"dual-cluster2\"\nCTX_2=\"gke_${PROJECT_2}_${ZONE}_${CLUSTER_2}\""
  },
  {
    "path": "multicluster-gke/dual-control-plane/scripts/install.yaml",
    "content": "apiVersion: install.istio.io/v1alpha1\nkind: IstioOperator\nspec:\n  addonComponents:\n    grafana:\n      enabled: true\n      k8s:\n        replicaCount: 1\n    istiocoredns:\n      enabled: true\n    kiali:\n      enabled: true\n      k8s:\n        replicaCount: 1\n    prometheus:\n      enabled: true\n      k8s:\n        replicaCount: 1\n    tracing:\n      enabled: true\n  components:\n    egressGateways:\n      - name: istio-egressgateway\n        enabled: true\n\n  values:\n    kiali:\n      contextPath: /kiali\n      createDemoSecret: true\n      dashboard:\n        grafanaInClusterURL: http://grafana:3000\n        jaegerInClusterURL: http://tracing/jaeger\n        passphraseKey: passphrase\n        secretName: kiali\n        usernameKey: username\n        viewOnlyMode: false\n      hub: quay.io/kiali\n      ingress:\n        enabled: false\n        hosts:\n        - kiali.local\n      nodeSelector: {}\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      security:\n        cert_file: /kiali-cert/cert-chain.pem\n        enabled: false\n        private_key_file: /kiali-cert/key.pem\n      tag: v1.14\n    global:\n      # Provides dns resolution for global services\n      podDNSSearchNamespaces:\n        - global\n        - \"{{ valueOrDefault .DeploymentMeta.Namespace \\\"default\\\" }}.global\"\n\n      multiCluster:\n        enabled: true\n\n      controlPlaneSecurityEnabled: true\n\n    # Multicluster with gateways requires a root CA\n    # Cluster local CAs are bootstrapped with the root CA.\n    security:\n      selfSigned: false\n\n    gateways:\n      istio-egressgateway:\n        env:\n          # Needed to route traffic via egress gateway if desired.\n          ISTIO_META_REQUESTED_NETWORK_VIEW: \"external\"\n"
  },
  {
    "path": "multicluster-gke/single-control-plane/README.md",
    "content": "# Demo: Multicluster Istio- Single Control Plane\n\nThis demo shows how to use Istio to orchestrate [an application](https://github.com/GoogleCloudPlatform/microservices-demo) running across two Google\nKubernetes Engine clusters in the same project, but across two different [zones](https://cloud.google.com/compute/docs/regions-zones/#identifying_a_region_or_zone).\n\n![topology](screenshots/topology.png)\n\n### Prerequisites\n\n1. a GCP project with Billing enabled.\n2. gcloud\n3. kubectl\n4. [helm CLI](https://github.com/helm/helm/releases), installed wherever you're running\n   these commands (Google Cloud shell, laptop,\n   etc.) Note that we are only using the `helm template` command in this demo (ie. [Tiller](https://helm.sh/docs/glossary/#tiller)\n   not required on any of the Kubernetes clusters).\n\n## Create two GKE clusters\n\nSet the project ID to your GCP Project:\n\n```\nexport PROJECT_ID=<your-GCP-project-ID>\n```\n\nThen run the script to create two GKE clusters in your project:\n\n```\n./scripts/1-cluster-create.sh\n```\n\nThen, run:\n\n```\nwatch -n 1 gcloud container clusters list\n```\n\nWait for both clusters to be `RUNNING`.\n\n## Connect to clusters\n\nThis script creates kubeconfigs for both clusters, to allow future `kubectl` commands to\nswitch back and forth between them.\n\n```\n./scripts/2-get-credentials.sh\n```\n\n## Create a GKE Firewall Rule\n\nThis step allows pods on both clusters to communicate directly.\n\n```\n./scripts/3-firewall.sh\n```\n\n\n## Install the Istio Control Plane on Cluster 1\n\nThis step installs the Istio control plane on one of the GKE clusters.\n\n```\n./scripts/4-cluster1-install.sh\n```\n\n\n## Install the Istio Remote on Cluster 2\n\nNow we'll install the remote Istio components (Citadel's node-agent, and an Envoy sidecar injector) on Cluster 2.\n\n```\n./scripts/5-cluster2-install.sh\n```\n\n\n## Connect Cluster 2 to Cluster 1\n\nThis step generates a [Kubeconfig](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#define-clusters-users-and-contexts) file for the remote cluster 2, then adds it as a [Secret](https://kubernetes.io/docs/concepts/configuration/secret/)\nto Cluster 1. This step allows the Istio control plane on cluster 1 to configure Istio proxies on cluster 2.\n\n```\n./scripts/6-connect-clusters.sh\n```\n\n\n## Deploy [Hipstershop](https://github.com/GoogleCloudPlatform/microservices-demo)\n\nThis script deploys the sample application across both cluster 1 and cluster 2. We have\nsplit the microservices in the application so that some run centrally to the Istio control\nplane (cluster 1), and the rest run on the remote Istio cluster (cluster 2):\n\n![topology](screenshots/topology.png)\n\n\nRun the script to deploy:\n\n```\n./scripts/7-deploy-hipstershop.sh\n```\n\n*Note*:  This script uses the default Hipstershop installation, which deploys all services to the cluster, then deletes the deployments that belong on the other cluster. Both clusters need Kubernetes Services for all the Hipstershop workloads, in order for cross-cluster DNS to work.\n\nYou can verify that the multicluster deployment was successful using 3 methods:\n\n1. Run `kubectl get pods` on both clusters to ensure all pods are `RUNNING` and `READY`.\n\n2. From cluster-1, run `istioctl proxy-status`. You should see cluster-2 services (eg.\n   `cartservice`) appear in the list. This means that the Istio control plane can\n   successfully configure Envoy proxies running on the remote GKE cluster-2.\n\n```\nNAME                                                   CDS        LDS        EDS        RDS        PILOT                       VERSION\nadservice-86674bf94d-gq52w.default                     SYNCED     SYNCED     SYNCED     SYNCED     istiod-6c6c489d84-8rgnr     1.5.2\ncheckoutservice-74df4f44c8-b6xlq.default               SYNCED     SYNCED     SYNCED     SYNCED     istiod-6c6c489d84-8rgnr     1.5.2\ncurrencyservice-6444b89474-ln4zp.default               SYNCED     SYNCED     SYNCED     SYNCED     istiod-6c6c489d84-8rgnr     1.5.2\nemailservice-c98d5d48d-5pg65.default                   SYNCED     SYNCED     SYNCED     SYNCED     istiod-6c6c489d84-8rgnr     1.5.2\nfrontend-67dcdc8cf8-z64jh.default                      SYNCED     SYNCED     SYNCED     SYNCED     istiod-6c6c489d84-8rgnr     1.5.2\nistio-ingressgateway-5b477bdb4f-l9fw2.istio-system     SYNCED     SYNCED     SYNCED     SYNCED     istiod-6c6c489d84-8rgnr     1.5.2\npaymentservice-579d78fc44-r65wp.default                SYNCED     SYNCED     SYNCED     SYNCED     istiod-6c6c489d84-8rgnr     1.5.2\nproductcatalogservice-65794cb878-bb6zf.default         SYNCED     SYNCED     SYNCED     SYNCED     istiod-6c6c489d84-8rgnr     1.5.2\nprometheus-7bc49f57-mjhqx.istio-system                 SYNCED     SYNCED     SYNCED     SYNCED     istiod-6c6c489d84-8rgnr     1.5.2\nshippingservice-794b4d66bb-prc9j.default               SYNCED     SYNCED     SYNCED     SYNCED     istiod-6c6c489d84-8rgnr     1.5.2\n```\n\n3. open Hipstershop in the browser by getting the Istio `IngressGateway`'s `EXTERNAL_IP`:\n\n```\nkubectl get svc istio-ingressgateway -n istio-system\n```\n\nFrom the frontend, click on a product. You should see product recommendations, and be able to navigate to your Cart without any errors:\n\n![browser-screenshot](screenshots/browser-screenshot.png)\n\nThis means that the Hipstershop Frontend service (running in cluster 1) was able to use\nits Istio sidecar proxy to resolve DNS to Kubernetes Services running in cluster 2.\n\n🎉 Well done! You just orchestrated an application with Istio across multiple Google\nKubernetes Engine\nclusters.\n\n## Cleanup\n\nTo delete all the GCP resources used in this demo:\n\n```\n./scripts/cleanup-delete-clusters.sh\n```\n\n## What's next?\n\nNow that you have Istio installed on two clusters, you can create [traffic rules](https://github.com/GoogleCloudPlatform/istio-samples/tree/master/istio-canary-gke) and [security policies](https://github.com/GoogleCloudPlatform/istio-samples/tree/master/security-intro) that\nspan both clusters.\n\nOr to deploy the BookInfo app with multicluster Istio, [see the Istio documentation](https://preliminary.istio.io/docs/examples/multicluster/gke/).\n"
  },
  {
    "path": "multicluster-gke/single-control-plane/scripts/1-cluster-create.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Creates two GKE clusters in different regions.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\nlog \"Creating cluster1...\"\n gcloud container clusters create cluster-1 --zone $cluster1zone --username \"admin\" \\\n  --machine-type \"n1-standard-4\" \\\n  --scopes \"https://www.googleapis.com/auth/compute\",\"https://www.googleapis.com/auth/devstorage.read_only\",\\\n\"https://www.googleapis.com/auth/logging.write\",\"https://www.googleapis.com/auth/monitoring\",\\\n\"https://www.googleapis.com/auth/servicecontrol\",\"https://www.googleapis.com/auth/service.management.readonly\",\\\n\"https://www.googleapis.com/auth/trace.append\" \\\n--num-nodes \"2\" --network \"default\" --enable-stackdriver-kubernetes --enable-ip-alias --async\n\nsleep 20\n\nlog \"Creating cluster2...\"\n  gcloud container clusters create cluster-2 --zone $cluster2zone --username \"admin\" \\\n  --machine-type \"n1-standard-4\" \\\n  --scopes \"https://www.googleapis.com/auth/compute\",\"https://www.googleapis.com/auth/devstorage.read_only\",\\\n\"https://www.googleapis.com/auth/logging.write\",\"https://www.googleapis.com/auth/monitoring\",\\\n\"https://www.googleapis.com/auth/servicecontrol\",\"https://www.googleapis.com/auth/service.management.readonly\",\\\n\"https://www.googleapis.com/auth/trace.append\" \\\n--num-nodes \"2\" --network \"default\" --enable-stackdriver-kubernetes --enable-ip-alias --async\n"
  },
  {
    "path": "multicluster-gke/single-control-plane/scripts/2-get-credentials.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\ngcloud container clusters get-credentials cluster-1 --zone $cluster1zone\ngcloud container clusters get-credentials cluster-2 --zone $cluster2zone"
  },
  {
    "path": "multicluster-gke/single-control-plane/scripts/3-firewall.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\nfunction join_by { local IFS=\"$1\"; shift; echo \"$*\"; }\n\nALL_CLUSTER_CIDRS=$(gcloud container clusters list --format='value(clusterIpv4Cidr)' | sort | uniq)\nALL_CLUSTER_CIDRS=$(join_by , $(echo \"${ALL_CLUSTER_CIDRS}\"))\nALL_CLUSTER_NETTAGS=$(gcloud compute instances list --format='value(tags.items.[0])' | sort | uniq)\nALL_CLUSTER_NETTAGS=$(join_by , $(echo \"${ALL_CLUSTER_NETTAGS}\"))\n\ngcloud compute firewall-rules create istio-multicluster-test-pods \\\n  --allow=tcp,udp,icmp,esp,ah,sctp \\\n  --direction=INGRESS \\\n  --priority=900 \\\n  --source-ranges=\"${ALL_CLUSTER_CIDRS}\" \\\n  --target-tags=\"${ALL_CLUSTER_NETTAGS}\" --quiet\n"
  },
  {
    "path": "multicluster-gke/single-control-plane/scripts/4-cluster1-install.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# cluster 1 is the \"main\" cluster running the Istio control plane\n# src https://istio.io/docs/setup/install/multicluster/shared/\n\nset -euo pipefail\nsource ./scripts/env.sh\n\nkubectl config use-context $ctx1\nlog \"Installing the Istio ${ISTIO_VERSION} control plane on ${ctx1} ...\"\n\ncd ../../common\nINSTALL_YAML=\"../multicluster-gke/single-control-plane/scripts/cluster1.yaml\" ./install_istio.sh\n"
  },
  {
    "path": "multicluster-gke/single-control-plane/scripts/5-cluster2-install.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\nexport ISTIOD_REMOTE_EP=$(kubectl --context=${ctx1} -n istio-system get svc istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\nlog \"ISTIOD_REMOTE_EP is ${ISTIOD_REMOTE_EP}\"\n\nkubectl config use-context $ctx2\n\n# configure cluster2 with \"remote pilot\" to get its config (istiod running in cluster1)\npattern='ISTIOD_REMOTE_EP'\nreplace=\"${ISTIOD_REMOTE_EP}\"\ngsed -r -i \"s|$pattern|$replace|g\" scripts/cluster2.yaml\n\n# install the istio sidecar injector (istiod), prometheus in cluster2\ncd ../../common\nINSTALL_YAML=\"../multicluster-gke/single-control-plane/scripts/cluster2.yaml\" ./install_istio.sh\n\n"
  },
  {
    "path": "multicluster-gke/single-control-plane/scripts/6-connect-clusters.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\nset -euo pipefail\nsource ./scripts/env.sh\n\n# Configure cross cluster service registries\n# (let cluster 1 discover services in cluster 2)\ncd ../../common/istio-1.5.2/bin\n./istioctl x create-remote-secret --context=${ctx2} --name \"cluster2\" | \\\n    kubectl apply -f - --context=${ctx1}\ncd ../../../multicluster-gke/single-control-plane/"
  },
  {
    "path": "multicluster-gke/single-control-plane/scripts/7-deploy-hipstershop.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\n# Deploy \"most of\" Hipstershop to cluster 1\nkubectl config use-context $ctx1\nkubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/master/release/kubernetes-manifests.yaml\nkubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/master/release/istio-manifests.yaml\nkubectl delete svc frontend-external\n# delete cluster2 svcs from cluster1\nfor i in \"${services2[@]}\"\ndo\n   echo \"Deleting ${i} from ${ctx1}\"\n   kubectl delete deployment $i\ndone\n\n\n# Deploy the rest of Hipstershop (cartservice, rediscart, recommendations, loadgenerator) to cluster2\nkubectl config use-context $ctx2\nkubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/master/release/kubernetes-manifests.yaml\nkubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/master/release/istio-manifests.yaml\nkubectl delete svc frontend-external\n# delete cluster1 svcs from cluster2\nfor i in \"${services1[@]}\"\ndo\n   echo \"Deleting ${i} from ${ctx2}\"\n   kubectl delete deployment $i\ndone\n"
  },
  {
    "path": "multicluster-gke/single-control-plane/scripts/cleanup-delete-clusters.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Creates two GKE clusters in different regions.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\nlog \"Deleting cluster1...\"\ngcloud container clusters delete cluster-1 --zone $cluster1zone --async\n\nlog \"Deleting cluster2...\"\ngcloud container clusters delete cluster-2 --zone $cluster2zone --async\n"
  },
  {
    "path": "multicluster-gke/single-control-plane/scripts/cluster1.yaml",
    "content": "apiVersion: install.istio.io/v1alpha1\nkind: IstioOperator\nspec:\n  values:\n    security:\n      selfSigned: false\n    global:\n      multiCluster:\n        clusterName: cluster1\n      network: \"\"\n      meshExpansion:\n        enabled: true"
  },
  {
    "path": "multicluster-gke/single-control-plane/scripts/cluster2.yaml",
    "content": "apiVersion: install.istio.io/v1alpha1\nkind: IstioOperator\nspec:\n  values:\n    global:\n      multiCluster:\n        clusterName: cluster2\n      network: \"\"\n      remotePilotAddress: ISTIO_REMOTE_EP"
  },
  {
    "path": "multicluster-gke/single-control-plane/scripts/env.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nlog() { echo \"$1\" >&2; }\n\nPROJECT_ID=\"${PROJECT_ID:?PROJECT_ID env variable must be specified}\"\ngcloud config set project $PROJECT_ID\n\ncluster1=\"cluster1\"\ncluster2=\"cluster2\"\nnetwork1=\"network1\"\ncluster1zone=\"us-east1-b\"\ncluster2zone=\"us-central1-b\"\n\nctx1=\"gke_${PROJECT_ID}_${cluster1zone}_cluster-1\"\nctx2=\"gke_${PROJECT_ID}_${cluster2zone}_cluster-2\"\n\nISTIO_VERSION=${ISTIO_VERSION:=1.5.2}\n\nservices1=(\"emailservice\" \"paymentservice\" \"shippingservice\" \"adservice\" \"checkoutservice\" \"currencyservice\" \"frontend\" \"productcatalogservice\")\nservices2=(\"loadgenerator\" \"cartservice\" \"recommendationservice\" \"redis-cart\")"
  },
  {
    "path": "multicluster-gke/vm-migration/README.md",
    "content": "# Virtual Machine Migration with Multicluster Istio\n\n  - [Introduction](#introduction)\n  - [Setup](#setup)\n  - [Deploy the sample application to GKE](#deploy-the-sample-application-to-gke)\n  - [Install Istio on the VM](#install-istio-on-the-vm)\n  - [Prepare for VM to GKE Migration](#prepare-for-vm-to-gke-migration)\n  - [Migrate productcatalog to GKE](#migrate-productcatalog-to-gke)\n  - [Complete the GKE Migration](#complete-the-gke-migration)\n  - [Cleanup](#cleanup)\n\n## Introduction\n\nIstio works with services running in Kubernetes containers, but it also works with virtual machines. Because of this, Istio can help you integrate legacy VM workloads into a modern, Kubernetes-based service mesh - and help you migrate the VM services to Kubernetes, when you're ready.\n\nFor instance, let's say we want to deploy a multi-service application. This application consists mostly of Kubernetes-ready microservices (running across two cloud datacenters in `us-west` and `us-east`), but one of the older services (`productcatalog`) runs in a virtual machine in `us-central`. We can still get all the benefits of Istio (telemetry, security, traffic policies) for that virtual machine service. Then, when we're ready to migrate `productcatalog` from a VM to a container running in one of our Kubernetes clusters, Istio can progressively - and safely - migrate traffic from the VM to the container version with zero downtime.\n\nIn this sample, we will set up multicluster Istio on two GKE clusters, then configure a GCE instance to join the mesh. Then we'll deploy a sample app across the two clusters and the VM. Finally, we'll deploy the VM service a Kubernetes pod alongside the VM instance, and use Istio traffic splitting to migrate from GCE to all GKE. We will work towards this final state, where the VM service is no longer needed -\n\n![](screenshots/migrate-complete-traffic.png)\n\n\n## Setup\n\n1. Set your project ID.\n```\nexport PROJECT_ID=\"<your-project-id>\"\n```\n\n2. Run the first script to create two GKE clusters and one GCE instance in your project.\n\n```\n./scripts/1-create-infra.sh\n```\n\n3. Wait for the clusters to be `RUNNING`.\n\n```\nwatch gcloud container clusters list\n\nNAME      LOCATION    MASTER_VERSION  MASTER_IP      MACHINE_TYPE\nNODE_VERSION    NUM_NODES  STATUS\ncluster2  us-east1-b  1.14.10-gke.27  35.196.192.71  n1-standard-2\n1.14.10-gke.27  4          RUNNING\ncluster1  us-west1-b  1.14.10-gke.27  34.83.227.203  n1-standard-2\n1.14.10-gke.27  4          RUNNING\n```\n\n\n4. Create firewall rules to allow traffic from the GKE pods in both clusters to your GCE instance. This will allow traffic to move freely between the two GKE clusters and the service running on the VM.\n\n```\n./scripts/2-firewall.sh\n```\n\n\n5. Install the Istio control plane on both GKE clusters. This script also connects the two Istio control planes into one logical mesh by updating the KubeDNS stubdomain - this is what will allow cross-cluster GKE mesh traffic to resolve to local Kubernetes services on the opposite cluster. [See the Istio docs](https://istio.io/docs/setup/install/multicluster/gateways/#setup-dns) for more information.\n\n```\n./scripts/3-install-istio-gke.sh\n```\n\n\n## Deploy the sample application to GKE\n\n1. Deploy the OnlineBoutique sample application -- minus one backend service, `productcatalog` -- across the two GKE clusters. Note that until we deploy `productcatalog` onto the VM, the app will be in an error state and the loadgenerator pod will not start. This is expected because productcatalog is unreachable for now.\n\n```\n./scripts/4-deploy-onlineboutique-gke.sh\n```\n\nNote that this script creates Istio `ServiceEntry` resources so that services across clusters can access each other via the `IngressGateway` running in the opposite cluster. For example, in cluster 2, we create a `ServiceEntry` for `adservice` (running in cluster1) to that the frontend (in cluster2) can reach adservice in the opposite cluster via the Kubernetes DNS name `adservice.default.global`:\n\n\n```YAML\n# this service entry lives in cluster 2\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: adservice-entry\nspec:\n  addresses:\n# this is a placeholder virtual IP, it's not used for routing\n  - 240.0.0.2\n  endpoints:\n  # this is the istio ingressgateway IP for cluster 1 (the actual routing IP)\n  - address: 35.230.67.174\n    ports:\n      grpc: 15443\n  hosts:\n# this is the address the frontend uses to reach adservice\n  - adservice.default.global\n# mesh internal means we own this service and it has a sidecar proxy\n  location: MESH_INTERNAL\n  ports:\n  - name: grpc\n# adservice serves grpc traffic on this port #\n    number: 9555\n    protocol: GRPC\n  resolution: DNS\n```\n\n[See the Istio docs](https://istio.io/docs/setup/install/multicluster/gateways/#configure-the-example-services) for more details on how cross-cluster service discovery works.\n\n\n## Install Istio on the VM\n\nNow we're ready to install the Istio agent (sidecar proxy) on the GCE instance we provisioned earlier. This is the architecture we will set up:\n\n![](screenshots/migrate-before-traffic.png)\n\n1. Gather information about the Istio mesh running on GKE. This information is needed so that the Istio proxy on the VM can \"call home\" to a control plane, to receive proxy config, certs for mutual TLS, and know where to send metrics. Because we're running two Istio control planes, **we will configure the VM to \"call home\" to the Istio control plane running on cluster1.**\n\n```\n./scripts/5-prep-cluster1.sh\n```\n\n2. Install the Istio proxy on the VM, along with Docker. Then deploy `productcatalog` onto the VM as a raw Docker container. Note that you could use systemd or another deployment method to deploy your Istio-enabled service to the VM.\n\n```\n./scripts/6-prep-vm.sh\n```\n\n\n3. Add productcatalog to the logical mesh, via the `istioctl` tool. This command will create a `Service` and `ServiceEntry` for productcatalog running on the VM, to allow pods inside both clusters to reach `productcatalog` with a Kubernetes DNS name (`productcatalog.default.svc.cluster.local`), even though `productcatalog` isn't running in Kubernetes.\n\n```\n./scripts/7-add-vm-to-mesh.sh\n```\n\nThe configuration across clusters now looks like this:\n\n\n![](screenshots/migrate-before-config.png)\n\nNote that we do this step for both clusters, because services on **both** cluster1 (recommendations, checkout) and cluster2 (frontend) must reach productcatalog on the VM.\n\n\n4. Verify deployment. This script shows the pods running across both clusters, opens the Kiali service graph (for cluster1) in a browser tab, and outputs the Online frontend\n\n\n```\n./scripts/8-verify-deploy.sh\n```\n\n5. In a browser, navigate the IP shown at the end of the script output. You should see the OnlineBoutique frontend with a list of products - this shows that the frontend running on `cluster2` can reach both the services running on `cluster1` (eg. `currencyservice`) **and** the `productcatalog` service running on the VM, using the Kubernetes DNS names made possible by the Istio `ServiceEntry` resources we just created.\n\n![](screenshots/../../dual-control-plane/screenshots/frontend.png)\n\n6. Open the Kiali service graph for cluster1. Log in with the demo credentials - `admin`/`admin`. You should see traffic going from two backend services -- `checkout` and `recommendations` to the ServiceEntry for `productcatalogservice`:\n\n![](screenshots/cluster1-kiali-vm.png)\n\n7. Open the Kiali service graph for cluster2. You should see traffic going from the frontend to `productcatalogservice` on the VM:\n\n![](screenshots/cluster2-kiali-vm.png)\n\n## Prepare for VM to GKE Migration\n\nNow let's say we are ready to migrate `productcatalog` from GCE to one of our Istio-enabled GKE clusters. The first step to do this is to deploy `productcatalog` as a GKE pod, alongside the VM. To start, we will continue sending all traffic to the VM.\n\n1. Deploy `productcatalog-gke` to cluster2, but don't send any traffic there yet. This script creates the Kubernetes and Istio resources to set up the VM-to-GKE migration - `Deployment` (cluster2), `Service` (cluster2), `ServiceEntry` (cluster1), and `VirtualService` (both clusters).\n\n```\n./scripts/9-deploy-productcatalog-gke.sh\n```\n\nNote the way we're \"wrapping\" a single VirtualService around two Kubernetes hostnames. This is what will let us split traffic across the GKE and VM versions of `productcatalog` in the next step. Here, `productcatalogservice` is the VM `ServiceEntry` already created on both clusters. `productcatalogservice-gke` is a separate Kubernetes service. For cluster2, `productcatalogservice-gke` is a **local** `Service`:\n\n```YAML\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: productcatalog-migration\nspec:\n  hosts:\n    - productcatalogservice\n  http:\n  - route:\n    - destination:\n        host: productcatalogservice\n      weight: 0\n    - destination:\n        host: productcatalogservice-gke\n      weight: 100\n```\n\nFor cluster1, productcatalog's hostname corresponds to an Istio ServiceEntry.\n\n```YAML\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: productcatalog-migration\nspec:\n  hosts:\n    - productcatalogservice\n  http:\n  - route:\n    - destination:\n        host: productcatalogservice\n      weight: 0\n    - destination:\n        host: productcatalogservice-gke.default.global\n      weight: 100\n```\n\n## Migrate productcatalog to GKE\n\n1. Update the two VirtualServices to send 20% of productcatalog traffic to the GKE pod running in `cluster2`, and send the remaining 80% of traffic to the VM.\n\n```\n./scripts/10-split-traffic.sh\n```\n\nOur Istio configuration now looks like this:\n\n![](screenshots/migrate-progress-config.png)\n\n\nAnd the traffic split looks like this:\n\n![](screenshots/migrate-progress-traffic.png)\n\n2. Return to the Kiali service graph to view the traffic splitting in action:\n\n![](screenshots/traffic-split-cluster1.png)\n\n## Complete the GKE Migration\n\nIn a real production migration, you would continue updating the traffic percentages to slowly send more traffic to the GKE version of `productcatalog.`. Let's say we've done that and we're ready to send 100% of traffic to the GKE pod.\n\n1. Complete the migration by updating both VirtualServices to send 100% of productcatalog traffic to the GKE pod, and 0% of traffic to the VM.\n\n```\n./scripts/11-complete-migration.sh\n```\n\nOur Istio config is now:\n\n![](screenshots/migrate-complete-config.png)\n\nTo create the final traffic state where all traffic is now within GKE:\n\n![](screenshots/migrate-complete-traffic.png)\n\nYou should also see in Kiali (cluster1 shown here) that 100% of productcatalog traffic is going to the GKE version:\n\n![](screenshots/migrate-complete-kiali.png)\n\nThe VM migration is complete! Now it would be safe to retire the VM, since all the app services are now running across our two GKE clusters.\n\n\n## Cleanup\n\nTo clean up the resources (GKE clusters, VM) used in this tutorial:\n\n```\n./scripts/12-cleanup.sh\n```"
  },
  {
    "path": "multicluster-gke/vm-migration/cluster1/deployments.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n# [START istio_dual_control_plane_cluster1_deployment_emailservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: emailservice\nspec:\n  selector:\n    matchLabels:\n      app: emailservice\n  template:\n    metadata:\n      labels:\n        app: emailservice\n    spec:\n      containers:\n      - image: gcr.io/google-samples/microservices-demo/emailservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:8080\n          periodSeconds: 5\n        name: server\n        ports:\n        - containerPort: 8080\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:8080\n          periodSeconds: 5\n        resources:\n          limits:\n            cpu: 200m\n            memory: 128Mi\n          requests:\n            cpu: 100m\n            memory: 64Mi\n      terminationGracePeriodSeconds: 5\n# [END istio_dual_control_plane_cluster1_deployment_emailservice]\n---\n# [START istio_dual_control_plane_cluster1_deployment_checkoutservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: checkoutservice\nspec:\n  selector:\n    matchLabels:\n      app: checkoutservice\n  template:\n    metadata:\n      labels:\n        app: checkoutservice\n    spec:\n      containers:\n      - env:\n        - name: PRODUCT_CATALOG_SERVICE_ADDR\n          value: productcatalogservice:3550\n        - name: SHIPPING_SERVICE_ADDR\n          value: shippingservice.default.svc.cluster.local:50051\n        - name: PAYMENT_SERVICE_ADDR\n          value: paymentservice.default.svc.cluster.local:50051\n        - name: EMAIL_SERVICE_ADDR\n          value: emailservice.default.svc.cluster.local:5000\n        - name: CURRENCY_SERVICE_ADDR\n          value: currencyservice.default.svc.cluster.local:7000\n        - name: CART_SERVICE_ADDR\n          value: cartservice.default.global:7070\n        image: gcr.io/google-samples/microservices-demo/checkoutservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:5050\n        name: server\n        ports:\n        - containerPort: 5050\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:5050\n        resources:\n          limits:\n            cpu: 200m\n            memory: 128Mi\n          requests:\n            cpu: 100m\n            memory: 64Mi\n# [END istio_dual_control_plane_cluster1_deployment_checkoutservice]\n---\n# [START istio_dual_control_plane_cluster1_deployment_paymentservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: paymentservice\nspec:\n  selector:\n    matchLabels:\n      app: paymentservice\n  template:\n    metadata:\n      labels:\n        app: paymentservice\n    spec:\n      containers:\n      - env:\n        - name: PORT\n          value: '50051'\n        image: gcr.io/google-samples/microservices-demo/paymentservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:50051\n        name: server\n        ports:\n        - containerPort: 50051\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:50051\n        resources:\n          limits:\n            cpu: 200m\n            memory: 128Mi\n          requests:\n            cpu: 100m\n            memory: 64Mi\n      terminationGracePeriodSeconds: 5\n# [END istio_dual_control_plane_cluster1_deployment_paymentservice]\n---\n# [START istio_dual_control_plane_cluster1_deployment_currencyservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: currencyservice\nspec:\n  selector:\n    matchLabels:\n      app: currencyservice\n  template:\n    metadata:\n      labels:\n        app: currencyservice\n    spec:\n      containers:\n      - env:\n        - name: PORT\n          value: '7000'\n        image: gcr.io/google-samples/microservices-demo/currencyservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:7000\n        name: server\n        ports:\n        - containerPort: 7000\n          name: grpc\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:7000\n        resources:\n          limits:\n            cpu: 200m\n            memory: 128Mi\n          requests:\n            cpu: 100m\n            memory: 64Mi\n      terminationGracePeriodSeconds: 5\n# [END istio_dual_control_plane_cluster1_deployment_currencyservice]\n---\n# [START istio_dual_control_plane_cluster1_deployment_shippingservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: shippingservice\nspec:\n  selector:\n    matchLabels:\n      app: shippingservice\n  template:\n    metadata:\n      labels:\n        app: shippingservice\n    spec:\n      containers:\n      - image: gcr.io/google-samples/microservices-demo/shippingservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:50051\n        name: server\n        ports:\n        - containerPort: 50051\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:50051\n          periodSeconds: 5\n        resources:\n          limits:\n            cpu: 200m\n            memory: 128Mi\n          requests:\n            cpu: 100m\n            memory: 64Mi\n# [END istio_dual_control_plane_cluster1_deployment_shippingservice]\n---\n# [START istio_dual_control_plane_cluster1_deployment_adservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: adservice\nspec:\n  selector:\n    matchLabels:\n      app: adservice\n  template:\n    metadata:\n      labels:\n        app: adservice\n    spec:\n      containers:\n      - env:\n        - name: PORT\n          value: '9555'\n        image: gcr.io/google-samples/microservices-demo/adservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:9555\n          initialDelaySeconds: 20\n          periodSeconds: 15\n        name: server\n        ports:\n        - containerPort: 9555\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:9555\n          initialDelaySeconds: 20\n          periodSeconds: 15\n        resources:\n          limits:\n            cpu: 300m\n            memory: 300Mi\n          requests:\n            cpu: 200m\n            memory: 180Mi\n      terminationGracePeriodSeconds: 5\n# [END istio_dual_control_plane_cluster1_deployment_adservice]\n---\n# [START istio_dual_control_plane_cluster1_deployment_recommendationservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: recommendationservice\nspec:\n  selector:\n    matchLabels:\n      app: recommendationservice\n  template:\n    metadata:\n      labels:\n        app: recommendationservice\n    spec:\n      containers:\n      - env:\n        - name: PRODUCT_CATALOG_SERVICE_ADDR\n          value: productcatalogservice:3550\n        image: gcr.io/google-samples/microservices-demo/recommendationservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:8080\n          periodSeconds: 5\n        name: server\n        ports:\n        - containerPort: 8080\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:8080\n          periodSeconds: 5\n        resources:\n          limits:\n            cpu: 200m\n            memory: 450Mi\n          requests:\n            cpu: 100m\n            memory: 220Mi\n      terminationGracePeriodSeconds: 5\n# [END istio_dual_control_plane_cluster1_deployment_recommendationservice]\n---\n"
  },
  {
    "path": "multicluster-gke/vm-migration/cluster1/istio-defaults.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_dual_control_plane_cluster1_serviceentry_currency_provider_external]\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: currency-provider-external\nspec:\n  hosts:\n  - www.ecb.europa.eu\n  ports:\n  - name: http\n    number: 80\n    protocol: HTTP\n  - name: https\n    number: 443\n    protocol: HTTPS\n# [END istio_dual_control_plane_cluster1_serviceentry_currency_provider_external]"
  },
  {
    "path": "multicluster-gke/vm-migration/cluster1/service-entries.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_dual_control_plane_cluster1_serviceentry_frontendservice_entry]\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: frontendservice-entry\nspec:\n  addresses:\n  - 240.0.0.5\n  endpoints:\n  - address: 34.75.176.213\n    ports:\n      http1: 15443\n  hosts:\n  - frontend.default.global\n  location: MESH_INTERNAL\n  ports:\n  - name: http1\n    number: 80\n    protocol: http\n  resolution: DNS\n# [END istio_dual_control_plane_cluster1_serviceentry_frontendservice_entry]\n---\n# [START istio_dual_control_plane_cluster1_serviceentry_cartservice_entry]\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: cartservice-entry\nspec:\n  addresses:\n  - 240.0.0.7\n  endpoints:\n  - address: 34.75.176.213\n    ports:\n      grpc: 15443\n  hosts:\n  - cartservice.default.global\n  location: MESH_INTERNAL\n  ports:\n  - name: grpc\n    number: 7070\n    protocol: GRPC\n  resolution: DNS\n# [END istio_dual_control_plane_cluster1_serviceentry_cartservice_entry]\n---\n"
  },
  {
    "path": "multicluster-gke/vm-migration/cluster1/services-local.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n# [START istio_dual_control_plane_cluster1_service_recommendationservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: recommendationservice\nspec:\n  ports:\n  - name: grpc\n    port: 8080\n    targetPort: 8080\n  selector:\n    app: recommendationservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster1_service_recommendationservice]\n---\n# [START istio_dual_control_plane_cluster1_service_emailservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: emailservice\nspec:\n  ports:\n  - name: grpc\n    port: 5000\n    targetPort: 8080\n  selector:\n    app: emailservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster1_service_emailservice]\n---\n# [START istio_dual_control_plane_cluster1_service_checkoutservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: checkoutservice\nspec:\n  ports:\n  - name: grpc\n    port: 5050\n    targetPort: 5050\n  selector:\n    app: checkoutservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster1_service_checkoutservice]\n---\n# [START istio_dual_control_plane_cluster1_service_paymentservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: paymentservice\nspec:\n  ports:\n  - name: grpc\n    port: 50051\n    targetPort: 50051\n  selector:\n    app: paymentservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster1_service_paymentservice]\n---\n# [START istio_dual_control_plane_cluster1_service_currencyservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: currencyservice\nspec:\n  ports:\n  - name: grpc\n    port: 7000\n    targetPort: 7000\n  selector:\n    app: currencyservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster1_service_currencyservice]\n---\n# [START istio_dual_control_plane_cluster1_service_shippingservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: shippingservice\nspec:\n  ports:\n  - name: grpc\n    port: 50051\n    targetPort: 50051\n  selector:\n    app: shippingservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster1_service_shippingservice]\n---\n# [START istio_dual_control_plane_cluster1_service_adservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: adservice\nspec:\n  ports:\n  - name: grpc\n    port: 9555\n    targetPort: 9555\n  selector:\n    app: adservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster1_service_adservice]\n---\n"
  },
  {
    "path": "multicluster-gke/vm-migration/cluster2/deployments.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: loadgenerator\nspec:\n  selector:\n    matchLabels:\n      app: loadgenerator\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: loadgenerator\n      annotations:\n        sidecar.istio.io/rewriteAppHTTPProbers: \"true\"\n    spec:\n      terminationGracePeriodSeconds: 5\n      restartPolicy: Always\n      containers:\n      - name: main\n        image: gcr.io/google-samples/microservices-demo/loadgenerator:v0.3.4\n        env:\n        - name: FRONTEND_ADDR\n          value: \"frontend:80\"\n        - name: USERS\n          value: \"10\"\n        resources:\n          requests:\n            cpu: 300m\n            memory: 256Mi\n          limits:\n            cpu: 500m\n            memory: 512Mi\n---\n# [START istio_dual_control_plane_cluster2_deployment_frontend]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: frontend\nspec:\n  selector:\n    matchLabels:\n      app: frontend\n  template:\n    metadata:\n      labels:\n        app: frontend\n    spec:\n      containers:\n      - env:\n        - name: PRODUCT_CATALOG_SERVICE_ADDR\n          value: productcatalogservice.default.svc.cluster.local:3550\n        - name: CURRENCY_SERVICE_ADDR\n          value: currencyservice.default.global:7000\n        - name: CART_SERVICE_ADDR\n          value: cartservice.default.svc.cluster.local:7070\n        - name: RECOMMENDATION_SERVICE_ADDR\n          value: recommendationservice.default.global:8080\n        - name: SHIPPING_SERVICE_ADDR\n          value: shippingservice.default.global:50051\n        - name: CHECKOUT_SERVICE_ADDR\n          value: checkoutservice.default.global:5050\n        - name: AD_SERVICE_ADDR\n          value: adservice.default.global:9555\n        image: gcr.io/google-samples/microservices-demo/frontend:v0.3.4\n        livenessProbe:\n          httpGet:\n            httpHeaders:\n            - name: Cookie\n              value: shop_session-id=x-liveness-probe\n            path: /_healthz\n            port: 8080\n          initialDelaySeconds: 10\n        name: server\n        ports:\n        - containerPort: 8080\n        readinessProbe:\n          httpGet:\n            httpHeaders:\n            - name: Cookie\n              value: shop_session-id=x-readiness-probe\n            path: /_healthz\n            port: 8080\n          initialDelaySeconds: 10\n        resources:\n          limits:\n            cpu: 200m\n            memory: 128Mi\n          requests:\n            cpu: 100m\n            memory: 64Mi\n# [END istio_dual_control_plane_cluster2_deployment_frontend]\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: redis-cart\nspec:\n  selector:\n    matchLabels:\n      app: redis-cart\n  template:\n    metadata:\n      labels:\n        app: redis-cart\n    spec:\n      containers:\n      - name: redis\n        image: redis:alpine\n        ports:\n        - containerPort: 6379\n        readinessProbe:\n          periodSeconds: 5\n          tcpSocket:\n            port: 6379\n        livenessProbe:\n          periodSeconds: 5\n          tcpSocket:\n            port: 6379\n        volumeMounts:\n        - mountPath: /data\n          name: redis-data\n        resources:\n          limits:\n            memory: 256Mi\n            cpu: 125m\n          requests:\n            cpu: 70m\n            memory: 200Mi\n      volumes:\n      - name: redis-data\n        emptyDir: {}\n---\n# [START istio_dual_control_plane_cluster2_deployment_cartservice]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: cartservice\nspec:\n  selector:\n    matchLabels:\n      app: cartservice\n  template:\n    metadata:\n      labels:\n        app: cartservice\n    spec:\n      containers:\n      - env:\n        - name: REDIS_ADDR\n          value: \"redis-cart:6379\"\n        - name: PORT\n          value: '7070'\n        - name: LISTEN_ADDR\n          value: 0.0.0.0\n        image: gcr.io/google-samples/microservices-demo/cartservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:7070\n          initialDelaySeconds: 15\n          periodSeconds: 10\n        name: server\n        ports:\n        - containerPort: 7070\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:7070\n          initialDelaySeconds: 15\n        resources:\n          limits:\n            cpu: 300m\n            memory: 128Mi\n          requests:\n            cpu: 200m\n            memory: 64Mi\n      terminationGracePeriodSeconds: 5\n# [END istio_dual_control_plane_cluster2_deployment_cartservice]\n"
  },
  {
    "path": "multicluster-gke/vm-migration/cluster2/istio-defaults.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_dual_control_plane_cluster2_gateway_frontend_gateway]\napiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n  name: frontend-gateway\nspec:\n  selector:\n    istio: ingressgateway\n  servers:\n  - hosts:\n    - '*'\n    port:\n      name: http\n      number: 80\n      protocol: HTTP\n# [END istio_dual_control_plane_cluster2_gateway_frontend_gateway]\n---\n# [START istio_dual_control_plane_cluster2_virtualservice_frontend_ingress]\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: frontend-ingress\nspec:\n  gateways:\n  - frontend-gateway\n  hosts:\n  - '*'\n  http:\n  - route:\n    - destination:\n        host: frontend\n        port:\n          number: 80\n# [END istio_dual_control_plane_cluster2_virtualservice_frontend_ingress]\n---\n# [START istio_dual_control_plane_cluster2_virtualservice_frontend]\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: frontend\nspec:\n  hosts:\n  - frontend.default.svc.cluster.local\n  http:\n  - route:\n    - destination:\n        host: frontend\n        port:\n          number: 80\n# [END istio_dual_control_plane_cluster2_virtualservice_frontend]"
  },
  {
    "path": "multicluster-gke/vm-migration/cluster2/service-entries.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_dual_control_plane_cluster2_serviceentry_adservice_entry]\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: adservice-entry\nspec:\n  addresses:\n  - 240.0.0.2\n  endpoints:\n  - address: 34.83.181.176\n    ports:\n      grpc: 15443\n  hosts:\n  - adservice.default.global\n  location: MESH_INTERNAL\n  ports:\n  - name: grpc\n    number: 9555\n    protocol: GRPC\n  resolution: DNS\n# [END istio_dual_control_plane_cluster2_serviceentry_adservice_entry]\n---\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: recommendationservice-entry\nspec:\n  addresses:\n  - 240.0.0.3\n  endpoints:\n  - address: 34.83.181.176\n    ports:\n      grpc: 15443\n  hosts:\n  - recommendationservice.default.global\n  location: MESH_INTERNAL\n  ports:\n  - name: grpc\n    number: 8080\n    protocol: GRPC\n  resolution: DNS\n---\n# [START istio_dual_control_plane_cluster2_serviceentry_checkoutservice_entry]\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: checkoutservice-entry\nspec:\n  addresses:\n  - 240.0.0.4\n  endpoints:\n  - address: 34.83.181.176\n    ports:\n      grpc: 15443\n  hosts:\n  - checkoutservice.default.global\n  location: MESH_INTERNAL\n  ports:\n  - name: grpc\n    number: 5050\n    protocol: GRPC\n  resolution: DNS\n# [END istio_dual_control_plane_cluster2_serviceentry_checkoutservice_entry]\n---\n# [START istio_dual_control_plane_cluster2_serviceentry_currencyservice_entry]\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: currencyservice-entry\nspec:\n  addresses:\n  - 240.0.0.5\n  endpoints:\n  - address: 34.83.181.176\n    ports:\n      grpc: 15443\n  hosts:\n  - currencyservice.default.global\n  location: MESH_INTERNAL\n  ports:\n  - name: grpc\n    number: 7000\n    protocol: GRPC\n  resolution: DNS\n# [END istio_dual_control_plane_cluster2_serviceentry_currencyservice_entry]\n---\n# [START istio_dual_control_plane_cluster2_serviceentry_shippingservice_entry]\napiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: shippingservice-entry\nspec:\n  addresses:\n  - 240.0.0.6\n  endpoints:\n  - address: 34.83.181.176\n    ports:\n      grpc: 15443\n  hosts:\n  - shippingservice.default.global\n  location: MESH_INTERNAL\n  ports:\n  - name: grpc\n    number: 50051\n    protocol: GRPC\n  resolution: DNS\n# [END istio_dual_control_plane_cluster2_serviceentry_shippingservice_entry]\n---\n"
  },
  {
    "path": "multicluster-gke/vm-migration/cluster2/services-local.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n# [START istio_dual_control_plane_cluster2_service_frontend]\napiVersion: v1\nkind: Service\nmetadata:\n  name: frontend\nspec:\n  ports:\n  - name: http\n    port: 80\n    targetPort: 8080\n  selector:\n    app: frontend\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster2_service_frontend]\n---\n# [START istio_dual_control_plane_cluster2_service_cartservice]\napiVersion: v1\nkind: Service\nmetadata:\n  name: cartservice\nspec:\n  ports:\n  - name: grpc\n    port: 7070\n    targetPort: 7070\n  selector:\n    app: cartservice\n  type: ClusterIP\n# [END istio_dual_control_plane_cluster2_service_cartservice]\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: redis-cart\nspec:\n  type: ClusterIP\n  selector:\n    app: redis-cart\n  ports:\n  - name: redis\n    port: 6379\n    targetPort: 6379"
  },
  {
    "path": "multicluster-gke/vm-migration/productcatalog-gke/deployment.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: productcatalogservice-gke\nspec:\n  selector:\n    matchLabels:\n      app: productcatalogservice-gke\n  template:\n    metadata:\n      labels:\n        app: productcatalogservice-gke\n    spec:\n      containers:\n      - image: gcr.io/google-samples/microservices-demo/productcatalogservice:v0.3.4\n        livenessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:3550\n        name: server\n        ports:\n        - containerPort: 3550\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:3550\n        resources:\n          limits:\n            cpu: 200m\n            memory: 128Mi\n          requests:\n            cpu: 100m\n            memory: 64Mi\n      terminationGracePeriodSeconds: 5\n"
  },
  {
    "path": "multicluster-gke/vm-migration/productcatalog-gke/service-cluster2.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: productcatalogservice-gke\nspec:\n  ports:\n  - name: grpc\n    port: 3550\n    targetPort: 3550\n  selector:\n    app: productcatalogservice-gke\n  type: ClusterIP"
  },
  {
    "path": "multicluster-gke/vm-migration/productcatalog-gke/serviceentry-cluster1.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: ServiceEntry\nmetadata:\n  name: productcatalogservice-gke\nspec:\n  addresses:\n  - 240.0.0.6\n  endpoints:\n  - address: 34.75.176.213\n    ports:\n      grpc: 15443\n  hosts:\n  - productcatalogservice-gke.default.global\n  location: MESH_INTERNAL\n  ports:\n  - name: grpc\n    number: 3550\n    protocol: GRPC\n  resolution: DNS"
  },
  {
    "path": "multicluster-gke/vm-migration/productcatalog-gke/vs-0-cluster1.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: productcatalog-migration\nspec:\n  hosts:\n    - productcatalogservice\n  http:\n  - route:\n    - destination:\n        host: productcatalogservice\n      weight: 100\n    - destination:\n        host: productcatalogservice-gke.default.global\n      weight: 0"
  },
  {
    "path": "multicluster-gke/vm-migration/productcatalog-gke/vs-0-cluster2.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: productcatalog-migration\nspec:\n  hosts:\n    - productcatalogservice\n  http:\n  - route:\n    - destination:\n        host: productcatalogservice\n      weight: 100\n    - destination:\n        host: productcatalogservice-gke\n      weight: 0"
  },
  {
    "path": "multicluster-gke/vm-migration/productcatalog-gke/vs-100-cluster1.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: productcatalog-migration\nspec:\n  hosts:\n    - productcatalogservice\n  http:\n  - route:\n    - destination:\n        host: productcatalogservice\n      weight: 0\n    - destination:\n        host: productcatalogservice-gke.default.global\n      weight: 100"
  },
  {
    "path": "multicluster-gke/vm-migration/productcatalog-gke/vs-100-cluster2.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: productcatalog-migration\nspec:\n  hosts:\n    - productcatalogservice\n  http:\n  - route:\n    - destination:\n        host: productcatalogservice\n      weight: 0\n    - destination:\n        host: productcatalogservice-gke\n      weight: 100"
  },
  {
    "path": "multicluster-gke/vm-migration/productcatalog-gke/vs-20-cluster1.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: productcatalog-migration\nspec:\n  hosts:\n    - productcatalogservice\n  http:\n  - route:\n    - destination:\n        host: productcatalogservice\n      weight: 80\n    - destination:\n        host: productcatalogservice-gke.default.global\n      weight: 20"
  },
  {
    "path": "multicluster-gke/vm-migration/productcatalog-gke/vs-20-cluster2.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: productcatalog-migration\nspec:\n  hosts:\n    - productcatalogservice\n  http:\n  - route:\n    - destination:\n        host: productcatalogservice\n      weight: 80\n    - destination:\n        host: productcatalogservice-gke\n      weight: 20"
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/1-create-infra.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\nlog \"🚀 Creating clusters...\"\ngcloud config set project $PROJECT_ID\n\ngcloud container clusters create ${CLUSTER_1_NAME} --zone ${CLUSTER_1_ZONE} --username \"admin\" \\\n--machine-type \"n1-standard-4\" \\\n--scopes \"https://www.googleapis.com/auth/compute\",\"https://www.googleapis.com/auth/devstorage.read_only\",\\\n\"https://www.googleapis.com/auth/logging.write\",\"https://www.googleapis.com/auth/monitoring\",\\\n\"https://www.googleapis.com/auth/servicecontrol\",\"https://www.googleapis.com/auth/service.management.readonly\",\\\n\"https://www.googleapis.com/auth/trace.append\" \\\n--num-nodes \"4\" --network \"default\" --enable-stackdriver-kubernetes  --async\n\ngcloud container clusters create ${CLUSTER_2_NAME} --zone ${CLUSTER_2_ZONE} --username \"admin\" \\\n--machine-type \"n1-standard-4\" \\\n--scopes \"https://www.googleapis.com/auth/compute\",\"https://www.googleapis.com/auth/devstorage.read_only\",\\\n\"https://www.googleapis.com/auth/logging.write\",\"https://www.googleapis.com/auth/monitoring\",\\\n\"https://www.googleapis.com/auth/servicecontrol\",\"https://www.googleapis.com/auth/service.management.readonly\",\\\n\"https://www.googleapis.com/auth/trace.append\" \\\n--num-nodes \"4\" --network \"default\" --enable-stackdriver-kubernetes  --async\n\n\n# Create 1 VM\ngcloud compute --project=$PROJECT_ID instances create $GCE_INSTANCE_NAME --zone=$GCE_INSTANCE_ZONE \\\n--machine-type=n1-standard-2 --subnet=default --network-tier=PREMIUM --maintenance-policy=MIGRATE \\\n--image=ubuntu-1604-xenial-v20190628 --image-project=ubuntu-os-cloud --boot-disk-size=10GB \\\n--boot-disk-type=pd-standard --boot-disk-device-name=$GCE_INSTANCE_NAME --tags=${GCE_INSTANCE_NAME}\n\n"
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/10-split-traffic.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\nlog \"🚦 Sending 20% of all productcatalog traffic to GKE...\"\n\nkubectl config use-context ${CTX_1}\nkubectl apply -f productcatalog-gke/vs-20-cluster1.yaml\n\nkubectl config use-context ${CTX_2}\nkubectl apply -f productcatalog-gke/vs-20-cluster2.yaml\nlog \"✅  done.\"\n"
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/11-complete-migration.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\nlog \"🚦 Sending 100% of productcatalog traffic to GKE...\"\n\nkubectl config use-context ${CTX_1}\nkubectl apply -f productcatalog-gke/vs-100-cluster1.yaml\n\nkubectl config use-context ${CTX_2}\nkubectl apply -f productcatalog-gke/vs-100-cluster2.yaml\nlog \"⭐️ GKE migration complete ☸️\"\n"
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/12-cleanup.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\ngcloud config set project $PROJECT_ID\ngcloud container clusters delete ${CLUSTER_1_NAME} --zone ${CLUSTER_1_ZONE} --quiet --async\ngcloud container clusters delete ${CLUSTER_2_NAME} --zone ${CLUSTER_2_ZONE} --quiet --async\ngcloud compute --project=$PROJECT_ID instances delete $GCE_INSTANCE_NAME --zone=$GCE_INSTANCE_ZONE"
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/2-firewall.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\n\n# Cluster 1 --> VM\nlog \"🔥 Creating firewall rules...\"\nexport CLUSTER_1_POD_CIDR=$(gcloud container clusters describe ${CLUSTER_1_NAME?} --zone ${CLUSTER_1_ZONE?} --format=json | jq -r '.clusterIpv4Cidr')\nlog \"Cluster 1 Pod CIDR is ${CLUSTER_1_POD_CIDR}\"\n\ngcloud compute firewall-rules create \"${CLUSTER_1_NAME}-to-${GCE_INSTANCE_NAME}\" \\\n--source-ranges=$CLUSTER_1_POD_CIDR \\\n--target-tags=${GCE_INSTANCE_NAME} \\\n--action=ALLOW \\\n--rules=tcp:${SERVICE_PORT_NUMBER}\n\n# Cluster 2 --> VM\nexport CLUSTER_2_POD_CIDR=$(gcloud container clusters describe ${CLUSTER_2_NAME?} --zone ${CLUSTER_2_ZONE?} --format=json | jq -r '.clusterIpv4Cidr')\nlog \"Cluster 2 Pod CIDR is ${CLUSTER_2_POD_CIDR}\"\ngcloud compute firewall-rules create \"${CLUSTER_2_NAME}-to-${GCE_INSTANCE_NAME}\" \\\n--source-ranges=$CLUSTER_2_POD_CIDR \\\n--target-tags=${GCE_INSTANCE_NAME} \\\n--action=ALLOW \\\n--rules=tcp:${SERVICE_PORT_NUMBER}\n\n\nlog \"✅ done\""
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/3-install-istio-gke.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\nDUAL_VMS_PROFILE=\"../multicluster-gke/vm-migration/scripts/install.yaml\"\ncd ../../common\n\n# Cluster 1\nlog \"⛵️ Installing Istio on Cluster 1...\"\ngcloud config set project $PROJECT_ID\ngcloud container clusters get-credentials $CLUSTER_1_NAME --zone $CLUSTER_1_ZONE\nkubectl config use-context $CTX_1\nINSTALL_YAML=${DUAL_VMS_PROFILE} ./install_istio.sh\n\n\n# Cluster 2\nlog \"⛵️ Installing Istio on Cluster 2...\"\ngcloud container clusters get-credentials $CLUSTER_2_NAME --zone $CLUSTER_2_ZONE\nkubectl config use-context $CTX_2\nINSTALL_YAML=${DUAL_VMS_PROFILE} ./install_istio.sh\n\n\n# Configure dns\nlog \"🌎 Configuring CoreDNS...\"\n\nconfigure_kubedns () {\n     kubectl apply -f - <<EOF\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: kube-dns\n  namespace: kube-system\ndata:\n  stubDomains: |\n    {\"global\": [\"$(kubectl get svc -n istio-system istiocoredns -o jsonpath={.spec.clusterIP})\"]}\nEOF\n}\n\n# Cluster 1\nlog \"Configuring DNS on Cluster 1...\"\nkubectl config use-context $CTX_1\nconfigure_kubedns\nlog \"...done with cluster 1.\"\n\n\n# Cluster 2\nlog \"Configuring DNS on Cluster 2...\"\nkubectl config use-context $CTX_2\nconfigure_kubedns\nlog \"...done with cluster 2.\"\n"
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/4-deploy-onlineboutique-gke.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\n\n# Get the Istio IngressGateway IP for both clusters\nkubectl config use-context $CTX_1\nGWIP1=$(kubectl get -n istio-system service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\n\nkubectl config use-context $CTX_2\nGWIP2=$(kubectl get -n istio-system service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\n\n\n# Populate YAML / Deploy to Cluster 1\nlog \"📸 Deploying OnlineBoutique on Cluster 1...\"\ngcloud config set project $PROJECT_ID\ngcloud container clusters get-credentials $CLUSTER_1_NAME --zone $CLUSTER_1_ZONE\nkubectl config use-context $CTX_1\npattern='.*- address:.*'\nreplace=\"  - address: \"$GWIP2\"\"\ngsed -r -i \"s|$pattern|$replace|g\" cluster1/service-entries.yaml\nkubectl apply -f ./cluster1\nlog \"...done with cluster 1.\"\n\n\n# Populate YAML /  Deploy to Cluster 2\nlog \"📸 Deploying OnlineBoutique on Cluster 2...\"\ngcloud container clusters get-credentials $CLUSTER_2_NAME --zone $CLUSTER_2_ZONE\nkubectl config use-context $CTX_2\npattern='.*- address:.*'\nreplace=\"  - address: \"$GWIP1\"\"\ngsed -r -i \"s|$pattern|$replace|g\" cluster2/service-entries.yaml\nkubectl apply -f ./cluster2\nlog \"...done with cluster 2.\"\n"
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/5-prep-cluster1.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\n# Cluster 1 will oversee the proxy config for istio-gce\n# (but both clusters 1 and 2 will be configured to reach the VM service)\nlog \"📦 Getting cluster 1's info to send to the VM...\"\n\n# Generate cluster.env\nkubectl config set-context ${CTX_1}\nexport ISTIOD_IP=$(kubectl get -n istio-system service istiod -o jsonpath='{.spec.clusterIP}')\nlog \"⛵️ cluster1 istiod IP is $ISTIOD_IP\"\n\nISTIO_SERVICE_CIDR=$(gcloud container clusters describe $CLUSTER_1_NAME --zone $CLUSTER_1_ZONE --project $PROJECT_ID --format \"value(servicesIpv4Cidr)\")\necho -e \"ISTIO_SERVICE_CIDR=$ISTIO_SERVICE_CIDR\\n\" > cluster.env\necho \"ISTIO_INBOUND_PORTS=3550,8080\" >> cluster.env\n\n# client certs\nlog \"Getting client certs...\"\ngo run istio.io/istio/security/tools/generate_cert -client -host spiffee://cluster.local/vm/vmname \\\n --out-priv key.pem --out-cert cert-chain.pem  -mode self-signed\n\n# root cert\nlog \"Getting root cert...\"\nkubectl -n istio-system get cm istio-ca-root-cert -o jsonpath='{.data.root-cert\\.pem}' > root-cert.pem\n"
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/6-prep-vm.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\nlog \"🐳 Setting up the VM and deploying productcatalog...\"\n\n# send certs and cluster.env to VM\ngcloud compute scp --project=${PROJECT_ID} --zone=${GCE_INSTANCE_ZONE} \\\n {key.pem,cert-chain.pem,cluster.env,root-cert.pem,scripts/vm-install-istio.sh,scripts/vm-run-products.sh} ${GCE_INSTANCE_NAME}:\n\n# from the VM, install the Istio sidecar proxy and update /etc/hosts to reach istiod\nkubectl config use-context ${CTX_1}\nexport ISTIOD_IP=$(kubectl get -n istio-system service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\nlog \"⛵️ GWIP is is $ISTIOD_IP\"\n\ngcloud compute --project $PROJECT_ID ssh --zone ${GCE_INSTANCE_ZONE} ${GCE_INSTANCE_NAME} --command=\"ISTIOD_IP=${ISTIOD_IP} ./vm-install-istio.sh\"\n\n# from the VM, install Docker and run productcatalog as a docker container\ngcloud compute --project $PROJECT_ID ssh --zone ${GCE_INSTANCE_ZONE} ${GCE_INSTANCE_NAME} --command=\"./vm-run-products.sh\"\n"
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/7-add-vm-to-mesh.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\nlog \"🕸  Adding VM to the mesh...\"\nexport GCE_IP=$(gcloud --format=\"value(networkInterfaces[0].networkIP)\" compute instances describe ${GCE_INSTANCE_NAME} --zone ${GCE_INSTANCE_ZONE})\nlog \"GCE IP is ${GCE_IP}\"\n\nkubectl config use-context ${CTX_1}\n../../common/istio-1.5.2/bin/istioctl experimental add-to-mesh external-service productcatalogservice ${GCE_IP} grpc:3550 -n default\n\nkubectl config use-context ${CTX_2}\n../../common/istio-1.5.2/bin/istioctl experimental add-to-mesh external-service productcatalogservice ${GCE_IP} grpc:3550 -n default\n\n\nlog \"✅ done.\""
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/8-verify-deploy.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\nkubectl config use-context $CTX_1\nlog \"☸️ Cluster 1 pods:\"\nkubectl get pods\n\nkubectl config use-context $CTX_2\nlog \"☸️ Cluster 2 pods:\"\nkubectl get pods\n\nlog \"🕸 Opening Kiali for cluster 2...\"\nkubectl config use-context $CTX_2\n../../common/istio-1.5.2/bin/istioctl dashboard kiali &\n\n\nlog \"🚲 Open this frontend IP in a browser:\"\nkubectl config use-context $CTX_2\nkubectl get svc -n istio-system istio-ingressgateway | awk '{print $4}'\n"
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/9-deploy-productcatalog-gke.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nsource ./scripts/env.sh\n\n# Get Ingress gateway IP on Cluster 2\nkubectl config use-context $CTX_2\nGWIP2=$(kubectl get -n istio-system service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\n\n# Cluster 1\nlog \"🛍 Prepare for ProductCatalog GKE migration / still sending all traffic to VM...\"\nlog \"☸️   Creating a service entry and virtualservice on cluster1...\"\nkubectl config use-context ${CTX_1}\npattern='.*- address:.*'\nreplace=\"  - address: \"$GWIP2\"\"\ngsed -r -i \"s|$pattern|$replace|g\" productcatalog-gke/serviceentry-cluster1.yaml\nkubectl apply -f productcatalog-gke/serviceentry-cluster1.yaml\nkubectl apply -f productcatalog-gke/vs-0-cluster1.yaml\n\n# Cluster 2\nlog \"☸️   Creating a deployment, service, and virtualservice on cluster2...\"\nkubectl config use-context ${CTX_2}\nkubectl apply -f productcatalog-gke/deployment.yaml\nkubectl apply -f productcatalog-gke/service-cluster2.yaml\nkubectl apply -f productcatalog-gke/vs-0-cluster2.yaml\nlog \"✅  done.\"\n\n\n"
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/env.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nlog() { echo \"$1\" >&2; }\nPROJECT_ID=\"${PROJECT_ID:?PROJECT_ID env variable must be specified}\"\n\n# Cluster 1\nCLUSTER_1_NAME=\"cluster1\"\nCLUSTER_1_ZONE=\"us-west1-b\"\nCTX_1=\"gke_${PROJECT_ID}_${CLUSTER_1_ZONE}_${CLUSTER_1_NAME}\"\n\n# Cluster 2\nCLUSTER_2_NAME=\"cluster2\"\nCLUSTER_2_ZONE=\"us-east1-b\"\nCTX_2=\"gke_${PROJECT_ID}_${CLUSTER_2_ZONE}_${CLUSTER_2_NAME}\"\n\n# VM\nGCE_INSTANCE_NAME=\"istio-gce\"\nGCE_INSTANCE_ZONE=\"us-central1-b\"\nSERVICE_NAMESPACE=\"default\"\nSERVICE_NAME=\"productcatalogservice\"\nSERVICE_PORT_NUMBER=\"3550\"\nSERVICE_PORT_PROTOCOL=\"grpc\""
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/install.yaml",
    "content": "apiVersion: install.istio.io/v1alpha1\nkind: IstioOperator\nspec:\n  addonComponents:\n    grafana:\n      enabled: true\n      k8s:\n        replicaCount: 1\n    istiocoredns:\n      enabled: true\n    kiali:\n      enabled: true\n      k8s:\n        replicaCount: 1\n    prometheus:\n      enabled: true\n      k8s:\n        replicaCount: 1\n    tracing:\n      enabled: true\n  components:\n    base:\n      enabled: true\n    citadel:\n      enabled: false\n      k8s:\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    cni:\n      enabled: false\n    egressGateways:\n    - enabled: false\n      k8s:\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-ingressgateway\n        resources:\n          limits:\n            cpu: 2000m\n            memory: 1024Mi\n          requests:\n            cpu: 100m\n            memory: 128Mi\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n      name: istio-egressgateway\n    galley:\n      enabled: false\n      k8s:\n        replicaCount: 1\n        resources:\n          requests:\n            cpu: 100m\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    ingressGateways:\n    - enabled: true\n      k8s:\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-ingressgateway\n        resources:\n          limits:\n            cpu: 2000m\n            memory: 1024Mi\n          requests:\n            cpu: 100m\n            memory: 128Mi\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n      name: istio-ingressgateway\n    nodeAgent:\n      enabled: false\n    pilot:\n      enabled: true\n      k8s:\n        env:\n        - name: POD_NAME\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.name\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        readinessProbe:\n          httpGet:\n            path: /ready\n            port: 8080\n          initialDelaySeconds: 5\n          periodSeconds: 5\n          timeoutSeconds: 5\n        resources:\n          requests:\n            cpu: 500m\n            memory: 2048Mi\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    policy:\n      enabled: false\n      k8s:\n        env:\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-policy\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    sidecarInjector:\n      enabled: false\n      k8s:\n        replicaCount: 1\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n    telemetry:\n      enabled: false\n      k8s:\n        env:\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        - name: GOMAXPROCS\n          value: \"6\"\n        hpaSpec:\n          maxReplicas: 5\n          metrics:\n          - resource:\n              name: cpu\n              targetAverageUtilization: 80\n            type: Resource\n          minReplicas: 1\n          scaleTargetRef:\n            apiVersion: apps/v1\n            kind: Deployment\n            name: istio-telemetry\n        replicaCount: 1\n        resources:\n          limits:\n            cpu: 4800m\n            memory: 4G\n          requests:\n            cpu: 1000m\n            memory: 1G\n        strategy:\n          rollingUpdate:\n            maxSurge: 100%\n            maxUnavailable: 25%\n  hub: docker.io/istio\n  tag: 1.5.1\n  values:\n    clusterResources: true\n    galley:\n      enableAnalysis: false\n      image: galley\n    gateways:\n      istio-egressgateway:\n        autoscaleEnabled: true\n        env:\n          ISTIO_META_ROUTER_MODE: sni-dnat\n        ports:\n        - name: http2\n          port: 80\n        - name: https\n          port: 443\n        - name: tls\n          port: 15443\n          targetPort: 15443\n        secretVolumes:\n        - mountPath: /etc/istio/egressgateway-certs\n          name: egressgateway-certs\n          secretName: istio-egressgateway-certs\n        - mountPath: /etc/istio/egressgateway-ca-certs\n          name: egressgateway-ca-certs\n          secretName: istio-egressgateway-ca-certs\n        type: ClusterIP\n      istio-ingressgateway:\n        applicationPorts: \"\"\n        autoscaleEnabled: true\n        debug: info\n        domain: \"\"\n        env:\n          ISTIO_META_ROUTER_MODE: sni-dnat\n        meshExpansionPorts:\n        - name: tcp-pilot-grpc-tls\n          port: 15011\n          targetPort: 15011\n        - name: tcp-citadel-grpc-tls\n          port: 8060\n          targetPort: 8060\n        - name: tcp-dns-tls\n          port: 853\n          targetPort: 853\n        ports:\n        - name: status-port\n          port: 15020\n          targetPort: 15020\n        - name: http2\n          port: 80\n          targetPort: 80\n        - name: https\n          port: 443\n        - name: kiali\n          port: 15029\n          targetPort: 15029\n        - name: prometheus\n          port: 15030\n          targetPort: 15030\n        - name: grafana\n          port: 15031\n          targetPort: 15031\n        - name: tracing\n          port: 15032\n          targetPort: 15032\n        - name: tls\n          port: 15443\n          targetPort: 15443\n        sds:\n          enabled: false\n          image: node-agent-k8s\n          resources:\n            limits:\n              cpu: 2000m\n              memory: 1024Mi\n            requests:\n              cpu: 100m\n              memory: 128Mi\n        secretVolumes:\n        - mountPath: /etc/istio/ingressgateway-certs\n          name: ingressgateway-certs\n          secretName: istio-ingressgateway-certs\n        - mountPath: /etc/istio/ingressgateway-ca-certs\n          name: ingressgateway-ca-certs\n          secretName: istio-ingressgateway-ca-certs\n        type: LoadBalancer\n        zvpn:\n          enabled: false\n          suffix: global\n    global:\n      arch:\n        amd64: 2\n        ppc64le: 2\n        s390x: 2\n      certificates: []\n      configValidation: true\n      controlPlaneSecurityEnabled: true\n      defaultNodeSelector: {}\n      defaultPodDisruptionBudget:\n        enabled: true\n      defaultResources:\n        requests:\n          cpu: 10m\n      disablePolicyChecks: true\n      enableHelmTest: false\n      enableTracing: true\n      imagePullPolicy: IfNotPresent\n      imagePullSecrets: []\n      istioNamespace: istio-system\n      istiod:\n        enabled: true\n      jwtPolicy: third-party-jwt\n      k8sIngress:\n        enableHttps: false\n        enabled: false\n        gatewayName: ingressgateway\n      localityLbSetting:\n        enabled: true\n      logAsJson: false\n      logging:\n        level: default:info\n      meshExpansion:\n        enabled: true\n        useILB: false\n      meshNetworks: {}\n      mountMtlsCerts: false\n      mtls:\n        auto: true\n        enabled: false\n      multiCluster:\n        enabled: true\n      network: \"\"\n      omitSidecarInjectorConfigMap: false\n      oneNamespace: false\n      operatorManageWebhooks: false\n      outboundTrafficPolicy:\n        mode: ALLOW_ANY\n      pilotCertProvider: istiod\n      podDNSSearchNamespaces:\n        - global\n        - \"{{ valueOrDefault .DeploymentMeta.Namespace \\\"default\\\" }}.global\"\n      policyCheckFailOpen: false\n      priorityClassName: \"\"\n      proxy:\n        accessLogEncoding: TEXT\n        accessLogFile: \"/dev/stdout\"\n        accessLogFormat: \"\"\n        autoInject: enabled\n        clusterDomain: cluster.local\n        componentLogLevel: misc:error\n        concurrency: 2\n        dnsRefreshRate: 300s\n        enableCoreDump: false\n        envoyAccessLogService:\n          enabled: false\n        envoyMetricsService:\n          enabled: false\n          tcpKeepalive:\n            interval: 10s\n            probes: 3\n            time: 10s\n          tlsSettings:\n            mode: DISABLE\n            subjectAltNames: []\n        envoyStatsd:\n          enabled: false\n        excludeIPRanges: \"\"\n        excludeInboundPorts: \"\"\n        excludeOutboundPorts: \"\"\n        image: proxyv2\n        includeIPRanges: '*'\n        includeInboundPorts: '*'\n        kubevirtInterfaces: \"\"\n        logLevel: warning\n        privileged: false\n        protocolDetectionTimeout: 100ms\n        readinessFailureThreshold: 30\n        readinessInitialDelaySeconds: 1\n        readinessPeriodSeconds: 2\n        resources:\n          limits:\n            cpu: 2000m\n            memory: 1024Mi\n          requests:\n            cpu: 100m\n            memory: 128Mi\n        statusPort: 15020\n        tracer: zipkin\n      proxy_init:\n        image: proxyv2\n        resources:\n          limits:\n            cpu: 100m\n            memory: 50Mi\n          requests:\n            cpu: 10m\n            memory: 10Mi\n      sds:\n        enabled: false\n        token:\n          aud: istio-ca\n        udsPath: \"\"\n      sts:\n        servicePort: 0\n      tracer:\n        datadog:\n          address: $(HOST_IP):8126\n        lightstep:\n          accessToken: \"\"\n          address: \"\"\n          cacertPath: \"\"\n          secure: true\n        stackdriver:\n          debug: false\n          maxNumberOfAnnotations: 200\n          maxNumberOfAttributes: 200\n          maxNumberOfMessageEvents: 200\n        zipkin:\n          address: \"\"\n      trustDomain: cluster.local\n      useMCP: false\n    grafana:\n      accessMode: ReadWriteMany\n      contextPath: /grafana\n      dashboardProviders:\n        dashboardproviders.yaml:\n          apiVersion: 1\n          providers:\n          - disableDeletion: false\n            folder: istio\n            name: istio\n            options:\n              path: /var/lib/grafana/dashboards/istio\n            orgId: 1\n            type: file\n      datasources:\n        datasources.yaml:\n          apiVersion: 1\n      env: {}\n      envSecrets: {}\n      image:\n        repository: grafana/grafana\n        tag: 6.5.2\n      ingress:\n        enabled: false\n        hosts:\n        - grafana.local\n      nodeSelector: {}\n      persist: false\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      security:\n        enabled: false\n        passphraseKey: passphrase\n        secretName: grafana\n        usernameKey: username\n      service:\n        annotations: {}\n        externalPort: 3000\n        name: http\n        type: ClusterIP\n      storageClassName: \"\"\n      tolerations: []\n    istiocoredns:\n      coreDNSImage: coredns/coredns\n      coreDNSPluginImage: istio/coredns-plugin:0.2-istio-1.1\n      coreDNSTag: 1.6.2\n    kiali:\n      contextPath: /kiali\n      createDemoSecret: true\n      dashboard:\n        grafanaInClusterURL: http://grafana:3000\n        jaegerInClusterURL: http://tracing/jaeger\n        passphraseKey: passphrase\n        secretName: kiali\n        usernameKey: username\n        viewOnlyMode: false\n      hub: quay.io/kiali\n      ingress:\n        enabled: false\n        hosts:\n        - kiali.local\n      nodeSelector: {}\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      security:\n        cert_file: /kiali-cert/cert-chain.pem\n        enabled: false\n        private_key_file: /kiali-cert/key.pem\n      tag: v1.14\n    mixer:\n      adapters:\n        kubernetesenv:\n          enabled: true\n        prometheus:\n          enabled: true\n          metricsExpiryDuration: 10m\n        stackdriver:\n          auth:\n            apiKey: \"\"\n            appCredentials: false\n            serviceAccountPath: \"\"\n          enabled: false\n          tracer:\n            enabled: false\n            sampleProbability: 1\n        stdio:\n          enabled: false\n          outputAsJson: false\n        useAdapterCRDs: false\n      policy:\n        adapters:\n          kubernetesenv:\n            enabled: true\n          useAdapterCRDs: false\n        autoscaleEnabled: true\n        image: mixer\n        sessionAffinityEnabled: false\n      telemetry:\n        autoscaleEnabled: true\n        env:\n          GOMAXPROCS: \"6\"\n        image: mixer\n        loadshedding:\n          latencyThreshold: 100ms\n          mode: enforce\n        nodeSelector: {}\n        podAntiAffinityLabelSelector: []\n        podAntiAffinityTermLabelSelector: []\n        replicaCount: 1\n        reportBatchMaxEntries: 100\n        reportBatchMaxTime: 1s\n        sessionAffinityEnabled: false\n        tolerations: []\n    nodeagent:\n      image: node-agent-k8s\n    pilot:\n      appNamespaces: []\n      autoscaleEnabled: true\n      autoscaleMax: 5\n      autoscaleMin: 1\n      configMap: true\n      configNamespace: istio-config\n      cpu:\n        targetAverageUtilization: 80\n      enableProtocolSniffingForInbound: false\n      enableProtocolSniffingForOutbound: true\n      env: {}\n      image: pilot\n      ingress:\n        ingressClass: istio\n        ingressControllerMode: STRICT\n        ingressService: istio-ingressgateway\n      keepaliveMaxServerConnectionAge: 30m\n      meshNetworks:\n        networks: {}\n      nodeSelector: {}\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      policy:\n        enabled: false\n      replicaCount: 1\n      tolerations: []\n      traceSampling: 1\n    prometheus:\n      contextPath: /prometheus\n      hub: docker.io/prom\n      ingress:\n        enabled: false\n        hosts:\n        - prometheus.local\n      nodeSelector: {}\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      provisionPrometheusCert: true\n      retention: 6h\n      scrapeInterval: 15s\n      security:\n        enabled: true\n      tag: v2.15.1\n      tolerations: []\n    security:\n      dnsCerts:\n        istio-pilot-service-account.istio-control: istio-pilot.istio-control\n      enableNamespacesByDefault: true\n      image: citadel\n      selfSigned: true\n    sidecarInjectorWebhook:\n      enableNamespacesByDefault: false\n      image: sidecar_injector\n      injectLabel: istio-injection\n      objectSelector:\n        autoInject: true\n        enabled: false\n      rewriteAppHTTPProbe: false\n      selfSigned: false\n    telemetry:\n      enabled: true\n      v1:\n        enabled: false\n      v2:\n        enabled: true\n        prometheus:\n          enabled: true\n        stackdriver:\n          configOverride: {}\n          enabled: true\n          logging: true\n          monitoring: true\n          topology: true\n    tracing:\n      ingress:\n        enabled: false\n      jaeger:\n        accessMode: ReadWriteMany\n        hub: docker.io/jaegertracing\n        memory:\n          max_traces: 50000\n        persist: false\n        spanStorageType: badger\n        storageClassName: \"\"\n        tag: \"1.16\"\n      nodeSelector: {}\n      opencensus:\n        exporters:\n          stackdriver:\n            enable_tracing: true\n        hub: docker.io/omnition\n        resources:\n          limits:\n            cpu: \"1\"\n            memory: 2Gi\n          requests:\n            cpu: 200m\n            memory: 400Mi\n        tag: 0.1.9\n      podAntiAffinityLabelSelector: []\n      podAntiAffinityTermLabelSelector: []\n      provider: jaeger\n      service:\n        annotations: {}\n        externalPort: 9411\n        name: http-query\n        type: ClusterIP\n      zipkin:\n        hub: docker.io/openzipkin\n        javaOptsHeap: 700\n        maxSpans: 500000\n        node:\n          cpus: 2\n        probeStartupDelay: 200\n        queryPort: 9411\n        resources:\n          limits:\n            cpu: 300m\n            memory: 900Mi\n          requests:\n            cpu: 150m\n            memory: 900Mi\n        tag: 2.14.2\n    version: \"\"\n\n"
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/vm-install-istio.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\n# install the sidecar proxy\ncurl -L https://storage.googleapis.com/istio-release/releases/1.5.1/deb/istio-sidecar.deb > istio-sidecar.deb\nsudo dpkg -i istio-sidecar.deb\n\n# update /etc/hosts\necho \"${ISTIOD_IP} istiod.istio-system.svc\" | sudo tee -a /etc/hosts\n\n# install certs\nsudo mkdir -p /etc/certs\nsudo cp {root-cert.pem,cert-chain.pem,key.pem} /etc/certs\nsudo mkdir -p /var/run/secrets/istio/\nsudo cp root-cert.pem /var/run/secrets/istio/\n\n# install cluster.env\nsudo cp cluster.env /var/lib/istio/envoy\n\n# transfer file ownership to istio proxy\nsudo chown -R istio-proxy /etc/certs /var/lib/istio/envoy /var/run/secrets/istio/\n\n# start Istio\nsudo systemctl start istio"
  },
  {
    "path": "multicluster-gke/vm-migration/scripts/vm-run-products.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# install docker\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -\nsudo add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\";\nsudo apt-get update;\nsudo apt-get install -y docker-ce;\n\n# run productcatalog\nsudo docker run -d -p 3550:3550 gcr.io/google-samples/microservices-demo/productcatalogservice:v0.3.4\n\n"
  },
  {
    "path": "multicluster-ingress/1-create-clusters.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nsource ./common.sh\ngcloud config set project $PROJECT_ID\n\nlog \"Installing kubectx...\"\ncurl -sLO https://raw.githubusercontent.com/ahmetb/kubectx/master/kubectx\nchmod +x kubectx\nkubectx -h\n\nlog \"Creating clusters...\"\nfor svc in \"${CLUSTERS[@]}\" ; do\n    NAME=\"${svc%%:*}\"\n    ZONE=\"${svc##*:}\"\n    gcloud beta container --project ${PROJECT_ID} clusters create ${NAME} --zone ${ZONE} \\\n    --no-enable-basic-auth --release-channel \"regular\" --machine-type \"n1-standard-4\" \\\n    --disk-type \"pd-standard\" --disk-size \"100\" \\\n    --scopes \"https://www.googleapis.com/auth/devstorage.read_only\",\"https://www.googleapis.com/auth/logging.write\",\"https://www.googleapis.com/auth/monitoring\",\"https://www.googleapis.com/auth/servicecontrol\",\"https://www.googleapis.com/auth/service.management.readonly\",\"https://www.googleapis.com/auth/trace.append\" \\\n    --num-nodes \"3\" --enable-stackdriver-kubernetes --enable-ip-alias \\\n    --default-max-pods-per-node \"110\" --addons HorizontalPodAutoscaling,HttpLoadBalancing \\\n    --no-enable-autoupgrade --no-enable-autorepair --async\ndone\n"
  },
  {
    "path": "multicluster-ingress/2-install-istio.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nsource ./common.sh\n\n# Configure kubectx / install Istio\nfor svc in \"${CLUSTERS[@]}\" ; do\n    NAME=\"${svc%%:*}\"\n    ZONE=\"${svc##*:}\"\n\n    gcloud container clusters get-credentials ${NAME} --zone ${ZONE} --project ${PROJECT_ID}\n\n    # rename ctx\n    LONG_CTX=\"gke_${PROJECT_ID}_${ZONE}_${NAME}\"\n    kubectx ${NAME}=${LONG_CTX}\n\n    # install istio on each cluster\n    cd ../common\n    ./install_istio.sh\n    cd ../multicluster-ingress\ndone\n\n"
  },
  {
    "path": "multicluster-ingress/3-deploy-app.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\nsource ./common.sh\n\ndeploy_zone_printer() {\n    kubectx $CTX\n    kubectl label namespace default istio-injection=enabled --overwrite\n    kubectl apply -f $WORKDIR/zone_printer/\n}\n\nfor svc in \"${CLUSTERS[@]}\" ; do\n    CTX=\"${svc%%:*}\"\n    deploy_zone_printer $CTX\ndone\n"
  },
  {
    "path": "multicluster-ingress/4-verify-app.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\nsource ./common.sh\n\nfor svc in \"${CLUSTERS[@]}\" ; do\n    CTX=\"${svc%%:*}\"\n    printf \"\\n\\n Calling ZonePrinter on $CTX...\\n\"\n    kubectx $CTX\n    IP=`kubectl get service/istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}'`\n    curl $IP\ndone\n"
  },
  {
    "path": "multicluster-ingress/5-prep-mci.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nsource ./common.sh\n\nlog \"Adding health check and updating the IngressGateway...\"\nfor svc in \"${CLUSTERS[@]}\" ; do\n    CTX=\"${svc%%:*}\"\n    kubectx $CTX\n\n    # prep ingressgateway to be used as a GCLB backend\n    kubectl apply -f manifests/healthcheck.yaml\n\n    # make the ingressgateway a NodePort svc\n    kubectl -n istio-system patch svc istio-ingressgateway \\\n    --type=json -p=\"$(cat manifests/istio-ingressgateway-patch.json)\" \\\n    --dry-run=true -o yaml | kubectl apply -f -\ndone"
  },
  {
    "path": "multicluster-ingress/6-mci.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nsource ./common.sh\n\nlog \"Installing kubemci...\"\nwget https://storage.googleapis.com/kubemci-release/release/latest/bin/darwin/amd64/kubemci\nsudo chmod +x ./kubemci\n\nlog \"Creating static IP...\"\ngcloud compute addresses create --global zoneprinter-ip\n\nlog \"Creating multicluster ingress...\"\n./kubemci create zoneprinter-ingress \\\n--ingress=manifests/ingress.yaml \\\n--gcp-project=${PROJECT_ID} \\\n--kubeconfig=${KUBECONFIG}\n"
  },
  {
    "path": "multicluster-ingress/7-cleanup.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nsource ./common.sh\n\nlog \"Deleting multicluster ingress...\"\n./kubemci delete zoneprinter-ingress \\\n--ingress=manifests/ingress.yaml \\\n--gcp-project=${PROJECT_ID} \\\n--kubeconfig=${KUBECONFIG}\n\nlog \"Deleting global IP...\"\ngcloud compute addresses delete zoneprinter-ip --global --quiet\n\nlog \"Deleting clusters...\"\nfor svc in \"${CLUSTERS[@]}\" ; do\n    NAME=\"${svc%%:*}\"\n    ZONE=\"${svc##*:}\"\n    gcloud container clusters delete $NAME --zone $ZONE --quiet --async\ndone\n\nlog \"Uninstalling kubemci...\"\nsudo rm -rf $WORKDIR/kubemci\n"
  },
  {
    "path": "multicluster-ingress/README.md",
    "content": "# Geo-Aware Istio Multicluster Ingress\n- [Geo-Aware Istio Multicluster Ingress](#geo-aware-istio-multicluster-ingress)\n  - [Introduction](#introduction)\n  - [Prerequistes](#prerequistes)\n  - [Setup](#setup)\n  - [Install Istio](#install-istio)\n  - [Deploy the Sample App](#deploy-the-sample-app)\n  - [Configure Multicluster Ingress](#configure-multicluster-ingress)\n  - [Standardize NodePort numbers](#standardize-nodeport-numbers)\n  - [Create multicluster ingress](#create-multicluster-ingress)\n  - [Verify Multicluster Ingress](#verify-multicluster-ingress)\n  - [Test Geo-Aware Load Balancing](#test-geo-aware-load-balancing)\n  - [Cleanup](#cleanup)\n  - [Learn More](#learn-more)\n\n\n## Introduction\n\nManaging Kubernetes Ingress traffic is an essential use case. If you are running the same services across multiple GKE clusters/regions, [you can use a GCP HTTP(S) Load Balancer](https://cloud.google.com/kubernetes-engine/docs/how-to/multi-cluster-ingress), configured with a global anycast IP, combined with Ingress resources for your services, to route client traffic to the closest GKE cluster.\n\nBut what if you've installed Istio on your clusters, and want to leverage the policy logic of [Istio `Gateways`](https://istio.io/docs/tasks/traffic-management/ingress/ingress-control/), and at the same time, enable multicluster load balancing? This sample demonstrates how to use the [`kubemci`](https://github.com/GoogleCloudPlatform/k8s-multicluster-ingress) tool to map a global Anycast IP to multiple Istio IngressGateways, running in three separate clusters/regions. In the end, we will show how to route client requests to the closest instance of a service, which is replicated across three clusters.\n\n![arch](images/architecture.png)\n\n## Prerequistes\n\n- One [GCP Project](https://cloud.google.com/resource-manager/docs/creating-managing-projects) with Billing enabled\n- [GCE, Container APIs enabled](https://cloud.google.com/apis/docs/getting-started#enabling_apis)\n- [gcloud](https://cloud.google.com/sdk/install) SDK\n- [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)\n\n## Setup\n\nFirst, set your project ID:\n\n```\nexport PROJECT_ID=\"<your-project-id>\"\n```\n\nEnsure gcloud is authenticated to your account:\n\n```\ngcloud auth login\ngcloud auth application-default login\n```\n\nThen, run the following script to create three GKE clusters in the `us-east`, `us-west`, and `europe-west` regions:\n\n```\n./1-create-clusters.sh\n```\n\nWait for all three clusters to be `RUNNING`:\n\n```\nwatch gcloud container clusters list\n```\n\nAfter a few minutes, you should see:\n\n```\n\nNAME      LOCATION        MASTER_VERSION  MASTER_IP      MACHINE_TYPE   NODE_VERS\nION   NUM_NODES  STATUS\ncluster3  europe-west2-b  1.14.8-gke.12   <IP>  n1-standard-4  1.14.8-gke.12  3          RUNNING\ncluster2  us-east4-a      1.14.8-gke.12   <IP>  n1-standard-4  1.14.8-gke.12  3          RUNNING\ncluster1  us-west2-a      1.14.8-gke.12   <IP>  n1-standard-4  1.14.8-gke.12  3          RUNNING\n```\n\n## Install Istio\n\nInstall the Istio control plane on all three clusters. *Note* - this script may take 5-10 minutes to complete.\n\n```\n./2-install-istio.sh\n```\n\n## Deploy the Sample App\n\nDeploy the [Zone Printer](https://github.com/GoogleCloudPlatform/k8s-multicluster-ingress/tree/ef552c26e53be19e39f0762c675ced21c3ce08ef/examples/zone-printer) sample application on all three clusters. This application is a simple web server that prints the GKE Region/Zone it's running in.\n\n```\n./3-deploy-app.sh\n```\n\nThis script creates four resources:\n1. A Kubernetes Deployment, `zone-printer`\n2. A Kubernetes Service, `zone-printer` (type `ClusterIP`), mapping to the `zone-printer` Deployment\n3. An Istio Gateway, punching port `80` into the default IngressGateway\n4. An Istio `VirtualService` to route inbound requests through the Gateway, to the `zone-printer` Service on port `80`.\n\nNote that right now (and by default), the Istio IngressGateway is mapped to a service type `LoadBalancer`, and has its own separate public IP. We can separately call that IngressGateway IP on all three clusters to verify that the zone printer app is running:\n\n```\n./4-verify-app.sh\n```\n\nYou should see HTML output for each cluster, including reports from three separate regions:\n\n```\n    <h1>us-west2-a!</h1>\n...\n    <h1>Ashburn, Virginia, USA</h1>\n...\n    <h1>London, U.K.</h1>\n```\n\n## Configure Multicluster Ingress\n\nNow we're ready to put a global IP in front of all threy Istio IngressGateways, to enable geo-aware anycast routing.\n\n```\n./5-prep-mci.sh\n```\n\nThis script does the following:\n1. Creates a VirtualService on all three clusters, to set up health checking for the IngressGateway. [This is needed](https://cloud.google.com/kubernetes-engine/docs/concepts/ingress#health_checks) for GCP load balancer health checking. Because the IngressGateway already exposes a `/healthz` endpoint on port `15020`, we just have to do a URL rewrite for requests from the `GoogleHC` user-agent.\n2. Updates the Service type on the Istio IngressGateway on all three clusters, from `LoadBalancer` to `NodePort`. A NodePort service is needed to configure Ingress.\n\n## Standardize NodePort numbers\n\nkubemci requires that all the NodePorts used for the multicluster ingress be the same. Navigate to Cloud Console > Kubernetes Engine > Services & Ingress, and for the service `istio-ingressgateway` on all three services, click \"Edit\" and update the `http2` nodeport to be `30981`:\n\n![nodeport update](screenshots/nodeport.png)\n\n## Create multicluster ingress\n\n```\n./6-mci.sh\n```\n\nThis script does the following:\n1. Reserves a global static IP in your project, named `zoneprinter-ip`.\n2. Installs [`kubemci`](https://github.com/GoogleCloudPlatform/k8s-multicluster-ingress), then uses it to provision a multicluster Ingress, mapping to the three clusters. The `kubemci create` command takes in the following Kubernetes Ingress resource (see `manifests/ingress.yaml`):\n\n\n```YAML\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  name: ingress-zoneprinter\n  namespace: istio-system\n  annotations:\n    kubernetes.io/ingress.global-static-ip-name: zoneprinter-ip\n    kubernetes.io/ingress.class: gce-multi-cluster\nspec:\n  backend:\n    serviceName: istio-ingressgateway\n    servicePort: 80\n```\n\nHere, we're creating an `Ingress` for our existing NodePort backend service, `istio-ingressgateway`. We add the name of the global static IP we reserved, and a multicluster `ingress.class` which tells the kubemci tool to configure Ingress resources on all three clusters in our Kubeconfig. From here, the `kubemci` tool provisions a GCP HTTP(S) Load Balancer, including backend services, url mappings, and firewall rules.\n\nTwo notes about this process:\n1. This is exactly how you'd do multicluster ingress for a single service, representing *one* backend workload (one Kubernetes Service) - the difference is that here, we're instead setting up ingress to an intermediate IngressGateway, allowing us to configure Istio traffic rules for *many* backend workloads, each srepresented by its own Kubernetes Service.\n2. Any multicluster ingress setup assumes that the same workloads (and in this case, traffic rules). We recommend using a Continuous Deployment tool to ensure that all clusters have ths same set of resources.\n\n\n## Verify Multicluster Ingress\n\nVerify that the multicluster ingress was created, by running `./kubemci list`. You should see:\n\n```\nNAME                  IP             CLUSTERS\nzoneprinter-ingress   <your-global-IP>   cluster1, cluster2, cluster3\n```\n\nThen, run:\n\n```\n./kubemci get-status zoneprinter-ingress --gcp-project=${PROJECT_ID}\n```\n\nYou should see:\n```\nLoad balancer zoneprinter-ingress has IPAddress <ip> and is spread across 3 clusters (cluster1,cluster2,cluster3)\n```\n\nBut how does this multi-cluster `zoneprinter-ingress` load balancer translate into individual cluster resources? From `cluster3`, run:\n\n```\nkubectl get ingress ingress-zoneprinter -n istio-system -o yaml\n```\n\nYou should see:\n\n```YAML\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  annotations:\n    ingress.gcp.kubernetes.io/instance-groups: '[{\"Name\":\"k8s-ig--eab086beeb92f4d7\",\"Zone\":\"https://www.googleapis.com/compute/v1/projects/istio-multicluster-ingress/zones/europe-west2-b\"}]'\n    kubernetes.io/ingress.class: gce-multi-cluster\n    kubernetes.io/ingress.global-static-ip-name: zoneprinter-ip\n...\n```\n\nHere, each cluster is its own [instance group](https://cloud.google.com/load-balancing/docs/backend-service#backends) (a managed GKE cluster). If you navigate in the Cloud Console to Network Services > Load Balancing, and click on the load balancer beginning with `mci...`, you should see:\n\n![console-screenshot](images/console-screenshot.png)\n\n\n## Test Geo-Aware Load Balancing\n\nNow that we've configure multicluster ingress for a global anycast IP, we should be able to access the global IP from clients around the world, and be routed to the ZonePrinter running in the closest GKE cluster. **Note**: it may take about 5 minutes to provision the load balancer.\n\nFor instance, from a laptop connected to a network on the East Coast, we're redirected to the `us-east4` cluster:\n\n```\nmokeefe@laptop:~$ curl  34.102.158.9\n<!DOCTYPE html>\n\t\t<h4>Welcome from Google Cloud datacenters at:</h4>\n\t\t<h1>Ashburn, Virginia, USA</h1>\n\t\t<h3>You are now connected to &quot;us-east4-a&quot;</h3>\n\t\t<img src=\"https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg\" style=\"width: 640px; height: auto; border: 1px solid black\"/>\n```\n\nTo test the geo-aware routing further, you can [create Google Compute Engine instances](https://cloud.google.com/compute/docs/instances/create-start-instance) in different regions, ssh into each one, and `curl` the global IP. For instance, a VM in the Netherlands (`europe-west4-a`) is routed to the London (`europe-west2-b`) cluster:\n\n```\nmokeefe@netherlands-client:~$ curl 34.102.158.9\n<!DOCTYPE html>\n                <h4>Welcome from Google Cloud datacenters at:</h4>\n                <h1>London, U.K.</h1>\n                <h3>You are now connected to &quot;europe-west2-b&quot;</h3>\n                <img src=\"https://upload.wikimedia.org/wikipedia/en/a/ae/Flag_of_the_United_Kingdom.svg\" style=\"wid\nth: 640px; height: auto; border: 1px solid black\"/>\n```\n\nAnd a VM in Oregon (`us-west1-b`) is routed to the Los Angeles (`us-west2-a`) cluster:\n\n```\nmokeefe@oregon-client:~$  curl 34.102.158.9\n<!DOCTYPE html>\n                <h4>Welcome from Google Cloud datacenters at:<h4>\n                <h1>us-west2-a!</h1>\n```\n\n🎊 Well done! You just set up geo-aware load balancing for Istio services running across three regions.\n\n## Cleanup\n\nTo delete the resources used in this sample (ingress, static IP, GKE clusters):\n\n```\n./7-cleanup.sh\n```\n\n## Learn More\n\n- [Istio By Example - Ingress (Single Cluster)](https://istiobyexample.dev/ingress/)\n- [Istio Docs - Ingress Gateway](https://istio.io/docs/concepts/traffic-management/#gateways)\n- [Solution: Integrating HTTP(S) Load Balancing with Istio and Cloud Run for Anthos on Google Cloud](https://cloud.google.com/solutions/integrating-https-load-balancing-with-istio-and-cloud-run-for-anthos-deployed-on-gke#top_of_page)"
  },
  {
    "path": "multicluster-ingress/common.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -euo pipefail\nlog() { echo \"$1\" >&2; }\n\nif [ -z \"$PROJECT_ID\" ]\nthen\n    log \"You must set PROJECT_ID to continue.\"\n    exit\nelse\n    PROJECT_ID=$PROJECT_ID\nfi\n\nexport WORKDIR=${WORK_DIR:=\"${PWD}\"}\n\n# 1. los angeles   2. northern virginia    3. london\nCLUSTERS=(\"cluster1:us-west2-a\"\n        \"cluster2:us-east4-a\"\n        \"cluster3:europe-west2-b\")\n\nISTIO_VERSION=\"1.4.1\"\n\nexport KUBECONFIG=$WORKDIR/kubeconfig"
  },
  {
    "path": "multicluster-ingress/manifests/healthcheck.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_multicluster_ingress_manifests_virtualservice_health]\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: health\n  namespace: istio-system\nspec:\n  gateways:\n  - zoneprinter-gateway\n  hosts:\n  - '*'\n  http:\n  - match:\n    - headers:\n        user-agent:\n          prefix: GoogleHC\n      method:\n        exact: GET\n      uri:\n        exact: /\n    rewrite:\n      authority: istio-ingressgateway.istio-system.svc.cluster.local:15020\n      uri: /healthz/ready\n    route:\n    - destination:\n        host: istio-ingressgateway.istio-system.svc.cluster.local\n        port:\n          number: 15020\n# [END istio_multicluster_ingress_manifests_virtualservice_health]\n---\n"
  },
  {
    "path": "multicluster-ingress/manifests/ingress.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_multicluster_ingress_manifests_ingress_ingress_zoneprinter]\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  annotations:\n    kubernetes.io/ingress.class: gce-multi-cluster\n    kubernetes.io/ingress.global-static-ip-name: zoneprinter-ip\n  name: ingress-zoneprinter\n  namespace: istio-system\nspec:\n  backend:\n    serviceName: istio-ingressgateway\n    servicePort: 80\n# [END istio_multicluster_ingress_manifests_ingress_ingress_zoneprinter]\n---\n"
  },
  {
    "path": "multicluster-ingress/manifests/istio-ingressgateway-patch.json",
    "content": "[\n    {\n      \"op\": \"replace\",\n      \"path\": \"/spec/type\",\n      \"value\": \"NodePort\"\n    },\n    {\n      \"op\": \"remove\",\n      \"path\": \"/status\"\n    }\n  ]"
  },
  {
    "path": "multicluster-ingress/zone_printer/deployment.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_multicluster_ingress_zone_printer_deployment_zoneprinter]\napiVersion: apps/v1beta1\nkind: Deployment\nmetadata:\n  labels:\n    app: zoneprinter\n  name: zoneprinter\nspec:\n  selector:\n    matchLabels:\n      app: zoneprinter\n  template:\n    metadata:\n      labels:\n        app: zoneprinter\n    spec:\n      containers:\n      - image: gcr.io/google-samples/zone-printer:0.1\n        name: frontend\n        ports:\n        - containerPort: 80\n# [END istio_multicluster_ingress_zone_printer_deployment_zoneprinter]\n---\n"
  },
  {
    "path": "multicluster-ingress/zone_printer/gateway.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_multicluster_ingress_zone_printer_gateway_zoneprinter_gateway]\napiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n  name: zoneprinter-gateway\nspec:\n  selector:\n    istio: ingressgateway\n  servers:\n  - hosts:\n    - '*'\n    port:\n      name: http\n      number: 80\n      protocol: HTTP\n# [END istio_multicluster_ingress_zone_printer_gateway_zoneprinter_gateway]\n---\n"
  },
  {
    "path": "multicluster-ingress/zone_printer/service.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_multicluster_ingress_zone_printer_service_zoneprinter]\napiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    app: zoneprinter\n  name: zoneprinter\nspec:\n  ports:\n  - name: http\n    port: 80\n    targetPort: 80\n  selector:\n    app: zoneprinter\n  type: ClusterIP\n# [END istio_multicluster_ingress_zone_printer_service_zoneprinter]\n---\n"
  },
  {
    "path": "multicluster-ingress/zone_printer/virtualservice.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_multicluster_ingress_zone_printer_virtualservice_zoneprinter_vs]\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: zoneprinter-vs\nspec:\n  gateways:\n  - zoneprinter-gateway\n  hosts:\n  - '*'\n  http:\n  - route:\n    - destination:\n        host: zoneprinter\n        port:\n          number: 80\n# [END istio_multicluster_ingress_zone_printer_virtualservice_zoneprinter_vs]\n---\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/README.md",
    "content": "# grpc-greeter-go\n\nThis sample application consists of a gRPC server and client.\n\nIt is a adapted from\n[the gRPC-Go helloworld example](https://github.com/grpc/grpc-go/tree/master/examples/helloworld).\n\nThe main changes from the original version are:\n\n- the server returns the hostname where it runs in a gRPC header; and\n\n- the client prints the hostname header from the gRPC response.\n\nThis is useful for testing request routing and load balancing functionality.\n\nWhen running in a Kubernetes cluster, the hostname is the name of the\nKubernetes Pod that served the request.\n\n## Usage\n\nBuild container images for the gRPC client and server:\n\n    docker build client -t grpc-greeter-go-client\n    \n    docker build server -t grpc-greeter-go-server\n\nStart the server:\n\n    docker run --detach --name grpc-server --rm grpc-greeter-go-server --address :8000\n\nRun the client and send three requests:\n\n    docker run --network container:grpc-server --rm grpc-greeter-go-client --address localhost:8000 --insecure --repeat 3\n\nStop the server:\n\n    docker stop grpc-server\n\n## Disclaimer\n\nThis is not an officially supported Google product.\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/client/.dockerignore",
    "content": "# Copyright 2021 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# https://docs.docker.com/engine/reference/builder/#dockerignore-file\n\n**\n!*.go\n!go.*\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/client/.gcloudignore",
    "content": "# Copyright 2021 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# https://cloud.google.com/sdk/gcloud/reference/topic/gcloudignore\n\n#!include:.dockerignore\n!Dockerfile\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/client/Dockerfile",
    "content": "# Copyright 2021 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# https://docs.docker.com/engine/reference/builder/\n\nFROM gcr.io/cloud-builders/go as build\n\nENV GOPATH /go\nENV GO111MODULE on\n\nWORKDIR ${GOPATH}/src\n\nCOPY go.mod go.sum ./\n\nRUN go mod download\n\nCOPY client.go ./\n\nRUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install -installsuffix \"static\" .\n\n# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds\n\nFROM gcr.io/distroless/static:nonroot\n\nCOPY --from=build /go/bin/client /bin/greeter-client\n\nENTRYPOINT [\"/bin/greeter-client\"]\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/client/client.go",
    "content": "/*\n *\n * Original work Copyright 2015 gRPC authors.\n * Modified work Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n/*\n * Changes:\n * 2019-06-24: Log the SayHello response header called hostname\n */\n\n// Package main implements a client for Greeter service.\npackage main\n\nimport (\n\t\"context\"\n\t\"flag\"\n\t\"log\"\n\t\"os\"\n\t\"strings\"\n\t\"time\"\n\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/credentials\"\n\tpb \"google.golang.org/grpc/examples/helloworld/helloworld\"\n\t\"google.golang.org/grpc/metadata\"\n)\n\nconst (\n\tdefaultName = \"world\"\n\ttimeout     = 5 * time.Second\n)\n\nfunc main() {\n\taddress := flag.String(\"address\", \"localhost:50051\", \"host:port of gRPC server\")\n\tcert := flag.String(\"cert\", \"/data/cert.pem\", \"path to TLS certificate\")\n\trepeat := flag.Int(\"repeat\", 9, \"number of unary gRPC requests to send\")\n\tinsecure := flag.Bool(\"insecure\", false, \"connect without TLS\")\n\tflag.Parse()\n\n\t// Set up a connection to the server.\n\tvar conn *grpc.ClientConn\n\tvar err error\n\tif *insecure {\n\t\tconn, err = grpc.Dial(*address, grpc.WithInsecure())\n\t} else {\n\t\ttc, err := credentials.NewClientTLSFromFile(*cert, \"\")\n\t\tif err != nil {\n\t\t\tlog.Fatalf(\"Failed to generate credentials %v\", err)\n\t\t}\n\t\tconn, err = grpc.Dial(*address, grpc.WithTransportCredentials(tc))\n\t}\n\tif err != nil {\n\t\tlog.Fatalf(\"did not connect: %v\", err)\n\t}\n\tdefer conn.Close()\n\tc := pb.NewGreeterClient(conn)\n\n\t// Determine name to send to server.\n\tname := defaultName\n\tnonFlagArgs := make([]string, 0)\n\tfor _, arg := range os.Args {\n\t\tif !strings.HasPrefix(arg, \"--\") {\n\t\t\tnonFlagArgs = append(nonFlagArgs, arg)\n\t\t}\n\t}\n\tif len(nonFlagArgs) > 1 {\n\t\tname = nonFlagArgs[1]\n\t}\n\n\t// Contact the server and print out its response multiple times.\n\tctx, cancel := context.WithTimeout(context.Background(), timeout)\n\tdefer cancel()\n\tfor i := 0; i < *repeat; i++ {\n\t\tvar header metadata.MD\n\t\tr, err := c.SayHello(ctx, &pb.HelloRequest{Name: name}, grpc.Header(&header))\n\t\tif err != nil {\n\t\t\tlog.Fatalf(\"could not greet: %v\", err)\n\t\t}\n\t\thostname := \"unknown\"\n\t\t// [START istio_sample_apps_grpc_greeter_go_client_hostname]\n\t\tif len(header[\"hostname\"]) > 0 {\n\t\t\thostname = header[\"hostname\"][0]\n\t\t}\n\t\tlog.Printf(\"%s from %s\", r.Message, hostname)\n\t\t// [END istio_sample_apps_grpc_greeter_go_client_hostname]\n\t}\n}\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/client/go.mod",
    "content": "// Copyright 2021 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// https://github.com/golang/go/wiki/Modules\n\nmodule github.com/GoogleCloudPlatform/istio-samples/sample-apps/grpc-greeter-go/client\n\ngo 1.14\n\nrequire (\n\tgoogle.golang.org/grpc v1.53.0\n\tgoogle.golang.org/grpc/examples v0.0.0-20210413231917-87eb5b750249\n)\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/client/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=\ncloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=\ncloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=\ncloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=\ncloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=\ncloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=\ncloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=\ncloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=\ncloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=\ncloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=\ncloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=\ncloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=\ncloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=\ncloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=\ncloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U=\ncloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=\ncloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=\ncloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU=\ncloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA=\ncloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM=\ncloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I=\ncloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4=\ncloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw=\ncloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o=\ncloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE=\ncloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw=\ncloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY=\ncloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg=\ncloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI=\ncloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4=\ncloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk=\ncloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc=\ncloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc=\ncloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04=\ncloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno=\ncloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak=\ncloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4=\ncloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0=\ncloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ=\ncloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk=\ncloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0=\ncloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc=\ncloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o=\ncloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s=\ncloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0=\ncloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ=\ncloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY=\ncloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY=\ncloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw=\ncloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI=\ncloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo=\ncloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0=\ncloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0=\ncloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8=\ncloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8=\ncloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM=\ncloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc=\ncloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI=\ncloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE=\ncloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE=\ncloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4=\ncloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA=\ncloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw=\ncloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc=\ncloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY=\ncloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s=\ncloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI=\ncloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y=\ncloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM=\ncloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI=\ncloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0=\ncloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk=\ncloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg=\ncloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590=\ncloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk=\ncloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk=\ncloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U=\ncloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA=\ncloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM=\ncloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk=\ncloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY=\ncloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI=\ncloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4=\ncloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI=\ncloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=\ncloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=\ncloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=\ncloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=\ncloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=\ncloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=\ncloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU=\ncloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=\ncloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=\ncloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE=\ncloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo=\ncloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA=\ncloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU=\ncloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=\ncloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=\ncloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=\ncloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY=\ncloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck=\ncloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg=\ncloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo=\ncloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I=\ncloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4=\ncloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0=\ncloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs=\ncloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc=\ncloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE=\ncloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM=\ncloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM=\ncloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ=\ncloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo=\ncloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE=\ncloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0=\ncloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38=\ncloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w=\ncloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I=\ncloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ=\ncloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA=\ncloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A=\ncloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s=\ncloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI=\ncloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo=\ncloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM=\ncloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo=\ncloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ=\ncloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g=\ncloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4=\ncloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c=\ncloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s=\ncloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4=\ncloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0=\ncloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8=\ncloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek=\ncloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0=\ncloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM=\ncloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q=\ncloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU=\ncloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU=\ncloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k=\ncloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4=\ncloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y=\ncloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg=\ncloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk=\ncloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w=\ncloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU=\ncloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI=\ncloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8=\ncloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc=\ncloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw=\ncloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w=\ncloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI=\ncloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE=\ncloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk=\ncloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg=\ncloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY=\ncloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08=\ncloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM=\ncloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA=\ncloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w=\ncloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM=\ncloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60=\ncloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo=\ncloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o=\ncloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A=\ncloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0=\ncloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0=\ncloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA=\ncloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI=\ncloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc=\ncloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM=\ncloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o=\ncloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c=\ncloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=\ncloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc=\ncloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc=\ncloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg=\ncloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE=\ncloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc=\ncloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A=\ncloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM=\ncloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY=\ncloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs=\ncloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g=\ncloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA=\ncloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg=\ncloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0=\ncloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=\ncloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI=\ncloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE=\ncloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8=\ncloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8=\ncloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08=\ncloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw=\ncloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE=\ncloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc=\ncloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE=\ncloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM=\ncloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI=\ncloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4=\ncloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w=\ncloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE=\ncloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM=\ncloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA=\ncloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY=\ncloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY=\ncloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s=\ncloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8=\ncloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI=\ncloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk=\ncloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4=\ncloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA=\ncloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o=\ncloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM=\ncloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8=\ncloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8=\ncloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4=\ncloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ=\ncloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU=\ncloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY=\ncloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34=\ncloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA=\ncloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0=\ncloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4=\ncloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs=\ncloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA=\ncloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk=\ncloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE=\ncloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc=\ncloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs=\ncloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg=\ncloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo=\ncloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw=\ncloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E=\ncloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU=\ncloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70=\ncloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo=\ncloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0=\ncloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA=\ncloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg=\ncloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE=\ncloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0=\ncloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI=\ncloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0=\ncloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg=\ncloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4=\ncloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o=\ncloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk=\ncloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo=\ncloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE=\ncloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U=\ncloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg=\ncloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4=\ncloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg=\ncloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c=\ncloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs=\ncloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70=\ncloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y=\ncloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A=\ncloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA=\ncloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM=\ncloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA=\ncloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0=\ncloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU=\ncloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg=\ncloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4=\ncloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY=\ncloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc=\ncloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y=\ncloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do=\ncloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo=\ncloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s=\ncloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI=\ncloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk=\ncloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44=\ncloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA=\ncloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4=\ncloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4=\ncloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4=\ncloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0=\ncloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU=\ncloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q=\ncloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA=\ncloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU=\ncloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc=\ncloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk=\ncloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk=\ncloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU=\ncloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s=\ncloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs=\ncloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg=\ncloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4=\ncloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U=\ncloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco=\ncloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo=\ncloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E=\ncloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU=\ncloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4=\ncloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw=\ncloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos=\ncloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM=\ncloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ=\ncloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0=\ncloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ncloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=\ncloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=\ncloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc=\ncloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s=\ncloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w=\ncloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I=\ncloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw=\ncloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g=\ncloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM=\ncloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA=\ncloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8=\ncloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4=\ncloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ=\ncloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg=\ncloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28=\ncloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y=\ncloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs=\ncloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg=\ncloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk=\ncloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw=\ncloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU=\ncloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4=\ncloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M=\ncloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU=\ncloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0=\ncloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo=\ncloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo=\ncloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY=\ncloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E=\ncloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE=\ncloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g=\ncloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208=\ncloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w=\ncloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8=\ncloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE=\ncloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg=\ncloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc=\ncloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A=\ncloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo=\ncloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ=\ncloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0=\ncloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M=\ncloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=\ncloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=\ngithub.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=\ngithub.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=\ngithub.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=\ngithub.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=\ngithub.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=\ngithub.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=\ngithub.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=\ngithub.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=\ngithub.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM=\ngithub.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=\ngithub.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo=\ngithub.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY=\ngithub.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8=\ngithub.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=\ngithub.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=\ngithub.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=\ngithub.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=\ngithub.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=\ngithub.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=\ngo.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=\ngo.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngo.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=\ngolang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw=\ngolang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=\ngolang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=\ngolang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=\ngolang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=\ngolang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=\ngolang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=\ngolang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=\ngolang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=\ngolang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=\ngolang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=\ngolang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=\ngolang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=\ngolang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=\ngoogle.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=\ngoogle.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=\ngoogle.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=\ngoogle.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=\ngoogle.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=\ngoogle.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=\ngoogle.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=\ngoogle.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=\ngoogle.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=\ngoogle.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=\ngoogle.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=\ngoogle.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=\ngoogle.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=\ngoogle.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo=\ngoogle.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g=\ngoogle.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=\ngoogle.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=\ngoogle.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=\ngoogle.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=\ngoogle.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=\ngoogle.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw=\ngoogle.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg=\ngoogle.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o=\ngoogle.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g=\ngoogle.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw=\ngoogle.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw=\ngoogle.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI=\ngoogle.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=\ngoogle.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=\ngoogle.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=\ngoogle.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08=\ngoogle.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70=\ngoogle.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo=\ngoogle.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=\ngoogle.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=\ngoogle.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=\ngoogle.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=\ngoogle.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=\ngoogle.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=\ngoogle.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=\ngoogle.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=\ngoogle.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=\ngoogle.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=\ngoogle.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=\ngoogle.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=\ngoogle.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=\ngoogle.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=\ngoogle.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=\ngoogle.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=\ngoogle.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=\ngoogle.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=\ngoogle.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=\ngoogle.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=\ngoogle.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=\ngoogle.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=\ngoogle.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=\ngoogle.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=\ngoogle.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=\ngoogle.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=\ngoogle.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=\ngoogle.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=\ngoogle.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=\ngoogle.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=\ngoogle.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=\ngoogle.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=\ngoogle.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=\ngoogle.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=\ngoogle.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=\ngoogle.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE=\ngoogle.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc=\ngoogle.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=\ngoogle.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=\ngoogle.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=\ngoogle.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=\ngoogle.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=\ngoogle.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=\ngoogle.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=\ngoogle.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=\ngoogle.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=\ngoogle.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=\ngoogle.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw=\ngoogle.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI=\ngoogle.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI=\ngoogle.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U=\ngoogle.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=\ngoogle.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=\ngoogle.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=\ngoogle.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=\ngoogle.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo=\ngoogle.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=\ngoogle.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=\ngoogle.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=\ngoogle.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=\ngoogle.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE=\ngoogle.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w=\ngoogle.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\ngoogle.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=\ngoogle.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=\ngoogle.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=\ngoogle.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=\ngoogle.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=\ngoogle.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=\ngoogle.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=\ngoogle.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=\ngoogle.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=\ngoogle.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=\ngoogle.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=\ngoogle.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=\ngoogle.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=\ngoogle.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc=\ngoogle.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=\ngoogle.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=\ngoogle.golang.org/grpc/examples v0.0.0-20210413231917-87eb5b750249 h1:ImEKyxeibg94nk1ikztcea6Uf44DfV5nLcHY0Dy5jHs=\ngoogle.golang.org/grpc/examples v0.0.0-20210413231917-87eb5b750249/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/manifests/greeter-istio-destinationrule.yaml",
    "content": "\n# Copyright 2021 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_grpc_greeter_go_manifests_destinationrule_greeter]\napiVersion: networking.istio.io/v1beta1\nkind: DestinationRule\nmetadata:\n  name: greeter\nspec:\n  host: greeter\n  trafficPolicy:\n    loadBalancer:\n      simple: ROUND_ROBIN\n    tls:\n      mode: ISTIO_MUTUAL\n# [END istio_grpc_greeter_go_manifests_destinationrule_greeter]\n---\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/manifests/greeter-istio-gateway.yaml",
    "content": "\n# Copyright 2021 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_grpc_greeter_go_manifests_gateway_greeter]\napiVersion: networking.istio.io/v1beta1\nkind: Gateway\nmetadata:\n  name: greeter\nspec:\n  selector:\n    istio: ingressgateway\n  servers:\n  - hosts:\n    - '*'\n    port:\n      name: https\n      number: 443\n      protocol: HTTPS\n    tls:\n      credentialName: istio-ingressgateway-certs\n      mode: SIMPLE\n# [END istio_grpc_greeter_go_manifests_gateway_greeter]\n---\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/manifests/greeter-istio-virtualservice.yaml",
    "content": "\n# Copyright 2021 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_grpc_greeter_go_manifests_virtualservice_greeter]\napiVersion: networking.istio.io/v1beta1\nkind: VirtualService\nmetadata:\n  name: greeter\nspec:\n  gateways:\n  - greeter\n  hosts:\n  - '*'\n  http:\n  - match:\n    - uri:\n        prefix: /\n    route:\n    - destination:\n        host: greeter\n        port:\n          number: 8080\n# [END istio_grpc_greeter_go_manifests_virtualservice_greeter]\n---\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/manifests/greeter-k8s.template.yaml",
    "content": "\n# Copyright 2021 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_grpc_greeter_go_manifests_deployment_greeter]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: greeter\nspec:\n  replicas: 3\n  selector:\n    matchLabels:\n      app: greeter\n  template:\n    metadata:\n      labels:\n        app: greeter\n    spec:\n      containers:\n      - args:\n        - --address=127.0.0.1:8080\n        image: gcr.io/$GOOGLE_CLOUD_PROJECT/grpc-greeter-go-server\n        imagePullPolicy: Always\n        name: greeter\n        ports:\n        - containerPort: 8080\n        readinessProbe:\n          exec:\n            command:\n            - /bin/grpc_health_probe\n            - -addr=:8080\n          initialDelaySeconds: 2\n# [END istio_grpc_greeter_go_manifests_deployment_greeter]\n---\n# [START istio_grpc_greeter_go_manifests_service_greeter]\napiVersion: v1\nkind: Service\nmetadata:\n  name: greeter\nspec:\n  ports:\n  - name: grpc\n    port: 8080\n    protocol: TCP\n  selector:\n    app: greeter\n  type: ClusterIP\n# [END istio_grpc_greeter_go_manifests_service_greeter]\n---\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/manifests/istio-operator.yaml",
    "content": "# Copyright 2021 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# https://istio.io/latest/docs/reference/config/istio.operator.v1alpha1/\n\n# [START istio_grpc_greeter_go_manifests_istio_operator]\napiVersion: install.istio.io/v1alpha1\nkind: IstioOperator\nmetadata:\n  annotations:\n    config.kubernetes.io/local-config: \"true\"\nspec:\n  profile: empty\n  hub: gcr.io/istio-release\n  components:\n    base:\n      enabled: true\n    pilot:\n      enabled: true\n    ingressGateways:\n    - name: istio-ingressgateway\n      enabled: true\n      k8s:\n        serviceAnnotations:\n          networking.gke.io/load-balancer-type: Internal\n          networking.gke.io/internal-load-balancer-allow-global-access: \"true\"\n# [END istio_grpc_greeter_go_manifests_istio_operator]\n---\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/server/.dockerignore",
    "content": "# Copyright 2021 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# https://docs.docker.com/engine/reference/builder/#dockerignore-file\n\n**\n!*.go\n!go.*\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/server/.gcloudignore",
    "content": "# Copyright 2021 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# https://cloud.google.com/sdk/gcloud/reference/topic/gcloudignore\n\n#!include:.dockerignore\n!Dockerfile\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/server/Dockerfile",
    "content": "# Copyright 2021 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# https://docs.docker.com/engine/reference/builder/\n\nFROM gcr.io/cloud-builders/go as build\n\nENV GOPATH /go\nENV GO111MODULE on\n\nWORKDIR ${GOPATH}/src\n\nRUN wget -O /bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/v0.3.6/grpc_health_probe-linux-amd64 && \\\n    chmod +x /bin/grpc_health_probe\n\nCOPY go.mod go.sum ./\n\nRUN go mod download\n\nCOPY server.go ./\n\nRUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install -installsuffix \"static\" .\n\n# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds\n\nFROM gcr.io/distroless/static:nonroot\n\nCOPY --from=build /bin/grpc_health_probe /bin/grpc_health_probe\nCOPY --from=build /go/bin/server /bin/greeter-server\n\nENTRYPOINT [\"/bin/greeter-server\"]\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/server/go.mod",
    "content": "// Copyright 2021 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// https://github.com/golang/go/wiki/Modules\n\nmodule github.com/GoogleCloudPlatform/istio-samples/sample-apps/grpc-greeter-go/server\n\ngo 1.14\n\nrequire (\n\tgoogle.golang.org/grpc v1.53.0\n\tgoogle.golang.org/grpc/examples v0.0.0-20210413231917-87eb5b750249\n)\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/server/go.sum",
    "content": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=\ncloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=\ncloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=\ncloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=\ncloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=\ncloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=\ncloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\ncloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=\ncloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=\ncloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=\ncloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=\ncloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=\ncloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=\ncloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=\ncloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=\ncloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=\ncloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=\ncloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=\ncloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=\ncloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=\ncloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=\ncloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=\ncloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=\ncloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U=\ncloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=\ncloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=\ncloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU=\ncloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA=\ncloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM=\ncloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I=\ncloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4=\ncloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw=\ncloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o=\ncloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE=\ncloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw=\ncloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY=\ncloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg=\ncloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI=\ncloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4=\ncloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk=\ncloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc=\ncloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc=\ncloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04=\ncloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno=\ncloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak=\ncloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4=\ncloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0=\ncloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ=\ncloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk=\ncloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0=\ncloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc=\ncloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o=\ncloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s=\ncloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0=\ncloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ=\ncloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY=\ncloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY=\ncloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw=\ncloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI=\ncloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo=\ncloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0=\ncloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0=\ncloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8=\ncloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8=\ncloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM=\ncloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc=\ncloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI=\ncloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE=\ncloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE=\ncloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4=\ncloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8=\ncloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=\ncloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=\ncloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=\ncloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=\ncloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=\ncloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=\ncloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA=\ncloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw=\ncloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc=\ncloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY=\ncloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s=\ncloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI=\ncloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y=\ncloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM=\ncloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI=\ncloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0=\ncloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk=\ncloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg=\ncloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590=\ncloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk=\ncloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk=\ncloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U=\ncloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA=\ncloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM=\ncloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk=\ncloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY=\ncloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI=\ncloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4=\ncloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI=\ncloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=\ncloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=\ncloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=\ncloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=\ncloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=\ncloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=\ncloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU=\ncloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=\ncloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=\ncloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE=\ncloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo=\ncloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA=\ncloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU=\ncloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=\ncloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=\ncloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=\ncloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY=\ncloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck=\ncloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg=\ncloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo=\ncloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I=\ncloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4=\ncloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0=\ncloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs=\ncloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc=\ncloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE=\ncloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM=\ncloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM=\ncloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ=\ncloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo=\ncloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE=\ncloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0=\ncloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38=\ncloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w=\ncloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I=\ncloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ=\ncloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA=\ncloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A=\ncloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s=\ncloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI=\ncloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo=\ncloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA=\ncloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=\ncloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=\ncloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM=\ncloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo=\ncloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ=\ncloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g=\ncloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4=\ncloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c=\ncloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s=\ncloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4=\ncloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0=\ncloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8=\ncloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek=\ncloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0=\ncloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM=\ncloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q=\ncloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU=\ncloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU=\ncloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k=\ncloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4=\ncloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y=\ncloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg=\ncloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk=\ncloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w=\ncloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU=\ncloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI=\ncloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8=\ncloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc=\ncloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw=\ncloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w=\ncloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI=\ncloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE=\ncloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk=\ncloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg=\ncloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY=\ncloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08=\ncloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM=\ncloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA=\ncloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w=\ncloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM=\ncloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60=\ncloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo=\ncloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o=\ncloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A=\ncloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0=\ncloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0=\ncloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA=\ncloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI=\ncloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc=\ncloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM=\ncloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o=\ncloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c=\ncloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=\ncloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc=\ncloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc=\ncloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg=\ncloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE=\ncloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc=\ncloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A=\ncloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM=\ncloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY=\ncloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs=\ncloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g=\ncloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA=\ncloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg=\ncloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0=\ncloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=\ncloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI=\ncloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE=\ncloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8=\ncloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8=\ncloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08=\ncloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw=\ncloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE=\ncloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc=\ncloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE=\ncloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM=\ncloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI=\ncloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4=\ncloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w=\ncloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE=\ncloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM=\ncloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA=\ncloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY=\ncloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY=\ncloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s=\ncloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8=\ncloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI=\ncloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk=\ncloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4=\ncloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA=\ncloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o=\ncloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM=\ncloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8=\ncloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8=\ncloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4=\ncloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ=\ncloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU=\ncloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY=\ncloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34=\ncloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA=\ncloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0=\ncloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4=\ncloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs=\ncloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA=\ncloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk=\ncloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE=\ncloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc=\ncloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs=\ncloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg=\ncloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo=\ncloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw=\ncloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E=\ncloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU=\ncloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70=\ncloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo=\ncloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0=\ncloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA=\ncloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg=\ncloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE=\ncloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0=\ncloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI=\ncloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=\ncloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=\ncloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=\ncloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=\ncloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI=\ncloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0=\ncloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg=\ncloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4=\ncloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o=\ncloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk=\ncloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo=\ncloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE=\ncloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U=\ncloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg=\ncloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4=\ncloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg=\ncloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c=\ncloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs=\ncloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70=\ncloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y=\ncloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A=\ncloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA=\ncloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM=\ncloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA=\ncloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0=\ncloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU=\ncloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg=\ncloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4=\ncloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY=\ncloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc=\ncloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y=\ncloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do=\ncloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo=\ncloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s=\ncloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI=\ncloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk=\ncloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44=\ncloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA=\ncloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4=\ncloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4=\ncloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4=\ncloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0=\ncloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU=\ncloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q=\ncloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA=\ncloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU=\ncloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc=\ncloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk=\ncloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk=\ncloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU=\ncloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s=\ncloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs=\ncloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg=\ncloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4=\ncloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U=\ncloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco=\ncloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo=\ncloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E=\ncloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU=\ncloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4=\ncloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw=\ncloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos=\ncloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM=\ncloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ=\ncloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0=\ncloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco=\ncloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=\ncloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=\ncloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=\ncloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=\ncloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=\ncloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=\ncloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=\ncloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc=\ncloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s=\ncloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w=\ncloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I=\ncloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw=\ncloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g=\ncloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM=\ncloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA=\ncloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8=\ncloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4=\ncloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ=\ncloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg=\ncloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28=\ncloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y=\ncloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs=\ncloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg=\ncloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk=\ncloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw=\ncloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU=\ncloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4=\ncloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M=\ncloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU=\ncloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0=\ncloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo=\ncloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo=\ncloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY=\ncloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E=\ncloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE=\ncloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g=\ncloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208=\ncloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w=\ncloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8=\ncloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE=\ncloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg=\ncloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc=\ncloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A=\ncloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo=\ncloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ=\ncloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0=\ncloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M=\ncloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=\ncloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\ngithub.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=\ngithub.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=\ngithub.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\ngithub.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=\ngithub.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=\ngithub.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=\ngithub.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=\ngithub.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=\ngithub.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=\ngithub.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=\ngithub.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=\ngithub.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=\ngithub.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=\ngithub.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\ngithub.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=\ngithub.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=\ngithub.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=\ngithub.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=\ngithub.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=\ngithub.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=\ngithub.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=\ngithub.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=\ngithub.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=\ngithub.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM=\ngithub.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=\ngithub.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo=\ngithub.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY=\ngithub.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8=\ngithub.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=\ngithub.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=\ngithub.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=\ngithub.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=\ngithub.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=\ngithub.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=\ngithub.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=\ngithub.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngo.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=\ngo.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=\ngo.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=\ngo.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=\ngo.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=\ngo.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=\ngolang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=\ngolang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=\ngolang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=\ngolang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\ngolang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=\ngolang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=\ngolang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw=\ngolang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=\ngolang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=\ngolang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=\ngolang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=\ngolang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=\ngolang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=\ngolang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=\ngolang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=\ngolang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=\ngolang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=\ngolang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=\ngolang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=\ngolang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=\ngolang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=\ngolang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=\ngolang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=\ngolang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=\ngolang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=\ngolang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=\ngoogle.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=\ngoogle.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=\ngoogle.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=\ngoogle.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=\ngoogle.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=\ngoogle.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=\ngoogle.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=\ngoogle.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=\ngoogle.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=\ngoogle.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=\ngoogle.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=\ngoogle.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=\ngoogle.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=\ngoogle.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=\ngoogle.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=\ngoogle.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=\ngoogle.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=\ngoogle.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=\ngoogle.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=\ngoogle.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=\ngoogle.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=\ngoogle.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo=\ngoogle.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g=\ngoogle.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=\ngoogle.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=\ngoogle.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=\ngoogle.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=\ngoogle.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=\ngoogle.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw=\ngoogle.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg=\ngoogle.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o=\ngoogle.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g=\ngoogle.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw=\ngoogle.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw=\ngoogle.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI=\ngoogle.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=\ngoogle.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=\ngoogle.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=\ngoogle.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08=\ngoogle.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70=\ngoogle.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo=\ngoogle.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=\ngoogle.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\ngoogle.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=\ngoogle.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=\ngoogle.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=\ngoogle.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=\ngoogle.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=\ngoogle.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\ngoogle.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=\ngoogle.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=\ngoogle.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=\ngoogle.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=\ngoogle.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=\ngoogle.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=\ngoogle.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=\ngoogle.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=\ngoogle.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=\ngoogle.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=\ngoogle.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=\ngoogle.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=\ngoogle.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=\ngoogle.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=\ngoogle.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=\ngoogle.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=\ngoogle.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=\ngoogle.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=\ngoogle.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=\ngoogle.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=\ngoogle.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=\ngoogle.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=\ngoogle.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=\ngoogle.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=\ngoogle.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=\ngoogle.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=\ngoogle.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=\ngoogle.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=\ngoogle.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=\ngoogle.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=\ngoogle.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=\ngoogle.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=\ngoogle.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=\ngoogle.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=\ngoogle.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=\ngoogle.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE=\ngoogle.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc=\ngoogle.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=\ngoogle.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=\ngoogle.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=\ngoogle.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=\ngoogle.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=\ngoogle.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=\ngoogle.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=\ngoogle.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=\ngoogle.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=\ngoogle.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=\ngoogle.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw=\ngoogle.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI=\ngoogle.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI=\ngoogle.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U=\ngoogle.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=\ngoogle.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=\ngoogle.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=\ngoogle.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=\ngoogle.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo=\ngoogle.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=\ngoogle.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=\ngoogle.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=\ngoogle.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=\ngoogle.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE=\ngoogle.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w=\ngoogle.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\ngoogle.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=\ngoogle.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=\ngoogle.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\ngoogle.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=\ngoogle.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\ngoogle.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\ngoogle.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=\ngoogle.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=\ngoogle.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=\ngoogle.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=\ngoogle.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=\ngoogle.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=\ngoogle.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=\ngoogle.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=\ngoogle.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=\ngoogle.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=\ngoogle.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=\ngoogle.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=\ngoogle.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=\ngoogle.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=\ngoogle.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc=\ngoogle.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=\ngoogle.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=\ngoogle.golang.org/grpc/examples v0.0.0-20210413231917-87eb5b750249 h1:ImEKyxeibg94nk1ikztcea6Uf44DfV5nLcHY0Dy5jHs=\ngoogle.golang.org/grpc/examples v0.0.0-20210413231917-87eb5b750249/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngoogle.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=\ngoogle.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nhonnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nrsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=\nrsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=\nrsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n"
  },
  {
    "path": "sample-apps/grpc-greeter-go/server/server.go",
    "content": "/*\n *\n * Original work Copyright 2015 gRPC authors\n * Modified work Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n/*\n * Changes:\n * 2019-06-24: SayHello returns hostname in response header\n * 2021-04-15: Add UnimplementedGreeterServer as required for forward compatibility\n */\n\n//go:generate protoc -I ../helloworld --go_out=plugins=grpc:../helloworld ../helloworld/helloworld.proto\n\n// Package main implements a server for Greeter service.\npackage main\n\nimport (\n\t\"context\"\n\t\"flag\"\n\t\"log\"\n\t\"net\"\n\t\"os\"\n\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\tpb \"google.golang.org/grpc/examples/helloworld/helloworld\"\n\thealthpb \"google.golang.org/grpc/health/grpc_health_v1\"\n\t\"google.golang.org/grpc/metadata\"\n\t\"google.golang.org/grpc/status\"\n)\n\ntype greeterServer struct {\n\tpb.UnimplementedGreeterServer\n}\n\n// SayHello implements helloworld.GreeterServer\nfunc (s *greeterServer) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {\n\tlog.Printf(\"Received: %v\", in.Name)\n\t// [START istio_sample_apps_grpc_greeter_go_server_hostname]\n\thostname, err := os.Hostname()\n\tif err != nil {\n\t\tlog.Printf(\"Unable to get hostname %v\", err)\n\t}\n\tif hostname != \"\" {\n\t\tgrpc.SendHeader(ctx, metadata.Pairs(\"hostname\", hostname))\n\t}\n\t// [END istio_sample_apps_grpc_greeter_go_server_hostname]\n\treturn &pb.HelloReply{Message: \"Hello \" + in.Name}, nil\n}\n\ntype healthServer struct{}\n\n// Check is used for health checks\nfunc (s *healthServer) Check(ctx context.Context, in *healthpb.HealthCheckRequest) (*healthpb.HealthCheckResponse, error) {\n\tlog.Printf(\"Handling Check request [%v]\", in, ctx)\n\treturn &healthpb.HealthCheckResponse{Status: healthpb.HealthCheckResponse_SERVING}, nil\n}\n\n// Watch is not implemented\nfunc (s *healthServer) Watch(in *healthpb.HealthCheckRequest, srv healthpb.Health_WatchServer) error {\n\treturn status.Error(codes.Unimplemented, \"Watch is not implemented\")\n}\n\nfunc main() {\n\taddress := flag.String(\"address\", \":50051\", \"address to listen on\")\n\tflag.Parse()\n\tlis, err := net.Listen(\"tcp\", *address)\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to listen: %v\", err)\n\t}\n\ts := grpc.NewServer()\n\tpb.RegisterGreeterServer(s, &greeterServer{})\n\thealthpb.RegisterHealthServer(s, &healthServer{})\n\tlog.Printf(\"Listening on address %s\", *address)\n\tif err := s.Serve(lis); err != nil {\n\t\tlog.Fatalf(\"failed to serve: %v\", err)\n\t}\n}\n"
  },
  {
    "path": "sample-apps/helloserver/README.md",
    "content": "## Sample App: helloserver \n\nThe `helloserver` application is a small sample application designed to be used for \"hello world\" Istio demos. \n\nThe application consists of two services:\n1) `helloserver`, a tiny HTTP server written in Python. The `GET /` endpoint returns `hello world` \n2) `loadgen`, a Python script that can generate a configurable number of requests to `helloserver`. The loadgen is designed to generate observability metrics for Istio and Kiali.   \n\nFor a more complex microservices example, see the [Hipstershop Demo](https://github.com/GoogleCloudPlatform/microservices-demo)."
  },
  {
    "path": "sample-apps/helloserver/loadgen/Dockerfile",
    "content": "FROM gcr.io/google-samples/istio-samples/helloserver/loadgen-base as final\n\n# Enable unbuffered logging\nENV PYTHONUNBUFFERED=1\n\nRUN apt-get -qq update \\\n    && apt-get install -y --no-install-recommends \\\n        wget\n\nWORKDIR /loadgen\n\n# Add the application\nCOPY . .\n\nEXPOSE 8080\nENTRYPOINT [ \"python\", \"loadgen.py\" ]"
  },
  {
    "path": "sample-apps/helloserver/loadgen/Dockerfile-base",
    "content": "FROM python:3-slim as builder\n\nRUN apt-get -qq update \\\n    && apt-get install -y --no-install-recommends \\\n        g++ \\\n    && rm -rf /var/lib/apt/lists/*\n\n# get packages\nCOPY requirements.txt .\nRUN pip install -r requirements.txt"
  },
  {
    "path": "sample-apps/helloserver/loadgen/loadgen.py",
    "content": "# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport threading\nimport datetime\nimport schedule\nimport os\nimport time\nimport grequests\n\ndef exception_handler(request, exception):\n    print(\"Request failed: %s\" % exception)\n\n\ndef callserver():\n    urls = [url]*c  # number of concurrent requests per second\n\n    rs = (grequests.get(u) for u in urls)\n    grequests.map(rs, exception_handler=exception_handler)\n    print(\"%s request(s) complete to %s\" % (c, url))\n\n\n# start loadgen\nurl = os.getenv('SERVER_ADDR')\nif url is None:\n   print(\"SERVER_ADDR env variable is not defined\")\n   exit(1)\n\nc_str = os.getenv('REQUESTS_PER_SECOND')\nif c_str is None:\n   print(\"REQUESTS_PER_SECOND env variable is not defined\")\n   exit(1)\n\nc = int(c_str)\n\nnow = datetime.datetime.now()\nprint(\"🚀 Starting loadgen: %s\" % now)\nschedule.every(1).seconds.do(callserver)\n\nwhile 1:\n   schedule.run_pending()\n   time.sleep(1)"
  },
  {
    "path": "sample-apps/helloserver/loadgen/loadgen.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_helloserver_loadgen_deployment_loadgenerator]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: loadgenerator\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: loadgenerator\n  template:\n    metadata:\n      labels:\n        app: loadgenerator\n    spec:\n      containers:\n      - env:\n        - name: SERVER_ADDR\n          value: http://hellosvc:80/\n        - name: REQUESTS_PER_SECOND\n          value: '10'\n        image: gcr.io/google-samples/istio/loadgen:v0.0.1\n        imagePullPolicy: Always\n        name: main\n        resources:\n          limits:\n            cpu: 500m\n            memory: 512Mi\n          requests:\n            cpu: 300m\n            memory: 256Mi\n      restartPolicy: Always\n      terminationGracePeriodSeconds: 5\n# [END istio_helloserver_loadgen_deployment_loadgenerator]\n---\n# [START istio_helloserver_loadgen_service_loadgensvc]\napiVersion: v1\nkind: Service\nmetadata:\n  name: loadgensvc\nspec:\n  ports:\n  - name: http\n    port: 80\n    targetPort: 8080\n  selector:\n    app: loadgenerator\n  type: ClusterIP\n# [END istio_helloserver_loadgen_service_loadgensvc]\n---\n"
  },
  {
    "path": "sample-apps/helloserver/loadgen/requirements.txt",
    "content": "grequests==0.3.0\nrequests==2.31.0\nschedule==0.6.0\n"
  },
  {
    "path": "sample-apps/helloserver/server/Dockerfile",
    "content": "FROM python:3.9-slim as base\nFROM base as builder\nRUN apt-get -qq update \\\n    && apt-get install -y --no-install-recommends \\\n        g++ \\\n    && rm -rf /var/lib/apt/lists/*\n\n# Enable unbuffered logging\nFROM base as final\nENV PYTHONUNBUFFERED=1\n\nRUN apt-get -qq update \\\n    && apt-get install -y --no-install-recommends \\\n        wget\n\nWORKDIR /helloserver\n\n# Grab packages from builder\nCOPY --from=builder /usr/local/lib/python3.9/ /usr/local/lib/python3.9/\n\n# Add the application\nCOPY . .\n\nEXPOSE 8080\nENTRYPOINT [ \"python\", \"server.py\" ]\n"
  },
  {
    "path": "sample-apps/helloserver/server/server.py",
    "content": "#!/usr/bin/env python3\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom http.server import BaseHTTPRequestHandler, HTTPServer\nimport logging\n\nclass S(BaseHTTPRequestHandler):\n    def _set_response(self):\n        self.send_response(200)\n        self.send_header('Content-type', 'text/html')\n        self.end_headers()\n\n    def do_GET(self):\n        logging.info(\"GET request,\\nPath: %s\\nHeaders:\\n%s\\n\", str(self.path), str(self.headers))\n        self._set_response()\n        self.wfile.write(\"Hello World! {}\".format(self.path).encode('utf-8'))\n\n# HTTP Server runs on port 8080\ndef run(server_class=HTTPServer, handler_class=S, port=8080):\n    logging.basicConfig(level=logging.INFO)\n    server_address = ('', port)\n    httpd = server_class(server_address, handler_class)\n    logging.info('Starting server...\\n')\n\n    # start listening\n    try:\n        httpd.serve_forever()\n    except KeyboardInterrupt:\n        pass\n    httpd.server_close()\n    logging.info('Stopping...\\n')\n\nif __name__ == '__main__':\n    from sys import argv\n\n    if len(argv) == 2:\n        run(port=int(argv[1]))\n    else:\n        run()"
  },
  {
    "path": "sample-apps/helloserver/server/server.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_helloserver_server_deployment_helloserver]\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: helloserver\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: helloserver\n  template:\n    metadata:\n      labels:\n        app: helloserver\n    spec:\n      containers:\n      - image: gcr.io/google-samples/istio/helloserver:v0.0.1\n        imagePullPolicy: Always\n        name: main\n      restartPolicy: Always\n      terminationGracePeriodSeconds: 5\n# [END istio_helloserver_server_deployment_helloserver]\n---\n# [START istio_helloserver_server_service_hellosvc]\napiVersion: v1\nkind: Service\nmetadata:\n  name: hellosvc\nspec:\n  ports:\n  - name: http\n    port: 80\n    targetPort: 8080\n  selector:\n    app: helloserver\n  type: LoadBalancer\n# [END istio_helloserver_server_service_hellosvc]\n---\n"
  },
  {
    "path": "security-intro/README.md",
    "content": "# Demo: Introduction to Istio Security\n\nThis example demonstrates how to leverage [Istio's](https://istio.io/docs/concepts/security/) **identity** and **access control** policies to help secure microservices running on [GKE](https://cloud.google.com/kubernetes-engine/).\n\nWe'll use the [Hipstershop](https://github.com/GoogleCloudPlatform/microservices-demo) sample application to cover:\n\n*   Incrementally adopting Istio **strict mutual TLS** authentication across the service mesh\n*   Enabling **JWT** authentication for the frontend service\n*   Using an Istio **authorization policy** to secure access to the frontend service\n\n### Contents\n\n- [Demo: Introduction to Istio Security](#demo-introduction-to-istio-security)\n    - [Contents](#contents)\n  - [Setup](#setup)\n    - [Create a GKE Cluster](#create-a-gke-cluster)\n    - [Deploy the sample application](#deploy-the-sample-application)\n  - [Authentication](#authentication)\n    - [Explore default mTLS behavior.](#explore-default-mtls-behavior)\n    - [Enforce strict mTLS for the frontend service](#enforce-strict-mtls-for-the-frontend-service)\n    - [Enable mTLS for the default namespace](#enable-mtls-for-the-default-namespace)\n    - [Add End-User JWT Authentication](#add-end-user-jwt-authentication)\n  - [Authorization](#authorization)\n  - [Cleanup](#cleanup)\n  - [What's next?](#whats-next)\n\n## Setup\n\n[Google Cloud Shell](https://cloud.google.com/shell/docs/) is a browser-based terminal that Google provides to interact with your GCP resources. It is backed by a free Compute Engine instance that comes with many useful tools already installed, including everything required to run this demo.\n\nClick the button below to open the demo instructions in your Cloud Shell:\n\n[![Open in Cloud Shell](http://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https%3A%2F%2Fgithub.com%2FGoogleCloudPlatform%2Fistio-samples&page=editor&tutorial=security-intro/README.md)\n\n1. Change into the demo directory.\n\n```\ncd security-intro\n```\n\n### Create a GKE Cluster\n\n1. Ensure that you have a Google Cloud Project selected.\n\n```\ngcloud config set project <YOUR_PROJECT_ID>\n```\n\n2. From Cloud Shell, **enable the Kubernetes Engine API**.\n\n```\ngcloud services enable container.googleapis.com\n```\n\n3. **Create a GKE cluster**.\n\n```\ngcloud beta container clusters create istio-security-demo \\\n    --zone=us-central1-f \\\n    --machine-type=n1-standard-2 \\\n    --num-nodes=4\n```\n\n4. **Install Istio** on the cluster.\n\n```\ncd common/\n./install_istio.sh\n```\n\n5. Wait for all Istio pods to be `Running` or `Completed`.\n```\nkubectl get pods -n istio-system\n```\n\n### Deploy the sample application\n\nWe will use the [Hipstershop](https://github.com/GoogleCloudPlatform/microservices-demo) sample application for this demo.\n\n1. **Apply the sample app manifests**\n\n```\nkubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/master/release/kubernetes-manifests.yaml\nkubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/master/release/istio-manifests.yaml\n```\n\n\n2. Run `kubectl get pods -n default` to ensure that all pods are `Running` and `Ready`.\n\n```\nNAME                                     READY     STATUS    RESTARTS   AGE\nadservice-76b5c7bd6b-zsqb8               2/2       Running   0          1m\ncheckoutservice-86f5c7679c-8ghs8         2/2       Running   0          1m\ncurrencyservice-5749fd7c6d-lv6hj         2/2       Running   0          1m\nemailservice-6674bf75c5-qtnd8            2/2       Running   0          1m\nfrontend-56fdfb866c-tvdm6                2/2       Running   0          1m\nloadgenerator-b64fcb8bc-m6nd2            2/2       Running   0          1m\npaymentservice-67c6696c54-tgnc5          2/2       Running   0          1m\nproductcatalogservice-76c6454c57-9zj2v   2/2       Running   0          1m\nrecommendationservice-78c7676bfb-xqtp6   2/2       Running   0          1m\nshippingservice-7bc4bc75bb-kzfrb         2/2       Running   0          1m\n```\n\n🔎 Each pod has 2 containers, because each pod now has the injected Istio\nsidecar proxy.\n\nNow we're ready to enforce security policies for this application.\n\n## Authentication\n\n[**Authentication**](https://istio.io/docs/concepts/security/#authentication) refers to identity: who is this service? who is this end-user? and can I trust that they are who they say they are?\n\nOne benefit of using Istio that it provides **uniformity** for both service-to-service and end\nuser-to-service authentication. Istio **abstracts** away authentication from\nyour application code, by [tunneling](https://istio.io/docs/concepts/security/#mutual-tls-authentication) all service-to-service communication through the Envoy\nsidecar proxies. And by using a **centralized** [Public-Key\nInfrastructure](https://istio.io/docs/concepts/security/#pki), Istio provides **consistency** to make sure authentication is set up\nproperly across your mesh. Further, Istio allows you to adopt mTLS on a per-service basis,\nor **easily toggle end-to-end encryption** for your entire\nmesh. Let's see how.\n\n### Explore default mTLS behavior.\n\nStarting in Istio 1.5, the [default Istio mTLS behavior](https://istio.io/docs/tasks/security/authentication/authn-policy/#auto-mutual-tls) is \"auto.\" This means that pod-to-pod traffic will use mutual TLS by default, but pods will still accept plain-text traffic - for instance, from pods in a different namespace that are not injected with the Istio proxy.\nBecause we deployed the entire sample app into one namespace (`default`) and all pods have the Istio sidecar proxy, traffic will be mTLS for all the sample app workloads. Let's look at this behavior.\n\n1. Open the Kiali service graph in a web browser.\n\n```\nistioctl dashboard kiali &\n```\n\n2. In the left sidecar, click Graph > Namespace: `default`. Under \"display,\" click the `security` view. You should see a lock icon on the edges in the graph, indicating that traffic is encrypted/mTLS.\n\n![default view](screenshots/kiali-auto.png)\n\n### Enforce strict mTLS for the frontend service\n\nFrom this default \"permissive\" mTLS behavior, we can enforce \"strict\" mTLS for a workload, namespace, or for the entire mesh. This means that only mTLS traffic will be accepted by the target workload(s).\n\nLet's enforce strict mTLS for the frontend workload. We'll use an Istio [`PeerAuthentication`](https://istio.io/docs/reference/config/security/peer_authentication/) resource to do this.\n\n1. To start, see what happens by default when you try to curl the frontend service with plain HTTP, from another pod in the same namespace. Your request should succeed with status `200`, because by default, both TLS and plain text traffic is accepted.\n\n```\n$ kubectl exec $(kubectl get pod -l app=productcatalogservice -o jsonpath={.items..metadata.name}) -c istio-proxy -- curl http://frontend:80/ -o /dev/null -s -w '%{http_code}\\n'\n\n200\n```\n\n2. Open the mTLS policy in `./manifests/mtls-frontend.yaml`. Notice how the authentication policy uses labels and selectors to target the specific `frontend` deployment in the `default` namespace.\n\n```\napiVersion: \"security.istio.io/v1beta1\"\nkind: \"PeerAuthentication\"\nmetadata:\n  name: \"frontend\"\n  namespace: \"default\"\nspec:\n  selector:\n    matchLabels:\n      app: frontend\n  mtls:\n    mode: STRICT\n```\n\n3. Apply the policy.\n\n```\nkubectl apply -f ./manifests/mtls-frontend.yaml\n```\n\n4. Try to reach the frontend again, with a plain HTTP request from the istio-proxy container in productcatalog.\n\n```\nkubectl exec $(kubectl get pod -l app=productcatalogservice -o jsonpath={.items..metadata.name}) -c istio-proxy -- curl http://frontend:80/ -o /dev/null -s -w '%{http_code}\\n'\n```\n\nYou should see:\n\n```\n000\ncommand terminated with exit code 56\n```\n\nExit code `56` [means](https://curl.haxx.se/libcurl/c/libcurl-errors.html) \"failure to\nreceive network data.\" This is expected because now, the frontend expects TLS certificates on every request.\n\n### Enable mTLS for the default namespace\n\nNow that we've adopted mTLS for one service, let's enforce mTLS for the [entire\n`default`\nnamespace](https://istio.io/docs/tasks/security/authn-policy/#namespace-wide-policy).\n\n1. **Open** `manifests/mtls-default-ns.yaml`. Notice that we're using the same resource type (`PeerAuthentication`) as we used for the workload-specific policy. The difference is that we omit `selectors` for a specific service, and only specify the `namespace` on which we want to enforce mTLS.\n\n```\napiVersion: \"security.istio.io/v1beta1\"\nkind: \"PeerAuthentication\"\nmetadata:\n  name: \"default\"\n  namespace: \"default\"\nspec:\n  mtls:\n    mode: STRICT\n```\n\n2. **Apply** the resource:\n\n```\nkubectl apply -f ./manifests/mtls-default-ns.yaml\n```\n\n3. Clean up by deleting the policies created in this section.\n\n```\nkubectl delete -f ./manifests/mtls-frontend.yaml\nkubectl delete -f ./manifests/mtls-default-ns.yaml\n```\n\n### Add End-User JWT Authentication\n\nNow that we've enabled service-to-service authentication in the default namespace, let's\nenforce **end-user (\"origin\") authentication** for the `frontend` service, using [JSON Web Tokens](https://jwt.io/)\n(JWT).\n\nFirst, we'll create an Istio policy to [enforce JWT authentication](https://istio.io/docs/tasks/security/authorization/authz-jwt/) for inbound requests\nto the `frontend` service.\n\n1. **Open** the policy in  `./manifests/jwt-frontend-request.yaml`. The Istio policy we'll use is called a [`RequestAuthentication`](https://istio.io/docs/reference/config/security/request_authentication/) resource.\n\n```\napiVersion: security.istio.io/v1beta1\nkind: RequestAuthentication\nmetadata:\n name: frontend\n namespace: default\nspec:\n  selector:\n    matchLabels:\n      app: frontend\n  jwtRules:\n  - issuer: \"testing@secure.istio.io\"\n    jwksUri: \"https://raw.githubusercontent.com/istio/istio/release-1.5/security/tools/jwt/samples/jwks.json\"\n```\n\n🔎 This policy uses Istio's\ntest JSON Web Key Set (`jwksUri`), the public key used to validate incoming JWTs.\n\n\n2. **Apply** the `RequestAuthentication` resource.\n\n```\nkubectl apply -f ./manifests/jwt-frontend-request.yaml\n```\n\n3. **Set a local `TOKEN` variable.** We'll use this token on the client-side\n   to make requests to the frontend.\n\n```\nTOKEN=$(curl -k https://raw.githubusercontent.com/istio/istio/release-1.4/security/tools/jwt/samples/demo.jwt -s); echo $TOKEN\n```\n\n4. Curl the frontend with a valid JWT.\n\n```\nkubectl exec $(kubectl get pod -l app=productcatalogservice -o jsonpath={.items..metadata.name}) -c istio-proxy \\\n-- curl  http://frontend:80/ -o /dev/null --header \"Authorization: Bearer $TOKEN\" -s -w '%{http_code}\\n'\n```\n\n5. Now, try to reach the frontend **without** a JWT.\n\n```\nkubectl exec $(kubectl get pod -l app=productcatalogservice -o jsonpath={.items..metadata.name}) -c istio-proxy \\\n-- curl  http://frontend:80/ -o /dev/null -s -w '%{http_code}\\n'\n\n200\n```\n\nYou should see a `200` code. Why is this? Because starting in Istio 1.5, the Istio `RequestAuthentication` (JWT) policy [is only responsible for *validating*](https://istio.io/docs/tasks/security/authorization/authz-jwt/#allow-requests-with-valid-jwt-and-list-typed-claims) tokens. If we pass an invalid token, we should see a \"401: Unauthorized\" response:\n\n```\nkubectl exec $(kubectl get pod -l app=productcatalogservice -o jsonpath={.items..metadata.name}) -c istio-proxy \\\n-- curl  http://frontend:80/ -o /dev/null --header \"Authorization: Bearer helloworld\" -s -w '%{http_code}\\n'\n\n401\n```\n\nBut if we pass no token at all, the `RequestAuthentication` policy is not invoked. Therefore, in addition to this authentication policy, we need an **authorization policy** that requires a JWT on all requests.\n\n6. View the `AuthorizationPolicy` resource - open `manifests/jwt-frontend-authz.yaml`. This policy declares that all requests to the `frontend` workload must have a JWT.\n\n```\napiVersion: security.istio.io/v1beta1\nkind: AuthorizationPolicy\nmetadata:\n  name: require-jwt\n  namespace: default\nspec:\n  selector:\n    matchLabels:\n      app: frontend\n  action: ALLOW\n  rules:\n  - from:\n    - source:\n       requestPrincipals: [\"testing@secure.istio.io/testing@secure.istio.io\"]\n```\n\n7. Apply the `AuthorizationPolicy`.\n\n```\nkubectl apply -f manifests/jwt-frontend-authz.yaml\n```\n\n\n8. Curl the frontend again, without a JWT. You should now see `403 - Forbidden`. This is the `AuthorizationPolicy` taking effect-- that all frontend requests must have a JWT.\n\n```\nkubectl exec $(kubectl get pod -l app=productcatalogservice -o jsonpath={.items..metadata.name}) -c istio-proxy \\\n-- curl  http://frontend:80/ -o /dev/null -s -w '%{http_code}\\n'\n```\n\n\n✅ You should see a `200` response code.\n\n🎉 Well done! You just secured the `frontend` service with a JWT policy and an authorization policy.\n\n9. Clean up:\n\n```\nkubectl delete -f manifests/jwt-frontend-authz.yaml\nkubectl delete -f manifests/jwt-frontend-request.yaml\n```\n\n## Authorization\n\nWe just saw a preview of how to enforce access control using Istio `AuthorizationPolicies`. Let's go deeper into how these policies work.\n\nUnlike authentication, which refers to the \"who,\" **authorization** refers to the \"what\", or: what is this service or user allowed to do?\n\nBy default, requests between Istio services (and between end-users and services) are [allowed by default](https://istio.io/docs/concepts/security/#implicit-enablement). You can then enforce authorization for one or many services using an [`AuthorizationPolicy`](https://istio.io/docs/reference/config/security/authorization-policy/) custom resource.\n\nLet's put this into action, by only allowing requests to the `frontend` that have a specific HTTP header (`hello`:`world`):\n\n```\napiVersion: \"security.istio.io/v1beta1\"\nkind: \"AuthorizationPolicy\"\nmetadata:\n  name: \"frontend\"\n  namespace: default\nspec:\n  selector:\n    matchLabels:\n      app: frontend\n  rules:\n  - when:\n    - key: request.headers[hello]\n      values: [\"world\"]\n```\n\n1. **Apply the AuthorizationPolicy** for the frontend service:\n\n```\nkubectl apply -f ./manifests/authz-frontend.yaml\n```\n\n2. Curl the frontend without the `hello` header. You should see a `403: Forbidden` response.\n\n```\nkubectl exec $(kubectl get pod -l app=productcatalogservice -o jsonpath={.items..metadata.name}) -c istio-proxy \\\n-- curl http://frontend:80/ -o /dev/null -s -w '%{http_code}\\n'\n\n403\n```\n\n3. Curl the frontend with the `hello`:`world` header. You should now see a `200` response code.\n\n```\nkubectl exec $(kubectl get pod -l app=productcatalogservice -o jsonpath={.items..metadata.name}) -c istio-proxy \\\n-- curl --header \"hello:world\" http://frontend:80 -o /dev/null -s -w '%{http_code}\\n'\n\n200\n```\n\n✅ You just configured a fine-grained Istio access control policy for one\nservice. We hope this section demonstrated how Istio can support specific, service-level\nauthorization policies using a set of familiar, Kubernetes-based resources.\n\n## Cleanup\n\nTo avoid incurring additional costs, delete the GKE cluster created in this demo:\n\n```\ngcloud container clusters delete istio-security-demo --zone=us-central1-f\n```\n\nOr, to keep your GKE cluster with Istio and Hipstershop still installed, delete the Istio security\nresources only:\n\n```\nkubectl delete -f ./manifests\n```\n\n## What's next?\n\nIf you're interested in learning more about Istio's security features, read more at:\n\n*   [Concepts: Istio Security](https://istio.io/docs/concepts/security/)\n*   [Task: Authentication Policy / Precedence](https://istio.io/docs/tasks/security/authn-policy/#policy-precedence)\n*   [Task: Mutual TLS Migration](https://istio.io/docs/tasks/security/mtls-migration/)\n*   [Task: Securing Gateways with HTTPS](https://istio.io/docs/tasks/traffic-management/secure-ingress/)\n*   [Task: Mutual TLS Over HTTPS](https://istio.io/docs/tasks/security/https-overlay/)\n*   [Example: TLS Origination for Egress Traffic ](https://istio.io/docs/examples/advanced-egress/egress-tls-origination/)\n"
  },
  {
    "path": "security-intro/manifests/authz-frontend.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_security_intro_manifests_authorization_policy_frontend]\napiVersion: \"security.istio.io/v1beta1\"\nkind: \"AuthorizationPolicy\"\nmetadata:\n  name: \"frontend\"\n  namespace: default\nspec:\n  selector:\n    matchLabels:\n      app: frontend\n  rules:\n  - when:\n    - key: request.headers[hello]\n      values: [\"world\"]\n# [END istio_security_intro_manifests_authorization_policy_frontend]"
  },
  {
    "path": "security-intro/manifests/jwt-frontend-authz.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_security_intro_manifests_authorization_policy_frontend\napiVersion: security.istio.io/v1beta1\nkind: AuthorizationPolicy\nmetadata:\n  name: require-jwt\n  namespace: default\nspec:\n  selector:\n    matchLabels:\n      app: frontend\n  action: ALLOW\n  rules:\n  - from:\n    - source:\n       requestPrincipals: [\"testing@secure.istio.io/testing@secure.istio.io\"]\n# [END istio_security_intro_manifests_authorization_policy_frontend\n---"
  },
  {
    "path": "security-intro/manifests/jwt-frontend-request.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_security_intro_manifests_request_authentication_frontend\napiVersion: security.istio.io/v1beta1\nkind: RequestAuthentication\nmetadata:\n name: frontend\n namespace: default\nspec:\n  selector:\n    matchLabels:\n      app: frontend\n  jwtRules:\n  - issuer: \"testing@secure.istio.io\"\n    jwksUri: \"https://raw.githubusercontent.com/istio/istio/release-1.5/security/tools/jwt/samples/jwks.json\"\n# [END istio_security_intro_manifests_request_authentication_frontend\n---\n"
  },
  {
    "path": "security-intro/manifests/mtls-default-ns.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_security_intro_manifests_policy_default]\napiVersion: \"security.istio.io/v1beta1\"\nkind: \"PeerAuthentication\"\nmetadata:\n  name: \"default\"\n  namespace: \"default\"\nspec:\n  mtls:\n    mode: STRICT\n# [END istio_security_intro_manifests_policy_default]\n# ---\n# # [START istio_security_intro_manifests_destinationrule_default]\n# apiVersion: networking.istio.io/v1alpha3\n# kind: DestinationRule\n# metadata:\n#   name: default\n#   namespace: default\n# spec:\n#   host: '*.default.svc.cluster.local'\n#   trafficPolicy:\n#     tls:\n#       mode: ISTIO_MUTUAL\n# # [END istio_security_intro_manifests_destinationrule_default]\n# ---"
  },
  {
    "path": "security-intro/manifests/mtls-frontend.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_security_intro_manifests_peer_authentication_frontend]\napiVersion: \"security.istio.io/v1beta1\"\nkind: \"PeerAuthentication\"\nmetadata:\n  name: \"frontend\"\n  namespace: \"default\"\nspec:\n  selector:\n    matchLabels:\n      app: frontend\n  mtls:\n    mode: STRICT\n# [END istio_security_intro_manifests_peer_authentication_frontend]\n---\n# [START istio_security_intro_manifests_destinationrule_frontend]\napiVersion: \"networking.istio.io/v1alpha3\"\nkind: \"DestinationRule\"\nmetadata:\n  name: \"frontend\"\nspec:\n  host: \"frontend.default.svc.cluster.local\"\n  trafficPolicy:\n    tls:\n      mode: ISTIO_MUTUAL\n# [END istio_security_intro_manifests_destinationrule_frontend]\n---\n"
  },
  {
    "path": "stackdriver-metrics/README.md",
    "content": "# Configuring Stackdriver Monitoring for Open Source Istio\n\n- [Background](#background)\n- [Stackdriver Adapter](#stackdriver-adapter)\n- [Stackdriver Metrics](#stackdriver-metrics)\n- [Usage](#usage)\n- [Customizations](#customizations)\n\n## Background\n\nPer the [Istio](https://istio.io) concept documentation on [Observability](https://istio.io/docs/concepts/observability/):\n\n> Istio generates detailed telemetry for all service communications within a mesh. This telemetry provides observability of service behavior, empowering operators to troubleshoot, maintain, and optimize their applications – without imposing any additional burdens on service developers. Through Istio, operators gain a thorough understanding of how monitored services are interacting, both with other services and with the Istio components themselves.\n\n[Mixer](https://istio.io/docs/reference/config/policy-and-telemetry/mixer-overview/) is the Istio component responsible for providing telemetry collection, as well as policy controls. Mixer supports [Adapters](https://istio.io/docs/reference/config/policy-and-telemetry/mixer-overview/#adapters), so that it can plug-in to different infrastructure backends for logging, metrics, and tracing support:\n\n> Mixer is a highly modular and extensible component. One of its key functions is to abstract away the details of different policy and telemetry backend systems, allowing the rest of Istio to be agnostic of those backends.\n>\n> Mixer’s flexibility in dealing with different infrastructure backends comes from its general-purpose plug-in model. Individual plug-ins are known as adapters and they allow Mixer to interface to different infrastructure backends that deliver core functionality, such as logging, monitoring, quotas, ACL checking, and more. The exact set of adapters used at runtime is determined through configuration and can easily be extended to target new or custom infrastructure backends.\n\n## Stackdriver Adapter\n\nIf you are using [Istio on GKE](https://cloud.google.com/istio/docs/istio-on-gke/overview) then the [Stackdriver](https://cloud.google.com/istio/docs/istio-on-gke/overview#stackdriver_support) adapter is automatically installed for you.\n\nIf you've installed Istio via the [Quick Start Evaluation Install](https://istio.io/docs/setup/kubernetes/install/kubernetes/) or [Customizable Install with Helm](https://istio.io/docs/setup/kubernetes/install/helm/) then you will need to configure the Stackdriver adapter.\n\n## Stackdriver Metrics\n\nThe [istio-stackdriver-metrics](istio-stackdriver-metrics.yaml) manifest contains Istio [Handler](https://istio.io/docs/reference/config/policy-and-telemetry/istio.policy.v1beta1/#Handler), [Rule](https://istio.io/docs/reference/config/policy-and-telemetry/istio.policy.v1beta1/#Rule), and [Instance](https://istio.io/docs/reference/config/policy-and-telemetry/istio.policy.v1beta1/#Instance) objects configured for capturing telemetry data and sending it to Stackdriver.\n\n## Usage\n\n### Step 1: Install Istio on a GKE cluster\n\nFollow the steps outlined in [Install Istio on a GKE cluster](https://cloud.google.com/istio/docs/how-to/installing-oss) to get a cluster up and running.\n\n### Step 2: Configure Stackdriver adapter\n\n`kubectl apply -n istio-system -f istio-stackdriver-metrics.yaml`\n\n### Step 3: Enable automatic sidecar injection\n\n`kubectl label ns default istio-injection=enabled`\n\n### Step 4: Deploy a sample application\n\n[Hipster Shop](https://github.com/GoogleCloudPlatform/microservices-demo/) is a sample cloud-native microservices application with 10 services and a built-in load generator. \n\nFirst, deploy the Hipster Shop Istio manifests:\n- `kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/master/release/istio-manifests.yaml`\n\nNext, deploy the Hipster Shop Kubernetes manifests:\n- `kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/master/release/kubernetes-manifests.yaml`\n\n### Step 5: View metrics in Stackdriver\n\nAfter a few minutes, the `loadgenerator` built-in to Hipster Shop will have generated some meaningful metrics. At that point, navigate to the [Stackdriver Monitoring](https://app.google.stackdriver.com/) [Metrics Explorer](https://app.google.stackdriver.com/metrics-explorer) and start selecting Istio metrics to display. \n\nFor further exploration, refer to [Istio and Stackdriver Monitoring](https://github.com/GoogleCloudPlatform/istio-samples/tree/master/istio-stackdriver#monitoring) to create example dashboards.\n\n### Step 6: Cleanup\n\n`gcloud container clusters delete [CLUSTER-NAME]`\n\n## Customizations\n\nIf you need to make any customizations to [istio-stackdriver-metrics](istio-stackdriver-metrics.yaml), you can generate your own manifest as described in the [README](https://github.com/istio/istio/tree/master/mixer/adapter/stackdriver) for the Istio Stackdriver adapter."
  },
  {
    "path": "stackdriver-metrics/istio-stackdriver-metrics.yaml",
    "content": "\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# [START istio_istio_samples_stackdriver_metrics_handler_stackdriver]\napiVersion: config.istio.io/v1alpha2\nkind: handler\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: stackdriver\n  namespace: istio-system\nspec:\n  compiledAdapter: stackdriver\n  params:\n    logInfo:\n      server-accesslog-stackdriver.instance.istio-system:\n        labelNames:\n        - source_uid\n        - source_ip\n        - source_app\n        - source_principal\n        - source_name\n        - source_workload\n        - source_namespace\n        - source_owner\n        - destination_uid\n        - destination_app\n        - destination_ip\n        - destination_service_host\n        - destination_workload\n        - destination_name\n        - destination_namespace\n        - destination_owner\n        - destination_principal\n        - api_name\n        - api_version\n        - api_claims\n        - api_key\n        - request_operation\n        - protocol\n        - method\n        - url\n        - response_code\n        - response_size\n        - request_size\n        - request_id\n        - latency\n        - service_authentication_policy\n        - user_agent\n        - response_timestamp\n        - received_bytes\n        - sent_bytes\n        - referer\n      server-tcp-accesslog-stackdriver.instance.istio-system:\n        labelNames:\n        - connection_id\n        - connection_event\n        - source_uid\n        - source_ip\n        - source_app\n        - source_principal\n        - source_name\n        - source_workload\n        - source_namespace\n        - source_owner\n        - destination_uid\n        - destination_app\n        - destination_ip\n        - destination_service_host\n        - destination_workload\n        - destination_name\n        - destination_namespace\n        - destination_owner\n        - destination_principal\n        - protocol\n        - connction_duration\n        - service_authentication_policy\n        - received_bytes\n        - sent_bytes\n        - total_received_bytes\n        - total_sent_bytes\n    metricInfo:\n      client-received-bytes-count.instance.istio-system:\n        kind: 3\n        metric_type: istio.io/service/client/received_bytes_count\n        value: 2\n      client-request-bytes.instance.istio-system:\n        buckets:\n          exponentialBuckets:\n            growthFactor: 2\n            numFiniteBuckets: 20\n            scale: 1\n        kind: 3\n        metric_type: istio.io/service/client/request_bytes\n        value: 5\n      client-request-count.instance.istio-system:\n        kind: 3\n        metric_type: istio.io/service/client/request_count\n        value: 2\n      client-response-bytes.instance.istio-system:\n        buckets:\n          exponentialBuckets:\n            growthFactor: 2\n            numFiniteBuckets: 20\n            scale: 1\n        kind: 3\n        metric_type: istio.io/service/client/response_bytes\n        value: 5\n      client-roundtrip-latencies.instance.istio-system:\n        buckets:\n          exponentialBuckets:\n            growthFactor: 2\n            numFiniteBuckets: 20\n            scale: 1\n        kind: 3\n        metric_type: istio.io/service/client/roundtrip_latencies\n        value: 5\n      client-sent-bytes-count.instance.istio-system:\n        kind: 3\n        metric_type: istio.io/service/client/sent_bytes_count\n        value: 2\n      server-received-bytes-count.instance.istio-system:\n        kind: 3\n        metric_type: istio.io/service/server/received_bytes_count\n        value: 2\n      server-request-bytes.instance.istio-system:\n        buckets:\n          exponentialBuckets:\n            growthFactor: 2\n            numFiniteBuckets: 20\n            scale: 1\n        kind: 3\n        metric_type: istio.io/service/server/request_bytes\n        value: 5\n      server-request-count.instance.istio-system:\n        kind: 3\n        metric_type: istio.io/service/server/request_count\n        value: 2\n      server-response-bytes.instance.istio-system:\n        buckets:\n          exponentialBuckets:\n            growthFactor: 2\n            numFiniteBuckets: 20\n            scale: 1\n        kind: 3\n        metric_type: istio.io/service/server/response_bytes\n        value: 5\n      server-response-latencies.instance.istio-system:\n        buckets:\n          exponentialBuckets:\n            growthFactor: 2\n            numFiniteBuckets: 20\n            scale: 1\n        kind: 3\n        metric_type: istio.io/service/server/response_latencies\n        value: 5\n      server-sent-bytes-count.instance.istio-system:\n        kind: 3\n        metric_type: istio.io/service/server/sent_bytes_count\n        value: 2\n    pushInterval: 10s\n# [END istio_istio_samples_stackdriver_metrics_handler_stackdriver]\n---\n# [START istio_istio_samples_stackdriver_metrics_rule_stackdriver_server]\napiVersion: config.istio.io/v1alpha2\nkind: rule\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: stackdriver-server\n  namespace: istio-system\nspec:\n  actions:\n  - handler: stackdriver\n    instances:\n    - server-request-count\n    - server-request-bytes\n    - server-response-bytes\n    - server-response-latencies\n  match: (context.protocol == \"http\" || context.protocol == \"grpc\") && (context.reporter.kind\n    | \"inbound\" == \"inbound\")\n# [END istio_istio_samples_stackdriver_metrics_rule_stackdriver_server]\n---\n# [START istio_istio_samples_stackdriver_metrics_rule_stackdriver_client]\napiVersion: config.istio.io/v1alpha2\nkind: rule\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: stackdriver-client\n  namespace: istio-system\nspec:\n  actions:\n  - handler: stackdriver\n    instances:\n    - client-request-count\n    - client-request-bytes\n    - client-response-bytes\n    - client-roundtrip-latencies\n  match: (context.protocol == \"http\" || context.protocol == \"grpc\") && (context.reporter.kind\n    | \"inbound\" == \"outbound\")\n# [END istio_istio_samples_stackdriver_metrics_rule_stackdriver_client]\n---\n# [START istio_istio_samples_stackdriver_metrics_rule_stackdriver_tcp_server]\napiVersion: config.istio.io/v1alpha2\nkind: rule\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: stackdriver-tcp-server\n  namespace: istio-system\nspec:\n  actions:\n  - handler: stackdriver\n    instances:\n    - server-received-bytes-count\n    - server-sent-bytes-count\n  match: context.protocol == \"tcp\" && (context.reporter.kind | \"inbound\" == \"inbound\")\n# [END istio_istio_samples_stackdriver_metrics_rule_stackdriver_tcp_server]\n---\n# [START istio_istio_samples_stackdriver_metrics_rule_stackdriver_tcp_client]\napiVersion: config.istio.io/v1alpha2\nkind: rule\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: stackdriver-tcp-client\n  namespace: istio-system\nspec:\n  actions:\n  - handler: stackdriver\n    instances:\n    - client-received-bytes-count\n    - client-sent-bytes-count\n  match: context.protocol == \"tcp\" && (context.reporter.kind | \"inbound\" == \"outbound\")\n# [END istio_istio_samples_stackdriver_metrics_rule_stackdriver_tcp_client]\n---\n# [START istio_istio_samples_stackdriver_metrics_instance_server_request_count]\napiVersion: config.istio.io/v1alpha2\nkind: instance\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: server-request-count\n  namespace: istio-system\nspec:\n  compiledTemplate: metric\n  params:\n    dimensions:\n      api_name: api.service | \"unknown\"\n      api_version: api.version | \"unknown\"\n      destination_owner: destination.owner | \"unknown\"\n      destination_port: destination.port | 0\n      destination_principal: destination.principal | \"unknown\"\n      destination_service_name: destination.service.name | \"unknown\"\n      destination_service_namespace: destination.service.namespace | \"unknown\"\n      destination_workload_name: destination.workload.name | \"unknown\"\n      destination_workload_namespace: destination.workload.namespace | \"unknown\"\n      request_operation: conditional((context.protocol | \"unknown\") == \"grpc\", request.path\n        | \"unknown\", request.method | \"unknown\")\n      request_protocol: context.protocol | \"unknown\"\n      response_code: response.code | 0\n      service_authentication_policy: conditional((context.reporter.kind | \"inbound\")\n        == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\",\n        \"none\"))\n      source_owner: source.owner | \"unknown\"\n      source_principal: source.principal | \"unknown\"\n      source_workload_name: source.workload.name | \"unknown\"\n      source_workload_namespace: source.workload.namespace | \"unknown\"\n    monitoredResourceDimensions:\n      cluster_name: '\"\"'\n      container_name: conditional((destination.name | \"unknown\").startsWith(\"istio-telemetry\")\n        || (destination.name | \"unknown\").startsWith(\"istio-policy\"), \"mixer\", destination.container.name\n        | \"unknown\")\n      location: '\"\"'\n      namespace_name: destination.workload.namespace | \"unknown\"\n      pod_name: destination.name | \"unknown\"\n      project_id: '\"\"'\n    monitoredResourceType: '\"k8s_container\"'\n    value: '1'\n# [END istio_istio_samples_stackdriver_metrics_instance_server_request_count]\n---\n# [START istio_istio_samples_stackdriver_metrics_instance_client_request_count]\napiVersion: config.istio.io/v1alpha2\nkind: instance\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: client-request-count\n  namespace: istio-system\nspec:\n  compiledTemplate: metric\n  params:\n    dimensions:\n      api_name: api.service | \"unknown\"\n      api_version: api.version | \"unknown\"\n      destination_owner: destination.owner | \"unknown\"\n      destination_port: destination.port | 0\n      destination_principal: destination.principal | \"unknown\"\n      destination_service_name: destination.service.name | \"unknown\"\n      destination_service_namespace: destination.service.namespace | \"unknown\"\n      destination_workload_name: destination.workload.name | \"unknown\"\n      destination_workload_namespace: destination.workload.namespace | \"unknown\"\n      request_operation: conditional((context.protocol | \"unknown\") == \"grpc\", request.path\n        | \"unknown\", request.method | \"unknown\")\n      request_protocol: context.protocol | \"unknown\"\n      response_code: response.code | 0\n      service_authentication_policy: conditional((context.reporter.kind | \"inbound\")\n        == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\",\n        \"none\"))\n      source_owner: source.owner | \"unknown\"\n      source_principal: source.principal | \"unknown\"\n      source_workload_name: source.workload.name | \"unknown\"\n      source_workload_namespace: source.workload.namespace | \"unknown\"\n    monitoredResourceDimensions:\n      cluster_name: '\"\"'\n      location: '\"\"'\n      namespace_name: source.workload.namespace | \"unknown\"\n      pod_name: source.name | \"unknown\"\n      project_id: '\"\"'\n    monitoredResourceType: '\"k8s_pod\"'\n    value: '1'\n# [END istio_istio_samples_stackdriver_metrics_instance_client_request_count]\n---\n# [START istio_istio_samples_stackdriver_metrics_instance_server_request_bytes]\napiVersion: config.istio.io/v1alpha2\nkind: instance\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: server-request-bytes\n  namespace: istio-system\nspec:\n  compiledTemplate: metric\n  params:\n    dimensions:\n      api_name: api.service | \"unknown\"\n      api_version: api.version | \"unknown\"\n      destination_owner: destination.owner | \"unknown\"\n      destination_port: destination.port | 0\n      destination_principal: destination.principal | \"unknown\"\n      destination_service_name: destination.service.name | \"unknown\"\n      destination_service_namespace: destination.service.namespace | \"unknown\"\n      destination_workload_name: destination.workload.name | \"unknown\"\n      destination_workload_namespace: destination.workload.namespace | \"unknown\"\n      request_operation: conditional((context.protocol | \"unknown\") == \"grpc\", request.path\n        | \"unknown\", request.method | \"unknown\")\n      request_protocol: context.protocol | \"unknown\"\n      response_code: response.code | 0\n      service_authentication_policy: conditional((context.reporter.kind | \"inbound\")\n        == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\",\n        \"none\"))\n      source_owner: source.owner | \"unknown\"\n      source_principal: source.principal | \"unknown\"\n      source_workload_name: source.workload.name | \"unknown\"\n      source_workload_namespace: source.workload.namespace | \"unknown\"\n    monitoredResourceDimensions:\n      cluster_name: '\"\"'\n      container_name: conditional((destination.name | \"unknown\").startsWith(\"istio-telemetry\")\n        || (destination.name | \"unknown\").startsWith(\"istio-policy\"), \"mixer\", destination.container.name\n        | \"unknown\")\n      location: '\"\"'\n      namespace_name: destination.workload.namespace | \"unknown\"\n      pod_name: destination.name | \"unknown\"\n      project_id: '\"\"'\n    monitoredResourceType: '\"k8s_container\"'\n    value: request.total_size\n# [END istio_istio_samples_stackdriver_metrics_instance_server_request_bytes]\n---\n# [START istio_istio_samples_stackdriver_metrics_instance_client_request_bytes]\napiVersion: config.istio.io/v1alpha2\nkind: instance\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: client-request-bytes\n  namespace: istio-system\nspec:\n  compiledTemplate: metric\n  params:\n    dimensions:\n      api_name: api.service | \"unknown\"\n      api_version: api.version | \"unknown\"\n      destination_owner: destination.owner | \"unknown\"\n      destination_port: destination.port | 0\n      destination_principal: destination.principal | \"unknown\"\n      destination_service_name: destination.service.name | \"unknown\"\n      destination_service_namespace: destination.service.namespace | \"unknown\"\n      destination_workload_name: destination.workload.name | \"unknown\"\n      destination_workload_namespace: destination.workload.namespace | \"unknown\"\n      request_operation: conditional((context.protocol | \"unknown\") == \"grpc\", request.path\n        | \"unknown\", request.method | \"unknown\")\n      request_protocol: context.protocol | \"unknown\"\n      response_code: response.code | 0\n      service_authentication_policy: conditional((context.reporter.kind | \"inbound\")\n        == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\",\n        \"none\"))\n      source_owner: source.owner | \"unknown\"\n      source_principal: source.principal | \"unknown\"\n      source_workload_name: source.workload.name | \"unknown\"\n      source_workload_namespace: source.workload.namespace | \"unknown\"\n    monitoredResourceDimensions:\n      cluster_name: '\"\"'\n      location: '\"\"'\n      namespace_name: source.workload.namespace | \"unknown\"\n      pod_name: source.name | \"unknown\"\n      project_id: '\"\"'\n    monitoredResourceType: '\"k8s_pod\"'\n    value: request.total_size\n# [END istio_istio_samples_stackdriver_metrics_instance_client_request_bytes]\n---\n# [START istio_istio_samples_stackdriver_metrics_instance_server_response_bytes]\napiVersion: config.istio.io/v1alpha2\nkind: instance\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: server-response-bytes\n  namespace: istio-system\nspec:\n  compiledTemplate: metric\n  params:\n    dimensions:\n      api_name: api.service | \"unknown\"\n      api_version: api.version | \"unknown\"\n      destination_owner: destination.owner | \"unknown\"\n      destination_port: destination.port | 0\n      destination_principal: destination.principal | \"unknown\"\n      destination_service_name: destination.service.name | \"unknown\"\n      destination_service_namespace: destination.service.namespace | \"unknown\"\n      destination_workload_name: destination.workload.name | \"unknown\"\n      destination_workload_namespace: destination.workload.namespace | \"unknown\"\n      request_operation: conditional((context.protocol | \"unknown\") == \"grpc\", request.path\n        | \"unknown\", request.method | \"unknown\")\n      request_protocol: context.protocol | \"unknown\"\n      response_code: response.code | 0\n      service_authentication_policy: conditional((context.reporter.kind | \"inbound\")\n        == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\",\n        \"none\"))\n      source_owner: source.owner | \"unknown\"\n      source_principal: source.principal | \"unknown\"\n      source_workload_name: source.workload.name | \"unknown\"\n      source_workload_namespace: source.workload.namespace | \"unknown\"\n    monitoredResourceDimensions:\n      cluster_name: '\"\"'\n      container_name: conditional((destination.name | \"unknown\").startsWith(\"istio-telemetry\")\n        || (destination.name | \"unknown\").startsWith(\"istio-policy\"), \"mixer\", destination.container.name\n        | \"unknown\")\n      location: '\"\"'\n      namespace_name: destination.workload.namespace | \"unknown\"\n      pod_name: destination.name | \"unknown\"\n      project_id: '\"\"'\n    monitoredResourceType: '\"k8s_container\"'\n    value: response.total_size\n# [END istio_istio_samples_stackdriver_metrics_instance_server_response_bytes]\n---\n# [START istio_istio_samples_stackdriver_metrics_instance_client_response_bytes]\napiVersion: config.istio.io/v1alpha2\nkind: instance\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: client-response-bytes\n  namespace: istio-system\nspec:\n  compiledTemplate: metric\n  params:\n    dimensions:\n      api_name: api.service | \"unknown\"\n      api_version: api.version | \"unknown\"\n      destination_owner: destination.owner | \"unknown\"\n      destination_port: destination.port | 0\n      destination_principal: destination.principal | \"unknown\"\n      destination_service_name: destination.service.name | \"unknown\"\n      destination_service_namespace: destination.service.namespace | \"unknown\"\n      destination_workload_name: destination.workload.name | \"unknown\"\n      destination_workload_namespace: destination.workload.namespace | \"unknown\"\n      request_operation: conditional((context.protocol | \"unknown\") == \"grpc\", request.path\n        | \"unknown\", request.method | \"unknown\")\n      request_protocol: context.protocol | \"unknown\"\n      response_code: response.code | 0\n      service_authentication_policy: conditional((context.reporter.kind | \"inbound\")\n        == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\",\n        \"none\"))\n      source_owner: source.owner | \"unknown\"\n      source_principal: source.principal | \"unknown\"\n      source_workload_name: source.workload.name | \"unknown\"\n      source_workload_namespace: source.workload.namespace | \"unknown\"\n    monitoredResourceDimensions:\n      cluster_name: '\"\"'\n      location: '\"\"'\n      namespace_name: source.workload.namespace | \"unknown\"\n      pod_name: source.name | \"unknown\"\n      project_id: '\"\"'\n    monitoredResourceType: '\"k8s_pod\"'\n    value: response.total_size\n# [END istio_istio_samples_stackdriver_metrics_instance_client_response_bytes]\n---\n# [START istio_istio_samples_stackdriver_metrics_instance_server_response_latencies]\napiVersion: config.istio.io/v1alpha2\nkind: instance\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: server-response-latencies\n  namespace: istio-system\nspec:\n  compiledTemplate: metric\n  params:\n    dimensions:\n      api_name: api.service | \"unknown\"\n      api_version: api.version | \"unknown\"\n      destination_owner: destination.owner | \"unknown\"\n      destination_port: destination.port | 0\n      destination_principal: destination.principal | \"unknown\"\n      destination_service_name: destination.service.name | \"unknown\"\n      destination_service_namespace: destination.service.namespace | \"unknown\"\n      destination_workload_name: destination.workload.name | \"unknown\"\n      destination_workload_namespace: destination.workload.namespace | \"unknown\"\n      request_operation: conditional((context.protocol | \"unknown\") == \"grpc\", request.path\n        | \"unknown\", request.method | \"unknown\")\n      request_protocol: context.protocol | \"unknown\"\n      response_code: response.code | 0\n      service_authentication_policy: conditional((context.reporter.kind | \"inbound\")\n        == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\",\n        \"none\"))\n      source_owner: source.owner | \"unknown\"\n      source_principal: source.principal | \"unknown\"\n      source_workload_name: source.workload.name | \"unknown\"\n      source_workload_namespace: source.workload.namespace | \"unknown\"\n    monitoredResourceDimensions:\n      cluster_name: '\"\"'\n      container_name: conditional((destination.name | \"unknown\").startsWith(\"istio-telemetry\")\n        || (destination.name | \"unknown\").startsWith(\"istio-policy\"), \"mixer\", destination.container.name\n        | \"unknown\")\n      location: '\"\"'\n      namespace_name: destination.workload.namespace | \"unknown\"\n      pod_name: destination.name | \"unknown\"\n      project_id: '\"\"'\n    monitoredResourceType: '\"k8s_container\"'\n    value: response.duration\n# [END istio_istio_samples_stackdriver_metrics_instance_server_response_latencies]\n---\n# [START istio_istio_samples_stackdriver_metrics_instance_client_roundtrip_latencies]\napiVersion: config.istio.io/v1alpha2\nkind: instance\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: client-roundtrip-latencies\n  namespace: istio-system\nspec:\n  compiledTemplate: metric\n  params:\n    dimensions:\n      api_name: api.service | \"unknown\"\n      api_version: api.version | \"unknown\"\n      destination_owner: destination.owner | \"unknown\"\n      destination_port: destination.port | 0\n      destination_principal: destination.principal | \"unknown\"\n      destination_service_name: destination.service.name | \"unknown\"\n      destination_service_namespace: destination.service.namespace | \"unknown\"\n      destination_workload_name: destination.workload.name | \"unknown\"\n      destination_workload_namespace: destination.workload.namespace | \"unknown\"\n      request_operation: conditional((context.protocol | \"unknown\") == \"grpc\", request.path\n        | \"unknown\", request.method | \"unknown\")\n      request_protocol: context.protocol | \"unknown\"\n      response_code: response.code | 0\n      service_authentication_policy: conditional((context.reporter.kind | \"inbound\")\n        == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\",\n        \"none\"))\n      source_owner: source.owner | \"unknown\"\n      source_principal: source.principal | \"unknown\"\n      source_workload_name: source.workload.name | \"unknown\"\n      source_workload_namespace: source.workload.namespace | \"unknown\"\n    monitoredResourceDimensions:\n      cluster_name: '\"\"'\n      location: '\"\"'\n      namespace_name: source.workload.namespace | \"unknown\"\n      pod_name: source.name | \"unknown\"\n      project_id: '\"\"'\n    monitoredResourceType: '\"k8s_pod\"'\n    value: response.duration\n# [END istio_istio_samples_stackdriver_metrics_instance_client_roundtrip_latencies]\n---\n# [START istio_istio_samples_stackdriver_metrics_instance_server_received_bytes_count]\napiVersion: config.istio.io/v1alpha2\nkind: instance\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: server-received-bytes-count\n  namespace: istio-system\nspec:\n  compiledTemplate: metric\n  params:\n    dimensions:\n      destination_owner: destination.owner | \"unknown\"\n      destination_port: destination.port | 0\n      destination_principal: destination.principal | \"unknown\"\n      destination_service_name: destination.service.name | \"unknown\"\n      destination_service_namespace: destination.service.namespace | \"unknown\"\n      destination_workload_name: destination.workload.name | \"unknown\"\n      destination_workload_namespace: destination.workload.namespace | \"unknown\"\n      request_protocol: context.protocol | \"unknown\"\n      service_authentication_policy: conditional((context.reporter.kind | \"inbound\")\n        == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\",\n        \"none\"))\n      source_owner: source.owner | \"unknown\"\n      source_principal: source.principal | \"unknown\"\n      source_workload_name: source.workload.name | \"unknown\"\n      source_workload_namespace: source.workload.namespace | \"unknown\"\n    monitoredResourceDimensions:\n      cluster_name: '\"\"'\n      container_name: conditional((destination.name | \"unknown\").startsWith(\"istio-telemetry\")\n        || (destination.name | \"unknown\").startsWith(\"istio-policy\"), \"mixer\", destination.container.name\n        | \"unknown\")\n      location: '\"\"'\n      namespace_name: destination.workload.namespace | \"unknown\"\n      pod_name: destination.name | \"unknown\"\n      project_id: '\"\"'\n    monitoredResourceType: '\"k8s_container\"'\n    value: connection.received.bytes | 0\n# [END istio_istio_samples_stackdriver_metrics_instance_server_received_bytes_count]\n---\n# [START istio_istio_samples_stackdriver_metrics_instance_client_received_bytes_count]\napiVersion: config.istio.io/v1alpha2\nkind: instance\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: client-received-bytes-count\n  namespace: istio-system\nspec:\n  compiledTemplate: metric\n  params:\n    dimensions:\n      destination_owner: destination.owner | \"unknown\"\n      destination_port: destination.port | 0\n      destination_principal: destination.principal | \"unknown\"\n      destination_service_name: destination.service.name | \"unknown\"\n      destination_service_namespace: destination.service.namespace | \"unknown\"\n      destination_workload_name: destination.workload.name | \"unknown\"\n      destination_workload_namespace: destination.workload.namespace | \"unknown\"\n      request_protocol: context.protocol | \"unknown\"\n      service_authentication_policy: conditional((context.reporter.kind | \"inbound\")\n        == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\",\n        \"none\"))\n      source_owner: source.owner | \"unknown\"\n      source_principal: source.principal | \"unknown\"\n      source_workload_name: source.workload.name | \"unknown\"\n      source_workload_namespace: source.workload.namespace | \"unknown\"\n    monitoredResourceDimensions:\n      cluster_name: '\"\"'\n      location: '\"\"'\n      namespace_name: source.workload.namespace | \"unknown\"\n      pod_name: source.name | \"unknown\"\n      project_id: '\"\"'\n    monitoredResourceType: '\"k8s_pod\"'\n    value: connection.received.bytes | 0\n# [END istio_istio_samples_stackdriver_metrics_instance_client_received_bytes_count]\n---\n# [START istio_istio_samples_stackdriver_metrics_instance_server_sent_bytes_count]\napiVersion: config.istio.io/v1alpha2\nkind: instance\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: server-sent-bytes-count\n  namespace: istio-system\nspec:\n  compiledTemplate: metric\n  params:\n    dimensions:\n      destination_owner: destination.owner | \"unknown\"\n      destination_port: destination.port | 0\n      destination_principal: destination.principal | \"unknown\"\n      destination_service_name: destination.service.name | \"unknown\"\n      destination_service_namespace: destination.service.namespace | \"unknown\"\n      destination_workload_name: destination.workload.name | \"unknown\"\n      destination_workload_namespace: destination.workload.namespace | \"unknown\"\n      request_protocol: context.protocol | \"unknown\"\n      service_authentication_policy: conditional((context.reporter.kind | \"inbound\")\n        == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\",\n        \"none\"))\n      source_owner: source.owner | \"unknown\"\n      source_principal: source.principal | \"unknown\"\n      source_workload_name: source.workload.name | \"unknown\"\n      source_workload_namespace: source.workload.namespace | \"unknown\"\n    monitoredResourceDimensions:\n      cluster_name: '\"\"'\n      container_name: conditional((destination.name | \"unknown\").startsWith(\"istio-telemetry\")\n        || (destination.name | \"unknown\").startsWith(\"istio-policy\"), \"mixer\", destination.container.name\n        | \"unknown\")\n      location: '\"\"'\n      namespace_name: destination.workload.namespace | \"unknown\"\n      pod_name: destination.name | \"unknown\"\n      project_id: '\"\"'\n    monitoredResourceType: '\"k8s_container\"'\n    value: connection.sent.bytes | 0\n# [END istio_istio_samples_stackdriver_metrics_instance_server_sent_bytes_count]\n---\n# [START istio_istio_samples_stackdriver_metrics_instance_client_sent_bytes_count]\napiVersion: config.istio.io/v1alpha2\nkind: instance\nmetadata:\n  labels:\n    app: istio-telemetry\n  name: client-sent-bytes-count\n  namespace: istio-system\nspec:\n  compiledTemplate: metric\n  params:\n    dimensions:\n      destination_owner: destination.owner | \"unknown\"\n      destination_port: destination.port | 0\n      destination_principal: destination.principal | \"unknown\"\n      destination_service_name: destination.service.name | \"unknown\"\n      destination_service_namespace: destination.service.namespace | \"unknown\"\n      destination_workload_name: destination.workload.name | \"unknown\"\n      destination_workload_namespace: destination.workload.namespace | \"unknown\"\n      request_protocol: context.protocol | \"unknown\"\n      service_authentication_policy: conditional((context.reporter.kind | \"inbound\")\n        == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\",\n        \"none\"))\n      source_owner: source.owner | \"unknown\"\n      source_principal: source.principal | \"unknown\"\n      source_workload_name: source.workload.name | \"unknown\"\n      source_workload_namespace: source.workload.namespace | \"unknown\"\n    monitoredResourceDimensions:\n      cluster_name: '\"\"'\n      location: '\"\"'\n      namespace_name: source.workload.namespace | \"unknown\"\n      pod_name: source.name | \"unknown\"\n      project_id: '\"\"'\n    monitoredResourceType: '\"k8s_pod\"'\n    value: connection.sent.bytes | 0\n# [END istio_istio_samples_stackdriver_metrics_instance_client_sent_bytes_count]\n---\n"
  }
]